| import re |
| import sys |
| import subprocess |
| import json |
| |
| |
| def shell(command): |
| _ps = subprocess.Popen( |
| command.split(), |
| stdout=subprocess.PIPE |
| ).communicate()[0].decode() |
| |
| return _ps |
| |
| |
| def cut_option(_param, _options_list): |
| _option = "n/a" |
| _result_list = [] |
| if _param in _options_list: |
| _index = _options_list.index(_param) |
| _option = _options_list[_index+1] |
| _l1 = _options_list[:_index] |
| _l2 = _options_list[_index+2:] |
| _result_list = _l1 + _l2 |
| else: |
| _result_list = _options_list |
| return _option, _result_list |
| |
| |
| def get_ifs_data(): |
| _ifs_raw = shell('ip a') |
| |
| if_start = re.compile("^[0-9]+: .*: \<.*\> .*$") |
| if_ipv4 = re.compile("^\s{4}inet\ .*$") |
| |
| _ifs = {} |
| _if_name = None |
| for line in _ifs_raw.splitlines(): |
| _if_data = {} |
| if if_start.match(line): |
| _tmp = line.split(':') |
| _if_name = _tmp[1].strip() |
| _if_options = _tmp[2].strip().split(' ') |
| _if_data['order'] = _tmp[0] |
| _if_data['mtu'], _if_options = cut_option("mtu", _if_options) |
| _if_data['qlen'], _if_options = cut_option("qlen", _if_options) |
| _if_data['state'], _if_options = cut_option("state", _if_options) |
| _if_data['other'] = _if_options |
| _if_data['ipv4'] = {} |
| _ifs[_if_name] = _if_data |
| elif if_ipv4.match(line): |
| if _if_name is None: |
| continue |
| else: |
| _tmp = line.strip().split(' ', 2) |
| _ip = _tmp[1] |
| _options = _tmp[2].split(' ') |
| _brd, _options = cut_option("brd", _options) |
| # TODO: Parse other options, mask, brd, etc... |
| _ifs[_if_name]['ipv4'][_ip] = {} |
| _ifs[_if_name]['ipv4'][_ip]['brd'] = _brd |
| _ifs[_if_name]['ipv4'][_ip]['other'] = _options |
| |
| return _ifs |
| |
| |
| ifs_data = get_ifs_data() |
| |
| # _ifs = sorted(ifs_data.keys()) |
| # _ifs.remove("lo") |
| # for _idx in range(len(_ifs)): |
| # print("\t{}:\t{},\t\t{},\t{}".format( |
| # _ifs[_idx], |
| # " ".join(ifs_data[_ifs[_idx]]['ipv4'].keys()), |
| # ifs_data[_ifs[_idx]]['mtu'], |
| # ifs_data[_ifs[_idx]]['state'] |
| # )) |
| |
| |
| buff = json.dumps(ifs_data) |
| sys.stdout.write(buff) |