mirror of
https://github.com/kellyjonbrazil/jc.git
synced 2025-06-17 00:07:37 +02:00
Merge branch 'dev'
This commit is contained in:
33
.github/workflows/pythonapp.yml
vendored
33
.github/workflows/pythonapp.yml
vendored
@ -9,12 +9,39 @@ on:
|
||||
- "**/*.py"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
old_python:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest, ubuntu-20.04, windows-latest]
|
||||
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
|
||||
os: [macos-13, ubuntu-20.04, windows-2019]
|
||||
python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: "Set up timezone to America/Los_Angeles"
|
||||
uses: szenius/set-timezone@v1.2
|
||||
with:
|
||||
timezoneLinux: "America/Los_Angeles"
|
||||
timezoneMacos: "America/Los_Angeles"
|
||||
timezoneWindows: "Pacific Standard Time"
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
- name: Test with unittest
|
||||
run: |
|
||||
python -m unittest discover tests
|
||||
|
||||
latest_python:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest, ubuntu-latest, windows-latest]
|
||||
python-version: ["3.11", "3.12"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
12
CHANGELOG
12
CHANGELOG
@ -1,5 +1,17 @@
|
||||
jc changelog
|
||||
|
||||
20240609 v1.25.3
|
||||
- Enhance `bluetoothctl` parser with added `battery_percentage` field
|
||||
- Enhance `git-log` standard and streaming parsers with added `lines_changed` field under `file_stats`
|
||||
- Fix `pci-ids` parser to correctly handle multiple subdevices
|
||||
- Fix `pip-show` parser to handle multi-line fields with a beginning blank line
|
||||
- Fix `ss` parser to correctly handle the `Recv-Q` field being too close to the `Status` field
|
||||
- Fix `top` parsers to quiet uptime info parsing
|
||||
- Fix `traceroute` parser to correctly handle hops with multiple IPs
|
||||
- Fix `zpool-status` parser for config items lacking data values
|
||||
- Optimize some tests by removing timezone settings and using quiet=True
|
||||
- Documentation updates
|
||||
|
||||
20240323 v1.25.2
|
||||
- Add `apt-cache-show` command parser
|
||||
- Add `apt-get-sqq` command parser
|
||||
|
@ -9,11 +9,11 @@ Requires the `-sqq` options in `apt-get`.
|
||||
|
||||
Usage (cli):
|
||||
|
||||
$ apt-get -sqq | jc --apt-get-sqq
|
||||
$ apt-get -sqq upgrade | jc --apt-get-sqq
|
||||
|
||||
or
|
||||
|
||||
$ jc apt-get -sqq
|
||||
$ jc apt-get -sqq full-upgrade
|
||||
|
||||
Usage (module):
|
||||
|
||||
@ -35,7 +35,7 @@ Schema:
|
||||
|
||||
Examples:
|
||||
|
||||
$ apt-get -sqq | jc --apt-get-sqq -p
|
||||
$ apt-get -sqq upgrade | jc --apt-get-sqq -p
|
||||
[
|
||||
{
|
||||
"operation": "unpack",
|
||||
@ -103,7 +103,7 @@ Examples:
|
||||
}
|
||||
]
|
||||
|
||||
$ apt-get -sqq | jc --apt-get-sqq -p -r
|
||||
$ apt-get -sqq upgrade | jc --apt-get-sqq -p -r
|
||||
[
|
||||
{
|
||||
"operation": "Inst",
|
||||
@ -198,4 +198,4 @@ Compatibility: linux
|
||||
|
||||
Source: [`jc/parsers/apt_get_sqq.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/apt_get_sqq.py)
|
||||
|
||||
Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -70,7 +70,8 @@ a controller and a device but there might be fields corresponding to one entity.
|
||||
"rssi": int,
|
||||
"txpower": int,
|
||||
"uuids": array,
|
||||
"modalias": string
|
||||
"modalias": string,
|
||||
"battery_percentage": int
|
||||
}
|
||||
]
|
||||
|
||||
@ -101,7 +102,8 @@ Examples:
|
||||
"Headset HS (00001831-0000-1000-8000-00805f9b34fb)"
|
||||
],
|
||||
"rssi": -52,
|
||||
"txpower": 4
|
||||
"txpower": 4,
|
||||
"battery_percentage": 70
|
||||
}
|
||||
]
|
||||
|
||||
@ -132,4 +134,4 @@ Compatibility: linux
|
||||
|
||||
Source: [`jc/parsers/bluetoothctl.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/bluetoothctl.py)
|
||||
|
||||
Version 1.1 by Jake Ob (iakopap at gmail.com)
|
||||
Version 1.2 by Jake Ob (iakopap at gmail.com)
|
||||
|
@ -55,6 +55,12 @@ Schema:
|
||||
"deletions": integer,
|
||||
"files": [
|
||||
string
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": string,
|
||||
"lines_changed": integer
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -79,6 +85,16 @@ Examples:
|
||||
"files": [
|
||||
"docs/parsers/git_log.md",
|
||||
"jc/parsers/git_log.py"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": 3
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": 7
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add timestamp docs and examples",
|
||||
@ -100,6 +116,28 @@ Examples:
|
||||
"jc/parsers/git_log.py",
|
||||
"jc/utils.py",
|
||||
"man/jc.1"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": 3
|
||||
},
|
||||
{
|
||||
"name": "docs/utils.md",
|
||||
"lines_changed": 7
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": 1
|
||||
},
|
||||
{
|
||||
"name": "jc/utils.py",
|
||||
"lines_changed": 12
|
||||
},
|
||||
{
|
||||
"name": "man/jc.1",
|
||||
"lines_changed": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add calculated timestamp",
|
||||
@ -123,6 +161,16 @@ Examples:
|
||||
"files": [
|
||||
"docs/parsers/git_log.md",
|
||||
"jc/parsers/git_log.py"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": "3"
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": "7"
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add timestamp docs and examples"
|
||||
@ -142,6 +190,28 @@ Examples:
|
||||
"jc/parsers/git_log.py",
|
||||
"jc/utils.py",
|
||||
"man/jc.1"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": "3"
|
||||
},
|
||||
{
|
||||
"name": "docs/utils.md",
|
||||
"lines_changed": "7"
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": "1"
|
||||
},
|
||||
{
|
||||
"name": "jc/utils.py",
|
||||
"lines_changed": "12"
|
||||
},
|
||||
{
|
||||
"name": "man/jc.1",
|
||||
"lines_changed": "14"
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add calculated timestamp"
|
||||
@ -174,4 +244,4 @@ Compatibility: linux, darwin, cygwin, win32, aix, freebsd
|
||||
|
||||
Source: [`jc/parsers/git_log.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/git_log.py)
|
||||
|
||||
Version 1.4 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.5 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -56,6 +56,12 @@ Schema:
|
||||
"deletions": integer,
|
||||
"files": [
|
||||
string
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": string,
|
||||
"lines_changed": integer
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -109,4 +115,4 @@ Compatibility: linux, darwin, cygwin, win32, aix, freebsd
|
||||
|
||||
Source: [`jc/parsers/git_log_s.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/git_log_s.py)
|
||||
|
||||
Version 1.4 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.5 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -53,7 +53,6 @@ Schema:
|
||||
"sdevice_id_int": integer,
|
||||
"rev": string,
|
||||
"physlot": string,
|
||||
"physlot_int": integer,
|
||||
"progif": string,
|
||||
"progif_int": integer
|
||||
}
|
||||
@ -89,7 +88,6 @@ Examples:
|
||||
"sdevice_id": "07e0",
|
||||
"sdevice_id_int": 2016,
|
||||
"physlot": "37",
|
||||
"physlot_int": 55,
|
||||
"progif": "01",
|
||||
"progif_int": 1
|
||||
},
|
||||
@ -147,4 +145,4 @@ Compatibility: linux
|
||||
|
||||
Source: [`jc/parsers/lspci.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/lspci.py)
|
||||
|
||||
Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -98,4 +98,4 @@ Compatibility: linux, darwin, cygwin, win32, aix, freebsd
|
||||
|
||||
Source: [`jc/parsers/pci_ids.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/pci_ids.py)
|
||||
|
||||
Version 1.0 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -90,4 +90,4 @@ Compatibility: linux, darwin, cygwin, win32, aix, freebsd
|
||||
|
||||
Source: [`jc/parsers/pip_show.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/pip_show.py)
|
||||
|
||||
Version 1.4 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.5 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -47,6 +47,13 @@ field names
|
||||
"file_descriptor": string
|
||||
}
|
||||
}
|
||||
"inode_number": string,
|
||||
"cookie": string,
|
||||
"cgroup": string,
|
||||
"v6only": string,
|
||||
"timer_name": string,
|
||||
"expire_time": string,
|
||||
"retrans": string
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -310,4 +317,4 @@ Compatibility: linux
|
||||
|
||||
Source: [`jc/parsers/ss.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/ss.py)
|
||||
|
||||
Version 1.7 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.8 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -338,4 +338,4 @@ Compatibility: linux
|
||||
|
||||
Source: [`jc/parsers/top.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/top.py)
|
||||
|
||||
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -178,4 +178,4 @@ Compatibility: linux
|
||||
|
||||
Source: [`jc/parsers/top_s.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/top_s.py)
|
||||
|
||||
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -145,4 +145,4 @@ Compatibility: linux, darwin, freebsd
|
||||
|
||||
Source: [`jc/parsers/traceroute.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/traceroute.py)
|
||||
|
||||
Version 1.6 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.7 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -34,11 +34,11 @@ Schema:
|
||||
"config": [
|
||||
{
|
||||
"name": string,
|
||||
"state": string,
|
||||
"read": integer,
|
||||
"write": integer,
|
||||
"checksum": integer,
|
||||
"errors": string,
|
||||
"state": string/null,
|
||||
"read": integer/null,
|
||||
"write": integer/null,
|
||||
"checksum": integer/null,
|
||||
"errors": string/null,
|
||||
}
|
||||
],
|
||||
"errors": string
|
||||
@ -162,4 +162,4 @@ Compatibility: linux, darwin, freebsd
|
||||
|
||||
Source: [`jc/parsers/zpool_status.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/zpool_status.py)
|
||||
|
||||
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)
|
||||
|
@ -10,7 +10,7 @@ from jc import appdirs
|
||||
from jc import utils
|
||||
|
||||
|
||||
__version__ = '1.25.2'
|
||||
__version__ = '1.25.3'
|
||||
|
||||
parsers: List[str] = [
|
||||
'acpi',
|
||||
|
@ -4,11 +4,11 @@ Requires the `-sqq` options in `apt-get`.
|
||||
|
||||
Usage (cli):
|
||||
|
||||
$ apt-get -sqq | jc --apt-get-sqq
|
||||
$ apt-get -sqq upgrade | jc --apt-get-sqq
|
||||
|
||||
or
|
||||
|
||||
$ jc apt-get -sqq
|
||||
$ jc apt-get -sqq full-upgrade
|
||||
|
||||
Usage (module):
|
||||
|
||||
@ -30,7 +30,7 @@ Schema:
|
||||
|
||||
Examples:
|
||||
|
||||
$ apt-get -sqq | jc --apt-get-sqq -p
|
||||
$ apt-get -sqq upgrade | jc --apt-get-sqq -p
|
||||
[
|
||||
{
|
||||
"operation": "unpack",
|
||||
@ -98,7 +98,7 @@ Examples:
|
||||
}
|
||||
]
|
||||
|
||||
$ apt-get -sqq | jc --apt-get-sqq -p -r
|
||||
$ apt-get -sqq upgrade | jc --apt-get-sqq -p -r
|
||||
[
|
||||
{
|
||||
"operation": "Inst",
|
||||
@ -174,7 +174,7 @@ import jc.utils
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.0'
|
||||
version = '1.1'
|
||||
description = '`apt-get -sqq` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
|
@ -65,7 +65,8 @@ a controller and a device but there might be fields corresponding to one entity.
|
||||
"rssi": int,
|
||||
"txpower": int,
|
||||
"uuids": array,
|
||||
"modalias": string
|
||||
"modalias": string,
|
||||
"battery_percentage": int
|
||||
}
|
||||
]
|
||||
|
||||
@ -96,7 +97,8 @@ Examples:
|
||||
"Headset HS (00001831-0000-1000-8000-00805f9b34fb)"
|
||||
],
|
||||
"rssi": -52,
|
||||
"txpower": 4
|
||||
"txpower": 4,
|
||||
"battery_percentage": 70
|
||||
}
|
||||
]
|
||||
"""
|
||||
@ -108,7 +110,7 @@ import jc.utils
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.1'
|
||||
version = '1.2'
|
||||
description = '`bluetoothctl` command parser'
|
||||
author = 'Jake Ob'
|
||||
author_email = 'iakopap at gmail.com'
|
||||
@ -161,7 +163,8 @@ try:
|
||||
"rssi": int,
|
||||
"txpower": int,
|
||||
"uuids": List[str],
|
||||
"modalias": str
|
||||
"modalias": str,
|
||||
"battery_percentage": int
|
||||
},
|
||||
)
|
||||
except ImportError:
|
||||
@ -280,6 +283,7 @@ _device_line_pattern = (
|
||||
+ r"|\s*Modalias:\s*(?P<modalias>.+)"
|
||||
+ r"|\s*RSSI:\s*(?P<rssi>.+)"
|
||||
+ r"|\s*TxPower:\s*(?P<txpower>.+)"
|
||||
+ r"|\s*Battery\sPercentage:\s*0[xX][0-9a-fA-F]*\s*\((?P<battery_percentage>[0-9]+)\)"
|
||||
+ r"|\s*UUID:\s*(?P<uuid>.+))"
|
||||
)
|
||||
|
||||
@ -317,7 +321,8 @@ def _parse_device(next_lines: List[str], quiet: bool) -> Optional[Device]:
|
||||
"rssi": 0,
|
||||
"txpower": 0,
|
||||
"uuids": [],
|
||||
"modalias": ''
|
||||
"modalias": '',
|
||||
"battery_percentage": 0
|
||||
}
|
||||
|
||||
if name.endswith("(public)"):
|
||||
@ -381,6 +386,13 @@ def _parse_device(next_lines: List[str], quiet: bool) -> Optional[Device]:
|
||||
device["uuids"].append(matches["uuid"])
|
||||
elif matches["modalias"]:
|
||||
device["modalias"] = matches["modalias"]
|
||||
elif matches["battery_percentage"]:
|
||||
battery_percentage = matches["battery_percentage"]
|
||||
try:
|
||||
device["battery_percentage"] = int(battery_percentage)
|
||||
except ValueError:
|
||||
if not quiet:
|
||||
jc.utils.warning_message([f"{next_line} : battery_percentage - {battery_percentage} is not int-able"])
|
||||
|
||||
return device
|
||||
|
||||
|
@ -50,6 +50,12 @@ Schema:
|
||||
"deletions": integer,
|
||||
"files": [
|
||||
string
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": string,
|
||||
"lines_changed": integer
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -74,6 +80,16 @@ Examples:
|
||||
"files": [
|
||||
"docs/parsers/git_log.md",
|
||||
"jc/parsers/git_log.py"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": 3
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": 7
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add timestamp docs and examples",
|
||||
@ -95,6 +111,28 @@ Examples:
|
||||
"jc/parsers/git_log.py",
|
||||
"jc/utils.py",
|
||||
"man/jc.1"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": 3
|
||||
},
|
||||
{
|
||||
"name": "docs/utils.md",
|
||||
"lines_changed": 7
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": 1
|
||||
},
|
||||
{
|
||||
"name": "jc/utils.py",
|
||||
"lines_changed": 12
|
||||
},
|
||||
{
|
||||
"name": "man/jc.1",
|
||||
"lines_changed": 14
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add calculated timestamp",
|
||||
@ -118,6 +156,16 @@ Examples:
|
||||
"files": [
|
||||
"docs/parsers/git_log.md",
|
||||
"jc/parsers/git_log.py"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": "3"
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": "7"
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add timestamp docs and examples"
|
||||
@ -137,6 +185,28 @@ Examples:
|
||||
"jc/parsers/git_log.py",
|
||||
"jc/utils.py",
|
||||
"man/jc.1"
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": "docs/parsers/git_log.md",
|
||||
"lines_changed": "3"
|
||||
},
|
||||
{
|
||||
"name": "docs/utils.md",
|
||||
"lines_changed": "7"
|
||||
},
|
||||
{
|
||||
"name": "jc/parsers/git_log.py",
|
||||
"lines_changed": "1"
|
||||
},
|
||||
{
|
||||
"name": "jc/utils.py",
|
||||
"lines_changed": "12"
|
||||
},
|
||||
{
|
||||
"name": "man/jc.1",
|
||||
"lines_changed": "14"
|
||||
}
|
||||
]
|
||||
},
|
||||
"message": "add calculated timestamp"
|
||||
@ -145,7 +215,7 @@ Examples:
|
||||
]
|
||||
"""
|
||||
import re
|
||||
from typing import List, Dict
|
||||
from typing import List, Dict, Any
|
||||
import jc.utils
|
||||
|
||||
hash_pattern = re.compile(r'(?:[0-9]|[a-f]){40}')
|
||||
@ -153,7 +223,7 @@ changes_pattern = re.compile(r'\s(?P<files>\d+)\s+(files? changed)(?:,\s+(?P<ins
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.4'
|
||||
version = '1.5'
|
||||
description = '`git log` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -177,7 +247,7 @@ def _process(proc_data: List[Dict]) -> List[Dict]:
|
||||
|
||||
List of Dictionaries. Structured to conform to the schema.
|
||||
"""
|
||||
int_list = {'files_changed', 'insertions', 'deletions'}
|
||||
int_list = {'files_changed', 'insertions', 'deletions', 'lines_changed'}
|
||||
|
||||
for entry in proc_data:
|
||||
if 'date' in entry:
|
||||
@ -190,6 +260,13 @@ def _process(proc_data: List[Dict]) -> List[Dict]:
|
||||
if key in int_list:
|
||||
entry['stats'][key] = jc.utils.convert_to_int(entry['stats'][key])
|
||||
|
||||
if 'file_stats' in entry['stats']:
|
||||
file_stats = entry['stats']['file_stats']
|
||||
for file_entry in file_stats:
|
||||
for key in file_entry:
|
||||
if key in int_list:
|
||||
file_entry[key] = jc.utils.convert_to_int(file_entry[key])
|
||||
|
||||
return proc_data
|
||||
|
||||
|
||||
@ -251,6 +328,7 @@ def parse(
|
||||
output_line: Dict = {}
|
||||
message_lines: List[str] = []
|
||||
file_list: List[str] = []
|
||||
file_stats_list: List[Dict[str, Any]] = []
|
||||
|
||||
if jc.utils.has_data(data):
|
||||
|
||||
@ -263,10 +341,14 @@ def parse(
|
||||
if file_list:
|
||||
output_line['stats']['files'] = file_list
|
||||
|
||||
if file_stats_list:
|
||||
output_line['stats']['file_stats'] = file_stats_list
|
||||
|
||||
raw_output.append(output_line)
|
||||
output_line = {}
|
||||
message_lines = []
|
||||
file_list = []
|
||||
file_stats_list = []
|
||||
output_line = {
|
||||
'commit': line_list[0],
|
||||
'message': line_list[1]
|
||||
@ -282,10 +364,14 @@ def parse(
|
||||
if file_list:
|
||||
output_line['stats']['files'] = file_list
|
||||
|
||||
if file_stats_list:
|
||||
output_line['stats']['file_stats'] = file_stats_list
|
||||
|
||||
raw_output.append(output_line)
|
||||
output_line = {}
|
||||
message_lines = []
|
||||
file_list = []
|
||||
file_stats_list = []
|
||||
output_line['commit'] = line_list[1]
|
||||
continue
|
||||
|
||||
@ -319,8 +405,19 @@ def parse(
|
||||
|
||||
if line.startswith(' ') and 'changed, ' not in line:
|
||||
# this is a file name
|
||||
file_name = line.split('|')[0].strip()
|
||||
file_line_split = line.split('|')
|
||||
file_name = file_line_split[0].strip()
|
||||
file_list.append(file_name)
|
||||
|
||||
if len(file_line_split) > 1:
|
||||
file_stats = file_line_split[1].strip()
|
||||
lines_changed_str = file_stats.split(' ')
|
||||
lines_changed_count_str = lines_changed_str[0].strip()
|
||||
|
||||
file_stat = {}
|
||||
file_stat["name"] = file_name
|
||||
file_stat["lines_changed"] = lines_changed_count_str
|
||||
file_stats_list.append(file_stat)
|
||||
continue
|
||||
|
||||
if line.startswith(' ') and 'changed, ' in line:
|
||||
@ -344,6 +441,9 @@ def parse(
|
||||
if file_list:
|
||||
output_line['stats']['files'] = file_list
|
||||
|
||||
if file_stats_list:
|
||||
output_line['stats']['file_stats'] = file_stats_list
|
||||
|
||||
raw_output.append(output_line)
|
||||
|
||||
return raw_output if raw else _process(raw_output)
|
||||
|
@ -51,6 +51,12 @@ Schema:
|
||||
"deletions": integer,
|
||||
"files": [
|
||||
string
|
||||
],
|
||||
"file_stats": [
|
||||
{
|
||||
"name": string,
|
||||
"lines_changed": integer
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -73,7 +79,7 @@ Examples:
|
||||
...
|
||||
"""
|
||||
import re
|
||||
from typing import List, Dict, Iterable, Union
|
||||
from typing import List, Dict, Any, Iterable, Union
|
||||
import jc.utils
|
||||
from jc.parsers.git_log import _parse_name_email
|
||||
from jc.streaming import (
|
||||
@ -88,7 +94,7 @@ changes_pattern = re.compile(r'\s(?P<files>\d+)\s+(files? changed)(?:,\s+(?P<ins
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.4'
|
||||
version = '1.5'
|
||||
description = '`git log` command streaming parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -112,7 +118,7 @@ def _process(proc_data: Dict) -> Dict:
|
||||
|
||||
Dictionary. Structured data to conform to the schema.
|
||||
"""
|
||||
int_list = {'files_changed', 'insertions', 'deletions'}
|
||||
int_list = {'files_changed', 'insertions', 'deletions', 'lines_changed'}
|
||||
|
||||
if 'date' in proc_data:
|
||||
ts = jc.utils.timestamp(proc_data['date'], format_hint=(1100,))
|
||||
@ -124,6 +130,13 @@ def _process(proc_data: Dict) -> Dict:
|
||||
if key in int_list:
|
||||
proc_data['stats'][key] = jc.utils.convert_to_int(proc_data['stats'][key])
|
||||
|
||||
if 'file_stats' in proc_data['stats']:
|
||||
file_stats = proc_data['stats']['file_stats']
|
||||
for file_entry in file_stats:
|
||||
for key in file_entry:
|
||||
if key in int_list:
|
||||
file_entry[key] = jc.utils.convert_to_int(file_entry[key])
|
||||
|
||||
return proc_data
|
||||
|
||||
|
||||
@ -168,6 +181,7 @@ def parse(
|
||||
output_line: Dict = {}
|
||||
message_lines: List[str] = []
|
||||
file_list: List[str] = []
|
||||
file_stats_list: List[Dict[str, Any]] = []
|
||||
|
||||
for line in data:
|
||||
try:
|
||||
@ -184,11 +198,15 @@ def parse(
|
||||
if file_list:
|
||||
output_line['stats']['files'] = file_list
|
||||
|
||||
if file_stats_list:
|
||||
output_line['stats']['file_stats'] = file_stats_list
|
||||
|
||||
yield output_line if raw else _process(output_line)
|
||||
|
||||
output_line = {}
|
||||
message_lines = []
|
||||
file_list = []
|
||||
file_stats_list = []
|
||||
output_line = {
|
||||
'commit': line_list[0],
|
||||
'message': line_list[1]
|
||||
@ -204,11 +222,15 @@ def parse(
|
||||
if file_list:
|
||||
output_line['stats']['files'] = file_list
|
||||
|
||||
if file_stats_list:
|
||||
output_line['stats']['file_stats'] = file_stats_list
|
||||
|
||||
yield output_line if raw else _process(output_line)
|
||||
|
||||
output_line = {}
|
||||
message_lines = []
|
||||
file_list = []
|
||||
file_stats_list = []
|
||||
output_line['commit'] = line_list[1]
|
||||
continue
|
||||
|
||||
@ -242,8 +264,19 @@ def parse(
|
||||
|
||||
if line.startswith(' ') and 'changed, ' not in line:
|
||||
# this is a file name
|
||||
file_name = line.split('|')[0].strip()
|
||||
file_line_split = line.split('|')
|
||||
file_name = file_line_split[0].strip()
|
||||
file_list.append(file_name)
|
||||
|
||||
if len(file_line_split) > 1:
|
||||
file_stats = file_line_split[1].strip()
|
||||
lines_changed_str = file_stats.split(' ')
|
||||
lines_changed_count_str = lines_changed_str[0].strip()
|
||||
|
||||
file_stat = {}
|
||||
file_stat["name"] = file_name
|
||||
file_stat["lines_changed"] = lines_changed_count_str
|
||||
file_stats_list.append(file_stat)
|
||||
continue
|
||||
|
||||
if line.startswith(' ') and 'changed, ' in line:
|
||||
@ -274,6 +307,9 @@ def parse(
|
||||
if file_list:
|
||||
output_line['stats']['files'] = file_list
|
||||
|
||||
if file_stats_list:
|
||||
output_line['stats']['file_stats'] = file_stats_list
|
||||
|
||||
yield output_line if raw else _process(output_line)
|
||||
|
||||
except Exception as e:
|
||||
|
@ -48,7 +48,6 @@ Schema:
|
||||
"sdevice_id_int": integer,
|
||||
"rev": string,
|
||||
"physlot": string,
|
||||
"physlot_int": integer,
|
||||
"progif": string,
|
||||
"progif_int": integer
|
||||
}
|
||||
@ -84,7 +83,6 @@ Examples:
|
||||
"sdevice_id": "07e0",
|
||||
"sdevice_id_int": 2016,
|
||||
"physlot": "37",
|
||||
"physlot_int": 55,
|
||||
"progif": "01",
|
||||
"progif_int": 1
|
||||
},
|
||||
@ -123,7 +121,7 @@ import jc.utils
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.0'
|
||||
version = '1.1'
|
||||
description = '`lspci -mmv` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -149,7 +147,7 @@ def _process(proc_data: List[JSONDictType]) -> List[JSONDictType]:
|
||||
"""
|
||||
int_list: set[str] = {
|
||||
'domain', 'bus', 'dev', 'function', 'class_id', 'vendor_id', 'device_id',
|
||||
'svendor_id', 'sdevice_id', 'physlot', 'progif'
|
||||
'svendor_id', 'sdevice_id', 'progif'
|
||||
}
|
||||
|
||||
new_list: List[JSONDictType] = []
|
||||
|
@ -76,7 +76,7 @@ import jc.utils
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.0'
|
||||
version = '1.1'
|
||||
description = '`pci.ids` file parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -182,7 +182,8 @@ def parse(
|
||||
if vdc_subvendor:
|
||||
subvendor = '_' + vdc_subvendor.groupdict()['subvendor']
|
||||
subdevice = '_' + vdc_subvendor.groupdict()['subdevice']
|
||||
vdc_obj[vendor_id][device_id][subvendor] = {}
|
||||
if not vdc_obj[vendor_id][device_id].get(subvendor) or not isinstance(vdc_obj[vendor_id][device_id][subvendor], dict):
|
||||
vdc_obj[vendor_id][device_id][subvendor] = {}
|
||||
vdc_obj[vendor_id][device_id][subvendor][subdevice] = {}
|
||||
vdc_obj[vendor_id][device_id][subvendor][subdevice]['subsystem_name'] = vdc_subvendor.groupdict()['subsystem_name']
|
||||
continue
|
||||
|
@ -66,7 +66,7 @@ import jc.utils
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.4'
|
||||
version = '1.5'
|
||||
description = '`pip show` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -144,6 +144,8 @@ def parse(
|
||||
item_value = None
|
||||
|
||||
if last_key_data and last_key != item_key:
|
||||
if not isinstance(package[last_key], str):
|
||||
package[last_key] = ''
|
||||
package[last_key] = package[last_key] + '\n' + '\n'.join(last_key_data)
|
||||
last_key_data = []
|
||||
|
||||
|
@ -42,6 +42,13 @@ field names
|
||||
"file_descriptor": string
|
||||
}
|
||||
}
|
||||
"inode_number": string,
|
||||
"cookie": string,
|
||||
"cgroup": string,
|
||||
"v6only": string,
|
||||
"timer_name": string,
|
||||
"expire_time": string,
|
||||
"retrans": string
|
||||
}
|
||||
}
|
||||
]
|
||||
@ -288,7 +295,7 @@ import jc.utils
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.7'
|
||||
version = '1.8'
|
||||
description = '`ss` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -344,13 +351,16 @@ def _parse_opts(proc_data):
|
||||
"""
|
||||
o_field = proc_data.split(' ')
|
||||
opts = {}
|
||||
|
||||
for item in o_field:
|
||||
# -e option:
|
||||
item = re.sub(
|
||||
'uid', 'uid_number',
|
||||
re.sub('sk', 'cookie', re.sub('ino', 'inode_number', item)))
|
||||
|
||||
if ":" in item:
|
||||
key, val = item.split(':')
|
||||
|
||||
# -o option
|
||||
if key == "timer":
|
||||
val = val.replace('(', '[').replace(')', ']')
|
||||
@ -361,6 +371,7 @@ def _parse_opts(proc_data):
|
||||
'retrans': val[2]
|
||||
}
|
||||
opts[key] = val
|
||||
|
||||
# -p option
|
||||
if key == "users":
|
||||
key = 'process_id'
|
||||
@ -380,7 +391,9 @@ def _parse_opts(proc_data):
|
||||
}
|
||||
})
|
||||
val = data
|
||||
|
||||
opts[key] = val
|
||||
|
||||
return opts
|
||||
|
||||
def parse(data, raw=False, quiet=False):
|
||||
@ -402,16 +415,24 @@ def parse(data, raw=False, quiet=False):
|
||||
|
||||
contains_colon = ['nl', 'p_raw', 'raw', 'udp', 'tcp', 'v_str', 'icmp6']
|
||||
raw_output = []
|
||||
ONE_OR_MORE_SPACE_PATTERN = r'[ ]{1,}'
|
||||
TWO_OR_MORE_SPACES_PATTERN = r'[ ]{2,}'
|
||||
|
||||
# Clear any blank lines
|
||||
cleandata = list(filter(None, data.splitlines()))
|
||||
|
||||
if jc.utils.has_data(data):
|
||||
|
||||
header_text = cleandata[0].lower()
|
||||
|
||||
# get the position of Recv-Q since sometimes it doesn't leave enough space
|
||||
# to parse. need at least two spaces between main fields to differentiate
|
||||
# from opt fields, which are only separated by one space
|
||||
recv_q_position = header_text.find('recv-q')
|
||||
|
||||
header_text = header_text.replace('netidstate', 'netid state')
|
||||
header_text = header_text.replace('local address:port', 'local_address local_port')
|
||||
header_text = header_text.replace('peer address:port', 'peer_address peer_port')
|
||||
header_text = header_text.replace('portprocess', 'port') # don't support process info today
|
||||
header_text = header_text.replace('-', '_')
|
||||
|
||||
header_list = header_text.split()
|
||||
@ -420,14 +441,16 @@ def parse(data, raw=False, quiet=False):
|
||||
for entry in cleandata[1:]:
|
||||
output_line = {}
|
||||
if entry[0] not in string.whitespace:
|
||||
# fix issue where recv-q can be too close to state
|
||||
entry = entry[:recv_q_position] + ' ' + entry[recv_q_position:]
|
||||
|
||||
# fix weird ss bug where first two columns have no space between them sometimes
|
||||
entry = entry[:5] + ' ' + entry[5:]
|
||||
|
||||
entry_list = re.split(r'[ ]{1,}',entry.strip())
|
||||
entry_list = re.split(ONE_OR_MORE_SPACE_PATTERN, entry.strip())
|
||||
|
||||
if len(entry_list) > len(header_list) or extra_opts == True:
|
||||
entry_list = re.split(r'[ ]{2,}',entry.strip())
|
||||
entry_list = re.split(TWO_OR_MORE_SPACES_PATTERN, entry.strip())
|
||||
extra_opts = True
|
||||
|
||||
if entry_list[0] in contains_colon and ':' in entry_list[4]:
|
||||
@ -444,8 +467,9 @@ def parse(data, raw=False, quiet=False):
|
||||
entry_list[6] = p_address
|
||||
entry_list.insert(7, p_port)
|
||||
|
||||
if re.search(r'ino:|uid:|sk:|users:|timer:',entry_list[-1]):
|
||||
header_list.append('opts')
|
||||
if re.search(r'ino:|uid:|sk:|users:|timer:|cgroup:|v6only:', entry_list[-1]):
|
||||
if header_list[-1] != 'opts':
|
||||
header_list.append('opts')
|
||||
entry_list[-1] = _parse_opts(entry_list[-1])
|
||||
|
||||
output_line = dict(zip(header_list, entry_list))
|
||||
@ -476,7 +500,4 @@ def parse(data, raw=False, quiet=False):
|
||||
|
||||
raw_output.append(output_line)
|
||||
|
||||
if raw:
|
||||
return raw_output
|
||||
else:
|
||||
return _process(raw_output)
|
||||
return raw_output if raw else _process(raw_output)
|
||||
|
@ -316,7 +316,7 @@ from jc.parsers.universal import sparse_table_parse as parse_table
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.1'
|
||||
version = '1.2'
|
||||
description = '`top -b` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -565,7 +565,7 @@ def parse(
|
||||
item_obj = {}
|
||||
|
||||
uptime_str = line[6:]
|
||||
item_obj.update(parse_uptime(uptime_str, raw=True))
|
||||
item_obj.update(parse_uptime(uptime_str, raw=True, quiet=True))
|
||||
continue
|
||||
|
||||
if line.startswith('Tasks:'):
|
||||
|
@ -153,7 +153,7 @@ from jc.parsers.universal import sparse_table_parse as parse_table
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.1'
|
||||
version = '1.2'
|
||||
description = '`top -b` command streaming parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -409,7 +409,7 @@ def parse(
|
||||
idx += 1
|
||||
|
||||
uptime_str = line[6:]
|
||||
output_line.update(parse_uptime(uptime_str, raw=True))
|
||||
output_line.update(parse_uptime(uptime_str, raw=True, quiet=True))
|
||||
continue
|
||||
|
||||
if line.startswith('Tasks:'):
|
||||
|
@ -118,11 +118,12 @@ Examples:
|
||||
import re
|
||||
from decimal import Decimal
|
||||
import jc.utils
|
||||
from copy import deepcopy
|
||||
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.6'
|
||||
version = '1.7'
|
||||
description = '`traceroute` and `traceroute6` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -238,6 +239,58 @@ class _Probe(object):
|
||||
return text
|
||||
|
||||
|
||||
def _get_probes(hop_string: str):
|
||||
probes = []
|
||||
probe_asn_match = [ (match, "ASN") for match in RE_PROBE_ASN.finditer(hop_string)]
|
||||
probe_name_ip_match = [(match, "NAME_IP") for match in RE_PROBE_NAME_IP.finditer(hop_string)]
|
||||
probe_ip_only_match = [(match, "IP_ONLY") for match in RE_PROBE_IP_ONLY.finditer(hop_string)]
|
||||
probe_bsd_ipv6_match = [(match, "IP_IPV6") for match in RE_PROBE_BSD_IPV6.finditer(hop_string)]
|
||||
probe_ipv6_only_match = [(match, "IP_IPV6_ONLY") for match in RE_PROBE_IPV6_ONLY.finditer(hop_string)]
|
||||
probe_rtt_annotations = [(match, "RTT") for match in RE_PROBE_RTT_ANNOTATION.finditer(hop_string)]
|
||||
|
||||
matches = sorted(probe_asn_match + probe_name_ip_match + probe_ip_only_match + probe_bsd_ipv6_match + probe_ipv6_only_match + probe_rtt_annotations, key=lambda x: x[0].start(0))
|
||||
probe, is_last_match_rtt = _Probe(), False
|
||||
for match, match_type in matches:
|
||||
if match_type == "ASN":
|
||||
probe.asn = int(match.group(1))
|
||||
elif match_type == "NAME_IP":
|
||||
probe.name = match.group(1)
|
||||
probe.ip = match.group(2)
|
||||
elif match_type == "IP_ONLY":
|
||||
probe.ip = match.group(1)
|
||||
elif match_type == "IP_IPV6":
|
||||
probe.ip = match.group(0)
|
||||
elif match_type == "IP_IPV6_ONLY":
|
||||
probe.ip = match.group(1)
|
||||
elif match_type == "RTT":
|
||||
if match.groups()[0]:
|
||||
probe_rtt = Decimal(match.groups()[0])
|
||||
elif match.groups()[1]:
|
||||
probe_rtt = None
|
||||
else:
|
||||
message = f"Expected probe RTT or *. Got: '{match.group(0)}'"
|
||||
raise ParseError(message)
|
||||
|
||||
# If the last match is a RTT, then copy all probe values and replace RTT field
|
||||
if is_last_match_rtt:
|
||||
probe = deepcopy(last_probe) # type: ignore
|
||||
# Set RTT values
|
||||
probe.rtt = probe_rtt
|
||||
probe.annotation = match.groups()[2] or None
|
||||
# RTT is the last value shown for a hop
|
||||
if any([probe.ip, probe.asn, probe.annotation, probe.rtt, probe.name]):
|
||||
probes.append(probe)
|
||||
last_probe = probe
|
||||
probe = _Probe()
|
||||
|
||||
if match_type == "RTT":
|
||||
is_last_match_rtt = True
|
||||
else:
|
||||
is_last_match_rtt = False
|
||||
|
||||
return probes
|
||||
|
||||
|
||||
def _loads(data):
|
||||
lines = data.splitlines()
|
||||
|
||||
@ -270,56 +323,9 @@ def _loads(data):
|
||||
|
||||
hop_string = hop_match.group(2)
|
||||
|
||||
probe_asn_match = RE_PROBE_ASN.search(hop_string)
|
||||
if probe_asn_match:
|
||||
probe_asn = int(probe_asn_match.group(1))
|
||||
else:
|
||||
probe_asn = None
|
||||
|
||||
probe_name_ip_match = RE_PROBE_NAME_IP.search(hop_string)
|
||||
probe_ip_only_match = RE_PROBE_IP_ONLY.search(hop_string)
|
||||
probe_bsd_ipv6_match = RE_PROBE_BSD_IPV6.search(hop_string)
|
||||
probe_ipv6_only_match = RE_PROBE_IPV6_ONLY.search(hop_string)
|
||||
if probe_ip_only_match:
|
||||
probe_name = None
|
||||
probe_ip = probe_ip_only_match.group(1)
|
||||
elif probe_name_ip_match:
|
||||
probe_name = probe_name_ip_match.group(1)
|
||||
probe_ip = probe_name_ip_match.group(2)
|
||||
elif probe_bsd_ipv6_match:
|
||||
probe_name = None
|
||||
probe_ip = probe_bsd_ipv6_match.group(0)
|
||||
elif probe_ipv6_only_match:
|
||||
probe_name = None
|
||||
probe_ip = probe_ipv6_only_match.group(1)
|
||||
else:
|
||||
probe_name = None
|
||||
probe_ip = None
|
||||
|
||||
probe_rtt_annotations = RE_PROBE_RTT_ANNOTATION.findall(hop_string)
|
||||
|
||||
for probe_rtt_annotation in probe_rtt_annotations:
|
||||
if probe_rtt_annotation[0]:
|
||||
probe_rtt = Decimal(probe_rtt_annotation[0])
|
||||
elif probe_rtt_annotation[1]:
|
||||
probe_rtt = None
|
||||
else:
|
||||
message = f"Expected probe RTT or *. Got: '{probe_rtt_annotation[0]}'"
|
||||
raise ParseError(message)
|
||||
|
||||
probe_annotation = probe_rtt_annotation[2] or None
|
||||
|
||||
probe = _Probe(
|
||||
name=probe_name,
|
||||
ip=probe_ip,
|
||||
asn=probe_asn,
|
||||
rtt=probe_rtt,
|
||||
annotation=probe_annotation
|
||||
)
|
||||
|
||||
# only add probe if there is data
|
||||
if any([probe_name, probe_ip, probe_asn, probe_rtt, probe_annotation]):
|
||||
hop.add_probe(probe)
|
||||
probes = _get_probes(hop_string)
|
||||
for probe in probes:
|
||||
hop.add_probe(probe)
|
||||
|
||||
return traceroute
|
||||
|
||||
@ -330,6 +336,7 @@ class ParseError(Exception):
|
||||
|
||||
########################################################################################
|
||||
|
||||
|
||||
def _process(proc_data):
|
||||
"""
|
||||
Final processing to conform to the schema.
|
||||
@ -435,7 +442,4 @@ def parse(data, raw=False, quiet=False):
|
||||
'hops': hops_list
|
||||
}
|
||||
|
||||
if raw:
|
||||
return raw_output
|
||||
else:
|
||||
return _process(raw_output)
|
||||
return raw_output if raw else _process(raw_output)
|
||||
|
@ -29,11 +29,11 @@ Schema:
|
||||
"config": [
|
||||
{
|
||||
"name": string,
|
||||
"state": string,
|
||||
"read": integer,
|
||||
"write": integer,
|
||||
"checksum": integer,
|
||||
"errors": string,
|
||||
"state": string/null,
|
||||
"read": integer/null,
|
||||
"write": integer/null,
|
||||
"checksum": integer/null,
|
||||
"errors": string/null,
|
||||
}
|
||||
],
|
||||
"errors": string
|
||||
@ -138,7 +138,7 @@ from jc.parsers.kv import parse as kv_parse
|
||||
|
||||
class info():
|
||||
"""Provides parser metadata (version, author, etc.)"""
|
||||
version = '1.1'
|
||||
version = '1.2'
|
||||
description = '`zpool status` command parser'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@ -182,11 +182,11 @@ def _build_config_list(string: str) -> List[Dict]:
|
||||
|
||||
line_list = line.strip().split(maxsplit=5)
|
||||
config_obj: Dict = {}
|
||||
config_obj['name'] = line_list[0]
|
||||
config_obj['state'] = line_list[1]
|
||||
config_obj['read'] = line_list[2]
|
||||
config_obj['write'] = line_list[3]
|
||||
config_obj['checksum'] = line_list[4]
|
||||
config_obj['name'] = line_list[0] if len(line_list) > 0 else None
|
||||
config_obj['state'] = line_list[1] if len(line_list) > 1 else None
|
||||
config_obj['read'] = line_list[2] if len(line_list) > 2 else None
|
||||
config_obj['write'] = line_list[3] if len(line_list) > 3 else None
|
||||
config_obj['checksum'] = line_list[4] if len(line_list) > 4 else None
|
||||
if len(line_list) == 6:
|
||||
config_obj['errors'] = line_list[5]
|
||||
config_list.append(config_obj)
|
||||
|
4
man/jc.1
4
man/jc.1
@ -1,4 +1,4 @@
|
||||
.TH jc 1 2024-03-23 1.25.2 "JSON Convert"
|
||||
.TH jc 1 2024-06-09 1.25.3 "JSON Convert"
|
||||
.SH NAME
|
||||
\fBjc\fP \- JSON Convert JSONifies the output of many CLI tools, file-types,
|
||||
and strings
|
||||
@ -1289,7 +1289,7 @@ lines from the beginning through \fBSTOP\fP lines from the end
|
||||
\fB:\fP
|
||||
all lines
|
||||
|
||||
.SH SlURP
|
||||
.SH SLURP
|
||||
Some parsers support multi-item input and can output an array of results in a
|
||||
single pass. Slurping works for string parsers that accept a single line of
|
||||
input. (e.g. \fBurl\fP and \fBip-address\fP) To see a list of parsers that support
|
||||
|
2
setup.py
2
setup.py
@ -5,7 +5,7 @@ with open('README.md', 'r') as f:
|
||||
|
||||
setuptools.setup(
|
||||
name='jc',
|
||||
version='1.25.2',
|
||||
version='1.25.3',
|
||||
author='Kelly Brazil',
|
||||
author_email='kellyjonbrazil@gmail.com',
|
||||
description='Converts the output of popular command-line tools and file-types to JSON.',
|
||||
|
@ -194,7 +194,7 @@ lines from the beginning through \fBSTOP\fP lines from the end
|
||||
\fB:\fP
|
||||
all lines
|
||||
|
||||
.SH SlURP
|
||||
.SH SLURP
|
||||
Some parsers support multi-item input and can output an array of results in a
|
||||
single pass. Slurping works for string parsers that accept a single line of
|
||||
input. (e.g. \fBurl\fP and \fBip-address\fP) To see a list of parsers that support
|
||||
|
17
tests/fixtures/generic/bluetoothctl_device_with_battery.out
vendored
Normal file
17
tests/fixtures/generic/bluetoothctl_device_with_battery.out
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
Device 67:F6:B4:0E:5C:94 (public)
|
||||
Name: WH-1000XM3
|
||||
Alias: WH-1000XM3
|
||||
Class: 0x11240404 (2360324)
|
||||
Icon: audio-headset
|
||||
Paired: yes
|
||||
Bonded: yes
|
||||
Trusted: yes
|
||||
Blocked: no
|
||||
Connected: yes
|
||||
LegacyPairing: no
|
||||
UUID: Vendor specific (fd096fad-eed7-4504-943b-5fa1c0e761b2)
|
||||
UUID: Vendor specific (03c57488-f7b6-45a3-8a23-ed4a890075cd)
|
||||
UUID: Vendor specific (77a369ae-e453-4ff7-bc84-dc8f411eaa6a)
|
||||
UUID: Vendor specific (8c274bd0-e7bd-4ed0-a391-55465e38005c)
|
||||
Modalias: usb:v052Cp0DC3d1426
|
||||
Battery Percentage: 0x46 (70)
|
0
tests/fixtures/generic/csv-10k-sales-records.csv
vendored
Executable file → Normal file
0
tests/fixtures/generic/csv-10k-sales-records.csv
vendored
Executable file → Normal file
Can't render this file because it is too large.
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
[{"commit":"e05824a36ca62aa9f3a21854ec8b40a3e0f7a68d","author":"Benedikt Heine","author_email":"bebe@bebehei.de","date":"Mon Oct 28 12:42:22 2019 +0100","commit_by":"Benedikt Heine","commit_by_email":"bebe@bebehei.de","commit_by_date":"Sun Apr 12 17:27:16 2020 +0200","stats":{"files_changed":1,"insertions":13,"deletions":3,"files":["salt/modules/monit.py"]},"message":"Split monit status fields on monit version\n\nWith the commit [0] on monit, the field size changed. So splitting hard\nafter 35 chars, new versions of monit break when using monit.status.\n\n[0] https://bitbucket.org/tildeslash/monit/commits/\n471c4bbc388c1c536f07ce1dd26b811bd39a9467","epoch":1572291742,"epoch_utc":null},{"commit":"910a2ac4809bb05b886adfe75f4857eb53fdfbb1","merge":"6c3964ce30 f0a1e923e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:37 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:37 2020 -0700","message":"Merge pull request #53911 from terminalmage/squelch-log\n\nalternatives: Don't log error when running \"alternatives --display\" on nonexistant target","epoch":1586675377,"epoch_utc":null},{"commit":"6c3964ce30929e749c0965bc0d60527e9fe8dbb1","merge":"3026c25faf 2ac4da54e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:16 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:16 2020 -0700","message":"Merge pull request #54199 from driskell/patch-2\n\nFix broken sdb.get_or_set_hash for Hashicorp Vault","epoch":1586675356,"epoch_utc":null}]
|
||||
[{"commit":"e05824a36ca62aa9f3a21854ec8b40a3e0f7a68d","author":"Benedikt Heine","author_email":"bebe@bebehei.de","date":"Mon Oct 28 12:42:22 2019 +0100","commit_by":"Benedikt Heine","commit_by_email":"bebe@bebehei.de","commit_by_date":"Sun Apr 12 17:27:16 2020 +0200","stats":{"files_changed":1,"insertions":13,"deletions":3,"files":["salt/modules/monit.py"],"file_stats":[{"name":"salt/modules/monit.py","lines_changed":16}]},"message":"Split monit status fields on monit version\n\nWith the commit [0] on monit, the field size changed. So splitting hard\nafter 35 chars, new versions of monit break when using monit.status.\n\n[0] https://bitbucket.org/tildeslash/monit/commits/\n471c4bbc388c1c536f07ce1dd26b811bd39a9467","epoch":1572291742,"epoch_utc":null},{"commit":"910a2ac4809bb05b886adfe75f4857eb53fdfbb1","merge":"6c3964ce30 f0a1e923e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:37 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:37 2020 -0700","message":"Merge pull request #53911 from terminalmage/squelch-log\n\nalternatives: Don't log error when running \"alternatives --display\" on nonexistant target","epoch":1586675377,"epoch_utc":null},{"commit":"6c3964ce30929e749c0965bc0d60527e9fe8dbb1","merge":"3026c25faf 2ac4da54e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:16 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:16 2020 -0700","message":"Merge pull request #54199 from driskell/patch-2\n\nFix broken sdb.get_or_set_hash for Hashicorp Vault","epoch":1586675356,"epoch_utc":null}]
|
||||
|
@ -1 +1 @@
|
||||
[{"commit":"e05824a36ca62aa9f3a21854ec8b40a3e0f7a68d","author":"Benedikt Heine","author_email":"bebe@bebehei.de","date":"Mon Oct 28 12:42:22 2019 +0100","commit_by":"Benedikt Heine","commit_by_email":"bebe@bebehei.de","commit_by_date":"Sun Apr 12 17:27:16 2020 +0200","stats":{"files_changed":1,"insertions":13,"deletions":3,"files":["salt/modules/monit.py"]},"message":"Split monit status fields on monit version\n\nWith the commit [0] on monit, the field size changed. So splitting hard\nafter 35 chars, new versions of monit break when using monit.status.\n\n[0] https://bitbucket.org/tildeslash/monit/commits/\n471c4bbc388c1c536f07ce1dd26b811bd39a9467","epoch":1572291742,"epoch_utc":null},{"commit":"910a2ac4809bb05b886adfe75f4857eb53fdfbb1","merge":"6c3964ce30 f0a1e923e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:37 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:37 2020 -0700","message":"Merge pull request #53911 from terminalmage/squelch-log\n\nalternatives: Don't log error when running \"alternatives --display\" on nonexistant target","epoch":1586675377,"epoch_utc":null},{"commit":"6c3964ce30929e749c0965bc0d60527e9fe8dbb1","merge":"3026c25faf 2ac4da54e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:16 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:16 2020 -0700","message":"Merge pull request #54199 from driskell/patch-2\n\nFix broken sdb.get_or_set_hash for Hashicorp Vault","epoch":1586675356,"epoch_utc":null}]
|
||||
[{"commit":"e05824a36ca62aa9f3a21854ec8b40a3e0f7a68d","author":"Benedikt Heine","author_email":"bebe@bebehei.de","date":"Mon Oct 28 12:42:22 2019 +0100","commit_by":"Benedikt Heine","commit_by_email":"bebe@bebehei.de","commit_by_date":"Sun Apr 12 17:27:16 2020 +0200","stats":{"files_changed":1,"insertions":13,"deletions":3,"files":["salt/modules/monit.py"],"file_stats":[{"name":"salt/modules/monit.py","lines_changed":16}]},"message":"Split monit status fields on monit version\n\nWith the commit [0] on monit, the field size changed. So splitting hard\nafter 35 chars, new versions of monit break when using monit.status.\n\n[0] https://bitbucket.org/tildeslash/monit/commits/\n471c4bbc388c1c536f07ce1dd26b811bd39a9467","epoch":1572291742,"epoch_utc":null},{"commit":"910a2ac4809bb05b886adfe75f4857eb53fdfbb1","merge":"6c3964ce30 f0a1e923e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:37 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:37 2020 -0700","message":"Merge pull request #53911 from terminalmage/squelch-log\n\nalternatives: Don't log error when running \"alternatives --display\" on nonexistant target","epoch":1586675377,"epoch_utc":null},{"commit":"6c3964ce30929e749c0965bc0d60527e9fe8dbb1","merge":"3026c25faf 2ac4da54e3","author":"Daniel Wozniak","author_email":"dwozniak@saltstack.com","date":"Sun Apr 12 00:09:16 2020 -0700","commit_by":"GitHub","commit_by_email":"noreply@github.com","commit_by_date":"Sun Apr 12 00:09:16 2020 -0700","message":"Merge pull request #54199 from driskell/patch-2\n\nFix broken sdb.get_or_set_hash for Hashicorp Vault","epoch":1586675356,"epoch_utc":null}]
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
tests/fixtures/generic/pci.ids.json
vendored
2
tests/fixtures/generic/pci.ids.json
vendored
File diff suppressed because one or more lines are too long
1
tests/fixtures/generic/pip-show-multiline-license-first-blank.json
vendored
Normal file
1
tests/fixtures/generic/pip-show-multiline-license-first-blank.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
[{"name":"setuptools","version":"39.2.0","summary":"Easily download, build, install, upgrade, and uninstall Python packages","home_page":"https://github.com/pypa/setuptools","author":"Python Packaging Authority","author_email":"distutils-sig@python.org","license":"UNKNOWN","location":"/usr/lib/python3.6/site-packages","requires":null,"required_by":"twine"},{"name":"pkginfo","version":"1.5.0.1","summary":"Query metadatdata from sdists / bdists / installed packages.","home_page":"https://code.launchpad.net/~tseaver/pkginfo/trunk","author":"Tres Seaver, Agendaless Consulting","author_email":"tseaver@agendaless.com","license":"MIT","location":"/home/kbrazil/.local/lib/python3.6/site-packages","requires":null,"required_by":"twine"},{"name":"cppy","version":"1.2.1","summary":"UNKNOWN","home_page":"https://github.com/nucleic/cppy","author":"None","author_email":"The Nucleic Development Team <sccolbert@gmail.com>","license":"\nCopyright (c) 2014, Nucleic\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n* Neither the name of the copyright holder nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.","location":"/usr/home/bryder/.local/lib/python3.7/site-packages","requires":null,"required_by":null},{"name":"six","version":"1.12.0","summary":"Python 2 and 3 compatibility utilities","home_page":"https://github.com/benjaminp/six","author":"Benjamin Peterson","author_email":"benjamin@python.org","license":"MIT","location":"/home/kbrazil/.local/lib/python3.6/site-packages","requires":null,"required_by":"readme-renderer, bleach"},{"name":"cppy","version":"1.2.1","summary":"UNKNOWN","home_page":"https://github.com/nucleic/cppy","author":"None","author_email":"The Nucleic Development Team <sccolbert@gmail.com>","license":"\n\nCopyright (c) 2014, Nucleic\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n* Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n* Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n* Neither the name of the copyright holder nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.","location":"/usr/home/bryder/.local/lib/python3.7/site-packages","requires":null,"required_by":null}]
|
99
tests/fixtures/generic/pip-show-multiline-license-first-blank.out
vendored
Normal file
99
tests/fixtures/generic/pip-show-multiline-license-first-blank.out
vendored
Normal file
@ -0,0 +1,99 @@
|
||||
Name: setuptools
|
||||
Version: 39.2.0
|
||||
Summary: Easily download, build, install, upgrade, and uninstall Python packages
|
||||
Home-page: https://github.com/pypa/setuptools
|
||||
Author: Python Packaging Authority
|
||||
Author-email: distutils-sig@python.org
|
||||
License: UNKNOWN
|
||||
Location: /usr/lib/python3.6/site-packages
|
||||
Requires:
|
||||
Required-by: twine
|
||||
---
|
||||
Name: pkginfo
|
||||
Version: 1.5.0.1
|
||||
Summary: Query metadatdata from sdists / bdists / installed packages.
|
||||
Home-page: https://code.launchpad.net/~tseaver/pkginfo/trunk
|
||||
Author: Tres Seaver, Agendaless Consulting
|
||||
Author-email: tseaver@agendaless.com
|
||||
License: MIT
|
||||
Location: /home/kbrazil/.local/lib/python3.6/site-packages
|
||||
Requires:
|
||||
Required-by: twine
|
||||
---
|
||||
Name: cppy
|
||||
Version: 1.2.1
|
||||
Summary: UNKNOWN
|
||||
Home-page: https://github.com/nucleic/cppy
|
||||
Author: None
|
||||
Author-email: The Nucleic Development Team <sccolbert@gmail.com>
|
||||
License:
|
||||
Copyright (c) 2014, Nucleic
|
||||
All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
Location: /usr/home/bryder/.local/lib/python3.7/site-packages
|
||||
Requires:
|
||||
Required-by:
|
||||
---
|
||||
Name: six
|
||||
Version: 1.12.0
|
||||
Summary: Python 2 and 3 compatibility utilities
|
||||
Home-page: https://github.com/benjaminp/six
|
||||
Author: Benjamin Peterson
|
||||
Author-email: benjamin@python.org
|
||||
License: MIT
|
||||
Location: /home/kbrazil/.local/lib/python3.6/site-packages
|
||||
Requires:
|
||||
Required-by: readme-renderer, bleach
|
||||
---
|
||||
Name: cppy
|
||||
Version: 1.2.1
|
||||
Summary: UNKNOWN
|
||||
Home-page: https://github.com/nucleic/cppy
|
||||
Author: None
|
||||
Author-email: The Nucleic Development Team <sccolbert@gmail.com>
|
||||
License:
|
||||
|
||||
Copyright (c) 2014, Nucleic
|
||||
All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
Location: /usr/home/bryder/.local/lib/python3.7/site-packages
|
||||
Requires:
|
||||
Required-by:
|
1
tests/fixtures/generic/ss-wide.json
vendored
Normal file
1
tests/fixtures/generic/ss-wide.json
vendored
Normal file
File diff suppressed because one or more lines are too long
156
tests/fixtures/generic/ss-wide.out
vendored
Normal file
156
tests/fixtures/generic/ss-wide.out
vendored
Normal file
@ -0,0 +1,156 @@
|
||||
Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
|
||||
udp UNCONN 0 0 0.0.0.0:50305 0.0.0.0:* users:(("host",pid=118409,fd=20)) ino:64236321 sk:1 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:33986 0.0.0.0:* users:(("host",pid=2494612,fd=20)) ino:530312145 sk:2 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:42285 0.0.0.0:* users:(("host",pid=605248,fd=20)) ino:3006390304 sk:3 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:58746 0.0.0.0:* users:(("host",pid=4145985,fd=20)) ino:239998396 sk:4 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:50571 0.0.0.0:* users:(("host",pid=3794874,fd=20)) ino:236002496 sk:5 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34215 0.0.0.0:* users:(("host",pid=2066159,fd=20)) ino:1316882830 sk:6 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:50674 0.0.0.0:* users:(("host",pid=1922066,fd=20)) ino:300561837 sk:7 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:58883 0.0.0.0:* users:(("host",pid=2692563,fd=20)) ino:3440442357 sk:8 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:42595 0.0.0.0:* users:(("host",pid=1737773,fd=20)) ino:4070974075 sk:9 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34539 0.0.0.0:* users:(("host",pid=2336034,fd=20)) ino:3718059054 sk:a cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:42762 0.0.0.0:* users:(("host",pid=3904855,fd=20)) ino:706825180 sk:b cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:42770 0.0.0.0:* users:(("host",pid=2159388,fd=20)) ino:174663533 sk:c cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34595 0.0.0.0:* users:(("host",pid=2848813,fd=20)) ino:4233915809 sk:d cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:50980 0.0.0.0:* users:(("host",pid=2623390,fd=20)) ino:3759488309 sk:e cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34666 0.0.0.0:* users:(("host",pid=1766185,fd=20)) ino:3102057868 sk:f cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34669 0.0.0.0:* users:(("host",pid=1511548,fd=20)) ino:3785299138 sk:10 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34794 0.0.0.0:* users:(("host",pid=2134963,fd=20)) ino:605881165 sk:11 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34818 0.0.0.0:* users:(("host",pid=4062835,fd=20)) ino:3612266680 sk:12 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:59417 0.0.0.0:* users:(("host",pid=1573122,fd=20)) ino:4069768053 sk:13 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:34858 0.0.0.0:* users:(("host",pid=2519013,fd=20)) ino:2904154910 sk:14 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:59492 0.0.0.0:* users:(("host",pid=3075781,fd=20)) ino:856110541 sk:15 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:51411 0.0.0.0:* users:(("host",pid=314912,fd=20)) ino:3575353377 sk:16 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:59660 0.0.0.0:* users:(("host",pid=3980336,fd=20)) ino:2080752571 sk:17 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:51644 0.0.0.0:* users:(("host",pid=1466747,fd=20)) ino:270478121 sk:18 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:35287 0.0.0.0:* users:(("host",pid=315084,fd=20)) ino:2956859736 sk:19 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:60090 0.0.0.0:* users:(("host",pid=3769450,fd=20)) ino:3494368171 sk:1a cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:60134 0.0.0.0:* users:(("host",pid=1018980,fd=20)) ino:374126658 sk:1b cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:43802 0.0.0.0:* users:(("host",pid=3751867,fd=20)) ino:833339220 sk:2001 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:52034 0.0.0.0:* users:(("host",pid=1414955,fd=20)) ino:2691411213 sk:1c cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:52066 0.0.0.0:* users:(("host",pid=200281,fd=20)) ino:3774879115 sk:1d cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:52282 0.0.0.0:* users:(("host",pid=782619,fd=20)) ino:1480667866 sk:1e cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:52305 0.0.0.0:* users:(("host",pid=3891731,fd=20)) ino:1089749588 sk:1f cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:35984 0.0.0.0:* users:(("host",pid=1338045,fd=20)) ino:2966375675 sk:20 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:60563 0.0.0.0:* users:(("host",pid=1795342,fd=20)) ino:3348792071 sk:21 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:52412 0.0.0.0:* users:(("host",pid=3985188,fd=20)) ino:4241560614 sk:22 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:44229 0.0.0.0:* users:(("host",pid=4024889,fd=20)) ino:2759051093 sk:23 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:60624 0.0.0.0:* users:(("host",pid=3033798,fd=20)) ino:1498269449 sk:24 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:36225 0.0.0.0:* users:(("host",pid=3544133,fd=20)) ino:3729258480 sk:25 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:44459 0.0.0.0:* users:(("host",pid=508612,fd=20)) ino:328973895 sk:26 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:36278 0.0.0.0:* users:(("host",pid=3359236,fd=20)) ino:3363346612 sk:27 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:52681 0.0.0.0:* users:(("host",pid=1951524,fd=20)) ino:301313380 sk:28 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:60995 0.0.0.0:* users:(("host",pid=518487,fd=20)) ino:3005769284 sk:29 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:44824 0.0.0.0:* users:(("host",pid=2834461,fd=20)) ino:2143750461 sk:2a cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:53152 0.0.0.0:* users:(("host",pid=3788082,fd=20)) ino:3690016274 sk:2b cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:45004 0.0.0.0:* users:(("host",pid=1324178,fd=20)) ino:723295938 sk:2c cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:45045 0.0.0.0:* users:(("host",pid=528560,fd=20)) ino:210863556 sk:2d cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:36947 0.0.0.0:* users:(("host",pid=963313,fd=20)) ino:641370855 sk:2e cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:45209 0.0.0.0:* users:(("host",pid=411118,fd=20)) ino:4100068160 sk:2f cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:37190 0.0.0.0:* users:(("host",pid=1847397,fd=20)) ino:844290171 sk:30 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:45480 0.0.0.0:* users:(("host",pid=3116689,fd=20)) ino:230371610 sk:31 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:45627 0.0.0.0:* users:(("host",pid=1244454,fd=20)) ino:4181079527 sk:32 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:45688 0.0.0.0:* users:(("host",pid=6493,fd=20)) ino:3530432806 sk:33 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:37711 0.0.0.0:* users:(("host",pid=2792271,fd=20)) ino:4233584446 sk:34 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:45921 0.0.0.0:* users:(("host",pid=1236905,fd=20)) ino:3225262276 sk:35 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:37842 0.0.0.0:* users:(("host",pid=3279869,fd=20)) ino:3564959922 sk:36 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:46046 0.0.0.0:* users:(("host",pid=4171646,fd=20)) ino:200815517 sk:37 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38022 0.0.0.0:* users:(("host",pid=2277136,fd=20)) ino:3392574786 sk:38 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:54479 0.0.0.0:* users:(("host",pid=1184410,fd=20)) ino:2646074219 sk:39 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38104 0.0.0.0:* users:(("host",pid=3612655,fd=20)) ino:318847596 sk:3a cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:5353 0.0.0.0:* users:(("avahi-daemon",pid=1917749,fd=12)) uid:128 ino:559134615 sk:3b cgroup:/system.slice/avahi-daemon.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38249 0.0.0.0:* users:(("host",pid=133073,fd=20)) ino:2202418867 sk:3c cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:54868 0.0.0.0:* users:(("host",pid=1989303,fd=20)) ino:95057172 sk:3d cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38528 0.0.0.0:* users:(("host",pid=2545022,fd=20)) ino:744271750 sk:2002 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38574 0.0.0.0:* users:(("host",pid=1261268,fd=20)) ino:1902765519 sk:3e cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:54971 0.0.0.0:* users:(("host",pid=2372912,fd=20)) ino:3436907330 sk:3f cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38642 0.0.0.0:* users:(("host",pid=1916757,fd=20)) ino:3057919346 sk:40 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38678 0.0.0.0:* users:(("host",pid=1745337,fd=20)) ino:2026285532 sk:41 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38772 0.0.0.0:* users:(("host",pid=3858661,fd=20)) ino:4279594092 sk:42 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38878 0.0.0.0:* users:(("host",pid=195166,fd=20)) ino:3855851961 sk:43 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:38965 0.0.0.0:* users:(("host",pid=3383528,fd=20)) ino:539303867 sk:44 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:39026 0.0.0.0:* users:(("host",pid=2543115,fd=20)) ino:604305528 sk:45 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:47227 0.0.0.0:* users:(("host",pid=3935114,fd=20)) ino:707051732 sk:46 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:55554 0.0.0.0:* users:(("host",pid=2429636,fd=20)) ino:654648238 sk:47 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:47447 0.0.0.0:* users:(("host",pid=3665881,fd=20)) ino:498545139 sk:48 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:39426 0.0.0.0:* users:(("host",pid=2466774,fd=20)) ino:3833359691 sk:49 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:39714 0.0.0.0:* users:(("host",pid=3512185,fd=20)) ino:1042737998 sk:4a cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:56172 0.0.0.0:* users:(("avahi-daemon",pid=1917749,fd=14)) uid:128 ino:559134617 sk:4b cgroup:/system.slice/avahi-daemon.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:56298 0.0.0.0:* users:(("host",pid=2131817,fd=20)) ino:3352140808 sk:4c cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:56301 0.0.0.0:* users:(("host",pid=587579,fd=20)) ino:2449248189 sk:4d cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:40035 0.0.0.0:* users:(("host",pid=2540608,fd=20)) ino:3316186427 sk:4e cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:56487 0.0.0.0:* users:(("host",pid=3801566,fd=20)) ino:4279302982 sk:4f cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:40113 0.0.0.0:* users:(("host",pid=3034491,fd=20)) ino:3241723998 sk:50 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:48310 0.0.0.0:* users:(("host",pid=311616,fd=20)) ino:3297830575 sk:51 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:56522 0.0.0.0:* users:(("host",pid=2936398,fd=20)) ino:2909631167 sk:52 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:40149 0.0.0.0:* users:(("host",pid=2552221,fd=20)) ino:2661760765 sk:53 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:56549 0.0.0.0:* users:(("host",pid=88532,fd=20)) ino:2834148184 sk:54 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:48381 0.0.0.0:* users:(("host",pid=339838,fd=20)) ino:3575580946 sk:55 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:40218 0.0.0.0:* users:(("host",pid=1551532,fd=20)) ino:3386097491 sk:56 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:48538 0.0.0.0:* users:(("host",pid=2987532,fd=20)) ino:3404383284 sk:57 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:40382 0.0.0.0:* users:(("host",pid=2172664,fd=20)) ino:3914778071 sk:58 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:48592 0.0.0.0:* users:(("host",pid=3716528,fd=20)) ino:623199981 sk:59 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:48754 0.0.0.0:* users:(("host",pid=1161893,fd=20)) ino:3506924089 sk:5a cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:48868 0.0.0.0:* users:(("host",pid=597645,fd=20)) ino:284382327 sk:5b cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:57091 0.0.0.0:* users:(("host",pid=2095454,fd=20)) ino:2218401194 sk:5c cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:48929 0.0.0.0:* users:(("host",pid=3406626,fd=20)) ino:1380260066 sk:5d cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:40749 0.0.0.0:* users:(("host",pid=3749341,fd=20)) ino:3326453315 sk:5e cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:49043 0.0.0.0:* users:(("host",pid=1082212,fd=20)) ino:1013546017 sk:5f cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:57239 0.0.0.0:* users:(("host",pid=3876683,fd=20)) ino:2585641121 sk:60 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:32833 0.0.0.0:* users:(("host",pid=3767947,fd=20)) ino:235775311 sk:61 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:57445 0.0.0.0:* users:(("host",pid=1476131,fd=20)) ino:40590608 sk:62 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:49255 0.0.0.0:* users:(("host",pid=1360055,fd=20)) ino:3589586435 sk:63 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=895,fd=5),("systemd",pid=1,fd=109)) ino:11333 sk:64 cgroup:/system.slice/rpcbind.socket <->
|
||||
udp UNCONN 0 0 1.2.1.43:123 0.0.0.0:* users:(("ntpd",pid=1367093,fd=22)) ino:165920495 sk:65 cgroup:/system.slice/ntp.service <->
|
||||
udp UNCONN 0 0 1.2.1.32:123 0.0.0.0:* users:(("ntpd",pid=1367093,fd=21)) ino:165920493 sk:66 cgroup:/system.slice/ntp.service <->
|
||||
udp UNCONN 0 0 1.2.1.214:123 0.0.0.0:* users:(("ntpd",pid=1367093,fd=20)) ino:165920491 sk:67 cgroup:/system.slice/ntp.service <->
|
||||
udp UNCONN 0 0 1.2.1.31:123 0.0.0.0:* users:(("ntpd",pid=1367093,fd=19)) ino:165920489 sk:68 cgroup:/system.slice/ntp.service <->
|
||||
udp UNCONN 0 0 127.0.0.1:123 0.0.0.0:* users:(("ntpd",pid=1367093,fd=18)) ino:165920487 sk:69 cgroup:/system.slice/ntp.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:* users:(("ntpd",pid=1367093,fd=17)) ino:165920483 sk:6a cgroup:/system.slice/ntp.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:49276 0.0.0.0:* users:(("host",pid=3899120,fd=20)) ino:3412851638 sk:6b cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:57547 0.0.0.0:* users:(("host",pid=2916229,fd=20)) ino:3197931422 sk:6c cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:57595 0.0.0.0:* users:(("host",pid=3673119,fd=20)) ino:2397984205 sk:6d cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:49483 0.0.0.0:* users:(("host",pid=1237229,fd=20)) ino:3663213837 sk:6e cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:41308 0.0.0.0:* users:(("host",pid=3905107,fd=20)) ino:837588225 sk:2003 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:57852 0.0.0.0:* users:(("host",pid=1490996,fd=20)) ino:2812490413 sk:6f cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:33287 0.0.0.0:* users:(("host",pid=126718,fd=20)) ino:3216167932 sk:70 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:33354 0.0.0.0:* users:(("host",pid=2804234,fd=20)) ino:607162198 sk:71 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:33434 0.0.0.0:* users:(("host",pid=2279549,fd=20)) ino:4040805422 sk:72 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:33462 0.0.0.0:* users:(("host",pid=3948494,fd=20)) ino:3452508959 sk:73 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:58253 0.0.0.0:* users:(("host",pid=1876644,fd=20)) ino:3147600627 sk:74 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 0.0.0.0:42040 0.0.0.0:* users:(("host",pid=1020468,fd=20)) ino:2370521524 sk:75 cgroup:/system.slice/xinetd.service <->
|
||||
udp UNCONN 0 0 [::]:36544 [::]:* users:(("avahi-daemon",pid=1917749,fd=15)) uid:128 ino:559134618 sk:76 cgroup:/system.slice/avahi-daemon.service v6only:1 <->
|
||||
udp UNCONN 0 0 [::]:5353 [::]:* users:(("avahi-daemon",pid=1917749,fd=13)) uid:128 ino:559134616 sk:77 cgroup:/system.slice/avahi-daemon.service v6only:1 <->
|
||||
udp UNCONN 0 0 [::]:111 [::]:* users:(("rpcbind",pid=895,fd=7),("systemd",pid=1,fd=114)) ino:13164 sk:78 cgroup:/system.slice/rpcbind.socket v6only:1 <->
|
||||
udp UNCONN 0 0 [fe80::9cc5:aeff:fec5:34ae]%eth0:123 [::]:* users:(("ntpd",pid=1367093,fd=24)) ino:165920499 sk:79 cgroup:/system.slice/ntp.service v6only:1 <->
|
||||
udp UNCONN 0 0 [::1]:123 [::]:* users:(("ntpd",pid=1367093,fd=23)) ino:165920497 sk:7a cgroup:/system.slice/ntp.service v6only:1 <->
|
||||
udp UNCONN 0 0 [::]:123 [::]:* users:(("ntpd",pid=1367093,fd=16)) ino:165920480 sk:7b cgroup:/system.slice/ntp.service v6only:1 <->
|
||||
tcp LISTEN 0 4096 127.0.0.1:2500 0.0.0.0:* users:(("stunnel4",pid=1552,fd=9)) ino:30742 sk:7d cgroup:/system.slice/stunnel4.service <->
|
||||
tcp LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mariadbd",pid=1978620,fd=15)) uid:105 ino:815317211 sk:2004 cgroup:/system.slice/mariadb.service <->
|
||||
tcp LISTEN 0 100 0.0.0.0:587 0.0.0.0:* users:(("master",pid=1978854,fd=86),("smtpd",pid=320188,fd=6),("smtpd",pid=319502,fd=6),("smtpd",pid=319370,fd=6)) ino:815320090 sk:2005 cgroup:/system.slice/system-postfix.slice/postfix@-.service <->
|
||||
tcp LISTEN 0 200 0.0.0.0:110 0.0.0.0:* users:(("dovecot",pid=1978860,fd=24)) ino:815319805 sk:2006 cgroup:/system.slice/dovecot.service <->
|
||||
tcp LISTEN 0 200 0.0.0.0:143 0.0.0.0:* users:(("dovecot",pid=1978860,fd=41)) ino:815319836 sk:2007 cgroup:/system.slice/dovecot.service <->
|
||||
tcp LISTEN 0 4096 0.0.0.0:111 0.0.0.0:* users:(("rpcbind",pid=895,fd=4),("systemd",pid=1,fd=108)) ino:11332 sk:82 cgroup:/system.slice/rpcbind.socket <->
|
||||
tcp LISTEN 0 511 1.2.1.43:80 0.0.0.0:* users:(("apache2",pid=4144914,fd=8),("apache2",pid=4144905,fd=8),("apache2",pid=323307,fd=8),("apache2",pid=323306,fd=8),("apache2",pid=323298,fd=8),("apache2",pid=323191,fd=8),("apache2",pid=323190,fd=8),("apache2",pid=323188,fd=8),("apache2",pid=323187,fd=8),("apache2",pid=323186,fd=8),("apache2",pid=323185,fd=8),("apache2",pid=323184,fd=8),("apache2",pid=323176,fd=8),("apache2",pid=323175,fd=8),("apache2",pid=323174,fd=8),("apache2",pid=323172,fd=8),("apache2",pid=323171,fd=8),("apache2",pid=323019,fd=8),("apache2",pid=322663,fd=8),("apache2",pid=322641,fd=8),("apache2",pid=322586,fd=8),("apache2",pid=322520,fd=8),("apache2",pid=322405,fd=8),("apache2",pid=319633,fd=8)) ino:843780889 sk:2008 cgroup:/system.slice/apache2.service <->
|
||||
tcp LISTEN 0 511 1.2.1.32:80 0.0.0.0:* users:(("apache2",pid=4144914,fd=7),("apache2",pid=4144905,fd=7),("apache2",pid=323307,fd=7),("apache2",pid=323306,fd=7),("apache2",pid=323298,fd=7),("apache2",pid=323191,fd=7),("apache2",pid=323190,fd=7),("apache2",pid=323188,fd=7),("apache2",pid=323187,fd=7),("apache2",pid=323186,fd=7),("apache2",pid=323185,fd=7),("apache2",pid=323184,fd=7),("apache2",pid=323176,fd=7),("apache2",pid=323175,fd=7),("apache2",pid=323174,fd=7),("apache2",pid=323172,fd=7),("apache2",pid=323171,fd=7),("apache2",pid=323019,fd=7),("apache2",pid=322663,fd=7),("apache2",pid=322641,fd=7),("apache2",pid=322586,fd=7),("apache2",pid=322520,fd=7),("apache2",pid=322405,fd=7),("apache2",pid=319633,fd=7)) ino:843780887 sk:2009 cgroup:/system.slice/apache2.service <->
|
||||
tcp LISTEN 0 511 1.2.1.31:80 0.0.0.0:* users:(("apache2",pid=4144914,fd=6),("apache2",pid=4144905,fd=6),("apache2",pid=323307,fd=6),("apache2",pid=323306,fd=6),("apache2",pid=323298,fd=6),("apache2",pid=323191,fd=6),("apache2",pid=323190,fd=6),("apache2",pid=323188,fd=6),("apache2",pid=323187,fd=6),("apache2",pid=323186,fd=6),("apache2",pid=323185,fd=6),("apache2",pid=323184,fd=6),("apache2",pid=323176,fd=6),("apache2",pid=323175,fd=6),("apache2",pid=323174,fd=6),("apache2",pid=323172,fd=6),("apache2",pid=323171,fd=6),("apache2",pid=323019,fd=6),("apache2",pid=322663,fd=6),("apache2",pid=322641,fd=6),("apache2",pid=322586,fd=6),("apache2",pid=322520,fd=6),("apache2",pid=322405,fd=6),("apache2",pid=319633,fd=6)) ino:843780885 sk:200a cgroup:/system.slice/apache2.service <->
|
||||
tcp LISTEN 0 100 0.0.0.0:465 0.0.0.0:* users:(("master",pid=1978854,fd=13),("smtpd",pid=319940,fd=6),("smtpd",pid=319886,fd=6),("smtpd",pid=316712,fd=6),("smtpd",pid=308336,fd=6)) ino:815316946 sk:200b cgroup:/system.slice/system-postfix.slice/postfix@-.service <->
|
||||
tcp LISTEN 0 10 127.0.0.1:10001 0.0.0.0:* users:(("postsrsd",pid=906,fd=4)) ino:25753 sk:87 cgroup:/system.slice/postsrsd.service <->
|
||||
tcp LISTEN 0 10 127.0.0.1:10002 0.0.0.0:* users:(("postsrsd",pid=906,fd=5)) ino:25754 sk:88 cgroup:/system.slice/postsrsd.service <->
|
||||
tcp LISTEN 0 32 0.0.0.0:21 0.0.0.0:* users:(("vsftpd",pid=3849359,fd=3)) ino:706488219 sk:89 cgroup:/system.slice/vsftpd.service <->
|
||||
tcp LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=1978854,fd=83),("smtpd",pid=319313,fd=6),("smtpd",pid=319311,fd=6),("smtpd",pid=319203,fd=6),("smtpd",pid=315137,fd=6),("smtpd",pid=315095,fd=6),("smtpd",pid=314370,fd=6),("smtpd",pid=313338,fd=6),("smtpd",pid=308754,fd=6),("smtpd",pid=308752,fd=6),("smtpd",pid=308698,fd=6),("smtpd",pid=308695,fd=6),("smtpd",pid=308565,fd=6),("smtpd",pid=308394,fd=6),("smtpd",pid=308391,fd=6),("smtpd",pid=308358,fd=6),("smtpd",pid=308357,fd=6)) ino:815320087 sk:200c cgroup:/system.slice/system-postfix.slice/postfix@-.service <->
|
||||
tcp LISTEN 0 511 1.2.1.43:443 0.0.0.0:* users:(("apache2",pid=4144914,fd=5),("apache2",pid=4144905,fd=5),("apache2",pid=323307,fd=5),("apache2",pid=323306,fd=5),("apache2",pid=323298,fd=5),("apache2",pid=323191,fd=5),("apache2",pid=323190,fd=5),("apache2",pid=323188,fd=5),("apache2",pid=323187,fd=5),("apache2",pid=323186,fd=5),("apache2",pid=323185,fd=5),("apache2",pid=323184,fd=5),("apache2",pid=323176,fd=5),("apache2",pid=323175,fd=5),("apache2",pid=323174,fd=5),("apache2",pid=323172,fd=5),("apache2",pid=323171,fd=5),("apache2",pid=323019,fd=5),("apache2",pid=322663,fd=5),("apache2",pid=322641,fd=5),("apache2",pid=322586,fd=5),("apache2",pid=322520,fd=5),("apache2",pid=322405,fd=5),("apache2",pid=319633,fd=5)) ino:843780883 sk:200d cgroup:/system.slice/apache2.service <->
|
||||
tcp LISTEN 0 511 1.2.1.32:443 0.0.0.0:* users:(("apache2",pid=4144914,fd=4),("apache2",pid=4144905,fd=4),("apache2",pid=323307,fd=4),("apache2",pid=323306,fd=4),("apache2",pid=323298,fd=4),("apache2",pid=323191,fd=4),("apache2",pid=323190,fd=4),("apache2",pid=323188,fd=4),("apache2",pid=323187,fd=4),("apache2",pid=323186,fd=4),("apache2",pid=323185,fd=4),("apache2",pid=323184,fd=4),("apache2",pid=323176,fd=4),("apache2",pid=323175,fd=4),("apache2",pid=323174,fd=4),("apache2",pid=323172,fd=4),("apache2",pid=323171,fd=4),("apache2",pid=323019,fd=4),("apache2",pid=322663,fd=4),("apache2",pid=322641,fd=4),("apache2",pid=322586,fd=4),("apache2",pid=322520,fd=4),("apache2",pid=322405,fd=4),("apache2",pid=319633,fd=4)) ino:843780881 sk:200e cgroup:/system.slice/apache2.service <->
|
||||
tcp LISTEN 0 511 1.2.1.31:443 0.0.0.0:* users:(("apache2",pid=4144914,fd=3),("apache2",pid=4144905,fd=3),("apache2",pid=323307,fd=3),("apache2",pid=323306,fd=3),("apache2",pid=323298,fd=3),("apache2",pid=323191,fd=3),("apache2",pid=323190,fd=3),("apache2",pid=323188,fd=3),("apache2",pid=323187,fd=3),("apache2",pid=323186,fd=3),("apache2",pid=323185,fd=3),("apache2",pid=323184,fd=3),("apache2",pid=323176,fd=3),("apache2",pid=323175,fd=3),("apache2",pid=323174,fd=3),("apache2",pid=323172,fd=3),("apache2",pid=323171,fd=3),("apache2",pid=323019,fd=3),("apache2",pid=322663,fd=3),("apache2",pid=322641,fd=3),("apache2",pid=322586,fd=3),("apache2",pid=322520,fd=3),("apache2",pid=322405,fd=3),("apache2",pid=319633,fd=3)) ino:843780879 sk:200f cgroup:/system.slice/apache2.service <->
|
||||
tcp LISTEN 0 16 0.0.0.0:8443 0.0.0.0:* users:(("liveconfig/SRVR",pid=3279783,fd=10),("liveconfig",pid=3279782,fd=10)) ino:788096033 sk:2010 cgroup:/system.slice/liveconfig.service <->
|
||||
tcp LISTEN 0 200 0.0.0.0:4190 0.0.0.0:* users:(("dovecot",pid=1978860,fd=15)) ino:815319789 sk:2011 cgroup:/system.slice/dovecot.service <->
|
||||
tcp LISTEN 0 200 0.0.0.0:993 0.0.0.0:* users:(("dovecot",pid=1978860,fd=43)) ino:815319838 sk:2012 cgroup:/system.slice/dovecot.service <->
|
||||
tcp LISTEN 0 200 0.0.0.0:995 0.0.0.0:* users:(("dovecot",pid=1978860,fd=26)) ino:815319807 sk:2013 cgroup:/system.slice/dovecot.service <->
|
||||
tcp LISTEN 0 200 [::]:110 [::]:* users:(("dovecot",pid=1978860,fd=25)) ino:815319806 sk:2014 cgroup:/system.slice/dovecot.service v6only:1 <->
|
||||
tcp LISTEN 0 200 [::]:143 [::]:* users:(("dovecot",pid=1978860,fd=42)) ino:815319837 sk:2015 cgroup:/system.slice/dovecot.service v6only:1 <->
|
||||
tcp LISTEN 0 4096 [::]:111 [::]:* users:(("rpcbind",pid=895,fd=6),("systemd",pid=1,fd=113)) ino:11336 sk:95 cgroup:/system.slice/rpcbind.socket v6only:1 <->
|
||||
tcp LISTEN 0 16 [::]:8443 [::]:* users:(("liveconfig/SRVR",pid=3279783,fd=11),("liveconfig",pid=3279782,fd=11)) ino:788096034 sk:2016 cgroup:/system.slice/liveconfig.service v6only:1 <->
|
||||
tcp LISTEN 0 64 *:6556 *:* users:(("xinetd",pid=1330292,fd=5)) ino:165827148 sk:97 cgroup:/system.slice/xinetd.service v6only:0 <->
|
||||
tcp LISTEN 0 200 [::]:4190 [::]:* users:(("dovecot",pid=1978860,fd=16)) ino:815319790 sk:2017 cgroup:/system.slice/dovecot.service v6only:1 <->
|
||||
tcp LISTEN 0 200 [::]:993 [::]:* users:(("dovecot",pid=1978860,fd=44)) ino:815319839 sk:2018 cgroup:/system.slice/dovecot.service v6only:1 <->
|
||||
tcp LISTEN 0 200 [::]:995 [::]:* users:(("dovecot",pid=1978860,fd=27)) ino:815319808 sk:2019 cgroup:/system.slice/dovecot.service v6only:1 <->
|
@ -1 +1 @@
|
||||
{"destination_ip":"199.58.80.40","destination_name":"www.koumbit.org","hops":[{"hop":1,"probes":[{"annotation":null,"asn":null,"ip":"192.168.2.1","name":null,"rtt":0.967},{"annotation":null,"asn":null,"ip":"192.168.2.1","name":null,"rtt":1.022},{"annotation":null,"asn":null,"ip":"192.168.2.1","name":null,"rtt":1.204}]},{"hop":2,"probes":[{"annotation":null,"asn":null,"ip":"24.212.242.17","name":null,"rtt":10.176},{"annotation":null,"asn":null,"ip":"24.212.242.17","name":null,"rtt":18.136},{"annotation":null,"asn":null,"ip":"24.212.242.17","name":null,"rtt":18.244}]},{"hop":3,"probes":[{"annotation":null,"asn":null,"ip":"10.170.192.58","name":null,"rtt":19.396},{"annotation":null,"asn":null,"ip":"10.170.192.58","name":null,"rtt":19.575},{"annotation":null,"asn":null,"ip":"10.170.192.58","name":null,"rtt":19.572}]},{"hop":4,"probes":[{"annotation":null,"asn":null,"ip":"192.171.61.61","name":null,"rtt":23.072},{"annotation":null,"asn":null,"ip":"192.171.61.61","name":null,"rtt":17.073},{"annotation":null,"asn":null,"ip":"192.171.61.61","name":null,"rtt":23.308}]},{"hop":5,"probes":[{"annotation":null,"asn":null,"ip":"206.248.189.97","name":null,"rtt":20.521},{"annotation":null,"asn":null,"ip":"206.248.189.97","name":null,"rtt":22.837},{"annotation":null,"asn":null,"ip":"206.248.189.97","name":null,"rtt":23.194}]},{"hop":6,"probes":[{"annotation":null,"asn":null,"ip":"198.179.18.41","name":null,"rtt":18.334},{"annotation":null,"asn":null,"ip":"198.179.18.41","name":null,"rtt":17.894},{"annotation":null,"asn":null,"ip":"198.179.18.41","name":null,"rtt":17.792}]},{"hop":7,"probes":[{"annotation":null,"asn":null,"ip":"64.15.69.54","name":null,"rtt":17.056},{"annotation":null,"asn":null,"ip":"64.15.69.54","name":null,"rtt":14.033},{"annotation":null,"asn":null,"ip":"64.15.69.54","name":null,"rtt":12.351}]},{"hop":8,"probes":[{"annotation":null,"asn":null,"ip":"199.58.80.40","name":null,"rtt":18.203},{"annotation":null,"asn":null,"ip":"199.58.80.40","name":null,"rtt":18.789},{"annotation":null,"asn":null,"ip":"199.58.80.40","name":null,"rtt":18.906}]}]}
|
||||
{"destination_ip":"199.58.80.40","destination_name":"www.koumbit.org","hops":[{"hop":1,"probes":[{"annotation":null,"asn":null,"ip":"192.168.2.1","name":null,"rtt":0.967},{"annotation":null,"asn":null,"ip":"192.168.2.1","name":null,"rtt":1.022},{"annotation":null,"asn":null,"ip":"192.168.2.1","name":null,"rtt":1.204}]},{"hop":2,"probes":[{"annotation":null,"asn":null,"ip":"24.212.242.17","name":null,"rtt":10.176},{"annotation":null,"asn":null,"ip":"24.212.242.17","name":null,"rtt":18.136},{"annotation":null,"asn":null,"ip":"24.212.242.17","name":null,"rtt":18.244}]},{"hop":3,"probes":[{"annotation":null,"asn":null,"ip":"10.170.192.58","name":null,"rtt":19.396},{"annotation":null,"asn":null,"ip":"10.170.192.58","name":null,"rtt":19.575},{"annotation":null,"asn":null,"ip":"10.170.192.58","name":null,"rtt":19.572}]},{"hop":4,"probes":[{"annotation":null,"asn":null,"ip":"192.171.61.61","name":null,"rtt":23.072},{"annotation":null,"asn":null,"ip":"206.248.155.109","name":null,"rtt":17.073},{"annotation":null,"asn":null,"ip":"192.171.63.17","name":null,"rtt":23.308}]},{"hop":5,"probes":[{"annotation":null,"asn":null,"ip":"206.248.189.97","name":null,"rtt":20.521},{"annotation":null,"asn":null,"ip":"206.248.189.97","name":null,"rtt":22.837},{"annotation":null,"asn":null,"ip":"206.248.189.97","name":null,"rtt":23.194}]},{"hop":6,"probes":[{"annotation":null,"asn":null,"ip":"198.179.18.41","name":null,"rtt":18.334},{"annotation":null,"asn":null,"ip":"198.179.18.41","name":null,"rtt":17.894},{"annotation":null,"asn":null,"ip":"198.179.18.41","name":null,"rtt":17.792}]},{"hop":7,"probes":[{"annotation":null,"asn":null,"ip":"64.15.69.54","name":null,"rtt":17.056},{"annotation":null,"asn":null,"ip":"64.15.69.54","name":null,"rtt":14.033},{"annotation":null,"asn":null,"ip":"64.15.69.54","name":null,"rtt":12.351}]},{"hop":8,"probes":[{"annotation":null,"asn":null,"ip":"199.58.80.40","name":null,"rtt":18.203},{"annotation":null,"asn":null,"ip":"199.58.80.40","name":null,"rtt":18.789},{"annotation":null,"asn":null,"ip":"199.58.80.40","name":null,"rtt":18.906}]}]}
|
||||
|
@ -1 +1 @@
|
||||
{"destination_ip":"2607:f8b0:4020:806::2004","destination_name":"www.google.com","hops":[{"hop":1,"probes":[{"annotation":null,"asn":null,"ip":"2605:9000:402:6a01::1","name":null,"rtt":4.181},{"annotation":null,"asn":null,"ip":"2605:9000:402:6a01::1","name":null,"rtt":4.294},{"annotation":null,"asn":null,"ip":"2605:9000:402:6a01::1","name":null,"rtt":4.253}]},{"hop":2,"probes":[{"annotation":null,"asn":null,"ip":"2605:9000:0:400a::f1","name":null,"rtt":0.354},{"annotation":null,"asn":null,"ip":"2605:9000:0:400a::f1","name":null,"rtt":0.532},{"annotation":null,"asn":null,"ip":"2605:9000:0:400a::f1","name":null,"rtt":0.484}]},{"hop":3,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.284},{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":4.864},{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.415}]},{"hop":4,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.379},{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":12.709},{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.289}]},{"hop":5,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.02},{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.212},{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.163}]},{"hop":6,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.113},{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":8.399},{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.215}]},{"hop":7,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860:0:1127::2","name":null,"rtt":9.11},{"annotation":null,"asn":null,"ip":"2001:4860:0:1127::2","name":null,"rtt":8.476},{"annotation":null,"asn":null,"ip":"2001:4860:0:1127::2","name":null,"rtt":8.38}]},{"hop":8,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860::8:4000:cd80","name":null,"rtt":9.428},{"annotation":null,"asn":null,"ip":"2001:4860::8:4000:cd80","name":null,"rtt":9.36},{"annotation":null,"asn":null,"ip":"2001:4860::8:4000:cd80","name":null,"rtt":9.229}]},{"hop":9,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860::9:4001:d508","name":null,"rtt":9.376},{"annotation":null,"asn":null,"ip":"2001:4860::9:4001:d508","name":null,"rtt":9.105},{"annotation":null,"asn":null,"ip":"2001:4860::9:4001:d508","name":null,"rtt":9.384}]},{"hop":10,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860:0:11da::1","name":null,"rtt":8.489},{"annotation":null,"asn":null,"ip":"2001:4860:0:11da::1","name":null,"rtt":8.978},{"annotation":null,"asn":null,"ip":"2001:4860:0:11da::1","name":null,"rtt":9.64}]},{"hop":11,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860:0:1::c73","name":null,"rtt":9.596},{"annotation":null,"asn":null,"ip":"2001:4860:0:1::c73","name":null,"rtt":9.077},{"annotation":null,"asn":null,"ip":"2001:4860:0:1::c73","name":null,"rtt":9.724}]},{"hop":12,"probes":[{"annotation":null,"asn":null,"ip":"2607:f8b0:4020:806::2004","name":null,"rtt":8.086},{"annotation":null,"asn":null,"ip":"2607:f8b0:4020:806::2004","name":null,"rtt":8.091},{"annotation":null,"asn":null,"ip":"2607:f8b0:4020:806::2004","name":null,"rtt":8.436}]}]}
|
||||
{"destination_ip":"2607:f8b0:4020:806::2004","destination_name":"www.google.com","hops":[{"hop":1,"probes":[{"annotation":null,"asn":null,"ip":"2605:9000:402:6a01::1","name":null,"rtt":4.181},{"annotation":null,"asn":null,"ip":"2605:9000:402:6a01::1","name":null,"rtt":4.294},{"annotation":null,"asn":null,"ip":"2605:9000:402:6a01::1","name":null,"rtt":4.253}]},{"hop":2,"probes":[{"annotation":null,"asn":null,"ip":"2605:9000:0:400a::f1","name":null,"rtt":0.354},{"annotation":null,"asn":null,"ip":"2605:9000:0:400a::f1","name":null,"rtt":0.532},{"annotation":null,"asn":null,"ip":"2605:9000:0:400a::f1","name":null,"rtt":0.484}]},{"hop":3,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.284},{"annotation":null,"asn":null,"ip":"2605:9000:0:101::1","name":null,"rtt":4.864},{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.415}]},{"hop":4,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.379},{"annotation":null,"asn":null,"ip":"2001:5a0:300:200::202","name":null,"rtt":12.709},{"annotation":null,"asn":null,"ip":"2001:5a0:40:100::51","name":null,"rtt":15.289}]},{"hop":5,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.02},{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.212},{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.163}]},{"hop":6,"probes":[{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.113},{"annotation":null,"asn":null,"ip":"2001:5a0:400:700::17","name":null,"rtt":8.399},{"annotation":null,"asn":null,"ip":"2001:5a0:1900:100::12","name":null,"rtt":10.215}]},{"hop":7,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860:0:1127::2","name":null,"rtt":9.11},{"annotation":null,"asn":null,"ip":"2001:5a0:400:700::17","name":null,"rtt":8.476},{"annotation":null,"asn":null,"ip":"2001:5a0:400:700::17","name":null,"rtt":8.38}]},{"hop":8,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860::8:4000:cd80","name":null,"rtt":9.428},{"annotation":null,"asn":null,"ip":"2001:4860:0:1128::14","name":null,"rtt":9.36},{"annotation":null,"asn":null,"ip":"2001:4860::8:4000:cd80","name":null,"rtt":9.229}]},{"hop":9,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860::9:4001:d508","name":null,"rtt":9.376},{"annotation":null,"asn":null,"ip":"2001:4860::c:4002:652a","name":null,"rtt":9.105},{"annotation":null,"asn":null,"ip":"2001:4860::c:4002:6523","name":null,"rtt":9.384}]},{"hop":10,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860:0:11da::1","name":null,"rtt":8.489},{"annotation":null,"asn":null,"ip":"2001:4860::9:4001:d508","name":null,"rtt":8.978},{"annotation":null,"asn":null,"ip":"2001:4860::1c:4000:f5eb","name":null,"rtt":9.64}]},{"hop":11,"probes":[{"annotation":null,"asn":null,"ip":"2001:4860:0:1::c73","name":null,"rtt":9.596},{"annotation":null,"asn":null,"ip":"2001:4860:0:1::c73","name":null,"rtt":9.077},{"annotation":null,"asn":null,"ip":"2001:4860:0:1::c73","name":null,"rtt":9.724}]},{"hop":12,"probes":[{"annotation":null,"asn":null,"ip":"2607:f8b0:4020:806::2004","name":null,"rtt":8.086},{"annotation":null,"asn":null,"ip":"2607:f8b0:4020:806::2004","name":null,"rtt":8.091},{"annotation":null,"asn":null,"ip":"2607:f8b0:4020:806::2004","name":null,"rtt":8.436}]}]}
|
||||
|
2
tests/fixtures/generic/traceroute1.json
vendored
2
tests/fixtures/generic/traceroute1.json
vendored
File diff suppressed because one or more lines are too long
2
tests/fixtures/generic/traceroute8.json
vendored
2
tests/fixtures/generic/traceroute8.json
vendored
@ -1 +1 @@
|
||||
{"destination_ip": "2606:4700:3030::6812:3e4e", "destination_name": "baeldung.com", "hops": [{"hop": 1, "probes": [{"annotation": null, "asn": null, "ip": "2001:2e8:665:0:2:2:0:1", "name": "2001:2e8:665:0:2:2:0:1", "rtt": 0.083}, {"annotation": null, "asn": null, "ip": "2001:2e8:665:0:2:2:0:1", "name": "2001:2e8:665:0:2:2:0:1", "rtt": 0.048}, {"annotation": null, "asn": null, "ip": "2001:2e8:665:0:2:2:0:1", "name": "2001:2e8:665:0:2:2:0:1", "rtt": 0.044}]}, {"hop": 2, "probes": [{"annotation": null, "asn": null, "ip": "2001:2e8:22:204::2", "name": "2001:2e8:22:204::2", "rtt": 25.128}, {"annotation": null, "asn": null, "ip": "2001:2e8:22:204::2", "name": "2001:2e8:22:204::2", "rtt": 25.047}, {"annotation": null, "asn": null, "ip": "2001:2e8:22:204::2", "name": "2001:2e8:22:204::2", "rtt": 25.025}]}, {"hop": 3, "probes": [{"annotation": null, "asn": null, "ip": "2001:2e8:20::22:11", "name": "2001:2e8:20::22:11", "rtt": 1.106}, {"annotation": null, "asn": null, "ip": "2001:2e8:20::22:11", "name": "2001:2e8:20::22:11", "rtt": 25.83}, {"annotation": null, "asn": null, "ip": "2001:2e8:20::22:11", "name": "2001:2e8:20::22:11", "rtt": 1.007}]}, {"hop": 4, "probes": [{"annotation": null, "asn": null, "ip": "2001:218:2000:5000::305", "name": "xe-0-0-14-1.a02.tokyjp05.jp.bb.gin.ntt.net", "rtt": 0.908}, {"annotation": null, "asn": null, "ip": "2001:218:2000:5000::305", "name": "xe-0-0-14-1.a02.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.197}, {"annotation": null, "asn": null, "ip": "2001:218:2000:5000::305", "name": "xe-0-0-14-1.a02.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.097}]}, {"hop": 5, "probes": [{"annotation": null, "asn": null, "ip": "2001:218:0:2000::59", "name": "ae-25.r02.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.515}, {"annotation": null, "asn": null, "ip": "2001:218:0:2000::59", "name": "ae-25.r02.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.744}, {"annotation": null, "asn": null, "ip": "2001:218:0:2000::59", "name": "ae-25.r02.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.785}]}, {"hop": 6, "probes": [{"annotation": null, "asn": null, "ip": "2001:218:0:2000::11a", "name": "ae-4.r30.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.466}, {"annotation": null, "asn": null, "ip": "2001:218:0:2000::11a", "name": "ae-4.r30.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.538}, {"annotation": null, "asn": null, "ip": "2001:218:0:2000::11a", "name": "ae-4.r30.tokyjp05.jp.bb.gin.ntt.net", "rtt": 1.337}]}, {"hop": 7, "probes": [{"annotation": null, "asn": null, "ip": "2001:218:0:2000::2d7", "name": "ae-3.r00.tokyjp08.jp.bb.gin.ntt.net", "rtt": 1.857}, {"annotation": null, "asn": null, "ip": "2001:218:0:2000::2d7", "name": "ae-3.r00.tokyjp08.jp.bb.gin.ntt.net", "rtt": 1.839}, {"annotation": null, "asn": null, "ip": "2001:218:0:2000::2d7", "name": "ae-3.r00.tokyjp08.jp.bb.gin.ntt.net", "rtt": 1.901}]}, {"hop": 8, "probes": [{"annotation": null, "asn": null, "ip": "2001:218:2000:5000::26", "name": "as7515.ntt.net", "rtt": 2.717}, {"annotation": null, "asn": null, "ip": "2001:218:2000:5000::26", "name": "as7515.ntt.net", "rtt": 2.419}, {"annotation": null, "asn": null, "ip": "2001:218:2000:5000::26", "name": "as7515.ntt.net", "rtt": 2.325}]}, {"hop": 9, "probes": [{"annotation": null, "asn": null, "ip": "2400:cb00:22:1024::a29e:759c", "name": "2400:cb00:22:1024::a29e:759c", "rtt": 2.115}, {"annotation": null, "asn": null, "ip": "2400:cb00:22:1024::a29e:759c", "name": "2400:cb00:22:1024::a29e:759c", "rtt": 1.985}, {"annotation": null, "asn": null, "ip": "2400:cb00:22:1024::a29e:759c", "name": "2400:cb00:22:1024::a29e:759c", "rtt": 2.272}]}]}
|
||||
{"destination_ip":"2606:4700:3030::6812:3e4e","destination_name":"baeldung.com","hops":[{"hop":1,"probes":[{"annotation":null,"asn":null,"ip":"2001:2e8:665:0:2:2:0:1","name":"2001:2e8:665:0:2:2:0:1","rtt":0.083},{"annotation":null,"asn":null,"ip":"2001:2e8:665:0:2:2:0:1","name":"2001:2e8:665:0:2:2:0:1","rtt":0.048},{"annotation":null,"asn":null,"ip":"2001:2e8:665:0:2:2:0:1","name":"2001:2e8:665:0:2:2:0:1","rtt":0.044}]},{"hop":2,"probes":[{"annotation":null,"asn":null,"ip":"2001:2e8:22:204::2","name":"2001:2e8:22:204::2","rtt":25.128},{"annotation":null,"asn":null,"ip":"2001:2e8:22:204::2","name":"2001:2e8:22:204::2","rtt":25.047},{"annotation":null,"asn":null,"ip":"2001:2e8:22:204::2","name":"2001:2e8:22:204::2","rtt":25.025}]},{"hop":3,"probes":[{"annotation":null,"asn":null,"ip":"2001:2e8:20::22:11","name":"2001:2e8:20::22:11","rtt":1.106},{"annotation":null,"asn":null,"ip":"2001:2e8:20::22:11","name":"2001:2e8:20::22:11","rtt":25.83},{"annotation":null,"asn":null,"ip":"2001:2e8:20::22:11","name":"2001:2e8:20::22:11","rtt":1.007}]},{"hop":4,"probes":[{"annotation":null,"asn":null,"ip":"2001:218:2000:5000::305","name":"xe-0-0-14-1.a02.tokyjp05.jp.bb.gin.ntt.net","rtt":0.908},{"annotation":null,"asn":null,"ip":"2001:218:2000:5000::305","name":"xe-0-0-14-1.a02.tokyjp05.jp.bb.gin.ntt.net","rtt":1.197},{"annotation":null,"asn":null,"ip":"2001:218:2000:5000::305","name":"xe-0-0-14-1.a02.tokyjp05.jp.bb.gin.ntt.net","rtt":1.097}]},{"hop":5,"probes":[{"annotation":null,"asn":null,"ip":"2001:218:0:2000::59","name":"ae-25.r02.tokyjp05.jp.bb.gin.ntt.net","rtt":1.515},{"annotation":null,"asn":null,"ip":"2001:218:0:2000::59","name":"ae-25.r02.tokyjp05.jp.bb.gin.ntt.net","rtt":1.744},{"annotation":null,"asn":null,"ip":"2001:218:0:2000::59","name":"ae-25.r02.tokyjp05.jp.bb.gin.ntt.net","rtt":1.785}]},{"hop":6,"probes":[{"annotation":null,"asn":null,"ip":"2001:218:0:2000::11a","name":"ae-4.r30.tokyjp05.jp.bb.gin.ntt.net","rtt":1.466},{"annotation":null,"asn":null,"ip":"2001:218:0:2000::11a","name":"ae-4.r30.tokyjp05.jp.bb.gin.ntt.net","rtt":1.538},{"annotation":null,"asn":null,"ip":"2001:218:0:2000::11a","name":"ae-4.r30.tokyjp05.jp.bb.gin.ntt.net","rtt":1.337}]},{"hop":7,"probes":[{"annotation":null,"asn":null,"ip":"2001:218:0:2000::2d7","name":"ae-3.r00.tokyjp08.jp.bb.gin.ntt.net","rtt":1.857},{"annotation":null,"asn":null,"ip":"2001:218:0:2000::2d7","name":"ae-3.r00.tokyjp08.jp.bb.gin.ntt.net","rtt":1.839},{"annotation":null,"asn":null,"ip":"2001:218:0:2000::2d7","name":"ae-3.r00.tokyjp08.jp.bb.gin.ntt.net","rtt":1.901}]},{"hop":8,"probes":[{"annotation":null,"asn":null,"ip":"2001:218:2000:5000::26","name":"as7515.ntt.net","rtt":2.717},{"annotation":null,"asn":null,"ip":"2001:218:2000:5000::26","name":"as7515.ntt.net","rtt":2.419},{"annotation":null,"asn":null,"ip":"2001:218:2000:5000::26","name":"as7515.ntt.net","rtt":2.325}]},{"hop":9,"probes":[{"annotation":null,"asn":null,"ip":"2400:cb00:22:1024::a29e:759c","name":"2400:cb00:22:1024::a29e:759c","rtt":2.115},{"annotation":null,"asn":null,"ip":"2400:cb00:22:1024::a29e:759c","name":"2400:cb00:22:1024::a29e:759c","rtt":1.985},{"annotation":null,"asn":null,"ip":"2400:cb00:22:1024::a29e:759f","name":"2400:cb00:22:1024::a29e:759f","rtt":2.272}]}]}
|
||||
|
1
tests/fixtures/generic/zpool-status-spares.json
vendored
Normal file
1
tests/fixtures/generic/zpool-status-spares.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
[{"pool":"tank","state":"ONLINE","scan":"scrub repaired 0B in <snip>","config":[{"name":"tank","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"mirror-0","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdh","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdk","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"mirror-1","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdl","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdj","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"mirror-2","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdn","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdm","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"mirror-3","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdg","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"sdi","state":"ONLINE","read":0,"write":0,"checksum":0},{"name":"spares","state":null,"read":null,"write":null,"checksum":null},{"name":"sdf","state":"AVAIL","read":null,"write":null,"checksum":null}],"errors":"No known data errors"}]
|
23
tests/fixtures/generic/zpool-status-spares.out
vendored
Normal file
23
tests/fixtures/generic/zpool-status-spares.out
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
pool: tank
|
||||
state: ONLINE
|
||||
scan: scrub repaired 0B in <snip>
|
||||
config:
|
||||
|
||||
NAME STATE READ WRITE CKSUM
|
||||
tank ONLINE 0 0 0
|
||||
mirror-0 ONLINE 0 0 0
|
||||
sdh ONLINE 0 0 0
|
||||
sdk ONLINE 0 0 0
|
||||
mirror-1 ONLINE 0 0 0
|
||||
sdl ONLINE 0 0 0
|
||||
sdj ONLINE 0 0 0
|
||||
mirror-2 ONLINE 0 0 0
|
||||
sdn ONLINE 0 0 0
|
||||
sdm ONLINE 0 0 0
|
||||
mirror-3 ONLINE 0 0 0
|
||||
sdg ONLINE 0 0 0
|
||||
sdi ONLINE 0 0 0
|
||||
spares
|
||||
sdf AVAIL
|
||||
|
||||
errors: No known data errors
|
2
tests/fixtures/ubuntu-20.10/lspci-mmv.json
vendored
2
tests/fixtures/ubuntu-20.10/lspci-mmv.json
vendored
File diff suppressed because one or more lines are too long
2
tests/fixtures/ubuntu-20.10/lspci-nmmv.json
vendored
2
tests/fixtures/ubuntu-20.10/lspci-nmmv.json
vendored
File diff suppressed because one or more lines are too long
2
tests/fixtures/ubuntu-20.10/lspci-nnmmv.json
vendored
2
tests/fixtures/ubuntu-20.10/lspci-nnmmv.json
vendored
File diff suppressed because one or more lines are too long
@ -177,6 +177,49 @@ class BluetoothctlTests(unittest.TestCase):
|
||||
"txpower": 4
|
||||
}
|
||||
|
||||
if actual:
|
||||
for k, v in expected.items():
|
||||
self.assertEqual(v, actual[0][k], f"Device regex failed on {k}")
|
||||
def test_bluetoothctl_device_with_battery(self):
|
||||
"""
|
||||
Test 'bluetoothctl' with device that has a battery
|
||||
"""
|
||||
|
||||
with open("tests/fixtures/generic/bluetoothctl_device_with_battery.out", "r") as f:
|
||||
output = f.read()
|
||||
|
||||
actual = parse(output, quiet=True)
|
||||
|
||||
self.assertIsNotNone(actual)
|
||||
self.assertIsNotNone(actual[0], actual)
|
||||
|
||||
expected = {
|
||||
"name": "WH-1000XM3",
|
||||
"is_public": True,
|
||||
"is_random": False,
|
||||
"address": "67:F6:B4:0E:5C:94",
|
||||
"alias": "WH-1000XM3",
|
||||
"appearance": "",
|
||||
"class": "0x11240404 (2360324)",
|
||||
"icon": "audio-headset",
|
||||
"paired": "yes",
|
||||
"bonded": "yes",
|
||||
"trusted": "yes",
|
||||
"blocked": "no",
|
||||
"connected": "yes",
|
||||
"legacy_pairing": "no",
|
||||
"rssi": 0,
|
||||
"txpower": 0,
|
||||
"uuids": [
|
||||
"Vendor specific (fd096fad-eed7-4504-943b-5fa1c0e761b2)",
|
||||
"Vendor specific (03c57488-f7b6-45a3-8a23-ed4a890075cd)",
|
||||
"Vendor specific (77a369ae-e453-4ff7-bc84-dc8f411eaa6a)",
|
||||
"Vendor specific (8c274bd0-e7bd-4ed0-a391-55465e38005c)"
|
||||
],
|
||||
"modalias": "usb:v052Cp0DC3d1426",
|
||||
"battery_percentage": 70
|
||||
}
|
||||
|
||||
if actual:
|
||||
for k, v in expected.items():
|
||||
self.assertEqual(v, actual[0][k], f"Device regex failed on {k}")
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.date
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.dig
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.dir
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -7,7 +7,7 @@ from jc.exceptions import ParseError
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# To create streaming output use:
|
||||
# $ cat git-log.out | jc --git-log-s | jello -c > git-log-streaming.json
|
||||
# $ cat git-log.out | jc --git-log-s | jello -c > git-log-streaming.json # or jq -sc
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
@ -1,14 +1,7 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import unittest
|
||||
import jc.utils
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.last
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.ls
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
from jc.exceptions import ParseError
|
||||
@ -8,12 +6,6 @@ import jc.parsers.ls_s
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
# To create streaming output use:
|
||||
# $ cat ls-al.out | jc --ls-s | jello -c > ls-al-streaming.json
|
||||
|
||||
|
@ -24,6 +24,9 @@ class MyTests(unittest.TestCase):
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/pip-show-multiline-license.out'), 'r', encoding='utf-8') as f:
|
||||
generic_pip_show_multiline_license = f.read()
|
||||
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/pip-show-multiline-license-first-blank.out'), 'r', encoding='utf-8') as f:
|
||||
generic_pip_show_multiline_license_first_blank = f.read()
|
||||
|
||||
# output
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/pip-show.json'), 'r', encoding='utf-8') as f:
|
||||
centos_7_7_pip_show_json = json.loads(f.read())
|
||||
@ -40,6 +43,9 @@ class MyTests(unittest.TestCase):
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/pip-show-multiline-license.json'), 'r', encoding='utf-8') as f:
|
||||
generic_pip_show_multiline_license_json = json.loads(f.read())
|
||||
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/pip-show-multiline-license-first-blank.json'), 'r', encoding='utf-8') as f:
|
||||
generic_pip_show_multiline_license_first_blank_json = json.loads(f.read())
|
||||
|
||||
|
||||
def test_pip_show_nodata(self):
|
||||
"""
|
||||
@ -77,6 +83,12 @@ class MyTests(unittest.TestCase):
|
||||
"""
|
||||
self.assertEqual(jc.parsers.pip_show.parse(self.generic_pip_show_multiline_license, quiet=True), self.generic_pip_show_multiline_license_json)
|
||||
|
||||
def test_pip_show_multiline_license_first_blank(self):
|
||||
"""
|
||||
Test 'pip show' with a multiline license where the first line is blank
|
||||
"""
|
||||
self.assertEqual(jc.parsers.pip_show.parse(self.generic_pip_show_multiline_license_first_blank, quiet=True), self.generic_pip_show_multiline_license_first_blank_json)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import unittest
|
||||
import json
|
||||
import jc.parsers.rpm_qi
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.rsync_s
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
# To create streaming output use:
|
||||
# $ cat rsync.out | jc --rsync-s | jello -c > rsync-streaming.json
|
||||
|
@ -18,6 +18,9 @@ class MyTests(unittest.TestCase):
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.out'), 'r', encoding='utf-8') as f:
|
||||
ubuntu_18_4_ss_sudo_tulpen = f.read()
|
||||
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/ss-wide.out'), 'r', encoding='utf-8') as f:
|
||||
ss_wide = f.read()
|
||||
|
||||
# output
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/centos-7.7/ss-sudo-a.json'), 'r', encoding='utf-8') as f:
|
||||
centos_7_7_ss_sudo_a_json = json.loads(f.read())
|
||||
@ -28,6 +31,9 @@ class MyTests(unittest.TestCase):
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/ubuntu-18.04/ss-sudo-tulpen.json'), 'r', encoding='utf-8') as f:
|
||||
ubuntu_18_4_ss_sudo_tulpen_json = json.loads(f.read())
|
||||
|
||||
with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/generic/ss-wide.json'), 'r', encoding='utf-8') as f:
|
||||
ss_wide_json = json.loads(f.read())
|
||||
|
||||
def test_ss_nodata(self):
|
||||
"""
|
||||
Test 'ss' with no data
|
||||
@ -52,5 +58,11 @@ class MyTests(unittest.TestCase):
|
||||
"""
|
||||
self.assertEqual(jc.parsers.ss.parse(self.ubuntu_18_4_ss_sudo_tulpen, quiet=True), self.ubuntu_18_4_ss_sudo_tulpen_json)
|
||||
|
||||
def test_ss_wide(self):
|
||||
"""
|
||||
Test 'sudo ss' with wide format and lots of options
|
||||
"""
|
||||
self.assertEqual(jc.parsers.ss.parse(self.ss_wide, quiet=True), self.ss_wide_json)
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.stat
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
from jc.exceptions import ParseError
|
||||
@ -8,11 +6,6 @@ import jc.parsers.stat_s
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
# To create streaming output use:
|
||||
# $ cat stat.out | jc --stat-s | jello -c > stat-streaming.json
|
||||
|
@ -1,17 +1,10 @@
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import unittest
|
||||
import jc.parsers.systeminfo
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
test_files = [
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.upower
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.vmstat
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
from jc.exceptions import ParseError
|
||||
@ -8,11 +6,6 @@ import jc.parsers.vmstat_s
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
# To create streaming output use:
|
||||
# $ cat vmstat.out | jc --vmstat-s | jello -c > vmstat-streaming.json
|
||||
|
@ -1,17 +1,10 @@
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import unittest
|
||||
import jc.parsers.who
|
||||
|
||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
# Set the timezone on POSIX systems. Need to manually set for Windows tests
|
||||
if not sys.platform.startswith('win32'):
|
||||
os.environ['TZ'] = 'America/Los_Angeles'
|
||||
time.tzset()
|
||||
|
||||
|
||||
class MyTests(unittest.TestCase):
|
||||
|
||||
|
@ -325,7 +325,7 @@ Screen 0: minimum 1024 x 600, current 1024 x 600, maximum 1024 x 600
|
||||
default connected 1024x600+0+0 0mm x 0mm
|
||||
1024x600 0.00*
|
||||
"""
|
||||
actual: Response = parse(data_in)
|
||||
actual: Response = parse(data_in, quiet=True)
|
||||
self.maxDiff = None
|
||||
self.assertEqual(1024, actual["screens"][0]["devices"][0]["resolution_width"])
|
||||
|
||||
|
@ -25,7 +25,10 @@ class MyTests(unittest.TestCase):
|
||||
'fixtures/generic/zpool-status-v3.json'),
|
||||
'zpool_status4': (
|
||||
'fixtures/generic/zpool-status-v4.out',
|
||||
'fixtures/generic/zpool-status-v4.json')
|
||||
'fixtures/generic/zpool-status-v4.json'),
|
||||
'zpool_status_spares': (
|
||||
'fixtures/generic/zpool-status-spares.out',
|
||||
'fixtures/generic/zpool-status-spares.json')
|
||||
}
|
||||
|
||||
for file, filepaths in fixtures.items():
|
||||
@ -78,6 +81,15 @@ class MyTests(unittest.TestCase):
|
||||
self.f_json['zpool_status4']
|
||||
)
|
||||
|
||||
def test_zpool_status_spares(self):
|
||||
"""
|
||||
Test 'zpool status' with spares section
|
||||
"""
|
||||
self.assertEqual(
|
||||
parse(self.f_in['zpool_status_spares'], quiet=True),
|
||||
self.f_json['zpool_status_spares']
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Reference in New Issue
Block a user