From 95672c23b710748ea41fcaa8ca3d0b8815e96f37 Mon Sep 17 00:00:00 2001 From: Kelly Brazil Date: Fri, 18 Oct 2024 14:30:04 -0700 Subject: [PATCH] doc update --- CHANGELOG | 1 + README.md | 1 + completions/jc_bash_completion.sh | 4 +- completions/jc_zsh_completion.sh | 6 +- docs/parsers/bluetoothctl.md | 4 +- docs/parsers/ipconfig.md | 458 ++++++++++++++++++++++++++++++ docs/utils.md | 3 +- jc/parsers/ipconfig.py | 54 +++- man/jc.1 | 12 +- 9 files changed, 519 insertions(+), 24 deletions(-) create mode 100644 docs/parsers/ipconfig.md diff --git a/CHANGELOG b/CHANGELOG index 89dd9665..3e2fbafc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ jc changelog 20241018 v1.25.4 +- Add `ipconfig` command parser - Enhance `ping-s` streaming parser to support error replies - Enhance `ethtool` parser to support `link_partner_advertised_link_modes` - Enhance `ifconfig` parser to support `utun` interfaces with assigned IPv4 addresses on macOS diff --git a/README.md b/README.md index b81ca7dc..0ec8c9c9 100644 --- a/README.md +++ b/README.md @@ -218,6 +218,7 @@ option. | `--iostat` | `iostat` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/iostat) | | `--iostat-s` | `iostat` command streaming parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/iostat_s) | | `--ip-address` | IPv4 and IPv6 Address string parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ip_address) | +| `--ipconfig` | `ipconfig` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ipconfig) | | `--iptables` | `iptables` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/iptables) | | `--ip-route` | `ip route` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ip_route) | | `--iw-scan` | `iw dev [device] scan` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/iw_scan) | diff --git a/completions/jc_bash_completion.sh b/completions/jc_bash_completion.sh index 445cc14c..743347f4 100644 --- a/completions/jc_bash_completion.sh +++ b/completions/jc_bash_completion.sh @@ -3,8 +3,8 @@ _jc() local cur prev words cword jc_commands jc_parsers jc_options \ jc_about_options jc_about_mod_options jc_help_options jc_special_options - jc_commands=(acpi airport apt-cache apt-get arp blkid bluetoothctl cbt certbot chage cksum crontab curl date debconf-show df dig dmidecode dpkg du efibootmgr env ethtool file findmnt finger free git gpg hciconfig host id ifconfig iostat ip iptables iw iwconfig jobs last lastb ls lsattr lsb_release lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat needrestart netstat nmcli nsd-control ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum swapon sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 tune2fs udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool) - jc_parsers=(--acpi --airport --airport-s --apt-cache-show --apt-get-sqq --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --curl-head --date --datetime-iso --debconf-show --df --dig --dir --dmidecode --dpkg-l --du --efibootmgr --email-address --env --ethtool --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --http-headers --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --kv-dup --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --needrestart --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --path --path-list --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --pkg-index-apk --pkg-index-deb --plist --postconf --proc --proc-buddyinfo --proc-cmdline --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-tcp --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --resolve-conf --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --srt --ss --ssh-conf --sshd-conf --stat --stat-s --swapon --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --tune2fs --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --veracrypt --vmstat --vmstat-s --w --wc --who --x509-cert --x509-csr --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status) + jc_commands=(acpi airport apt-cache apt-get arp blkid bluetoothctl cbt certbot chage cksum crontab curl date debconf-show df dig dmidecode dpkg du efibootmgr env ethtool file findmnt finger free git gpg hciconfig host id ifconfig iostat ip ipconfig iptables iw iwconfig jobs last lastb ls lsattr lsb_release lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat needrestart netstat nmcli nsd-control ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum swapon sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 tune2fs udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool) + jc_parsers=(--acpi --airport --airport-s --apt-cache-show --apt-get-sqq --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --curl-head --date --datetime-iso --debconf-show --df --dig --dir --dmidecode --dpkg-l --du --efibootmgr --email-address --env --ethtool --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --http-headers --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --ipconfig --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --kv-dup --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --needrestart --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --path --path-list --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --pkg-index-apk --pkg-index-deb --plist --postconf --proc --proc-buddyinfo --proc-cmdline --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-tcp --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --resolve-conf --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --srt --ss --ssh-conf --sshd-conf --stat --stat-s --swapon --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --tune2fs --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --veracrypt --vmstat --vmstat-s --w --wc --who --x509-cert --x509-csr --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status) jc_options=(--force-color -C --debug -d --monochrome -m --meta-out -M --pretty -p --quiet -q --raw -r --slurp -s --unbuffer -u --yaml-out -y) jc_about_options=(--about -a) jc_about_mod_options=(--pretty -p --yaml-out -y --monochrome -m --force-color -C) diff --git a/completions/jc_zsh_completion.sh b/completions/jc_zsh_completion.sh index 13ed727a..46cd5672 100644 --- a/completions/jc_zsh_completion.sh +++ b/completions/jc_zsh_completion.sh @@ -9,7 +9,7 @@ _jc() { jc_help_options jc_help_options_describe \ jc_special_options jc_special_options_describe - jc_commands=(acpi airport apt-cache apt-get arp blkid bluetoothctl cbt certbot chage cksum crontab curl date debconf-show df dig dmidecode dpkg du efibootmgr env ethtool file findmnt finger free git gpg hciconfig host id ifconfig iostat ip iptables iw iwconfig jobs last lastb ls lsattr lsb_release lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat needrestart netstat nmcli nsd-control ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum swapon sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 tune2fs udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool) + jc_commands=(acpi airport apt-cache apt-get arp blkid bluetoothctl cbt certbot chage cksum crontab curl date debconf-show df dig dmidecode dpkg du efibootmgr env ethtool file findmnt finger free git gpg hciconfig host id ifconfig iostat ip ipconfig iptables iw iwconfig jobs last lastb ls lsattr lsb_release lsblk lsmod lsof lspci lsusb md5 md5sum mdadm mount mpstat needrestart netstat nmcli nsd-control ntpq os-prober pidstat ping ping6 pip pip3 postconf printenv ps route rpm rsync sfdisk sha1sum sha224sum sha256sum sha384sum sha512sum shasum ss ssh sshd stat sum swapon sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 tune2fs udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool) jc_commands_describe=( 'acpi:run "acpi" command with magic syntax.' 'airport:run "airport" command with magic syntax.' @@ -46,6 +46,7 @@ _jc() { 'ifconfig:run "ifconfig" command with magic syntax.' 'iostat:run "iostat" command with magic syntax.' 'ip:run "ip" command with magic syntax.' + 'ipconfig:run "ipconfig" command with magic syntax.' 'iptables:run "iptables" command with magic syntax.' 'iw:run "iw" command with magic syntax.' 'iwconfig:run "iwconfig" command with magic syntax.' @@ -121,7 +122,7 @@ _jc() { 'zipinfo:run "zipinfo" command with magic syntax.' 'zpool:run "zpool" command with magic syntax.' ) - jc_parsers=(--acpi --airport --airport-s --apt-cache-show --apt-get-sqq --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --curl-head --date --datetime-iso --debconf-show --df --dig --dir --dmidecode --dpkg-l --du --efibootmgr --email-address --env --ethtool --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --http-headers --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --kv-dup --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --needrestart --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --path --path-list --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --pkg-index-apk --pkg-index-deb --plist --postconf --proc --proc-buddyinfo --proc-cmdline --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-tcp --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --resolve-conf --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --srt --ss --ssh-conf --sshd-conf --stat --stat-s --swapon --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --tune2fs --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --veracrypt --vmstat --vmstat-s --w --wc --who --x509-cert --x509-csr --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status) + jc_parsers=(--acpi --airport --airport-s --apt-cache-show --apt-get-sqq --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --curl-head --date --datetime-iso --debconf-show --df --dig --dir --dmidecode --dpkg-l --du --efibootmgr --email-address --env --ethtool --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --http-headers --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --ipconfig --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --kv-dup --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --needrestart --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --path --path-list --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --pkg-index-apk --pkg-index-deb --plist --postconf --proc --proc-buddyinfo --proc-cmdline --proc-consoles --proc-cpuinfo --proc-crypto --proc-devices --proc-diskstats --proc-filesystems --proc-interrupts --proc-iomem --proc-ioports --proc-loadavg --proc-locks --proc-meminfo --proc-modules --proc-mtrr --proc-pagetypeinfo --proc-partitions --proc-slabinfo --proc-softirqs --proc-stat --proc-swaps --proc-uptime --proc-version --proc-vmallocinfo --proc-vmstat --proc-zoneinfo --proc-driver-rtc --proc-net-arp --proc-net-dev --proc-net-dev-mcast --proc-net-if-inet6 --proc-net-igmp --proc-net-igmp6 --proc-net-ipv6-route --proc-net-netlink --proc-net-netstat --proc-net-packet --proc-net-protocols --proc-net-route --proc-net-tcp --proc-net-unix --proc-pid-fdinfo --proc-pid-io --proc-pid-maps --proc-pid-mountinfo --proc-pid-numa-maps --proc-pid-smaps --proc-pid-stat --proc-pid-statm --proc-pid-status --ps --resolve-conf --route --rpm-qi --rsync --rsync-s --semver --sfdisk --shadow --srt --ss --ssh-conf --sshd-conf --stat --stat-s --swapon --sysctl --syslog --syslog-s --syslog-bsd --syslog-bsd-s --systemctl --systemctl-lj --systemctl-ls --systemctl-luf --systeminfo --time --timedatectl --timestamp --toml --top --top-s --tracepath --traceroute --tune2fs --udevadm --ufw --ufw-appinfo --uname --update-alt-gs --update-alt-q --upower --uptime --url --ver --veracrypt --vmstat --vmstat-s --w --wc --who --x509-cert --x509-csr --xml --xrandr --yaml --zipinfo --zpool-iostat --zpool-status) jc_parsers_describe=( '--acpi:`acpi` command parser' '--airport:`airport -I` command parser' @@ -185,6 +186,7 @@ _jc() { '--iostat:`iostat` command parser' '--iostat-s:`iostat` command streaming parser' '--ip-address:IPv4 and IPv6 Address string parser' + '--ipconfig:`ipconfig` command parser' '--iptables:`iptables` command parser' '--ip-route:`ip route` command parser' '--iw-scan:`iw dev [device] scan` command parser' diff --git a/docs/parsers/bluetoothctl.md b/docs/parsers/bluetoothctl.md index d09e800f..fc82d38b 100644 --- a/docs/parsers/bluetoothctl.md +++ b/docs/parsers/bluetoothctl.md @@ -33,6 +33,8 @@ a controller and a device but there might be fields corresponding to one entity. Controller: [ { + "manufacturer": string, + "version": string, "name": string, "is_default": boolean, "is_public": boolean, @@ -134,4 +136,4 @@ Compatibility: linux Source: [`jc/parsers/bluetoothctl.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/bluetoothctl.py) -Version 1.2 by Jake Ob (iakopap at gmail.com) +Version 1.3 by Jake Ob (iakopap at gmail.com) diff --git a/docs/parsers/ipconfig.md b/docs/parsers/ipconfig.md new file mode 100644 index 00000000..c550f075 --- /dev/null +++ b/docs/parsers/ipconfig.md @@ -0,0 +1,458 @@ +[Home](https://kellyjonbrazil.github.io/jc/) + + +# jc.parsers.ipconfig + +jc - JSON Convert `ipconfig` command output parser + +Usage (cli): + + $ ipconfig /all | jc --ipconfig + $ ipconfig | jc --ipconfig + $ jc ipconfig /all + +Usage (module): + + import jc + result = jc.parse('ipconfig', ipconfig_command_output) + +Schema: + + { + "host_name": string, + "primary_dns_suffix": string, + "node_type": string, + "ip_routing_enabled": boolean, + "wins_proxy_enabled": boolean, + "dns_suffix_search_list": [ + string + ], + "adapters": [ + { + "name_long": string, + "name": string, + "type": string, + "connection_specific_dns_suffix": string, + "connection_specific_dns_suffix_search_list": [ + string + ] + "description": string, + "physical_address": string, + "dhcp_enabled": boolean, + "autoconfiguration_enabled": boolean, + "ipv6_addresses": [ + { + "address": string, + "status": string, + }, + ], + "temporary_ipv6_addresses": [ + { + "address": string, + "status": string, + }, + ], + "link_local_ipv6_addresses": [ + { + "address": string, + "status": string, + "prefix_length": int, + } + ], + "ipv4_addresses": [ + { + "address": string, # [2] + "subnet_mask": string, + "status": string, + "autoconfigured": boolean # [1] + } + ], + "default_gateways": [ + string + ], + "dhcp_server": null, + "dhcpv6_iaid": string, + "dhcpv6_client_duid": string, + "dns_servers": [ + string + ], + "primary_wins_server": string, + "lease_expires": string, # [0] + "lease_obtained": string, # [0] + "netbios_over_tcpip": boolean, + "media_state": string, + "extras": [ + string: string + ] + } + ], + "extras": [] + } + + Notes: + [0] - 'lease_expires' and 'lease_obtained' are parsed to ISO8601 + format date strings. if the value was unable to be parsed by + datetime, the fields will be in their raw form + [1] - 'autoconfigured' under 'ipv4_address' is only providing + indication if the ipv4 address was labeled as "Autoconfiguration + IPv4 Address" vs "IPv4 Address". It does not infer any + information from other fields + [2] - Windows XP uses 'IP Address' instead of 'IPv4 Address'. Both + values are parsed to the 'ipv4_address' object for consistency + +Examples: + + $ ipconfig /all | jc --ipconfig -p + { + "host_name": "DESKTOP-WIN11-HOME", + "primary_dns_suffix": null, + "node_type": "Hybrid", + "ip_routing_enabled": false, + "wins_proxy_enabled": false, + "dns_suffix_search_list": [ + "localdomain" + ], + "adapters": [ + { + "name_long": "Ethernet adapter Ethernet", + "name": "Ethernet", + "type": "Ethernet", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "Intel(R) I211 Gigabit Network Connection", + "physical_address": "24-4B-FE-AB-43-C3", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [], + "ipv4_addresses": [], + "default_gateways": [], + "dhcp_server": null, + "dhcpv6_iaid": null, + "dhcpv6_client_duid": null, + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": null, + "lease_obtained": null, + "netbios_over_tcpip": null, + "media_state": "Media disconnected", + "extras": [] + }, + { + "name_long": "Ethernet adapter Ethernet 2", + "name": "Ethernet 2", + "type": "Ethernet", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "Realtek PCIe 2.5GbE Family Controller", + "physical_address": "24-4B-FE-57-3D-F2", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [], + "ipv4_addresses": [], + "default_gateways": [], + "dhcp_server": null, + "dhcpv6_iaid": null, + "dhcpv6_client_duid": null, + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": null, + "lease_obtained": null, + "netbios_over_tcpip": null, + "media_state": "Media disconnected", + "extras": [] + }, + { + "name_long": "Unknown adapter OpenVPN Data Channel Offload for NordVPN", + "name": "OpenVPN Data Channel Offload for NordVPN", + "type": "Unknown", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "OpenVPN Data Channel Offload", + "physical_address": null, + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [], + "ipv4_addresses": [], + "default_gateways": [], + "dhcp_server": null, + "dhcpv6_iaid": null, + "dhcpv6_client_duid": null, + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": null, + "lease_obtained": null, + "netbios_over_tcpip": null, + "media_state": "Media disconnected", + "extras": [] + }, + { + "name_long": "Unknown adapter Local Area Connection", + "name": "Local Area Connection", + "type": "Unknown", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "TAP-NordVPN Windows Adapter V9", + "physical_address": "00-FF-4C-F4-5E-49", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [], + "ipv4_addresses": [], + "default_gateways": [], + "dhcp_server": null, + "dhcpv6_iaid": null, + "dhcpv6_client_duid": null, + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": null, + "lease_obtained": null, + "netbios_over_tcpip": null, + "media_state": "Media disconnected", + "extras": [] + }, + { + "name_long": "Wireless LAN adapter Local Area Connection* 1", + "name": "Local Area Connection* 1", + "type": "Wireless LAN", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "Microsoft Wi-Fi Direct Virtual Adapter", + "physical_address": "A8-7E-EA-5A-7F-DE", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [], + "ipv4_addresses": [], + "default_gateways": [], + "dhcp_server": null, + "dhcpv6_iaid": null, + "dhcpv6_client_duid": null, + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": null, + "lease_obtained": null, + "netbios_over_tcpip": null, + "media_state": "Media disconnected", + "extras": [] + }, + { + "name_long": "Wireless LAN adapter Local Area Connection* 2", + "name": "Local Area Connection* 2", + "type": "Wireless LAN", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "Microsoft Wi-Fi Direct Virtual Adapter #2", + "physical_address": "AA-7E-EA-F3-64-C3", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [], + "ipv4_addresses": [], + "default_gateways": [], + "dhcp_server": null, + "dhcpv6_iaid": null, + "dhcpv6_client_duid": null, + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": null, + "lease_obtained": null, + "netbios_over_tcpip": null, + "media_state": "Media disconnected", + "extras": [] + }, + { + "name_long": "Ethernet adapter VMware Network Adapter VMnet1", + "name": "VMware Network Adapter VMnet1", + "type": "Ethernet", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "VMware Virtual Ethernet Adapter for VMnet1", + "physical_address": "00-50-56-CC-27-73", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [ + { + "address": "fe80::f47d:9c7f:69dc:591e", + "prefix_length": 8, + "status": "Preferred" + } + ], + "ipv4_addresses": [ + { + "address": "192.168.181.1", + "subnet_mask": "255.255.255.0", + "status": "Preferred", + "autoconfigured": false + } + ], + "default_gateways": [], + "dhcp_server": "192.168.181.254", + "dhcpv6_iaid": "771772502", + "dhcpv6_client_duid": "00-01-00-01-2C-CF-19-EB-24-4B-FE-5B-9B-E6", + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": "2024-09-19T18:01:29", + "lease_obtained": "2024-09-19T08:31:29", + "netbios_over_tcpip": true, + "media_state": null, + "extras": [] + }, + { + "name_long": "Ethernet adapter VMware Network Adapter VMnet8", + "name": "VMware Network Adapter VMnet8", + "type": "Ethernet", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "VMware Virtual Ethernet Adapter for VMnet8", + "physical_address": "00-50-56-C9-A3-78", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [ + { + "address": "fe80::4551:bf0d:59dd:a4f0", + "prefix_length": 10, + "status": "Preferred" + } + ], + "ipv4_addresses": [ + { + "address": "192.168.213.1", + "subnet_mask": "255.255.255.0", + "status": "Preferred", + "autoconfigured": false + } + ], + "default_gateways": [], + "dhcp_server": "192.168.213.254", + "dhcpv6_iaid": "788549718", + "dhcpv6_client_duid": "00-01-00-01-2C-CF-19-EB-24-4B-FE-5B-9B-E6", + "dns_servers": [], + "primary_wins_server": "192.168.213.2", + "lease_expires": "2024-09-19T18:01:29", + "lease_obtained": "2024-09-19T08:31:29", + "netbios_over_tcpip": true, + "media_state": null, + "extras": [] + }, + { + "name_long": "Wireless LAN adapter Wi-Fi", + "name": "Wi-Fi", + "type": "Wireless LAN", + "connection_specific_dns_suffix": "localdomain", + "connection_specific_dns_suffix_search_list": [], + "description": "Intel(R) Wi-Fi 6 AX200 160MHz", + "physical_address": "A8-7E-EA-55-26-B0", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [ + { + "address": "fd63:cc9c:65eb:3f95:57c2:aa:10d8:db08", + "status": "Preferred" + } + ], + "temporary_ipv6_addresses": [ + { + "address": "fd63:cc9c:65eb:3f95:8928:348e:d692:b7ef", + "status": "Preferred" + } + ], + "link_local_ipv6_addresses": [ + { + "address": "fe80::4fae:1380:5a1b:8b6b", + "prefix_length": 11, + "status": "Preferred" + } + ], + "ipv4_addresses": [ + { + "address": "192.168.1.169", + "subnet_mask": "255.255.255.0", + "status": "Preferred", + "autoconfigured": false + } + ], + "default_gateways": [ + "192.168.1.1" + ], + "dhcp_server": "192.168.1.1", + "dhcpv6_iaid": "162037482", + "dhcpv6_client_duid": "00-01-00-01-2C-CF-19-EB-24-4B-FE-5B-9B-E6", + "dns_servers": [ + "192.168.1.1" + ], + "primary_wins_server": null, + "lease_expires": "2024-09-20T08:31:30", + "lease_obtained": "2024-09-19T08:31:30", + "netbios_over_tcpip": true, + "media_state": null, + "extras": [] + }, + { + "name_long": "Ethernet adapter Bluetooth Network Connection", + "name": "Bluetooth Network Connection", + "type": "Ethernet", + "connection_specific_dns_suffix": null, + "connection_specific_dns_suffix_search_list": [], + "description": "Bluetooth Device (Personal Area Network)", + "physical_address": "A8-7E-EA-43-23-14", + "dhcp_enabled": true, + "autoconfiguration_enabled": true, + "ipv6_addresses": [], + "temporary_ipv6_addresses": [], + "link_local_ipv6_addresses": [], + "ipv4_addresses": [], + "default_gateways": [], + "dhcp_server": null, + "dhcpv6_iaid": null, + "dhcpv6_client_duid": null, + "dns_servers": [], + "primary_wins_server": null, + "lease_expires": null, + "lease_obtained": null, + "netbios_over_tcpip": null, + "media_state": "Media disconnected", + "extras": [] + } + ], + "extras": [] + } + + + +### parse + +```python +def parse(data, raw=False, quiet=False) +``` + +Main text parsing function + +Parameters: + + data: (string) text data to parse + raw: (boolean) unprocessed output if True + quiet: (boolean) suppress warning messages if True + +Returns: + + Parsed dictionary. The raw and processed data structures are the same. + +### Parser Information +Compatibility: windows + +Source: [`jc/parsers/ipconfig.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/ipconfig.py) + +Version 1.0 by joehacksalot (joehacksalot@gmail.com) diff --git a/docs/utils.md b/docs/utils.md index eb0df3a4..44718754 100644 --- a/docs/utils.md +++ b/docs/utils.md @@ -69,7 +69,8 @@ Parameters: binary: (boolean) `True` to use binary multiples of bytes (base-2) for ambiguous unit symbols and names, `False` to use decimal multiples of bytes (base-10). - posix_mode: Treat one-letter units (k, m, g, etc.) as binary. + posix_mode: (boolean) Treat one-letter units (k, m, g, etc.) as + binary. decimal_bias: (boolean) `True` to treat slightly ambiguous two- letter unit symbols ending in "i" (e.g. Ki, Gi) to use decimal multiples of bytes (base-10). `False` diff --git a/jc/parsers/ipconfig.py b/jc/parsers/ipconfig.py index 25ba615f..c63c1fbe 100644 --- a/jc/parsers/ipconfig.py +++ b/jc/parsers/ipconfig.py @@ -1,10 +1,10 @@ r"""jc - JSON Convert `ipconfig` command output parser - Usage (cli): $ ipconfig /all | jc --ipconfig $ ipconfig | jc --ipconfig + $ jc ipconfig /all Usage (module): @@ -85,12 +85,15 @@ Schema: } Notes: - [0] - 'lease_expires' and 'lease_obtained' are parsed to ISO8601 format date strings. if the value was unable - to be parsed by datetime, the fields will be in their raw form - [1] - 'autoconfigured' under 'ipv4_address' is only providing indication if the ipv4 address was labeled as - "Autoconfiguration IPv4 Address" vs "IPv4 Address". It does not infer any information from other fields - [2] - Windows XP uses 'IP Address' instead of 'IPv4 Address'. Both values are parsed to the 'ipv4_address' - object for consistency + [0] - 'lease_expires' and 'lease_obtained' are parsed to ISO8601 + format date strings. if the value was unable to be parsed by + datetime, the fields will be in their raw form + [1] - 'autoconfigured' under 'ipv4_address' is only providing + indication if the ipv4 address was labeled as "Autoconfiguration + IPv4 Address" vs "IPv4 Address". It does not infer any + information from other fields + [2] - Windows XP uses 'IP Address' instead of 'IPv4 Address'. Both + values are parsed to the 'ipv4_address' object for consistency Examples: @@ -420,8 +423,7 @@ Examples: } ], "extras": [] - } - + } """ from datetime import datetime import re @@ -466,6 +468,7 @@ def parse(data, raw=False, quiet=False): return raw_output if raw else _process(raw_output) + def _process_ipv6_address(ip_address): address_split = ip_address["address"].split('%') try: @@ -484,6 +487,7 @@ def _process_ipv6_address(ip_address): "status": ip_address["status"] } + def _process_ipv4_address(ip_address): autoconfigured = True if ip_address.get("autoconfigured","") is not None and 'autoconfigured' in ip_address.get("autoconfigured","") else False subnet_mask = ip_address["subnet_mask"] @@ -494,6 +498,7 @@ def _process_ipv4_address(ip_address): "autoconfigured": autoconfigured } + def _process(proc_data): """ Final processing to conform to the schema. @@ -507,8 +512,7 @@ def _process(proc_data): Processed Dictionary. Structured data to conform to the schema. """ processed = proc_data - - + if "ip_routing_enabled" in processed and processed["ip_routing_enabled"] is not None: processed["ip_routing_enabled"] = (processed["ip_routing_enabled"].lower() == "yes") @@ -518,38 +522,49 @@ def _process(proc_data): for adapter in processed["adapters"]: if "dhcp_enabled" in adapter and adapter["dhcp_enabled"] is not None: adapter["dhcp_enabled"] = (adapter["dhcp_enabled"].lower() == "yes") + if "autoconfiguration_enabled" in adapter and adapter["autoconfiguration_enabled"] is not None: adapter["autoconfiguration_enabled"] = (adapter["autoconfiguration_enabled"].lower() == "yes") + if "netbios_over_tcpip" in adapter and adapter["netbios_over_tcpip"] is not None: adapter["netbios_over_tcpip"] = (adapter["netbios_over_tcpip"].lower() == "enabled") + if "lease_expires" in adapter and adapter["lease_expires"] is not None and adapter["lease_expires"] != "": try: adapter["lease_expires"] = datetime.strptime(adapter["lease_expires"], "%A, %B %d, %Y %I:%M:%S %p").isoformat() except: pass # Leave date in raw format if not parseable + if "lease_obtained" in adapter and adapter["lease_obtained"] is not None and adapter["lease_obtained"] != "": try: adapter["lease_obtained"] = datetime.strptime(adapter["lease_obtained"], "%A, %B %d, %Y %I:%M:%S %p").isoformat() except: pass # Leave date in raw format if not parseable + adapter["link_local_ipv6_addresses"] = [_process_ipv6_address(address) for address in adapter.get("link_local_ipv6_addresses", [])] adapter["ipv4_addresses"] = [_process_ipv4_address(address) for address in adapter.get("ipv4_addresses", [])] + return processed + class _PushbackIterator: def __init__(self, iterator): self.iterator = iterator self.pushback_stack = [] + def __iter__(self): return self + def __next__(self): if self.pushback_stack: return self.pushback_stack.pop() else: return next(self.iterator) + def pushback(self, value): self.pushback_stack.append(value) + def _parse(data): # Initialize the parsed output dictionary with all fields set to None or empty lists parse_output = { @@ -609,10 +624,12 @@ def _parse(data): return parse_output + def _is_adapter_start_line(line): # Detect adapter start lines, e.g., "Ethernet adapter Ethernet:" return re.match(r"^[^\s].*adapter.*:", line, re.IGNORECASE) + def _initialize_adapter(adapter_name): adapter_name_split = adapter_name.split(" adapter ", 1) if len(adapter_name_split) > 1: @@ -650,6 +667,7 @@ def _initialize_adapter(adapter_name): "extras": [] # To store unrecognized fields } + def _parse_line(line): # Split the line into key and value using ':' or multiple spaces key_value = re.split(r":", line.strip(), 1) @@ -662,6 +680,7 @@ def _parse_line(line): else: return None, None + def _parse_header_line(result, key, value, line_iter): if key in ["host_name", "primary_dns_suffix", "node_type", "ip_routing_enabled", "wins_proxy_enabled"]: result[key] = value @@ -674,11 +693,13 @@ def _parse_header_line(result, key, value, line_iter): # Store unrecognized fields in extras result["extras"].append({key: value}) + def _parse_adapter_line(adapter, key, value, line_iter): if key in ["connection_specific_dns_suffix","media_state", "description", "physical_address", "dhcp_enabled", "autoconfiguration_enabled", "dhcpv6_iaid", "dhcpv6_client_duid", "netbios_over_tcpip", "dhcp_server", "lease_obtained", "lease_expires", "primary_wins_server"]: adapter[key] = value + elif key in ["ipv6_address", "temporary_ipv6_address", "link_local_ipv6_address"]: address_dict = _parse_ipv6_address(value) if key == "ipv6_address": @@ -687,32 +708,39 @@ def _parse_adapter_line(adapter, key, value, line_iter): adapter["temporary_ipv6_addresses"].append(address_dict) elif key == "link_local_ipv6_address": adapter["link_local_ipv6_addresses"].append(address_dict) + elif key in ["ipv4_address", "autoconfiguration_ipv4_address", "ip_address", "autoconfiguration_ip_address"]: ipv4_address_dict = _parse_ipv4_address(value, key, line_iter) adapter["ipv4_addresses"].append(ipv4_address_dict) + elif key == "connection_specific_dns_suffix_search_list": if value: adapter["connection_specific_dns_suffix_search_list"].append(value) # Process additional connection specific dns suffix search list entries _parse_additional_entries(adapter["connection_specific_dns_suffix_search_list"], line_iter) + elif key == "default_gateway": if value: adapter["default_gateways"].append(value) # Process additional gateways _parse_additional_entries(adapter["default_gateways"], line_iter) + elif key == "dns_servers": if value: adapter["dns_servers"].append(value) # Process additional DNS servers _parse_additional_entries(adapter["dns_servers"], line_iter) + elif key == "subnet_mask": # Subnet Mask should be associated with the last IPv4 address if adapter["ipv4_addresses"]: adapter["ipv4_addresses"][-1]["subnet_mask"] = value + else: # Store unrecognized fields in extras adapter["extras"].append({key: value}) + def _parse_ipv6_address(value): # Handle multiple status indicators match = re.match(r"([^\(]+)\((.*)\)", value) if value else None @@ -727,6 +755,7 @@ def _parse_ipv6_address(value): "status": status } + def _parse_ipv4_address(value, key, line_iter): # Handle autoconfigured status match = re.match(r"([^\(]+)\((.*)\)", value) if value else None @@ -758,6 +787,7 @@ def _parse_ipv4_address(value, key, line_iter): "status": status } + def _parse_additional_entries(entry_list, line_iter): # Process additional lines that belong to the current entry (e.g., additional DNS servers, DNS Suffix Search List) while True: @@ -775,4 +805,4 @@ def _parse_additional_entries(entry_list, line_iter): line_iter.pushback(next_line) break except StopIteration: - break \ No newline at end of file + break diff --git a/man/jc.1 b/man/jc.1 index 9049d40d..722cc7f8 100644 --- a/man/jc.1 +++ b/man/jc.1 @@ -1,4 +1,4 @@ -.TH jc 1 2024-09-22 1.25.4 "JSON Convert" +.TH jc 1 2024-10-18 1.25.4 "JSON Convert" .SH NAME \fBjc\fP \- JSON Convert JSONifies the output of many CLI tools, file-types, and strings @@ -347,6 +347,11 @@ INI with duplicate key file parser \fB--ip-address\fP IPv4 and IPv6 Address string parser +.TP +.B +\fB--ipconfig\fP +`ipconfig` command parser + .TP .B \fB--iptables\fP @@ -507,11 +512,6 @@ openvpn-status.log file parser \fB--os-release\fP `/etc/os-release` file parser -.TP -.B -\fB--pacman\fP -`pacman` command parser - .TP .B \fB--passwd\fP