mirror of
https://github.com/kellyjonbrazil/jc.git
synced 2025-07-13 01:20:24 +02:00
add netstat -i support for OSX
This commit is contained in:
@ -201,6 +201,9 @@ Examples:
|
|||||||
"kind": "route"
|
"kind": "route"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
$ netstat -i | jc --netstat -p
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@ -282,7 +285,15 @@ def process(proc_data):
|
|||||||
"window": integer,
|
"window": integer,
|
||||||
"irtt": integer,
|
"irtt": integer,
|
||||||
"iface": string,
|
"iface": string,
|
||||||
"metric": integer
|
"metric": integer,
|
||||||
|
|
||||||
|
"network": string,
|
||||||
|
"address": string,
|
||||||
|
"ipkts": integer, - = null
|
||||||
|
"ierrs": integer, - = null
|
||||||
|
"opkts": integer, - = null
|
||||||
|
"oerrs": integer, - = null
|
||||||
|
"coll": integer, - = null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
"""
|
"""
|
||||||
@ -290,7 +301,8 @@ def process(proc_data):
|
|||||||
# integer changes
|
# integer changes
|
||||||
int_list = ['recv_q', 'send_q', 'pid', 'refcnt', 'inode', 'unit', 'vendor', 'class',
|
int_list = ['recv_q', 'send_q', 'pid', 'refcnt', 'inode', 'unit', 'vendor', 'class',
|
||||||
'osx_flags', 'subcla', 'pcbcount', 'rcvbuf', 'sndbuf', 'rxbytes', 'txbytes',
|
'osx_flags', 'subcla', 'pcbcount', 'rcvbuf', 'sndbuf', 'rxbytes', 'txbytes',
|
||||||
'route_refs', 'use', 'mtu', 'mss', 'window', 'irtt', 'metric']
|
'route_refs', 'use', 'mtu', 'mss', 'window', 'irtt', 'metric', 'ipkts',
|
||||||
|
'ierrs', 'opkts', 'oerrs', 'coll']
|
||||||
for key in int_list:
|
for key in int_list:
|
||||||
if key in entry:
|
if key in entry:
|
||||||
try:
|
try:
|
||||||
@ -345,7 +357,8 @@ def parse(data, raw=False, quiet=False):
|
|||||||
or cleandata[0] == 'Registered kernel control modules' \
|
or cleandata[0] == 'Registered kernel control modules' \
|
||||||
or cleandata[0] == 'Active kernel event sockets' \
|
or cleandata[0] == 'Active kernel event sockets' \
|
||||||
or cleandata[0] == 'Active kernel control sockets' \
|
or cleandata[0] == 'Active kernel control sockets' \
|
||||||
or cleandata[0] == 'Routing tables':
|
or cleandata[0] == 'Routing tables' \
|
||||||
|
or cleandata[0] == 'Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll':
|
||||||
import jc.parsers.netstat_osx
|
import jc.parsers.netstat_osx
|
||||||
raw_output = jc.parsers.netstat_osx.parse(cleandata)
|
raw_output = jc.parsers.netstat_osx.parse(cleandata)
|
||||||
|
|
||||||
|
@ -23,6 +23,14 @@ def normalize_route_headers(header):
|
|||||||
return header
|
return header
|
||||||
|
|
||||||
|
|
||||||
|
def normalize_interface_headers(header):
|
||||||
|
header = header.lower()
|
||||||
|
header = header.replace('name', 'iface')
|
||||||
|
header = header.replace('-', '_')
|
||||||
|
|
||||||
|
return header
|
||||||
|
|
||||||
|
|
||||||
def parse_item(headers, entry, kind):
|
def parse_item(headers, entry, kind):
|
||||||
entry = entry.split(maxsplit=len(headers) - 1)
|
entry = entry.split(maxsplit=len(headers) - 1)
|
||||||
|
|
||||||
@ -32,6 +40,10 @@ def parse_item(headers, entry, kind):
|
|||||||
if kind == 'network' and 'socket' in headers and 'udp' in str(entry):
|
if kind == 'network' and 'socket' in headers and 'udp' in str(entry):
|
||||||
entry.insert(7, None)
|
entry.insert(7, None)
|
||||||
|
|
||||||
|
# fixup interface records with no address field entry
|
||||||
|
if kind == 'interface' and len(entry) == 8:
|
||||||
|
entry.insert(3, None)
|
||||||
|
|
||||||
output_line = dict(zip(headers, entry))
|
output_line = dict(zip(headers, entry))
|
||||||
output_line['kind'] = kind
|
output_line['kind'] = kind
|
||||||
|
|
||||||
@ -97,6 +109,7 @@ def parse(cleandata):
|
|||||||
active_kernel_event = False
|
active_kernel_event = False
|
||||||
active_kernel_control = False
|
active_kernel_control = False
|
||||||
routing_table = False
|
routing_table = False
|
||||||
|
interface_table = False
|
||||||
|
|
||||||
for line in cleandata:
|
for line in cleandata:
|
||||||
|
|
||||||
@ -108,6 +121,7 @@ def parse(cleandata):
|
|||||||
active_kernel_event = False
|
active_kernel_event = False
|
||||||
active_kernel_control = False
|
active_kernel_control = False
|
||||||
routing_table = False
|
routing_table = False
|
||||||
|
interface_table = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if line.startswith('Active Multipath Internet connections'):
|
if line.startswith('Active Multipath Internet connections'):
|
||||||
@ -118,6 +132,7 @@ def parse(cleandata):
|
|||||||
active_kernel_event = False
|
active_kernel_event = False
|
||||||
active_kernel_control = False
|
active_kernel_control = False
|
||||||
routing_table = False
|
routing_table = False
|
||||||
|
interface_table = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if line.startswith('Active LOCAL (UNIX) domain sockets'):
|
if line.startswith('Active LOCAL (UNIX) domain sockets'):
|
||||||
@ -128,6 +143,7 @@ def parse(cleandata):
|
|||||||
active_kernel_event = False
|
active_kernel_event = False
|
||||||
active_kernel_control = False
|
active_kernel_control = False
|
||||||
routing_table = False
|
routing_table = False
|
||||||
|
interface_table = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if line.startswith('Registered kernel control modules'):
|
if line.startswith('Registered kernel control modules'):
|
||||||
@ -138,6 +154,7 @@ def parse(cleandata):
|
|||||||
active_kernel_event = False
|
active_kernel_event = False
|
||||||
active_kernel_control = False
|
active_kernel_control = False
|
||||||
routing_table = False
|
routing_table = False
|
||||||
|
interface_table = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if line.startswith('Active kernel event sockets'):
|
if line.startswith('Active kernel event sockets'):
|
||||||
@ -148,6 +165,7 @@ def parse(cleandata):
|
|||||||
active_kernel_event = True
|
active_kernel_event = True
|
||||||
active_kernel_control = False
|
active_kernel_control = False
|
||||||
routing_table = False
|
routing_table = False
|
||||||
|
interface_table = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if line.startswith('Active kernel control sockets'):
|
if line.startswith('Active kernel control sockets'):
|
||||||
@ -158,6 +176,7 @@ def parse(cleandata):
|
|||||||
active_kernel_event = False
|
active_kernel_event = False
|
||||||
active_kernel_control = True
|
active_kernel_control = True
|
||||||
routing_table = False
|
routing_table = False
|
||||||
|
interface_table = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if line.startswith('Routing tables'):
|
if line.startswith('Routing tables'):
|
||||||
@ -168,8 +187,20 @@ def parse(cleandata):
|
|||||||
active_kernel_event = False
|
active_kernel_event = False
|
||||||
active_kernel_control = False
|
active_kernel_control = False
|
||||||
routing_table = True
|
routing_table = True
|
||||||
|
interface_table = False
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if line.startswith('Name Mtu '):
|
||||||
|
network = False
|
||||||
|
multipath = False
|
||||||
|
socket = False
|
||||||
|
reg_kernel_control = False
|
||||||
|
active_kernel_event = False
|
||||||
|
active_kernel_control = False
|
||||||
|
routing_table = False
|
||||||
|
interface_table = True
|
||||||
|
# don't continue since there is no real header row for this table
|
||||||
|
|
||||||
# get headers
|
# get headers
|
||||||
if network and (line.startswith('Socket ') or line.startswith('Proto ')):
|
if network and (line.startswith('Socket ') or line.startswith('Proto ')):
|
||||||
header_text = normalize_headers(line)
|
header_text = normalize_headers(line)
|
||||||
@ -201,6 +232,11 @@ def parse(cleandata):
|
|||||||
headers = header_text.split()
|
headers = header_text.split()
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if interface_table and line.startswith('Name Mtu '):
|
||||||
|
header_text = normalize_interface_headers(line)
|
||||||
|
headers = header_text.split()
|
||||||
|
continue
|
||||||
|
|
||||||
# get items
|
# get items
|
||||||
if network:
|
if network:
|
||||||
raw_output.append(parse_item(headers, line, 'network'))
|
raw_output.append(parse_item(headers, line, 'network'))
|
||||||
@ -230,4 +266,8 @@ def parse(cleandata):
|
|||||||
raw_output.append(parse_item(headers, line, 'route'))
|
raw_output.append(parse_item(headers, line, 'route'))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
if interface_table:
|
||||||
|
raw_output.append(parse_item(headers, line, 'interface'))
|
||||||
|
continue
|
||||||
|
|
||||||
return parse_post(raw_output)
|
return parse_post(raw_output)
|
||||||
|
43
tests/fixtures/osx-10.14.6/netstat-i.out
vendored
Normal file
43
tests/fixtures/osx-10.14.6/netstat-i.out
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll
|
||||||
|
lo0 16384 <Link#1> 1580150 0 1580150 0 0
|
||||||
|
lo0 16384 127 localhost 1580150 - 1580150 - -
|
||||||
|
lo0 16384 localhost ::1 1580150 - 1580150 - -
|
||||||
|
lo0 16384 fe80::1%lo0 fe80:1::1 1580150 - 1580150 - -
|
||||||
|
gif0* 1280 <Link#2> 0 0 0 0 0
|
||||||
|
stf0* 1280 <Link#3> 0 0 0 0 0
|
||||||
|
VHC12 0 <Link#4> 0 0 0 0 0
|
||||||
|
XHC1* 0 <Link#5> 0 0 0 0 0
|
||||||
|
XHC0* 0 <Link#6> 0 0 0 0 0
|
||||||
|
XHC20 0 <Link#7> 0 0 0 0 0
|
||||||
|
en5 1500 <Link#8> ac:de:48:00:11:22 140215 0 137522 721 0
|
||||||
|
en5 1500 fe80::aede: fe80:8::aede:48ff 140215 - 137522 - -
|
||||||
|
ap1* 1500 <Link#9> a6:83:e7:2d:62:8f 0 0 0 0 0
|
||||||
|
en0 1500 <Link#10> a4:83:e7:2d:62:8f 23300545 0 26448755 464 0
|
||||||
|
en0 1500 kbrazil-mac fe80:a::cf9:ca6f: 23300545 - 26448755 - -
|
||||||
|
en0 1500 192.168.1 kbrazil-mac.att 23300545 - 26448755 - -
|
||||||
|
en0 1500 kbrazil-mac 2600:1700:bab0:d4 23300545 - 26448755 - -
|
||||||
|
en0 1500 kbrazil-mac 2600:1700:bab0:d4 23300545 - 26448755 - -
|
||||||
|
en0 1500 kbrazil-mac 2600:1700:bab0:d4 23300545 - 26448755 - -
|
||||||
|
en0 1500 kbrazil-mac 2600:1700:bab0:d4 23300545 - 26448755 - -
|
||||||
|
en0 1500 kbrazil-mac 2600:1700:bab0:d4 23300545 - 26448755 - -
|
||||||
|
en0 1500 kbrazil-mac 2600:1700:bab0:d4 23300545 - 26448755 - -
|
||||||
|
p2p0 2304 <Link#11> 06:83:e7:2d:62:8f 0 0 0 0 0
|
||||||
|
awdl0 1484 <Link#12> b6:1f:b7:57:a5:4f 0 0 5097 0 0
|
||||||
|
awdl0 1484 fe80::b41f: fe80:c::b41f:b7ff 0 - 5097 - -
|
||||||
|
en1 1500 <Link#13> ea:00:fd:08:57:01 0 0 0 0 0
|
||||||
|
en2 1500 <Link#14> ea:00:fd:08:57:00 0 0 0 0 0
|
||||||
|
en3 1500 <Link#15> ea:00:fd:08:57:05 0 0 0 0 0
|
||||||
|
en4 1500 <Link#16> ea:00:fd:08:57:04 0 0 0 0 0
|
||||||
|
bridg 1500 <Link#17> ea:00:fd:08:57:01 0 0 0 0 0
|
||||||
|
utun0 2000 <Link#18> 0 0 159 0 0
|
||||||
|
utun0 2000 kbrazil-mac fe80:12::30fe:52f 0 - 159 - -
|
||||||
|
utun1 1380 <Link#21> 0 0 2 0 0
|
||||||
|
utun1 1380 kbrazil-mac fe80:15::aaf6:178 0 - 2 - -
|
||||||
|
utun2 1380 <Link#22> 0 0 2 0 0
|
||||||
|
utun2 1380 kbrazil-mac fe80:16::ce02:efd 0 - 2 - -
|
||||||
|
utun3 1380 <Link#23> 0 0 2 0 0
|
||||||
|
utun3 1380 kbrazil-mac fe80:17::1188:a03 0 - 2 - -
|
||||||
|
vmnet 1500 <Link#19> 00:50:56:c0:00:01 0 0 0 0 0
|
||||||
|
vmnet 1500 192.168.101 192.168.101.1 0 - 0 - -
|
||||||
|
vmnet 1500 <Link#20> 00:50:56:c0:00:08 1853 0 0 0 0
|
||||||
|
vmnet 1500 192.168.71 192.168.71.1 1853 - 0 - -
|
Reference in New Issue
Block a user