diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml
index 7d6ae2c3..bdcfae72 100644
--- a/.github/workflows/pythonapp.yml
+++ b/.github/workflows/pythonapp.yml
@@ -14,12 +14,12 @@ jobs:
strategy:
matrix:
os: [macos-latest, ubuntu-20.04, windows-latest]
- python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11"]
+ python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v3
- name: "Set up timezone to America/Los_Angeles"
- uses: szenius/set-timezone@v1.0
+ uses: szenius/set-timezone@v1.2
with:
timezoneLinux: "America/Los_Angeles"
timezoneMacos: "America/Los_Angeles"
diff --git a/.gitignore b/.gitignore
index 3732a1e5..878b8e5c 100755
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ build/
.github/
.vscode/
_config.yml
+.venv
diff --git a/CHANGELOG b/CHANGELOG
index 1d64ef46..8816f8b3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,23 @@
jc changelog
+20231216 v1.24.0
+- Add `debconf-show` command parser
+- Add `iftop` command parser
+- Add `pkg-index-apk` parser for Alpine Linux Package Index files
+- Add `pkg-index-deb` parser for Debian/Ubuntu Package Index files
+- Add `proc-cmdline` parser for `/proc/cmdline` file
+- Add `swapon` command parser
+- Add `tune2fs` command parser
+- Remove `iso-datetime` parser deprecated since v1.22.1. (use `datetime-iso` instead)
+- Update timezone change in Github Actions for node v16 requirement
+- Add Python 3.12 tests to Github Actions
+- Refactor `acpi` command parser for code cleanup
+- Refactor vendored libraries to remove Python 2 support
+- Fix `iptables` parser for cases where the `target` field is blank in a rule
+- Fix `vmstat` parsers for some cases where wide output is used
+- Fix `mount` parser for cases with spaces in the mount point name
+- Fix `xrandr` parser for infinite loop issues
+
20231023 v1.23.6
- Fix XML parser for xmltodict library versions < 0.13.0
- Fix `who` command parser for cases when the from field contains spaces
diff --git a/README.md b/README.md
index ffe0b816..147c10f7 100644
--- a/README.md
+++ b/README.md
@@ -120,6 +120,7 @@ pip3 install jc
| NixOS linux | `nix-env -iA nixpkgs.jc` or `nix-env -iA nixos.jc` |
| Guix System linux | `guix install jc` |
| Gentoo Linux | `emerge dev-python/jc` |
+| Photon linux | `tdnf install jc` |
| macOS | `brew install jc` |
| FreeBSD | `portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean` |
| Ansible filter plugin | `ansible-galaxy collection install community.general` |
@@ -178,6 +179,7 @@ option.
| `--csv-s` | CSV file streaming parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/csv_s) |
| `--date` | `date` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/date) |
| `--datetime-iso` | ISO 8601 Datetime string parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/datetime_iso) |
+| `--debconf-show` | `debconf-show` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/debconf_show) |
| `--df` | `df` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/df) |
| `--dig` | `dig` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/dig) |
| `--dir` | `dir` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/dir) |
@@ -250,6 +252,8 @@ option.
| `--ping-s` | `ping` and `ping6` command streaming parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ping_s) |
| `--pip-list` | `pip list` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/pip_list) |
| `--pip-show` | `pip show` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/pip_show) |
+| `--pkg-index-apk` | Alpine Linux Package Index file parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/pkg_index_apk) |
+| `--pkg-index-deb` | Debian Package Index file parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/pkg_index_deb) |
| `--plist` | PLIST file parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/plist) |
| `--postconf` | `postconf -M` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/postconf) |
| `--proc` | `/proc/` file parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/proc) |
@@ -268,6 +272,7 @@ option.
| `--sshd-conf` | `sshd` config file and `sshd -T` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/sshd_conf) |
| `--stat` | `stat` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/stat) |
| `--stat-s` | `stat` command streaming parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/stat_s) |
+| `--swapon` | `swapon` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/swapon) |
| `--sysctl` | `sysctl` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/sysctl) |
| `--syslog` | Syslog RFC 5424 string parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/syslog) |
| `--syslog-s` | Syslog RFC 5424 string streaming parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/syslog_s) |
@@ -286,6 +291,7 @@ option.
| `--top-s` | `top -b` command streaming parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/top_s) |
| `--tracepath` | `tracepath` and `tracepath6` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/tracepath) |
| `--traceroute` | `traceroute` and `traceroute6` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/traceroute) |
+| `--tune2fs` | `tune2fs -l` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/tune2fs) |
| `--udevadm` | `udevadm info` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/udevadm) |
| `--ufw` | `ufw status` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ufw) |
| `--ufw-appinfo` | `ufw app info [application]` command parser | [details](https://kellyjonbrazil.github.io/jc/docs/parsers/ufw_appinfo) |
diff --git a/completions/jc_bash_completion.sh b/completions/jc_bash_completion.sh
index 35ab01d0..70bbb6a3 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 arp blkid bluetoothctl cbt certbot chage cksum crontab date df dig dmidecode dpkg du env 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 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 sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool)
- jc_parsers=(--acpi --airport --airport-s --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --plist --postconf --proc --proc-buddyinfo --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 --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 --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 arp blkid bluetoothctl cbt certbot chage cksum crontab date debconf-show df dig dmidecode dpkg du env 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 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 --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --debconf-show --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --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 --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 eedc3453..071f2373 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 arp blkid bluetoothctl cbt certbot chage cksum crontab date df dig dmidecode dpkg du env 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 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 sysctl systemctl systeminfo timedatectl top tracepath tracepath6 traceroute traceroute6 udevadm ufw uname update-alternatives upower uptime vdir veracrypt vmstat w wc who xrandr zipinfo zpool)
+ jc_commands=(acpi airport arp blkid bluetoothctl cbt certbot chage cksum crontab date debconf-show df dig dmidecode dpkg du env 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 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.'
@@ -22,6 +22,7 @@ _jc() {
'cksum:run "cksum" command with magic syntax.'
'crontab:run "crontab" command with magic syntax.'
'date:run "date" command with magic syntax.'
+ 'debconf-show:run "debconf-show" command with magic syntax.'
'df:run "df" command with magic syntax.'
'dig:run "dig" command with magic syntax.'
'dmidecode:run "dmidecode" command with magic syntax.'
@@ -87,6 +88,7 @@ _jc() {
'sshd:run "sshd" command with magic syntax.'
'stat:run "stat" command with magic syntax.'
'sum:run "sum" command with magic syntax.'
+ 'swapon:run "swapon" command with magic syntax.'
'sysctl:run "sysctl" command with magic syntax.'
'systemctl:run "systemctl" command with magic syntax.'
'systeminfo:run "systeminfo" command with magic syntax.'
@@ -96,6 +98,7 @@ _jc() {
'tracepath6:run "tracepath6" command with magic syntax.'
'traceroute:run "traceroute" command with magic syntax.'
'traceroute6:run "traceroute6" command with magic syntax.'
+ 'tune2fs:run "tune2fs" command with magic syntax.'
'udevadm:run "udevadm" command with magic syntax.'
'ufw:run "ufw" command with magic syntax.'
'uname:run "uname" command with magic syntax.'
@@ -112,7 +115,7 @@ _jc() {
'zipinfo:run "zipinfo" command with magic syntax.'
'zpool:run "zpool" command with magic syntax.'
)
- jc_parsers=(--acpi --airport --airport-s --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --pci-ids --pgpass --pidstat --pidstat-s --ping --ping-s --pip-list --pip-show --plist --postconf --proc --proc-buddyinfo --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 --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 --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 --arp --asciitable --asciitable-m --blkid --bluetoothctl --cbt --cef --cef-s --certbot --chage --cksum --clf --clf-s --crontab --crontab-u --csv --csv-s --date --datetime-iso --debconf-show --df --dig --dir --dmidecode --dpkg-l --du --email-address --env --file --find --findmnt --finger --free --fstab --git-log --git-log-s --git-ls-remote --gpg --group --gshadow --hash --hashsum --hciconfig --history --host --hosts --id --ifconfig --ini --ini-dup --iostat --iostat-s --ip-address --iptables --ip-route --iw-scan --iwconfig --jar-manifest --jobs --jwt --kv --last --ls --ls-s --lsattr --lsb-release --lsblk --lsmod --lsof --lspci --lsusb --m3u --mdadm --mount --mpstat --mpstat-s --netstat --nmcli --nsd-control --ntpq --openvpn --os-prober --os-release --passwd --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'
@@ -136,6 +139,7 @@ _jc() {
'--csv-s:CSV file streaming parser'
'--date:`date` command parser'
'--datetime-iso:ISO 8601 Datetime string parser'
+ '--debconf-show:`debconf-show` command parser'
'--df:`df` command parser'
'--dig:`dig` command parser'
'--dir:`dir` command parser'
@@ -208,10 +212,13 @@ _jc() {
'--ping-s:`ping` and `ping6` command streaming parser'
'--pip-list:`pip list` command parser'
'--pip-show:`pip show` command parser'
+ '--pkg-index-apk:Alpine Linux Package Index file parser'
+ '--pkg-index-deb:Debian Package Index file parser'
'--plist:PLIST file parser'
'--postconf:`postconf -M` command parser'
'--proc:`/proc/` file parser'
'--proc-buddyinfo:`/proc/buddyinfo` file parser'
+ '--proc-cmdline:`/proc/cmdline` file parser'
'--proc-consoles:`/proc/consoles` file parser'
'--proc-cpuinfo:`/proc/cpuinfo` file parser'
'--proc-crypto:`/proc/crypto` file parser'
@@ -276,6 +283,7 @@ _jc() {
'--sshd-conf:`sshd` config file and `sshd -T` command parser'
'--stat:`stat` command parser'
'--stat-s:`stat` command streaming parser'
+ '--swapon:`swapon` command parser'
'--sysctl:`sysctl` command parser'
'--syslog:Syslog RFC 5424 string parser'
'--syslog-s:Syslog RFC 5424 string streaming parser'
@@ -294,6 +302,7 @@ _jc() {
'--top-s:`top -b` command streaming parser'
'--tracepath:`tracepath` and `tracepath6` command parser'
'--traceroute:`traceroute` and `traceroute6` command parser'
+ '--tune2fs:`tune2fs -l` command parser'
'--udevadm:`udevadm info` command parser'
'--ufw:`ufw status` command parser'
'--ufw-appinfo:`ufw app info [application]` command parser'
diff --git a/docs/parsers/acpi.md b/docs/parsers/acpi.md
index 82d57965..c040cdeb 100644
--- a/docs/parsers/acpi.md
+++ b/docs/parsers/acpi.md
@@ -250,4 +250,4 @@ Returns:
### Parser Information
Compatibility: linux
-Version 1.6 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.7 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/debconf_show.md b/docs/parsers/debconf_show.md
new file mode 100644
index 00000000..8d0bfd51
--- /dev/null
+++ b/docs/parsers/debconf_show.md
@@ -0,0 +1,105 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+
+
+# jc.parsers.debconf\_show
+
+jc - JSON Convert `debconf-show` command output parser
+
+Usage (cli):
+
+ $ debconf-show onlyoffice-documentserver | jc --debconf-show
+
+or
+
+ $ jc debconf-show onlyoffice-documentserver
+
+Usage (module):
+
+ import jc
+ result = jc.parse('debconf_show', debconf_show_command_output)
+
+Schema:
+
+ [
+ {
+ "asked": boolean,
+ "packagename": string,
+ "name": string,
+ "value": string
+ }
+ ]
+
+Examples:
+
+ $ debconf-show onlyoffice-documentserver | jc --debconf-show -p
+ [
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "jwt_secret",
+ "value": "aL8ei2iereuzee7cuJ6Cahjah1ixee2ah"
+ },
+ {
+ "asked": false,
+ "packagename": "onlyoffice",
+ "name": "db_pwd",
+ "value": "(password omitted)"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "rabbitmq_pwd",
+ "value": "(password omitted)"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "db_port",
+ "value": "5432"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "db_user",
+ "value": "onlyoffice"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "rabbitmq_proto",
+ "value": "amqp"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "cluster_mode",
+ "value": "false"
+ }
+ ]
+
+
+
+### parse
+
+```python
+def parse(data: str,
+ raw: bool = False,
+ quiet: bool = False) -> List[JSONDictType]
+```
+
+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:
+
+ List of Dictionaries. Raw or processed structured data.
+
+### Parser Information
+Compatibility: linux
+
+Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/iptables.md b/docs/parsers/iptables.md
index 7c9f7d8f..6fa8a6bf 100644
--- a/docs/parsers/iptables.md
+++ b/docs/parsers/iptables.md
@@ -30,7 +30,7 @@ Schema:
"num" integer,
"pkts": integer,
"bytes": integer, # converted based on suffix
- "target": string,
+ "target": string, # Null if blank
"prot": string,
"opt": string, # "--" = Null
"in": string,
@@ -186,4 +186,4 @@ Returns:
### Parser Information
Compatibility: linux
-Version 1.8 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.9 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/iso_datetime.md b/docs/parsers/iso_datetime.md
deleted file mode 100644
index b26ee730..00000000
--- a/docs/parsers/iso_datetime.md
+++ /dev/null
@@ -1,37 +0,0 @@
-[Home](https://kellyjonbrazil.github.io/jc/)
-
-
-# jc.parsers.iso\_datetime
-
-jc - JSON Convert ISO 8601 Datetime string parser
-
-This parser has been renamed to datetime-iso (cli) or datetime_iso (module).
-
-This parser will be removed in a future version, so please start using
-the new parser name.
-
-
-
-### parse
-
-```python
-def parse(data, raw=False, quiet=False)
-```
-
-This parser is deprecated and calls datetime_iso. Please use datetime_iso
-directly. This parser will be removed in the future.
-
-Parameters:
-
- data: (string) text data to parse
- raw: (boolean) unprocessed output if True
- quiet: (boolean) suppress warning messages if True
-
-Returns:
-
- Dictionary. Raw or processed structured data.
-
-### Parser Information
-Compatibility: linux, aix, freebsd, darwin, win32, cygwin
-
-Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/mount.md b/docs/parsers/mount.md
index 04e355b0..756bc795 100644
--- a/docs/parsers/mount.md
+++ b/docs/parsers/mount.md
@@ -98,4 +98,4 @@ Returns:
### Parser Information
Compatibility: linux, darwin, freebsd, aix
-Version 1.8 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.9 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/pkg_index_apk.md b/docs/parsers/pkg_index_apk.md
new file mode 100644
index 00000000..8743e03d
--- /dev/null
+++ b/docs/parsers/pkg_index_apk.md
@@ -0,0 +1,126 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+
+
+# jc.parsers.pkg\_index\_apk
+
+jc - JSON Convert Alpine Linux Package Index files
+
+Usage (cli):
+
+ $ cat APKINDEX | jc --pkg-index-apk
+
+Usage (module):
+
+ import jc
+ result = jc.parse('pkg_index_apk', pkg_index_apk_output)
+
+Schema:
+
+ [
+ {
+ "checksum": string,
+ "package": string,
+ "version": string,
+ "architecture": string,
+ "package_size": integer,
+ "installed_size": integer,
+ "description": string,
+ "url": string,
+ "license": string,
+ "origin": string,
+ "maintainer": {
+ "name": string,
+ "email": string,
+ },
+ "build_time": integer,
+ "commit": string,
+ "provider_priority": string,
+ "dependencies": [
+ string
+ ],
+ "provides": [
+ string
+ ],
+ "install_if": [
+ string
+ ],
+ }
+ ]
+
+Example:
+
+ $ cat APKINDEX | jc --pkg-index-apk
+ [
+ {
+ "checksum": "Q1znBl9k+RKgY6gl5Eg3iz73KZbLY=",
+ "package": "yasm",
+ "version": "1.3.0-r4",
+ "architecture": "x86_64",
+ "package_size": 772109,
+ "installed_size": 1753088,
+ "description": "A rewrite of NASM to allow for multiple synta...",
+ "url": "http://www.tortall.net/projects/yasm/",
+ "license": "BSD-2-Clause",
+ "origin": "yasm",
+ "maintainer": {
+ "name": "Natanael Copa",
+ "email": "ncopa@alpinelinux.org"
+ },
+ "build_time": 1681228881,
+ "commit": "84a227baf001b6e0208e3352b294e4d7a40e93de",
+ "dependencies": [
+ "so:libc.musl-x86_64.so.1"
+ ],
+ "provides": [
+ "cmd:vsyasm=1.3.0-r4",
+ "cmd:yasm=1.3.0-r4",
+ "cmd:ytasm=1.3.0-r4"
+ ]
+ }
+ ]
+
+ $ cat APKINDEX | jc --pkg-index-apk --raw
+ [
+ {
+ "C": "Q1znBl9k+RKgY6gl5Eg3iz73KZbLY=",
+ "P": "yasm",
+ "V": "1.3.0-r4",
+ "A": "x86_64",
+ "S": "772109",
+ "I": "1753088",
+ "T": "A rewrite of NASM to allow for multiple syntax supported...",
+ "U": "http://www.tortall.net/projects/yasm/",
+ "L": "BSD-2-Clause",
+ "o": "yasm",
+ "m": "Natanael Copa ",
+ "t": "1681228881",
+ "c": "84a227baf001b6e0208e3352b294e4d7a40e93de",
+ "D": "so:libc.musl-x86_64.so.1",
+ "p": "cmd:vsyasm=1.3.0-r4 cmd:yasm=1.3.0-r4 cmd:ytasm=1.3.0-r4"
+ },
+ ]
+
+
+
+### parse
+
+```python
+def parse(data: str, raw: bool = False, quiet: bool = False) -> List[Dict]
+```
+
+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:
+
+ List of Dictionaries. Raw or processed structured data.
+
+### Parser Information
+Compatibility: linux, darwin, cygwin, win32, aix, freebsd
+
+Version 1.0 by Roey Darwish Dror (roey.ghost@gmail.com)
diff --git a/docs/parsers/pkg_index_deb.md b/docs/parsers/pkg_index_deb.md
new file mode 100644
index 00000000..f5cbeeac
--- /dev/null
+++ b/docs/parsers/pkg_index_deb.md
@@ -0,0 +1,138 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+
+
+# jc.parsers.pkg\_index\_deb
+
+jc - JSON Convert Debian Package Index file parser
+
+Usage (cli):
+
+ $ cat Packages | jc --pkg-index-deb
+
+Usage (module):
+
+ import jc
+ result = jc.parse('pkg_index_deb', pkg_index_deb_output)
+
+Schema:
+
+ [
+ {
+ "package": string,
+ "version": string,
+ "architecture": string,
+ "section": string,
+ "priority": string,
+ "installed_size": integer,
+ "maintainer": string,
+ "description": string,
+ "homepage": string,
+ "depends": string,
+ "conflicts": string,
+ "replaces": string,
+ "vcs_git": string,
+ "sha256": string,
+ "size": integer,
+ "vcs_git": string,
+ "filename": string
+ }
+ ]
+
+Examples:
+
+ $ cat Packages | jc --pkg-index-deb
+ [
+ {
+ "package": "aspnetcore-runtime-2.1",
+ "version": "2.1.22-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "standard",
+ "installed_size": 71081,
+ "maintainer": "Microsoft ",
+ "description": "Microsoft ASP.NET Core 2.1.22 Shared Framework",
+ "homepage": "https://www.asp.net/",
+ "depends": "libc6 (>= 2.14), dotnet-runtime-2.1 (>= 2.1.22)",
+ "sha256": "48d4e78a7ceff34105411172f4c3e91a0359b3929d84d26a493...",
+ "size": 21937036,
+ "filename": "pool/main/a/aspnetcore-runtime-2.1/aspnetcore-run..."
+ },
+ {
+ "package": "azure-functions-core-tools-4",
+ "version": "4.0.4590-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "optional",
+ "maintainer": "Ahmed ElSayed ",
+ "description": "Azure Function Core Tools v4",
+ "homepage": "https://docs.microsoft.com/en-us/azure/azure-func...",
+ "conflicts": "azure-functions-core-tools-2, azure-functions-co...",
+ "replaces": "azure-functions-core-tools-2, azure-functions-cor...",
+ "vcs_git": "https://github.com/Azure/azure-functions-core-tool...",
+ "sha256": "a2a4f99d6d98ba0a46832570285552f2a93bab06cebbda2afc7...",
+ "size": 124417844,
+ "filename": "pool/main/a/azure-functions-core-tools-4/azure-fu..."
+ }
+ ]
+
+ $ cat Packages | jc --pkg-index-deb -r
+ [
+ {
+ "package": "aspnetcore-runtime-2.1",
+ "version": "2.1.22-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "standard",
+ "installed_size": "71081",
+ "maintainer": "Microsoft ",
+ "description": "Microsoft ASP.NET Core 2.1.22 Shared Framework",
+ "homepage": "https://www.asp.net/",
+ "depends": "libc6 (>= 2.14), dotnet-runtime-2.1 (>= 2.1.22)",
+ "sha256": "48d4e78a7ceff34105411172f4c3e91a0359b3929d84d26a493...",
+ "size": "21937036",
+ "filename": "pool/main/a/aspnetcore-runtime-2.1/aspnetcore-run..."
+ },
+ {
+ "package": "azure-functions-core-tools-4",
+ "version": "4.0.4590-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "optional",
+ "maintainer": "Ahmed ElSayed ",
+ "description": "Azure Function Core Tools v4",
+ "homepage": "https://docs.microsoft.com/en-us/azure/azure-func...",
+ "conflicts": "azure-functions-core-tools-2, azure-functions-co...",
+ "replaces": "azure-functions-core-tools-2, azure-functions-cor...",
+ "vcs_git": "https://github.com/Azure/azure-functions-core-tool...",
+ "sha256": "a2a4f99d6d98ba0a46832570285552f2a93bab06cebbda2afc7...",
+ "size": "124417844",
+ "filename": "pool/main/a/azure-functions-core-tools-4/azure-fu..."
+ }
+ ]
+
+
+
+### parse
+
+```python
+def parse(data: str,
+ raw: bool = False,
+ quiet: bool = False) -> List[JSONDictType]
+```
+
+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:
+
+ List of Dictionaries. Raw or processed structured data.
+
+### Parser Information
+Compatibility: linux, darwin, cygwin, win32, aix, freebsd
+
+Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/proc.md b/docs/parsers/proc.md
index f54e2436..8b04bf33 100644
--- a/docs/parsers/proc.md
+++ b/docs/parsers/proc.md
@@ -139,4 +139,4 @@ Returns:
### Parser Information
Compatibility: linux
-Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/proc_cmdline.md b/docs/parsers/proc_cmdline.md
new file mode 100644
index 00000000..221dba5a
--- /dev/null
+++ b/docs/parsers/proc_cmdline.md
@@ -0,0 +1,92 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+
+
+# jc.parsers.proc\_cmdline
+
+jc - JSON Convert `/proc/cmdline` file parser
+
+Usage (cli):
+
+ $ cat /proc/cmdline | jc --proc
+
+or
+
+ $ jc /proc/cmdline
+
+or
+
+ $ cat /proc/cmdline | jc --proc-cmdline
+
+Usage (module):
+
+ import jc
+ result = jc.parse('proc_cmdline', proc_cmdline_file)
+
+Schema:
+
+ {
+ "": string,
+ "_options": [
+ string
+ ]
+ }
+
+Examples:
+
+ $ cat /proc/cmdline | jc --proc -p
+ {
+ "BOOT_IMAGE": "clonezilla/live/vmlinuz",
+ "consoleblank": "0",
+ "keyboard-options": "grp:ctrl_shift_toggle,lctrl_shift_toggle",
+ "ethdevice-timeout": "130",
+ "toram": "filesystem.squashfs",
+ "boot": "live",
+ "edd": "on",
+ "ocs_daemonon": "ssh lighttpd",
+ "ocs_live_run": "sudo screen /usr/sbin/ocs-sr -g auto -e1 auto -e2 -batch -r -j2 -k -scr -p true restoreparts win7-64 sda1",
+ "ocs_live_extra_param": "",
+ "keyboard-layouts": "us,ru",
+ "ocs_live_batch": "no",
+ "locales": "ru_RU.UTF-8",
+ "vga": "788",
+ "net.ifnames": "0",
+ "union": "overlay",
+ "fetch": "http://10.1.1.1/tftpboot/clonezilla/live/filesystem.squashfs",
+ "ocs_postrun99": "sudo reboot",
+ "initrd": "clonezilla/live/initrd.img",
+ "_options": [
+ "config",
+ "noswap",
+ "nolocales",
+ "nomodeset",
+ "noprompt",
+ "nosplash",
+ "nodmraid",
+ "components"
+ ]
+ }
+
+
+
+### parse
+
+```python
+def parse(data: str, raw: bool = False, quiet: bool = False) -> JSONDictType
+```
+
+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:
+
+ Dictionary. Raw or processed structured data.
+
+### Parser Information
+Compatibility: linux
+
+Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/rpm_qi.md b/docs/parsers/rpm_qi.md
index a2ec798a..bca0436d 100644
--- a/docs/parsers/rpm_qi.md
+++ b/docs/parsers/rpm_qi.md
@@ -184,4 +184,4 @@ Returns:
### Parser Information
Compatibility: linux
-Version 1.6 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.7 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/swapon.md b/docs/parsers/swapon.md
new file mode 100644
index 00000000..d7691c05
--- /dev/null
+++ b/docs/parsers/swapon.md
@@ -0,0 +1,69 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+
+
+# jc.parsers.swapon
+
+jc - JSON Convert `swapon` command output parser
+
+Usage (cli):
+
+ $ swapon | jc --swapon
+
+or
+
+ $ jc swapon
+
+Usage (module):
+
+ import jc
+ result = jc.parse('swapon', swapon_command_output)
+
+Schema:
+
+ [
+ {
+ "name": string,
+ "type": string,
+ "size": integer,
+ "used": integer,
+ "priority": integer
+ }
+ ]
+
+Example:
+
+ $ swapon | jc --swapon
+ [
+ {
+ "name": "/swapfile",
+ "type": "file",
+ "size": 1073741824,
+ "used": 0,
+ "priority": -2
+ }
+ ]
+
+
+
+### parse
+
+```python
+def parse(data: str, raw: bool = False, quiet: bool = False) -> List[_Entry]
+```
+
+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:
+
+ Dictionary. Raw or processed structured data.
+
+### Parser Information
+Compatibility: linux, freebsd
+
+Version 1.0 by Roey Darwish Dror (roey.ghost@gmail.com)
diff --git a/docs/parsers/tune2fs.md b/docs/parsers/tune2fs.md
new file mode 100644
index 00000000..732c5edb
--- /dev/null
+++ b/docs/parsers/tune2fs.md
@@ -0,0 +1,235 @@
+[Home](https://kellyjonbrazil.github.io/jc/)
+
+
+# jc.parsers.tune2fs
+
+jc - JSON Convert `tune2fs -l` command output parser
+
+Usage (cli):
+
+ $ tune2fs -l /dev/xvda4 | jc --tune2fs
+
+or
+
+ $ jc tune2fs -l /dev/xvda4
+
+Usage (module):
+
+ import jc
+ result = jc.parse('tune2fs', tune2fs_command_output)
+
+Schema:
+
+ {
+ "version": string,
+ "filesystem_volume_name": string,
+ "last_mounted_on": string,
+ "filesystem_uuid": string,
+ "filesystem_magic_number": string,
+ "filesystem_revision_number": string,
+ "filesystem_features": [
+ string
+ ],
+ "filesystem_flags": string,
+ "default_mount_options": string,
+ "filesystem_state": string,
+ "errors_behavior": string,
+ "filesystem_os_type": string,
+ "inode_count": integer,
+ "block_count": integer,
+ "reserved_block_count": integer,
+ "overhead_clusters": integer,
+ "free_blocks": integer,
+ "free_inodes": integer,
+ "first_block": integer,
+ "block_size": integer,
+ "fragment_size": integer,
+ "group_descriptor_size": integer,
+ "reserved_gdt_blocks": integer,
+ "blocks_per_group": integer,
+ "fragments_per_group": integer,
+ "inodes_per_group": integer,
+ "inode_blocks_per_group": integer,
+ "flex_block_group_size": integer,
+ "filesystem_created": string,
+ "filesystem_created_epoch": integer,
+ "filesystem_created_epoch_utc": integer,
+ "last_mount_time": string,
+ "last_mount_time_epoch": integer,
+ "last_mount_time_epoch_utc": integer,
+ "last_write_time": string,
+ "last_write_time_epoch": integer,
+ "last_write_time_epoch_utc": integer,
+ "mount_count": integer,
+ "maximum_mount_count": integer,
+ "last_checked": string,
+ "last_checked_epoch": integer,
+ "last_checked_epoch_utc": integer,
+ "check_interval": string,
+ "lifetime_writes": string,
+ "reserved_blocks_uid": string,
+ "reserved_blocks_gid": string,
+ "first_inode": integer,
+ "inode_size": integer,
+ "required_extra_isize": integer,
+ "desired_extra_isize": integer,
+ "journal_inode": integer,
+ "default_directory_hash": string,
+ "directory_hash_seed": string,
+ "journal_backup": string,
+ "checksum_type": string,
+ "checksum": string
+ }
+
+Examples:
+
+ $ tune2fs | jc --tune2fs -p
+ {
+ "version": "1.46.2 (28-Feb-2021)",
+ "filesystem_volume_name": "",
+ "last_mounted_on": "/home",
+ "filesystem_uuid": "5fb78e1a-b214-44e2-a309-8e35116d8dd6",
+ "filesystem_magic_number": "0xEF53",
+ "filesystem_revision_number": "1 (dynamic)",
+ "filesystem_features": [
+ "has_journal",
+ "ext_attr",
+ "resize_inode",
+ "dir_index",
+ "filetype",
+ "needs_recovery",
+ "extent",
+ "64bit",
+ "flex_bg",
+ "sparse_super",
+ "large_file",
+ "huge_file",
+ "dir_nlink",
+ "extra_isize",
+ "metadata_csum"
+ ],
+ "filesystem_flags": "signed_directory_hash",
+ "default_mount_options": "user_xattr acl",
+ "filesystem_state": "clean",
+ "errors_behavior": "Continue",
+ "filesystem_os_type": "Linux",
+ "inode_count": 3932160,
+ "block_count": 15728640,
+ "reserved_block_count": 786432,
+ "free_blocks": 15198453,
+ "free_inodes": 3864620,
+ "first_block": 0,
+ "block_size": 4096,
+ "fragment_size": 4096,
+ "group_descriptor_size": 64,
+ "reserved_gdt_blocks": 1024,
+ "blocks_per_group": 32768,
+ "fragments_per_group": 32768,
+ "inodes_per_group": 8192,
+ "inode_blocks_per_group": 512,
+ "flex_block_group_size": 16,
+ "filesystem_created": "Mon Apr 6 15:10:37 2020",
+ "last_mount_time": "Mon Sep 19 15:16:20 2022",
+ "last_write_time": "Mon Sep 19 15:16:20 2022",
+ "mount_count": 14,
+ "maximum_mount_count": -1,
+ "last_checked": "Fri Apr 8 15:24:22 2022",
+ "check_interval": "0 ()",
+ "lifetime_writes": "203 GB",
+ "reserved_blocks_uid": "0 (user root)",
+ "reserved_blocks_gid": "0 (group root)",
+ "first_inode": 11,
+ "inode_size": 256,
+ "required_extra_isize": 32,
+ "desired_extra_isize": 32,
+ "journal_inode": 8,
+ "default_directory_hash": "half_md4",
+ "directory_hash_seed": "67d5358d-723d-4ce3-b3c0-30ddb433ad9e",
+ "journal_backup": "inode blocks",
+ "checksum_type": "crc32c",
+ "checksum": "0x7809afff",
+ "filesystem_created_epoch": 1586211037,
+ "filesystem_created_epoch_utc": null,
+ "last_mount_time_epoch": 1663625780,
+ "last_mount_time_epoch_utc": null,
+ "last_write_time_epoch": 1663625780,
+ "last_write_time_epoch_utc": null,
+ "last_checked_epoch": 1649456662,
+ "last_checked_epoch_utc": null
+ }
+
+ $ tune2fs | jc --tune2fs -p -r
+ {
+ "version": "1.46.2 (28-Feb-2021)",
+ "filesystem_volume_name": "",
+ "last_mounted_on": "/home",
+ "filesystem_uuid": "5fb78e1a-b214-44e2-a309-8e35116d8dd6",
+ "filesystem_magic_number": "0xEF53",
+ "filesystem_revision_number": "1 (dynamic)",
+ "filesystem_features": "has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum",
+ "filesystem_flags": "signed_directory_hash",
+ "default_mount_options": "user_xattr acl",
+ "filesystem_state": "clean",
+ "errors_behavior": "Continue",
+ "filesystem_os_type": "Linux",
+ "inode_count": "3932160",
+ "block_count": "15728640",
+ "reserved_block_count": "786432",
+ "free_blocks": "15198453",
+ "free_inodes": "3864620",
+ "first_block": "0",
+ "block_size": "4096",
+ "fragment_size": "4096",
+ "group_descriptor_size": "64",
+ "reserved_gdt_blocks": "1024",
+ "blocks_per_group": "32768",
+ "fragments_per_group": "32768",
+ "inodes_per_group": "8192",
+ "inode_blocks_per_group": "512",
+ "flex_block_group_size": "16",
+ "filesystem_created": "Mon Apr 6 15:10:37 2020",
+ "last_mount_time": "Mon Sep 19 15:16:20 2022",
+ "last_write_time": "Mon Sep 19 15:16:20 2022",
+ "mount_count": "14",
+ "maximum_mount_count": "-1",
+ "last_checked": "Fri Apr 8 15:24:22 2022",
+ "check_interval": "0 ()",
+ "lifetime_writes": "203 GB",
+ "reserved_blocks_uid": "0 (user root)",
+ "reserved_blocks_gid": "0 (group root)",
+ "first_inode": "11",
+ "inode_size": "256",
+ "required_extra_isize": "32",
+ "desired_extra_isize": "32",
+ "journal_inode": "8",
+ "default_directory_hash": "half_md4",
+ "directory_hash_seed": "67d5358d-723d-4ce3-b3c0-30ddb433ad9e",
+ "journal_backup": "inode blocks",
+ "checksum_type": "crc32c",
+ "checksum": "0x7809afff"
+ }
+
+
+
+### parse
+
+```python
+def parse(data: str, raw: bool = False, quiet: bool = False) -> JSONDictType
+```
+
+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:
+
+ Dictionary. Raw or processed structured data.
+
+### Parser Information
+Compatibility: linux
+
+Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/vmstat.md b/docs/parsers/vmstat.md
index 9cb361b1..58113f67 100644
--- a/docs/parsers/vmstat.md
+++ b/docs/parsers/vmstat.md
@@ -149,4 +149,4 @@ Returns:
### Parser Information
Compatibility: linux
-Version 1.3 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.4 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/vmstat_s.md b/docs/parsers/vmstat_s.md
index e443d457..96b318b1 100644
--- a/docs/parsers/vmstat_s.md
+++ b/docs/parsers/vmstat_s.md
@@ -123,4 +123,4 @@ Returns:
### Parser Information
Compatibility: linux
-Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)
+Version 1.3 by Kelly Brazil (kellyjonbrazil@gmail.com)
diff --git a/docs/parsers/xrandr.md b/docs/parsers/xrandr.md
index 63ebbeec..e7c572c6 100644
--- a/docs/parsers/xrandr.md
+++ b/docs/parsers/xrandr.md
@@ -31,22 +31,24 @@ Schema:
"current_height": integer,
"maximum_width": integer,
"maximum_height": integer,
- "devices": {
- "modes": [
- {
- "resolution_width": integer,
- "resolution_height": integer,
- "is_high_resolution": boolean,
- "frequencies": [
- {
- "frequency": float,
- "is_current": boolean,
- "is_preferred": boolean
- }
- ]
- }
- ]
- },
+ "devices": [
+ {
+ "modes": [
+ {
+ "resolution_width": integer,
+ "resolution_height": integer,
+ "is_high_resolution": boolean,
+ "frequencies": [
+ {
+ "frequency": float,
+ "is_current": boolean,
+ "is_preferred": boolean
+ }
+ ]
+ }
+ ]
+ }
+ ],
"is_connected": boolean,
"is_primary": boolean,
"device_name": string,
@@ -62,7 +64,7 @@ Schema:
"rotation": string,
"reflection": string
}
- ],
+ ]
}
Examples:
@@ -78,50 +80,52 @@ Examples:
"current_height": 1080,
"maximum_width": 32767,
"maximum_height": 32767,
- "devices": {
- "modes": [
- {
- "resolution_width": 1920,
- "resolution_height": 1080,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 60.03,
- "is_current": true,
- "is_preferred": true
- },
- {
- "frequency": 59.93,
- "is_current": false,
- "is_preferred": false
- }
- ]
- },
- {
- "resolution_width": 1680,
- "resolution_height": 1050,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 59.88,
- "is_current": false,
- "is_preferred": false
- }
- ]
- }
- ],
- "is_connected": true,
- "is_primary": true,
- "device_name": "eDP1",
- "resolution_width": 1920,
- "resolution_height": 1080,
- "offset_width": 0,
- "offset_height": 0,
- "dimension_width": 310,
- "dimension_height": 170,
- "rotation": "normal",
- "reflection": "normal"
- }
+ "devices": [
+ {
+ "modes": [
+ {
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 60.03,
+ "is_current": true,
+ "is_preferred": true
+ },
+ {
+ "frequency": 59.93,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ },
+ {
+ "resolution_width": 1680,
+ "resolution_height": 1050,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 59.88,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ }
+ ],
+ "is_connected": true,
+ "is_primary": true,
+ "device_name": "eDP1",
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "offset_width": 0,
+ "offset_height": 0,
+ "dimension_width": 310,
+ "dimension_height": 170,
+ "rotation": "normal",
+ "reflection": "normal"
+ }
+ ]
}
]
}
@@ -137,53 +141,55 @@ Examples:
"current_height": 1080,
"maximum_width": 32767,
"maximum_height": 32767,
- "devices": {
- "modes": [
- {
- "resolution_width": 1920,
- "resolution_height": 1080,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 60.03,
- "is_current": true,
- "is_preferred": true
- },
- {
- "frequency": 59.93,
- "is_current": false,
- "is_preferred": false
- }
- ]
- },
- {
- "resolution_width": 1680,
- "resolution_height": 1050,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 59.88,
- "is_current": false,
- "is_preferred": false
- }
- ]
- }
- ],
- "is_connected": true,
- "is_primary": true,
- "device_name": "eDP1",
- "model_name": "ASUS VW193S",
- "product_id": "54297",
- "serial_number": "78L8021107",
- "resolution_width": 1920,
- "resolution_height": 1080,
- "offset_width": 0,
- "offset_height": 0,
- "dimension_width": 310,
- "dimension_height": 170,
- "rotation": "normal",
- "reflection": "normal"
- }
+ "devices": [
+ {
+ "modes": [
+ {
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 60.03,
+ "is_current": true,
+ "is_preferred": true
+ },
+ {
+ "frequency": 59.93,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ },
+ {
+ "resolution_width": 1680,
+ "resolution_height": 1050,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 59.88,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ }
+ ],
+ "is_connected": true,
+ "is_primary": true,
+ "device_name": "eDP1",
+ "model_name": "ASUS VW193S",
+ "product_id": "54297",
+ "serial_number": "78L8021107",
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "offset_width": 0,
+ "offset_height": 0,
+ "dimension_width": 310,
+ "dimension_height": 170,
+ "rotation": "normal",
+ "reflection": "normal"
+ }
+ ]
}
]
}
@@ -211,4 +217,4 @@ Returns:
### Parser Information
Compatibility: linux, darwin, cygwin, aix, freebsd
-Version 1.3 by Kevin Lyter (code (at) lyterk.com)
+Version 1.4 by Kevin Lyter (code (at) lyterk.com)
diff --git a/docs/utils.md b/docs/utils.md
index 61fe19ff..a4d45bc0 100644
--- a/docs/utils.md
+++ b/docs/utils.md
@@ -9,6 +9,7 @@
* [convert\_to\_int](#jc.utils.convert_to_int)
* [convert\_to\_float](#jc.utils.convert_to_float)
* [convert\_to\_bool](#jc.utils.convert_to_bool)
+ * [convert\_size\_to\_int](#jc.utils.convert_size_to_int)
* [input\_type\_check](#jc.utils.input_type_check)
* [timestamp](#jc.utils.timestamp)
* [\_\_init\_\_](#jc.utils.timestamp.__init__)
@@ -178,6 +179,48 @@ Returns:
True/False False unless a 'truthy' number or string is found
('y', 'yes', 'true', '1', 1, -1, etc.)
+
+
+### convert\_size\_to\_int
+
+```python
+def convert_size_to_int(size: str, binary: bool = False) -> Optional[int]
+```
+
+Parse a human readable data size and return the number of bytes.
+
+Parameters:
+
+ size: (string) The human readable file size to parse.
+ 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).
+Returns:
+
+ integer/None Integer if successful conversion, otherwise None
+
+This function knows how to parse sizes in bytes, kilobytes, megabytes,
+gigabytes, terabytes and petabytes. Some examples:
+
+ >>> convert_size_to_int('42')
+ 42
+ >>> convert_size_to_int('13b')
+ 13
+ >>> convert_size_to_int('5 bytes')
+ 5
+ >>> convert_size_to_int('1 KB')
+ 1000
+ >>> convert_size_to_int('1 kilobyte')
+ 1000
+ >>> convert_size_to_int('1 KiB')
+ 1024
+ >>> convert_size_to_int('1 KB', binary=True)
+ 1024
+ >>> convert_size_to_int('1.5 GB')
+ 1500000000
+ >>> convert_size_to_int('1.5 GB', binary=True)
+ 1610612736
+
### input\_type\_check
diff --git a/jc/appdirs.py b/jc/appdirs.py
index 73075765..f32bc1a0 100644
--- a/jc/appdirs.py
+++ b/jc/appdirs.py
@@ -45,10 +45,6 @@ __version_info__ = tuple(int(segment) for segment in __version__.split("."))
import sys
import os
-PY3 = sys.version_info[0] == 3
-
-if PY3:
- unicode = str
if sys.platform.startswith('java'):
import platform
@@ -490,10 +486,7 @@ def _get_win_folder_from_registry(csidl_name):
registry for this guarantees us the correct answer for all CSIDL_*
names.
"""
- if PY3:
- import winreg as _winreg
- else:
- import _winreg
+ import winreg as _winreg
shell_folder_name = {
"CSIDL_APPDATA": "AppData",
diff --git a/jc/lib.py b/jc/lib.py
index 4fc15615..44f1aa17 100644
--- a/jc/lib.py
+++ b/jc/lib.py
@@ -9,7 +9,7 @@ from .jc_types import ParserInfoType, JSONDictType
from jc import appdirs
-__version__ = '1.23.6'
+__version__ = '1.24.0'
parsers: List[str] = [
'acpi',
@@ -34,6 +34,7 @@ parsers: List[str] = [
'csv-s',
'date',
'datetime-iso',
+ 'debconf-show',
'df',
'dig',
'dir',
@@ -69,7 +70,6 @@ parsers: List[str] = [
'ip-address',
'iptables',
'ip-route',
- 'iso-datetime',
'iw-scan',
'iwconfig',
'jar-manifest',
@@ -107,10 +107,13 @@ parsers: List[str] = [
'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',
@@ -175,6 +178,7 @@ parsers: List[str] = [
'sshd-conf',
'stat',
'stat-s',
+ 'swapon',
'sysctl',
'syslog',
'syslog-s',
@@ -193,6 +197,7 @@ parsers: List[str] = [
'top-s',
'tracepath',
'traceroute',
+ 'tune2fs',
'udevadm',
'ufw',
'ufw-appinfo',
diff --git a/jc/parsers/acpi.py b/jc/parsers/acpi.py
index 1457aecb..8b3a080d 100644
--- a/jc/parsers/acpi.py
+++ b/jc/parsers/acpi.py
@@ -227,7 +227,7 @@ import jc.utils
class info():
"""Provides parser metadata (version, author, etc.)"""
- version = '1.6'
+ version = '1.7'
description = '`acpi` command parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
@@ -337,19 +337,15 @@ def parse(data, raw=False, quiet=False):
output_line['state'] = 'Not charging'
output_line['charge_percent'] = line.split()[-1].rstrip('%,')
- if 'Charging' in line \
- or 'Discharging' in line \
- or 'Full' in line:
-
+ if any(word in line for word in ('Charging', 'Discharging', 'Full')):
output_line['state'] = line.split()[2][:-1]
output_line['charge_percent'] = line.split()[3].rstrip('%,')
- if 'will never fully discharge' in line:
+ if 'will never fully discharge' in line or 'rate information unavailable' in line:
pass
- elif 'rate information unavailable' not in line:
- if 'Charging' in line:
- output_line['until_charged'] = line.split()[4]
- if 'Discharging' in line:
- output_line['charge_remaining'] = line.split()[4]
+ elif 'Charging' in line:
+ output_line['until_charged'] = line.split()[4]
+ elif 'Discharging' in line:
+ output_line['charge_remaining'] = line.split()[4]
if 'design capacity' in line:
output_line['design_capacity_mah'] = line.split()[4]
@@ -359,10 +355,7 @@ def parse(data, raw=False, quiet=False):
if obj_type == 'Adapter':
output_line['type'] = obj_type
output_line['id'] = obj_id
- if 'on-line' in line:
- output_line['on-line'] = True
- else:
- output_line['on-line'] = False
+ output_line['on-line'] = 'on-line' in line
if obj_type == 'Thermal':
output_line['type'] = obj_type
diff --git a/jc/parsers/asn1crypto/_inet.py b/jc/parsers/asn1crypto/_inet.py
index 045ba561..7550bf5d 100644
--- a/jc/parsers/asn1crypto/_inet.py
+++ b/jc/parsers/asn1crypto/_inet.py
@@ -5,7 +5,7 @@ import socket
import struct
from ._errors import unwrap
-from ._types import byte_cls, bytes_to_list, str_cls, type_name
+from ._types import type_name
def inet_ntop(address_family, packed_ip):
@@ -33,7 +33,7 @@ def inet_ntop(address_family, packed_ip):
repr(address_family)
))
- if not isinstance(packed_ip, byte_cls):
+ if not isinstance(packed_ip, bytes):
raise TypeError(unwrap(
'''
packed_ip must be a byte string, not %s
@@ -52,7 +52,7 @@ def inet_ntop(address_family, packed_ip):
))
if address_family == socket.AF_INET:
- return '%d.%d.%d.%d' % tuple(bytes_to_list(packed_ip))
+ return '%d.%d.%d.%d' % tuple(list(packed_ip))
octets = struct.unpack(b'!HHHHHHHH', packed_ip)
@@ -106,7 +106,7 @@ def inet_pton(address_family, ip_string):
repr(address_family)
))
- if not isinstance(ip_string, str_cls):
+ if not isinstance(ip_string, str):
raise TypeError(unwrap(
'''
ip_string must be a unicode string, not %s
diff --git a/jc/parsers/asn1crypto/_iri.py b/jc/parsers/asn1crypto/_iri.py
index 7394b4d5..cbd1bb17 100644
--- a/jc/parsers/asn1crypto/_iri.py
+++ b/jc/parsers/asn1crypto/_iri.py
@@ -13,25 +13,16 @@ from __future__ import unicode_literals, division, absolute_import, print_functi
from encodings import idna # noqa
import codecs
import re
-import sys
from ._errors import unwrap
-from ._types import byte_cls, str_cls, type_name, bytes_to_list, int_types
+from ._types import type_name
-if sys.version_info < (3,):
- from urlparse import urlsplit, urlunsplit
- from urllib import (
- quote as urlquote,
- unquote as unquote_to_bytes,
- )
-
-else:
- from urllib.parse import (
- quote as urlquote,
- unquote_to_bytes,
- urlsplit,
- urlunsplit,
- )
+from urllib.parse import (
+ quote as urlquote,
+ unquote_to_bytes,
+ urlsplit,
+ urlunsplit,
+)
def iri_to_uri(value, normalize=False):
@@ -48,7 +39,7 @@ def iri_to_uri(value, normalize=False):
A byte string of the ASCII-encoded URI
"""
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
value must be a unicode string, not %s
@@ -57,19 +48,7 @@ def iri_to_uri(value, normalize=False):
))
scheme = None
- # Python 2.6 doesn't split properly is the URL doesn't start with http:// or https://
- if sys.version_info < (2, 7) and not value.startswith('http://') and not value.startswith('https://'):
- real_prefix = None
- prefix_match = re.match('^[^:]*://', value)
- if prefix_match:
- real_prefix = prefix_match.group(0)
- value = 'http://' + value[len(real_prefix):]
- parsed = urlsplit(value)
- if real_prefix:
- value = real_prefix + value[7:]
- scheme = _urlquote(real_prefix[:-3])
- else:
- parsed = urlsplit(value)
+ parsed = urlsplit(value)
if scheme is None:
scheme = _urlquote(parsed.scheme)
@@ -81,7 +60,7 @@ def iri_to_uri(value, normalize=False):
password = _urlquote(parsed.password, safe='!$&\'()*+,;=')
port = parsed.port
if port is not None:
- port = str_cls(port).encode('ascii')
+ port = str(port).encode('ascii')
netloc = b''
if username is not None:
@@ -112,7 +91,7 @@ def iri_to_uri(value, normalize=False):
path = ''
output = urlunsplit((scheme, netloc, path, query, fragment))
- if isinstance(output, str_cls):
+ if isinstance(output, str):
output = output.encode('latin1')
return output
@@ -128,7 +107,7 @@ def uri_to_iri(value):
A unicode string of the IRI
"""
- if not isinstance(value, byte_cls):
+ if not isinstance(value, bytes):
raise TypeError(unwrap(
'''
value must be a byte string, not %s
@@ -148,7 +127,7 @@ def uri_to_iri(value):
if hostname:
hostname = hostname.decode('idna')
port = parsed.port
- if port and not isinstance(port, int_types):
+ if port and not isinstance(port, int):
port = port.decode('ascii')
netloc = ''
@@ -160,7 +139,7 @@ def uri_to_iri(value):
if hostname is not None:
netloc += hostname
if port is not None:
- netloc += ':' + str_cls(port)
+ netloc += ':' + str(port)
path = _urlunquote(parsed.path, remap=['/'], preserve=True)
query = _urlunquote(parsed.query, remap=['&', '='], preserve=True)
@@ -182,7 +161,7 @@ def _iri_utf8_errors_handler(exc):
resume at)
"""
- bytes_as_ints = bytes_to_list(exc.object[exc.start:exc.end])
+ bytes_as_ints = list(exc.object[exc.start:exc.end])
replacements = ['%%%02x' % num for num in bytes_as_ints]
return (''.join(replacements), exc.end)
@@ -230,7 +209,7 @@ def _urlquote(string, safe=''):
string = re.sub('%[0-9a-fA-F]{2}', _extract_escape, string)
output = urlquote(string.encode('utf-8'), safe=safe.encode('utf-8'))
- if not isinstance(output, byte_cls):
+ if not isinstance(output, bytes):
output = output.encode('ascii')
# Restore the existing quoted values that we extracted
diff --git a/jc/parsers/asn1crypto/_ordereddict.py b/jc/parsers/asn1crypto/_ordereddict.py
index 2f18ab5a..e69de29b 100644
--- a/jc/parsers/asn1crypto/_ordereddict.py
+++ b/jc/parsers/asn1crypto/_ordereddict.py
@@ -1,135 +0,0 @@
-# Copyright (c) 2009 Raymond Hettinger
-#
-# Permission is hereby granted, free of charge, to any person
-# obtaining a copy of this software and associated documentation files
-# (the "Software"), to deal in the Software without restriction,
-# including without limitation the rights to use, copy, modify, merge,
-# publish, distribute, sublicense, and/or sell copies of the Software,
-# and to permit persons to whom the Software is furnished to do so,
-# subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-# OTHER DEALINGS IN THE SOFTWARE.
-
-import sys
-
-if not sys.version_info < (2, 7):
-
- from collections import OrderedDict
-
-else:
-
- from UserDict import DictMixin
-
- class OrderedDict(dict, DictMixin):
-
- def __init__(self, *args, **kwds):
- if len(args) > 1:
- raise TypeError('expected at most 1 arguments, got %d' % len(args))
- try:
- self.__end
- except AttributeError:
- self.clear()
- self.update(*args, **kwds)
-
- def clear(self):
- self.__end = end = []
- end += [None, end, end] # sentinel node for doubly linked list
- self.__map = {} # key --> [key, prev, next]
- dict.clear(self)
-
- def __setitem__(self, key, value):
- if key not in self:
- end = self.__end
- curr = end[1]
- curr[2] = end[1] = self.__map[key] = [key, curr, end]
- dict.__setitem__(self, key, value)
-
- def __delitem__(self, key):
- dict.__delitem__(self, key)
- key, prev, next_ = self.__map.pop(key)
- prev[2] = next_
- next_[1] = prev
-
- def __iter__(self):
- end = self.__end
- curr = end[2]
- while curr is not end:
- yield curr[0]
- curr = curr[2]
-
- def __reversed__(self):
- end = self.__end
- curr = end[1]
- while curr is not end:
- yield curr[0]
- curr = curr[1]
-
- def popitem(self, last=True):
- if not self:
- raise KeyError('dictionary is empty')
- if last:
- key = reversed(self).next()
- else:
- key = iter(self).next()
- value = self.pop(key)
- return key, value
-
- def __reduce__(self):
- items = [[k, self[k]] for k in self]
- tmp = self.__map, self.__end
- del self.__map, self.__end
- inst_dict = vars(self).copy()
- self.__map, self.__end = tmp
- if inst_dict:
- return (self.__class__, (items,), inst_dict)
- return self.__class__, (items,)
-
- def keys(self):
- return list(self)
-
- setdefault = DictMixin.setdefault
- update = DictMixin.update
- pop = DictMixin.pop
- values = DictMixin.values
- items = DictMixin.items
- iterkeys = DictMixin.iterkeys
- itervalues = DictMixin.itervalues
- iteritems = DictMixin.iteritems
-
- def __repr__(self):
- if not self:
- return '%s()' % (self.__class__.__name__,)
- return '%s(%r)' % (self.__class__.__name__, self.items())
-
- def copy(self):
- return self.__class__(self)
-
- @classmethod
- def fromkeys(cls, iterable, value=None):
- d = cls()
- for key in iterable:
- d[key] = value
- return d
-
- def __eq__(self, other):
- if isinstance(other, OrderedDict):
- if len(self) != len(other):
- return False
- for p, q in zip(self.items(), other.items()):
- if p != q:
- return False
- return True
- return dict.__eq__(self, other)
-
- def __ne__(self, other):
- return not self == other
diff --git a/jc/parsers/asn1crypto/_types.py b/jc/parsers/asn1crypto/_types.py
index b9ca8cc7..b5d5b7bf 100644
--- a/jc/parsers/asn1crypto/_types.py
+++ b/jc/parsers/asn1crypto/_types.py
@@ -2,28 +2,10 @@
from __future__ import unicode_literals, division, absolute_import, print_function
import inspect
-import sys
-if sys.version_info < (3,):
- str_cls = unicode # noqa
- byte_cls = str
- int_types = (int, long) # noqa
-
- def bytes_to_list(byte_string):
- return [ord(b) for b in byte_string]
-
- chr_cls = chr
-
-else:
- str_cls = str
- byte_cls = bytes
- int_types = int
-
- bytes_to_list = list
-
- def chr_cls(num):
- return bytes([num])
+def chr_cls(num):
+ return bytes([num])
def type_name(value):
diff --git a/jc/parsers/asn1crypto/core.py b/jc/parsers/asn1crypto/core.py
index 2e7d5098..6d3a2e24 100644
--- a/jc/parsers/asn1crypto/core.py
+++ b/jc/parsers/asn1crypto/core.py
@@ -48,8 +48,10 @@ Other type classes are defined that help compose the types listed above.
from __future__ import unicode_literals, division, absolute_import, print_function
+from collections import OrderedDict
from datetime import datetime, timedelta
from fractions import Fraction
+from io import BytesIO
import binascii
import copy
import math
@@ -58,22 +60,10 @@ import sys
from . import _teletex_codec
from ._errors import unwrap
-from ._ordereddict import OrderedDict
-from ._types import type_name, str_cls, byte_cls, int_types, chr_cls
+from ._types import type_name, chr_cls
from .parser import _parse, _dump_header
from .util import int_to_bytes, int_from_bytes, timezone, extended_datetime, create_timezone, utc_with_dst
-if sys.version_info <= (3,):
- from cStringIO import StringIO as BytesIO
-
- range = xrange # noqa
- _PY2 = True
-
-else:
- from io import BytesIO
-
- _PY2 = False
-
_teletex_codec.register()
@@ -220,7 +210,7 @@ class Asn1Value(object):
An instance of the current class
"""
- if not isinstance(encoded_data, byte_cls):
+ if not isinstance(encoded_data, bytes):
raise TypeError('encoded_data must be a byte string, not %s' % type_name(encoded_data))
spec = None
@@ -291,7 +281,7 @@ class Asn1Value(object):
cls = self.__class__
# Allow explicit to be specified as a simple 2-element tuple
# instead of requiring the user make a nested tuple
- if cls.explicit is not None and isinstance(cls.explicit[0], int_types):
+ if cls.explicit is not None and isinstance(cls.explicit[0], int):
cls.explicit = (cls.explicit, )
if hasattr(cls, '_setup'):
self._setup()
@@ -299,7 +289,7 @@ class Asn1Value(object):
# Normalize tagging values
if explicit is not None:
- if isinstance(explicit, int_types):
+ if isinstance(explicit, int):
if class_ is None:
class_ = 'context'
explicit = (class_, explicit)
@@ -309,7 +299,7 @@ class Asn1Value(object):
tag = None
if implicit is not None:
- if isinstance(implicit, int_types):
+ if isinstance(implicit, int):
if class_ is None:
class_ = 'context'
implicit = (class_, implicit)
@@ -336,11 +326,11 @@ class Asn1Value(object):
if explicit is not None:
# Ensure we have a tuple of 2-element tuples
- if len(explicit) == 2 and isinstance(explicit[1], int_types):
+ if len(explicit) == 2 and isinstance(explicit[1], int):
explicit = (explicit, )
for class_, tag in explicit:
invalid_class = None
- if isinstance(class_, int_types):
+ if isinstance(class_, int):
if class_ not in CLASS_NUM_TO_NAME_MAP:
invalid_class = class_
else:
@@ -356,7 +346,7 @@ class Asn1Value(object):
repr(invalid_class)
))
if tag is not None:
- if not isinstance(tag, int_types):
+ if not isinstance(tag, int):
raise TypeError(unwrap(
'''
explicit tag must be an integer, not %s
@@ -379,7 +369,7 @@ class Asn1Value(object):
repr(class_)
))
if tag is not None:
- if not isinstance(tag, int_types):
+ if not isinstance(tag, int):
raise TypeError(unwrap(
'''
implicit tag must be an integer, not %s
@@ -445,10 +435,7 @@ class Asn1Value(object):
A unicode string
"""
- if _PY2:
- return self.__bytes__()
- else:
- return self.__unicode__()
+ return self.__unicode__()
def __repr__(self):
"""
@@ -456,10 +443,7 @@ class Asn1Value(object):
A unicode string
"""
- if _PY2:
- return '<%s %s b%s>' % (type_name(self), id(self), repr(self.dump()))
- else:
- return '<%s %s %s>' % (type_name(self), id(self), repr(self.dump()))
+ return '<%s %s %s>' % (type_name(self), id(self), repr(self.dump()))
def __bytes__(self):
"""
@@ -609,10 +593,7 @@ class Asn1Value(object):
elif hasattr(self, 'chosen'):
self.chosen.debug(nest_level + 2)
else:
- if _PY2 and isinstance(self.native, byte_cls):
- print('%s Native: b%s' % (prefix, repr(self.native)))
- else:
- print('%s Native: %s' % (prefix, self.native))
+ print('%s Native: %s' % (prefix, self.native))
def dump(self, force=False):
"""
@@ -1058,7 +1039,7 @@ class Choice(Asn1Value):
A instance of the current class
"""
- if not isinstance(encoded_data, byte_cls):
+ if not isinstance(encoded_data, bytes):
raise TypeError('encoded_data must be a byte string, not %s' % type_name(encoded_data))
value, _ = _parse_build(encoded_data, spec=cls, spec_params=kwargs, strict=strict)
@@ -1425,17 +1406,11 @@ class Concat(object):
def __str__(self):
"""
- Since str is different in Python 2 and 3, this calls the appropriate
- method, __unicode__() or __bytes__()
-
:return:
A unicode string
"""
- if _PY2:
- return self.__bytes__()
- else:
- return self.__unicode__()
+ return self.__unicode__()
def __bytes__(self):
"""
@@ -1684,7 +1659,7 @@ class Primitive(Asn1Value):
A byte string
"""
- if not isinstance(value, byte_cls):
+ if not isinstance(value, bytes):
raise TypeError(unwrap(
'''
%s value must be a byte string, not %s
@@ -1784,7 +1759,7 @@ class AbstractString(Constructable, Primitive):
A unicode string
"""
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
%s value must be a unicode string, not %s
@@ -1915,7 +1890,7 @@ class Integer(Primitive, ValueMap):
ValueError - when an invalid value is passed
"""
- if isinstance(value, str_cls):
+ if isinstance(value, str):
if self._map is None:
raise ValueError(unwrap(
'''
@@ -1935,7 +1910,7 @@ class Integer(Primitive, ValueMap):
value = self._reverse_map[value]
- elif not isinstance(value, int_types):
+ elif not isinstance(value, int):
raise TypeError(unwrap(
'''
%s value must be an integer or unicode string when a name_map
@@ -2004,7 +1979,7 @@ class _IntegerBitString(object):
# return an empty chunk, for cases like \x23\x80\x00\x00
return []
- unused_bits_len = ord(self.contents[0]) if _PY2 else self.contents[0]
+ unused_bits_len = self.contents[0]
value = int_from_bytes(self.contents[1:])
bits = (len(self.contents) - 1) * 8
@@ -2135,7 +2110,7 @@ class BitString(_IntegerBitString, Constructable, Castable, Primitive, ValueMap)
if key in value:
bits[index] = 1
- value = ''.join(map(str_cls, bits))
+ value = ''.join(map(str, bits))
elif value.__class__ == tuple:
if self._map is None:
@@ -2146,7 +2121,7 @@ class BitString(_IntegerBitString, Constructable, Castable, Primitive, ValueMap)
if bit:
name = self._map.get(index, index)
self._native.add(name)
- value = ''.join(map(str_cls, value))
+ value = ''.join(map(str, value))
else:
raise TypeError(unwrap(
@@ -2220,7 +2195,7 @@ class BitString(_IntegerBitString, Constructable, Castable, Primitive, ValueMap)
A boolean if the bit is set
"""
- is_int = isinstance(key, int_types)
+ is_int = isinstance(key, int)
if not is_int:
if not isinstance(self._map, dict):
raise ValueError(unwrap(
@@ -2266,7 +2241,7 @@ class BitString(_IntegerBitString, Constructable, Castable, Primitive, ValueMap)
ValueError - when _map is not set or the key name is invalid
"""
- is_int = isinstance(key, int_types)
+ is_int = isinstance(key, int)
if not is_int:
if self._map is None:
raise ValueError(unwrap(
@@ -2365,7 +2340,7 @@ class OctetBitString(Constructable, Castable, Primitive):
ValueError - when an invalid value is passed
"""
- if not isinstance(value, byte_cls):
+ if not isinstance(value, bytes):
raise TypeError(unwrap(
'''
%s value must be a byte string, not %s
@@ -2435,7 +2410,7 @@ class OctetBitString(Constructable, Castable, Primitive):
List with one tuple, consisting of a byte string and an integer (unused bits)
"""
- unused_bits_len = ord(self.contents[0]) if _PY2 else self.contents[0]
+ unused_bits_len = self.contents[0]
if not unused_bits_len:
return [(self.contents[1:], ())]
@@ -2448,11 +2423,11 @@ class OctetBitString(Constructable, Castable, Primitive):
raise ValueError('Bit string has {0} unused bits'.format(unused_bits_len))
mask = (1 << unused_bits_len) - 1
- last_byte = ord(self.contents[-1]) if _PY2 else self.contents[-1]
+ last_byte = self.contents[-1]
# zero out the unused bits in the last byte.
zeroed_byte = last_byte & ~mask
- value = self.contents[1:-1] + (chr(zeroed_byte) if _PY2 else bytes((zeroed_byte,)))
+ value = self.contents[1:-1] + bytes((zeroed_byte,))
unused_bits = _int_to_bit_tuple(last_byte & mask, unused_bits_len)
@@ -2505,7 +2480,7 @@ class IntegerBitString(_IntegerBitString, Constructable, Castable, Primitive):
ValueError - when an invalid value is passed
"""
- if not isinstance(value, int_types):
+ if not isinstance(value, int):
raise TypeError(unwrap(
'''
%s value must be a positive integer, not %s
@@ -2570,7 +2545,7 @@ class OctetString(Constructable, Castable, Primitive):
A byte string
"""
- if not isinstance(value, byte_cls):
+ if not isinstance(value, bytes):
raise TypeError(unwrap(
'''
%s value must be a byte string, not %s
@@ -2654,7 +2629,7 @@ class IntegerOctetString(Constructable, Castable, Primitive):
ValueError - when an invalid value is passed
"""
- if not isinstance(value, int_types):
+ if not isinstance(value, int):
raise TypeError(unwrap(
'''
%s value must be a positive integer, not %s
@@ -2752,7 +2727,7 @@ class ParsableOctetString(Constructable, Castable, Primitive):
A byte string
"""
- if not isinstance(value, byte_cls):
+ if not isinstance(value, bytes):
raise TypeError(unwrap(
'''
%s value must be a byte string, not %s
@@ -2904,7 +2879,7 @@ class ParsableOctetBitString(ParsableOctetString):
ValueError - when an invalid value is passed
"""
- if not isinstance(value, byte_cls):
+ if not isinstance(value, bytes):
raise TypeError(unwrap(
'''
%s value must be a byte string, not %s
@@ -2934,7 +2909,7 @@ class ParsableOctetBitString(ParsableOctetString):
A byte string
"""
- unused_bits_len = ord(self.contents[0]) if _PY2 else self.contents[0]
+ unused_bits_len = self.contents[0]
if unused_bits_len:
raise ValueError('ParsableOctetBitString should have no unused bits')
@@ -3007,7 +2982,7 @@ class ObjectIdentifier(Primitive, ValueMap):
type_name(cls)
))
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
value must be a unicode string, not %s
@@ -3045,7 +3020,7 @@ class ObjectIdentifier(Primitive, ValueMap):
type_name(cls)
))
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
value must be a unicode string, not %s
@@ -3079,7 +3054,7 @@ class ObjectIdentifier(Primitive, ValueMap):
ValueError - when an invalid value is passed
"""
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
%s value must be a unicode string, not %s
@@ -3153,24 +3128,22 @@ class ObjectIdentifier(Primitive, ValueMap):
part = 0
for byte in self.contents:
- if _PY2:
- byte = ord(byte)
part = part * 128
part += byte & 127
# Last byte in subidentifier has the eighth bit set to 0
if byte & 0x80 == 0:
if len(output) == 0:
if part >= 80:
- output.append(str_cls(2))
- output.append(str_cls(part - 80))
+ output.append(str(2))
+ output.append(str(part - 80))
elif part >= 40:
- output.append(str_cls(1))
- output.append(str_cls(part - 40))
+ output.append(str(1))
+ output.append(str(part - 40))
else:
- output.append(str_cls(0))
- output.append(str_cls(part))
+ output.append(str(0))
+ output.append(str(part))
else:
- output.append(str_cls(part))
+ output.append(str(part))
part = 0
self._dotted = '.'.join(output)
@@ -3240,7 +3213,7 @@ class Enumerated(Integer):
ValueError - when an invalid value is passed
"""
- if not isinstance(value, int_types) and not isinstance(value, str_cls):
+ if not isinstance(value, int) and not isinstance(value, str):
raise TypeError(unwrap(
'''
%s value must be an integer or a unicode string, not %s
@@ -3249,7 +3222,7 @@ class Enumerated(Integer):
type_name(value)
))
- if isinstance(value, str_cls):
+ if isinstance(value, str):
if value not in self._reverse_map:
raise ValueError(unwrap(
'''
@@ -3507,7 +3480,7 @@ class Sequence(Asn1Value):
if self.children is None:
self._parse_children()
- if not isinstance(key, int_types):
+ if not isinstance(key, int):
if key not in self._field_map:
raise KeyError(unwrap(
'''
@@ -3554,7 +3527,7 @@ class Sequence(Asn1Value):
if self.children is None:
self._parse_children()
- if not isinstance(key, int_types):
+ if not isinstance(key, int):
if key not in self._field_map:
raise KeyError(unwrap(
'''
@@ -3605,7 +3578,7 @@ class Sequence(Asn1Value):
if self.children is None:
self._parse_children()
- if not isinstance(key, int_types):
+ if not isinstance(key, int):
if key not in self._field_map:
raise KeyError(unwrap(
'''
@@ -4003,7 +3976,7 @@ class Sequence(Asn1Value):
encoded using
"""
- if not isinstance(field_name, str_cls):
+ if not isinstance(field_name, str):
raise TypeError(unwrap(
'''
field_name must be a unicode string, not %s
@@ -4051,7 +4024,7 @@ class Sequence(Asn1Value):
try:
name = self._fields[index][0]
except (IndexError):
- name = str_cls(index)
+ name = str(index)
self._native[name] = child.native
except (ValueError, TypeError) as e:
self._native = None
@@ -4879,7 +4852,7 @@ class AbstractTime(AbstractString):
A dict with the parsed values
"""
- string = str_cls(self)
+ string = str(self)
m = self._TIMESTRING_RE.match(string)
if not m:
@@ -5018,8 +4991,6 @@ class UTCTime(AbstractTime):
raise ValueError('Year of the UTCTime is not in range [1950, 2049], use GeneralizedTime instead')
value = value.strftime('%y%m%d%H%M%SZ')
- if _PY2:
- value = value.decode('ascii')
AbstractString.set(self, value)
# Set it to None and let the class take care of converting the next
@@ -5117,8 +5088,6 @@ class GeneralizedTime(AbstractTime):
fraction = ''
value = value.strftime('%Y%m%d%H%M%S') + fraction + 'Z'
- if _PY2:
- value = value.decode('ascii')
AbstractString.set(self, value)
# Set it to None and let the class take care of converting the next
@@ -5340,7 +5309,7 @@ def _build_id_tuple(params, spec):
else:
required_class = 2
required_tag = params['implicit']
- if required_class is not None and not isinstance(required_class, int_types):
+ if required_class is not None and not isinstance(required_class, int):
required_class = CLASS_NAME_TO_NUM_MAP[required_class]
required_class = params.get('class_', required_class)
diff --git a/jc/parsers/asn1crypto/keys.py b/jc/parsers/asn1crypto/keys.py
index b4a87aea..e7aaa2e4 100644
--- a/jc/parsers/asn1crypto/keys.py
+++ b/jc/parsers/asn1crypto/keys.py
@@ -20,7 +20,7 @@ import hashlib
import math
from ._errors import unwrap, APIException
-from ._types import type_name, byte_cls
+from ._types import type_name
from .algos import _ForceNullParameters, DigestAlgorithm, EncryptionAlgorithm, RSAESOAEPParams, RSASSAPSSParams
from .core import (
Any,
@@ -582,7 +582,7 @@ class ECPrivateKey(Sequence):
if self._key_size is None:
# Infer the key_size from the existing private key if possible
pkey_contents = self['private_key'].contents
- if isinstance(pkey_contents, byte_cls) and len(pkey_contents) > 1:
+ if isinstance(pkey_contents, bytes) and len(pkey_contents) > 1:
self.set_key_size(len(self['private_key'].contents))
elif self._key_size is not None:
@@ -744,7 +744,7 @@ class PrivateKeyInfo(Sequence):
A PrivateKeyInfo object
"""
- if not isinstance(private_key, byte_cls) and not isinstance(private_key, Asn1Value):
+ if not isinstance(private_key, bytes) and not isinstance(private_key, Asn1Value):
raise TypeError(unwrap(
'''
private_key must be a byte string or Asn1Value, not %s
@@ -1112,7 +1112,7 @@ class PublicKeyInfo(Sequence):
A PublicKeyInfo object
"""
- if not isinstance(public_key, byte_cls) and not isinstance(public_key, Asn1Value):
+ if not isinstance(public_key, bytes) and not isinstance(public_key, Asn1Value):
raise TypeError(unwrap(
'''
public_key must be a byte string or Asn1Value, not %s
@@ -1268,7 +1268,7 @@ class PublicKeyInfo(Sequence):
"""
if self._sha1 is None:
- self._sha1 = hashlib.sha1(byte_cls(self['public_key'])).digest()
+ self._sha1 = hashlib.sha1(bytes(self['public_key'])).digest()
return self._sha1
@property
@@ -1279,7 +1279,7 @@ class PublicKeyInfo(Sequence):
"""
if self._sha256 is None:
- self._sha256 = hashlib.sha256(byte_cls(self['public_key'])).digest()
+ self._sha256 = hashlib.sha256(bytes(self['public_key'])).digest()
return self._sha256
@property
diff --git a/jc/parsers/asn1crypto/parser.py b/jc/parsers/asn1crypto/parser.py
index 2f5a63e1..622d9cd7 100644
--- a/jc/parsers/asn1crypto/parser.py
+++ b/jc/parsers/asn1crypto/parser.py
@@ -15,10 +15,9 @@ from __future__ import unicode_literals, division, absolute_import, print_functi
import sys
-from ._types import byte_cls, chr_cls, type_name
+from ._types import chr_cls, type_name
from .util import int_from_bytes, int_to_bytes
-_PY2 = sys.version_info <= (3,)
_INSUFFICIENT_DATA_MESSAGE = 'Insufficient data - %s bytes requested but only %s available'
_MAX_DEPTH = 10
@@ -66,7 +65,7 @@ def emit(class_, method, tag, contents):
if tag < 0:
raise ValueError('tag must be greater than zero, not %s' % tag)
- if not isinstance(contents, byte_cls):
+ if not isinstance(contents, bytes):
raise TypeError('contents must be a byte string, not %s' % type_name(contents))
return _dump_header(class_, method, tag, contents) + contents
@@ -101,7 +100,7 @@ def parse(contents, strict=False):
- 5: byte string trailer
"""
- if not isinstance(contents, byte_cls):
+ if not isinstance(contents, bytes):
raise TypeError('contents must be a byte string, not %s' % type_name(contents))
contents_len = len(contents)
@@ -130,7 +129,7 @@ def peek(contents):
An integer with the number of bytes occupied by the ASN.1 value
"""
- if not isinstance(contents, byte_cls):
+ if not isinstance(contents, bytes):
raise TypeError('contents must be a byte string, not %s' % type_name(contents))
info, consumed = _parse(contents, len(contents))
@@ -171,7 +170,7 @@ def _parse(encoded_data, data_len, pointer=0, lengths_only=False, depth=0):
if data_len < pointer + 1:
raise ValueError(_INSUFFICIENT_DATA_MESSAGE % (1, data_len - pointer))
- first_octet = ord(encoded_data[pointer]) if _PY2 else encoded_data[pointer]
+ first_octet = encoded_data[pointer]
pointer += 1
@@ -183,7 +182,7 @@ def _parse(encoded_data, data_len, pointer=0, lengths_only=False, depth=0):
while True:
if data_len < pointer + 1:
raise ValueError(_INSUFFICIENT_DATA_MESSAGE % (1, data_len - pointer))
- num = ord(encoded_data[pointer]) if _PY2 else encoded_data[pointer]
+ num = encoded_data[pointer]
pointer += 1
if num == 0x80 and tag == 0:
raise ValueError('Non-minimal tag encoding')
@@ -196,7 +195,7 @@ def _parse(encoded_data, data_len, pointer=0, lengths_only=False, depth=0):
if data_len < pointer + 1:
raise ValueError(_INSUFFICIENT_DATA_MESSAGE % (1, data_len - pointer))
- length_octet = ord(encoded_data[pointer]) if _PY2 else encoded_data[pointer]
+ length_octet = encoded_data[pointer]
pointer += 1
trailer = b''
diff --git a/jc/parsers/asn1crypto/pem.py b/jc/parsers/asn1crypto/pem.py
index 511ea4b5..f969cf9b 100644
--- a/jc/parsers/asn1crypto/pem.py
+++ b/jc/parsers/asn1crypto/pem.py
@@ -11,17 +11,13 @@ Encoding DER to PEM and decoding PEM to DER. Exports the following items:
from __future__ import unicode_literals, division, absolute_import, print_function
+from io import BytesIO
import base64
import re
-import sys
from ._errors import unwrap
-from ._types import type_name as _type_name, str_cls, byte_cls
+from ._types import type_name as _type_name
-if sys.version_info < (3,):
- from cStringIO import StringIO as BytesIO
-else:
- from io import BytesIO
def detect(byte_string):
@@ -36,7 +32,7 @@ def detect(byte_string):
string
"""
- if not isinstance(byte_string, byte_cls):
+ if not isinstance(byte_string, bytes):
raise TypeError(unwrap(
'''
byte_string must be a byte string, not %s
@@ -67,14 +63,14 @@ def armor(type_name, der_bytes, headers=None):
A byte string of the PEM block
"""
- if not isinstance(der_bytes, byte_cls):
+ if not isinstance(der_bytes, bytes):
raise TypeError(unwrap(
'''
der_bytes must be a byte string, not %s
''' % _type_name(der_bytes)
))
- if not isinstance(type_name, str_cls):
+ if not isinstance(type_name, str):
raise TypeError(unwrap(
'''
type_name must be a unicode string, not %s
@@ -127,7 +123,7 @@ def _unarmor(pem_bytes):
in the form "Name: Value" that are right after the begin line.
"""
- if not isinstance(pem_bytes, byte_cls):
+ if not isinstance(pem_bytes, bytes):
raise TypeError(unwrap(
'''
pem_bytes must be a byte string, not %s
diff --git a/jc/parsers/asn1crypto/util.py b/jc/parsers/asn1crypto/util.py
index 7196897c..ed5bd643 100644
--- a/jc/parsers/asn1crypto/util.py
+++ b/jc/parsers/asn1crypto/util.py
@@ -20,11 +20,11 @@ from __future__ import unicode_literals, division, absolute_import, print_functi
import math
import sys
-from datetime import datetime, date, timedelta, tzinfo
+from collections import OrderedDict
+from datetime import datetime, date, timedelta, timezone, tzinfo
from ._errors import unwrap
from ._iri import iri_to_uri, uri_to_iri # noqa
-from ._ordereddict import OrderedDict # noqa
from ._types import type_name
if sys.platform == 'win32':
@@ -33,230 +33,53 @@ else:
from socket import inet_ntop, inet_pton # noqa
-# Python 2
-if sys.version_info <= (3,):
- def int_to_bytes(value, signed=False, width=None):
- """
- Converts an integer to a byte string
+def int_to_bytes(value, signed=False, width=None):
+ """
+ Converts an integer to a byte string
- :param value:
- The integer to convert
+ :param value:
+ The integer to convert
- :param signed:
- If the byte string should be encoded using two's complement
+ :param signed:
+ If the byte string should be encoded using two's complement
- :param width:
- If None, the minimal possible size (but at least 1),
- otherwise an integer of the byte width for the return value
+ :param width:
+ If None, the minimal possible size (but at least 1),
+ otherwise an integer of the byte width for the return value
- :return:
- A byte string
- """
+ :return:
+ A byte string
+ """
- if value == 0 and width == 0:
- return b''
-
- # Handle negatives in two's complement
- is_neg = False
- if signed and value < 0:
- is_neg = True
- bits = int(math.ceil(len('%x' % abs(value)) / 2.0) * 8)
- value = (value + (1 << bits)) % (1 << bits)
-
- hex_str = '%x' % value
- if len(hex_str) & 1:
- hex_str = '0' + hex_str
-
- output = hex_str.decode('hex')
-
- if signed and not is_neg and ord(output[0:1]) & 0x80:
- output = b'\x00' + output
-
- if width is not None:
- if len(output) > width:
- raise OverflowError('int too big to convert')
- if is_neg:
- pad_char = b'\xFF'
- else:
- pad_char = b'\x00'
- output = (pad_char * (width - len(output))) + output
- elif is_neg and ord(output[0:1]) & 0x80 == 0:
- output = b'\xFF' + output
-
- return output
-
- def int_from_bytes(value, signed=False):
- """
- Converts a byte string to an integer
-
- :param value:
- The byte string to convert
-
- :param signed:
- If the byte string should be interpreted using two's complement
-
- :return:
- An integer
- """
-
- if value == b'':
- return 0
-
- num = long(value.encode("hex"), 16) # noqa
-
- if not signed:
- return num
-
- # Check for sign bit and handle two's complement
- if ord(value[0:1]) & 0x80:
- bit_len = len(value) * 8
- return num - (1 << bit_len)
-
- return num
-
- class timezone(tzinfo): # noqa
- """
- Implements datetime.timezone for py2.
- Only full minute offsets are supported.
- DST is not supported.
- """
-
- def __init__(self, offset, name=None):
- """
- :param offset:
- A timedelta with this timezone's offset from UTC
-
- :param name:
- Name of the timezone; if None, generate one.
- """
-
- if not timedelta(hours=-24) < offset < timedelta(hours=24):
- raise ValueError('Offset must be in [-23:59, 23:59]')
-
- if offset.seconds % 60 or offset.microseconds:
- raise ValueError('Offset must be full minutes')
-
- self._offset = offset
-
- if name is not None:
- self._name = name
- elif not offset:
- self._name = 'UTC'
- else:
- self._name = 'UTC' + _format_offset(offset)
-
- def __eq__(self, other):
- """
- Compare two timezones
-
- :param other:
- The other timezone to compare to
-
- :return:
- A boolean
- """
-
- if type(other) != timezone:
- return False
- return self._offset == other._offset
-
- def __getinitargs__(self):
- """
- Called by tzinfo.__reduce__ to support pickle and copy.
-
- :return:
- offset and name, to be used for __init__
- """
-
- return self._offset, self._name
-
- def tzname(self, dt):
- """
- :param dt:
- A datetime object; ignored.
-
- :return:
- Name of this timezone
- """
-
- return self._name
-
- def utcoffset(self, dt):
- """
- :param dt:
- A datetime object; ignored.
-
- :return:
- A timedelta object with the offset from UTC
- """
-
- return self._offset
-
- def dst(self, dt):
- """
- :param dt:
- A datetime object; ignored.
-
- :return:
- Zero timedelta
- """
-
- return timedelta(0)
-
- timezone.utc = timezone(timedelta(0))
-
-# Python 3
-else:
-
- from datetime import timezone # noqa
-
- def int_to_bytes(value, signed=False, width=None):
- """
- Converts an integer to a byte string
-
- :param value:
- The integer to convert
-
- :param signed:
- If the byte string should be encoded using two's complement
-
- :param width:
- If None, the minimal possible size (but at least 1),
- otherwise an integer of the byte width for the return value
-
- :return:
- A byte string
- """
-
- if width is None:
- if signed:
- if value < 0:
- bits_required = abs(value + 1).bit_length()
- else:
- bits_required = value.bit_length()
- if bits_required % 8 == 0:
- bits_required += 1
+ if width is None:
+ if signed:
+ if value < 0:
+ bits_required = abs(value + 1).bit_length()
else:
bits_required = value.bit_length()
- width = math.ceil(bits_required / 8) or 1
- return value.to_bytes(width, byteorder='big', signed=signed)
+ if bits_required % 8 == 0:
+ bits_required += 1
+ else:
+ bits_required = value.bit_length()
+ width = math.ceil(bits_required / 8) or 1
+ return value.to_bytes(width, byteorder='big', signed=signed)
- def int_from_bytes(value, signed=False):
- """
- Converts a byte string to an integer
+def int_from_bytes(value, signed=False):
+ """
+ Converts a byte string to an integer
- :param value:
- The byte string to convert
+ :param value:
+ The byte string to convert
- :param signed:
- If the byte string should be interpreted using two's complement
+ :param signed:
+ If the byte string should be interpreted using two's complement
- :return:
- An integer
- """
+ :return:
+ An integer
+ """
- return int.from_bytes(value, 'big', signed=signed)
+ return int.from_bytes(value, 'big', signed=signed)
def _format_offset(off):
diff --git a/jc/parsers/asn1crypto/x509.py b/jc/parsers/asn1crypto/x509.py
index 2279bf53..563fa3bd 100644
--- a/jc/parsers/asn1crypto/x509.py
+++ b/jc/parsers/asn1crypto/x509.py
@@ -15,6 +15,7 @@ Other type classes are defined that help compose the types listed above.
from __future__ import unicode_literals, division, absolute_import, print_function
+from collections import OrderedDict
from contextlib import contextmanager
from encodings import idna # noqa
import hashlib
@@ -26,8 +27,7 @@ import unicodedata
from ._errors import unwrap
from ._iri import iri_to_uri, uri_to_iri
-from ._ordereddict import OrderedDict
-from ._types import type_name, str_cls, bytes_to_list
+from ._types import type_name
from .algos import AlgorithmIdentifier, AnyAlgorithmIdentifier, DigestAlgorithm, SignedDigestAlgorithm
from .core import (
Any,
@@ -100,7 +100,7 @@ class DNSName(IA5String):
A unicode string
"""
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
%s value must be a unicode string, not %s
@@ -131,7 +131,7 @@ class URI(IA5String):
A unicode string
"""
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
%s value must be a unicode string, not %s
@@ -215,7 +215,7 @@ class EmailAddress(IA5String):
A unicode string
"""
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
%s value must be a unicode string, not %s
@@ -323,7 +323,7 @@ class IPAddress(OctetString):
an IPv6 address or IPv6 address with CIDR
"""
- if not isinstance(value, str_cls):
+ if not isinstance(value, str):
raise TypeError(unwrap(
'''
%s value must be a unicode string, not %s
@@ -413,7 +413,7 @@ class IPAddress(OctetString):
if cidr_int is not None:
cidr_bits = '{0:b}'.format(cidr_int)
cidr = len(cidr_bits.rstrip('0'))
- value = value + '/' + str_cls(cidr)
+ value = value + '/' + str(cidr)
self._native = value
return self._native
@@ -2598,7 +2598,7 @@ class Certificate(Sequence):
"""
if self._issuer_serial is None:
- self._issuer_serial = self.issuer.sha256 + b':' + str_cls(self.serial_number).encode('ascii')
+ self._issuer_serial = self.issuer.sha256 + b':' + str(self.serial_number).encode('ascii')
return self._issuer_serial
@property
@@ -2647,7 +2647,7 @@ class Certificate(Sequence):
# We untag the element since it is tagged via being a choice from GeneralName
issuer = issuer.untag()
authority_serial = self.authority_key_identifier_value['authority_cert_serial_number'].native
- self._authority_issuer_serial = issuer.sha256 + b':' + str_cls(authority_serial).encode('ascii')
+ self._authority_issuer_serial = issuer.sha256 + b':' + str(authority_serial).encode('ascii')
else:
self._authority_issuer_serial = None
return self._authority_issuer_serial
@@ -2860,7 +2860,7 @@ class Certificate(Sequence):
with a space between each pair of characters, all uppercase
"""
- return ' '.join('%02X' % c for c in bytes_to_list(self.sha1))
+ return ' '.join('%02X' % c for c in list(self.sha1))
@property
def sha256(self):
@@ -2882,7 +2882,7 @@ class Certificate(Sequence):
with a space between each pair of characters, all uppercase
"""
- return ' '.join('%02X' % c for c in bytes_to_list(self.sha256))
+ return ' '.join('%02X' % c for c in list(self.sha256))
def is_valid_domain_ip(self, domain_ip):
"""
@@ -2896,7 +2896,7 @@ class Certificate(Sequence):
A boolean - if the domain or IP is valid for the certificate
"""
- if not isinstance(domain_ip, str_cls):
+ if not isinstance(domain_ip, str):
raise TypeError(unwrap(
'''
domain_ip must be a unicode string, not %s
diff --git a/jc/parsers/debconf_show.py b/jc/parsers/debconf_show.py
new file mode 100644
index 00000000..a4dfc8d6
--- /dev/null
+++ b/jc/parsers/debconf_show.py
@@ -0,0 +1,149 @@
+"""jc - JSON Convert `debconf-show` command output parser
+
+Usage (cli):
+
+ $ debconf-show onlyoffice-documentserver | jc --debconf-show
+
+or
+
+ $ jc debconf-show onlyoffice-documentserver
+
+Usage (module):
+
+ import jc
+ result = jc.parse('debconf_show', debconf_show_command_output)
+
+Schema:
+
+ [
+ {
+ "asked": boolean,
+ "packagename": string,
+ "name": string,
+ "value": string
+ }
+ ]
+
+Examples:
+
+ $ debconf-show onlyoffice-documentserver | jc --debconf-show -p
+ [
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "jwt_secret",
+ "value": "aL8ei2iereuzee7cuJ6Cahjah1ixee2ah"
+ },
+ {
+ "asked": false,
+ "packagename": "onlyoffice",
+ "name": "db_pwd",
+ "value": "(password omitted)"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "rabbitmq_pwd",
+ "value": "(password omitted)"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "db_port",
+ "value": "5432"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "db_user",
+ "value": "onlyoffice"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "rabbitmq_proto",
+ "value": "amqp"
+ },
+ {
+ "asked": true,
+ "packagename": "onlyoffice",
+ "name": "cluster_mode",
+ "value": "false"
+ }
+ ]
+"""
+from typing import List, Dict
+from jc.jc_types import JSONDictType
+import jc.utils
+
+
+class info():
+ """Provides parser metadata (version, author, etc.)"""
+ version = '1.0'
+ description = '`debconf-show` command parser'
+ author = 'Kelly Brazil'
+ author_email = 'kellyjonbrazil@gmail.com'
+ compatible = ['linux']
+ tags = ['command']
+ magic_commands = ['debconf-show']
+
+
+__version__ = info.version
+
+
+def _process(proc_data: JSONDictType) -> List[JSONDictType]:
+ """
+ Final processing to conform to the schema.
+
+ Parameters:
+
+ proc_data: (Dictionary) raw structured data to process
+
+ Returns:
+
+ List of Dictionaries. Structured to conform to the schema.
+ """
+ return proc_data
+
+
+def parse(
+ data: str,
+ raw: bool = False,
+ quiet: bool = False
+) -> List[JSONDictType]:
+ """
+ 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:
+
+ List of Dictionaries. Raw or processed structured data.
+ """
+ jc.utils.compatibility(__name__, info.compatible, quiet)
+ jc.utils.input_type_check(data)
+
+ raw_output: List = []
+
+ if jc.utils.has_data(data):
+
+ for line in filter(None, data.splitlines()):
+ output_line: Dict = {}
+ splitline = line.split(':', maxsplit=1)
+
+ output_line['asked'] = splitline[0].startswith('*')
+ packagename, key = splitline[0].split('/', maxsplit=1)
+ packagename = packagename[2:]
+ key = key.replace('-', '_')
+ val = splitline[1].strip()
+ output_line['packagename'] = packagename
+ output_line['name'] = key
+ output_line['value'] = val
+
+ raw_output.append(output_line)
+
+ return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/iftop.py b/jc/parsers/iftop.py
new file mode 100644
index 00000000..d3ad9354
--- /dev/null
+++ b/jc/parsers/iftop.py
@@ -0,0 +1,689 @@
+"""jc - JSON Convert `iftop` command output parser
+
+Usage (cli):
+
+ $ iftop -i -t -B -s1 | jc --iftop
+
+Usage (module):
+
+ import jc
+ result = jc.parse('iftop', iftop_command_output)
+
+Schema:
+
+ [
+ {
+ "device": string,
+ "ip_address": string,
+ "mac_address": string,
+ "clients": [
+ {
+ "index": integer,
+ "connections": [
+ {
+ "host_name": string,
+ "host_port": string, # can be service or missing
+ "last_2s": integer,
+ "last_10s": integer,
+ "last_40s": integer,
+ "cumulative": integer,
+ "direction": string
+ }
+ ]
+ }
+ ]
+ "total_send_rate": {
+ "last_2s": integer,
+ "last_10s": integer,
+ "last_40s": integer
+ }
+ "total_receive_rate": {
+ "last_2s": integer,
+ "last_10s": integer,
+ "last_40s": integer
+ }
+ "total_send_and_receive_rate": {
+ "last_2s": integer,
+ "last_10s": integer,
+ "last_40s": integer
+ }
+ "peak_rate": {
+ "last_2s": integer,
+ "last_10s": integer,
+ "last_40s": integer
+ }
+ "cumulative_rate": {
+ "last_2s": integer,
+ "last_10s": integer,
+ "last_40s": integer
+ }
+ }
+ ]
+
+Examples:
+
+ $ iftop -i enp0s3 -t -P -s1 | jc --iftop -p
+ [
+ {
+ "device": "enp0s3",
+ "ip_address": "10.10.15.129",
+ "mac_address": "08:00:27:c0:4a:4f",
+ "clients": [
+ {
+ "index": 1,
+ "connections": [
+ {
+ "host_name": "ubuntu-2004-clean-01",
+ "host_port": "ssh",
+ "last_2s": 448,
+ "last_10s": 448,
+ "last_40s": 448,
+ "cumulative": 112,
+ "direction": "send"
+ },
+ {
+ "host_name": "10.10.15.72",
+ "host_port": "40876",
+ "last_2s": 208,
+ "last_10s": 208,
+ "last_40s": 208,
+ "cumulative": 52,
+ "direction": "receive"
+ }
+ ]
+ }
+ ],
+ "total_send_rate": {
+ "last_2s": 448,
+ "last_10s": 448,
+ "last_40s": 448
+ },
+ "total_receive_rate": {
+ "last_2s": 208,
+ "last_10s": 208,
+ "last_40s": 208
+ },
+ "total_send_and_receive_rate": {
+ "last_2s": 656,
+ "last_10s": 656,
+ "last_40s": 656
+ },
+ "peak_rate": {
+ "last_2s": 448,
+ "last_10s": 208,
+ "last_40s": 656
+ },
+ "cumulative_rate": {
+ "last_2s": 112,
+ "last_10s": 52,
+ "last_40s": 164
+ }
+ }
+ ]
+
+ $ iftop -i enp0s3 -t -P -s1 | jc --iftop -p -r
+ [
+ {
+ "device": "enp0s3",
+ "ip_address": "10.10.15.129",
+ "mac_address": "11:22:33:44:55:66",
+ "clients": [
+ {
+ "index": 1,
+ "connections": [
+ {
+ "host_name": "ubuntu-2004-clean-01",
+ "host_port": "ssh",
+ "last_2s": "448b",
+ "last_10s": "448b",
+ "last_40s": "448b",
+ "cumulative": "112B",
+ "direction": "send"
+ },
+ {
+ "host_name": "10.10.15.72",
+ "host_port": "40876",
+ "last_2s": "208b",
+ "last_10s": "208b",
+ "last_40s": "208b",
+ "cumulative": "52B",
+ "direction": "receive"
+ }
+ ]
+ }
+ ],
+ "total_send_rate": {
+ "last_2s": "448b",
+ "last_10s": "448b",
+ "last_40s": "448b"
+ },
+ "total_receive_rate": {
+ "last_2s": "208b",
+ "last_10s": "208b",
+ "last_40s": "208b"
+ },
+ "total_send_and_receive_rate": {
+ "last_2s": "656b",
+ "last_10s": "656b",
+ "last_40s": "656b"
+ },
+ "peak_rate": {
+ "last_2s": "448b",
+ "last_10s": "208b",
+ "last_40s": "656b"
+ },
+ "cumulative_rate": {
+ "last_2s": "112B",
+ "last_10s": "52B",
+ "last_40s": "164B"
+ }
+ }
+ ]
+"""
+import re
+from typing import List, Dict
+from jc.jc_types import JSONDictType
+import jc.utils
+from collections import namedtuple
+from numbers import Number
+
+
+class info:
+ """Provides parser metadata (version, author, etc.)"""
+ version = "1.0"
+ description = "`iftop` command parser"
+ author = "Ron Green"
+ author_email = "11993626+georgettica@users.noreply.github.com"
+ compatible = ["linux"]
+ tags = ["command"]
+
+
+__version__ = info.version
+
+
+def _process(proc_data: List[JSONDictType], quiet: bool = False) -> List[JSONDictType]:
+ """
+ Final processing to conform to the schema.
+
+ Parameters:
+
+ proc_data: (List of Dictionaries) raw structured data to process
+
+ Returns:
+
+ List of Dictionaries. Structured to conform to the schema.
+ """
+ string_to_bytes_fields = ["last_2s", "last_10s", "last_40s", "cumulative"]
+ one_nesting = [
+ "total_send_rate",
+ "total_receive_rate",
+ "total_send_and_receive_rate",
+ "peak_rate",
+ "cumulative_rate",
+ ]
+
+ if not proc_data:
+ return proc_data
+ for entry in proc_data:
+ # print(f"{entry=}")
+ for entry_key in entry:
+ # print(f"{entry_key=}")
+ if entry_key in one_nesting:
+ # print(f"{entry[entry_key]=}")
+ for one_nesting_item_key in entry[entry_key]:
+ # print(f"{one_nesting_item_key=}")
+ if one_nesting_item_key in string_to_bytes_fields:
+ entry[entry_key][one_nesting_item_key] = _parse_size(entry[entry_key][one_nesting_item_key])
+ elif entry_key == "clients":
+ for client in entry[entry_key]:
+ # print(f"{client=}")
+ if "connections" not in client:
+ continue
+ for connection in client["connections"]:
+ # print(f"{connection=}")
+ for connection_key in connection:
+ # print(f"{connection_key=}")
+ if connection_key in string_to_bytes_fields:
+ connection[connection_key] = _parse_size(connection[connection_key])
+ return proc_data
+
+# _parse_size from https://github.com/xolox/python-humanfriendly
+
+# Copyright (c) 2021 Peter Odding
+
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# Note: this function can be replaced with jc.utils.convert_size_to_int
+# in the future.
+def _parse_size(size, binary=False):
+ """
+ Parse a human readable data size and return the number of bytes.
+
+ :param size: The human readable file size to parse (a string).
+ :param binary: :data:`True` to use binary multiples of bytes (base-2) for
+ ambiguous unit symbols and names, :data:`False` to use
+ decimal multiples of bytes (base-10).
+ :returns: The corresponding size in bytes (an integer).
+ :raises: :exc:`InvalidSize` when the input can't be parsed.
+
+ This function knows how to parse sizes in bytes, kilobytes, megabytes,
+ gigabytes, terabytes and petabytes. Some examples:
+
+ >>> from humanfriendly import parse_size
+ >>> parse_size('42')
+ 42
+ >>> parse_size('13b')
+ 13
+ >>> parse_size('5 bytes')
+ 5
+ >>> parse_size('1 KB')
+ 1000
+ >>> parse_size('1 kilobyte')
+ 1000
+ >>> parse_size('1 KiB')
+ 1024
+ >>> parse_size('1 KB', binary=True)
+ 1024
+ >>> parse_size('1.5 GB')
+ 1500000000
+ >>> parse_size('1.5 GB', binary=True)
+ 1610612736
+ """
+ def tokenize(text):
+ tokenized_input = []
+ for token in re.split(r'(\d+(?:\.\d+)?)', text):
+ token = token.strip()
+ if re.match(r'\d+\.\d+', token):
+ tokenized_input.append(float(token))
+ elif token.isdigit():
+ tokenized_input.append(int(token))
+ elif token:
+ tokenized_input.append(token)
+ return tokenized_input
+
+ SizeUnit = namedtuple('SizeUnit', 'divider, symbol, name')
+ CombinedUnit = namedtuple('CombinedUnit', 'decimal, binary')
+ disk_size_units = (
+ CombinedUnit(SizeUnit(1000**1, 'KB', 'kilobyte'), SizeUnit(1024**1, 'KiB', 'kibibyte')),
+ CombinedUnit(SizeUnit(1000**2, 'MB', 'megabyte'), SizeUnit(1024**2, 'MiB', 'mebibyte')),
+ CombinedUnit(SizeUnit(1000**3, 'GB', 'gigabyte'), SizeUnit(1024**3, 'GiB', 'gibibyte')),
+ CombinedUnit(SizeUnit(1000**4, 'TB', 'terabyte'), SizeUnit(1024**4, 'TiB', 'tebibyte')),
+ CombinedUnit(SizeUnit(1000**5, 'PB', 'petabyte'), SizeUnit(1024**5, 'PiB', 'pebibyte')),
+ CombinedUnit(SizeUnit(1000**6, 'EB', 'exabyte'), SizeUnit(1024**6, 'EiB', 'exbibyte')),
+ CombinedUnit(SizeUnit(1000**7, 'ZB', 'zettabyte'), SizeUnit(1024**7, 'ZiB', 'zebibyte')),
+ CombinedUnit(SizeUnit(1000**8, 'YB', 'yottabyte'), SizeUnit(1024**8, 'YiB', 'yobibyte')),
+ )
+ tokens = tokenize(size)
+ if tokens and isinstance(tokens[0], Number):
+ # Get the normalized unit (if any) from the tokenized input.
+ normalized_unit = tokens[1].lower() if len(tokens) == 2 and isinstance(tokens[1], str) else ''
+ # If the input contains only a number, it's assumed to be the number of
+ # bytes. The second token can also explicitly reference the unit bytes.
+ if len(tokens) == 1 or normalized_unit.startswith('b'):
+ return int(tokens[0])
+ # Otherwise we expect two tokens: A number and a unit.
+ if normalized_unit:
+ # Convert plural units to singular units, for details:
+ # https://github.com/xolox/python-humanfriendly/issues/26
+ normalized_unit = normalized_unit.rstrip('s')
+ for unit in disk_size_units:
+ # First we check for unambiguous symbols (KiB, MiB, GiB, etc)
+ # and names (kibibyte, mebibyte, gibibyte, etc) because their
+ # handling is always the same.
+ if normalized_unit in (unit.binary.symbol.lower(), unit.binary.name.lower()):
+ return int(tokens[0] * unit.binary.divider)
+ # Now we will deal with ambiguous prefixes (K, M, G, etc),
+ # symbols (KB, MB, GB, etc) and names (kilobyte, megabyte,
+ # gigabyte, etc) according to the caller's preference.
+ if (normalized_unit in (unit.decimal.symbol.lower(), unit.decimal.name.lower()) or
+ normalized_unit.startswith(unit.decimal.symbol[0].lower())):
+ return int(tokens[0] * (unit.binary.divider if binary else unit.decimal.divider))
+ # We failed to parse the size specification.
+ return None
+
+
+def parse(data: str, raw: bool = False, quiet: bool = False) -> List[JSONDictType]:
+ """
+ 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:
+
+ List of Dictionaries. Raw or processed structured data.
+ """
+ jc.utils.compatibility(__name__, info.compatible, quiet)
+ jc.utils.input_type_check(data)
+
+ raw_output: List[Dict] = []
+ interface_item: Dict = {}
+ current_client: Dict = {}
+ clients: List = []
+ is_previous_line_interface = False
+ saw_already_host_line = False
+
+ before_arrow = r"\s+(?P\d+)\s+(?P[^\s]+):(?P[^\s]+)\s+"
+ before_arrow_no_port = r"\s+(?P\d+)\s+(?P[^\s]+)\s+"
+ after_arrow_before_newline = r"\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)"
+ newline_before_arrow = r"\s+(?P.+):(?P\w+)\s+"
+ newline_before_arrow_no_port = r"\s+(?P.+)\s+"
+ after_arrow_till_end = r"\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)"
+ re_linux_clients_before_newline = re.compile(
+ rf"{before_arrow}=>{after_arrow_before_newline}"
+ )
+ re_linux_clients_before_newline_no_port = re.compile(
+ rf"{before_arrow_no_port}=>{after_arrow_before_newline}"
+ )
+ re_linux_clients_after_newline_no_port = re.compile(
+ rf"{newline_before_arrow_no_port}<={after_arrow_till_end}"
+ )
+
+ re_linux_clients_after_newline = re.compile(
+ rf"{newline_before_arrow}<={after_arrow_till_end}"
+ )
+
+ re_total_send_rate = re.compile(
+ r"Total send rate:\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)"
+ )
+ re_total_receive_rate = re.compile(
+ r"Total receive rate:\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)"
+ )
+ re_total_send_and_receive_rate = re.compile(
+ r"Total send and receive rate:\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)"
+ )
+ re_peak_rate = re.compile(
+ r"Peak rate \(sent/received/total\):\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)"
+ )
+ re_cumulative_rate = re.compile(
+ r"Cumulative \(sent/received/total\):\s+(?P[^\s]+)\s+(?P[^\s]+)\s+(?P[^\s]+)"
+ )
+
+ jc.utils.compatibility(__name__, info.compatible, quiet)
+ jc.utils.input_type_check(data)
+
+ if not jc.utils.has_data(data):
+ return raw_output if raw else _process(raw_output, quiet=quiet)
+
+ for line in filter(None, data.splitlines()):
+ if line.startswith("interface:"):
+ # Example:
+ # interface: enp0s3
+ interface_item["device"] = line.split(":")[1].strip()
+
+ elif line.startswith("IP address is:"):
+ # Example:
+ # IP address is: 10.10.15.129
+ interface_item["ip_address"] = line.split(":")[1].strip()
+
+ elif line.startswith("MAC address is:"):
+ # Example:
+ # MAC address is: 08:00:27:c0:4a:4f
+ # strip off the "MAC address is: " part
+ data_without_front_list = line.split(":")[1:]
+
+ # join the remaining parts back together
+ data_without_front = ":".join(data_without_front_list)
+ interface_item["mac_address"] = data_without_front.strip()
+
+ elif line.startswith("Listening on"):
+ # Example:
+ # Listening on enp0s3
+ pass
+
+ elif (
+ line.startswith("# Host name (port/service if enabled)")
+ and not saw_already_host_line
+ ):
+ saw_already_host_line = True
+ # Example:
+ # # Host name (port/service if enabled) last 2s last 10s last 40s cumulative
+ pass
+
+ elif (
+ line.startswith("# Host name (port/service if enabled)")
+ and saw_already_host_line
+ ):
+ old_interface_item, interface_item = interface_item, {}
+ interface_item.update(
+ {
+ "device": old_interface_item["device"],
+ "ip_address": old_interface_item["ip_address"],
+ "mac_address": old_interface_item["mac_address"],
+ }
+ )
+
+ elif "=>" in line and is_previous_line_interface and ":" in line:
+ # should not happen
+ pass
+
+ elif "=>" in line and not is_previous_line_interface and ":" in line:
+ # Example:
+ # 1 ubuntu-2004-clean-01:ssh => 448b 448b 448b 112B
+ is_previous_line_interface = True
+ match_raw = re_linux_clients_before_newline.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ current_client = {}
+ current_client["index"] = int(match_dict["index"])
+ current_client["connections"] = []
+ current_client_send = {
+ "host_name": match_dict["host_name"],
+ "host_port": match_dict["host_port"],
+ "last_2s": match_dict["send_last_2s"],
+ "last_10s": match_dict["send_last_10s"],
+ "last_40s": match_dict["send_last_40s"],
+ "cumulative": match_dict["send_cumulative"],
+ "direction": "send",
+ }
+ current_client["connections"].append(current_client_send)
+ # not adding yet as the receive part is not yet parsed
+
+ elif "=>" in line and not is_previous_line_interface and ":" not in line:
+ # should not happen
+ pass
+
+ elif "=>" in line and is_previous_line_interface and ":" not in line:
+ is_previous_line_interface = True
+ match_raw = re_linux_clients_before_newline_no_port.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ current_client = {}
+ current_client["index"] = int(match_dict["index"])
+ current_client["connections"] = []
+ current_client_send = {
+ "host_name": match_dict["host_name"],
+ "last_2s": match_dict["send_last_2s"],
+ "last_10s": match_dict["send_last_10s"],
+ "last_40s": match_dict["send_last_40s"],
+ "cumulative": match_dict["send_cumulative"],
+ "direction": "send",
+ }
+ current_client["connections"].append(current_client_send)
+ # not adding yet as the receive part is not yet parsed
+
+ elif "<=" in line and not is_previous_line_interface and ":" in line:
+ # should not happen
+ pass
+
+ elif "<=" in line and is_previous_line_interface and ":" in line:
+ # Example:
+ # 10.10.15.72:40876 <= 208b 208b 208b 52B
+ is_previous_line_interface = False
+ match_raw = re_linux_clients_after_newline.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ current_client_receive = {
+ "host_name": match_dict["receive_ip"],
+ "host_port": match_dict["receive_port"],
+ "last_2s": match_dict["receive_last_2s"],
+ "last_10s": match_dict["receive_last_10s"],
+ "last_40s": match_dict["receive_last_40s"],
+ "cumulative": match_dict["receive_cumulative"],
+ "direction": "receive",
+ }
+
+ current_client["connections"].append(current_client_receive)
+ clients.append(current_client)
+
+ elif "<=" in line and not is_previous_line_interface and ":" not in line:
+ # should not happen
+ pass
+
+ elif "<=" in line and is_previous_line_interface and ":" not in line:
+ # Example:
+ # 10.10.15.72:40876 <= 208b 208b 208b 52B
+ is_previous_line_interface = False
+ match_raw = re_linux_clients_after_newline_no_port.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ current_client_receive = {
+ "host_name": match_dict["receive_ip"],
+ "last_2s": match_dict["receive_last_2s"],
+ "last_10s": match_dict["receive_last_10s"],
+ "last_40s": match_dict["receive_last_40s"],
+ "cumulative": match_dict["receive_cumulative"],
+ "direction": "receive",
+ }
+
+ current_client["connections"].append(current_client_receive)
+ clients.append(current_client)
+
+ # check if all of the characters are dashes or equal signs
+ elif all(c == "-" for c in line):
+ pass
+
+ elif line.startswith("Total send rate"):
+ # Example:
+ # Total send rate: 448b 448b 448b
+ match_raw = re_total_send_rate.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ interface_item["total_send_rate"] = {}
+ interface_item["total_send_rate"].update(
+ {
+ "last_2s": match_dict["total_send_rate_last_2s"],
+ "last_10s": match_dict["total_send_rate_last_10s"],
+ "last_40s": match_dict["total_send_rate_last_40s"],
+ }
+ )
+
+ elif line.startswith("Total receive rate"):
+ # Example:
+ # Total receive rate: 208b 208b 208b
+ match_raw = re_total_receive_rate.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ interface_item["total_receive_rate"] = {}
+ interface_item["total_receive_rate"].update(
+ {
+ "last_2s": match_dict["total_receive_rate_last_2s"],
+ "last_10s": match_dict["total_receive_rate_last_10s"],
+ "last_40s": match_dict["total_receive_rate_last_40s"],
+ }
+ )
+
+ elif line.startswith("Total send and receive rate"):
+ # Example:
+ # Total send and receive rate: 656b 656b 656b
+ match_raw = re_total_send_and_receive_rate.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ interface_item["total_send_and_receive_rate"] = {}
+ interface_item["total_send_and_receive_rate"].update(
+ {
+ "last_2s": match_dict["total_send_and_receive_rate_last_2s"],
+ "last_10s": match_dict["total_send_and_receive_rate_last_10s"],
+ "last_40s": match_dict["total_send_and_receive_rate_last_40s"],
+ }
+ )
+
+ elif line.startswith("Peak rate"):
+ match_raw = re_peak_rate.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ interface_item["peak_rate"] = {}
+ interface_item["peak_rate"].update(
+ {
+ "last_2s": match_dict["peak_rate_sent"],
+ "last_10s": match_dict["peak_rate_received"],
+ "last_40s": match_dict["peak_rate_total"],
+ }
+ )
+
+ elif line.startswith("Cumulative"):
+ match_raw = re_cumulative_rate.match(line)
+
+ if not match_raw:
+ # this is a bug in iftop
+ continue
+
+ match_dict = match_raw.groupdict()
+ interface_item["cumulative_rate"] = {}
+ interface_item["cumulative_rate"].update(
+ {
+ "last_2s": match_dict["cumulative_rate_sent"],
+ "last_10s": match_dict["cumulative_rate_received"],
+ "last_40s": match_dict["cumulative_rate_total"],
+ }
+ )
+
+ elif all(c == "=" for c in line):
+ interface_item["clients"] = clients
+ clients = []
+ # keep the copy here as without it keeps the objects linked
+ raw_output.append(interface_item.copy())
+
+ return raw_output if raw else _process(raw_output, quiet=quiet)
diff --git a/jc/parsers/iptables.py b/jc/parsers/iptables.py
index 7a1d45b2..307315a8 100644
--- a/jc/parsers/iptables.py
+++ b/jc/parsers/iptables.py
@@ -25,7 +25,7 @@ Schema:
"num" integer,
"pkts": integer,
"bytes": integer, # converted based on suffix
- "target": string,
+ "target": string, # Null if blank
"prot": string,
"opt": string, # "--" = Null
"in": string,
@@ -163,7 +163,7 @@ import jc.utils
class info():
"""Provides parser metadata (version, author, etc.)"""
- version = '1.8'
+ version = '1.9'
description = '`iptables` command parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
@@ -222,6 +222,10 @@ def _process(proc_data):
if rule['opt'] == '--':
rule['opt'] = None
+ if 'target' in rule:
+ if rule['target'] == '':
+ rule['target'] = None
+
return proc_data
@@ -271,15 +275,18 @@ def parse(data, raw=False, quiet=False):
continue
else:
+ # sometimes the "target" column is blank. Stuff in a dummy character
+ if headers[0] == 'target' and line.startswith(' '):
+ line = '\u2063' + line
+
rule = line.split(maxsplit=len(headers) - 1)
temp_rule = dict(zip(headers, rule))
if temp_rule:
+ if temp_rule.get('target') == '\u2063':
+ temp_rule['target'] = ''
chain['rules'].append(temp_rule)
if chain:
raw_output.append(chain)
- if raw:
- return raw_output
- else:
- return _process(raw_output)
+ return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/iso_datetime.py b/jc/parsers/iso_datetime.py
deleted file mode 100644
index b4294e9e..00000000
--- a/jc/parsers/iso_datetime.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""jc - JSON Convert ISO 8601 Datetime string parser
-
-This parser has been renamed to datetime-iso (cli) or datetime_iso (module).
-
-This parser will be removed in a future version, so please start using
-the new parser name.
-"""
-from jc.parsers import datetime_iso
-import jc.utils
-
-
-class info():
- """Provides parser metadata (version, author, etc.)"""
- version = '1.1'
- description = 'Deprecated - please use datetime-iso'
- author = 'Kelly Brazil'
- author_email = 'kellyjonbrazil@gmail.com'
- details = 'Deprecated - please use datetime-iso'
- compatible = ['linux', 'aix', 'freebsd', 'darwin', 'win32', 'cygwin']
- tags = ['standard', 'string']
- deprecated = True
-
-
-__version__ = info.version
-
-
-def parse(data, raw=False, quiet=False):
- """
- This parser is deprecated and calls datetime_iso. Please use datetime_iso
- directly. This parser will be removed in the future.
-
- Parameters:
-
- data: (string) text data to parse
- raw: (boolean) unprocessed output if True
- quiet: (boolean) suppress warning messages if True
-
- Returns:
-
- Dictionary. Raw or processed structured data.
- """
- jc.utils.warning_message([
- 'iso-datetime parser is deprecated. Please use datetime-iso instead.'
- ])
-
- return datetime_iso.parse(data, raw=raw, quiet=quiet)
diff --git a/jc/parsers/mount.py b/jc/parsers/mount.py
index ef8a49dc..945ed81a 100644
--- a/jc/parsers/mount.py
+++ b/jc/parsers/mount.py
@@ -70,12 +70,14 @@ Example:
...
]
"""
+import re
+
import jc.utils
class info():
"""Provides parser metadata (version, author, etc.)"""
- version = '1.8'
+ version = '1.9'
description = '`mount` command parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
@@ -133,14 +135,26 @@ def _linux_parse(data):
for entry in data:
output_line = {}
- parsed_line = entry.split()
- output_line['filesystem'] = parsed_line[0]
- output_line['mount_point'] = parsed_line[2]
- output_line['type'] = parsed_line[4]
- output_line['options'] = parsed_line[5].lstrip('(').rstrip(')').split(',')
+ pattern = re.compile(
+ r'''
+ (?P\S+)\s+
+ on\s+
+ (?P.*?)\s+
+ type\s+
+ (?P\S+)\s+
+ \((?P.*?)\)\s*''',
+ re.VERBOSE)
- output.append(output_line)
+ match = pattern.match(entry)
+ groups = match.groupdict()
+
+ if groups:
+ output_line['filesystem'] = groups["filesystem"]
+ output_line['mount_point'] = groups["mount_point"]
+ output_line['type'] = groups["type"]
+ output_line['options'] = groups["options"].split(',')
+ output.append(output_line)
return output
diff --git a/jc/parsers/pbPlist/StrParse.py b/jc/parsers/pbPlist/StrParse.py
index 5c981bfb..6541c9c9 100644
--- a/jc/parsers/pbPlist/StrParse.py
+++ b/jc/parsers/pbPlist/StrParse.py
@@ -28,12 +28,12 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
# OF THE POSSIBILITY OF SUCH DAMAGE.
-import sys
import string
-if sys.version_info >= (3, 0):
- def unichr(character): # pylint: disable=redefined-builtin
- return chr(character)
+
+def unichr(character): # pylint: disable=redefined-builtin
+ return chr(character)
+
def ConvertNEXTSTEPToUnicode(hex_digits):
# taken from http://ftp.unicode.org/Public/MAPPINGS/VENDORS/NEXT/NEXTSTEP.TXT
diff --git a/jc/parsers/pbPlist/pbParser.py b/jc/parsers/pbPlist/pbParser.py
index 8d47fa55..b6d8c60e 100644
--- a/jc/parsers/pbPlist/pbParser.py
+++ b/jc/parsers/pbPlist/pbParser.py
@@ -64,12 +64,10 @@ def GetFileEncoding(path):
def OpenFileWithEncoding(file_path, encoding):
return codecs.open(file_path, 'r', encoding=encoding, errors='ignore')
-if sys.version_info < (3, 0):
- def OpenFile(file_path):
- return open(file_path, 'rb')
-else:
- def OpenFile(file_path):
- return open(file_path, 'br')
+
+def OpenFile(file_path):
+ return open(file_path, 'rb')
+
class PBParser(object):
diff --git a/jc/parsers/pbPlist/pbRoot.py b/jc/parsers/pbPlist/pbRoot.py
index 180f3597..a9f857df 100644
--- a/jc/parsers/pbPlist/pbRoot.py
+++ b/jc/parsers/pbPlist/pbRoot.py
@@ -32,7 +32,7 @@ import sys
from functools import cmp_to_key
# for python 3.10+ compatibility
-if sys.version_info.major == 3 and sys.version_info.minor >= 10:
+if sys.version_info >= (3, 10):
import collections
setattr(collections, "MutableMapping", collections.abc.MutableMapping)
diff --git a/jc/parsers/pkg_index_apk.py b/jc/parsers/pkg_index_apk.py
new file mode 100644
index 00000000..3dd228dd
--- /dev/null
+++ b/jc/parsers/pkg_index_apk.py
@@ -0,0 +1,220 @@
+"""jc - JSON Convert Alpine Linux Package Index files
+
+Usage (cli):
+
+ $ cat APKINDEX | jc --pkg-index-apk
+
+Usage (module):
+
+ import jc
+ result = jc.parse('pkg_index_apk', pkg_index_apk_output)
+
+Schema:
+
+ [
+ {
+ "checksum": string,
+ "package": string,
+ "version": string,
+ "architecture": string,
+ "package_size": integer,
+ "installed_size": integer,
+ "description": string,
+ "url": string,
+ "license": string,
+ "origin": string,
+ "maintainer": {
+ "name": string,
+ "email": string,
+ },
+ "build_time": integer,
+ "commit": string,
+ "provider_priority": string,
+ "dependencies": [
+ string
+ ],
+ "provides": [
+ string
+ ],
+ "install_if": [
+ string
+ ],
+ }
+ ]
+
+Example:
+
+ $ cat APKINDEX | jc --pkg-index-apk
+ [
+ {
+ "checksum": "Q1znBl9k+RKgY6gl5Eg3iz73KZbLY=",
+ "package": "yasm",
+ "version": "1.3.0-r4",
+ "architecture": "x86_64",
+ "package_size": 772109,
+ "installed_size": 1753088,
+ "description": "A rewrite of NASM to allow for multiple synta...",
+ "url": "http://www.tortall.net/projects/yasm/",
+ "license": "BSD-2-Clause",
+ "origin": "yasm",
+ "maintainer": {
+ "name": "Natanael Copa",
+ "email": "ncopa@alpinelinux.org"
+ },
+ "build_time": 1681228881,
+ "commit": "84a227baf001b6e0208e3352b294e4d7a40e93de",
+ "dependencies": [
+ "so:libc.musl-x86_64.so.1"
+ ],
+ "provides": [
+ "cmd:vsyasm=1.3.0-r4",
+ "cmd:yasm=1.3.0-r4",
+ "cmd:ytasm=1.3.0-r4"
+ ]
+ }
+ ]
+
+ $ cat APKINDEX | jc --pkg-index-apk --raw
+ [
+ {
+ "C": "Q1znBl9k+RKgY6gl5Eg3iz73KZbLY=",
+ "P": "yasm",
+ "V": "1.3.0-r4",
+ "A": "x86_64",
+ "S": "772109",
+ "I": "1753088",
+ "T": "A rewrite of NASM to allow for multiple syntax supported...",
+ "U": "http://www.tortall.net/projects/yasm/",
+ "L": "BSD-2-Clause",
+ "o": "yasm",
+ "m": "Natanael Copa ",
+ "t": "1681228881",
+ "c": "84a227baf001b6e0208e3352b294e4d7a40e93de",
+ "D": "so:libc.musl-x86_64.so.1",
+ "p": "cmd:vsyasm=1.3.0-r4 cmd:yasm=1.3.0-r4 cmd:ytasm=1.3.0-r4"
+ },
+ ]
+"""
+import re
+from typing import List, Dict, Union
+import jc.utils
+
+
+class info:
+ """Provides parser metadata (version, author, etc.)"""
+ version = "1.0"
+ description = "Alpine Linux Package Index file parser"
+ author = "Roey Darwish Dror"
+ author_email = "roey.ghost@gmail.com"
+ compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd']
+ tags = ['standard', 'file', 'string']
+
+
+__version__ = info.version
+
+
+_KEY = {
+ "C": "checksum",
+ "P": "package",
+ "V": "version",
+ "A": "architecture",
+ "S": "package_size",
+ "I": "installed_size",
+ "T": "description",
+ "U": "url",
+ "L": "license",
+ "o": "origin",
+ "m": "maintainer",
+ "t": "build_time",
+ "c": "commit",
+ "k": "provider_priority",
+ "D": "dependencies",
+ "p": "provides",
+ "i": "install_if"
+}
+
+def _value(key: str, value: str) -> Union[str, int, List[str], Dict[str, str]]:
+ """
+ Convert value to the appropriate type
+
+ Parameters:
+
+ key: (string) key name
+ value: (string) value to convert
+
+ Returns:
+
+ Converted value
+ """
+ if key in ['S', 'I', 't', 'k']:
+ return int(value)
+
+ if key in ['D', 'p', 'i']:
+ splitted = value.split(' ')
+ return splitted
+
+ if key == "m":
+ m = re.match(r'(.*) <(.*)>', value)
+ if m:
+ return {'name': m.group(1), 'email': m.group(2)}
+ else:
+ return {'name': value}
+
+ return value
+
+
+def _process(proc_data: List[Dict]) -> List[Dict]:
+ """
+ Final processing to conform to the schema.
+
+ Parameters:
+
+ proc_data: (List of Dictionaries) raw structured data to process
+
+ Returns:
+
+ List of Dictionaries. Structured to conform to the schema.
+ """
+ return [{_KEY.get(k, k): _value(k, v) for k, v in d.items()} for d in proc_data]
+
+
+def parse(data: str, raw: bool = False, quiet: bool = False) -> List[Dict]:
+ """
+ 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:
+
+ List of Dictionaries. Raw or processed structured data.
+ """
+ jc.utils.compatibility(__name__, info.compatible, quiet)
+ jc.utils.input_type_check(data)
+
+ raw_output: List[dict] = []
+
+ package: Dict = {}
+ if jc.utils.has_data(data):
+ lines = iter(data.splitlines())
+ for line in lines:
+ line = line.strip()
+ if not line:
+ if package:
+ raw_output.append(package)
+ package = {}
+
+ continue
+
+ key = line[0]
+ value = line[2:].strip()
+ assert key not in package
+ package[key] = value
+
+ if package:
+ raw_output.append(package)
+
+ return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/pkg_index_deb.py b/jc/parsers/pkg_index_deb.py
new file mode 100644
index 00000000..2c759bd2
--- /dev/null
+++ b/jc/parsers/pkg_index_deb.py
@@ -0,0 +1,148 @@
+"""jc - JSON Convert Debian Package Index file parser
+
+Usage (cli):
+
+ $ cat Packages | jc --pkg-index-deb
+
+Usage (module):
+
+ import jc
+ result = jc.parse('pkg_index_deb', pkg_index_deb_output)
+
+Schema:
+
+ [
+ {
+ "package": string,
+ "version": string,
+ "architecture": string,
+ "section": string,
+ "priority": string,
+ "installed_size": integer,
+ "maintainer": string,
+ "description": string,
+ "homepage": string,
+ "depends": string,
+ "conflicts": string,
+ "replaces": string,
+ "vcs_git": string,
+ "sha256": string,
+ "size": integer,
+ "vcs_git": string,
+ "filename": string
+ }
+ ]
+
+Examples:
+
+ $ cat Packages | jc --pkg-index-deb
+ [
+ {
+ "package": "aspnetcore-runtime-2.1",
+ "version": "2.1.22-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "standard",
+ "installed_size": 71081,
+ "maintainer": "Microsoft ",
+ "description": "Microsoft ASP.NET Core 2.1.22 Shared Framework",
+ "homepage": "https://www.asp.net/",
+ "depends": "libc6 (>= 2.14), dotnet-runtime-2.1 (>= 2.1.22)",
+ "sha256": "48d4e78a7ceff34105411172f4c3e91a0359b3929d84d26a493...",
+ "size": 21937036,
+ "filename": "pool/main/a/aspnetcore-runtime-2.1/aspnetcore-run..."
+ },
+ {
+ "package": "azure-functions-core-tools-4",
+ "version": "4.0.4590-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "optional",
+ "maintainer": "Ahmed ElSayed ",
+ "description": "Azure Function Core Tools v4",
+ "homepage": "https://docs.microsoft.com/en-us/azure/azure-func...",
+ "conflicts": "azure-functions-core-tools-2, azure-functions-co...",
+ "replaces": "azure-functions-core-tools-2, azure-functions-cor...",
+ "vcs_git": "https://github.com/Azure/azure-functions-core-tool...",
+ "sha256": "a2a4f99d6d98ba0a46832570285552f2a93bab06cebbda2afc7...",
+ "size": 124417844,
+ "filename": "pool/main/a/azure-functions-core-tools-4/azure-fu..."
+ }
+ ]
+
+ $ cat Packages | jc --pkg-index-deb -r
+ [
+ {
+ "package": "aspnetcore-runtime-2.1",
+ "version": "2.1.22-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "standard",
+ "installed_size": "71081",
+ "maintainer": "Microsoft ",
+ "description": "Microsoft ASP.NET Core 2.1.22 Shared Framework",
+ "homepage": "https://www.asp.net/",
+ "depends": "libc6 (>= 2.14), dotnet-runtime-2.1 (>= 2.1.22)",
+ "sha256": "48d4e78a7ceff34105411172f4c3e91a0359b3929d84d26a493...",
+ "size": "21937036",
+ "filename": "pool/main/a/aspnetcore-runtime-2.1/aspnetcore-run..."
+ },
+ {
+ "package": "azure-functions-core-tools-4",
+ "version": "4.0.4590-1",
+ "architecture": "amd64",
+ "section": "devel",
+ "priority": "optional",
+ "maintainer": "Ahmed ElSayed ",
+ "description": "Azure Function Core Tools v4",
+ "homepage": "https://docs.microsoft.com/en-us/azure/azure-func...",
+ "conflicts": "azure-functions-core-tools-2, azure-functions-co...",
+ "replaces": "azure-functions-core-tools-2, azure-functions-cor...",
+ "vcs_git": "https://github.com/Azure/azure-functions-core-tool...",
+ "sha256": "a2a4f99d6d98ba0a46832570285552f2a93bab06cebbda2afc7...",
+ "size": "124417844",
+ "filename": "pool/main/a/azure-functions-core-tools-4/azure-fu..."
+ }
+ ]
+"""
+from typing import List
+from jc.jc_types import JSONDictType
+import jc.parsers.rpm_qi as rpm_qi
+
+
+class info():
+ """Provides parser metadata (version, author, etc.)"""
+ version = '1.0'
+ description = 'Debian Package Index file parser'
+ author = 'Kelly Brazil'
+ author_email = 'kellyjonbrazil@gmail.com'
+ details = 'Using the rpm-qi parser'
+ compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd']
+ tags = ['file']
+
+
+__version__ = info.version
+
+
+def parse(
+ data: str,
+ raw: bool = False,
+ quiet: bool = False
+) -> List[JSONDictType]:
+ """
+ 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:
+
+ List of Dictionaries. Raw or processed structured data.
+ """
+ # This parser is an alias of rpm_qi.py
+ rpm_qi.info.compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd']
+ rpm_qi.info.tags = ['file']
+ return rpm_qi.parse(data, raw, quiet)
diff --git a/jc/parsers/proc.py b/jc/parsers/proc.py
index 7d2ac8b1..46e64370 100644
--- a/jc/parsers/proc.py
+++ b/jc/parsers/proc.py
@@ -120,7 +120,7 @@ from jc.exceptions import ParseError
class info():
"""Provides parser metadata (version, author, etc.)"""
- version = '1.1'
+ version = '1.2'
description = '`/proc/` file parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
@@ -154,6 +154,7 @@ def parse(
if jc.utils.has_data(data):
# signatures
buddyinfo_p = re.compile(r'^Node \d+, zone\s+\w+\s+(?:\d+\s+){11}\n')
+ cmdline_p = re.compile(r'^BOOT_IMAGE=')
consoles_p = re.compile(r'^\w+\s+[\-WUR]{3} \([ECBpba ]+\)\s+\d+:\d+\n')
cpuinfo_p = re.compile(r'^processor\t+: \d+.*bogomips\t+: \d+.\d\d\n', re.DOTALL)
crypto_p = re.compile(r'^name\s+:.*\ndriver\s+:.*\nmodule\s+:.*\n')
@@ -212,6 +213,7 @@ def parse(
procmap = {
buddyinfo_p: 'proc_buddyinfo',
+ cmdline_p: 'proc_cmdline',
consoles_p: 'proc_consoles',
cpuinfo_p: 'proc_cpuinfo',
crypto_p: 'proc_crypto',
diff --git a/jc/parsers/proc_cmdline.py b/jc/parsers/proc_cmdline.py
new file mode 100644
index 00000000..d4bf3d4f
--- /dev/null
+++ b/jc/parsers/proc_cmdline.py
@@ -0,0 +1,138 @@
+"""jc - JSON Convert `/proc/cmdline` file parser
+
+Usage (cli):
+
+ $ cat /proc/cmdline | jc --proc
+
+or
+
+ $ jc /proc/cmdline
+
+or
+
+ $ cat /proc/cmdline | jc --proc-cmdline
+
+Usage (module):
+
+ import jc
+ result = jc.parse('proc_cmdline', proc_cmdline_file)
+
+Schema:
+
+ {
+ "": string,
+ "_options": [
+ string
+ ]
+ }
+
+Examples:
+
+ $ cat /proc/cmdline | jc --proc -p
+ {
+ "BOOT_IMAGE": "clonezilla/live/vmlinuz",
+ "consoleblank": "0",
+ "keyboard-options": "grp:ctrl_shift_toggle,lctrl_shift_toggle",
+ "ethdevice-timeout": "130",
+ "toram": "filesystem.squashfs",
+ "boot": "live",
+ "edd": "on",
+ "ocs_daemonon": "ssh lighttpd",
+ "ocs_live_run": "sudo screen /usr/sbin/ocs-sr -g auto -e1 auto -e2 -batch -r -j2 -k -scr -p true restoreparts win7-64 sda1",
+ "ocs_live_extra_param": "",
+ "keyboard-layouts": "us,ru",
+ "ocs_live_batch": "no",
+ "locales": "ru_RU.UTF-8",
+ "vga": "788",
+ "net.ifnames": "0",
+ "union": "overlay",
+ "fetch": "http://10.1.1.1/tftpboot/clonezilla/live/filesystem.squashfs",
+ "ocs_postrun99": "sudo reboot",
+ "initrd": "clonezilla/live/initrd.img",
+ "_options": [
+ "config",
+ "noswap",
+ "nolocales",
+ "nomodeset",
+ "noprompt",
+ "nosplash",
+ "nodmraid",
+ "components"
+ ]
+ }
+"""
+import shlex
+from typing import List, Dict
+from jc.jc_types import JSONDictType
+import jc.utils
+
+
+class info():
+ """Provides parser metadata (version, author, etc.)"""
+ version = '1.0'
+ description = '`/proc/cmdline` file parser'
+ author = 'Kelly Brazil'
+ author_email = 'kellyjonbrazil@gmail.com'
+ compatible = ['linux']
+ tags = ['file']
+ hidden = True
+
+
+__version__ = info.version
+
+
+def _process(proc_data: JSONDictType) -> JSONDictType:
+ """
+ Final processing to conform to the schema.
+
+ Parameters:
+
+ proc_data: (List of Dictionaries) raw structured data to process
+
+ Returns:
+
+ Dictionary. Structured to conform to the schema.
+ """
+ return proc_data
+
+
+def parse(
+ data: str,
+ raw: bool = False,
+ quiet: bool = False
+) -> JSONDictType:
+ """
+ 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:
+
+ Dictionary. Raw or processed structured data.
+ """
+ jc.utils.compatibility(__name__, info.compatible, quiet)
+ jc.utils.input_type_check(data)
+
+ raw_output: Dict = {}
+ options: List = []
+
+ if jc.utils.has_data(data):
+
+ split_line = shlex.split(data)
+
+ for item in split_line:
+ if '=' in item:
+ key, val = item.split('=', maxsplit=1)
+ raw_output[key] = val
+
+ else:
+ options.append(item)
+
+ if options:
+ raw_output['_options'] = options
+
+ return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/rpm_qi.py b/jc/parsers/rpm_qi.py
index bcdfa4eb..3251c38b 100644
--- a/jc/parsers/rpm_qi.py
+++ b/jc/parsers/rpm_qi.py
@@ -161,7 +161,7 @@ import jc.utils
class info():
"""Provides parser metadata (version, author, etc.)"""
- version = '1.6'
+ version = '1.7'
description = '`rpm -qi` command parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
@@ -185,7 +185,7 @@ def _process(proc_data):
List of Dictionaries. Structured data to conform to the schema.
"""
- int_list = {'epoch', 'size'}
+ int_list = {'epoch', 'size', 'installed_size'}
for entry in proc_data:
for key in entry:
@@ -234,7 +234,7 @@ def parse(data, raw=False, quiet=False):
for line in filter(None, data.splitlines()):
split_line = line.split(': ', maxsplit=1)
- if split_line[0].startswith('Name') and len(split_line) == 2:
+ if (split_line[0].startswith('Name') or split_line[0] == 'Package') and len(split_line) == 2:
this_entry = split_line[1].strip()
if this_entry != last_entry:
@@ -247,7 +247,7 @@ def parse(data, raw=False, quiet=False):
desc_entry = False
if len(split_line) == 2:
- entry_obj[split_line[0].strip().lower().replace(' ', '_')] = split_line[1].strip()
+ entry_obj[split_line[0].strip().lower().replace(' ', '_').replace('-', '_')] = split_line[1].strip()
if line.startswith('Description :'):
desc_entry = True
diff --git a/jc/parsers/swapon.py b/jc/parsers/swapon.py
new file mode 100644
index 00000000..180be925
--- /dev/null
+++ b/jc/parsers/swapon.py
@@ -0,0 +1,173 @@
+"""jc - JSON Convert `swapon` command output parser
+
+Usage (cli):
+
+ $ swapon | jc --swapon
+
+or
+
+ $ jc swapon
+
+Usage (module):
+
+ import jc
+ result = jc.parse('swapon', swapon_command_output)
+
+Schema:
+
+ [
+ {
+ "name": string,
+ "type": string,
+ "size": integer,
+ "used": integer,
+ "priority": integer
+ }
+ ]
+
+Example:
+
+ $ swapon | jc --swapon
+ [
+ {
+ "name": "/swapfile",
+ "type": "file",
+ "size": 1073741824,
+ "used": 0,
+ "priority": -2
+ }
+ ]
+"""
+from enum import Enum
+from jc.exceptions import ParseError
+import jc.utils
+from typing import List, Dict, Union
+
+
+class info:
+ """Provides parser metadata (version, author, etc.)"""
+ version = "1.0"
+ description = "`swapon` command parser"
+ author = "Roey Darwish Dror"
+ author_email = "roey.ghost@gmail.com"
+ compatible = ["linux", "freebsd"]
+ magic_commands = ["swapon"]
+ tags = ["command"]
+
+
+__version__ = info.version
+
+_Value = Union[str, int]
+_Entry = Dict[str, _Value]
+
+
+class _Column(Enum):
+ NAME = "name"
+ TYPE = "type"
+ SIZE = "size"
+ USED = "used"
+ PRIO = "priority"
+ LABEL = "label"
+ UUID = "uuid"
+
+ @classmethod
+ def from_header(cls, header: str) -> "_Column":
+ if (header == "NAME") or (header == "Filename"):
+ return cls.NAME
+ elif (header == "TYPE") or (header == "Type"):
+ return cls.TYPE
+ elif (header == "SIZE") or (header == "Size"):
+ return cls.SIZE
+ elif (header == "USED") or (header == "Used"):
+ return cls.USED
+ elif (header == "PRIO") or (header == "Priority"):
+ return cls.PRIO
+ elif header == "LABEL":
+ return cls.LABEL
+ elif header == "UUID":
+ return cls.UUID
+ else:
+ raise ParseError(f"Unknown header: {header}")
+
+
+def _parse_size(size: str) -> int:
+ power = None
+ if size[-1] == "B":
+ power = 0
+ if size[-1] == "K":
+ power = 1
+ elif size[-1] == "M":
+ power = 2
+ elif size[-1] == "G":
+ power = 3
+ elif size[-1] == "T":
+ power = 4
+
+ multiplier = 1024**power if power is not None else 1024
+
+ return (int(size[:-1]) if power is not None else int(size)) * multiplier
+
+
+def _value(value: str, column: _Column) -> _Value:
+ if column == _Column.SIZE or column == _Column.USED:
+ return _parse_size(value)
+ elif column == _Column.PRIO:
+ return int(value)
+ else:
+ return value
+
+
+def _process(proc_data: List[Dict]) -> List[Dict]:
+ """
+ Final processing to conform to the schema.
+
+ Parameters:
+
+ proc_data: (List of Dictionaries) raw structured data to process
+
+ Returns:
+
+ List of Dictionaries. Structured to conform to the schema.
+ """
+ return proc_data
+
+
+def parse(data: str, raw: bool = False, quiet: bool = False) -> List[_Entry]:
+ """
+ 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:
+
+ Dictionary. Raw or processed structured data.
+ """
+ jc.utils.compatibility(__name__, info.compatible, quiet)
+ jc.utils.input_type_check(data)
+
+ raw_output: List[dict] = []
+
+ if jc.utils.has_data(data):
+ lines = iter(data.splitlines())
+ headers = next(lines)
+ columns = headers.split()
+ for each_line in lines:
+ line = each_line.split()
+ diff = len(columns) - len(line)
+ if not 0 <= diff <= 2:
+ raise ParseError(
+ f"Number of columns ({len(line)}) in line does not match number of headers ({len(columns)})"
+ )
+
+ document: _Entry = {}
+ for each_column, value in zip(columns, line):
+ column = _Column.from_header(each_column)
+ document[column.value] = _value(value, column)
+
+ raw_output.append(document)
+
+ return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/tune2fs.py b/jc/parsers/tune2fs.py
new file mode 100644
index 00000000..9637733b
--- /dev/null
+++ b/jc/parsers/tune2fs.py
@@ -0,0 +1,300 @@
+"""jc - JSON Convert `tune2fs -l` command output parser
+
+Usage (cli):
+
+ $ tune2fs -l /dev/xvda4 | jc --tune2fs
+
+or
+
+ $ jc tune2fs -l /dev/xvda4
+
+Usage (module):
+
+ import jc
+ result = jc.parse('tune2fs', tune2fs_command_output)
+
+Schema:
+
+ {
+ "version": string,
+ "filesystem_volume_name": string,
+ "last_mounted_on": string,
+ "filesystem_uuid": string,
+ "filesystem_magic_number": string,
+ "filesystem_revision_number": string,
+ "filesystem_features": [
+ string
+ ],
+ "filesystem_flags": string,
+ "default_mount_options": string,
+ "filesystem_state": string,
+ "errors_behavior": string,
+ "filesystem_os_type": string,
+ "inode_count": integer,
+ "block_count": integer,
+ "reserved_block_count": integer,
+ "overhead_clusters": integer,
+ "free_blocks": integer,
+ "free_inodes": integer,
+ "first_block": integer,
+ "block_size": integer,
+ "fragment_size": integer,
+ "group_descriptor_size": integer,
+ "reserved_gdt_blocks": integer,
+ "blocks_per_group": integer,
+ "fragments_per_group": integer,
+ "inodes_per_group": integer,
+ "inode_blocks_per_group": integer,
+ "flex_block_group_size": integer,
+ "filesystem_created": string,
+ "filesystem_created_epoch": integer,
+ "filesystem_created_epoch_utc": integer,
+ "last_mount_time": string,
+ "last_mount_time_epoch": integer,
+ "last_mount_time_epoch_utc": integer,
+ "last_write_time": string,
+ "last_write_time_epoch": integer,
+ "last_write_time_epoch_utc": integer,
+ "mount_count": integer,
+ "maximum_mount_count": integer,
+ "last_checked": string,
+ "last_checked_epoch": integer,
+ "last_checked_epoch_utc": integer,
+ "check_interval": string,
+ "lifetime_writes": string,
+ "reserved_blocks_uid": string,
+ "reserved_blocks_gid": string,
+ "first_inode": integer,
+ "inode_size": integer,
+ "required_extra_isize": integer,
+ "desired_extra_isize": integer,
+ "journal_inode": integer,
+ "default_directory_hash": string,
+ "directory_hash_seed": string,
+ "journal_backup": string,
+ "checksum_type": string,
+ "checksum": string
+ }
+
+Examples:
+
+ $ tune2fs | jc --tune2fs -p
+ {
+ "version": "1.46.2 (28-Feb-2021)",
+ "filesystem_volume_name": "",
+ "last_mounted_on": "/home",
+ "filesystem_uuid": "5fb78e1a-b214-44e2-a309-8e35116d8dd6",
+ "filesystem_magic_number": "0xEF53",
+ "filesystem_revision_number": "1 (dynamic)",
+ "filesystem_features": [
+ "has_journal",
+ "ext_attr",
+ "resize_inode",
+ "dir_index",
+ "filetype",
+ "needs_recovery",
+ "extent",
+ "64bit",
+ "flex_bg",
+ "sparse_super",
+ "large_file",
+ "huge_file",
+ "dir_nlink",
+ "extra_isize",
+ "metadata_csum"
+ ],
+ "filesystem_flags": "signed_directory_hash",
+ "default_mount_options": "user_xattr acl",
+ "filesystem_state": "clean",
+ "errors_behavior": "Continue",
+ "filesystem_os_type": "Linux",
+ "inode_count": 3932160,
+ "block_count": 15728640,
+ "reserved_block_count": 786432,
+ "free_blocks": 15198453,
+ "free_inodes": 3864620,
+ "first_block": 0,
+ "block_size": 4096,
+ "fragment_size": 4096,
+ "group_descriptor_size": 64,
+ "reserved_gdt_blocks": 1024,
+ "blocks_per_group": 32768,
+ "fragments_per_group": 32768,
+ "inodes_per_group": 8192,
+ "inode_blocks_per_group": 512,
+ "flex_block_group_size": 16,
+ "filesystem_created": "Mon Apr 6 15:10:37 2020",
+ "last_mount_time": "Mon Sep 19 15:16:20 2022",
+ "last_write_time": "Mon Sep 19 15:16:20 2022",
+ "mount_count": 14,
+ "maximum_mount_count": -1,
+ "last_checked": "Fri Apr 8 15:24:22 2022",
+ "check_interval": "0 ()",
+ "lifetime_writes": "203 GB",
+ "reserved_blocks_uid": "0 (user root)",
+ "reserved_blocks_gid": "0 (group root)",
+ "first_inode": 11,
+ "inode_size": 256,
+ "required_extra_isize": 32,
+ "desired_extra_isize": 32,
+ "journal_inode": 8,
+ "default_directory_hash": "half_md4",
+ "directory_hash_seed": "67d5358d-723d-4ce3-b3c0-30ddb433ad9e",
+ "journal_backup": "inode blocks",
+ "checksum_type": "crc32c",
+ "checksum": "0x7809afff",
+ "filesystem_created_epoch": 1586211037,
+ "filesystem_created_epoch_utc": null,
+ "last_mount_time_epoch": 1663625780,
+ "last_mount_time_epoch_utc": null,
+ "last_write_time_epoch": 1663625780,
+ "last_write_time_epoch_utc": null,
+ "last_checked_epoch": 1649456662,
+ "last_checked_epoch_utc": null
+ }
+
+ $ tune2fs | jc --tune2fs -p -r
+ {
+ "version": "1.46.2 (28-Feb-2021)",
+ "filesystem_volume_name": "",
+ "last_mounted_on": "/home",
+ "filesystem_uuid": "5fb78e1a-b214-44e2-a309-8e35116d8dd6",
+ "filesystem_magic_number": "0xEF53",
+ "filesystem_revision_number": "1 (dynamic)",
+ "filesystem_features": "has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum",
+ "filesystem_flags": "signed_directory_hash",
+ "default_mount_options": "user_xattr acl",
+ "filesystem_state": "clean",
+ "errors_behavior": "Continue",
+ "filesystem_os_type": "Linux",
+ "inode_count": "3932160",
+ "block_count": "15728640",
+ "reserved_block_count": "786432",
+ "free_blocks": "15198453",
+ "free_inodes": "3864620",
+ "first_block": "0",
+ "block_size": "4096",
+ "fragment_size": "4096",
+ "group_descriptor_size": "64",
+ "reserved_gdt_blocks": "1024",
+ "blocks_per_group": "32768",
+ "fragments_per_group": "32768",
+ "inodes_per_group": "8192",
+ "inode_blocks_per_group": "512",
+ "flex_block_group_size": "16",
+ "filesystem_created": "Mon Apr 6 15:10:37 2020",
+ "last_mount_time": "Mon Sep 19 15:16:20 2022",
+ "last_write_time": "Mon Sep 19 15:16:20 2022",
+ "mount_count": "14",
+ "maximum_mount_count": "-1",
+ "last_checked": "Fri Apr 8 15:24:22 2022",
+ "check_interval": "0 ()",
+ "lifetime_writes": "203 GB",
+ "reserved_blocks_uid": "0 (user root)",
+ "reserved_blocks_gid": "0 (group root)",
+ "first_inode": "11",
+ "inode_size": "256",
+ "required_extra_isize": "32",
+ "desired_extra_isize": "32",
+ "journal_inode": "8",
+ "default_directory_hash": "half_md4",
+ "directory_hash_seed": "67d5358d-723d-4ce3-b3c0-30ddb433ad9e",
+ "journal_backup": "inode blocks",
+ "checksum_type": "crc32c",
+ "checksum": "0x7809afff"
+ }
+"""
+from typing import Dict
+from jc.jc_types import JSONDictType
+import jc.utils
+
+
+class info():
+ """Provides parser metadata (version, author, etc.)"""
+ version = '1.0'
+ description = '`tune2fs -l` command parser'
+ author = 'Kelly Brazil'
+ author_email = 'kellyjonbrazil@gmail.com'
+ compatible = ['linux']
+ tags = ['command']
+ magic_commands = ['tune2fs -l']
+
+
+__version__ = info.version
+
+
+def _process(proc_data: JSONDictType) -> JSONDictType:
+ """
+ Final processing to conform to the schema.
+
+ Parameters:
+
+ proc_data: (Dictionary) raw structured data to process
+
+ Returns:
+
+ Dictionary. Structured to conform to the schema.
+ """
+ int_list = {'inode_count', 'block_count', 'reserved_block_count', 'free_blocks',
+ 'free_inodes', 'first_block', 'block_size', 'fragment_size',
+ 'group_descriptor_size', 'reserved_gdt_blocks', 'blocks_per_group',
+ 'fragments_per_group', 'inodes_per_group', 'inode_blocks_per_group',
+ 'flex_block_group_size', 'mount_count', 'maximum_mount_count',
+ 'first_inode', 'inode_size', 'required_extra_isize', 'desired_extra_isize',
+ 'journal_inode', 'overhead_clusters'}
+
+ datetime_list = {'filesystem_created', 'last_mount_time', 'last_write_time', 'last_checked'}
+
+ for key in proc_data:
+ if key in int_list:
+ proc_data[key] = jc.utils.convert_to_int(proc_data[key])
+
+ for key in proc_data.copy():
+ if key in datetime_list:
+ dt = jc.utils.timestamp(proc_data[key], (1000,))
+ proc_data[key + '_epoch'] = dt.naive
+ proc_data[key + '_epoch_utc'] = dt.utc
+
+ if 'filesystem_features' in proc_data:
+ proc_data['filesystem_features'] = proc_data['filesystem_features'].split()
+
+ return proc_data
+
+
+def parse(
+ data: str,
+ raw: bool = False,
+ quiet: bool = False
+) -> JSONDictType:
+ """
+ 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:
+
+ Dictionary. Raw or processed structured data.
+ """
+ jc.utils.compatibility(__name__, info.compatible, quiet)
+ jc.utils.input_type_check(data)
+
+ raw_output: Dict = {}
+
+ if jc.utils.has_data(data):
+
+ for line in filter(None, data.splitlines()):
+
+ if line.startswith('tune2fs '):
+ raw_output['version'] = line.split(maxsplit=1)[1]
+ continue
+
+ linesplit = line.split(':', maxsplit=1)
+ key = linesplit[0].lower().replace(' ', '_').replace('#', 'number')
+ val = linesplit[1].strip()
+ raw_output[key] = val
+
+ return raw_output if raw else _process(raw_output)
diff --git a/jc/parsers/vmstat.py b/jc/parsers/vmstat.py
index ae004bf6..6f4c9048 100644
--- a/jc/parsers/vmstat.py
+++ b/jc/parsers/vmstat.py
@@ -121,12 +121,16 @@ Examples:
}
]
"""
+import re
import jc.utils
+PROCS_HEADER_RE = re.compile(r'^-*procs-* ')
+DISK_HEADER_RE = re.compile(r'^-*disk-* ')
+
class info():
"""Provides parser metadata (version, author, etc.)"""
- version = '1.3'
+ version = '1.4'
description = '`vmstat` command parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
@@ -203,18 +207,18 @@ def parse(data, raw=False, quiet=False):
for line in filter(None, data.splitlines()):
# detect output type
- if not procs and not disk and line.startswith('procs'):
+ if not procs and not disk and PROCS_HEADER_RE.match(line):
procs = True
tstamp = '-timestamp-' in line
continue
- if not procs and not disk and line.startswith('disk'):
+ if not procs and not disk and DISK_HEADER_RE.match(line):
disk = True
tstamp = '-timestamp-' in line
continue
# skip header rows
- if (procs or disk) and (line.startswith('procs') or line.startswith('disk')):
+ if (procs or disk) and (PROCS_HEADER_RE.match(line) or DISK_HEADER_RE.match(line)):
continue
if 'swpd' in line and 'free' in line and 'buff' in line and 'cache' in line:
diff --git a/jc/parsers/vmstat_s.py b/jc/parsers/vmstat_s.py
index 4ef4d847..6df5964b 100644
--- a/jc/parsers/vmstat_s.py
+++ b/jc/parsers/vmstat_s.py
@@ -91,16 +91,20 @@ Examples:
{"runnable_procs":"2","uninterruptible_sleeping_procs":"0","virtua...}
...
"""
+import re
import jc.utils
from jc.streaming import (
add_jc_meta, streaming_input_type_check, streaming_line_input_type_check, raise_or_yield
)
from jc.exceptions import ParseError
+PROCS_HEADER_RE = re.compile(r'^-*procs-* ')
+DISK_HEADER_RE = re.compile(r'^-*disk-* ')
+
class info():
"""Provides parser metadata (version, author, etc.)"""
- version = '1.2'
+ version = '1.3'
description = '`vmstat` command streaming parser'
author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com'
@@ -182,18 +186,18 @@ def parse(data, raw=False, quiet=False, ignore_exceptions=False):
continue
# detect output type
- if not procs and not disk and line.startswith('procs'):
+ if not procs and not disk and PROCS_HEADER_RE.match(line):
procs = True
tstamp = '-timestamp-' in line
continue
- if not procs and not disk and line.startswith('disk'):
+ if not procs and not disk and DISK_HEADER_RE.match(line):
disk = True
tstamp = '-timestamp-' in line
continue
# skip header rows
- if (procs or disk) and (line.startswith('procs') or line.startswith('disk')):
+ if (procs or disk) and (PROCS_HEADER_RE.match(line) or DISK_HEADER_RE.match(line)):
continue
if 'swpd' in line and 'free' in line and 'buff' in line and 'cache' in line:
diff --git a/jc/parsers/xrandr.py b/jc/parsers/xrandr.py
index dfd480bf..2a579174 100644
--- a/jc/parsers/xrandr.py
+++ b/jc/parsers/xrandr.py
@@ -26,22 +26,24 @@ Schema:
"current_height": integer,
"maximum_width": integer,
"maximum_height": integer,
- "devices": {
- "modes": [
- {
- "resolution_width": integer,
- "resolution_height": integer,
- "is_high_resolution": boolean,
- "frequencies": [
- {
- "frequency": float,
- "is_current": boolean,
- "is_preferred": boolean
- }
- ]
- }
- ]
- },
+ "devices": [
+ {
+ "modes": [
+ {
+ "resolution_width": integer,
+ "resolution_height": integer,
+ "is_high_resolution": boolean,
+ "frequencies": [
+ {
+ "frequency": float,
+ "is_current": boolean,
+ "is_preferred": boolean
+ }
+ ]
+ }
+ ]
+ }
+ ],
"is_connected": boolean,
"is_primary": boolean,
"device_name": string,
@@ -57,7 +59,7 @@ Schema:
"rotation": string,
"reflection": string
}
- ],
+ ]
}
Examples:
@@ -73,50 +75,52 @@ Examples:
"current_height": 1080,
"maximum_width": 32767,
"maximum_height": 32767,
- "devices": {
- "modes": [
- {
- "resolution_width": 1920,
- "resolution_height": 1080,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 60.03,
- "is_current": true,
- "is_preferred": true
- },
- {
- "frequency": 59.93,
- "is_current": false,
- "is_preferred": false
- }
- ]
- },
- {
- "resolution_width": 1680,
- "resolution_height": 1050,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 59.88,
- "is_current": false,
- "is_preferred": false
- }
- ]
- }
- ],
- "is_connected": true,
- "is_primary": true,
- "device_name": "eDP1",
- "resolution_width": 1920,
- "resolution_height": 1080,
- "offset_width": 0,
- "offset_height": 0,
- "dimension_width": 310,
- "dimension_height": 170,
- "rotation": "normal",
- "reflection": "normal"
- }
+ "devices": [
+ {
+ "modes": [
+ {
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 60.03,
+ "is_current": true,
+ "is_preferred": true
+ },
+ {
+ "frequency": 59.93,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ },
+ {
+ "resolution_width": 1680,
+ "resolution_height": 1050,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 59.88,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ }
+ ],
+ "is_connected": true,
+ "is_primary": true,
+ "device_name": "eDP1",
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "offset_width": 0,
+ "offset_height": 0,
+ "dimension_width": 310,
+ "dimension_height": 170,
+ "rotation": "normal",
+ "reflection": "normal"
+ }
+ ]
}
]
}
@@ -132,53 +136,55 @@ Examples:
"current_height": 1080,
"maximum_width": 32767,
"maximum_height": 32767,
- "devices": {
- "modes": [
- {
- "resolution_width": 1920,
- "resolution_height": 1080,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 60.03,
- "is_current": true,
- "is_preferred": true
- },
- {
- "frequency": 59.93,
- "is_current": false,
- "is_preferred": false
- }
- ]
- },
- {
- "resolution_width": 1680,
- "resolution_height": 1050,
- "is_high_resolution": false,
- "frequencies": [
- {
- "frequency": 59.88,
- "is_current": false,
- "is_preferred": false
- }
- ]
- }
- ],
- "is_connected": true,
- "is_primary": true,
- "device_name": "eDP1",
- "model_name": "ASUS VW193S",
- "product_id": "54297",
- "serial_number": "78L8021107",
- "resolution_width": 1920,
- "resolution_height": 1080,
- "offset_width": 0,
- "offset_height": 0,
- "dimension_width": 310,
- "dimension_height": 170,
- "rotation": "normal",
- "reflection": "normal"
- }
+ "devices": [
+ {
+ "modes": [
+ {
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 60.03,
+ "is_current": true,
+ "is_preferred": true
+ },
+ {
+ "frequency": 59.93,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ },
+ {
+ "resolution_width": 1680,
+ "resolution_height": 1050,
+ "is_high_resolution": false,
+ "frequencies": [
+ {
+ "frequency": 59.88,
+ "is_current": false,
+ "is_preferred": false
+ }
+ ]
+ }
+ ],
+ "is_connected": true,
+ "is_primary": true,
+ "device_name": "eDP1",
+ "model_name": "ASUS VW193S",
+ "product_id": "54297",
+ "serial_number": "78L8021107",
+ "resolution_width": 1920,
+ "resolution_height": 1080,
+ "offset_width": 0,
+ "offset_height": 0,
+ "dimension_width": 310,
+ "dimension_height": 170,
+ "rotation": "normal",
+ "reflection": "normal"
+ }
+ ]
}
]
}
@@ -192,8 +198,7 @@ from jc.parsers.pyedid.helpers.edid_helper import EdidHelper
class info:
"""Provides parser metadata (version, author, etc.)"""
-
- version = "1.3"
+ version = "1.4"
description = "`xrandr` command parser"
author = "Kevin Lyter"
author_email = "code (at) lyterk.com"
@@ -205,6 +210,35 @@ class info:
__version__ = info.version
+# keep parsing state so we know which parsers have already tried the line
+# Structure is:
+# {
+# : [
+#
+# ]
+# }
+#
+# Where is the xrandr output line to be checked and
+# can contain "screen", "device", or "model"
+parse_state: Dict[str, List] = {}
+
+
+def _was_parsed(line: str, parser: str) -> bool:
+ """
+ Check if entered parser has already parsed. If so return True.
+ If not, return false and add the parser to the list for the line entry.
+ """
+ if line in parse_state:
+ if parser in parse_state[line]:
+ return True
+
+ parse_state[line].append(parser)
+ return False
+
+ parse_state[line] = [parser]
+ return False
+
+
try:
from typing import TypedDict
@@ -291,6 +325,10 @@ _screen_pattern = (
def _parse_screen(next_lines: List[str]) -> Optional[Screen]:
next_line = next_lines.pop()
+
+ if _was_parsed(next_line, 'screen'):
+ return None
+
result = re.match(_screen_pattern, next_line)
if not result:
next_lines.append(next_line)
@@ -323,8 +361,8 @@ _device_pattern = (
+ r"\+(?P\d+)\+(?P\d+))? "
+ r"(?P(normal|right|left|inverted)?) ?"
+ r"(?P(X axis|Y axis|X and Y axis)?) ?"
- + r"\(normal left inverted right x axis y axis\)"
- + r"( ((?P\d+)mm x (?P\d+)mm)?)?"
+ + r"(\(normal left inverted right x axis y axis\))?"
+ + r"( ?((?P\d+)mm x (?P\d+)mm)?)?"
)
@@ -333,6 +371,10 @@ def _parse_device(next_lines: List[str], quiet: bool = False) -> Optional[Device
return None
next_line = next_lines.pop()
+
+ if _was_parsed(next_line, 'device'):
+ return None
+
result = re.match(_device_pattern, next_line)
if not result:
next_lines.append(next_line)
@@ -402,6 +444,10 @@ def _parse_model(next_lines: List[str], quiet: bool = False) -> Optional[Model]:
return None
next_line = next_lines.pop()
+
+ if _was_parsed(next_line, 'model'):
+ return None
+
if not re.match(_edid_head_pattern, next_line):
next_lines.append(next_line)
return None
@@ -438,6 +484,7 @@ _frequencies_pattern = r"(((?P\d+\.\d+)(?P\*| |)(?P\+?)?)
def _parse_mode(line: str) -> Optional[Mode]:
result = re.match(_mode_pattern, line)
frequencies: List[Frequency] = []
+
if not result:
return None
@@ -490,9 +537,10 @@ def parse(data: str, raw: bool = False, quiet: bool = False) -> Dict:
linedata = data.splitlines()
linedata.reverse() # For popping
- result: Response = {"screens": []}
+ result: Dict = {}
if jc.utils.has_data(data):
+ result = {"screens": []}
while linedata:
screen = _parse_screen(linedata)
if screen:
diff --git a/jc/utils.py b/jc/utils.py
index 70faf137..257f1f5a 100644
--- a/jc/utils.py
+++ b/jc/utils.py
@@ -3,6 +3,8 @@ import sys
import re
import locale
import shutil
+from collections import namedtuple
+from numbers import Number
from datetime import datetime, timezone
from textwrap import TextWrapper
from functools import lru_cache
@@ -274,6 +276,117 @@ def convert_to_bool(value: object) -> bool:
return False
+# convert_size_to_int from https://github.com/xolox/python-humanfriendly
+
+# Copyright (c) 2021 Peter Odding
+
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+def convert_size_to_int(size: str, binary: bool = False) -> Optional[int]:
+ """
+ Parse a human readable data size and return the number of bytes.
+
+ Parameters:
+
+ size: (string) The human readable file size to parse.
+ 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).
+ Returns:
+
+ integer/None Integer if successful conversion, otherwise None
+
+ This function knows how to parse sizes in bytes, kilobytes, megabytes,
+ gigabytes, terabytes and petabytes. Some examples:
+
+ >>> convert_size_to_int('42')
+ 42
+ >>> convert_size_to_int('13b')
+ 13
+ >>> convert_size_to_int('5 bytes')
+ 5
+ >>> convert_size_to_int('1 KB')
+ 1000
+ >>> convert_size_to_int('1 kilobyte')
+ 1000
+ >>> convert_size_to_int('1 KiB')
+ 1024
+ >>> convert_size_to_int('1 KB', binary=True)
+ 1024
+ >>> convert_size_to_int('1.5 GB')
+ 1500000000
+ >>> convert_size_to_int('1.5 GB', binary=True)
+ 1610612736
+ """
+ def tokenize(text: str) -> List[str]:
+ tokenized_input: List = []
+ for token in re.split(r'(\d+(?:\.\d+)?)', text):
+ token = token.strip()
+ if re.match(r'\d+\.\d+', token):
+ tokenized_input.append(float(token))
+ elif token.isdigit():
+ tokenized_input.append(int(token))
+ elif token:
+ tokenized_input.append(token)
+ return tokenized_input
+
+ SizeUnit = namedtuple('SizeUnit', 'divider, symbol, name')
+ CombinedUnit = namedtuple('CombinedUnit', 'decimal, binary')
+ disk_size_units = (
+ CombinedUnit(SizeUnit(1000**1, 'KB', 'kilobyte'), SizeUnit(1024**1, 'KiB', 'kibibyte')),
+ CombinedUnit(SizeUnit(1000**2, 'MB', 'megabyte'), SizeUnit(1024**2, 'MiB', 'mebibyte')),
+ CombinedUnit(SizeUnit(1000**3, 'GB', 'gigabyte'), SizeUnit(1024**3, 'GiB', 'gibibyte')),
+ CombinedUnit(SizeUnit(1000**4, 'TB', 'terabyte'), SizeUnit(1024**4, 'TiB', 'tebibyte')),
+ CombinedUnit(SizeUnit(1000**5, 'PB', 'petabyte'), SizeUnit(1024**5, 'PiB', 'pebibyte')),
+ CombinedUnit(SizeUnit(1000**6, 'EB', 'exabyte'), SizeUnit(1024**6, 'EiB', 'exbibyte')),
+ CombinedUnit(SizeUnit(1000**7, 'ZB', 'zettabyte'), SizeUnit(1024**7, 'ZiB', 'zebibyte')),
+ CombinedUnit(SizeUnit(1000**8, 'YB', 'yottabyte'), SizeUnit(1024**8, 'YiB', 'yobibyte')),
+ )
+ tokens = tokenize(size)
+ if tokens and isinstance(tokens[0], Number):
+ # Get the normalized unit (if any) from the tokenized input.
+ normalized_unit = tokens[1].lower() if len(tokens) == 2 and isinstance(tokens[1], str) else ''
+ # If the input contains only a number, it's assumed to be the number of
+ # bytes. The second token can also explicitly reference the unit bytes.
+ if len(tokens) == 1 or normalized_unit.startswith('b'):
+ return int(tokens[0])
+ # Otherwise we expect two tokens: A number and a unit.
+ if normalized_unit:
+ # Convert plural units to singular units, for details:
+ # https://github.com/xolox/python-humanfriendly/issues/26
+ normalized_unit = normalized_unit.rstrip('s')
+ for unit in disk_size_units:
+ # First we check for unambiguous symbols (KiB, MiB, GiB, etc)
+ # and names (kibibyte, mebibyte, gibibyte, etc) because their
+ # handling is always the same.
+ if normalized_unit in (unit.binary.symbol.lower(), unit.binary.name.lower()):
+ return int(tokens[0] * unit.binary.divider)
+ # Now we will deal with ambiguous prefixes (K, M, G, etc),
+ # symbols (KB, MB, GB, etc) and names (kilobyte, megabyte,
+ # gigabyte, etc) according to the caller's preference.
+ if (normalized_unit in (unit.decimal.symbol.lower(), unit.decimal.name.lower()) or
+ normalized_unit.startswith(unit.decimal.symbol[0].lower())):
+ return int(tokens[0] * (unit.binary.divider if binary else unit.decimal.divider))
+ # We failed to parse the size specification.
+ return None
+
+
def input_type_check(data: object) -> None:
"""Ensure input data is a string. Raises `TypeError` if not."""
if not isinstance(data, str):
diff --git a/man/jc.1 b/man/jc.1
index 1b2c24e0..7128a94b 100644
--- a/man/jc.1
+++ b/man/jc.1
@@ -1,4 +1,4 @@
-.TH jc 1 2023-10-23 1.23.6 "JSON Convert"
+.TH jc 1 2023-12-17 1.24.0 "JSON Convert"
.SH NAME
\fBjc\fP \- JSON Convert JSONifies the output of many CLI tools, file-types,
and strings
@@ -147,6 +147,11 @@ CSV file streaming parser
\fB--datetime-iso\fP
ISO 8601 Datetime string parser
+.TP
+.B
+\fB--debconf-show\fP
+`debconf-show` command parser
+
.TP
.B
\fB--df\fP
@@ -322,11 +327,6 @@ IPv4 and IPv6 Address string parser
\fB--ip-route\fP
`ip route` command parser
-.TP
-.B
-\fB--iso-datetime\fP
-Deprecated - please use datetime-iso
-
.TP
.B
\fB--iw-scan\fP
@@ -512,6 +512,16 @@ PostgreSQL password file parser
\fB--pip-show\fP
`pip show` command parser
+.TP
+.B
+\fB--pkg-index-apk\fP
+Alpine Linux Package Index file parser
+
+.TP
+.B
+\fB--pkg-index-deb\fP
+Debian Package Index file parser
+
.TP
.B
\fB--plist\fP
@@ -532,6 +542,11 @@ PLIST file parser
\fB--proc-buddyinfo\fP
`/proc/buddyinfo` file parser
+.TP
+.B
+\fB--proc-cmdline\fP
+`/proc/cmdline` file parser
+
.TP
.B
\fB--proc-consoles\fP
@@ -852,6 +867,11 @@ SRT file parser
\fB--stat-s\fP
`stat` command streaming parser
+.TP
+.B
+\fB--swapon\fP
+`swapon` command parser
+
.TP
.B
\fB--sysctl\fP
@@ -942,6 +962,11 @@ TOML file parser
\fB--traceroute\fP
`traceroute` and `traceroute6` command parser
+.TP
+.B
+\fB--tune2fs\fP
+`tune2fs -l` command parser
+
.TP
.B
\fB--udevadm\fP
diff --git a/readmegen.py b/readmegen.py
index 592f48b3..60c69187 100755
--- a/readmegen.py
+++ b/readmegen.py
@@ -7,7 +7,6 @@ from jinja2 import Environment, FileSystemLoader
file_loader = FileSystemLoader('templates')
env = Environment(loader=file_loader)
template = env.get_template('readme_template')
-# output = template.render(jc=jc.cli.about_jc())
output = template.render(parsers=jc.lib.all_parser_info(),
info=jc.cli.JcCli.about_jc())
diff --git a/setup.py b/setup.py
index f92fbe61..0eaa64f8 100755
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@ with open('README.md', 'r') as f:
setuptools.setup(
name='jc',
- version='1.23.6',
+ version='1.24.0',
author='Kelly Brazil',
author_email='kellyjonbrazil@gmail.com',
description='Converts the output of popular command-line tools and file-types to JSON.',
diff --git a/templates/readme_template b/templates/readme_template
index 4ce8318d..eb38c0a6 100644
--- a/templates/readme_template
+++ b/templates/readme_template
@@ -120,6 +120,7 @@ pip3 install jc
| NixOS linux | `nix-env -iA nixpkgs.jc` or `nix-env -iA nixos.jc` |
| Guix System linux | `guix install jc` |
| Gentoo Linux | `emerge dev-python/jc` |
+| Photon linux | `tdnf install jc` |
| macOS | `brew install jc` |
| FreeBSD | `portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean` |
| Ansible filter plugin | `ansible-galaxy collection install community.general` |
diff --git a/tests/fixtures/generic/debconf-show.json b/tests/fixtures/generic/debconf-show.json
new file mode 100644
index 00000000..e31fcab1
--- /dev/null
+++ b/tests/fixtures/generic/debconf-show.json
@@ -0,0 +1 @@
+[{"asked":true,"packagename":"onlyoffice","name":"jwt_secret","value":"aL8ei2iereuzee7cuJ6Cahjah1ixee2ah"},{"asked":false,"packagename":"onlyoffice","name":"db_pwd","value":"(password omitted)"},{"asked":true,"packagename":"onlyoffice","name":"rabbitmq_pwd","value":"(password omitted)"},{"asked":true,"packagename":"onlyoffice","name":"ds_port","value":"80"},{"asked":true,"packagename":"onlyoffice","name":"docservice_port","value":"8000"},{"asked":true,"packagename":"onlyoffice","name":"jwt_enabled","value":"true"},{"asked":true,"packagename":"onlyoffice","name":"remove_db","value":"false"},{"asked":true,"packagename":"onlyoffice","name":"jwt_header","value":"Authorization"},{"asked":true,"packagename":"onlyoffice","name":"db_port","value":"5432"},{"asked":true,"packagename":"onlyoffice","name":"rabbitmq_user","value":"onlyoffice"},{"asked":true,"packagename":"onlyoffice","name":"example_port","value":"3000"},{"asked":true,"packagename":"onlyoffice","name":"db_name","value":"onlyoffice"},{"asked":true,"packagename":"onlyoffice","name":"db_host","value":"localhost"},{"asked":true,"packagename":"onlyoffice","name":"db_type","value":"postgres"},{"asked":true,"packagename":"onlyoffice","name":"rabbitmq_host","value":"localhost"},{"asked":true,"packagename":"onlyoffice","name":"db_user","value":"onlyoffice"},{"asked":true,"packagename":"onlyoffice","name":"rabbitmq_proto","value":"amqp"},{"asked":true,"packagename":"onlyoffice","name":"cluster_mode","value":"false"}]
diff --git a/tests/fixtures/generic/debconf-show.out b/tests/fixtures/generic/debconf-show.out
new file mode 100644
index 00000000..a24ef115
--- /dev/null
+++ b/tests/fixtures/generic/debconf-show.out
@@ -0,0 +1,18 @@
+* onlyoffice/jwt-secret: aL8ei2iereuzee7cuJ6Cahjah1ixee2ah
+ onlyoffice/db-pwd: (password omitted)
+* onlyoffice/rabbitmq-pwd: (password omitted)
+* onlyoffice/ds-port: 80
+* onlyoffice/docservice-port: 8000
+* onlyoffice/jwt-enabled: true
+* onlyoffice/remove-db: false
+* onlyoffice/jwt-header: Authorization
+* onlyoffice/db-port: 5432
+* onlyoffice/rabbitmq-user: onlyoffice
+* onlyoffice/example-port: 3000
+* onlyoffice/db-name: onlyoffice
+* onlyoffice/db-host: localhost
+* onlyoffice/db-type: postgres
+* onlyoffice/rabbitmq-host: localhost
+* onlyoffice/db-user: onlyoffice
+* onlyoffice/rabbitmq-proto: amqp
+* onlyoffice/cluster-mode: false
diff --git a/tests/fixtures/generic/iptables-no-jump.json b/tests/fixtures/generic/iptables-no-jump.json
new file mode 100644
index 00000000..5a4a4298
--- /dev/null
+++ b/tests/fixtures/generic/iptables-no-jump.json
@@ -0,0 +1 @@
+[{"chain":"INPUT","rules":[{"target":null,"prot":"udp","opt":null,"source":"anywhere","destination":"anywhere"}]}]
diff --git a/tests/fixtures/generic/iptables-no-jump.out b/tests/fixtures/generic/iptables-no-jump.out
new file mode 100644
index 00000000..ce6ec3d5
--- /dev/null
+++ b/tests/fixtures/generic/iptables-no-jump.out
@@ -0,0 +1,4 @@
+Chain INPUT (policy ACCEPT)
+target prot opt source destination
+ udp -- anywhere anywhere
+
diff --git a/tests/fixtures/generic/mount-spaces-in-mountpoint.json b/tests/fixtures/generic/mount-spaces-in-mountpoint.json
new file mode 100644
index 00000000..c4db756a
--- /dev/null
+++ b/tests/fixtures/generic/mount-spaces-in-mountpoint.json
@@ -0,0 +1 @@
+[{"filesystem":"/dev/sda1","mount_point":"/media/ingo/Ubuntu 22.04.3 LTS amd64","type":"iso9660","options":["ro","nosuid","nodev","relatime","nojoliet","check=s","map=n","blocksize=2048","uid=1000","gid=1000","dmode=500","fmode=400","iocharset=utf8","uhelper=udisks2"]}]
diff --git a/tests/fixtures/generic/mount-spaces-in-mountpoint.out b/tests/fixtures/generic/mount-spaces-in-mountpoint.out
new file mode 100644
index 00000000..2d217ace
--- /dev/null
+++ b/tests/fixtures/generic/mount-spaces-in-mountpoint.out
@@ -0,0 +1 @@
+/dev/sda1 on /media/ingo/Ubuntu 22.04.3 LTS amd64 type iso9660 (ro,nosuid,nodev,relatime,nojoliet,check=s,map=n,blocksize=2048,uid=1000,gid=1000,dmode=500,fmode=400,iocharset=utf8,uhelper=udisks2)
diff --git a/tests/fixtures/generic/pkg-index-apk-raw.json b/tests/fixtures/generic/pkg-index-apk-raw.json
new file mode 100644
index 00000000..e2cc05a5
--- /dev/null
+++ b/tests/fixtures/generic/pkg-index-apk-raw.json
@@ -0,0 +1 @@
+[{"C":"Q1znBl9k+RKgY6gl5Eg3iz73KZbLY=","P":"yasm","V":"1.3.0-r4","A":"x86_64","S":"772109","I":"1753088","T":"A rewrite of NASM to allow for multiple syntax supported (NASM, TASM, GAS, etc.)","U":"http://www.tortall.net/projects/yasm/","L":"BSD-2-Clause","o":"yasm","m":"Natanael Copa ","t":"1681228881","c":"84a227baf001b6e0208e3352b294e4d7a40e93de","D":"so:libc.musl-x86_64.so.1","p":"cmd:vsyasm=1.3.0-r4 cmd:yasm=1.3.0-r4 cmd:ytasm=1.3.0-r4"},{"C":"Q1D3O+vigqMNGhFeVW1bT5Z9mZEf8=","P":"yasm-dev","V":"1.3.0-r4","A":"x86_64","S":"449076","I":"1773568","T":"A rewrite of NASM to allow for multiple syntax supported (NASM, TASM, GAS, etc.) (development files)","U":"http://www.tortall.net/projects/yasm/","L":"BSD-2-Clause","o":"yasm","m":"Natanael Copa ","t":"1681228881","c":"84a227baf001b6e0208e3352b294e4d7a40e93de"}]
diff --git a/tests/fixtures/generic/pkg-index-apk.json b/tests/fixtures/generic/pkg-index-apk.json
new file mode 100644
index 00000000..0ab7c9be
--- /dev/null
+++ b/tests/fixtures/generic/pkg-index-apk.json
@@ -0,0 +1 @@
+[{"checksum":"Q1znBl9k+RKgY6gl5Eg3iz73KZbLY=","package":"yasm","version":"1.3.0-r4","architecture":"x86_64","package_size":772109,"installed_size":1753088,"description":"A rewrite of NASM to allow for multiple syntax supported (NASM, TASM, GAS, etc.)","url":"http://www.tortall.net/projects/yasm/","license":"BSD-2-Clause","origin":"yasm","maintainer":{"name":"Natanael Copa","email":"ncopa@alpinelinux.org"},"build_time":1681228881,"commit":"84a227baf001b6e0208e3352b294e4d7a40e93de","dependencies":["so:libc.musl-x86_64.so.1"],"provides":["cmd:vsyasm=1.3.0-r4","cmd:yasm=1.3.0-r4","cmd:ytasm=1.3.0-r4"]},{"checksum":"Q1D3O+vigqMNGhFeVW1bT5Z9mZEf8=","package":"yasm-dev","version":"1.3.0-r4","architecture":"x86_64","package_size":449076,"installed_size":1773568,"description":"A rewrite of NASM to allow for multiple syntax supported (NASM, TASM, GAS, etc.) (development files)","url":"http://www.tortall.net/projects/yasm/","license":"BSD-2-Clause","origin":"yasm","maintainer":{"name":"Natanael Copa","email":"ncopa@alpinelinux.org"},"build_time":1681228881,"commit":"84a227baf001b6e0208e3352b294e4d7a40e93de"}]
diff --git a/tests/fixtures/generic/pkg-index-apk.out b/tests/fixtures/generic/pkg-index-apk.out
new file mode 100644
index 00000000..bcf21103
--- /dev/null
+++ b/tests/fixtures/generic/pkg-index-apk.out
@@ -0,0 +1,29 @@
+C:Q1znBl9k+RKgY6gl5Eg3iz73KZbLY=
+P:yasm
+V:1.3.0-r4
+A:x86_64
+S:772109
+I:1753088
+T:A rewrite of NASM to allow for multiple syntax supported (NASM, TASM, GAS, etc.)
+U:http://www.tortall.net/projects/yasm/
+L:BSD-2-Clause
+o:yasm
+m:Natanael Copa
+t:1681228881
+c:84a227baf001b6e0208e3352b294e4d7a40e93de
+D:so:libc.musl-x86_64.so.1
+p:cmd:vsyasm=1.3.0-r4 cmd:yasm=1.3.0-r4 cmd:ytasm=1.3.0-r4
+
+C:Q1D3O+vigqMNGhFeVW1bT5Z9mZEf8=
+P:yasm-dev
+V:1.3.0-r4
+A:x86_64
+S:449076
+I:1773568
+T:A rewrite of NASM to allow for multiple syntax supported (NASM, TASM, GAS, etc.) (development files)
+U:http://www.tortall.net/projects/yasm/
+L:BSD-2-Clause
+o:yasm
+m:Natanael Copa
+t:1681228881
+c:84a227baf001b6e0208e3352b294e4d7a40e93de
diff --git a/tests/fixtures/generic/pkg-index-deb.json b/tests/fixtures/generic/pkg-index-deb.json
new file mode 100644
index 00000000..6d770e27
--- /dev/null
+++ b/tests/fixtures/generic/pkg-index-deb.json
@@ -0,0 +1 @@
+[{"package":"dotnet-host","version":"3.1.16-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":146,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 3.1.16","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"2557da13447d61382f255eb751ba29cc1a8220899c1e3e640a7bb3d2a0c1d297","size":32594,"filename":"pool/main/d/dotnet-host/dotnet-host-3.1.16-x64.deb"},{"package":"aspnetcore-runtime-5.0","version":"5.0.10-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":18551,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-5.0 (>= 5.0.10)","sha256":"1d9869f862cb4e9c46b245a343d8e39fbbc84d9f8ab9ef357c4643da20805ad3","size":6084188,"filename":"pool/main/a/aspnetcore-runtime-5.0/aspnetcore-runtime-5.0.10-x64.deb"},{"package":"azure-functions-core-tools","version":"2.7.2883-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v2","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"5fcdc041e503ffcd726bf6455f339b5438d3fac3689a5f5313e1eba67e606f88","size":165966956,"filename":"pool/main/a/azure-functions-core-tools/azure-functions-core-tools_2.7.2883-1.deb"},{"package":"dotnet-runtime-2.1","version":"2.1.25-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68167,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 2.1.25 Microsoft.NETCore.App 2.1.25","homepage":"https://dot.net/core","depends":"dotnet-runtime-deps-2.1 (>= 2.1.25), dotnet-hostfxr-2.1 (>= 2.1.25)","sha256":"935826f9edac6762c4f65ec5a9199110229470b6e72274a5efe0e6d9104d3c02","size":20321788,"filename":"pool/main/d/dotnet-runtime-2.1/dotnet-runtime-2.1.25-x64.deb"},{"package":"dotnet-hostfxr-2.1","version":"2.1.25-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":718,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host FX Resolver - 2.1.25 2.1.25","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 2.1.25), libc6","sha256":"f1b30770705e2b8b2ab722ba42623ad15d27a43c0f29c621aeab112e948260f8","size":143780,"filename":"pool/main/d/dotnet-hostfxr-2.1/dotnet-hostfxr-2.1.25-x64.deb"},{"package":"aspnetcore-runtime-5.0","version":"5.0.7-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":18557,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-5.0 (>= 5.0.7)","sha256":"386f3e029fb52b33fcc5b98cbc481c17f0d496a609523b1878cfa16173bb61bc","size":6087024,"filename":"pool/main/a/aspnetcore-runtime-5.0/aspnetcore-runtime-5.0.7-x64.deb"},{"package":"aadsshlogin","version":"1.0.016820001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"AAD NSS, PAM and certhandler extensions","conflicts":"aadlogin","depends":"libcurl4, libuuid1, openssh-server (>=6.9)","sha256":"68466418441afe8eb6b557d81065eb47d43646b9538c0c996ecbe8c58dbe6e75","size":418558,"filename":"pool/main/a/aadsshlogin/aadsshlogin_1.0.016820001_amd64.deb"},{"package":"dotnet-runtime-deps-7.0","version":"7.0.1-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":9,"maintainer":".NET Team ","description":"dotnet-runtime-deps-debian 7.0.1","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, libssl1.0.0 | libssl1.0.2 | libssl1.1 | libssl3, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"d50a5c1bd8242f0320d52774d5266d94fae98779f49d9a8a096855d56177c571","size":2890,"filename":"pool/main/d/dotnet-runtime-deps-7.0/dotnet-runtime-deps-7.0.1-x64.deb"},{"package":"dotnet-host","version":"3.1.31-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":145,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 3.1.31","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"50e08c977e2cb6c3353a59c323bf52d57b78ca74c061b3ee659132103b2eca33","size":32458,"filename":"pool/main/d/dotnet-host/dotnet-host-3.1.31-x64.deb"},{"package":"sysmonforlinux","version":"1.1.0","architecture":"amd64","installed_size":3082,"maintainer":"Sysinternals ","description":"A system monitor based on eBPF, ported from Windows, that outputs events to Syslog","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 5), libxml2 (>= 2.7.4), sysinternalsebpf (>= 1.0.2)","sha256":"b1f813bc8e0359f218dfb182bb64f8b5c0f6fc352e72e615758826841739e58e","size":1515746,"filename":"pool/main/s/sysmonforlinux/sysmonforlinux_1.1.0-0_amd64.deb"},{"package":"moby-containerd","version":"1.3.5+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":126903,"maintainer":"Microsoft ","description":"industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.10)","depends":"libc6 (>= 2.4), libseccomp2 (>= 2.4.1)","recommends":"ca-certificates, moby-runc (>= 1.0.0~rc10)","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"62378c56cd108ebaad70d9e0bfe8c30f715c2ae86df2393435303ceb1ed2aded","size":27668988,"filename":"pool/main/m/moby-containerd/moby-containerd_1.3.5+azure-1_amd64.deb"},{"package":"aziot-identity-service","version":"1.4.1-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":18065,"maintainer":"Azure IoT Edge Devs","description":"Azure IoT Identity Service and related services","homepage":"https://github.com/azure/iot-identity-service","conflicts":"iotedge, libiothsm-std","depends":"libc6 (>= 2.29), libgcc-s1 (>= 3.3), libssl1.1 (>= 1.1.0g), libtss2-esys0 (>= 2.3.1)","sha256":"d4725a8504b3a6d73f7cb82907d02e9c2176424432ad35e7fcb2d468841bf528","size":3863540,"filename":"pool/main/a/aziot-identity-service/aziot-identity-service_1.4.1-1_amd64.deb"},{"package":"azapi2azurerm","version":"1.1.0","architecture":"amd64","section":"default","priority":"optional","installed_size":20596,"maintainer":"henglu ","description":"A tool to migrate terraform resources from azapi to azurerm","homepage":"https://github.com/Azure/azapi2azurerm","vendor":"none","license":"MPL-2.0","sha256":"3d76c30d08189db164b13f34a39bfb57e8a79700effa18024b9d1fcd2aa66673","size":6702890,"filename":"pool/main/a/azapi2azurerm/azapi2azurerm-1.1.0-1-amd64.deb"},{"package":"dotnet-hostfxr-6.0","version":"6.0.13-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":452,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 6.0.13","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 6.0.13), libc6","sha256":"93ef511b5897aead2d0d9452c19aa0d9b938e6e7986edd76fb781fb6b770f4f6","size":142394,"filename":"pool/main/d/dotnet-hostfxr-6.0/dotnet-hostfxr-6.0.13-x64.deb"},{"package":"dotnet-hostfxr-5.0","version":"5.0.5-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":436,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 5.0.5 5.0.5","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 5.0.5), libc6","sha256":"9125c2843951d5149930d1260854223ce4050eb86a9b9bbe6a5056c4b64c274d","size":140778,"filename":"pool/main/d/dotnet-hostfxr-5.0/dotnet-hostfxr-5.0.5-x64.deb"},{"package":"azure-ai-vision-runtime-core","version":"0.8.1~beta.1","architecture":"amd64","section":"devel","priority":"optional","installed_size":2492,"maintainer":"vision-sdk@microsoft.com","description":"Azure AI Vision Core Runtime Package","depends":"libc6 (>= 2.4), libgcc1 (>= 1:3.3.1), libstdc++6 (>= 6), libuuid1 (>= 2.16)","sha256":"7505fd24b596049d1b573bcda9df3f1b3bb7be7611734a91825f1442d2587c4e","size":602668,"filename":"pool/main/a/azure-ai-vision-runtime-core/azure-ai-vision-runtime-core-0.8.1~beta.1-Linux.deb"},{"package":"dotnet-runtime-3.1","version":"3.1.6-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":71088,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 3.1.6 Microsoft.NETCore.App 3.1.6","homepage":"https://dot.net/core","depends":"dotnet-hostfxr-3.1 (>= 3.1.6), dotnet-runtime-deps-3.1 (>= 3.1.6)","sha256":"b2b20959dcca02ffdabe5a7b212ed63d1d3a454603ab34c2c7df5f9f52671a21","size":21776838,"filename":"pool/main/d/dotnet-runtime-3.1/dotnet-runtime-3.1.6-x64.deb"},{"package":"dotnet-hostfxr-6.0","version":"6.0.0-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":452,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 6.0.0","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 6.0.0), libc6","sha256":"4e10a768c6e9bee484c47e4d4e4d321556c9c5cb283d06a2655cd678497f881f","size":142176,"filename":"pool/main/d/dotnet-hostfxr-6.0/dotnet-hostfxr-6.0.0-x64.deb"},{"package":"dotnet-sdk-5.0","version":"5.0.406-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":228009,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 5.0.406","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.4.0), dotnet-runtime-5.0 (>= 5.0.15), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-5.0 (>= 5.0.15), dotnet-targeting-pack-5.0 (>= 5.0.0), aspnetcore-targeting-pack-5.0 (>= 5.0.0), dotnet-apphost-pack-5.0 (>= 5.0.15)","sha256":"361a22a6e60ec80a40351b2e1453a389e1702b31bec93ed5ceacd4fe17527874","size":58788182,"filename":"pool/main/d/dotnet-sdk-5.0/dotnet-sdk-5.0.406-x64.deb"},{"package":"dotnet-hostfxr-5.0","version":"5.0.15-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":436,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 5.0.15 5.0.15","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 5.0.15), libc6","sha256":"d9683a54735da8114110ba75f1da9f15e1f2692b2ad33df3a6d8f95477fa35a4","size":140318,"filename":"pool/main/d/dotnet-hostfxr-5.0/dotnet-hostfxr-5.0.15-x64.deb"},{"package":"moby-compose","version":"2.18.1+azure-ubuntu20.04u2","architecture":"amd64","section":"admin","priority":"optional","installed_size":52732,"maintainer":"Microsoft ","description":"A Docker CLI plugin which allows you to run Docker Compose applications from the Docker CLI.","homepage":"https://github.com/docker/compose-cli","conflicts":"docker-ce, docker-ce-cli, docker-ee, docker-ee-cli","depends":"moby-cli","sha256":"5636c437bdf857d8835c7c1ab26c6beada631fe4989efd3cd2d01140120a860b","size":10877354,"filename":"pool/main/m/moby-compose/moby-compose_2.18.1+azure-ubuntu20.04u2_amd64.deb"},{"package":"aspnetcore-targeting-pack-6.0","version":"6.0.12-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":11746,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-targeting-pack-6.0 (>= 6.0.12)","sha256":"3f8aeb1f6a3d17bf42d286c5083d43f65f07d08ba0195a88992a02b023320210","size":1314262,"filename":"pool/main/a/aspnetcore-targeting-pack-6.0/aspnetcore-targeting-pack-6.0.12-x64.deb"},{"package":"dotnet-runtime-deps-5.0","version":"5.0.13-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Team ","description":"dotnet-runtime-deps-5.0 5.0.13","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"3da92fd67c733645ccdba3b0608bb1382a4e949193d5cd2eec0e1ff37e61cbb0","size":2654,"filename":"pool/main/d/dotnet-runtime-deps-5.0/dotnet-runtime-deps-5.0.13-x64.deb"},{"package":"dotnet-sdk-2.1","version":"2.1.519-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":228812,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 2.1.519","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.8), dotnet-runtime-2.1 (>= 2.1.23), aspnetcore-runtime-2.1 (>= 2.1.23)","sha256":"a59888761f41fb6d1953ea2e30d4e6194bc1a610f2a93046655d290e361c982e","size":88705220,"filename":"pool/main/d/dotnet-sdk-2.1/dotnet-sdk-2.1.519-x64.deb"},{"package":"dotnet-sdk-6.0","version":"6.0.316-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":331512,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 6.0.316","homepage":"https://github.com/dotnet/core","depends":"dotnet-targeting-pack-6.0 (>= 6.0.21), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-6.0 (>= 6.0.21), dotnet-apphost-pack-6.0 (>= 6.0.21), dotnet-runtime-6.0 (>= 6.0.21), aspnetcore-targeting-pack-6.0 (>= 6.0.21)","sha256":"47cfedb8743e3dbea1e1e600cd95706dfa2f6efe425cf4662693d8734405ee8f","size":85176670,"filename":"pool/main/d/dotnet-sdk-6.0/dotnet-sdk-6.0_6.0.316-1_amd64.deb"},{"package":"aadsshlogin","version":"1.0.016890001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"AAD NSS, PAM and certhandler extensions","conflicts":"aadlogin","depends":"libcurl4, libuuid1, openssh-server (>=6.9)","sha256":"96ae0131a8f65e2f5deddce96f8cd00b750a8fd86379ca63ae7851f77e063700","size":419334,"filename":"pool/main/a/aadsshlogin/aadsshlogin_1.0.016890001_amd64.deb"},{"package":"dotnet-targeting-pack-6.0","version":"6.0.7-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":27360,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Ref 6.0.7","homepage":"https://github.com/dotnet/core","sha256":"0edf4c43e4be13a8390269ffea663cfc7a6a25a5faac9afcf4b8189abef8de10","size":2124278,"filename":"pool/main/d/dotnet-targeting-pack-6.0/dotnet-targeting-pack-6.0.7-x64.deb"},{"package":"mystikos","version":"0.12.0","architecture":"amd64","priority":"optional","maintainer":"mystikos@service.microsoft.com","description":"Mystikos","depends":"libsgx-enclave-common (>=2.3.100.46354-1), libsgx-dcap-ql (>=1.0.100.46460-1.0), libsgx-dcap-ql-dev (>=1.0.100.46460-1.0)","sha256":"770c905b3d7e55cd373b5459fddb2c2e14163d31218f424bdc850a4764ece70d","size":6579698,"filename":"pool/main/m/mystikos/mystikos_0.12.0_amd64.deb"},{"package":"open-enclave","version":"0.19.0","architecture":"amd64","section":"devel","priority":"optional","installed_size":124310,"maintainer":"oesdk@lists.confidentialcomputing.io","description":"Open Enclave SDK","depends":"libsgx-enclave-common (>=2.3.100.46354-1), libsgx-dcap-ql (>=1.0.100.46460-1.0)","recommends":"pkg-config","sha256":"db486581c4046e9c983e71df1556a3568dd9ed6aed55e278fce721c827bddbcf","size":34456690,"filename":"pool/main/o/open-enclave/Ubuntu_2004_open-enclave_0.19.0_amd64.deb"},{"package":"dotnet-runtime-deps-2.1","version":"2.1.23-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Core Team ","description":"dotnet-runtime-deps-2.1 2.1.23","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, liblttng-ust0, libc6, libicu | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"8ab1b6ef86eac3f6043c56bc6d4c2906e547474885a27b9fca89a45e717bcd04","size":2666,"filename":"pool/main/d/dotnet-runtime-deps-2.1/dotnet-runtime-deps-2.1.23-ubuntu.14.04-x64.deb"},{"package":"azure-functions-core-tools-3","version":"3.0.4626-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v3","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"022b3e1cf0a2b0c3c140aa89d992dbf8b428378610056b888ea890ec95ceaced","size":227619356,"filename":"pool/main/a/azure-functions-core-tools-3/azure-functions-core-tools-3_3.0.4626-1.deb"},{"package":"powershell","version":"7.2.13-1.deb","architecture":"amd64","section":"shells","priority":"extra","installed_size":168858,"maintainer":"PowerShell Team ","description":"PowerShell is an automation and configuration management platform.","homepage":"https://microsoft.com/powershell","depends":"libc6, libgcc1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.0.0","vendor":"Microsoft Corporation","license":"MIT License","sha256":"0af024461c5184a387fb346ee00b3da3da5fa734ce7bdeec65b085870ca4ea7e","size":68393634,"filename":"pool/main/p/powershell/powershell_7.2.13-1.deb_amd64.deb"},{"package":"dotnet-runtime-deps-3.1","version":"3.1.24-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Core Team ","description":"dotnet-runtime-deps-3.1 3.1.24","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"b7518a808d2ba0cf80647bc5b0f7cfca6f8bae47d743961e5da83352c31ea64a","size":2684,"filename":"pool/main/d/dotnet-runtime-deps-3.1/dotnet-runtime-deps-3.1.24-x64.deb"},{"package":"azure-functions-core-tools-3","version":"3.0.3785-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v3","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"ce2c901402023712f4554503d55066540b03d87efdce76db242e1db2b441390d","size":209992028,"filename":"pool/main/a/azure-functions-core-tools-3/azure-functions-core-tools-3_3.0.3785-1.deb"},{"package":"dotnet-apphost-pack-3.1","version":"3.1.17-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":214,"maintainer":".NET Core Team ","description":"Microsoft.NETCore.App.Host 3.1.17","homepage":"https://github.com/dotnet/core","sha256":"1ea44b76143ccedabec500b42707d06edc50041d0d26b7d0689cd2a7f8e364d3","size":42336,"filename":"pool/main/d/dotnet-apphost-pack-3.1/dotnet-apphost-pack-3.1.17-x64.deb"},{"package":"dotnet-runtime-2.1","version":"2.1.27-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68171,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 2.1.27 Microsoft.NETCore.App 2.1.27","homepage":"https://dot.net/core","depends":"dotnet-runtime-deps-2.1 (>= 2.1.27), dotnet-hostfxr-2.1 (>= 2.1.27)","sha256":"a3f9825b3ffe3087d7c5ebea0ee16cab29759fbdc4ab633455c7a9ed5c6f6d2a","size":20332510,"filename":"pool/main/d/dotnet-runtime-2.1/dotnet-runtime-2.1.27-x64.deb"},{"package":"azcmagent","version":"1.15.01874.34","architecture":"amd64","maintainer":"Azure Connected Machine Agent ","description":"Azure Connected Machine Agent","depends":"curl","package_type":"deb","sha256":"e30e3813d8803cc7e69e61f3d6440fcd1224451b446a596241bf913ebf840ef4","size":51722932,"filename":"pool/main/a/azcmagent/azcmagent_1.15.01874.34_amd64.deb"},{"package":"moby-containerd","version":"1.6.17+azure-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":123878,"maintainer":"Microsoft ","description":"Industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.2)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"a08844feebd523f95dc261969c609f253d7bdafa34d02fa9887759c15164e31c","size":30980814,"filename":"pool/main/m/moby-containerd/moby-containerd_1.6.17+azure-ubuntu20.04u1_amd64.deb"},{"package":"aspnetcore-targeting-pack-6.0","version":"6.0.5-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":11724,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-targeting-pack-6.0 (>= 6.0.5)","sha256":"29b8a014222d013e3cd033f89d51bd7b1fdf5253e1be0dd94e22f219d779417b","size":1307204,"filename":"pool/main/a/aspnetcore-targeting-pack-6.0/aspnetcore-targeting-pack-6.0.5-x64.deb"},{"package":"dotnet-hostfxr-3.1","version":"3.1.17-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":408,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host FX Resolver - 3.1.17 3.1.17","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 3.1.17), libc6","sha256":"675177925887deef31b6b82e5226234ce7a2a20ccd152255e0e1eff469869675","size":120782,"filename":"pool/main/d/dotnet-hostfxr-3.1/dotnet-hostfxr-3.1.17-x64.deb"},{"package":"intune-portal","version":"1.2210.50","architecture":"amd64","section":"utils","priority":"optional","installed_size":26727,"maintainer":"Microsoft","description":"Microsoft Intune","a_note_about_intune":"every organization has different access requirements, and","depends":"gnome-keyring (>= 3.36), libsoup2.4-1 (>= 2.4.0), libpam-pwquality (>= 1.4.0-2), libjavascriptcoregtk-4.0-18, libsqlite3-0 (>= 3.7.14), libuuid1 (>= 2.16), libc6 (>= 2.28), libcurl4 (>= 7.16.2), libwebkit2gtk-4.0-37 (>= 2.5.3), libpango-1.0-0 (>= 1.14.0), zlib1g (>= 1:1.2.0), libglib2.0-0 (>= 2.12.0), libatk1.0-0 (>= 1.12.4), libgtk-3-0 (>= 3.16.2), libx11-6, libpam0g (>= 0.99.7.1), libstdc++6 (>= 9), libc6 (>= 2.29), libgtk-3-0 (>= 3.9.10), libglib2.0-0 (>= 2.35.8), libssl1.1 (>= 1.1.0), msalsdk-dbusclient (>= 1.0), libsecret-1-0 (>= 0.19.1)","recommends":"microsoft-edge-stable (>= 102)","sha256":"a25651c703a76d9a6c8c7b3753fc4e269cc8dcda7f3618db609da97a9df92941","size":6756548,"filename":"pool/main/i/intune-portal/intune-portal_1.2210.50_amd64.deb"},{"package":"azure-ai-vision-runtime-common","version":"0.13.0~beta.1","architecture":"amd64","section":"devel","priority":"optional","installed_size":2729,"maintainer":"vision-sdk@microsoft.com","description":"Azure AI Vision Common Components Runtime Package","depends":"libc6 (>= 2.4), libgcc1 (>= 1:3.3.1), libstdc++6 (>= 6), libuuid1 (>= 2.16)","sha256":"3bfe8ee9b4483f22e063417f8441365e412007ce4242107e6857b6c89a25fe67","size":684054,"filename":"pool/main/a/azure-ai-vision-runtime-common/azure-ai-vision-runtime-common-0.13.0~beta.1-Linux.deb"},{"package":"dotnet-hostfxr-6.0","version":"6.0.24-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":452,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 6.0.24","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 6.0.24), libc6","sha256":"78a20e961d0562c05c79ed809636535c594f3cfeb18b9b662d7768757bd7c8b9","size":142386,"filename":"pool/main/d/dotnet-hostfxr-6.0/dotnet-hostfxr-6.0_6.0.24-1_amd64.deb"},{"package":"moby-tini","version":"0.19.0-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":823,"maintainer":"Microsoft ","description":"tiny but valid init for containers","homepage":"https://github.com/krallin/tini","sha256":"f9e1777db87f1d10edf19f35b62bf9288ff47f1ebbb219edcaa3cd1db4539430","size":349856,"filename":"pool/main/m/moby-tini/moby-tini_0.19.0-ubuntu20.04u1_amd64.deb"},{"package":"dotnet-runtime-7.0","version":"7.0.10-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":70843,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Runtime 7.0.10","homepage":"https://github.com/dotnet/core","depends":"dotnet-runtime-deps-7.0 (>= 7.0.10), dotnet-hostfxr-7.0 (>= 7.0.10)","sha256":"61ff73e62903f96a7f4e85005bbae9c324958747a1369684754b9da69dfce308","size":23207202,"filename":"pool/main/d/dotnet-runtime-7.0/dotnet-runtime-7.0_7.0.10-1_amd64.deb"},{"package":"intune-portal","version":"1.2302.11","architecture":"amd64","section":"utils","priority":"optional","installed_size":18603,"maintainer":"Microsoft","description":"Microsoft Intune","a_note_about_intune":"every organization has different access requirements, and","depends":"msalsdk-dbusclient (>= 1.0), libc6 (>= 2.29), libsqlite3-0 (>= 3.7.14), libgtk-3-0 (>= 3.21.4), libpam-pwquality (>= 1.4.0-2), libatk1.0-0 (>= 1.12.4), gnome-keyring (>= 3.36), libuuid1 (>= 2.16), libsoup2.4-1 (>= 2.4.0), libstdc++6 (>= 9), libcurl4 (>= 7.16.2), libjavascriptcoregtk-4.0-18, libssl1.1 (>= 1.1.0), libglib2.0-0 (>= 2.12.0), libpam0g (>= 0.99.7.1), libsecret-1-0 (>= 0.19.1), libwebkit2gtk-4.0-37 (>= 2.5.3), zlib1g (>= 1:1.2.0), libx11-6, libglib2.0-0 (>= 2.35.8), libpango-1.0-0 (>= 1.14.0), libgtk-3-0 (>= 3.9.10), libc6 (>= 2.28), libsystemd0","recommends":"microsoft-edge-stable (>= 102)","sha256":"685c7f694bf7a1e3e8cf1cbed3198a218283c37c0b23eebdf543eec400f10374","size":3344596,"filename":"pool/main/i/intune-portal/intune-portal_1.2302.11_amd64.deb"},{"package":"msopenjdk-16","version":"16.0.2+7-1","architecture":"amd64","section":"java","priority":"extra","installed_size":348986,"maintainer":"Microsoft","description":"OpenJDK Development Kit 16 (JDK) with Hotspot by Microsoft","homepage":"https://www.microsoft.com","depends":"ca-certificates, fonts-dejavu, java-common, libasound2, libc6, libfreetype6, libfontconfig1, libx11-6, libxext6, libxi6, libxrender1, libxtst6, zlib1g","provides":"java-compiler, java-sdk, java-sdk-headless, java10-sdk, java11-sdk, java12-sdk, java13-sdk, java14-sdk, java15-sdk, java16-sdk, java2-sdk, java5-sdk, java6-sdk, java7-sdk, java8-sdk, java9-sdk, java10-sdk-headless, java11-sdk-headless, java12-sdk-headless, java13-sdk-headless, java14-sdk-headless, java15-sdk-headless, java16-sdk-headless, java2-sdk-headless, java5-sdk-headless, java6-sdk-headless, java7-sdk-headless, java8-sdk-headless, java9-sdk-headless, java-runtime, java-runtime-headless, java10-runtime, java11-runtime, java12-runtime, java13-runtime, java14-runtime, java15-runtime, java16-runtime, java2-runtime, java5-runtime, java6-runtime, java7-runtime, java8-runtime, java9-runtime, java10-runtime-headless, java11-runtime-headless, java12-runtime-headless, java13-runtime-headless, java14-runtime-headless, java15-runtime-headless, java16-runtime-headless, java2-runtime-headless, java5-runtime-headless, java6-runtime-headless, java7-runtime-headless, java8-runtime-headless, java9-runtime-headless","vendor":"Microsoft","license":"GPL-2.0+CE","sha256":"5a711a4e64db7b4b7b0b0e79be0fd182722b16e83bac584d2edfa92c309fc433","size":205342114,"filename":"pool/main/m/msopenjdk-16/msopenjdk-16_16.0.2+7-1_amd64.deb"},{"package":"aspnetcore-targeting-pack-7.0","version":"7.0.11-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":13097,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-targeting-pack-7.0 (>= 7.0.11)","sha256":"f978b549faf888d3b27caecc94ed4afe26b9bd7be908e44349e7fc7b749747fc","size":1526066,"filename":"pool/main/a/aspnetcore-targeting-pack-7.0/aspnetcore-targeting-pack-7.0_7.0.11-1_amd64.deb"},{"package":"aspnetcore-runtime-2.1","version":"2.1.19-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":71044,"maintainer":"Microsoft ","description":"Microsoft ASP.NET Core 2.1.19 Shared Framework","homepage":"https://www.asp.net/","depends":"libc6 (>= 2.14), dotnet-runtime-2.1 (>= 2.1.19)","sha256":"be05d2befe19c95107b1cde4fc0abe6fa6b0e4cca03f1be32408505851f2e5ce","size":21928174,"filename":"pool/main/a/aspnetcore-runtime-2.1/aspnetcore-runtime-2.1.19-x64.deb"},{"package":"aspnetcore-targeting-pack-6.0","version":"6.0.8-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":11724,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-targeting-pack-6.0 (>= 6.0.8)","sha256":"5f5903bfd7dfc455dd48530121cd67250de834a5667fc1a022e976238ee6e5f5","size":1307476,"filename":"pool/main/a/aspnetcore-targeting-pack-6.0/aspnetcore-targeting-pack-6.0.8-x64.deb"},{"package":"dotnet-apphost-pack-7.0","version":"7.0.5-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":11285,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Host 7.0.5","homepage":"https://github.com/dotnet/core","sha256":"4eebb74f244a7909a4b8a72ca1ffd3a75fa75a192917285f513986393c504645","size":3523918,"filename":"pool/main/d/dotnet-apphost-pack-7.0/dotnet-apphost-pack-7.0.5-x64.deb"},{"package":"dotnet-sdk-5.0","version":"5.0.402-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":227516,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 5.0.402","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.4.0), dotnet-runtime-5.0 (>= 5.0.11), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-5.0 (>= 5.0.11), dotnet-targeting-pack-5.0 (>= 5.0.0), aspnetcore-targeting-pack-5.0 (>= 5.0.0), dotnet-apphost-pack-5.0 (>= 5.0.11)","sha256":"d84b52c828206632fee8f7f830ccf87847b8a66d65f8d91a66f98f08f200e4a5","size":59002212,"filename":"pool/main/d/dotnet-sdk-5.0/dotnet-sdk-5.0.402-x64.deb"},{"package":"dotnet-apphost-pack-5.0","version":"5.0.6-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":10784,"maintainer":".NET Core Team ","description":"Microsoft.NETCore.App.Host 5.0.6","homepage":"https://github.com/dotnet/core","sha256":"8d0f284061b82e7ba4089363a14630bc7e0d5ecf89e2a14a2130b8660e34ed01","size":3411678,"filename":"pool/main/d/dotnet-apphost-pack-5.0/dotnet-apphost-pack-5.0.6-x64.deb"},{"package":"open-enclave","version":"0.17.2","architecture":"amd64","section":"devel","priority":"optional","installed_size":113802,"maintainer":"oesdk@lists.confidentialcomputing.io","description":"Open Enclave SDK","depends":"libsgx-enclave-common (>=2.3.100.46354-1), libsgx-dcap-ql (>=1.0.100.46460-1.0), libsgx-dcap-ql-dev (>=1.0.100.46460-1.0)","recommends":"pkg-config","sha256":"1b4d1a00cf3e49a79f8b4c7bc7738a815cbb68c29ea3a896225664e1a8cc02f8","size":31111910,"filename":"pool/main/o/open-enclave/open-enclave_0.17.2_amd64.deb"},{"package":"dotnet-hostfxr-3.1","version":"3.1.30-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":408,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host FX Resolver - 3.1.30 3.1.30","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 3.1.30), libc6","sha256":"be3ff69b76c9ceca3c2e664ae2829cedeeebe40a6a8113c65cb3d39c3c15b006","size":120710,"filename":"pool/main/d/dotnet-hostfxr-3.1/dotnet-hostfxr-3.1.30-x64.deb"},{"package":"azcmagent","version":"1.10.21228.010","architecture":"amd64","maintainer":"Azure Connected Machine Agent ","description":"Azure Connected Machine Agent","depends":"curl","package_type":"deb","sha256":"279296ab5dc1f4455a8ba0d2c50247c5c0db6028c648e32ed9e33c201be46009","size":49565968,"filename":"pool/main/a/azcmagent/azcmagent_1.10.21228.010_amd64.deb"},{"package":"aadsshlogin-selinux","version":"1.0.022090001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"Selinux configuration for AAD NSS and PAM extensions.","conflicts":"aadlogin-selinux","depends":"policycoreutils (>=3.0-1), selinux-utils, selinux-policy-default","sha256":"b1e6af88a0ee657e0147ba620ffb0797e88185e9c81e8d39fcb4eb21cd1721ee","size":2374,"filename":"pool/main/a/aadsshlogin-selinux/aadsshlogin-selinux_1.0.022090001_amd64.deb"},{"package":"aadlogin-selinux","version":"1.0.015280001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"Selinux configuration for aadlogin NSS and PAM extensions.","depends":"policycoreutils (>=3.0-1), selinux-utils, selinux-policy-default","sha256":"bee6959620c1cf6a6018d530e34b328c8ae3ef6ef5ac9ed725177cc45c3bb158","size":10124,"filename":"pool/main/a/aadlogin-selinux/aadlogin-selinux_1.0.015280001_amd64.deb"},{"package":"aspnetcore-runtime-5.0","version":"5.0.5-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":18557,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-5.0 (>= 5.0.5)","sha256":"13624f3fb400d4daba08db8c7b81a08fbe0e76d012741092e1bec6630217ed74","size":6086620,"filename":"pool/main/a/aspnetcore-runtime-5.0/aspnetcore-runtime-5.0.5-x64.deb"},{"package":"moby-containerd","version":"1.4.12+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":120078,"maintainer":"Microsoft ","description":"industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.2)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"7286ff6948a8668ec80770b44d4f665ba87c8ce39ea00b5d52fa6ed3dff0e0a0","size":26989344,"filename":"pool/main/m/moby-containerd/moby-containerd_1.4.12+azure-1_amd64.deb"},{"package":"blobfuse","version":"1.4.2","architecture":"amd64","section":"devel","priority":"optional","installed_size":34258,"maintainer":"Microsoft - Azure Storage","description":"blobfuse 1.4.2 - FUSE adapter for Azure Blob Storage","depends":"fuse","sha256":"03c3eb0229ea30aa561b231555cc8971c071d424f535bb1b79dc79e0a922d4a8","size":9837918,"filename":"pool/main/b/blobfuse/blobfuse-1.4.2-ubuntu-20.04-x86_64.deb"},{"package":"azure-functions-core-tools-4","version":"4.0.4544-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v4","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2, azure-functions-core-tools-3","replaces":"azure-functions-core-tools, azure-functions-core-tools-2, azure-functions-core-tools-3","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"d0e717c4b68da8d23ca511e28c5816c1f97a9f28b39af6500cbce82d516ad4db","size":141849620,"filename":"pool/main/a/azure-functions-core-tools-4/azure-functions-core-tools-4_4.0.4544-1.deb"},{"package":"defender-iot-micro-agent","version":"3.13.1","architecture":"amd64","priority":"optional","essential":"no","maintainer":"Microsoft","description":"Microsoft Defender for IoT Micro Agent","conflicts":"defender-iot-micro-agent-edge","depends":"libuv1, curl, libssl1.1, uuid-runtime, sudo, libpcap0.8, dmidecode","sha256":"89c53fc7ed37643ada062c31d3242b137867b0270077bbab5e8e44265f3cf0ac","size":276272,"filename":"pool/main/d/defender-iot-micro-agent/defenderiot-ubuntu-20.04-amd64-3.13.1.deb"},{"package":"scx","source":"scx","version":"1.6.11.0","architecture":"amd64","section":"utils","priority":"optional","installed_size":7916,"maintainer":"Microsoft Corporation","description":"Microsoft System Center Operations Manager for UNIX/Linux agent","depends":"omi (>= 1.0.8.6)","provides":"scx","sha256":"8efc366fcd0bea36aa4e7350f1fcefa009b8c3c5e2c08124882dc2ceadb526dc","size":2588282,"filename":"pool/main/s/scx/scx-1.6.11-0.universal.x64.deb"},{"package":"procdump","version":"1.1.1-220","architecture":"amd64","section":"devel","priority":"optional","installed_size":280,"maintainer":"OSS Tooling Dev Team ","description":"Sysinternals process dump utility","homepage":"https://github.com/Microsoft/ProcDump-for-Linux","depends":"gdb (>= 7.6.1), libc6","sha256":"aa9b16f4940719db016ae7645c3deb3abefcda85ec37373be7239d0a36015901","size":91470,"filename":"pool/main/p/procdump/procdump_1.1.1-220_amd64.deb"},{"package":"moby-runc","version":"1.1.4+azure-ubuntu20.04u3","architecture":"amd64","section":"admin","priority":"optional","installed_size":14263,"maintainer":"Microsoft ","description":"CLI tool for spawning and running containers according to the OCI specification","homepage":"https://github.com/opencontainers/runc","conflicts":"moby-engine (<= 3.0.10), runc","depends":"libc6 (>= 2.14), libseccomp2 (>= 2.5.0)","suggests":"moby-containerd","provides":"runc","replaces":"runc","sha256":"3788fcba514cd7f6813cad1cc023a87a0c354b5e62fb0bba66f999622d6030fe","size":5341828,"filename":"pool/main/m/moby-runc/moby-runc_1.1.4+azure-ubuntu20.04u3_amd64.deb"},{"package":"dotnet-runtime-6.0","version":"6.0.13-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68422,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Runtime 6.0.13","homepage":"https://github.com/dotnet/core","depends":"dotnet-hostfxr-6.0 (>= 6.0.13), dotnet-runtime-deps-6.0 (>= 6.0.13)","sha256":"0e1debddea9b7ff4939a88af07867fcefc87b2f468f98f71fadd4aa71b176a80","size":22613226,"filename":"pool/main/d/dotnet-runtime-6.0/dotnet-runtime-6.0.13-x64.deb"},{"package":"dotnet-apphost-pack-7.0","version":"7.0.3-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":11277,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Host 7.0.3","homepage":"https://github.com/dotnet/core","sha256":"c6bbe37dd7bbeccff48a6b65ab692f6d778ae9dc5af29816541a54682df2f35e","size":3524590,"filename":"pool/main/d/dotnet-apphost-pack-7.0/dotnet-apphost-pack-7.0.3-x64.deb"},{"package":"dotnet-runtime-deps-3.1","version":"3.1.32-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Core Team ","description":"dotnet-runtime-deps-3.1 3.1.32","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"cae69c3c33de3da4bfcd4b7efa29c4023c518e4adba34056ebaa1b0f9f78ba22","size":2674,"filename":"pool/main/d/dotnet-runtime-deps-3.1/dotnet-runtime-deps-3.1.32-x64.deb"},{"package":"moby-compose","version":"2.21.0-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":59364,"maintainer":"Microsoft ","description":"A Docker CLI plugin which allows you to run Docker Compose applications from the Docker CLI.","homepage":"https://github.com/docker/compose-cli","conflicts":"docker-ce, docker-ce-cli, docker-ee, docker-ee-cli","depends":"libc6 (>= 2.3.4), moby-cli","sha256":"e9f35d0b7fd6e8032d7a1be840dd7546a17a76a78ce2dc244846e2e5c01309b1","size":17815234,"filename":"pool/main/m/moby-compose/moby-compose_2.21.0-ubuntu20.04u1_amd64.deb"},{"package":"libmsquic","version":"2.1.3","architecture":"amd64","section":"default","priority":"extra","installed_size":16079,"maintainer":"Microsoft QUIC Team ","description":"Microsoft implementation of the IETF QUIC protocol","homepage":"https://github.com/microsoft/msquic","conflicts":"libmsquic-debug","provides":"libmsquic","vendor":"Microsoft","license":"MIT","sha256":"468e51c36fa323f47ae5789cf8ae9d45475d3639062bae7e8db688d4fa85154d","size":4117940,"filename":"pool/main/libm/libmsquic/libmsquic_2.1.3_amd64.deb"},{"package":"aspnetcore-runtime-2.1","version":"2.1.23-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":71082,"maintainer":"Microsoft ","description":"Microsoft ASP.NET Core 2.1.23 Shared Framework","homepage":"https://www.asp.net/","depends":"libc6 (>= 2.14), dotnet-runtime-2.1 (>= 2.1.23)","sha256":"d8a5eef5d923878c0a7533aed050532a30b0dba4ca34cce16997633eb6f13bc0","size":21927716,"filename":"pool/main/a/aspnetcore-runtime-2.1/aspnetcore-runtime-2.1.23-x64.deb"},{"package":"aziot-edge","version":"1.4.20-1","architecture":"amd64","section":"admin","priority":"extra","installed_size":18518,"maintainer":"Azure IoT Edge Devs","description":"Azure IoT Edge Module Runtime","homepage":"https://github.com/azure/iotedge","depends":"adduser, ca-certificates, hostname, aziot-identity-service (= 1.4.6-1), sed","sha256":"201b83f04628b7b4ca023681fc1cfb79c31a58fad34bf5aa46fada8554f170ee","size":4431946,"filename":"pool/main/a/aziot-edge/aziot-edge_1.4.20-1_amd64.deb"},{"package":"dotnet-hostfxr-5.0","version":"5.0.9-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":436,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 5.0.9 5.0.9","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 5.0.9), libc6","sha256":"f8bf3566081aaf2d5d48876aa066a63f19112718076a64d72286492927b2848f","size":140282,"filename":"pool/main/d/dotnet-hostfxr-5.0/dotnet-hostfxr-5.0.9-x64.deb"},{"package":"dotnet-runtime-5.0","version":"5.0.5-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68328,"maintainer":".NET Team ","description":"Microsoft .NET Runtime - 5.0.5 Microsoft.NETCore.App 5.0.5","homepage":"https://dot.net/core","depends":"dotnet-runtime-deps-5.0 (>= 5.0.5), dotnet-hostfxr-5.0 (>= 5.0.5)","sha256":"212e1082ed580e382c344308ceaa810c4c6b22369578fb02799fc7d765f3c51f","size":21795820,"filename":"pool/main/d/dotnet-runtime-5.0/dotnet-runtime-5.0.5-x64.deb"},{"package":"dotnet-apphost-pack-3.1","version":"3.1.23-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":214,"maintainer":".NET Core Team ","description":"Microsoft.NETCore.App.Host 3.1.23","homepage":"https://github.com/dotnet/core","sha256":"6055ab67097c149fdbde1ce7da11181f5198f72eccbedf998cd1e5dcc38b788b","size":41920,"filename":"pool/main/d/dotnet-apphost-pack-3.1/dotnet-apphost-pack-3.1.23-x64.deb"},{"package":"moby-containerd","version":"1.4.4+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":138428,"maintainer":"Microsoft ","description":"industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.0~rc10)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"b73911216929949d23a8b4a664b75a0dd5c676488fb38ce74f5a2d25439300ef","size":30822564,"filename":"pool/main/m/moby-containerd/moby-containerd_1.4.4+azure-1_amd64.deb"},{"package":"aspnetcore-targeting-pack-6.0","version":"6.0.22-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":11749,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-targeting-pack-6.0 (>= 6.0.22)","sha256":"b96158bd7f48db6917e50449fcadb7e6d154735ec19973410c81da18b4585f4f","size":1315894,"filename":"pool/main/a/aspnetcore-targeting-pack-6.0/aspnetcore-targeting-pack-6.0_6.0.22-1_amd64.deb"},{"package":"dotnet-sdk-6.0","version":"6.0.112-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":313428,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 6.0.112","homepage":"https://github.com/dotnet/core","depends":"dotnet-targeting-pack-6.0 (>= 6.0.12), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-6.0 (>= 6.0.12), dotnet-apphost-pack-6.0 (>= 6.0.12), dotnet-runtime-6.0 (>= 6.0.12), aspnetcore-targeting-pack-6.0 (>= 6.0.12)","sha256":"bbb517ce8930b6c25860a34f7d1858c67965ed9a4c445ab36f0482eecd123afd","size":78525266,"filename":"pool/main/d/dotnet-sdk-6.0/dotnet-sdk-6.0.112-x64.deb"},{"package":"azure-functions-core-tools","version":"4.0.5348-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v4","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools-2, azure-functions-core-tools-3","replaces":"azure-functions-core-tools-2, azure-functions-core-tools-3","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"a8028acfa074da855eef31805a52ed341f95f33bf74319a083903b8fc17bca7c","size":157155760,"filename":"pool/main/a/azure-functions-core-tools/azure-functions-core-tools_4.0.5348-1.deb"},{"package":"dotnet-sdk-3.1","version":"3.1.416-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":189593,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 3.1.416","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.6), dotnet-targeting-pack-3.1 (>= 3.1.0), netstandard-targeting-pack-2.1 (>= 2.1.0), dotnet-apphost-pack-3.1 (>= 3.1.22), aspnetcore-targeting-pack-3.1 (>= 3.1.10), dotnet-runtime-3.1 (>= 3.1.22), aspnetcore-runtime-3.1 (>= 3.1.22)","sha256":"8b2cf4f47bff8d9768fb21626f6847e5223dc9ac12ee951718f9db41bf7c5985","size":48071620,"filename":"pool/main/d/dotnet-sdk-3.1/dotnet-sdk-3.1.416-x64.deb"},{"package":"dotnet-host","version":"6.0.24-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":259,"maintainer":".NET Team ","description":"Microsoft .NET Host - 6.0.24","homepage":"https://github.com/dotnet/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"d3e1b4542b0a826316d1fbbcd96f5c4672de7988939f11d478995ab0ee00fbf7","size":55918,"filename":"pool/main/d/dotnet-host/dotnet-host_6.0.24-1_amd64.deb"},{"package":"dotnet-runtime-deps-3.1","version":"3.1.8-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Core Team ","description":"dotnet-runtime-deps-3.1 3.1.8","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libc6, libicu | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"6670365be8316093097de476a0054d9989fc1f9116d3b558b0922e9c0190ab1f","size":2650,"filename":"pool/main/d/dotnet-runtime-deps-3.1/dotnet-runtime-deps-3.1.8-x64.deb"},{"package":"moby-containerd","version":"1.5.10+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":124223,"maintainer":"Microsoft ","description":"Industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.2)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"bba9e4e3481c121b2cf4b208c2c2540486cd9ac5e1a6488c9a5902a15ffd5a7d","size":27583496,"filename":"pool/main/m/moby-containerd/moby-containerd_1.5.10+azure-1_amd64.deb"},{"package":"aziot-edge","version":"1.2.8-1","architecture":"amd64","section":"admin","priority":"extra","installed_size":23914,"maintainer":"Azure IoT Edge Devs","description":"Azure IoT Edge Module Runtime","homepage":"https://github.com/azure/iotedge","depends":"adduser, ca-certificates, hostname, aziot-identity-service (= 1.2.6-1), sed","sha256":"242c7beed66e90503bae72243abf10c08e68b087e601122ac18bc19c4f63aa95","size":5777600,"filename":"pool/main/a/aziot-edge/aziot-edge_1.2.8-1_amd64.deb"},{"package":"moby-engine","version":"20.10.18+azure-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":85898,"maintainer":"Microsoft ","description":"Docker container platform (engine package)","homepage":"https://github.com/moby/moby","conflicts":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","depends":"moby-containerd (>= 1.4.3), moby-runc (>= 1.0.2), libc6 (>= 2.8), libdevmapper1.02.1 (>= 2:1.02.97)","recommends":"apparmor, ca-certificates, iptables, kmod, moby-cli, pigz, xz-utils","suggests":"aufs-tools, cgroupfs-mount | cgroup-lite, git","replaces":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","sha256":"8b0a0833dde01dd7dee5b94cd38a7379a2feba6183464f034e2c521f6eb90aa2","size":20426268,"filename":"pool/main/m/moby-engine/moby-engine_20.10.18+azure-ubuntu20.04u1_amd64.deb"},{"package":"powershell","version":"7.2.8-1.deb","architecture":"amd64","section":"shells","priority":"extra","installed_size":186934,"maintainer":"PowerShell Team ","description":"PowerShell is an automation and configuration management platform.","homepage":"https://microsoft.com/powershell","depends":"libc6, libgcc1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.0.0","vendor":"Microsoft Corporation","license":"MIT License","sha256":"5f72d3dd601e5211aa00f26cc5ed578eca7762c0d34bea0e560e5147d1e0d8d7","size":69440998,"filename":"pool/main/p/powershell/powershell_7.2.8-1.deb_amd64.deb"},{"package":"azure-functions-core-tools","version":"3.0.4669-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v3","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"8fa09b323ce9042ad1e8cda02546047bc6e2e9ba07afddd498ebe4a86b13df69","size":227702464,"filename":"pool/main/a/azure-functions-core-tools/azure-functions-core-tools_3.0.4669-1.deb"},{"package":"dotnet-sdk-2.1","version":"2.1.525-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":228666,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 2.1.525","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.4), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.8), dotnet-runtime-2.1 (>= 2.1.29), aspnetcore-runtime-2.1 (>= 2.1.29)","sha256":"7bf4042264f848adb36b1b8729e413ce86a772586076aa05a0f2937c403b0908","size":89342040,"filename":"pool/main/d/dotnet-sdk-2.1/dotnet-sdk-2.1.525-x64.deb"},{"package":"azcmagent","version":"1.10.21239.003","architecture":"amd64","maintainer":"Azure Connected Machine Agent ","description":"Azure Connected Machine Agent","depends":"curl","package_type":"deb","sha256":"606ecba800eb9417ea5c4f2cef0c2b31e3b154e310aa95223d52c4d7cb8d684b","size":49538204,"filename":"pool/main/a/azcmagent/azcmagent_1.10.21239.003_amd64.deb"},{"package":"dotnet-host","version":"3.1.21-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":145,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 3.1.21","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"fcdf2ff915a09a0eadef97518df927e173fb16f3ace90f29ee509188d945dd12","size":32478,"filename":"pool/main/d/dotnet-host/dotnet-host-3.1.21-x64.deb"},{"package":"dotnet-apphost-pack-7.0","version":"7.0.10-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":11281,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Host 7.0.10","homepage":"https://github.com/dotnet/core","sha256":"1c730d33b41d3cb90a4b4113c422c1be81b5fa8f739046643befb55903921675","size":3522798,"filename":"pool/main/d/dotnet-apphost-pack-7.0/dotnet-apphost-pack-7.0_7.0.10-1_amd64.deb"},{"package":"open-enclave","version":"0.19.4","architecture":"amd64","section":"devel","priority":"optional","installed_size":191735,"maintainer":"oesdk@lists.confidentialcomputing.io","description":"Open Enclave SDK","depends":"libsgx-enclave-common (>=2.3.100.46354-1), libsgx-dcap-ql (>=1.0.100.46460-1.0)","recommends":"pkg-config","sha256":"e20e03dab90cd3cf7b17d8672bfc6385bd27a7adb9db4ca13ce02a7c4ad26511","size":54537200,"filename":"pool/main/o/open-enclave/open-enclave_0.19.4_amd64.deb"},{"package":"dotnet-targeting-pack-7.0","version":"7.0.13-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":31138,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Ref 7.0.13","homepage":"https://github.com/dotnet/core","sha256":"1ff382ea6af6364f8f35a5ccd64bae88c31d09652d5ad252fd55bb212e99673d","size":2567222,"filename":"pool/main/d/dotnet-targeting-pack-7.0/dotnet-targeting-pack-7.0_7.0.13-1_amd64.deb"},{"package":"aadsshlogin","version":"1.0.022300001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"AAD NSS, PAM and certhandler extensions","conflicts":"aadlogin","depends":"libcurl4, libuuid1, passwd, openssh-server (>=6.9)","pre_depends":"grep, sed","sha256":"b777ed2b90ea97dda2a8654b23901d8a2c8366e5a8c2b2573e8aba042fd9e835","size":285622,"filename":"pool/main/a/aadsshlogin/aadsshlogin_1.0.022300001_amd64.deb"},{"package":"defender-iot-micro-agent-edge","version":"3.11.1","architecture":"amd64","priority":"optional","essential":"no","maintainer":"Microsoft","description":"Microsoft Defender for IoT Micro Agent","conflicts":"defender-iot-micro-agent","depends":"libuv1, curl, libssl1.1, uuid-runtime, sudo, aziot-edge, libpcap0.8, dmidecode","sha256":"b22a9d3b4e9383be7d8f3c0c7922bd1552775b7abc446a46bedb6ccaef4211f2","size":264512,"filename":"pool/main/d/defender-iot-micro-agent-edge/defenderiot-ubuntu-20.04-amd64-edge-3.11.1.deb"},{"package":"msalsdk-dbusclient","version":"1.0.0","architecture":"amd64","section":"utils","priority":"optional","installed_size":46,"maintainer":"Identity Client Linux Team ","description":"Microsoft Authentication Library cross platform","homepage":"https://github.com/AzureAD/microsoft-authentication-library-for-cpp","depends":"msft-identity-broker (>= 1.0), libc6 (>= 2.14), libgcc-s1 (>= 3.0), libsdbus-c++0 (>= 0.8.3), libstdc++6 (>= 6)","sha256":"78588d17039d3bf3096f1a0476e70eece76d732fd938e447e37a3c3c33af0b36","size":9932,"filename":"pool/main/m/msalsdk-dbusclient/msalsdk-dbusclient_1.0.0_amd64.deb"},{"package":"dotnet-hostfxr-3.1","version":"3.1.9-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":410,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host FX Resolver - 3.1.9 3.1.9","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 3.1.9), libc6","sha256":"745a556521a404a87e636a6a051021d66b0708db00201b0a8127baedc4394ec9","size":121016,"filename":"pool/main/d/dotnet-hostfxr-3.1/dotnet-hostfxr-3.1.9-x64.deb"},{"package":"open-enclave","version":"0.19.2","architecture":"amd64","section":"devel","priority":"optional","installed_size":191645,"maintainer":"oesdk@lists.confidentialcomputing.io","description":"Open Enclave SDK","depends":"libsgx-enclave-common (>=2.3.100.46354-1), libsgx-dcap-ql (>=1.0.100.46460-1.0)","recommends":"pkg-config","sha256":"e312248f847146ffc16a3a44dd3379d9bbc9bc623ba41c11bdfc8daa700cbf79","size":54508872,"filename":"pool/main/o/open-enclave/Ubuntu_2004_open-enclave_0.19.2_amd64.deb"},{"package":"dotnet-runtime-deps-3.1","version":"3.1.7-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Core Team ","description":"dotnet-runtime-deps-3.1 3.1.7","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libc6, libicu | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"267046f6a5bdc652cdff399e69bb048a9fe31b9fffa5ecf59e5ffa8651fd105b","size":2666,"filename":"pool/main/d/dotnet-runtime-deps-3.1/dotnet-runtime-deps-3.1.7-x64.deb"},{"package":"dotnet-host","version":"6.0.7-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":259,"maintainer":".NET Team ","description":"Microsoft .NET Host - 6.0.7","homepage":"https://github.com/dotnet/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"59f7084cb3930657e8e08dfb41bb360553a7820fac22fe19217dfe678c367a30","size":55714,"filename":"pool/main/d/dotnet-host/dotnet-host-6.0.7-x64.deb"},{"package":"moby-buildx","version":"0.4.2+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":56247,"maintainer":"Microsoft ","description":"A Docker CLI plugin for extended build capabilities with BuildKit","homepage":"https://github.com/docker/buildx","conflicts":"docker-ce, docker-ee","recommends":"moby-cli","sha256":"f4ba4ef6fd9b049349ac21d6f3dac387da99fc573b6d2aa0e8c8e3c25ff87eac","size":19462424,"filename":"pool/main/m/moby-buildx/moby-buildx_0.4.2+azure-1_amd64.deb"},{"package":"msopenjdk-17","version":"17.0.7-1","architecture":"amd64","section":"java","priority":"optional","installed_size":324493,"maintainer":"Microsoft","description":"OpenJDK Development Kit 17 (JDK) with Hotspot by Microsoft","homepage":"https://www.microsoft.com","depends":"ca-certificates, java-common, libc6, zlib1g","recommends":"fonts-dejavu, libx11-6, libxext6, libxi6, libxrender1, libxtst6, libasound2, libfontconfig1, libfreetype6","provides":"java-compiler, java-sdk, java-sdk-headless, java10-sdk, java11-sdk, java12-sdk, java13-sdk, java14-sdk, java15-sdk, java16-sdk, java2-sdk, java5-sdk, java6-sdk, java7-sdk, java8-sdk, java9-sdk, java10-sdk-headless, java11-sdk-headless, java12-sdk-headless, java13-sdk-headless, java14-sdk-headless, java15-sdk-headless, java16-sdk-headless, java2-sdk-headless, java5-sdk-headless, java6-sdk-headless, java7-sdk-headless, java8-sdk-headless, java9-sdk-headless, java-runtime, java-runtime-headless, java10-runtime, java11-runtime, java12-runtime, java13-runtime, java14-runtime, java15-runtime, java16-runtime, java2-runtime, java5-runtime, java6-runtime, java7-runtime, java8-runtime, java9-runtime, java10-runtime-headless, java11-runtime-headless, java12-runtime-headless, java13-runtime-headless, java14-runtime-headless, java15-runtime-headless, java16-runtime-headless, java2-runtime-headless, java5-runtime-headless, java6-runtime-headless, java7-runtime-headless, java8-runtime-headless, java9-runtime-headless","vendor":"Microsoft","license":"GPL-2.0+CE","sha256":"d85c672f28263e589bb24c644a0d514c022c54d9a82c932dd7e204913746b408","size":192238598,"filename":"pool/main/m/msopenjdk-17/msopenjdk-17_17.0.7-1_amd64.deb"},{"package":"azureauth","version":"0.8.2-7","architecture":"amd64","section":"misc","priority":"optional","installed_size":74209,"maintainer":"ES365 Security Experience Team ","description":"A CLI interface to MSAL authentication. Visit https://aka.ms/azureauth for more information.","sha256":"88293e261db82ab4065f3121d5347305dafae0cc18976a9db7dc857b0c9a23c8","size":24108106,"filename":"pool/main/a/azureauth/azureauth_0.8.2-7_amd64.deb"},{"package":"mdatp","version":"101.03.48","architecture":"amd64","section":"devel","priority":"optional","installed_size":50004,"maintainer":"Microsoft Defender ATP Group ","description":"Microsoft Defender Advanced Threat Protection for Endpoints (Production)","depends":"curl (>= 7.5), libseccomp2, libuuid1, rsyslog, libatomic1, libc6 (>= 2.23), python3, uuid-runtime, dmidecode, auditd","sha256":"1cdeb1f84286fcfc3634aa636184e69d8de4a256d7bc3395c3cd46299cbb311c","size":16306366,"filename":"pool/main/m/mdatp/mdatp_101.03.48.amd64.deb"},{"package":"aspnetcore-runtime-3.1","version":"3.1.8-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":17467,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/aspnet/AspNetCore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-3.1 (>= 3.1.8)","sha256":"1d7fdcf419bf3a78364d885517fbbe694b34fbb4259ba1184bc1b7f7f993c435","size":5769702,"filename":"pool/main/a/aspnetcore-runtime-3.1/aspnetcore-runtime-3.1.8-x64.deb"},{"package":"moby-cli","version":"20.10.11+azure-2","architecture":"amd64","section":"admin","priority":"optional","installed_size":60992,"maintainer":"Microsoft ","description":"Docker container platform (client package)","homepage":"https://github.com/docker/cli","conflicts":"docker, docker-ce, docker-ce-cli, docker-ee, docker-ee-cli, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","depends":"libc6 (>= 2.4)","recommends":"ca-certificates, git, moby-buildx, pigz, xz-utils","suggests":"moby-engine","replaces":"docker, docker-ce, docker-ce-cli, docker-ee, docker-ee-cli, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","sha256":"c4b114bffd76a55588d9dad3bbea3d0edb2290fb212b89501fe1dee9d0fb8886","size":10570860,"filename":"pool/main/m/moby-cli/moby-cli_20.10.11+azure-2_amd64.deb"},{"package":"moby-containerd","version":"1.4.13+azure-2","architecture":"amd64","section":"admin","priority":"optional","installed_size":120070,"maintainer":"Microsoft ","description":"industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.2)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"4b38f17f2fcfce60d3de5c5ca99dc6443e335f273210e68d9d1e83ae7f300335","size":26969412,"filename":"pool/main/m/moby-containerd/moby-containerd_1.4.13+azure-2_amd64.deb"},{"package":"azure-functions-core-tools-4","version":"4.0.5148-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v4","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools-2, azure-functions-core-tools-3","replaces":"azure-functions-core-tools-2, azure-functions-core-tools-3","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"86d1b67b0287593f023edc08217c3d7b4d9fe34db6bed602f089057c7135ddd4","size":172048900,"filename":"pool/main/a/azure-functions-core-tools-4/azure-functions-core-tools-4_4.0.5148-1.deb"},{"package":"azure-functions-core-tools","version":"3.0.4425-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v3","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"ebda02d39c2f184fe7798f607f9baf741a726166bdf620faf30df1e8cb78ef83","size":211264760,"filename":"pool/main/a/azure-functions-core-tools/azure-functions-core-tools_3.0.4425-1.deb"},{"package":"azure-functions-core-tools-4","version":"4.0.4629-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v4","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools-2, azure-functions-core-tools-3","replaces":"azure-functions-core-tools-2, azure-functions-core-tools-3","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"248211ce798f17bc101da096123ab085072f718891e812ab28d54b1ef2177267","size":124416520,"filename":"pool/main/a/azure-functions-core-tools-4/azure-functions-core-tools-4_4.0.4629-1.deb"},{"package":"aspnetcore-runtime-6.0","version":"6.0.18-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":19877,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-6.0 (>= 6.0.18)","sha256":"fb2b920c58eafd21f1603fab79ad877e1a1d6b52f1b09bb3e574ba4c52e5790b","size":6614146,"filename":"pool/main/a/aspnetcore-runtime-6.0/aspnetcore-runtime-6.0.18-x64.deb"},{"package":"moby-containerd","version":"1.6.21+azure-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":125637,"maintainer":"Microsoft ","description":"Industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.2)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"1cf0fe4a1864137275b9ae732c2955f6a38e652633ec31ed295f109da4b8b9c8","size":31535086,"filename":"pool/main/m/moby-containerd/moby-containerd_1.6.21+azure-ubuntu20.04u1_amd64.deb"},{"package":"aspnetcore-targeting-pack-6.0","version":"6.0.23-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":11750,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-targeting-pack-6.0 (>= 6.0.23)","sha256":"d77d76800156fe2f8927c4058e9f38c5869792154381eaab1f21c390c1f2339f","size":1315890,"filename":"pool/main/a/aspnetcore-targeting-pack-6.0/aspnetcore-targeting-pack-6.0_6.0.23-1_amd64.deb"},{"package":"dotnet-host","version":"2.1.22-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":175,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 2.1.22","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"48a86372085acf1ef0654ccca308a29db18d0cd892dfa37f707b0170ebdff1c9","size":36572,"filename":"pool/main/d/dotnet-host/dotnet-host-2.1.22-x64.deb"},{"package":"azureauth","version":"0.8.2-5","architecture":"amd64","section":"misc","priority":"optional","installed_size":74209,"maintainer":"ES365 Security Experience Team ","description":"A CLI interface to MSAL authentication. Visit https://aka.ms/azureauth for more information.","sha256":"16af522abeaf26d129c2fe85797a1545885a9ca971cffa1d139caae64f8a6bfc","size":24114326,"filename":"pool/main/a/azureauth/azureauth_0.8.2-5_amd64.deb"},{"package":"aspnetcore-runtime-5.0","version":"5.0.6-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":18557,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-5.0 (>= 5.0.6)","sha256":"04e742a057549d5c5e523ffcaa2b141e2c72746844a0129f7cebcc2c9f8707cf","size":6086044,"filename":"pool/main/a/aspnetcore-runtime-5.0/aspnetcore-runtime-5.0.6-x64.deb"},{"package":"moby-containerd","version":"1.5.18+azure-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":109077,"maintainer":"Microsoft ","description":"Industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.2)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"fb25060e68694a6ed58f6083001aa10e158831e537ccd8381a91683fc6dac4e0","size":26798086,"filename":"pool/main/m/moby-containerd/moby-containerd_1.5.18+azure-ubuntu20.04u1_amd64.deb"},{"package":"blobfuse","version":"1.3.5","architecture":"amd64","section":"devel","priority":"optional","installed_size":32372,"maintainer":"Microsoft - Azure Storage","description":"blobfuse 1.3.5 - FUSE adapter for Azure Blob Storage","depends":"fuse","sha256":"6caf1a6e677ad286dd707a2ab99c202357e9b523c06980ac62e83eac577814bc","size":9299024,"filename":"pool/main/b/blobfuse/blobfuse-1.3.5-Linux-Ubuntu2004.deb"},{"package":"azure-ai-vision-runtime-image-analysis","version":"0.11.1~beta.1","architecture":"amd64","section":"devel","priority":"optional","installed_size":682,"maintainer":"vision-sdk@microsoft.com","description":"Azure AI Vision Image Analysis Runtime Package","depends":"azure-ai-vision-runtime-common (= 0.11.1~beta.1), azure-ai-vision-runtime-common-media (= 0.11.1~beta.1)","sha256":"dc35ab240cb86855ab55cd95f92f89fc3900c72c1ddc234e90ddbf87a6cf5b2a","size":149912,"filename":"pool/main/a/azure-ai-vision-runtime-image-analysis/azure-ai-vision-runtime-image-analysis-0.11.1~beta.1-Linux.deb"},{"package":"dotnet-runtime-deps-5.0","version":"5.0.17-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Team ","description":"dotnet-runtime-deps-5.0 5.0.17","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"fad642753e596b724728fdffda51446c1371892559c07e8155f819a93a20f2a5","size":2646,"filename":"pool/main/d/dotnet-runtime-deps-5.0/dotnet-runtime-deps-5.0.17-x64.deb"},{"package":"dotnet-sdk-2.1","version":"2.1.806-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":241163,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 2.1.806","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.4), libgcc1 (>= 1:4.1.1), libstdc++6 (>= 4.8), dotnet-runtime-2.1 (>= 2.1.18), aspnetcore-runtime-2.1 (>= 2.1.18)","sha256":"dc70903977d4832aa821e17a3734942f806dab283332eed711ab45d5de531ec7","size":92091884,"filename":"pool/main/d/dotnet-sdk-2.1/dotnet-sdk-2.1.806-x64.deb"},{"package":"azure-functions-core-tools","version":"3.0.4727-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v3","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"3d49b06db4758632dcb37f6e77e67fd27c62b7ca92b88a4402534d12427acc5c","size":227694792,"filename":"pool/main/a/azure-functions-core-tools/azure-functions-core-tools_3.0.4727-1.deb"},{"package":"apt-transport-https-sas","version":"0.9-3","architecture":"amd64","section":"admin","priority":"optional","installed_size":48,"maintainer":"Skype Core Services Ops ","description":"SAS (Secure Access Signature) token authentication support for","depends":"python (>= 2.7) | python2 | python2.7, python (<< 3.0), python3, apt-transport-https","sha256":"847f65c962d5a64d5d9c84673ac1aefa9e93d6456f5da6bcf84728dcfba8d707","size":12426,"filename":"pool/main/a/apt-transport-https-sas/apt-transport-https-sas_0.9-3_amd64.deb"},{"package":"aadsshlogin","version":"1.0.017540001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"AAD NSS, PAM and certhandler extensions","conflicts":"aadlogin","depends":"libcurl4, libuuid1, openssh-server (>=6.9)","sha256":"c29b7738d9aa27f63ddb3385a104bb770de79ba757bc79156a256830a84c4e8f","size":419498,"filename":"pool/main/a/aadsshlogin/aadsshlogin_1.0.017540001_amd64.deb"},{"package":"aziot-identity-service","version":"1.3.0-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":17955,"maintainer":"Azure IoT Edge Devs","description":"Azure IoT Identity Service and related services","homepage":"https://github.com/azure/iot-identity-service","conflicts":"iotedge, libiothsm-std","depends":"libc6 (>= 2.29), libgcc-s1 (>= 3.3), libssl1.1 (>= 1.1.0g)","sha256":"2393429995c94361cb1691e3be79b1a210bb4ced647905c8951bd196356a71fd","size":3756332,"filename":"pool/main/a/aziot-identity-service/aziot-identity-service_1.3.0-1_amd64.deb"},{"package":"powershell-preview","version":"7.4.0-preview.1-1.deb","architecture":"amd64","section":"shells","priority":"extra","installed_size":195083,"maintainer":"PowerShell Team ","description":"PowerShell is an automation and configuration management platform.","homepage":"https://microsoft.com/powershell","depends":"libc6, libgcc1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.0.0","vendor":"Microsoft Corporation","license":"MIT License","sha256":"2518230120bde23d124e8a8d30d560b14572a588af57e441c4c24ea52ca79e2f","size":70861036,"filename":"pool/main/p/powershell-preview/powershell-preview_7.4.0-preview.1-1.deb_amd64.deb"},{"package":"dotnet-sdk-6.0","version":"6.0.404-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":336633,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 6.0.404","homepage":"https://github.com/dotnet/core","depends":"dotnet-targeting-pack-6.0 (>= 6.0.12), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-6.0 (>= 6.0.12), dotnet-apphost-pack-6.0 (>= 6.0.12), dotnet-runtime-6.0 (>= 6.0.12), aspnetcore-targeting-pack-6.0 (>= 6.0.12)","sha256":"b0db8754304b29c3a8a28820080713733b8cba9cc4549e6496bf7f4945685562","size":86631222,"filename":"pool/main/d/dotnet-sdk-6.0/dotnet-sdk-6.0.404-x64.deb"},{"package":"moby-engine","version":"20.10.10+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":98009,"maintainer":"Microsoft ","description":"Docker container platform (engine package)","homepage":"https://github.com/moby/moby","conflicts":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","depends":"moby-containerd (>= 1.4.3), moby-runc (>= 1.0.0~rc93), libc6 (>= 2.8), libdevmapper1.02.1 (>= 2:1.02.97)","recommends":"apparmor, ca-certificates, iptables, kmod, moby-cli, pigz, xz-utils","suggests":"aufs-tools, cgroupfs-mount | cgroup-lite, git","replaces":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","sha256":"aa0eb3b0654816491b036a85d6b3df81b0e26c54fd0086c136d973bb49b2e25c","size":21182268,"filename":"pool/main/m/moby-engine/moby-engine_20.10.10+azure-1_amd64.deb"},{"package":"open-enclave-hostverify","version":"0.17.0","architecture":"amd64","section":"devel","priority":"optional","installed_size":3069,"maintainer":"oesdk@lists.confidentialcomputing.io","description":"Open Enclave Report Verification Host Library","recommends":"pkg-config","sha256":"87b13cedd03de43b952a2b0678191adadda03f8fcf9e584ad5d3a43b2b7c6450","size":838158,"filename":"pool/main/o/open-enclave-hostverify/open-enclave-hostverify_0.17.0_amd64.deb"},{"package":"dotnet-host","version":"6.0.2-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":259,"maintainer":".NET Team ","description":"Microsoft .NET Host - 6.0.2","homepage":"https://github.com/dotnet/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"10d190304d21b10b7f51a79d08bd5e867ef97b59cc866841d12f0970e91f62a9","size":55654,"filename":"pool/main/d/dotnet-host/dotnet-host-6.0.2-x64.deb"},{"package":"dotnet-targeting-pack-6.0","version":"6.0.13-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":27378,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Ref 6.0.13","homepage":"https://github.com/dotnet/core","sha256":"75d79e64f4f3525555196c3de3b6a6d6c255a317a51538cfe30567f92caf51a9","size":2130996,"filename":"pool/main/d/dotnet-targeting-pack-6.0/dotnet-targeting-pack-6.0.13-x64.deb"},{"package":"dotnet-runtime-5.0","version":"5.0.16-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68398,"maintainer":".NET Team ","description":"Microsoft .NET Runtime - 5.0.16 Microsoft.NETCore.App 5.0.16","homepage":"https://dot.net/core","depends":"dotnet-runtime-deps-5.0 (>= 5.0.16), dotnet-hostfxr-5.0 (>= 5.0.16)","sha256":"94c64f37c5366da138ba001c362d9f0fa75b8131817558b68e52b20bab538b56","size":21840928,"filename":"pool/main/d/dotnet-runtime-5.0/dotnet-runtime-5.0.16-x64.deb"},{"package":"powershell-preview","version":"7.2.0-rc.1-1.deb","architecture":"amd64","section":"shells","priority":"extra","installed_size":164716,"maintainer":"PowerShell Team ","description":"PowerShell is an automation and configuration management platform.","homepage":"https://microsoft.com/powershell","depends":"libc6, libgcc1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl1.1|libssl1.0.2|libssl1.0.0","vendor":"Microsoft Corporation","license":"MIT License","sha256":"f93016a0cfd85711d8eb274a123b353f463f3e589baa53c8af18c5c269126a12","size":66452168,"filename":"pool/main/p/powershell-preview/powershell-preview_7.2.0-rc.1-1.deb_amd64.deb"},{"package":"dotnet-host","version":"3.1.27-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":145,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 3.1.27","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"ce62dc4ac114de9cd82ad3db7eab8551addd5f329c55d9bc8f1a9c0ee7ea8119","size":32452,"filename":"pool/main/d/dotnet-host/dotnet-host-3.1.27-x64.deb"},{"package":"aspnetcore-runtime-3.1","version":"3.1.27-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":17498,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/aspnet/AspNetCore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-3.1 (>= 3.1.27)","sha256":"0bbe47ed2413a67ce2f84a38145cc4a3dbbefa668c8704e305818c7f4b0c7951","size":5771296,"filename":"pool/main/a/aspnetcore-runtime-3.1/aspnetcore-runtime-3.1.27-x64.deb"},{"package":"dotnet-host","version":"3.1.24-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":145,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 3.1.24","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"9aafd51da5c39d88c7190f208b874e8b159359b74481d46ea87159cf0fc9ffb1","size":32504,"filename":"pool/main/d/dotnet-host/dotnet-host-3.1.24-x64.deb"},{"package":"dotnet-runtime-deps-6.0","version":"6.0.20-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Team ","description":"dotnet-runtime-deps-debian 6.0.20","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, libssl1.0.0 | libssl1.0.2 | libssl1.1 | libssl3, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"4fab6a262de18f8b64e57dd27c5a6acd9bf769a233561ea50f9ecd5013581fc8","size":2796,"filename":"pool/main/d/dotnet-runtime-deps-6.0/dotnet-runtime-deps-6.0.20-x64.deb"},{"package":"open-enclave-hostverify","version":"0.19.4","architecture":"amd64","section":"devel","priority":"optional","installed_size":3696,"maintainer":"oesdk@lists.confidentialcomputing.io","description":"Open Enclave Report Verification Host Library","recommends":"pkg-config","sha256":"dfe9e0705a4186d418ea9a48e3c80c353e8fd943e3f566d829173d20aaaea537","size":1010380,"filename":"pool/main/o/open-enclave-hostverify/open-enclave-hostverify_0.19.4_amd64.deb"},{"package":"azure-functions-core-tools-3","version":"3.0.3477-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v3","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"08cb107257aca65fa156ef7c7708d0620c703769cceb4aedff56f0eea688f6c6","size":209487336,"filename":"pool/main/a/azure-functions-core-tools-3/azure-functions-core-tools-3_3.0.3477-1.deb"},{"package":"dotnet-host","version":"7.0.12-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":246,"maintainer":".NET Team ","description":"Microsoft .NET Host - 7.0.12","homepage":"https://github.com/dotnet/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"168de157996cc20afcb22c99aa363447aa177347b7d053ee1e4c12e36e5adebc","size":57382,"filename":"pool/main/d/dotnet-host/dotnet-host_7.0.12-1_amd64.deb"},{"package":"msopenjdk-11","version":"11.0.15+10-LTS-1","architecture":"amd64","section":"java","priority":"extra","installed_size":316139,"maintainer":"Microsoft","description":"OpenJDK Development Kit 11 (JDK) with Hotspot by Microsoft","homepage":"https://www.microsoft.com","depends":"ca-certificates, fonts-dejavu, java-common, libasound2, libc6, libfreetype6, libfontconfig1, libx11-6, libxext6, libxi6, libxrender1, libxtst6, zlib1g","provides":"java-compiler, java-sdk, java-sdk-headless, java10-sdk, java11-sdk, java2-sdk, java5-sdk, java6-sdk, java7-sdk, java8-sdk, java9-sdk, java10-sdk-headless, java11-sdk-headless, java2-sdk-headless, java5-sdk-headless, java6-sdk-headless, java7-sdk-headless, java8-sdk-headless, java9-sdk-headless, java-runtime, java-runtime-headless, java10-runtime, java11-runtime, java2-runtime, java5-runtime, java6-runtime, java7-runtime, java8-runtime, java9-runtime, java10-runtime-headless, java11-runtime-headless, java2-runtime-headless, java5-runtime-headless, java6-runtime-headless, java7-runtime-headless, java8-runtime-headless, java9-runtime-headless","vendor":"Microsoft","license":"GPL-2.0+CE","sha256":"0a2a9f6be1fca5891486b90c4676b95c547e2df1a9750443ae2a8782234f3fa5","size":193176730,"filename":"pool/main/m/msopenjdk-11/msopenjdk-11_11.0.15+10-LTS-1_amd64.deb"},{"package":"dotnet-runtime-deps-6.0","version":"6.0.1-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Team ","description":"dotnet-runtime-deps-debian 6.0.1","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"59a7d8c4a06591962abcea21dad220af537f300bac1f6cfc1be78cb898676457","size":2804,"filename":"pool/main/d/dotnet-runtime-deps-6.0/dotnet-runtime-deps-6.0.1-x64.deb"},{"package":"dotnet-runtime-deps-3.1","version":"3.1.11-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Core Team ","description":"dotnet-runtime-deps-3.1 3.1.11","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"f7854d72dcce33b230cbcb69a9f7ddd7189d96b52edd5fda39f4cc8d24673ca8","size":2688,"filename":"pool/main/d/dotnet-runtime-deps-3.1/dotnet-runtime-deps-3.1.11-x64.deb"},{"package":"dotnet-hostfxr-6.0","version":"6.0.2-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":452,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 6.0.2","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 6.0.2), libc6","sha256":"8348f279c3614c93676cfefecf6f653135b910dd9ab0a702edc6d65f5f2bf36b","size":142108,"filename":"pool/main/d/dotnet-hostfxr-6.0/dotnet-hostfxr-6.0.2-x64.deb"},{"package":"aadsshlogin-selinux","version":"1.0.021030001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"Selinux configuration for AAD NSS and PAM extensions.","conflicts":"aadlogin-selinux","depends":"policycoreutils (>=3.0-1), selinux-utils, selinux-policy-default","sha256":"f6627857e9a11b74d9e676ab62b2a2a50a5f567a0c55e4bc006456159acbdfed","size":2374,"filename":"pool/main/a/aadsshlogin-selinux/aadsshlogin-selinux_1.0.021030001_amd64.deb"},{"package":"dotnet-runtime-3.1","version":"3.1.14-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":71115,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 3.1.14 Microsoft.NETCore.App 3.1.14","homepage":"https://dot.net/core","depends":"dotnet-hostfxr-3.1 (>= 3.1.14), dotnet-runtime-deps-3.1 (>= 3.1.14)","sha256":"10563481588e18f8d8ed70d9b99a58c158b98b1ef8159c789ba55073bb240a67","size":21744410,"filename":"pool/main/d/dotnet-runtime-3.1/dotnet-runtime-3.1.14-x64.deb"},{"package":"dotnet-host","version":"6.0.16-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":259,"maintainer":".NET Team ","description":"Microsoft .NET Host - 6.0.16","homepage":"https://github.com/dotnet/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"4f3beedd7786937c7fa0cf6fdc620a9b6e9a0630d49e36f868bd22526ad402bb","size":55864,"filename":"pool/main/d/dotnet-host/dotnet-host-6.0.16-x64.deb"},{"package":"moby-engine","version":"19.03.13+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":103382,"maintainer":"Microsoft ","description":"Docker container platform (engine package)","homepage":"https://github.com/moby/moby","conflicts":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","depends":"moby-containerd (>= 1.2), moby-runc (>= 1.0.0~rc10), libc6 (>= 2.8), libdevmapper1.02.1 (>= 2:1.02.97), libseccomp2 (>= 2.1.0)","recommends":"apparmor, ca-certificates, iptables, kmod, moby-cli, pigz, xz-utils","suggests":"aufs-tools, cgroupfs-mount | cgroup-lite, git","replaces":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","sha256":"a5aba3a499328a654304da3ec4d5ca323c96c7849ff05f0f6f854bb980f1f435","size":22538834,"filename":"pool/main/m/moby-engine/moby-engine_19.03.13+azure-1_amd64.deb"},{"package":"dotnet-hostfxr-5.0","version":"5.0.3-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":436,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 5.0.3 5.0.3","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 5.0.3), libc6","sha256":"d2d7de4f041b6168ae2a7be47ac3840fcb8da578f77ee0e52fda25ef5b9261c6","size":140808,"filename":"pool/main/d/dotnet-hostfxr-5.0/dotnet-hostfxr-5.0.3-x64.deb"},{"package":"dotnet-host","version":"7.0.8-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":246,"maintainer":".NET Team ","description":"Microsoft .NET Host - 7.0.8","homepage":"https://github.com/dotnet/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"d4b1ef40a32e948e99370003c3e89f4834d509b6707c5709d53b1ebf1bfe6c14","size":57278,"filename":"pool/main/d/dotnet-host/dotnet-host-7.0.8-x64.deb"},{"package":"moby-containerd","version":"1.3.8+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":126915,"maintainer":"Microsoft ","description":"industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), libseccomp2 (>= 2.4.1), moby-runc (>= 1.0.0~rc10)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"b875b91d14263bfbf3eda9313a15375f74cfa22d94e6c0ab03d62fc32032a186","size":27677300,"filename":"pool/main/m/moby-containerd/moby-containerd_1.3.8+azure-1_amd64.deb"},{"package":"dotnet-runtime-deps-7.0","version":"7.0.5-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":9,"maintainer":".NET Team ","description":"dotnet-runtime-deps-debian 7.0.5","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, libssl1.0.0 | libssl1.0.2 | libssl1.1 | libssl3, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"36ff1945d3e7a0c5cecd8f5618a4e2790faa7cd802bda9468e09bbad39e0c8d1","size":2890,"filename":"pool/main/d/dotnet-runtime-deps-7.0/dotnet-runtime-deps-7.0.5-x64.deb"},{"package":"dotnet-sdk-3.1","version":"3.1.425-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":193096,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 3.1.425","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.6), dotnet-targeting-pack-3.1 (>= 3.1.0), netstandard-targeting-pack-2.1 (>= 2.1.0), dotnet-apphost-pack-3.1 (>= 3.1.31), aspnetcore-targeting-pack-3.1 (>= 3.1.10), dotnet-runtime-3.1 (>= 3.1.31), aspnetcore-runtime-3.1 (>= 3.1.31)","sha256":"d5baa261325602144fe72944358d02371a8dbec5d2df322e7459a4dcde0dd60a","size":49834620,"filename":"pool/main/d/dotnet-sdk-3.1/dotnet-sdk-3.1.425-x64.deb"},{"package":"dotnet-runtime-3.1","version":"3.1.19-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":71114,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 3.1.19 Microsoft.NETCore.App 3.1.19","homepage":"https://dot.net/core","depends":"dotnet-hostfxr-3.1 (>= 3.1.19), dotnet-runtime-deps-3.1 (>= 3.1.19)","sha256":"50b3441944ac5bd8b56cf77397327cb3974a7f645047ab67d6886e5ccc8def9f","size":21752250,"filename":"pool/main/d/dotnet-runtime-3.1/dotnet-runtime-3.1.19-x64.deb"},{"package":"mdatp","version":"101.24.45","architecture":"amd64","section":"devel","priority":"optional","installed_size":151288,"maintainer":"Microsoft Defender ATP Group ","description":"Microsoft Defender Advanced Threat Protection for Endpoints (Production)","depends":"curl (>= 7.5), libseccomp2, libuuid1, libatomic1, libc6 (>= 2.23), python3, uuid-runtime, dmidecode, auditd, libselinux1","sha256":"862be7267065eb548f25fe8ec8654bb43d92d1b80188def5b8818e805787846e","size":44872594,"filename":"pool/main/m/mdatp/mdatp_101.24.45.amd64.deb"},{"package":"dotnet-hostfxr-7.0","version":"7.0.5-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":424,"maintainer":".NET Team ","description":"Microsoft .NET Host FX Resolver - 7.0.5","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 7.0.5), libc6","sha256":"26ec1b1a281088177f66da1de36d31fd31a427f5a0e42b18538dabc503d52a1e","size":143998,"filename":"pool/main/d/dotnet-hostfxr-7.0/dotnet-hostfxr-7.0.5-x64.deb"},{"package":"dotnet-host","version":"5.0.9-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":233,"maintainer":".NET Team ","description":"Microsoft .NET Host - 5.0.9","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"19d6e6d8937060556a8efc783fd27a32e7424da20c39ad933e27342c365f4d1b","size":52590,"filename":"pool/main/d/dotnet-host/dotnet-host-5.0.9-x64.deb"},{"package":"aspnetcore-runtime-6.0","version":"6.0.14-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":19872,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-6.0 (>= 6.0.14)","sha256":"0734d77b6149db2d071b8b15f126cb9f7da613166cdd6bc835b791bad9f666fe","size":6612218,"filename":"pool/main/a/aspnetcore-runtime-6.0/aspnetcore-runtime-6.0.14-x64.deb"},{"package":"azure-functions-core-tools-3","version":"3.0.4837-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v3","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2","replaces":"azure-functions-core-tools, azure-functions-core-tools-2","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"4a991eb6e48937efcce608f70e0c2357df03d3d85bbe071071a0307b21dfbbc6","size":227788672,"filename":"pool/main/a/azure-functions-core-tools-3/azure-functions-core-tools-3_3.0.4837-1.deb"},{"package":"az-dcap-client","version":"1.8","architecture":"amd64","section":"unknown","priority":"optional","installed_size":306,"maintainer":"Microsoft Corp","description":"Intel(R) SGX DCAP plugin for Azure Integration","depends":"libc6 (>= 2.14), libcurl4 (>= 7.16.2), libgcc-s1 (>= 3.0), libssl1.1 (>= 1.1.0), libstdc++6 (>= 9)","sha256":"96b4f5d6bc3d4ca79de4ea99b3cb3f1c7d518678397e8e24dada9034a53df036","size":63924,"filename":"pool/main/a/az-dcap-client/az-dcap-client_1.8_amd64.deb"},{"package":"dotnet-runtime-3.1","version":"3.1.21-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":71115,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 3.1.21 Microsoft.NETCore.App 3.1.21","homepage":"https://dot.net/core","depends":"dotnet-hostfxr-3.1 (>= 3.1.21), dotnet-runtime-deps-3.1 (>= 3.1.21)","sha256":"e2283c2375c028a33decced88a16a94d4e196b4decea7d3f61e2f7e9e0cec41d","size":21754372,"filename":"pool/main/d/dotnet-runtime-3.1/dotnet-runtime-3.1.21-x64.deb"},{"package":"dotnet-sdk-6.0","version":"6.0.114-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":313863,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 6.0.114","homepage":"https://github.com/dotnet/core","depends":"dotnet-targeting-pack-6.0 (>= 6.0.14), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-6.0 (>= 6.0.14), dotnet-apphost-pack-6.0 (>= 6.0.14), dotnet-runtime-6.0 (>= 6.0.14), aspnetcore-targeting-pack-6.0 (>= 6.0.14)","sha256":"5e73956aa56a60e1e89549e0d33fdfa6614b64234632baabb4a5c89076b61b70","size":78676286,"filename":"pool/main/d/dotnet-sdk-6.0/dotnet-sdk-6.0.114-x64.deb"},{"package":"azure-functions-core-tools","version":"4.0.4544-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v4","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools, azure-functions-core-tools-2, azure-functions-core-tools-3","replaces":"azure-functions-core-tools, azure-functions-core-tools-2, azure-functions-core-tools-3","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"80fe990383c5ed0f6cfa98079e98d93ad46324b84e254b8e8fee8150c813efb7","size":141836620,"filename":"pool/main/a/azure-functions-core-tools/azure-functions-core-tools_4.0.4544-1.deb"},{"package":"dotnet-hostfxr-3.1","version":"3.1.6-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":410,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host FX Resolver - 3.1.6 3.1.6","homepage":"https://dot.net/core","depends":"libgcc1, libstdc++6, dotnet-host (>= 3.1.6), libc6","sha256":"e3423518b16a0cbaaaddc030121ab010e47a5da00474be54cdf4260fbf31398f","size":121074,"filename":"pool/main/d/dotnet-hostfxr-3.1/dotnet-hostfxr-3.1.6-x64.deb"},{"package":"dotnet-runtime-6.0","version":"6.0.4-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68400,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Runtime 6.0.4","homepage":"https://github.com/dotnet/core","depends":"dotnet-hostfxr-6.0 (>= 6.0.4), dotnet-runtime-deps-6.0 (>= 6.0.4)","sha256":"01f8138ab2c5d9070f1890822f4c4dc24692b6a913b9787c9df6892aff11a234","size":23011424,"filename":"pool/main/d/dotnet-runtime-6.0/dotnet-runtime-6.0.4-x64.deb"},{"package":"dotnet-host","version":"3.1.25-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":145,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 3.1.25","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"380fdc61ed10647dde7e1cf2580428c1e5ed7c492c58636e7e57087ffa30852c","size":32416,"filename":"pool/main/d/dotnet-host/dotnet-host-3.1.25-x64.deb"},{"package":"moby-compose","version":"2.1.1+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":25428,"maintainer":"Microsoft ","description":"A Docker CLI plugin which allows you to run Docker Compose applications from the Docker CLI.","homepage":"https://github.com/docker/compose-cli","conflicts":"docker-ce, docker-ce-cli, docker-ee, docker-ee-cli","depends":"moby-cli","sha256":"73bab455d7ea48f0d15b363a15237dc7299779e05a5c16c3515e95ef52ca7310","size":6295332,"filename":"pool/main/m/moby-compose/moby-compose_2.1.1+azure-1_amd64.deb"},{"package":"moby-engine","version":"20.10.11+azure-1","architecture":"amd64","section":"admin","priority":"optional","installed_size":98022,"maintainer":"Microsoft ","description":"Docker container platform (engine package)","homepage":"https://github.com/moby/moby","conflicts":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","depends":"moby-containerd (>= 1.4.3), moby-runc (>= 1.0.0~rc93), libc6 (>= 2.8), libdevmapper1.02.1 (>= 2:1.02.97)","recommends":"apparmor, ca-certificates, iptables, kmod, moby-cli, pigz, xz-utils","suggests":"aufs-tools, cgroupfs-mount | cgroup-lite, git","replaces":"docker, docker-ce, docker-ee, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","sha256":"e335ea6e6fdf673e537b320a9c194b55aabf77d1a8de548941d13a008bde2398","size":21199964,"filename":"pool/main/m/moby-engine/moby-engine_20.10.11+azure-1_amd64.deb"},{"package":"moby-containerd-shim-systemd","version":"0.1.0~beta.1+azure-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":30091,"maintainer":"Microsoft ","description":"A containerd shim runtime that uses systemd to monitor runc containers","homepage":"https://github.com/cpuguy83/containerd-shim-systemd-v1","depends":"libc6 (>= 2.14), systemd (>= 239), moby-containerd (>= 1.6)","recommends":"moby-runc","sha256":"a8265847f51b994ae68a7e05b2768dca28c037aa8e9499e02ffeb38aa3e525de","size":11959090,"filename":"pool/main/m/moby-containerd-shim-systemd/moby-containerd-shim-systemd_0.1.0~beta.1+azure-ubuntu20.04u1_amd64.deb"},{"package":"azure-ai-vision-runtime-image-analysis","version":"0.13.0~beta.1","architecture":"amd64","section":"devel","priority":"optional","installed_size":682,"maintainer":"vision-sdk@microsoft.com","description":"Azure AI Vision Image Analysis Runtime Package","depends":"azure-ai-vision-runtime-common (= 0.13.0~beta.1), azure-ai-vision-runtime-common-media (= 0.13.0~beta.1)","sha256":"58acb3b752c6503043aaf1cfcdb3ce19ae976ba01f548c7f75dc6a91c0bb33fe","size":150004,"filename":"pool/main/a/azure-ai-vision-runtime-image-analysis/azure-ai-vision-runtime-image-analysis-0.13.0~beta.1-Linux.deb"},{"package":"dotnet-sdk-5.0","version":"5.0.407-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":228016,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 5.0.407","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.4.0), dotnet-runtime-5.0 (>= 5.0.16), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-5.0 (>= 5.0.16), dotnet-targeting-pack-5.0 (>= 5.0.0), aspnetcore-targeting-pack-5.0 (>= 5.0.0), dotnet-apphost-pack-5.0 (>= 5.0.16)","sha256":"241bb67ad6d16299940702fe03bff3fc17bff41d8ac8e72ba83290c5232a74c0","size":59709278,"filename":"pool/main/d/dotnet-sdk-5.0/dotnet-sdk-5.0.407-x64.deb"},{"package":"mdatp","version":"101.25.63","architecture":"amd64","section":"devel","priority":"optional","installed_size":155265,"maintainer":"Microsoft Defender ATP Group ","description":"Microsoft Defender Advanced Threat Protection for Endpoints (Production)","depends":"curl (>= 7.5), libseccomp2, libuuid1, libatomic1, libc6 (>= 2.23), python3, uuid-runtime, dmidecode, auditd, libselinux1","sha256":"6c06505c5e2e9fe6a1e63dada236173729f337039fa5333f7a6026bbd0650cbd","size":46140804,"filename":"pool/main/m/mdatp/mdatp_101.25.63.amd64.deb"},{"package":"dotnet-sdk-5.0","version":"5.0.302-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":227344,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 5.0.302","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.4.0), dotnet-runtime-5.0 (>= 5.0.8), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-5.0 (>= 5.0.8), dotnet-targeting-pack-5.0 (>= 5.0.0), aspnetcore-targeting-pack-5.0 (>= 5.0.0), dotnet-apphost-pack-5.0 (>= 5.0.8)","sha256":"6a056d7df7133fb877e8f77d234642ca13f88dff9861d74738569fa9c9e02e87","size":58722724,"filename":"pool/main/d/dotnet-sdk-5.0/dotnet-sdk-5.0.302-x64.deb"},{"package":"aadsshlogin-selinux","version":"1.0.019630001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"Selinux configuration for AAD NSS and PAM extensions.","conflicts":"aadlogin-selinux","depends":"policycoreutils (>=3.0-1), selinux-utils, selinux-policy-default","sha256":"8289d669492f741297929c892421d04b3bb0830c5435baa14a578c45ff039827","size":2378,"filename":"pool/main/a/aadsshlogin-selinux/aadsshlogin-selinux_1.0.019630001_amd64.deb"},{"package":"dotnet-apphost-pack-7.0","version":"7.0.2-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":11276,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Host 7.0.2","homepage":"https://github.com/dotnet/core","sha256":"6b2b8194c70db56df207d29a1fc982494607c0e6478cf650cffd8973662d1e2a","size":3523898,"filename":"pool/main/d/dotnet-apphost-pack-7.0/dotnet-apphost-pack-7.0.2-x64.deb"},{"package":"procmon","version":"1.0.1","architecture":"amd64","section":"devel","priority":"optional","installed_size":51981,"maintainer":"OSS Tooling Dev Team OSSToolingDevTeam@service.microsoft.com","description":"Procmon for Linux","homepage":"https://github.com/Microsoft/Procmon-for-Linux","depends":"libc6 (>= 2.31), libstdc++6 (>= 10.2), libzstd1 (>= 1.4), libelf1 (>= 0.176), libncurses6 (>= 6.2), libtinfo6 (>= 6)","sha256":"7b989d56a131bd40a8446ad957f1f546ee9152198564354dfb5476948ba95cb0","size":19862512,"filename":"pool/main/p/procmon/procmon_1.0.1-339_amd64.deb"},{"package":"dotnet-host","version":"6.0.22-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":259,"maintainer":".NET Team ","description":"Microsoft .NET Host - 6.0.22","homepage":"https://github.com/dotnet/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"08db6e033a295f61b61c4b7145530cce7dbde0dd485a58e67fa98a0873b7abc2","size":56000,"filename":"pool/main/d/dotnet-host/dotnet-host_6.0.22-1_amd64.deb"},{"package":"azure-functions-core-tools","version":"4.0.5274-1","architecture":"amd64","section":"devel","priority":"optional","maintainer":"Ahmed ElSayed ","description":"Azure Function Core Tools v4","homepage":"https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local#run-azure-functions-core-tools","conflicts":"azure-functions-core-tools-2, azure-functions-core-tools-3","replaces":"azure-functions-core-tools-2, azure-functions-core-tools-3","vcs_git":"https://github.com/Azure/azure-functions-core-tools.git","sha256":"f04b2dab917e9b09b5b1cdac3033c8048eb822d7dae1991a0827a2c7ccbcbf97","size":156746648,"filename":"pool/main/a/azure-functions-core-tools/azure-functions-core-tools_4.0.5274-1.deb"},{"package":"aadsshlogin","version":"1.0.020950001","architecture":"amd64","section":"utils","priority":"optional","maintainer":"Yancho Yanev ","description":"AAD NSS, PAM and certhandler extensions","conflicts":"aadlogin","depends":"libcurl4, libuuid1, passwd, openssh-server (>=6.9)","pre_depends":"grep, sed","sha256":"59c9bf98488d40ce7ec735416708f9117f2d7ec5dd1cc7bdccc4feaa6ff33a9a","size":421814,"filename":"pool/main/a/aadsshlogin/aadsshlogin_1.0.020950001_amd64.deb"},{"package":"dotnet-host","version":"2.1.23-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":175,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 2.1.23","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"ec31c357657956224fdcd301fbd64535bb2e3343fc10823c35a5c906e0573ac9","size":36584,"filename":"pool/main/d/dotnet-host/dotnet-host-2.1.23-x64.deb"},{"package":"mssql-tools","version":"17.6.1.1-1","architecture":"amd64","section":"database","installed_size":0,"maintainer":"Microsoft SQL Tools Team ","description":"Tools for Microsoft(R) SQL Server(R)","depends":"libc6 (>= 2.19), libstdc++6 (>= 4.8.2), libkrb5-3, openssl, debconf (>= 0.5), msodbcsql17 (>= 17.3.0.0)","sha256":"9e68a0f83ba7e770449e399b1513edc9826aa0c3a58e3d911ea982a362c6c41d","size":212296,"filename":"pool/main/m/mssql-tools/mssql-tools_17.6.1.1-1_amd64.deb"},{"package":"dotnet-host","version":"3.1.14-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":146,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Host - 3.1.14","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"849c5f843caf50de8804d6a844501f8cff8af42cd3a515683c61de98e8e8d8d8","size":32812,"filename":"pool/main/d/dotnet-host/dotnet-host-3.1.14-x64.deb"},{"package":"aspnetcore-runtime-6.0","version":"6.0.16-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":19873,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-6.0 (>= 6.0.16)","sha256":"d4e52045a7aeb72dcadcbcab02c644253d73d7fc0f9942636a47bd36bcaf117d","size":6612278,"filename":"pool/main/a/aspnetcore-runtime-6.0/aspnetcore-runtime-6.0.16-x64.deb"},{"package":"moby-containerd","version":"1.4.12+azure-3","architecture":"amd64","section":"admin","priority":"optional","installed_size":120078,"maintainer":"Microsoft ","description":"industry-standard container runtime","system":"image transfer and storage, container execution and supervision,","homepage":"https://github.com/containerd/containerd","conflicts":"containerd, containerd.io, moby-engine (<= 3.0.12)","depends":"libc6 (>= 2.4), moby-runc (>= 1.0.2)","recommends":"ca-certificates","provides":"containerd, containerd.io","replaces":"containerd, containerd.io","sha256":"2a4a5500354c749fca852837ca6df935e709bf147995ddd7a1407130931c9133","size":26976612,"filename":"pool/main/m/moby-containerd/moby-containerd_1.4.12+azure-3_amd64.deb"},{"package":"moby-cli","version":"20.10.18+azure-ubuntu20.04u1","architecture":"amd64","section":"admin","priority":"optional","installed_size":49824,"maintainer":"Microsoft ","description":"Docker container platform (client package)","homepage":"https://github.com/docker/cli","conflicts":"docker, docker-ce, docker-ce-cli, docker-ee, docker-ee-cli, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","depends":"libc6 (>= 2.4)","recommends":"ca-certificates, git, moby-buildx, pigz, xz-utils","suggests":"moby-engine","replaces":"docker, docker-ce, docker-ce-cli, docker-ee, docker-ee-cli, docker-engine, docker-engine-cs, docker.io, lxc-docker, lxc-docker-virtual-package","sha256":"32d6d1eae5e5619551b2a2704526ca2e46771b67d7170fd20df9fc0e00ba3da0","size":9653820,"filename":"pool/main/m/moby-cli/moby-cli_20.10.18+azure-ubuntu20.04u1_amd64.deb"},{"package":"dotnet-runtime-deps-7.0","version":"7.0.7-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":9,"maintainer":".NET Team ","description":"dotnet-runtime-deps-debian 7.0.7","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, libssl1.0.0 | libssl1.0.2 | libssl1.1 | libssl3, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"ddd3c0eb7332dacfecf2a3a8ed8988439431c5f9b6b84a08e92edadec9024b08","size":2890,"filename":"pool/main/d/dotnet-runtime-deps-7.0/dotnet-runtime-deps-7.0.7-x64.deb"},{"package":"dotnet-runtime-deps-6.0","version":"6.0.9-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Team ","description":"dotnet-runtime-deps-debian 6.0.9","homepage":"https://github.com/dotnet/core","depends":"libgcc1, libicu | libicu72 | libicu71 | libicu70 | libicu69 | libicu68 | libicu67 | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, libc6, libssl1.0.0 | libssl1.0.2 | libssl1.1 | libssl3, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"04c85e431825e28b2bbcf43e18f3f8bacfde9686ea78dbba815a61e21078bf56","size":2810,"filename":"pool/main/d/dotnet-runtime-deps-6.0/dotnet-runtime-deps-6.0.9-x64.deb"},{"package":"dotnet-sdk-3.1","version":"3.1.116-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":174529,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 3.1.116","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.6), dotnet-targeting-pack-3.1 (>= 3.1.0), netstandard-targeting-pack-2.1 (>= 2.1.0), dotnet-apphost-pack-3.1 (>= 3.1.16), aspnetcore-targeting-pack-3.1 (>= 3.1.10), dotnet-runtime-3.1 (>= 3.1.16), aspnetcore-runtime-3.1 (>= 3.1.16)","sha256":"6ac2f5102837c57d6d66a4336a1631b0cc6607b02b8a2271bb6fa43cd9c15876","size":43510406,"filename":"pool/main/d/dotnet-sdk-3.1/dotnet-sdk-3.1.116-x64.deb"},{"package":"dotnet-host","version":"5.0.12-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":233,"maintainer":".NET Team ","description":"Microsoft .NET Host - 5.0.12","homepage":"https://dot.net/core","conflicts":"dotnet, dotnet-nightly","depends":"libgcc1, libstdc++6, libc6","sha256":"4f058e88012bda709259371aad36f8c8e51494835dd43b09ba3acc8094c1a3cb","size":52552,"filename":"pool/main/d/dotnet-host/dotnet-host-5.0.12-x64.deb"},{"package":"dotnet-runtime-6.0","version":"6.0.16-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68444,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Runtime 6.0.16","homepage":"https://github.com/dotnet/core","depends":"dotnet-hostfxr-6.0 (>= 6.0.16), dotnet-runtime-deps-6.0 (>= 6.0.16)","sha256":"c61139846f6ab095ef9b3476feaf955eb82042525da39bc512d8eda7134f8c6b","size":22707182,"filename":"pool/main/d/dotnet-runtime-6.0/dotnet-runtime-6.0.16-x64.deb"},{"package":"dotnet-runtime-7.0","version":"7.0.5-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":70820,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Runtime 7.0.5","homepage":"https://github.com/dotnet/core","depends":"dotnet-runtime-deps-7.0 (>= 7.0.5), dotnet-hostfxr-7.0 (>= 7.0.5)","sha256":"6fad7162dbcf639ebe9609c6b4ae4167dc0488ae7c0581a6c322c007259cffa3","size":23193486,"filename":"pool/main/d/dotnet-runtime-7.0/dotnet-runtime-7.0.5-x64.deb"},{"package":"aspnetcore-runtime-2.1","version":"2.1.20-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":71044,"maintainer":"Microsoft ","description":"Microsoft ASP.NET Core 2.1.20 Shared Framework","homepage":"https://www.asp.net/","depends":"libc6 (>= 2.14), dotnet-runtime-2.1 (>= 2.1.20)","sha256":"ee7e20d382b444fad8299534c3133d27180af3cdfe4c82e401298e64bfde618b","size":21927704,"filename":"pool/main/a/aspnetcore-runtime-2.1/aspnetcore-runtime-2.1.20-x64.deb"},{"package":"dotnet-sdk-3.1","version":"3.1.202-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":175287,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 3.1.202","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.6), dotnet-targeting-pack-3.1 (>= 3.1.0), netstandard-targeting-pack-2.1 (>= 2.1.0), dotnet-apphost-pack-3.1 (>= 3.1.4), aspnetcore-targeting-pack-3.1 (>= 3.1.3), dotnet-runtime-3.1 (>= 3.1.4), aspnetcore-runtime-3.1 (>= 3.1.4)","sha256":"c3b8a52fd632b2a4e36fd85f7bf106cd58237cfc098687df8a2312d4d8a46881","size":43432848,"filename":"pool/main/d/dotnet-sdk-3.1/dotnet-sdk-3.1.202-x64.deb"},{"package":"dotnet-runtime-3.1","version":"3.1.23-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":71232,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 3.1.23 Microsoft.NETCore.App 3.1.23","homepage":"https://dot.net/core","depends":"dotnet-hostfxr-3.1 (>= 3.1.23), dotnet-runtime-deps-3.1 (>= 3.1.23)","sha256":"fe6490d54339207c8f946b7f15d5770ec2d08ab37cc55d5c86da27bceb2943a1","size":21817076,"filename":"pool/main/d/dotnet-runtime-3.1/dotnet-runtime-3.1.23-x64.deb"},{"package":"dotnet-runtime-5.0","version":"5.0.9-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68328,"maintainer":".NET Team ","description":"Microsoft .NET Runtime - 5.0.9 Microsoft.NETCore.App 5.0.9","homepage":"https://dot.net/core","depends":"dotnet-runtime-deps-5.0 (>= 5.0.9), dotnet-hostfxr-5.0 (>= 5.0.9)","sha256":"f0a48fbfc02dec7912902ad28356d282212dc0b6f6823bdcca7d2579bd2296fd","size":21522292,"filename":"pool/main/d/dotnet-runtime-5.0/dotnet-runtime-5.0.9-x64.deb"},{"package":"apt-transport-https-sas","version":"0.9-4","architecture":"amd64","section":"admin","priority":"optional","installed_size":48,"maintainer":"Skype Core Services Ops ","description":"SAS (Secure Access Signature) token authentication support for","depends":"python2.7-minimal, python3, apt-transport-https","sha256":"839c820fdbf60e2ef630c5444ed52b172cc6e51380ed2e84f0e5c49784ecdd74","size":12482,"filename":"pool/main/a/apt-transport-https-sas/apt-transport-https-sas_0.9-4_amd64.deb"},{"package":"dotnet-sdk-3.1","version":"3.1.107-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":175200,"maintainer":"Microsoft ","description":"Microsoft .NET Core SDK 3.1.107","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.6), dotnet-targeting-pack-3.1 (>= 3.1.0), netstandard-targeting-pack-2.1 (>= 2.1.0), dotnet-apphost-pack-3.1 (>= 3.1.7), aspnetcore-targeting-pack-3.1 (>= 3.1.3), dotnet-runtime-3.1 (>= 3.1.7), aspnetcore-runtime-3.1 (>= 3.1.7)","sha256":"c78a136dc95f35e7c59d83287185421b8b537ee49bd150312e32c462f463b726","size":43694236,"filename":"pool/main/d/dotnet-sdk-3.1/dotnet-sdk-3.1.107-x64.deb"},{"package":"aspnetcore-runtime-7.0","version":"7.0.13-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":21370,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-7.0 (>= 7.0.13)","sha256":"8dc6bd1555aa8cab7b1e37434a8ba49e24c1d427cf8cdae4203c3a72f901979e","size":7064190,"filename":"pool/main/a/aspnetcore-runtime-7.0/aspnetcore-runtime-7.0_7.0.13-1_amd64.deb"},{"package":"dotnet-runtime-2.1","version":"2.1.29-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":68171,"maintainer":".NET Core Team ","description":"Microsoft .NET Core Runtime - 2.1.29 Microsoft.NETCore.App 2.1.29","homepage":"https://dot.net/core","depends":"dotnet-runtime-deps-2.1 (>= 2.1.29), dotnet-hostfxr-2.1 (>= 2.1.29)","sha256":"f6d4a92499646860af596f86a0a4cf4319887149bdbf09807d0cf6a1e0aa56bb","size":20506622,"filename":"pool/main/d/dotnet-runtime-2.1/dotnet-runtime-2.1.29-x64.deb"},{"package":"dotnet-sdk-5.0","version":"5.0.211-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":222064,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 5.0.211","homepage":"https://dotnet.github.io/core","depends":"libc6 (>= 2.14), libgcc1 (>= 1:3.0), libstdc++6 (>= 4.4.0), dotnet-runtime-5.0 (>= 5.0.14), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-5.0 (>= 5.0.14), dotnet-targeting-pack-5.0 (>= 5.0.0), aspnetcore-targeting-pack-5.0 (>= 5.0.0), dotnet-apphost-pack-5.0 (>= 5.0.14)","sha256":"ca310e5c489a53cd12cd5e00535269572d5cb7443dd242eab568629553c1a1d0","size":57090632,"filename":"pool/main/d/dotnet-sdk-5.0/dotnet-sdk-5.0.211-x64.deb"},{"package":"aspnetcore-runtime-3.1","version":"3.1.23-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":17499,"maintainer":"Microsoft ","description":"Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/aspnet/AspNetCore). We happily accept issues and PRs.","homepage":"https://asp.net","depends":"dotnet-runtime-3.1 (>= 3.1.23)","sha256":"968b3d4a4417eaa5820cd2ac8c4ec35e0b6d67e1efb996461644efa175b2567a","size":5771268,"filename":"pool/main/a/aspnetcore-runtime-3.1/aspnetcore-runtime-3.1.23-x64.deb"},{"package":"dotnet-sdk-6.0","version":"6.0.203-1","architecture":"amd64","section":"devel","priority":"standard","installed_size":319917,"maintainer":"Microsoft ","description":"Microsoft .NET SDK 6.0.203","homepage":"https://github.com/dotnet/core","depends":"dotnet-targeting-pack-6.0 (>= 6.0.5), netstandard-targeting-pack-2.1 (>= 2.1.0), aspnetcore-runtime-6.0 (>= 6.0.5), dotnet-apphost-pack-6.0 (>= 6.0.5), dotnet-runtime-6.0 (>= 6.0.5), aspnetcore-targeting-pack-6.0 (>= 6.0.5)","sha256":"debc94f20bcb9123d2c3bd8c369049d8af2858791da3a114c953786da442c1a2","size":80517208,"filename":"pool/main/d/dotnet-sdk-6.0/dotnet-sdk-6.0.203-x64.deb"},{"package":"dotnet-runtime-deps-3.1","version":"3.1.9-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":26,"maintainer":".NET Core Team ","description":"dotnet-runtime-deps-3.1 3.1.9","homepage":"https://dot.net/core","depends":"libgcc1, libssl1.0.0 | libssl1.0.2 | libssl1.1, libc6, libicu | libicu66 | libicu65 | libicu63 | libicu60 | libicu57 | libicu55 | libicu52, zlib1g, libstdc++6, libgssapi-krb5-2","sha256":"a5d634cb0d45f125a3760972b8b4accba973a18226083ee024e987860eeefe22","size":2672,"filename":"pool/main/d/dotnet-runtime-deps-3.1/dotnet-runtime-deps-3.1.9-x64.deb"},{"package":"dotnet-apphost-pack-7.0","version":"7.0.13-1","architecture":"amd64","section":"libs","priority":"standard","installed_size":11281,"maintainer":".NET Team ","description":"Microsoft.NETCore.App.Host 7.0.13","homepage":"https://github.com/dotnet/core","sha256":"5425475e280b41cdc55df0a2dca006cc0c88c1b2d86662a0c487091e375b435c","size":3523526,"filename":"pool/main/d/dotnet-apphost-pack-7.0/dotnet-apphost-pack-7.0_7.0.13-1_amd64.deb"},{"package":"procdump","version":"1.2-359","architecture":"amd64","section":"devel","priority":"optional","installed_size":292,"maintainer":"OSS Tooling Dev Team ","description":"Sysinternals process dump utility","homepage":"https://github.com/Microsoft/ProcDump-for-Linux","depends":"gdb (>= 7.6.1), libc6","sha256":"3499e3c5ec87145fd656dadb03e6ed9ecf200453f83c6bfe6d2d73572e74e7c3","size":95620,"filename":"pool/main/p/procdump/procdump_1.2-359_amd64.deb"},{"package":"azcmagent","version":"0.10.20195.006","architecture":"amd64","maintainer":"Azure Connected Machine Agent