1
0
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:
Kelly Brazil
2024-06-09 19:00:37 -07:00
82 changed files with 836 additions and 276 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -10,7 +10,7 @@ from jc import appdirs
from jc import utils
__version__ = '1.25.2'
__version__ = '1.25.3'
parsers: List[str] = [
'acpi',

View File

@ -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'

View File

@ -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

View File

@ -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)

View File

@ -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:

View File

@ -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] = []

View File

@ -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

View File

@ -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 = []

View File

@ -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)

View File

@ -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:'):

View File

@ -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:'):

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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.',

View File

@ -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

View 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
View 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

View File

@ -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}]

View File

@ -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

File diff suppressed because one or more lines are too long

View 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}]

View 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

File diff suppressed because one or more lines are too long

156
tests/fixtures/generic/ss-wide.out vendored Normal file
View 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 <->

View File

@ -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}]}]}

View File

@ -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}]}]}

File diff suppressed because one or more lines are too long

View File

@ -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}]}]}

View 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"}]

View 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

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

View File

@ -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}")

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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

View File

@ -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()

View File

@ -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):

View File

@ -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

View File

@ -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()

View File

@ -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):

View File

@ -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

View File

@ -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 = [

View File

@ -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):

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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"])

View File

@ -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()