mirror of
https://github.com/kellyjonbrazil/jc.git
synced 2025-06-19 00:17:51 +02:00
@ -1,5 +1,11 @@
|
|||||||
jc changelog
|
jc changelog
|
||||||
|
|
||||||
|
20220828 v1.21.1
|
||||||
|
- Fix IP Address string parser for older python versions that don't cleanly
|
||||||
|
accept decimal input format (e.g. python 3.6)
|
||||||
|
- Fix `arp -a` parser for cases where incomplete hardware addresses are found
|
||||||
|
in the arp table on linux
|
||||||
|
|
||||||
20220821 v1.21.0
|
20220821 v1.21.0
|
||||||
- Add IP Address string parser
|
- Add IP Address string parser
|
||||||
- Add Syslog standard and streaming string parsers (RFC 3164 and RFC 5424)
|
- Add Syslog standard and streaming string parsers (RFC 3164 and RFC 5424)
|
||||||
|
@ -140,4 +140,4 @@ Returns:
|
|||||||
### Parser Information
|
### Parser Information
|
||||||
Compatibility: linux, aix, freebsd, darwin
|
Compatibility: linux, aix, freebsd, darwin
|
||||||
|
|
||||||
Version 1.10 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
Version 1.11 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||||
|
@ -487,4 +487,4 @@ Returns:
|
|||||||
### Parser Information
|
### Parser Information
|
||||||
Compatibility: linux, darwin, cygwin, win32, aix, freebsd
|
Compatibility: linux, darwin, cygwin, win32, aix, freebsd
|
||||||
|
|
||||||
Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||||
|
@ -6,7 +6,7 @@ import importlib
|
|||||||
from typing import Dict, List, Iterable, Union, Iterator
|
from typing import Dict, List, Iterable, Union, Iterator
|
||||||
from jc import appdirs
|
from jc import appdirs
|
||||||
|
|
||||||
__version__ = '1.21.0'
|
__version__ = '1.21.1'
|
||||||
|
|
||||||
parsers = [
|
parsers = [
|
||||||
'acpi',
|
'acpi',
|
||||||
|
@ -119,7 +119,7 @@ import jc.parsers.universal
|
|||||||
|
|
||||||
class info():
|
class info():
|
||||||
"""Provides parser metadata (version, author, etc.)"""
|
"""Provides parser metadata (version, author, etc.)"""
|
||||||
version = '1.10'
|
version = '1.11'
|
||||||
description = '`arp` command parser'
|
description = '`arp` command parser'
|
||||||
author = 'Kelly Brazil'
|
author = 'Kelly Brazil'
|
||||||
author_email = 'kellyjonbrazil@gmail.com'
|
author_email = 'kellyjonbrazil@gmail.com'
|
||||||
@ -221,6 +221,7 @@ def parse(
|
|||||||
else:
|
else:
|
||||||
for line in cleandata:
|
for line in cleandata:
|
||||||
splitline = line.split()
|
splitline = line.split()
|
||||||
|
if '<incomplete>' not in splitline:
|
||||||
output_line = {
|
output_line = {
|
||||||
'name': splitline[0],
|
'name': splitline[0],
|
||||||
'address': splitline[1].lstrip('(').rstrip(')'),
|
'address': splitline[1].lstrip('(').rstrip(')'),
|
||||||
@ -228,6 +229,16 @@ def parse(
|
|||||||
'hwaddress': splitline[3],
|
'hwaddress': splitline[3],
|
||||||
'iface': splitline[6],
|
'iface': splitline[6],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else:
|
||||||
|
output_line = {
|
||||||
|
'name': splitline[0],
|
||||||
|
'address': splitline[1].lstrip('(').rstrip(')'),
|
||||||
|
'hwtype': None,
|
||||||
|
'hwaddress': None,
|
||||||
|
'iface': splitline[5],
|
||||||
|
}
|
||||||
|
|
||||||
raw_output.append(output_line)
|
raw_output.append(output_line)
|
||||||
|
|
||||||
return raw_output if raw else _process(raw_output)
|
return raw_output if raw else _process(raw_output)
|
||||||
|
@ -468,7 +468,7 @@ import jc.utils
|
|||||||
|
|
||||||
class info():
|
class info():
|
||||||
"""Provides parser metadata (version, author, etc.)"""
|
"""Provides parser metadata (version, author, etc.)"""
|
||||||
version = '1.0'
|
version = '1.1'
|
||||||
description = 'IPv4 and IPv6 Address string parser'
|
description = 'IPv4 and IPv6 Address string parser'
|
||||||
author = 'Kelly Brazil'
|
author = 'Kelly Brazil'
|
||||||
author_email = 'kellyjonbrazil@gmail.com'
|
author_email = 'kellyjonbrazil@gmail.com'
|
||||||
@ -565,10 +565,20 @@ def parse(
|
|||||||
broadcast_string = str(network.broadcast_address)
|
broadcast_string = str(network.broadcast_address)
|
||||||
broadcast_ipobj = ipaddress.ip_address(broadcast_string)
|
broadcast_ipobj = ipaddress.ip_address(broadcast_string)
|
||||||
|
|
||||||
hostmask_string = str(interface.with_hostmask).split('/')[1]
|
# older versions of python (e.g. 3.6) don't provide hostmask when a decimal IP is entered
|
||||||
|
try:
|
||||||
|
hostmask_string = str(interface.hostmask)
|
||||||
|
except AttributeError:
|
||||||
|
hostmask_string = '0.0.0.0'
|
||||||
|
|
||||||
hostmask_ipobj = ipaddress.ip_address(hostmask_string)
|
hostmask_ipobj = ipaddress.ip_address(hostmask_string)
|
||||||
|
|
||||||
netmask_string = str(interface.with_netmask).split('/')[1]
|
# older versions of python (e.g. 3.6) don't provide netmask when a decimal IP is entered
|
||||||
|
try:
|
||||||
|
netmask_string = str(interface.netmask)
|
||||||
|
except AttributeError:
|
||||||
|
netmask_string = '255.255.255.255'
|
||||||
|
|
||||||
netmask_ipobj = ipaddress.ip_address(netmask_string)
|
netmask_ipobj = ipaddress.ip_address(netmask_string)
|
||||||
|
|
||||||
bare_ip_string = str(interface.ip)
|
bare_ip_string = str(interface.ip)
|
||||||
|
2
man/jc.1
2
man/jc.1
@ -1,4 +1,4 @@
|
|||||||
.TH jc 1 2022-08-24 1.21.0 "JSON Convert"
|
.TH jc 1 2022-08-28 1.21.1 "JSON Convert"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
\fBjc\fP \- JSON Convert JSONifies the output of many CLI tools and file-types
|
\fBjc\fP \- JSON Convert JSONifies the output of many CLI tools and file-types
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
2
setup.py
2
setup.py
@ -5,7 +5,7 @@ with open('README.md', 'r') as f:
|
|||||||
|
|
||||||
setuptools.setup(
|
setuptools.setup(
|
||||||
name='jc',
|
name='jc',
|
||||||
version='1.21.0',
|
version='1.21.1',
|
||||||
author='Kelly Brazil',
|
author='Kelly Brazil',
|
||||||
author_email='kellyjonbrazil@gmail.com',
|
author_email='kellyjonbrazil@gmail.com',
|
||||||
description='Converts the output of popular command-line tools and file-types to JSON.',
|
description='Converts the output of popular command-line tools and file-types to JSON.',
|
||||||
|
1
tests/fixtures/centos-8/arp-a.json
vendored
Normal file
1
tests/fixtures/centos-8/arp-a.json
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
[{"name":null,"address":"192.168.71.21","hwtype":null,"hwaddress":null,"iface":"ens33"},{"name":null,"address":"192.168.71.128","hwtype":null,"hwaddress":null,"iface":"ens33"},{"name":null,"address":"192.168.71.254","hwtype":"ether","hwaddress":"00:50:56:e2:91:0e","iface":"ens33"},{"name":null,"address":"192.168.71.226","hwtype":null,"hwaddress":null,"iface":"ens33"}]
|
4
tests/fixtures/centos-8/arp-a.out
vendored
Normal file
4
tests/fixtures/centos-8/arp-a.out
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
? (192.168.71.21) at <incomplete> on ens33
|
||||||
|
? (192.168.71.128) at <incomplete> on ens33
|
||||||
|
? (192.168.71.254) at 00:50:56:e2:91:0e [ether] on ens33
|
||||||
|
? (192.168.71.226) at <incomplete> on ens33
|
@ -40,6 +40,9 @@ class MyTests(unittest.TestCase):
|
|||||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/freebsd12/arp-a.out'), 'r', encoding='utf-8') as f:
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/freebsd12/arp-a.out'), 'r', encoding='utf-8') as f:
|
||||||
self.freebsd_arp_a = f.read()
|
self.freebsd_arp_a = f.read()
|
||||||
|
|
||||||
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-8/arp-a.out'), 'r', encoding='utf-8') as f:
|
||||||
|
self.centos8_arp_a = f.read()
|
||||||
|
|
||||||
# output
|
# output
|
||||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/arp.json'), 'r', encoding='utf-8') as f:
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/arp.json'), 'r', encoding='utf-8') as f:
|
||||||
self.centos_7_7_arp_json = json.loads(f.read())
|
self.centos_7_7_arp_json = json.loads(f.read())
|
||||||
@ -71,6 +74,9 @@ class MyTests(unittest.TestCase):
|
|||||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/freebsd12/arp-a.json'), 'r', encoding='utf-8') as f:
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/freebsd12/arp-a.json'), 'r', encoding='utf-8') as f:
|
||||||
self.freebsd12_arp_a_json = json.loads(f.read())
|
self.freebsd12_arp_a_json = json.loads(f.read())
|
||||||
|
|
||||||
|
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-8/arp-a.json'), 'r', encoding='utf-8') as f:
|
||||||
|
self.centos8_arp_a_json = json.loads(f.read())
|
||||||
|
|
||||||
def test_arp_nodata(self):
|
def test_arp_nodata(self):
|
||||||
"""
|
"""
|
||||||
Test 'arp' with no data
|
Test 'arp' with no data
|
||||||
@ -137,6 +143,12 @@ class MyTests(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
self.assertEqual(jc.parsers.arp.parse(self.freebsd_arp_a, quiet=True), self.freebsd12_arp_a_json)
|
self.assertEqual(jc.parsers.arp.parse(self.freebsd_arp_a, quiet=True), self.freebsd12_arp_a_json)
|
||||||
|
|
||||||
|
def test_arp_a_centos8(self):
|
||||||
|
"""
|
||||||
|
Test 'arp -a' on CentOS 8 with incomplete hw addresses
|
||||||
|
"""
|
||||||
|
self.assertEqual(jc.parsers.arp.parse(self.centos8_arp_a, quiet=True), self.centos8_arp_a_json)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Reference in New Issue
Block a user