Try the
jcweb demo!
I’m happy to announce the release of jc version 1.13.1 available on github and pypi.
jc now supports over 55 commands and file-types, including the new ping, sysctl, traceroute, and tracepath command parsers. The INI file parser has been enhanced to support simple key/value text files and the route command parser now supports IPv6 tables.
Custom local parser plugins are now supported. This allows overriding existing parsers and rapid development of new parsers.
Other updates include verbose debugging, more consistent handling of empty data, and many parser fixes for FreeBSD.
jc can be installed via pip or through several new official OS package repositories, including Fedora, openSUSE, Arch Linux, NixOS Linux, Guix System Linux, FreeBSD, and macOS. For more information on how to get jc, click here.
To upgrade with pip:
$ pip3 install --upgrade jc
New Features
jcis now available on the official Fedora repository (dnf install jc)jcis now available on the official Arch Linux repository (pacman -S jc)jcis now available on the official NixOS repository (nix-env -iA nixpkgs.jc)jcis now available on the official Guix System Linux repository (guix install jc)jcis now available on the official FreeBSD ports repository (portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean)jcis in process (Intent To Package) for Debian packaging.- Local custom parser plugins allow you to override packaged parsers or rapidly create your own.
- Verbose debugging is now supported with the
-ddcommand argument. - All parsers now correctly return empty objects when sent empty data.
- Older versions of the
pygmentslibrary (>=2.3.0) are now supported (for Debian packaging)
New Parsers
jc now supports 55 parsers. New parsers include ping, sysctl, tracepath, and traceroute.
Documentation and schemas for all parsers can be found here.
ping command parser
Linux, macOS, and FreeBSD support for the ping command:
$ ping 8.8.8.8 -c 3 | jc --ping -p # or: jc -p ping 8.8.8.8 -c 3
{
"destination_ip": "8.8.8.8",
"data_bytes": 56,
"pattern": null,
"destination": "8.8.8.8",
"packets_transmitted": 3,
"packets_received": 3,
"packet_loss_percent": 0.0,
"duplicates": 0,
"time_ms": 2005.0,
"round_trip_ms_min": 23.835,
"round_trip_ms_avg": 30.46,
"round_trip_ms_max": 34.838,
"round_trip_ms_stddev": 4.766,
"responses": [
{
"type": "reply",
"timestamp": null,
"bytes": 64,
"response_ip": "8.8.8.8",
"icmp_seq": 1,
"ttl": 118,
"time_ms": 23.8,
"duplicate": false
},
{
"type": "reply",
"timestamp": null,
"bytes": 64,
"response_ip": "8.8.8.8",
"icmp_seq": 2,
"ttl": 118,
"time_ms": 34.8,
"duplicate": false
},
{
"type": "reply",
"timestamp": null,
"bytes": 64,
"response_ip": "8.8.8.8",
"icmp_seq": 3,
"ttl": 118,
"time_ms": 32.7,
"duplicate": false
}
]
}
sysctl command parser
Linux, macOS, and FreeBSD support for the sysctl -a command:
$ sysctl -a | jc --sysctl -p # or: jc -p sysctl -a
{
"user.cs_path": "/usr/bin:/bin:/usr/sbin:/sbin",
"user.bc_base_max": 99,
"user.bc_dim_max": 2048,
"user.bc_scale_max": 99,
"user.bc_string_max": 1000,
"user.coll_weights_max": 2,
"user.expr_nest_max": 32
...
}
tracepath command parser
Linux support for the tracepath command:
$ tracepath6 3ffe:2400:0:109::2 | jc --tracepath -p
{
"pmtu": 1480,
"forward_hops": 2,
"return_hops": 2,
"hops": [
{
"ttl": 1,
"guess": true,
"host": "[LOCALHOST]",
"reply_ms": null,
"pmtu": 1500,
"asymmetric_difference": null,
"reached": false
},
{
"ttl": 1,
"guess": false,
"host": "dust.inr.ac.ru",
"reply_ms": 0.411,
"pmtu": null,
"asymmetric_difference": null,
"reached": false
},
{
"ttl": 2,
"guess": false,
"host": "dust.inr.ac.ru",
"reply_ms": 0.39,
"pmtu": 1480,
"asymmetric_difference": 1,
"reached": false
},
{
"ttl": 2,
"guess": false,
"host": "3ffe:2400:0:109::2",
"reply_ms": 463.514,
"pmtu": null,
"asymmetric_difference": null,
"reached": true
}
]
}
traceroute command parser
Linux, macOS, and FreeBSD support for the traceroute command:
$ traceroute -m 3 8.8.8.8 | jc --traceroute -p # or: jc -p traceroute -m 3 8.8.8.8
{
"destination_ip": "8.8.8.8",
"destination_name": "8.8.8.8",
"hops": [
{
"hop": 1,
"probes": [
{
"annotation": null,
"asn": null,
"ip": "192.168.1.254",
"name": "dsldevice.local.net",
"rtt": 6.616
},
{
"annotation": null,
"asn": null,
"ip": "192.168.1.254",
"name": "dsldevice.local.net",
"rtt": 6.413
},
{
"annotation": null,
"asn": null,
"ip": "192.168.1.254",
"name": "dsldevice.local.net",
"rtt": 6.308
}
]
},
{
"hop": 2,
"probes": [
{
"annotation": null,
"asn": null,
"ip": "76.220.24.1",
"name": "76-220-24-1.lightspeed.sntcca.sbcglobal.net",
"rtt": 29.367
},
{
"annotation": null,
"asn": null,
"ip": "76.220.24.1",
"name": "76-220-24-1.lightspeed.sntcca.sbcglobal.net",
"rtt": 40.197
},
{
"annotation": null,
"asn": null,
"ip": "76.220.24.1",
"name": "76-220-24-1.lightspeed.sntcca.sbcglobal.net",
"rtt": 29.162
}
]
},
{
"hop": 3,
"probes": [
{
"annotation": null,
"asn": null,
"ip": null,
"name": null,
"rtt": null
}
]
}
]
}
Updated Parsers
There have been many parser updates since v1.11.0. The INI file parser has been enhanced to support files and output that contains simple key/value pairs. The route command parser has been enhanced to add support for IPv6 routing tables. The uname parser provides more intuitive debug messages and an issue in the iptables command parser was fixed, allowing it to convert the last row of a table. Many other parser enhancements including the consistent handling of blank input, FreeBSD support, and minor field additions and fixes are included.
Key/Value Pair Files with the INI File Parser
The INI file parser has been enhanced to now support files containing simple key/value pairs. Files can include comments prepended with # or ; and keys and values can be delimited by = or : with or without spaces. Quotation marks are stripped from quoted values, though they can be kept with the -r (raw output) jc argument.
These types of files can be found in many places, including configuration files in /etc. (e.g. /etc/sysconfig/network-scripts).
$ cat keyvalue.txt
# this file contains key/value pairs
name = John Doe
address=555 California Drive
age: 34
; comments can include # or ;
# delimiter can be = or :
# quoted values have quotation marks stripped by default
# but can be preserved with the -r argument
occupation:"Engineer"
$ cat keyvalue.txt | jc --ini -p
{
"name": "John Doe",
"address": "555 California Drive",
"age": "34",
"occupation": "Engineer"
}
route Command Parser
The route command parser has been enhanced to support IPv6 tables.
$ route -6 | jc --route -p # or: jc -p route -6
[
{
"destination": "[::]/96",
"next_hop": "[::]",
"flags": "!n",
"metric": 1024,
"ref": 0,
"use": 0,
"iface": "lo",
"flags_pretty": [
"REJECT"
]
},
{
"destination": "0.0.0.0/96",
"next_hop": "[::]",
"flags": "!n",
"metric": 1024,
"ref": 0,
"use": 0,
"iface": "lo",
"flags_pretty": [
"REJECT"
]
},
{
"destination": "2002:a00::/24",
"next_hop": "[::]",
"flags": "!n",
"metric": 1024,
"ref": 0,
"use": 0,
"iface": "lo",
"flags_pretty": [
"REJECT"
]
},
...
]
Schema Changes
There are no schema changes in this release.
Full Parser List
airport -Iairport -sarpblkidcrontabcrontab-uCSVdfdigdmidecodeduenvfilefreefstab/etc/group/etc/gshadowhistory/etc/hostsidifconfigINIiptablesjobslastandlastblslsblklsmodlsofmountnetstatntpq/etc/passwdpingpip listpip showpsroute/etc/shadowssstatsysctlsystemctlsystemctl list-jobssystemctl list-socketssystemctl list-unit-filestimedatectltracepathtracerouteuname -auptimewwhoXMLYAML
For more information on the motivations for creating
jc, see my blog post.
Happy parsing!