diff --git a/jc/parsers/ifconfig.py b/jc/parsers/ifconfig.py index 245dc038..f9972ca7 100644 --- a/jc/parsers/ifconfig.py +++ b/jc/parsers/ifconfig.py @@ -5,36 +5,67 @@ Usage: no ifconfig options are supported. -Example: +Examples: $ ifconfig | jc --ifconfig -p [ { - "name": "docker0", - "flags": "4099", - "state": "UP,BROADCAST,MULTICAST", - "mtu": "1500", - "ipv4_addr": "172.17.0.1", - "ipv4_mask": "255.255.0.0", - "ipv4_bcast": "0.0.0.0", - "mac_addr": "02:42:53:18:31:cc", + "name": "ens33", + "flags": 4163, + "state": "UP,BROADCAST,RUNNING,MULTICAST", + "mtu": 1500, + "ipv4_addr": "192.168.71.138", + "ipv4_mask": "255.255.255.0", + "ipv4_bcast": "192.168.71.255", + "ipv6_addr": "fe80::c1cb:715d:bc3e:b8a0", + "ipv6_mask": 64, + "ipv6_scope": "link", + "mac_addr": "00:0c:29:3b:58:0e", "type": "Ethernet", - "rx_packets": "0", - "rx_errors": "0", - "rx_dropped": "0", - "rx_overruns": "0", - "rx_frame": "0", - "tx_packets": "0", - "tx_errors": "0", - "tx_dropped": "0", - "tx_overruns": "0", - "tx_carrier": "0", - "tx_collisions": "0", - "ipv6_addr": null, - "ipv6_mask": null, - "ipv6_scope": null, + "rx_packets": 6374, + "rx_errors": 0, + "rx_dropped": 0, + "rx_overruns": 0, + "rx_frame": 0, + "tx_packets": 3707, + "tx_errors": 0, + "tx_dropped": 0, + "tx_overruns": 0, + "tx_carrier": 0, + "tx_collisions": 0, "metric": null }, + { + "name": "lo", + "flags": 73, + "state": "UP,LOOPBACK,RUNNING", + "mtu": 65536, + "ipv4_addr": "127.0.0.1", + "ipv4_mask": "255.0.0.0", + "ipv4_bcast": null, + "ipv6_addr": "::1", + "ipv6_mask": 128, + "ipv6_scope": "host", + "mac_addr": null, + "type": "Local Loopback", + "rx_packets": 81, + "rx_errors": 0, + "rx_dropped": 0, + "rx_overruns": 0, + "rx_frame": 0, + "tx_packets": 81, + "tx_errors": 0, + "tx_dropped": 0, + "tx_overruns": 0, + "tx_carrier": 0, + "tx_collisions": 0, + "metric": null + } +] + + +$ ifconfig | jc --ifconfig -p -r +[ { "name": "ens33", "flags": "4163", @@ -89,12 +120,57 @@ $ ifconfig | jc --ifconfig -p } ] """ -from collections import namedtuple from ifconfigparser import IfconfigParser -def parse(data): - output = [] +def process(proc_data): + '''schema: + [ + { + "name": string, + "flags": integer, + "state": string, + "mtu": integer, + "ipv4_addr": string, + "ipv4_mask": string, + "ipv4_bcast": string, + "ipv6_addr": string, + "ipv6_mask": integer, + "ipv6_scope": string, + "mac_addr": string, + "type": string, + "rx_packets": integer, + "rx_errors": integer, + "rx_dropped": integer, + "rx_overruns": integer, + "rx_frame": integer, + "tx_packets": integer, + "tx_errors": integer, + "tx_dropped": integer, + "tx_overruns": integer, + "tx_carrier": integer, + "tx_collisions": integer, + "metric": integer + } + ] + ''' + for entry in proc_data: + int_list = ['flags', 'mtu', 'ipv6_mask', 'rx_packets', 'rx_errors', 'rx_dropped', 'rx_overruns', + 'rx_frame', 'tx_packets', 'tx_errors', 'tx_dropped', 'tx_overruns', 'tx_carrier', + 'tx_collisions', 'metric'] + for key in int_list: + if key in entry: + try: + key_int = int(entry[key]) + entry[key] = key_int + except (ValueError, TypeError): + entry[key] = None + + return proc_data + + +def parse(data, raw=False): + raw_output = [] parsed = IfconfigParser(console_output=data) interfaces = parsed.get_interfaces() @@ -103,6 +179,9 @@ def parse(data): for iface in interfaces: d = interfaces[iface]._asdict() dct = dict(d) - output.append(dct) + raw_output.append(dct) - return output + if raw: + return raw_output + else: + return process(raw_output)