1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-06-19 00:17:51 +02:00

Merge pull request #120 from kellyjonbrazil/dev

Dev v1.15.1
This commit is contained in:
Kelly Brazil
2021-04-13 14:59:17 -07:00
committed by GitHub
91 changed files with 1871 additions and 1918 deletions

View File

@ -1,11 +1,18 @@
jc changelog jc changelog
20210413 v1.15.1
- New feature to show parser documentation interactively with -h --parser_name
for example: $ jc -h --arp
- Add man page to pypi package for easier packaging in homebrew
- Update rpm-qi parser to add two calculated timestamp fields: install_date_epoch and install_date_epoch_utc
- Clean up documentation and autogenerate the Parser Information section from metadata
20210407 v1.15.0 20210407 v1.15.0
- Add acpi command parser tested on linux - Add acpi command parser tested on linux
- Add upower command parser tested on linux - Add upower command parser tested on linux
- Add /usr/bin/time command parser tested on linux and macOS - Add /usr/bin/time command parser tested on linux and macOS
- Add dpkg -l command parser tested on linux - Add dpkg -l command parser tested on linux
- Add rpm -qai command parser tested on linux - Add rpm -qi command parser tested on linux
- Add finger command parser tested on linux and macOS - Add finger command parser tested on linux and macOS
- Add dir command parser tested on Windows 10 - Add dir command parser tested on Windows 10
- Update date parser: complete rewrite (v2.0) providing many enhancements: - Update date parser: complete rewrite (v2.0) providing many enhancements:

View File

@ -2503,9 +2503,11 @@ rpm_qia | jc --rpm_qi -p # or: jc -p rpm -qia
"vendor": "CentOS", "vendor": "CentOS",
"url": "http://www.gnu.org/software/make/", "url": "http://www.gnu.org/software/make/",
"summary": "A GNU tool which simplifies the build process for users", "summary": "A GNU tool which simplifies the build process for users",
"description": "A GNU tool for controlling the generation of executables and other non-source...", "description": "A GNU tool for controlling the generation of executables and other...",
"build_epoch": 1565311645, "build_epoch": 1565311645,
"build_epoch_utc": null "build_epoch_utc": null,
"install_date_epoch": 1571242902,
"install_date_epoch_utc": null
}, },
{ {
"name": "kbd-legacy", "name": "kbd-legacy",
@ -2525,9 +2527,11 @@ rpm_qia | jc --rpm_qi -p # or: jc -p rpm -qia
"vendor": "CentOS", "vendor": "CentOS",
"url": "http://ftp.altlinux.org/pub/people/legion/kbd", "url": "http://ftp.altlinux.org/pub/people/legion/kbd",
"summary": "Legacy data for kbd package", "summary": "Legacy data for kbd package",
"description": "The kbd-legacy package contains original keymaps for kbd package. Please note...", "description": "The kbd-legacy package contains original keymaps for kbd package...",
"build_epoch": 1540939200, "build_epoch": 1540939200,
"build_epoch_utc": null "build_epoch_utc": null,
"install_date_epoch": 1565891588,
"install_date_epoch_utc": null
} }
] ]
``` ```

1
MANIFEST.in Normal file
View File

@ -0,0 +1 @@
include jc/man/jc.1.gz

View File

@ -199,7 +199,7 @@ The JSON output can be compact (default) or pretty formatted with the `-p` optio
### Options ### Options
- `-a` about `jc`. Prints information about `jc` and the parsers (in JSON, of course!) - `-a` about `jc`. Prints information about `jc` and the parsers (in JSON, of course!)
- `-d` debug mode. Prints trace messages if parsing issues are encountered (use `-dd` for verbose debugging) - `-d` debug mode. Prints trace messages if parsing issues are encountered (use `-dd` for verbose debugging)
- `-h` `jc` help - `-h` `jc` help. Use `jc -h --parser_name` for parser documentation
- `-m` monochrome JSON output - `-m` monochrome JSON output
- `-p` pretty format the JSON output - `-p` pretty format the JSON output
- `-q` quiet mode. Suppresses parser warning messages - `-q` quiet mode. Suppresses parser warning messages

View File

@ -11,10 +11,27 @@ pydocmd simple utils+ > ../docs/utils.md
# a bit of inception here... jc is being used to help # a bit of inception here... jc is being used to help
# automate the generation of its own documentation. :) # automate the generation of its own documentation. :)
parsers=$(jc -a | jq -r .parsers[].name) # pull jc parser objects into a bash array from jq
parsers=()
for parser in $parsers while read -r value
do do
echo Building docs for: $parser parsers+=("$value")
pydocmd simple jc.parsers.${parser}+ > ../docs/parsers/${parser}.md done < <(jc -a | jq -c '.parsers[]')
# iterate over the bash array
for parser in "${parsers[@]}"
do
parser_name=$(jq -r '.name' <<< "$parser")
compatible=$(jq -r '.compatible | join(", ")' <<< "$parser")
version=$(jq -r '.version' <<< "$parser")
author=$(jq -r '.author' <<< "$parser")
author_email=$(jq -r '.author_email' <<< "$parser")
echo "Building docs for: ${parser_name}"
echo "[Home](https://kellyjonbrazil.github.io/jc/)" > ../docs/parsers/"${parser_name}".md
pydocmd simple jc.parsers."${parser_name}"+ >> ../docs/parsers/"${parser_name}".md
echo "## Parser Information" >> ../docs/parsers/"${parser_name}".md
echo "Compatibility: ${compatible}" >> ../docs/parsers/"${parser_name}".md
echo >> ../docs/parsers/"${parser_name}".md
echo "Version ${version} by ${author} (${author_email})" >> ../docs/parsers/"${parser_name}".md
done done

View File

@ -18,6 +18,22 @@ Usage (module):
import jc.parsers.airport_s import jc.parsers.airport_s
result = jc.parsers.airport_s.parse(airport_s_command_output) result = jc.parsers.airport_s.parse(airport_s_command_output)
Schema:
[
{
"ssid": string,
"bssid": string,
"rssi": integer,
"channel": string,
"ht": boolean,
"cc": string,
"security": [
string,
]
}
]
Examples: Examples:
$ airport -s | jc --airport-s -p $ airport -s | jc --airport-s -p
@ -95,36 +111,7 @@ Examples:
```python ```python
info() info()
``` ```
Provides parser metadata (version, author, etc.)
## process
```python
process(proc_data)
```
Final processing to conform to the schema.
Parameters:
proc_data: (List of Dictionaries) raw structured data to process
Returns:
List of Dictionaries. Structured data with the following schema:
[
{
"ssid": string,
"bssid": string,
"rssi": integer,
"channel": string,
"ht": boolean,
"cc": string,
"security": [
string,
]
}
]
## parse ## parse
```python ```python
@ -146,4 +133,4 @@ Returns:
## Parser Information ## Parser Information
Compatibility: darwin Compatibility: darwin
Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com) Version 1.3 by Kelly Brazil (kellyjonbrazil@gmail.com)

View File

@ -5,9 +5,9 @@ jc - JSON CLI output utility `rpm -qi` command output parser
Works with `rpm -qi [package]` or `rpm -qia`. Works with `rpm -qi [package]` or `rpm -qia`.
The `build_epoch` calculated timestamp field is naive (i.e. based on the local time of the system the parser is run on) The `..._epoch` calculated timestamp fields are naive (i.e. based on the local time of the system the parser is run on)
The `build_epoch_utc` calculated timestamp field is timezone-aware and is only available if the timezone field is UTC. The `..._epoch_utc` calculated timestamp fields are timezone-aware and is only available if the timezone field is UTC.
Usage (cli): Usage (cli):
@ -26,27 +26,29 @@ Schema:
[ [
{ {
"name": string, "name": string,
"epoch": integer, "epoch": integer,
"version": string, "version": string,
"release": string, "release": string,
"architecture": string, "architecture": string,
"install_date": string, "install_date": string,
"group": string, "install_date_epoch": integer, # naive timestamp
"size": integer, "install_date_epoch_utc": integer, # Aware timestamp if timezone is UTC
"license": string, "group": string,
"signature": string, "size": integer,
"source_rpm": string, "license": string,
"build_date": string, "signature": string,
"build_epoch": integer, # naive timestamp "source_rpm": string,
"build_epoch_utc": integer, # Aware timestamp if timezone is UTC "build_date": string,
"build_host": string, "build_epoch": integer, # naive timestamp
"relocations": string, "build_epoch_utc": integer, # Aware timestamp if timezone is UTC
"packager": string, "build_host": string,
"vendor": string, "relocations": string,
"url": string, "packager": string,
"summary": string, "vendor": string,
"description": string "url": string,
"summary": string,
"description": string
} }
] ]
@ -73,9 +75,11 @@ Examples:
"vendor": "CentOS", "vendor": "CentOS",
"url": "http://www.gnu.org/software/make/", "url": "http://www.gnu.org/software/make/",
"summary": "A GNU tool which simplifies the build process for users", "summary": "A GNU tool which simplifies the build process for users",
"description": "A GNU tool for controlling the generation of executables and other non-source...", "description": "A GNU tool for controlling the generation of executables and other...",
"build_epoch": 1565311645, "build_epoch": 1565311645,
"build_epoch_utc": null "build_epoch_utc": null,
"install_date_epoch": 1571242902,
"install_date_epoch_utc": null
}, },
{ {
"name": "kbd-legacy", "name": "kbd-legacy",
@ -95,9 +99,11 @@ Examples:
"vendor": "CentOS", "vendor": "CentOS",
"url": "http://ftp.altlinux.org/pub/people/legion/kbd", "url": "http://ftp.altlinux.org/pub/people/legion/kbd",
"summary": "Legacy data for kbd package", "summary": "Legacy data for kbd package",
"description": "The kbd-legacy package contains original keymaps for kbd package. Please note...", "description": "The kbd-legacy package contains original keymaps for kbd package...",
"build_epoch": 1540939200, "build_epoch": 1540939200,
"build_epoch_utc": null "build_epoch_utc": null,
"install_date_epoch": 1565891588,
"install_date_epoch_utc": null
}, },
... ...
] ]
@ -175,4 +181,4 @@ Returns:
## Parser Information ## Parser Information
Compatibility: linux Compatibility: linux
Version 1.1 by Kelly Brazil (kellyjonbrazil@gmail.com) Version 1.2 by Kelly Brazil (kellyjonbrazil@gmail.com)

View File

@ -3,7 +3,7 @@
# jc.parsers.timedatectl # jc.parsers.timedatectl
jc - JSON CLI output utility `timedatectl` command output parser jc - JSON CLI output utility `timedatectl` command output parser
The `epoch_utc` calculated timestamp field is timezone-aware and is only available if the universal_time field is available. The `epoch_utc` calculated timestamp field is timezone-aware and is only available if the `universal_time` field is available.
Usage (cli): Usage (cli):

View File

@ -6,7 +6,7 @@ JC - JSON CLI output utility
This package serializes the output of many standard unix command line tools to JSON format. This package serializes the output of many standard unix command line tools to JSON format.
For documentation on each parser, see [docs/parsers](https://github.com/kellyjonbrazil/jc/tree/master/docs/parsers). For documentation on each parser, see the [documentation site](https://kellyjonbrazil.github.io/jc/).
CLI Example: CLI Example:

View File

@ -4,7 +4,7 @@
This package serializes the output of many standard unix command line tools to JSON format. This package serializes the output of many standard unix command line tools to JSON format.
For documentation on each parser, see [docs/parsers](https://github.com/kellyjonbrazil/jc/tree/master/docs/parsers). For documentation on each parser, see the [documentation site](https://kellyjonbrazil.github.io/jc/).
CLI Example: CLI Example:
@ -69,4 +69,4 @@ Module Example:
""" """
name = 'jc' name = 'jc'
__version__ = '1.15.0' __version__ = '1.15.1'

View File

@ -320,7 +320,7 @@ def helptext():
Options: Options:
-a about jc -a about jc
-d debug - show traceback (-dd for verbose traceback) -d debug - show traceback (-dd for verbose traceback)
-h help -h help (use -h --parser_name for parser documentation)
-m monochrome output -m monochrome output
-p pretty print output -p pretty print output
-q quiet - suppress parser warnings -q quiet - suppress parser warnings
@ -333,9 +333,34 @@ def helptext():
or using the magic syntax: or using the magic syntax:
jc -p ls -al jc -p ls -al
For parser documentation:
jc -h --ls
''' '''
return textwrap.dedent(helptext_string) return textwrap.dedent(helptext_string)
def help_doc(options):
"""
Returns the parser documentation if a parser is found in the arguments, otherwise
the general help text is returned.
"""
for arg in options:
parser_name = parser_shortname(arg)
if parser_name in parsers:
# load parser module just in time so we don't need to load all modules
parser = parser_module(arg)
compatible = ', '.join(parser.info.compatible)
doc_text = f'''{parser.__doc__}
Compatibility: {compatible}
Version {parser.info.version} by {parser.info.author} ({parser.info.author_email})
'''
return doc_text
return helptext()
def versiontext(): def versiontext():
"""Return the version text""" """Return the version text"""
@ -394,6 +419,10 @@ def generate_magic_command(args):
else: else:
break break
# if -h, -a, or -v found in options, then bail out
if 'h' in options or 'a' in options or 'v' in options:
return False, None
# all options popped and no command found - for case like 'jc -a' # all options popped and no command found - for case like 'jc -a'
if len(args_given) == 0: if len(args_given) == 0:
return False, None return False, None
@ -447,11 +476,11 @@ def main():
except AttributeError: except AttributeError:
pass pass
jc_colors = os.getenv('JC_COLORS')
# try magic syntax first: e.g. jc -p ls -al # try magic syntax first: e.g. jc -p ls -al
magic() magic()
jc_colors = os.getenv('JC_COLORS')
options = [] options = []
# options # options
@ -477,7 +506,7 @@ def main():
sys.exit(0) sys.exit(0)
if help_me: if help_me:
print(helptext()) print(help_doc(sys.argv))
sys.exit(0) sys.exit(0)
if version_info: if version_info:

BIN
jc/man/jc.1.gz Normal file

Binary file not shown.

View File

@ -13,9 +13,44 @@ Usage (module):
import jc.parsers.acpi import jc.parsers.acpi
result = jc.parsers.acpi.parse(acpi_command_output) result = jc.parsers.acpi.parse(acpi_command_output)
Compatibility: Schema:
'linux' [
{
"type": string,
"id": integer,
"state": string,
"charge_percent": integer,
"until_charged": string,
"until_charged_hours": integer,
"until_charged_minuts": integer,
"until_charged_seconds": integer,
"until_charged_total_seconds": integer,
"charge_remaining": string,
"charge_remaining_hours": integer,
"charge_remaining_minutes": integer,
"charge_remaining_seconds": integer,
"charge_remaining_total_seconds": integer,
"design_capacity_mah": integer,
"last_full_capacity": integer,
"last_full_capacity_percent": integer,
"on-line": boolean,
"mode": string,
"temperature": float,
"temperature_unit": string,
"trip_points": [
{
"id": integer,
"switches_to_mode": string,
"temperature": float,
"temperature_unit": string
}
],
"messages": [
string
]
}
]
Examples: Examples:
@ -191,7 +226,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`acpi` command parser' description = '`acpi` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -204,7 +240,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -214,44 +250,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"type": string,
"id": integer,
"state": string,
"charge_percent": integer,
"until_charged": string,
"until_charged_hours": integer,
"until_charged_minuts": integer,
"until_charged_seconds": integer,
"until_charged_total_seconds": integer,
"charge_remaining": string,
"charge_remaining_hours": integer,
"charge_remaining_minutes": integer,
"charge_remaining_seconds": integer,
"charge_remaining_total_seconds": integer,
"design_capacity_mah": integer,
"last_full_capacity": integer,
"last_full_capacity_percent": integer,
"on-line": boolean,
"mode": string,
"temperature": float,
"temperature_unit": string,
"trip_points": [
{
"id": integer,
"switches_to_mode": string,
"temperature": float,
"temperature_unit": string
}
],
"messages": [
string
]
}
]
""" """
int_list = ['id', 'charge_percent', 'design_capacity_mah', 'last_full_capacity', 'last_full_capacity_percent'] int_list = ['id', 'charge_percent', 'design_capacity_mah', 'last_full_capacity', 'last_full_capacity_percent']
float_list = ['temperature'] float_list = ['temperature']
@ -406,4 +405,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,25 @@ Usage (module):
import jc.parsers.airport import jc.parsers.airport
result = jc.parsers.airport.parse(airport_command_output) result = jc.parsers.airport.parse(airport_command_output)
Compatibility: Schema:
'darwin' {
"agrctlrssi": integer,
"agrextrssi": integer,
"agrctlnoise": integer,
"agrextnoise": integer,
"state": string,
"op_mode": string,
"lasttxrate": integer,
"maxrate": integer,
"lastassocstatus": integer,
"802_11_auth": string,
"link_auth": string,
"bssid": string,
"ssid": string,
"mcs": integer,
"channel": string
}
Examples: Examples:
@ -63,7 +79,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`airport -I` command parser' description = '`airport -I` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -77,7 +94,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -87,25 +104,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"agrctlrssi": integer,
"agrextrssi": integer,
"agrctlnoise": integer,
"agrextnoise": integer,
"state": string,
"op_mode": string,
"lasttxrate": integer,
"maxrate": integer,
"lastassocstatus": integer,
"802_11_auth": string,
"link_auth": string,
"bssid": string,
"ssid": string,
"mcs": integer,
"channel": string
}
""" """
# integer changes # integer changes
int_list = ['agrctlrssi', 'agrextrssi', 'agrctlnoise', 'agrextnoise', int_list = ['agrctlrssi', 'agrextrssi', 'agrctlnoise', 'agrextnoise',
@ -148,4 +147,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,21 @@ Usage (module):
import jc.parsers.airport_s import jc.parsers.airport_s
result = jc.parsers.airport_s.parse(airport_s_command_output) result = jc.parsers.airport_s.parse(airport_s_command_output)
Compatibility: Schema:
'darwin' [
{
"ssid": string,
"bssid": string,
"rssi": integer,
"channel": string,
"ht": boolean,
"cc": string,
"security": [
string,
]
}
]
Examples: Examples:
@ -96,7 +108,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`airport -s` command parser' description = '`airport -s` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -110,7 +123,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -120,20 +133,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"ssid": string,
"bssid": string,
"rssi": integer,
"channel": string,
"ht": boolean,
"cc": string,
"security": [
string,
]
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -193,4 +193,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,20 @@ Usage (module):
import jc.parsers.arp import jc.parsers.arp
result = jc.parsers.arp.parse(arp_command_output) result = jc.parsers.arp.parse(arp_command_output)
Compatibility: Schema:
'linux', 'aix', 'freebsd', 'darwin' [
{
"name": string,
"address": string,
"hwtype": string,
"hwaddress": string,
"flags_mask": string,
"iface": string,
"permanent": boolean,
"expires": integer
}
]
Examples: Examples:
@ -106,7 +117,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.6' """Provides parser metadata (version, author, etc.)"""
version = '1.7'
description = '`arp` command parser' description = '`arp` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -119,7 +131,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -129,20 +141,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema:
[
{
"name": string,
"address": string,
"hwtype": string,
"hwaddress": string,
"flags_mask": string,
"iface": string,
"permanent": boolean,
"expires": integer
}
]
""" """
# in BSD style, change name to null if it is a question mark # in BSD style, change name to null if it is a question mark
@ -212,7 +211,7 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)
# detect if linux style was used # detect if linux style was used
elif cleandata[0].startswith('Address'): elif cleandata[0].startswith('Address'):
@ -239,4 +238,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,41 @@ Usage (module):
import jc.parsers.blkid import jc.parsers.blkid
result = jc.parsers.blkid.parse(blkid_command_output) result = jc.parsers.blkid.parse(blkid_command_output)
Compatibility: Schema:
'linux' [
{
"device": string,
"uuid": string,
"type": string,
"usage": string,
"part_entry_scheme": string,
"part_entry_type": string,
"part_entry_flags": string,
"part_entry_number": integer,
"part_entry_offset": integer,
"part_entry_size": integer,
"part_entry_disk": string,
"id_fs_uuid": string,
"id_fs_uuid_enc": string,
"id_fs_version": string,
"id_fs_type": string,
"id_fs_usage": string,
"id_part_entry_scheme": string,
"id_part_entry_type": string,
"id_part_entry_flags": string,
"id_part_entry_number": integer,
"id_part_entry_offset": integer,
"id_part_entry_size": integer,
"id_iolimit_minimum_io_size": integer,
"id_iolimit_physical_sector_size": integer,
"id_iolimit_logical_sector_size": integer,
"id_part_entry_disk": string,
"minimum_io_size": integer,
"physical_sector_size": integer,
"logical_sector_size": integer
}
]
Examples: Examples:
@ -88,7 +120,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`blkid` command parser' description = '`blkid` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -102,7 +135,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -112,41 +145,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"device": string,
"uuid": string,
"type": string,
"usage": string,
"part_entry_scheme": string,
"part_entry_type": string,
"part_entry_flags": string,
"part_entry_number": integer,
"part_entry_offset": integer,
"part_entry_size": integer,
"part_entry_disk": string,
"id_fs_uuid": string,
"id_fs_uuid_enc": string,
"id_fs_version": string,
"id_fs_type": string,
"id_fs_usage": string,
"id_part_entry_scheme": string,
"id_part_entry_type": string,
"id_part_entry_flags": string,
"id_part_entry_number": integer,
"id_part_entry_offset": integer,
"id_part_entry_size": integer,
"id_iolimit_minimum_io_size": integer,
"id_iolimit_physical_sector_size": integer,
"id_iolimit_logical_sector_size": integer,
"id_part_entry_disk": string,
"minimum_io_size": integer,
"physical_sector_size": integer,
"logical_sector_size": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
if 'devname' in entry: if 'devname' in entry:
@ -225,4 +224,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,15 @@ Usage (module):
import jc.parsers.cksum import jc.parsers.cksum
result = jc.parsers.cksum.parse(cksum_command_output) result = jc.parsers.cksum.parse(cksum_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"filename": string,
"checksum": integer,
"blocks": integer
}
]
Examples: Examples:
@ -47,7 +53,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`cksum` and `sum` command parser' description = '`cksum` and `sum` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -60,7 +67,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -70,15 +77,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"filename": string,
"checksum": integer,
"blocks": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -124,4 +123,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,36 @@ Usage (module):
import jc.parsers.crontab import jc.parsers.crontab
result = jc.parsers.crontab.parse(crontab_output) result = jc.parsers.crontab.parse(crontab_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' {
"variables": [
"name": string,
"value": string
],
"schedule": [
{
"occurrence" string,
"minute": [
string
],
"hour": [
string
],
"day_of_month": [
string
],
"month": [
string
],
"day_of_week": [
string
],
"occurrence": string,
"command": string
}
]
}
Examples: Examples:
@ -143,7 +170,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.4' """Provides parser metadata (version, author, etc.)"""
version = '1.5'
description = '`crontab` command and file parser' description = '`crontab` command and file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -157,7 +185,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -167,37 +195,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"variables": [
"name": string,
"value": string
],
"schedule": [
{
"occurrence" string,
"minute": [
string
],
"hour": [
string
],
"day_of_month": [
string
],
"month": [
string
],
"day_of_week": [
string
],
"occurrence": string,
"command": string
}
]
}
""" """
# put itmes in lists # put itmes in lists
try: try:
@ -280,4 +278,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -11,9 +11,37 @@ Usage (module):
import jc.parsers.crontab_u import jc.parsers.crontab_u
result = jc.parsers.crontab_u.parse(crontab_u_output) result = jc.parsers.crontab_u.parse(crontab_u_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' {
"variables": [
"name": string,
"value": string
],
"schedule": [
{
"occurrence" string,
"minute": [
string
],
"hour": [
string
],
"day_of_month": [
string
],
"month": [
string
],
"day_of_week": [
string
],
"occurrence": string,
"user": string,
"command": string
}
]
}
Examples: Examples:
@ -132,15 +160,14 @@ Examples:
} }
] ]
} }
""" """
import jc.utils import jc.utils
import jc.parsers.universal import jc.parsers.universal
class info(): class info():
version = '1.5' """Provides parser metadata (version, author, etc.)"""
version = '1.6'
description = '`crontab` file parser with user support' description = '`crontab` file parser with user support'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -153,7 +180,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -163,38 +190,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"variables": [
"name": string,
"value": string
],
"schedule": [
{
"occurrence" string,
"minute": [
string
],
"hour": [
string
],
"day_of_month": [
string
],
"month": [
string
],
"day_of_week": [
string
],
"occurrence": string,
"user": string,
"command": string
}
]
}
""" """
# put itmes in lists # put itmes in lists
try: try:
@ -279,4 +275,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -11,9 +11,16 @@ Usage (module):
import jc.parsers.csv import jc.parsers.csv
result = jc.parsers.csv.parse(csv_output) result = jc.parsers.csv.parse(csv_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' csv file converted to a Dictionary: https://docs.python.org/3/library/csv.html
[
{
"column_name1": string,
"column_name2": string
}
]
Examples: Examples:
@ -67,7 +74,8 @@ import csv
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = 'CSV file parser' description = 'CSV file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -80,7 +88,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -90,14 +98,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Each Dictionary represents a row in the csv file: List of Dictionaries. Each Dictionary represents a row in the csv file.
[
{
csv file converted to a Dictionary
https://docs.python.org/3/library/csv.html
}
]
""" """
# No further processing # No further processing
@ -143,4 +144,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,29 @@ Usage (module):
import jc.parsers.date import jc.parsers.date
result = jc.parsers.date.parse(date_command_output) result = jc.parsers.date.parse(date_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' {
"year": integer,
"month": string,
"month_num": integer,
"day": integer,
"weekday": string,
"weekday_num": integer,
"hour": integer,
"hour_24": integer,
"minute": integer,
"second": integer,
"period": string,
"timezone": string,
"utc_offset": string, # null if timezone field is not UTC
"day_of_year": integer,
"week_of_year": integer,
"iso": string,
"epoch": integer, # naive timestamp
"epoch_utc": integer, # timezone-aware timestamp. Only available if timezone field is UTC
"timezone_aware": boolean # if true, all fields are correctly based on UTC
}
Examples: Examples:
@ -51,7 +71,8 @@ import jc.utils
class info(): class info():
version = '2.0' """Provides parser metadata (version, author, etc.)"""
version = '2.1'
description = '`date` command parser' description = '`date` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -64,7 +85,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -74,28 +95,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"year": integer,
"month": string,
"month_num": integer,
"day": integer,
"weekday": string,
"weekday_num": integer,
"hour": integer,
"hour_24": integer,
"minute": integer,
"second": integer,
"period": string,
"timezone": string,
"utc_offset": string, # null if timezone field is not UTC
"day_of_year": integer,
"week_of_year": integer,
"iso": string,
"epoch": integer, # naive timestamp
"epoch_utc": integer, # timezone-aware timestamp. Only available if timezone field is UTC
"timezone_aware": boolean # if true, all fields are correctly based on UTC
}
""" """
# no further processing # no further processing
return proc_data return proc_data
@ -188,4 +188,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,24 @@ Usage (module):
import jc.parsers.df import jc.parsers.df
result = jc.parsers.df.parse(df_command_output) result = jc.parsers.df.parse(df_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' [
{
"filesystem": string,
"size": string,
"1k_blocks": integer,
"512_blocks": integer,
"used": integer,
"available": integer,
"capacity_percent": integer,
"ifree": integer,
"iused": integer,
"use_percent": integer,
"iused_percent": integer,
"mounted_on": string
}
]
Examples: Examples:
@ -82,7 +97,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.5' """Provides parser metadata (version, author, etc.)"""
version = '1.6'
description = '`df` command parser' description = '`df` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -95,7 +111,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -105,24 +121,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema:
[
{
"filesystem": string,
"size": string,
"1k_blocks": integer,
"512_blocks": integer,
"used": integer,
"available": integer,
"capacity_percent": integer,
"ifree": integer,
"iused": integer,
"use_percent": integer,
"iused_percent": integer,
"mounted_on": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -208,4 +207,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,61 @@ Usage (module):
import jc.parsers.dig import jc.parsers.dig
result = jc.parsers.dig.parse(dig_command_output) result = jc.parsers.dig.parse(dig_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' [
{
"id": integer,
"opcode": string,
"status": string,
"flags": [
string
],
"query_num": integer,
"answer_num": integer,
"authority_num": integer,
"additional_num": integer,
"axfr": [
{
"name": string,
"class": string,
"type": string,
"ttl": integer,
"data": string
}
],
"question": {
"name": string,
"class": string,
"type": string
},
"answer": [
{
"name": string,
"class": string,
"type": string,
"ttl": integer,
"data": string
}
],
"authority": [
{
"name": string,
"class": string,
"type": string,
"ttl": integer,
"data": string
}
],
"query_time": integer, # in msec
"server": string,
"when": string,
"when_epoch": integer, # naive timestamp if when field is parsable, else null
"when_epoch_utc": integer, # timezone aware timestamp availabe for UTC, else null
"rcvd": integer
"size": string
}
]
Examples: Examples:
@ -343,7 +395,8 @@ import jc.utils
class info(): class info():
version = '1.6' """Provides parser metadata (version, author, etc.)"""
version = '1.7'
description = '`dig` command parser' description = '`dig` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -356,7 +409,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -366,61 +419,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"id": integer,
"opcode": string,
"status": string,
"flags": [
string
],
"query_num": integer,
"answer_num": integer,
"authority_num": integer,
"additional_num": integer,
"axfr": [
{
"name": string,
"class": string,
"type": string,
"ttl": integer,
"data": string
}
],
"question": {
"name": string,
"class": string,
"type": string
},
"answer": [
{
"name": string,
"class": string,
"type": string,
"ttl": integer,
"data": string
}
],
"authority": [
{
"name": string,
"class": string,
"type": string,
"ttl": integer,
"data": string
}
],
"query_time": integer, # in msec
"server": string,
"when": string,
"when_epoch": integer, # naive timestamp if when field is parsable, else null
"when_epoch_utc": integer, # timezone aware timestamp availabe for UTC, else null
"rcvd": integer
"size": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -472,7 +471,7 @@ def process(proc_data):
return proc_data return proc_data
def parse_header(header): def _parse_header(header):
# ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 6140 # ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 6140
header = header.split() header = header.split()
opcode = header[3].rstrip(',') opcode = header[3].rstrip(',')
@ -484,7 +483,7 @@ def parse_header(header):
'status': status} 'status': status}
def parse_flags_line(flagsline): def _parse_flags_line(flagsline):
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 # ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
flagsline = flagsline.split(';') flagsline = flagsline.split(';')
flags = flagsline.pop(0) flags = flagsline.pop(0)
@ -508,7 +507,7 @@ def parse_flags_line(flagsline):
'additional_num': additional_num} 'additional_num': additional_num}
def parse_question(question): def _parse_question(question):
# ;www.cnn.com. IN A # ;www.cnn.com. IN A
question = question.split() question = question.split()
dns_name = question[0].lstrip(';') dns_name = question[0].lstrip(';')
@ -520,7 +519,7 @@ def parse_question(question):
'type': dns_type} 'type': dns_type}
def parse_authority(authority): def _parse_authority(authority):
# cnn.com. 3600 IN NS ns-1086.awsdns-07.org. # cnn.com. 3600 IN NS ns-1086.awsdns-07.org.
authority = authority.split() authority = authority.split()
authority_name = authority[0] authority_name = authority[0]
@ -536,7 +535,7 @@ def parse_authority(authority):
'data': authority_data} 'data': authority_data}
def parse_answer(answer): def _parse_answer(answer):
# www.cnn.com. 5 IN CNAME turner-tls.map.fastly.net. # www.cnn.com. 5 IN CNAME turner-tls.map.fastly.net.
answer = answer.split(maxsplit=4) answer = answer.split(maxsplit=4)
answer_name = answer[0] answer_name = answer[0]
@ -556,7 +555,7 @@ def parse_answer(answer):
'data': answer_data} 'data': answer_data}
def parse_axfr(axfr): def _parse_axfr(axfr):
# ; <<>> DiG 9.11.14-3-Debian <<>> @81.4.108.41 axfr zonetransfer.me +nocookie # ; <<>> DiG 9.11.14-3-Debian <<>> @81.4.108.41 axfr zonetransfer.me +nocookie
# ; (1 server found) # ; (1 server found)
# ;; global options: +cmd # ;; global options: +cmd
@ -617,17 +616,17 @@ def parse(data, raw=False, quiet=False):
continue continue
if ';' not in line and axfr: if ';' not in line and axfr:
axfr_list.append(parse_axfr(line)) axfr_list.append(_parse_axfr(line))
output_entry.update({'axfr': axfr_list}) output_entry.update({'axfr': axfr_list})
continue continue
if line.startswith(';; ->>HEADER<<-'): if line.startswith(';; ->>HEADER<<-'):
output_entry = {} output_entry = {}
output_entry.update(parse_header(line)) output_entry.update(_parse_header(line))
continue continue
if line.startswith(';; flags:'): if line.startswith(';; flags:'):
output_entry.update(parse_flags_line(line)) output_entry.update(_parse_flags_line(line))
continue continue
if line.startswith(';; QUESTION SECTION:'): if line.startswith(';; QUESTION SECTION:'):
@ -638,7 +637,7 @@ def parse(data, raw=False, quiet=False):
continue continue
if question: if question:
output_entry['question'] = parse_question(line) output_entry['question'] = _parse_question(line)
question = False question = False
authority = False authority = False
answer = False answer = False
@ -654,7 +653,7 @@ def parse(data, raw=False, quiet=False):
continue continue
if ';' not in line and authority: if ';' not in line and authority:
authority_list.append(parse_authority(line)) authority_list.append(_parse_authority(line))
output_entry.update({'authority': authority_list}) output_entry.update({'authority': authority_list})
continue continue
@ -667,7 +666,7 @@ def parse(data, raw=False, quiet=False):
continue continue
if ';' not in line and answer: if ';' not in line and answer:
answer_list.append(parse_answer(line)) answer_list.append(_parse_answer(line))
output_entry.update({'answer': answer_list}) output_entry.update({'answer': answer_list})
continue continue
@ -704,4 +703,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -21,9 +21,19 @@ Usage (module):
import jc.parsers.dir import jc.parsers.dir
result = jc.parsers.dir.parse(dir_command_output) result = jc.parsers.dir.parse(dir_command_output)
Compatibility: Schema:
'win32' [
{
"date": string,
"time": string,
"epoch": integer, # naive timestamp
"dir": boolean,
"size": integer,
"filename: string,
"parent": string
}
]
Examples: Examples:
@ -110,7 +120,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`dir` command parser' description = '`dir` command parser'
author = 'Rasheed Elsaleh' author = 'Rasheed Elsaleh'
author_email = 'rasheed@rebelliondefense.com' author_email = 'rasheed@rebelliondefense.com'
@ -123,7 +134,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -133,19 +144,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"date": string,
"time": string,
"epoch": integer, # naive timestamp
"dir": boolean,
"size": integer,
"filename: string,
"parent": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
# add timestamps # add timestamps
@ -216,4 +215,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,22 @@ Usage (module):
import jc.parsers.dmidecode import jc.parsers.dmidecode
result = jc.parsers.dmidecode.parse(dmidecode_command_output) result = jc.parsers.dmidecode.parse(dmidecode_command_output)
Compatibility: Schema:
'linux' [
{
"handle": string,
"type": integer,
"bytes": integer,
"description": string,
"values": { (null if empty)
"lowercase_no_spaces_keys": string,
"multiline_key_values": [
string,
]
}
}
]
Examples: Examples:
@ -111,7 +124,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`dmidecode` command parser' description = '`dmidecode` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -125,7 +139,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -135,22 +149,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"handle": string,
"type": integer,
"bytes": integer,
"description": string,
"values": { (null if empty)
"lowercase_no_spaces_keys": string,
"multiline_key_values": [
string,
]
}
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['type', 'bytes'] int_list = ['type', 'bytes']
@ -347,4 +346,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -14,12 +14,23 @@ Usage (cli):
Usage (module): Usage (module):
import jc.parsers.dpkg import jc.parsers.dpkg_l
result = jc.parsers.dpkg.parse(dpkg_command_output) result = jc.parsers.dpkg_l.parse(dpkg_command_output)
Compatibility: Schema:
'linux' [
{
"codes": string,
"name": string,
"version": string,
"architecture": string,
"description": string,
"desired": string,
"status": string,
"error": string
}
]
Examples: Examples:
@ -119,7 +130,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`dpkg -l` command parser' description = '`dpkg -l` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -133,7 +145,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -143,20 +155,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema:
[
{
"codes": string,
"name": string,
"version": string,
"architecture": string,
"description": string,
"desired": string,
"status": string,
"error": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
if 'codes' in entry: if 'codes' in entry:
@ -245,4 +244,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,14 @@ Usage (module):
import jc.parsers.du import jc.parsers.du
result = jc.parsers.du.parse(du_command_output) result = jc.parsers.du.parse(du_command_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' [
{
"size": integer,
"name": string
}
]
Examples: Examples:
@ -82,7 +87,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`du` command parser' description = '`du` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -96,7 +102,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -106,14 +112,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"size": integer,
"name": string
}
]
""" """
int_list = ['size'] int_list = ['size']
for entry in proc_data: for entry in proc_data:
@ -158,4 +157,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,14 @@ Usage (module):
import jc.parsers.env import jc.parsers.env
result = jc.parsers.env.parse(env_command_output) result = jc.parsers.env.parse(env_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' [
{
"name": string,
"value": string
}
]
Examples: Examples:
@ -63,7 +68,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`env` command parser' description = '`env` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -76,7 +82,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -86,14 +92,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"name": string,
"value": string
}
]
""" """
# rebuild output for added semantic information # rebuild output for added semantic information
@ -139,4 +138,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,14 @@ Usage (module):
import jc.parsers.file import jc.parsers.file
result = jc.parsers.file.parse(file_command_output) result = jc.parsers.file.parse(file_command_output)
Compatibility: Schema:
'linux', 'aix', 'freebsd', 'darwin' [
{
"filename": string,
"type ": string
}
]
Examples: Examples:
@ -57,7 +62,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`file` command parser' description = '`file` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -70,7 +76,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -80,14 +86,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"filename": string,
"type ": string
}
]
""" """
# No further processing # No further processing
return proc_data return proc_data
@ -137,4 +136,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,23 @@ Usage (module):
import jc.parsers.finger import jc.parsers.finger
result = jc.parsers.finger.parse(finger_command_output) result = jc.parsers.finger.parse(finger_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', freebsd' [
{
"login": string,
"name": string,
"tty": string,
"idle": string, # null if empty
"login_time": string,
"details": string,
"tty_writeable": boolean,
"idle_minutes": integer,
"idle_hours": integer,
"idle_days": integer,
"total_idle_minutes": integer
}
]
Examples: Examples:
@ -77,7 +91,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`finger` command parser' description = '`finger` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -91,7 +106,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -101,23 +116,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"login": string,
"name": string,
"tty": string,
"idle": string, # null if empty
"login_time": string,
"details": string,
"tty_writeable": boolean,
"idle_minutes": integer,
"idle_hours": integer,
"idle_days": integer,
"total_idle_minutes": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
if 'tty' in entry: if 'tty' in entry:
@ -212,4 +211,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,15 @@ Usage (module):
import jc.parsers.foo import jc.parsers.foo
result = jc.parsers.foo.parse(foo_command_output) result = jc.parsers.foo.parse(foo_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' [
{
"foo": string,
"bar": boolean,
"baz": integer
}
]
Examples: Examples:
@ -31,6 +37,7 @@ import jc.utils
class info(): class info():
"""Provides parser metadata (version, author, etc.)"""
version = '1.0' version = '1.0'
description = '`foo` command parser' description = '`foo` command parser'
author = 'John Doe' author = 'John Doe'
@ -45,7 +52,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -55,15 +62,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured to conform to the schema.
[
{
"foo": string,
"bar": boolean,
"baz": integer
}
]
""" """
# rebuild output for added semantic information # rebuild output for added semantic information
@ -98,4 +97,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,19 @@ Usage (module):
import jc.parsers.free import jc.parsers.free
result = jc.parsers.free.parse(free_command_output) result = jc.parsers.free.parse(free_command_output)
Compatibility: Schema:
'linux' [
{
"type": string,
"total": integer,
"used": integer,
"free": integer,
"shared": integer,
"buff_cache": integer,
"available": integer
}
]
Examples: Examples:
@ -62,7 +72,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`free` command parser' description = '`free` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -75,7 +86,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -85,19 +96,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"type": string,
"total": integer,
"used": integer,
"free": integer,
"shared": integer,
"buff_cache": integer,
"available": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -147,4 +146,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,18 @@ Usage (module):
import jc.parsers.fstab import jc.parsers.fstab
result = jc.parsers.fstab.parse(fstab_command_output) result = jc.parsers.fstab.parse(fstab_command_output)
Compatibility: Schema:
'linux', 'freebsd' [
{
"fs_spec": string,
"fs_file": string,
"fs_vfstype": string,
"fs_mntops": string,
"fs_freq": integer,
"fs_passno": integer
}
]
Examples: Examples:
@ -75,7 +84,8 @@ import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`/etc/fstab` file parser' description = '`/etc/fstab` file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -87,7 +97,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -97,18 +107,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"fs_spec": string,
"fs_file": string,
"fs_vfstype": string,
"fs_mntops": string,
"fs_freq": integer,
"fs_passno": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['fs_freq', 'fs_passno'] int_list = ['fs_freq', 'fs_passno']
@ -174,4 +173,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,18 @@ Usage (module):
import jc.parsers.group import jc.parsers.group
result = jc.parsers.group.parse(group_file_output) result = jc.parsers.group.parse(group_file_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' [
{
"group_name": string,
"password": string,
"gid": integer,
"members": [
string
]
}
]
Examples: Examples:
@ -99,7 +108,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`/etc/group` file parser' description = '`/etc/group` file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -112,7 +122,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -122,18 +132,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"group_name": string,
"password": string,
"gid": integer,
"members": [
string
]
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['gid'] int_list = ['gid']
@ -193,4 +192,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,20 @@ Usage (module):
import jc.parsers.gshadow import jc.parsers.gshadow
result = jc.parsers.gshadow.parse(gshadow_file_output) result = jc.parsers.gshadow.parse(gshadow_file_output)
Compatibility: Schema:
'linux', 'aix', 'freebsd' [
{
"group_name": string,
"password": string,
"administrators": [
string
],
"members": [
string
]
}
]
Examples: Examples:
@ -65,7 +76,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`/etc/gshadow` file parser' description = '`/etc/gshadow` file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -78,7 +90,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -88,20 +100,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"group_name": string,
"password": string,
"administrators": [
string
],
"members": [
string
]
}
]
""" """
for entry in proc_data: for entry in proc_data:
if entry['administrators'] == ['']: if entry['administrators'] == ['']:
@ -155,4 +154,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,14 @@ Usage (module):
import jc.parsers.hash import jc.parsers.hash
result = jc.parsers.hash.parse(hash_command_output) result = jc.parsers.hash.parse(hash_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"command": string,
"hits": integer
}
]
Examples: Examples:
@ -32,7 +37,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`hash` command parser' description = '`hash` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -44,7 +50,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -54,14 +60,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"command": string,
"hits": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
# change to int # change to int
@ -105,4 +104,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -23,9 +23,14 @@ Usage (module):
import jc.parsers.hashsum import jc.parsers.hashsum
result = jc.parsers.hashsum.parse(md5sum_command_output) result = jc.parsers.hashsum.parse(md5sum_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"filename": string,
"hash": string,
}
]
Examples: Examples:
@ -62,7 +67,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = 'hashsum command parser (`md5sum`, `shasum`, etc.)' description = 'hashsum command parser (`md5sum`, `shasum`, etc.)'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -76,7 +82,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -86,14 +92,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"filename": string,
"hash": string,
}
]
""" """
# no further processing for this parser # no further processing for this parser
@ -142,4 +141,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,56 @@ Usage (module):
import jc.parsers.hciconfig import jc.parsers.hciconfig
result = jc.parsers.hciconfig.parse(hciconfig_command_output) result = jc.parsers.hciconfig.parse(hciconfig_command_output)
Compatibility: Schema:
'linux' [
{
"device": string,
"type": string,
"bus": string,
"bd_address": string,
"acl_mtu": integer,
"acl_mtu_packets": integer,
"sco_mtu": integer,
"sco_mtu_packets": integer,
"state": [
string
],
"rx_bytes": integer,
"rx_acl": integer,
"rx_sco": integer,
"rx_events": integer,
"rx_errors": integer,
"tx_bytes": integer,
"tx_acl": integer,
"tx_sco": integer,
"tx_commands": integer,
"tx_errors": integer,
"features": [
string
],
"packet_type": [
string
],
"link_policy": [
string
],
"link_mode": [
string
],
"name": string,
"class": string,
"service_classes": [
string # 'Unspecified' is null
],
"device_class": string,
"hci_version": string,
"hci_revision": string,
"lmp_version": string,
"lmp_subversion": string,
"manufacturer": string
}
]
Examples: Examples:
@ -269,7 +316,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`hciconfig` command parser' description = '`hciconfig` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -283,7 +331,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -293,56 +341,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"device": string,
"type": string,
"bus": string,
"bd_address": string,
"acl_mtu": integer,
"acl_mtu_packets": integer,
"sco_mtu": integer,
"sco_mtu_packets": integer,
"state": [
string
],
"rx_bytes": integer,
"rx_acl": integer,
"rx_sco": integer,
"rx_events": integer,
"rx_errors": integer,
"tx_bytes": integer,
"tx_acl": integer,
"tx_sco": integer,
"tx_commands": integer,
"tx_errors": integer,
"features": [
string
],
"packet_type": [
string
],
"link_policy": [
string
],
"link_mode": [
string
],
"name": string,
"class": string,
"service_classes": [
string # 'Unspecified' is null
],
"device_class": string,
"hci_version": string,
"hci_revision": string,
"lmp_version": string,
"lmp_subversion": string,
"manufacturer": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -526,4 +525,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -11,9 +11,14 @@ Usage (module):
import jc.parsers.history import jc.parsers.history
result = jc.parsers.history.parse(history_command_output) result = jc.parsers.history.parse(history_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"line": integer,
"command": string
}
]
Examples: Examples:
@ -51,7 +56,8 @@ import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`history` command parser' description = '`history` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -64,7 +70,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -74,14 +80,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"line": integer,
"command": string
}
]
""" """
# rebuild output for added semantic information # rebuild output for added semantic information
@ -132,4 +131,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,16 @@ Usage (module):
import jc.parsers.hosts import jc.parsers.hosts
result = jc.parsers.hosts.parse(hosts_file_output) result = jc.parsers.hosts.parse(hosts_file_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' [
{
"ip": string,
"hostname": [
string
]
}
]
Examples: Examples:
@ -66,7 +73,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`/etc/hosts` file parser' description = '`/etc/hosts` file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -78,7 +86,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -88,16 +96,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"ip": string,
"hostname": [
string
]
}
]
""" """
# no additional processing needed # no additional processing needed
@ -157,4 +156,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,34 @@ Usage (module):
import jc.parsers.id import jc.parsers.id
result = jc.parsers.id.parse(id_command_output) result = jc.parsers.id.parse(id_command_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' {
"uid": {
"id": integer,
"name": string
},
"gid": {
"id": integer,
"name": string
},
"groups": [
{
"id": integer,
"name": string
},
{
"id": integer,
"name": string
}
],
"context": {
"user": string,
"role": string,
"type": string,
"level": string
}
}
Examples: Examples:
@ -79,7 +104,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`id` command parser' description = '`id` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -93,7 +119,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -103,34 +129,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"uid": {
"id": integer,
"name": string
},
"gid": {
"id": integer,
"name": string
},
"groups": [
{
"id": integer,
"name": string
},
{
"id": integer,
"name": string
}
],
"context": {
"user": string,
"role": string,
"type": string,
"level": string
}
}
""" """
if 'uid' in proc_data: if 'uid' in proc_data:
if 'id' in proc_data['uid']: if 'id' in proc_data['uid']:
@ -221,4 +220,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,40 @@ Usage (module):
import jc.parsers.ifconfig import jc.parsers.ifconfig
result = jc.parsers.ifconfig.parse(ifconfig_command_output) result = jc.parsers.ifconfig.parse(ifconfig_command_output)
Compatibility: Schema:
'linux', 'aix', 'freebsd', 'darwin' [
{
"name": string,
"flags": integer,
"state": [
string
],
"mtu": integer,
"ipv4_addr": string,
"ipv4_mask": string,
"ipv4_bcast": string,
"ipv6_addr": string,
"ipv6_mask": integer,
"ipv6_scope": string,
"mac_addr": string,
"type": string,
"rx_packets": integer,
"rx_bytes": integer,
"rx_errors": integer,
"rx_dropped": integer,
"rx_overruns": integer,
"rx_frame": integer,
"tx_packets": integer,
"tx_bytes": integer,
"tx_errors": integer,
"tx_dropped": integer,
"tx_overruns": integer,
"tx_carrier": integer,
"tx_collisions": integer,
"metric": integer
}
]
Examples: Examples:
@ -156,7 +187,8 @@ import jc.utils
class info(): class info():
version = '1.8' """Provides parser metadata (version, author, etc.)"""
version = '1.9'
description = '`ifconfig` command parser' description = '`ifconfig` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -170,7 +202,8 @@ class info():
__version__ = info.version __version__ = info.version
class IfconfigParser(object): class _IfconfigParser(object):
"""ifconfig parser module written by threeheadedknight@protonmail.com"""
# Author: threeheadedknight@protonmail.com # Author: threeheadedknight@protonmail.com
# Date created: 30.06.2018 17:03 # Date created: 30.06.2018 17:03
# Python Version: 3.7 # Python Version: 3.7
@ -374,7 +407,7 @@ class IfconfigParser(object):
@staticmethod @staticmethod
def update_interface_details(interface): def update_interface_details(interface):
for attr in IfconfigParser.attributes: for attr in _IfconfigParser.attributes:
if attr not in interface: if attr not in interface:
interface[attr] = None interface[attr] = None
return namedtuple('Interface', interface.keys())(**interface) return namedtuple('Interface', interface.keys())(**interface)
@ -384,7 +417,7 @@ class InterfaceNotFound(Exception):
pass pass
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -394,40 +427,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"name": string,
"flags": integer,
"state": [
string
],
"mtu": integer,
"ipv4_addr": string,
"ipv4_mask": string,
"ipv4_bcast": string,
"ipv6_addr": string,
"ipv6_mask": integer,
"ipv6_scope": string,
"mac_addr": string,
"type": string,
"rx_packets": integer,
"rx_bytes": integer,
"rx_errors": integer,
"rx_dropped": integer,
"rx_overruns": integer,
"rx_frame": integer,
"tx_packets": integer,
"tx_bytes": integer,
"tx_errors": integer,
"tx_dropped": integer,
"tx_overruns": integer,
"tx_carrier": integer,
"tx_collisions": integer,
"metric": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['flags', 'mtu', 'ipv6_mask', 'rx_packets', 'rx_bytes', 'rx_errors', 'rx_dropped', 'rx_overruns', int_list = ['flags', 'mtu', 'ipv6_mask', 'rx_packets', 'rx_bytes', 'rx_errors', 'rx_dropped', 'rx_overruns',
@ -484,7 +484,7 @@ def parse(data, raw=False, quiet=False):
if jc.utils.has_data(data): if jc.utils.has_data(data):
parsed = IfconfigParser(console_output=data) parsed = _IfconfigParser(console_output=data)
interfaces = parsed.get_interfaces() interfaces = parsed.get_interfaces()
# convert ifconfigparser output to a dictionary # convert ifconfigparser output to a dictionary
@ -496,4 +496,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,18 @@ Usage (module):
import jc.parsers.ini import jc.parsers.ini
result = jc.parsers.ini.parse(ini_file_output) result = jc.parsers.ini.parse(ini_file_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' ini or key/value document converted to a dictionary - see configparser standard
library documentation for more details.
Note: Values starting and ending with quotation marks will have the marks removed.
If you would like to keep the quotation marks, use the -r or raw=True argument.
{
"key1": string,
"key2": string
}
Examples: Examples:
@ -56,7 +65,8 @@ import configparser
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = 'INI file parser' description = 'INI file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -69,7 +79,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -79,15 +89,7 @@ def process(proc_data):
Returns: Returns:
Dictionary representing an ini or simple key/value pair document: Dictionary representing an ini or simple key/value pair document.
{
ini or key/value document converted to a dictionary - see configparser standard
library documentation for more details.
Note: Values starting and ending with quotation marks will have the marks removed.
If you would like to keep the quotation marks, use the -r or raw=True argument.
}
""" """
# remove quotation marks from beginning and end of values # remove quotation marks from beginning and end of values
for heading in proc_data: for heading in proc_data:
@ -145,4 +147,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,28 @@ Usage (module):
import jc.parsers.iptables import jc.parsers.iptables
result = jc.parsers.iptables.parse(iptables_command_output) result = jc.parsers.iptables.parse(iptables_command_output)
Compatibility: Schema:
'linux' [
{
"chain": string,
"rules": [
{
"num" integer,
"pkts": integer,
"bytes": integer, # converted based on suffix
"target": string,
"prot": string,
"opt": string, # "--" = Null
"in": string,
"out": string,
"source": string,
"destination": string,
"options": string
}
]
}
]
Examples: Examples:
@ -143,7 +162,8 @@ import jc.utils
class info(): class info():
version = '1.4' """Provides parser metadata (version, author, etc.)"""
version = '1.5'
description = '`iptables` command parser' description = '`iptables` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -156,7 +176,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -166,28 +186,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"chain": string,
"rules": [
{
"num" integer,
"pkts": integer,
"bytes": integer, # converted based on suffix
"target": string,
"prot": string,
"opt": string, # "--" = Null
"in": string,
"out": string,
"source": string,
"destination": string,
"options": string
}
]
}
]
""" """
for entry in proc_data: for entry in proc_data:
for rule in entry['rules']: for rule in entry['rules']:
@ -289,4 +288,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,15 @@ Usage (module):
import jc.parsers.iw-scan import jc.parsers.iw-scan
result = jc.parsers.iw-scan.parse(iw-scan_command_output) result = jc.parsers.iw-scan.parse(iw-scan_command_output)
Compatibility: Schema:
'linux' [
{
"foo": string/integer/float, # best guess based on value
"bar": string/integer/float,
"baz": string/integer/float
}
]
Examples: Examples:
@ -114,7 +120,8 @@ import jc.utils
class info(): class info():
version = '0.5' """Provides parser metadata (version, author, etc.)"""
version = '0.6'
description = '`iw dev [device] scan` command parser' description = '`iw dev [device] scan` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -128,7 +135,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -138,14 +145,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"foo": string/integer/float, # best guess based on value
"bar": string/integer/float,
"baz": string/integer/float
}
]
""" """
# convert ints and floats for top-level keys # convert ints and floats for top-level keys
@ -174,7 +174,7 @@ def process(proc_data):
return proc_data return proc_data
def post_parse(data): def _post_parse(data):
# remove empty items # remove empty items
cleandata = [] cleandata = []
for ssid in data: for ssid in data:
@ -276,7 +276,7 @@ def post_parse(data):
item['vht_tx_highest_supported_mbps'] = item['vht_tx_highest_supported'].replace(' Mbps', '') item['vht_tx_highest_supported_mbps'] = item['vht_tx_highest_supported'].replace(' Mbps', '')
del item['vht_tx_highest_supported'] del item['vht_tx_highest_supported']
return process(cleandata) return _process(cleandata)
def parse(data, raw=False, quiet=False): def parse(data, raw=False, quiet=False):
@ -331,4 +331,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return post_parse(raw_output) return _post_parse(raw_output)

View File

@ -15,9 +15,17 @@ Usage (module):
import jc.parsers.jobs import jc.parsers.jobs
result = jc.parsers.jobs.parse(jobs_command_output) result = jc.parsers.jobs.parse(jobs_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"job_number": integer,
"pid": integer,
"history": string,
"status": string,
"command": string
}
]
Example: Example:
@ -86,7 +94,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`jobs` command parser' description = '`jobs` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -99,7 +108,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -109,17 +118,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"job_number": integer,
"pid": integer,
"history": string,
"status": string,
"command": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['job_number', 'pid'] int_list = ['job_number', 'pid']
@ -208,4 +207,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -4,7 +4,6 @@ Supports files containing simple key/value pairs. Delimiter can be `=` or `:`. M
Note: Values starting and ending with quotation marks will have the marks removed. If you would like to keep the quotation marks, use the `-r` command-line argument or the `raw=True` argument in `parse()`. Note: Values starting and ending with quotation marks will have the marks removed. If you would like to keep the quotation marks, use the `-r` command-line argument or the `raw=True` argument in `parse()`.
Usage (cli): Usage (cli):
$ cat foo.txt | jc --kv $ cat foo.txt | jc --kv
@ -14,9 +13,14 @@ Usage (module):
import jc.parsers.kv import jc.parsers.kv
result = jc.parsers.kv.parse(kv_file_output) result = jc.parsers.kv.parse(kv_file_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' key/value document converted to a dictionary - see configparser standard library documentation for more details.
{
"key1": string,
"key2": string
}
Examples: Examples:
@ -42,7 +46,8 @@ Examples:
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = 'Key/Value file parser' description = 'Key/Value file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'

View File

@ -17,9 +17,21 @@ Usage (module):
import jc.parsers.last import jc.parsers.last
result = jc.parsers.last.parse(last_command_output) result = jc.parsers.last.parse(last_command_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' [
{
"user": string,
"tty": string,
"hostname": string,
"login": string,
"logout": string,
"duration": string,
"login_epoch": integer, # (naive) available with last -F option
"logout_epoch": integer, # (naive) available with last -F option
"duration_seconds": integer # available with last -F option
}
]
Examples: Examples:
@ -91,7 +103,8 @@ import jc.utils
class info(): class info():
version = '1.5' """Provides parser metadata (version, author, etc.)"""
version = '1.6'
description = '`last` and `lastb` command parser' description = '`last` and `lastb` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -105,7 +118,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -115,21 +128,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"user": string,
"tty": string,
"hostname": string,
"login": string,
"logout": string,
"duration": string,
"login_epoch": integer, # (naive) available with last -F option
"logout_epoch": integer, # (naive) available with last -F option
"duration_seconds": integer # available with last -F option
}
]
""" """
for entry in proc_data: for entry in proc_data:
if 'user' in entry and entry['user'] == 'boot_time': if 'user' in entry and entry['user'] == 'boot_time':
@ -253,4 +252,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -24,9 +24,22 @@ Usage (module):
import jc.parsers.ls import jc.parsers.ls
result = jc.parsers.ls.parse(ls_command_output) result = jc.parsers.ls.parse(ls_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"filename": string,
"flags": string,
"links": integer,
"parent": string,
"owner": string,
"group": string,
"size": integer,
"date": string,
"epoch": integer, # naive timestamp if date field exists and can be converted
"epoch_utc": integer # timezone aware timestamp if date field is in UTC and can be converted
}
]
Examples: Examples:
@ -38,12 +51,6 @@ Examples:
{ {
"filename": "arch" "filename": "arch"
}, },
{
"filename": "awk"
},
{
"filename": "base64"
},
... ...
] ]
@ -68,15 +75,6 @@ Examples:
"size": 62744, "size": 62744,
"date": "Aug 8 16:14" "date": "Aug 8 16:14"
}, },
{
"filename": "arch",
"flags": "-rwxr-xr-x.",
"links": 1,
"owner": "root",
"group": "root",
"size": 33080,
"date": "Aug 19 23:25"
},
... ...
] ]
@ -101,63 +99,16 @@ Examples:
"size": "33080", "size": "33080",
"date": "Aug 19 23:25" "date": "Aug 19 23:25"
}, },
{
"filename": "awk",
"link_to": "gawk",
"flags": "lrwxrwxrwx.",
"links": "1",
"owner": "root",
"group": "root",
"size": "4",
"date": "Aug 15 10:53"
},
{
"filename": "base64",
"flags": "-rwxr-xr-x.",
"links": "1",
"owner": "root",
"group": "root",
"size": "37360",
"date": "Aug 19 23:25"
},
{
"filename": "basename",
"flags": "-rwxr-xr-x.",
"links": "1",
"owner": "root",
"group": "root",
"size": "29032",
"date": "Aug 19 23:25"
},
{
"filename": "bash",
"flags": "-rwxr-xr-x.",
"links": "1",
"owner": "root",
"group": "root",
"size": "964600",
"date": "Aug 8 05:06"
},
... ...
] ]
$ ls -l /usr/bin | jc --ls | jq '.[] | select(.size > 50000000)'
{
"filename": "emacs",
"flags": "-r-xr-xr-x",
"links": 1,
"owner": "root",
"group": "wheel",
"size": 117164432,
"date": "May 3 2019"
}
""" """
import re import re
import jc.utils import jc.utils
class info(): class info():
version = '1.7' """Provides parser metadata (version, author, etc.)"""
version = '1.8'
description = '`ls` command parser' description = '`ls` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -170,7 +121,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -180,22 +131,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"filename": string,
"flags": string,
"links": integer,
"parent": string,
"owner": string,
"group": string,
"size": integer,
"date": string,
"epoch": integer, # naive timestamp if date field exists and can be converted
"epoch_utc": integer # timezone aware timestamp if date field is in UTC and can be converted
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['links', 'size'] int_list = ['links', 'size']
@ -337,4 +273,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,52 @@ Usage (module):
import jc.parsers.lsblk import jc.parsers.lsblk
result = jc.parsers.lsblk.parse(lsblk_command_output) result = jc.parsers.lsblk.parse(lsblk_command_output)
Compatibility: Schema:
'linux' [
{
"name": string,
"maj_min": string,
"rm": boolean,
"size": string,
"ro": boolean,
"type": string,
"mountpoint": string,
"kname": string,
"fstype": string,
"label": string,
"uuid": string,
"partlabel": string,
"partuuid": string,
"ra": integer,
"model": string,
"serial": string,
"state": string,
"owner": string,
"group": string,
"mode": string,
"alignment": integer,
"min_io": integer,
"opt_io": integer,
"phy_sec": integer,
"log_sec": integer,
"rota": boolean,
"sched": string,
"rq_size": integer,
"disc_aln": integer,
"disc_gran": string,
"disc_max": string,
"disc_zero": boolean,
"wsame": string,
"wwn": string,
"rand": boolean,
"pkname": string,
"hctl": string,
"tran": string,
"rev": string,
"vendor": string
}
]
Examples: Examples:
@ -225,7 +268,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.5' """Provides parser metadata (version, author, etc.)"""
version = '1.6'
description = '`lsblk` command parser' description = '`lsblk` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -238,7 +282,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -248,52 +292,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"name": string,
"maj_min": string,
"rm": boolean,
"size": string,
"ro": boolean,
"type": string,
"mountpoint": string,
"kname": string,
"fstype": string,
"label": string,
"uuid": string,
"partlabel": string,
"partuuid": string,
"ra": integer,
"model": string,
"serial": string,
"state": string,
"owner": string,
"group": string,
"mode": string,
"alignment": integer,
"min_io": integer,
"opt_io": integer,
"phy_sec": integer,
"log_sec": integer,
"rota": boolean,
"sched": string,
"rq_size": integer,
"disc_aln": integer,
"disc_gran": string,
"disc_max": string,
"disc_zero": boolean,
"wsame": string,
"wwn": string,
"rand": boolean,
"pkname": string,
"hctl": string,
"tran": string,
"rev": string,
"vendor": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
# boolean changes # boolean changes
@ -357,4 +356,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,18 @@ Usage (module):
import jc.parsers.lsmod import jc.parsers.lsmod
result = jc.parsers.lsmod.parse(lsmod_command_output) result = jc.parsers.lsmod.parse(lsmod_command_output)
Compatibility: Schema:
'linux' [
{
"module": string,
"size": integer,
"used": integer,
"by": [
string
]
}
]
Examples: Examples:
@ -116,7 +125,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`lsmod` command parser' description = '`lsmod` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -129,7 +139,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -139,18 +149,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"module": string,
"size": integer,
"used": integer,
"by": [
string
]
}
]
""" """
for entry in proc_data: for entry in proc_data:
# integer changes # integer changes
@ -199,4 +198,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,22 @@ Usage (module):
import jc.parsers.lsof import jc.parsers.lsof
result = jc.parsers.lsof.parse(lsof_command_output) result = jc.parsers.lsof.parse(lsof_command_output)
Compatibility: Schema:
'linux' [
{
"command": string,
"pid": integer,
"tid": integer,
"user": string,
"fd": string,
"type": string,
"device": string,
"size_off": integer,
"node": integer,
"name": string
}
]
Examples: Examples:
@ -106,7 +119,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`lsof` command parser' description = '`lsof` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -119,7 +133,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -129,22 +143,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"command": string,
"pid": integer,
"tid": integer,
"user": string,
"fd": string,
"type": string,
"device": string,
"size_off": integer,
"node": integer,
"name": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
# integer changes # integer changes
@ -191,4 +190,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,18 @@ Usage (module):
import jc.parsers.mount import jc.parsers.mount
result = jc.parsers.mount.parse(mount_command_output) result = jc.parsers.mount.parse(mount_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' [
{
"filesystem": string,
"mount_point": string,
"type": string,
"access": [
string
]
}
]
Example: Example:
@ -65,7 +74,8 @@ import jc.utils
class info(): class info():
version = '1.5' """Provides parser metadata (version, author, etc.)"""
version = '1.6'
description = '`mount` command parser' description = '`mount` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -78,7 +88,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -88,24 +98,13 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"filesystem": string,
"mount_point": string,
"type": string,
"access": [
string
]
}
]
""" """
# nothing to process # nothing to process
return proc_data return proc_data
def osx_parse(data): def _osx_parse(data):
output = [] output = []
for entry in data: for entry in data:
@ -130,7 +129,7 @@ def osx_parse(data):
return output return output
def linux_parse(data): def _linux_parse(data):
output = [] output = []
for entry in data: for entry in data:
@ -175,12 +174,12 @@ def parse(data, raw=False, quiet=False):
# check for OSX output # check for OSX output
if ' type ' not in cleandata[0]: if ' type ' not in cleandata[0]:
raw_output = osx_parse(cleandata) raw_output = _osx_parse(cleandata)
else: else:
raw_output = linux_parse(cleandata) raw_output = _linux_parse(cleandata)
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,106 @@ Usage (module):
import jc.parsers.netstat import jc.parsers.netstat
result = jc.parsers.netstat.parse(netstat_command_output) result = jc.parsers.netstat.parse(netstat_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' [
{
"proto": string,
"recv_q": integer,
"send_q": integer,
"transport_protocol" string,
"network_protocol": string,
"local_address": string,
"local_port": string,
"local_port_num": integer,
"foreign_address": string,
"foreign_port": string,
"foreign_port_num": integer,
"state": string,
"program_name": string,
"pid": integer,
"user": string,
"security_context": string,
"refcnt": integer,
"flags": string,
"type": string,
"inode": integer,
"path": string,
"kind": string,
"address": string,
"unix_inode": string,
"conn": string,
"refs": string,
"nextref": string,
"name": string,
"unit": integer,
"vendor": integer,
"class": integer,
"subcla": integer,
"unix_flags": integer,
"pcbcount": integer,
"rcvbuf": integer,
"sndbuf": integer,
"rxbytes": integer,
"txbytes": integer,
"destination": string,
"gateway": string,
"route_flags": string,
"route_flags_pretty": [
string,
]
"route_refs": integer,
"use": integer,
"mtu": integer,
"expire": string,
"genmask": string,
"mss": integer,
"window": integer,
"irtt": integer,
"iface": string,
"metric": integer,
"network": string,
"address": string,
"ipkts": integer, # - = null
"ierrs": integer, # - = null
"idrop": integer, # - = null
"opkts": integer, # - = null
"oerrs": integer, # - = null
"coll": integer, # - = null
"rx_ok": integer,
"rx_err": integer,
"rx_drp": integer,
"rx_ovr": integer,
"tx_ok": integer,
"tx_err": integer,
"tx_drp": integer,
"tx_ovr": integer,
"flg": string,
"ibytes": integer,
"obytes": integer,
"r_mbuf": integer,
"s_mbuf": integer,
"r_clus": integer,
"s_clus": integer,
"r_hiwa": integer,
"s_hiwa": integer,
"r_lowa": integer,
"s_lowa": integer,
"r_bcnt": integer,
"s_bcnt": integer,
"r_bmax": integer,
"s_bmax": integer,
"rexmit": integer,
"ooorcv": integer,
"0_win": integer,
"rexmt": float,
"persist": float,
"keep": float,
"2msl": float,
"delack": float,
"rcvtime": float,
}
]
Examples: Examples:
@ -255,7 +352,8 @@ Examples:
class info(): class info():
version = '1.8' """Provides parser metadata (version, author, etc.)"""
version = '1.9'
description = '`netstat` command parser' description = '`netstat` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -268,7 +366,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -278,106 +376,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"proto": string,
"recv_q": integer,
"send_q": integer,
"transport_protocol" string,
"network_protocol": string,
"local_address": string,
"local_port": string,
"local_port_num": integer,
"foreign_address": string,
"foreign_port": string,
"foreign_port_num": integer,
"state": string,
"program_name": string,
"pid": integer,
"user": string,
"security_context": string,
"refcnt": integer,
"flags": string,
"type": string,
"inode": integer,
"path": string,
"kind": string,
"address": string,
"unix_inode": string,
"conn": string,
"refs": string,
"nextref": string,
"name": string,
"unit": integer,
"vendor": integer,
"class": integer,
"subcla": integer,
"unix_flags": integer,
"pcbcount": integer,
"rcvbuf": integer,
"sndbuf": integer,
"rxbytes": integer,
"txbytes": integer,
"destination": string,
"gateway": string,
"route_flags": string,
"route_flags_pretty": [
string,
]
"route_refs": integer,
"use": integer,
"mtu": integer,
"expire": string,
"genmask": string,
"mss": integer,
"window": integer,
"irtt": integer,
"iface": string,
"metric": integer,
"network": string,
"address": string,
"ipkts": integer, - = null
"ierrs": integer, - = null
"idrop": integer, - = null
"opkts": integer, - = null
"oerrs": integer, - = null
"coll": integer, - = null
"rx_ok": integer,
"rx_err": integer,
"rx_drp": integer,
"rx_ovr": integer,
"tx_ok": integer,
"tx_err": integer,
"tx_drp": integer,
"tx_ovr": integer,
"flg": string,
"ibytes": integer,
"obytes": integer,
"r_mbuf": integer,
"s_mbuf": integer,
"r_clus": integer,
"s_clus": integer,
"r_hiwa": integer,
"s_hiwa": integer,
"r_lowa": integer,
"s_lowa": integer,
"r_bcnt": integer,
"s_bcnt": integer,
"r_bmax": integer,
"s_bmax": integer,
"rexmit": integer,
"ooorcv": integer,
"0_win": integer,
"rexmt": float,
"persist": float,
"keep": float,
"2msl": float,
"delack": float,
"rcvtime": float,
}
]
""" """
for entry in proc_data: for entry in proc_data:
# integer changes # integer changes
@ -467,4 +466,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,23 @@ Usage (module):
import jc.parsers.ntpq import jc.parsers.ntpq
result = jc.parsers.ntpq.parse(ntpq_command_output) result = jc.parsers.ntpq.parse(ntpq_command_output)
Compatibility: Schema:
'linux', 'freebsd' [
{
"state": string, # space/~ converted to null
"remote": string,
"refid": string,
"st": integer,
"t": string,
"when": integer, # - converted to null
"poll": integer,
"reach": integer,
"delay": float,
"offset": float,
"jitter": float
},
]
Examples: Examples:
@ -192,7 +206,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`ntpq -p` command parser' description = '`ntpq -p` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -205,7 +220,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -215,24 +230,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"state": string, # space/~ converted to null
"remote": string,
"refid": string,
"st": integer,
"t": string,
"when": integer, # - converted to null
"poll": integer,
"reach": integer,
"delay": float,
"offset": float,
"jitter": float
},
]
""" """
for entry in proc_data: for entry in proc_data:
@ -305,4 +303,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,19 @@ Usage (module):
import jc.parsers.passwd import jc.parsers.passwd
result = jc.parsers.passwd.parse(passwd_file_output) result = jc.parsers.passwd.parse(passwd_file_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' [
{
"username": string,
"password": string,
"uid": integer,
"gid": integer,
"comment": string,
"home": string,
"shell": string
}
]
Examples: Examples:
@ -83,7 +93,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`/etc/passwd` file parser' description = '`/etc/passwd` file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -96,7 +107,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -106,19 +117,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"username": string,
"password": string,
"uid": integer,
"gid": integer,
"comment": string,
"home": string,
"shell": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['uid', 'gid'] int_list = ['uid', 'gid']
@ -177,4 +176,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,35 @@ Usage (module):
import jc.parsers.ping import jc.parsers.ping
result = jc.parsers.ping.parse(ping_command_output) result = jc.parsers.ping.parse(ping_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' {
"source_ip": string,
"destination_ip": string,
"data_bytes": integer,
"pattern": string, # (null if not set)
"destination": string,
"packets_transmitted": integer,
"packets_received": integer,
"packet_loss_percent": float,
"duplicates": integer,
"round_trip_ms_min": float,
"round_trip_ms_avg": float,
"round_trip_ms_max": float,
"round_trip_ms_stddev": float,
"responses": [
{
"type": string, # ('reply' or 'timeout')
"timestamp": float,
"bytes": integer,
"response_ip": string,
"icmp_seq": integer,
"ttl": integer,
"time_ms": float,
"duplicate": boolean
}
]
}
Examples: Examples:
@ -119,7 +145,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`ping` and `ping6` command parser' description = '`ping` and `ping6` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -132,7 +159,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -142,35 +169,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"source_ip": string,
"destination_ip": string,
"data_bytes": integer,
"pattern": string, (null if not set)
"destination": string,
"packets_transmitted": integer,
"packets_received": integer,
"packet_loss_percent": float,
"duplicates": integer,
"round_trip_ms_min": float,
"round_trip_ms_avg": float,
"round_trip_ms_max": float,
"round_trip_ms_stddev": float,
"responses": [
{
"type": string, ('reply' or 'timeout')
"timestamp": float,
"bytes": integer,
"response_ip": string,
"icmp_seq": integer,
"ttl": integer,
"time_ms": float,
"duplicate": boolean
}
]
}
""" """
int_list = ['data_bytes', 'packets_transmitted', 'packets_received', 'bytes', 'icmp_seq', 'ttl', 'duplicates'] int_list = ['data_bytes', 'packets_transmitted', 'packets_received', 'bytes', 'icmp_seq', 'ttl', 'duplicates']
float_list = ['packet_loss_percent', 'round_trip_ms_min', 'round_trip_ms_avg', 'round_trip_ms_max', float_list = ['packet_loss_percent', 'round_trip_ms_min', 'round_trip_ms_avg', 'round_trip_ms_max',
@ -208,7 +207,7 @@ def process(proc_data):
return proc_data return proc_data
def linux_parse(data): def _linux_parse(data):
raw_output = {} raw_output = {}
ping_responses = [] ping_responses = []
pattern = None pattern = None
@ -357,7 +356,7 @@ def linux_parse(data):
return raw_output return raw_output
def bsd_parse(data): def _bsd_parse(data):
raw_output = {} raw_output = {}
ping_responses = [] ping_responses = []
pattern = None pattern = None
@ -508,11 +507,11 @@ def parse(data, raw=False, quiet=False):
if jc.utils.has_data(data): if jc.utils.has_data(data):
if ' time ' in data.splitlines()[-2] or ' time ' in data.splitlines()[-3]: if ' time ' in data.splitlines()[-2] or ' time ' in data.splitlines()[-3]:
raw_output = linux_parse(data) raw_output = _linux_parse(data)
else: else:
raw_output = bsd_parse(data) raw_output = _bsd_parse(data)
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,15 @@ Usage (module):
import jc.parsers.pip_list import jc.parsers.pip_list
result = jc.parsers.pip_list.parse(pip_list_command_output) result = jc.parsers.pip_list.parse(pip_list_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' [
{
"package": string,
"version": string,
"location": string
}
]
Examples: Examples:
@ -41,7 +47,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`pip list` command parser' description = '`pip list` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -54,7 +61,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -64,15 +71,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"package": string,
"version": string,
"location": string
}
]
""" """
# no further processing # no further processing
return proc_data return proc_data
@ -123,4 +122,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,22 @@ Usage (module):
import jc.parsers.pip_show import jc.parsers.pip_show
result = jc.parsers.pip_show.parse(pip_show_command_output) result = jc.parsers.pip_show.parse(pip_show_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' [
{
"name": string,
"version": string,
"summary": string,
"home_page": string,
"author": string,
"author_email": string,
"license": string,
"location": string,
"requires": string,
"required_by": string
}
]
Examples: Examples:
@ -51,7 +64,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`pip show` command parser' description = '`pip show` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -64,7 +78,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -74,23 +88,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"name": string,
"version": string,
"summary": string,
"home_page": string,
"author": string,
"author_email": string,
"license": string,
"location": string,
"requires": string,
"required_by": string
}
]
""" """
# no further processing # no further processing
return proc_data return proc_data
@ -140,4 +138,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,29 @@ Usage (module):
import jc.parsers.ps import jc.parsers.ps
result = jc.parsers.ps.parse(ps_command_output) result = jc.parsers.ps.parse(ps_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"uid": string,
"pid": integer,
"ppid": integer,
"c": integer,
"stime": string,
"tty": string, # ? or ?? = Null
"tt": string, # ?? = Null
"time": string,
"cmd": string,
"user": string,
"cpu_percent": float,
"mem_percent": float,
"vsz": integer,
"rss": integer,
"stat": string,
"start": string,
"command": string
}
]
Examples: Examples:
@ -186,7 +206,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`ps` command parser' description = '`ps` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -199,7 +220,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -209,29 +230,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"uid": string,
"pid": integer,
"ppid": integer,
"c": integer,
"stime": string,
"tty": string, # ? or ?? = Null
"tt": string, # ?? = Null
"time": string,
"cmd": string,
"user": string,
"cpu_percent": float,
"mem_percent": float,
"vsz": integer,
"rss": integer,
"stat": string,
"start": string,
"command": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
# change key name '%cpu' to 'cpu_percent' # change key name '%cpu' to 'cpu_percent'
@ -301,4 +300,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,26 @@ Usage (module):
import jc.parsers.route import jc.parsers.route
result = jc.parsers.route.parse(route_command_output) result = jc.parsers.route.parse(route_command_output)
Compatibility: Schema:
'linux' [
{
"destination": string,
"gateway": string,
"genmask": string,
"flags": string,
"flags_pretty": [
string,
]
"metric": integer,
"ref": integer,
"use": integer,
"mss": integer,
"window": integer,
"irtt": integer,
"iface": string
}
]
Examples: Examples:
@ -93,7 +110,8 @@ import jc.parsers.universal
class info(): class info():
version = '1.4' """Provides parser metadata (version, author, etc.)"""
version = '1.5'
description = '`route` command parser' description = '`route` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -106,7 +124,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -116,26 +134,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"destination": string,
"gateway": string,
"genmask": string,
"flags": string,
"flags_pretty": [
string,
]
"metric": integer,
"ref": integer,
"use": integer,
"mss": integer,
"window": integer,
"irtt": integer,
"iface": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['metric', 'ref', 'use', 'mss', 'window', 'irtt'] int_list = ['metric', 'ref', 'use', 'mss', 'window', 'irtt']
@ -207,4 +206,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -2,13 +2,13 @@
Works with `rpm -qi [package]` or `rpm -qia`. Works with `rpm -qi [package]` or `rpm -qia`.
The `build_epoch` calculated timestamp field is naive (i.e. based on the local time of the system the parser is run on) The `..._epoch` calculated timestamp fields are naive (i.e. based on the local time of the system the parser is run on)
The `build_epoch_utc` calculated timestamp field is timezone-aware and is only available if the timezone field is UTC. The `..._epoch_utc` calculated timestamp fields are timezone-aware and is only available if the timezone field is UTC.
Usage (cli): Usage (cli):
$ rpm -qia | jc --rpm_qi $ rpm -qia | jc --rpm-qi
or or
@ -19,13 +19,39 @@ Usage (module):
import jc.parsers.rpm_qi import jc.parsers.rpm_qi
result = jc.parsers.rpm_qi.parse(rpm_qi_command_output) result = jc.parsers.rpm_qi.parse(rpm_qi_command_output)
Compatibility: Schema:
'linux' [
{
"name": string,
"epoch": integer,
"version": string,
"release": string,
"architecture": string,
"install_date": string,
"install_date_epoch": integer, # naive timestamp
"install_date_epoch_utc": integer, # Aware timestamp if timezone is UTC
"group": string,
"size": integer,
"license": string,
"signature": string,
"source_rpm": string,
"build_date": string,
"build_epoch": integer, # naive timestamp
"build_epoch_utc": integer, # Aware timestamp if timezone is UTC
"build_host": string,
"relocations": string,
"packager": string,
"vendor": string,
"url": string,
"summary": string,
"description": string
}
]
Examples: Examples:
$ rpm -qia | jc --rpm_qi -p $ rpm -qia | jc --rpm-qi -p
[ [
{ {
"name": "make", "name": "make",
@ -46,9 +72,11 @@ Examples:
"vendor": "CentOS", "vendor": "CentOS",
"url": "http://www.gnu.org/software/make/", "url": "http://www.gnu.org/software/make/",
"summary": "A GNU tool which simplifies the build process for users", "summary": "A GNU tool which simplifies the build process for users",
"description": "A GNU tool for controlling the generation of executables and other non-source...", "description": "A GNU tool for controlling the generation of executables and other...",
"build_epoch": 1565311645, "build_epoch": 1565311645,
"build_epoch_utc": null "build_epoch_utc": null,
"install_date_epoch": 1571242902,
"install_date_epoch_utc": null
}, },
{ {
"name": "kbd-legacy", "name": "kbd-legacy",
@ -68,14 +96,16 @@ Examples:
"vendor": "CentOS", "vendor": "CentOS",
"url": "http://ftp.altlinux.org/pub/people/legion/kbd", "url": "http://ftp.altlinux.org/pub/people/legion/kbd",
"summary": "Legacy data for kbd package", "summary": "Legacy data for kbd package",
"description": "The kbd-legacy package contains original keymaps for kbd package. Please note...", "description": "The kbd-legacy package contains original keymaps for kbd package...",
"build_epoch": 1540939200, "build_epoch": 1540939200,
"build_epoch_utc": null "build_epoch_utc": null,
"install_date_epoch": 1565891588,
"install_date_epoch_utc": null
}, },
... ...
] ]
$ rpm -qia | jc --rpm_qi -p -r $ rpm -qia | jc --rpm-qi -p -r
[ [
{ {
"name": "make", "name": "make",
@ -125,7 +155,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`rpm -qi` command parser' description = '`rpm -qi` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -139,7 +170,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -149,33 +180,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"name": string,
"epoch": integer,
"version": string,
"release": string,
"architecture": string,
"install_date": string,
"group": string,
"size": integer,
"license": string,
"signature": string,
"source_rpm": string,
"build_date": string,
"build_epoch": integer, # naive timestamp
"build_epoch_utc": integer, # Aware timestamp if timezone is UTC
"build_host": string,
"relocations": string,
"packager": string,
"vendor": string,
"url": string,
"summary": string,
"description": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -192,6 +197,11 @@ def process(proc_data):
entry['build_epoch'] = timestamp.naive entry['build_epoch'] = timestamp.naive
entry['build_epoch_utc'] = timestamp.utc entry['build_epoch_utc'] = timestamp.utc
if 'install_date' in entry:
timestamp = jc.utils.timestamp(entry['install_date'])
entry['install_date_epoch'] = timestamp.naive
entry['install_date_epoch_utc'] = timestamp.utc
return proc_data return proc_data
@ -255,4 +265,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,20 @@ Usage (module):
import jc.parsers.shadow import jc.parsers.shadow
result = jc.parsers.shadow.parse(shadow_file_output) result = jc.parsers.shadow.parse(shadow_file_output)
Compatibility: Schema:
'linux', 'darwin', 'aix', 'freebsd' [
{
"username": string,
"password": string,
"last_changed": integer,
"minimum": integer,
"maximum": integer,
"warn": integer,
"inactive": integer,
"expire": integer
}
]
Examples: Examples:
@ -89,7 +100,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`/etc/shadow` file parser' description = '`/etc/shadow` file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -102,7 +114,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -112,20 +124,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"username": string,
"password": string,
"last_changed": integer,
"minimum": integer,
"maximum": integer,
"warn": integer,
"inactive": integer,
"expire": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['last_changed', 'minimum', 'maximum', 'warn', 'inactive', 'expire'] int_list = ['last_changed', 'minimum', 'maximum', 'warn', 'inactive', 'expire']
@ -185,4 +184,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -1,5 +1,7 @@
"""jc - JSON CLI output utility `ss` command output parser """jc - JSON CLI output utility `ss` command output parser
Extended information options like -e and -p are not supported and may cause parsing irregularities.
Usage (cli): Usage (cli):
$ ss | jc --ss $ ss | jc --ss
@ -13,13 +15,29 @@ Usage (module):
import jc.parsers.ss import jc.parsers.ss
result = jc.parsers.ss.parse(ss_command_output) result = jc.parsers.ss.parse(ss_command_output)
Limitations: Schema:
Extended information options like -e and -p are not supported and may cause parsing irregularities Information from https://www.cyberciti.biz/files/ss.html used to define field names
Compatibility: [
{
'linux' "netid": string,
"state": string,
"recv_q": integer,
"send_q": integer,
"local_address": string,
"local_port": string,
"local_port_num": integer,
"peer_address": string,
"peer_port": string,
"peer_port_num": integer,
"interface": string,
"link_layer" string,
"channel": string,
"path": string,
"pid": integer
}
]
Examples: Examples:
@ -260,7 +278,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`ss` command parser' description = '`ss` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -273,7 +292,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -283,29 +302,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"netid": string,
"state": string,
"recv_q": integer,
"send_q": integer,
"local_address": string,
"local_port": string,
"local_port_num": integer,
"peer_address": string,
"peer_port": string,
"peer_port_num": integer,
"interface": string,
"link_layer" string,
"channel": string,
"path": string,
"pid": integer
}
]
Information from https://www.cyberciti.biz/files/ss.html used to define field names
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['recv_q', 'send_q', 'pid'] int_list = ['recv_q', 'send_q', 'pid']
@ -419,4 +416,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,43 @@ Usage (module):
import jc.parsers.stat import jc.parsers.stat
result = jc.parsers.stat.parse(stat_command_output) result = jc.parsers.stat.parse(stat_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' [
{
"file": string,
"link_to" string,
"size": integer,
"blocks": integer,
"io_blocks": integer,
"type": string,
"device": string,
"inode": integer,
"links": integer,
"access": string,
"flags": string,
"uid": integer,
"user": string,
"gid": integer,
"group": string,
"access_time": string, # - = null
"access_time_epoch": integer, # naive timestamp
"access_time_epoch_utc": integer, # timezone-aware timestamp
"modify_time": string, # - = null
"modify_time_epoch": integer, # naive timestamp
"modify_time_epoch_utc": integer, # timezone-aware timestamp
"change_time": string, # - = null
"change_time_epoch": integer, # naive timestamp
"change_time_epoch_utc": integer, # timezone-aware timestamp
"birth_time": string, # - = null
"birth_time_epoch": integer, # naive timestamp
"birth_time_epoch_utc": integer, # timezone-aware timestamp
"unix_device": integer,
"rdev": integer,
"block_size": integer,
"unix_flags": string
}
]
Examples: Examples:
@ -134,7 +168,8 @@ import jc.utils
class info(): class info():
version = '1.6' """Provides parser metadata (version, author, etc.)"""
version = '1.7'
description = '`stat` command parser' description = '`stat` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -147,7 +182,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -157,43 +192,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"file": string,
"link_to" string,
"size": integer,
"blocks": integer,
"io_blocks": integer,
"type": string,
"device": string,
"inode": integer,
"links": integer,
"access": string,
"flags": string,
"uid": integer,
"user": string,
"gid": integer,
"group": string,
"access_time": string, # - = null
"access_time_epoch": integer, # naive timestamp
"access_time_epoch_utc": integer, # timezone-aware timestamp
"modify_time": string, # - = null
"modify_time_epoch": integer, # naive timestamp
"modify_time_epoch_utc": integer, # timezone-aware timestamp
"change_time": string, # - = null
"change_time_epoch": integer, # naive timestamp
"change_time_epoch_utc": integer, # timezone-aware timestamp
"birth_time": string, # - = null
"birth_time_epoch": integer, # naive timestamp
"birth_time_epoch_utc": integer, # timezone-aware timestamp
"unix_device": integer,
"rdev": integer,
"block_size": integer,
"unix_flags": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['size', 'blocks', 'io_blocks', 'inode', 'links', 'uid', 'gid', 'unix_device', 'rdev', 'block_size'] int_list = ['size', 'blocks', 'io_blocks', 'inode', 'links', 'uid', 'gid', 'unix_device', 'rdev', 'block_size']
@ -349,4 +348,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,13 @@ Usage (module):
import jc.parsers.sysctl import jc.parsers.sysctl
result = jc.parsers.sysctl.parse(sysctl_command_output) result = jc.parsers.sysctl.parse(sysctl_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' {
"key1": string/integer/float, # best guess based on value
"key2": string/integer/float,
"key3": string/integer/float
}
Examples: Examples:
@ -49,7 +53,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`sysctl` command parser' description = '`sysctl` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -63,7 +68,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -73,13 +78,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"foo": string/integer/float, # best guess based on value
"bar": string/integer/float,
"baz": string/integer/float
}
""" """
for key in proc_data: for key in proc_data:
try: try:
@ -158,4 +157,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,17 @@ Usage (module):
import jc.parsers.systemctl import jc.parsers.systemctl
result = jc.parsers.systemctl.parse(systemctl_command_output) result = jc.parsers.systemctl.parse(systemctl_command_output)
Compatibility: Schema:
'linux' [
{
"unit": string,
"load": string,
"active": string,
"sub": string,
"description": string
}
]
Examples: Examples:
@ -49,7 +57,8 @@ import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`systemctl` command parser' description = '`systemctl` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -62,7 +71,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -72,17 +81,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"unit": string,
"load": string,
"active": string,
"sub": string,
"description": string
}
]
""" """
# nothing more to process # nothing more to process
return proc_data return proc_data
@ -133,4 +132,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,16 @@ Usage (module):
import jc.parsers.systemctl_lj import jc.parsers.systemctl_lj
result = jc.parsers.systemctl_lj.parse(systemctl_lj_command_output) result = jc.parsers.systemctl_lj.parse(systemctl_lj_command_output)
Compatibility: Schema:
'linux' [
{
"job": integer,
"unit": string,
"type": string,
"state": string
}
]
Examples: Examples:
@ -62,13 +69,13 @@ Examples:
"state": "waiting" "state": "waiting"
} }
] ]
""" """
import jc.utils import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`systemctl list-jobs` command parser' description = '`systemctl list-jobs` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -81,7 +88,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -91,16 +98,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"job": integer,
"unit": string,
"type": string,
"state": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['job'] int_list = ['job']
@ -161,4 +159,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,15 @@ Usage (module):
import jc.parsers.systemctl_ls import jc.parsers.systemctl_ls
result = jc.parsers.systemctl_ls.parse(systemctl_ls_command_output) result = jc.parsers.systemctl_ls.parse(systemctl_ls_command_output)
Compatibility: Schema:
'linux' [
{
"listen": string,
"unit": string,
"activates": string
}
]
Examples: Examples:
@ -43,7 +49,8 @@ import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`systemctl list-sockets` command parser' description = '`systemctl list-sockets` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -56,7 +63,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -66,15 +73,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"listen": string,
"unit": string,
"activates": string
}
]
""" """
# nothing more to process # nothing more to process
return proc_data return proc_data
@ -125,4 +124,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,14 @@ Usage (module):
import jc.parsers.systemctl_luf import jc.parsers.systemctl_luf
result = jc.parsers.systemctl_luf.parse(systemctl_luf_command_output) result = jc.parsers.systemctl_luf.parse(systemctl_luf_command_output)
Compatibility: Schema:
'linux' [
{
"unit_file": string,
"state": string
}
]
Examples: Examples:
@ -40,7 +45,8 @@ import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`systemctl list-unit-files` command parser' description = '`systemctl list-unit-files` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -53,7 +59,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -63,14 +69,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"unit_file": string,
"state": string
}
]
""" """
# nothing more to process # nothing more to process
return proc_data return proc_data
@ -122,4 +121,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,47 @@ Usage (module):
import jc.parsers.time import jc.parsers.time
result = jc.parsers.time.parse(time_command_output) result = jc.parsers.time.parse(time_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' Source: https://www.freebsd.org/cgi/man.cgi?query=getrusage
https://man7.org/linux/man-pages/man1/time.1.html
{
"real_time": float,
"user_time": float,
"system_time": float,
"elapsed_time": string,
"elapsed_time_hours": integer,
"elapsed_time_minutes": integer,
"elapsed_time_seconds": integer,
"elapsed_time_centiseconds": integer,
"elapsed_time_total_seconds": float,
"cpu_percent": integer, # null if ?
"average_shared_text_size": integer,
"average_unshared_data_size": integer,
"average_unshared_stack_size": integer,
"average_shared_memory_size": integer,
"maximum_resident_set_size": integer,
"block_input_operations": integer, # aka File system inputs
"block_output_operations": integer, # aka File system outputs
"major_pagefaults": integer,
"minor_pagefaults": integer,
"swaps": integer,
"page_reclaims": integer,
"page_faults": integer,
"messages_sent": integer,
"messages_received": integer,
"signals_received": integer,
"voluntary_context_switches": integer,
"involuntary_context_switches": integer
"command_being_timed": string,
"average_stack_size": integer,
"average_total_size": integer,
"average_resident_set_size": integer,
"signals_delivered": integer,
"page_size": integer,
"exit_status": integer
}
Examples: Examples:
@ -84,7 +122,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`/usr/bin/time` command parser' description = '`/usr/bin/time` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -97,7 +136,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -107,47 +146,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
Source: https://www.freebsd.org/cgi/man.cgi?query=getrusage
https://man7.org/linux/man-pages/man1/time.1.html
{
"real_time": float,
"user_time": float,
"system_time": float,
"elapsed_time": string,
"elapsed_time_hours": integer,
"elapsed_time_minutes": integer,
"elapsed_time_seconds": integer,
"elapsed_time_centiseconds": integer,
"elapsed_time_total_seconds": float,
"cpu_percent": integer, # null if ?
"average_shared_text_size": integer,
"average_unshared_data_size": integer,
"average_unshared_stack_size": integer,
"average_shared_memory_size": integer,
"maximum_resident_set_size": integer,
"block_input_operations": integer, # aka File system inputs
"block_output_operations": integer, # aka File system outputs
"major_pagefaults": integer,
"minor_pagefaults": integer,
"swaps": integer,
"page_reclaims": integer,
"page_faults": integer,
"messages_sent": integer,
"messages_received": integer,
"signals_received": integer,
"voluntary_context_switches": integer,
"involuntary_context_switches": integer
"command_being_timed": string,
"average_stack_size": integer,
"average_total_size": integer,
"average_resident_set_size": integer,
"signals_delivered": integer,
"page_size": integer,
"exit_status": integer
}
""" """
if 'command_being_timed' in proc_data: if 'command_being_timed' in proc_data:
proc_data['command_being_timed'] = proc_data['command_being_timed'][1:-1] proc_data['command_being_timed'] = proc_data['command_being_timed'][1:-1]
@ -330,4 +329,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -1,6 +1,6 @@
"""jc - JSON CLI output utility `timedatectl` command output parser """jc - JSON CLI output utility `timedatectl` command output parser
The `epoch_utc` calculated timestamp field is timezone-aware and is only available if the universal_time field is available. The `epoch_utc` calculated timestamp field is timezone-aware and is only available if the `universal_time` field is available.
Usage (cli): Usage (cli):
@ -15,9 +15,21 @@ Usage (module):
import jc.parsers.timedatectl import jc.parsers.timedatectl
result = jc.parsers.timedatectl.parse(timedatectl_command_output) result = jc.parsers.timedatectl.parse(timedatectl_command_output)
Compatibility: Schema:
'linux' {
"local_time": string,
"universal_time": string,
"epoch_utc": integer, # timezone-aware timestamp
"rtc_time": string,
"time_zone": string,
"ntp_enabled": boolean,
"ntp_synchronized": boolean,
"system_clock_synchronized": boolean,
"systemd-timesyncd.service_active": boolean,
"rtc_in_local_tz": boolean,
"dst_active": boolean
}
Examples: Examples:
@ -50,7 +62,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`timedatectl status` command parser' description = '`timedatectl status` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -64,7 +77,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -74,21 +87,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"local_time": string,
"universal_time": string,
"epoch_utc": integer, # timezone-aware timestamp
"rtc_time": string,
"time_zone": string,
"ntp_enabled": boolean,
"ntp_synchronized": boolean,
"system_clock_synchronized": boolean,
"systemd-timesyncd.service_active": boolean,
"rtc_in_local_tz": boolean,
"dst_active": boolean
}
""" """
# boolean changes # boolean changes
bool_list = ['ntp_enabled', 'ntp_synchronized', 'rtc_in_local_tz', 'dst_active', bool_list = ['ntp_enabled', 'ntp_synchronized', 'rtc_in_local_tz', 'dst_active',
@ -138,4 +137,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,24 @@ Usage (module):
import jc.parsers.tracepath import jc.parsers.tracepath
result = jc.parsers.tracepath.parse(tracepath_command_output) result = jc.parsers.tracepath.parse(tracepath_command_output)
Compatibility: Schema:
'linux' {
"pmtu": integer,
"forward_hops": integer,
"return_hops": integer,
"hops": [
{
"ttl": integer,
"guess": boolean,
"host": string,
"reply_ms": float,
"pmtu": integer,
"asymmetric_difference": integer,
"reached": boolean
}
]
}
Examples: Examples:
@ -110,14 +125,14 @@ Examples:
} }
] ]
} }
""" """
import re import re
import jc.utils import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`tracepath` and `tracepath6` command parser' description = '`tracepath` and `tracepath6` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -130,7 +145,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -140,24 +155,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"pmtu": integer,
"forward_hops": integer,
"return_hops": integer,
"hops": [
{
"ttl": integer,
"guess": boolean,
"host": string,
"reply_ms": float,
"pmtu": integer,
"asymmetric_difference": integer,
"reached": boolean
}
]
}
""" """
int_list = ['pmtu', 'forward_hops', 'return_hops', 'ttl', 'asymmetric_difference'] int_list = ['pmtu', 'forward_hops', 'return_hops', 'ttl', 'asymmetric_difference']
float_list = ['reply_ms'] float_list = ['reply_ms']
@ -259,4 +257,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -19,9 +19,26 @@ Usage (module):
import jc.parsers.traceroute import jc.parsers.traceroute
result = jc.parsers.traceroute.parse(traceroute_command_output) result = jc.parsers.traceroute.parse(traceroute_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' {
"destination_ip": string,
"destination_name": string,
"hops": [
{
"hop": integer,
"probes": [
{
"annotation": string,
"asn": integer,
"ip": string,
"name": string,
"rtt": float
}
]
}
]
}
Examples: Examples:
@ -101,7 +118,8 @@ import jc.utils
class info(): class info():
version = '1.1' """Provides parser metadata (version, author, etc.)"""
version = '1.2'
description = '`traceroute` and `traceroute6` command parser' description = '`traceroute` and `traceroute6` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -151,7 +169,7 @@ RE_PROBE_ASN = re.compile(r'\[AS(\d+)\]')
RE_PROBE_RTT_ANNOTATION = re.compile(r'(?:(\d+(?:\.?\d+)?)\s+ms|(\s+\*\s+))\s*(!\S*)?') RE_PROBE_RTT_ANNOTATION = re.compile(r'(?:(\d+(?:\.?\d+)?)\s+ms|(\s+\*\s+))\s*(!\S*)?')
class Traceroute(object): class _Traceroute(object):
def __init__(self, dest_name, dest_ip): def __init__(self, dest_name, dest_ip):
self.dest_name = dest_name self.dest_name = dest_name
self.dest_ip = dest_ip self.dest_ip = dest_ip
@ -167,7 +185,7 @@ class Traceroute(object):
return text return text
class Hop(object): class _Hop(object):
def __init__(self, idx): def __init__(self, idx):
self.idx = idx # Hop count, starting at 1 (usually) self.idx = idx # Hop count, starting at 1 (usually)
self.probes = [] # Series of Probe instances self.probes = [] # Series of Probe instances
@ -194,7 +212,7 @@ class Hop(object):
return text return text
class Probe(object): class _Probe(object):
def __init__(self, name=None, ip=None, asn=None, rtt=None, annotation=None): def __init__(self, name=None, ip=None, asn=None, rtt=None, annotation=None):
self.name = name self.name = name
self.ip = ip self.ip = ip
@ -216,7 +234,7 @@ class Probe(object):
return text return text
def loads(data): def _loads(data):
lines = data.splitlines() lines = data.splitlines()
# Get headers # Get headers
@ -227,7 +245,7 @@ def loads(data):
dest_ip = match_dest.group(2) dest_ip = match_dest.group(2)
# The Traceroute node is the root of the tree # The Traceroute node is the root of the tree
traceroute = Traceroute(dest_name, dest_ip) traceroute = _Traceroute(dest_name, dest_ip)
# Parse the remaining lines, they should be only hops/probes # Parse the remaining lines, they should be only hops/probes
for line in lines[1:]: for line in lines[1:]:
@ -243,7 +261,7 @@ def loads(data):
hop_index = None hop_index = None
if hop_index is not None: if hop_index is not None:
hop = Hop(hop_index) hop = _Hop(hop_index)
traceroute.add_hop(hop) traceroute.add_hop(hop)
hop_string = hop_match.group(2) hop_string = hop_match.group(2)
@ -279,7 +297,7 @@ def loads(data):
probe_annotation = probe_rtt_annotation[2] or None probe_annotation = probe_rtt_annotation[2] or None
probe = Probe( probe = _Probe(
name=probe_name, name=probe_name,
ip=probe_ip, ip=probe_ip,
asn=probe_asn, asn=probe_asn,
@ -300,7 +318,7 @@ class ParseError(Exception):
######################################################################################## ########################################################################################
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -310,26 +328,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured to conform to the schema.
{
"destination_ip": string,
"destination_name": string,
"hops": [
{
"hop": integer,
"probes": [
{
"annotation": string,
"asn": integer,
"ip": string,
"name": string,
"rtt": float
}
]
}
]
}
""" """
int_list = ['hop', 'asn'] int_list = ['hop', 'asn']
float_list = ['rtt'] float_list = ['rtt']
@ -408,7 +407,7 @@ def parse(data, raw=False, quiet=False):
data = '\n'.join(new_data) data = '\n'.join(new_data)
tr = loads(data) tr = _loads(data)
hops = tr.hops hops = tr.hops
hops_list = [] hops_list = []
@ -441,4 +440,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -15,9 +15,18 @@ Usage (module):
import jc.parsers.uname import jc.parsers.uname
result = jc.parsers.uname.parse(uname_command_output) result = jc.parsers.uname.parse(uname_command_output)
Compatibility: Schema:
'linux', 'darwin', 'freebsd' {
"kernel_name": string,
"node_name": string,
"kernel_release": string,
"operating_system": string,
"hardware_platform": string,
"processor": string,
"machine": string,
"kernel_version": string
}
Example: Example:
@ -37,7 +46,8 @@ import jc.utils
class info(): class info():
version = '1.4' """Provides parser metadata (version, author, etc.)"""
version = '1.5'
description = '`uname -a` command parser' description = '`uname -a` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -54,7 +64,7 @@ class ParseError(Exception):
pass pass
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -64,18 +74,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"kernel_name": string,
"node_name": string,
"kernel_release": string,
"operating_system": string,
"hardware_platform": string,
"processor": string,
"machine": string,
"kernel_version": string
}
""" """
# nothing to process # nothing to process
return proc_data return proc_data
@ -138,4 +137,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,67 @@ Usage (module):
import jc.parsers.upower import jc.parsers.upower
result = jc.parsers.upower.parse(upower_command_output) result = jc.parsers.upower.parse(upower_command_output)
Compatibility: Schema:
'linux' [
{
"type": string,
"device_name": string,
"native_path": string,
"power_supply": boolean,
"updated": string,
"updated_epoch": integer, # null if date-time conversion fails
"updated_epoch_utc": integer, # null if date-time conversion fails
"updated_seconds_ago": integer,
"has_history": boolean,
"has_statistics": boolean,
"detail": {
"type": string,
"warning_level": string, # null if none
"online": boolean,
"icon_name": string
"present": boolean,
"rechargeable": boolean,
"state": string,
"energy": float,
"energy_unit": string,
"energy_empty": float,
"energy_empty_unit": string,
"energy_full": float,
"energy_full_unit": string,
"energy_full_design": float,
"energy_full_design_unit": string,
"energy_rate": float,
"energy_rate_unit": string,
"voltage": float,
"voltage_unit": string,
"time_to_full": float,
"time_to_full_unit": string,
"percentage": float,
"capacity": float,
"technology": string
},
"history_charge": [
{
"time": integer,
"percent_charged": float,
"status": string
}
],
"history_rate":[
{
"time": integer,
"percent_charged": float,
"status": string
}
],
"daemon_version": string,
"on_battery": boolean,
"lid_is_closed": boolean,
"lid_is_present": boolean,
"critical_action": string
}
]
Examples: Examples:
@ -135,7 +193,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`upower` command parser' description = '`upower` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -149,7 +208,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -159,67 +218,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"type": string,
"device_name": string,
"native_path": string,
"power_supply": boolean,
"updated": string,
"updated_epoch": integer, # null if date-time conversion fails
"updated_epoch_utc": integer, # null if date-time conversion fails
"updated_seconds_ago": integer,
"has_history": boolean,
"has_statistics": boolean,
"detail": {
"type": string,
"warning_level": string, # null if none
"online": boolean,
"icon_name": string
"present": boolean,
"rechargeable": boolean,
"state": string,
"energy": float,
"energy_unit": string,
"energy_empty": float,
"energy_empty_unit": string,
"energy_full": float,
"energy_full_unit": string,
"energy_full_design": float,
"energy_full_design_unit": string,
"energy_rate": float,
"energy_rate_unit": string,
"voltage": float,
"voltage_unit": string,
"time_to_full": float,
"time_to_full_unit": string,
"percentage": float,
"capacity": float,
"technology": string
},
"history_charge": [
{
"time": integer,
"percent_charged": float,
"status": string
}
],
"history_rate":[
{
"time": integer,
"percent_charged": float,
"status": string
}
],
"daemon_version": string,
"on_battery": boolean,
"lid_is_closed": boolean,
"lid_is_present": boolean,
"critical_action": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
# time conversions # time conversions
@ -414,4 +413,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,23 @@ Usage (module):
import jc.parsers.uptime import jc.parsers.uptime
result = jc.parsers.uptime.parse(uptime_command_output) result = jc.parsers.uptime.parse(uptime_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' {
"time": string,
"time_hour": integer,
"time_minute": integer,
"time_second": integer, # null if not displayed
"uptime": string,
"uptime_days": integer,
"uptime_hours": integer,
"uptime_minutes": integer,
"uptime_total_seconds": integer,
"users": integer,
"load_1m": float,
"load_5m": float,
"load_15m": float
}
Example: Example:
@ -50,7 +64,8 @@ import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`uptime` command parser' description = '`uptime` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -63,7 +78,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -73,23 +88,7 @@ def process(proc_data):
Returns: Returns:
Dictionary. Structured data with the following schema: Dictionary. Structured data to conform to the schema.
{
"time": string,
"time_hour": integer,
"time_minute": integer,
"time_second": integer, # null if not displayed
"uptime": string,
"uptime_days": integer,
"uptime_hours": integer,
"uptime_minutes": integer,
"uptime_total_seconds": integer,
"users": integer,
"load_1m": float,
"load_5m": float,
"load_15m": float
}
""" """
if 'time' in proc_data: if 'time' in proc_data:
time_list = proc_data['time'].split(':') time_list = proc_data['time'].split(':')
@ -186,4 +185,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,20 @@ Usage (module):
import jc.parsers.w import jc.parsers.w
result = jc.parsers.w.parse(w_command_output) result = jc.parsers.w.parse(w_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"user": string, # '-' = null
"tty": string, # '-' = null
"from": string, # '-' = null
"login_at": string, # '-' = null
"idle": string, # '-' = null
"jcpu": string,
"pcpu": string,
"what": string # '-' = null
}
]
Examples: Examples:
@ -92,7 +103,8 @@ import jc.utils
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = '`w` command parser' description = '`w` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -105,7 +117,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -115,20 +127,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"user": string, # '-'' = null
"tty": string, # '-'' = null
"from": string, # '-'' = null
"login_at": string, # '-'' = null
"idle": string, # '-'' = null
"jcpu": string,
"pcpu": string,
"what": string # '-'' = null
}
]
""" """
for entry in proc_data: for entry in proc_data:
null_list = ['user', 'tty', 'from', 'login_at', 'idle', 'what'] null_list = ['user', 'tty', 'from', 'login_at', 'idle', 'what']
@ -196,4 +195,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -13,9 +13,16 @@ Usage (module):
import jc.parsers.wc import jc.parsers.wc
result = jc.parsers.wc.parse(wc_command_output) result = jc.parsers.wc.parse(wc_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"filename": string,
"lines": integer,
"words": integer,
"characters": integer
}
]
Examples: Examples:
@ -46,7 +53,8 @@ import jc.utils
class info(): class info():
version = '1.0' """Provides parser metadata (version, author, etc.)"""
version = '1.1'
description = '`wc` command parser' description = '`wc` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -59,7 +67,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -69,16 +77,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"filename": string,
"lines": integer,
"words": integer,
"characters": integer
}
]
""" """
for entry in proc_data: for entry in proc_data:
@ -126,4 +125,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -17,9 +17,22 @@ Usage (module):
import jc.parsers.who import jc.parsers.who
result = jc.parsers.who.parse(who_command_output) result = jc.parsers.who.parse(who_command_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'aix', 'freebsd' [
{
"user": string,
"event": string,
"writeable_tty": string,
"tty": string,
"time": string,
"epoch": integer, # naive timestamp. null if time cannot be converted
"idle": string,
"pid": integer,
"from": string,
"comment": string
}
]
Examples: Examples:
@ -119,7 +132,8 @@ import jc.utils
class info(): class info():
version = '1.2' """Provides parser metadata (version, author, etc.)"""
version = '1.3'
description = '`who` command parser' description = '`who` command parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -133,7 +147,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -143,22 +157,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Structured data with the following schema: List of Dictionaries. Structured data to conform to the schema.
[
{
"user": string,
"event": string,
"writeable_tty": string,
"tty": string,
"time": string,
"epoch": integer, # naive timestamp. null if time cannot be converted
"idle": string,
"pid": integer,
"from": string,
"comment": string
}
]
""" """
for entry in proc_data: for entry in proc_data:
int_list = ['pid'] int_list = ['pid']
@ -302,4 +301,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,15 @@ Usage (module):
import jc.parsers.xml import jc.parsers.xml
result = jc.parsers.xml.parse(xml_file_output) result = jc.parsers.xml.parse(xml_file_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' XML Document converted to a Dictionary
See https://github.com/martinblech/xmltodict for details
{
"key1": string/object,
"key2": string/object
}
Examples: Examples:
@ -70,7 +76,8 @@ except Exception:
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = 'XML file parser' description = 'XML file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -83,7 +90,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -93,12 +100,7 @@ def process(proc_data):
Returns: Returns:
Dictionary representing an XML document: Dictionary representing an XML document.
{
XML Document converted to a Dictionary
See https://github.com/martinblech/xmltodict for details
}
""" """
# No further processing # No further processing
@ -131,4 +133,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

View File

@ -9,9 +9,17 @@ Usage (module):
import jc.parsers.yaml import jc.parsers.yaml
result = jc.parsers.yaml.parse(yaml_file_output) result = jc.parsers.yaml.parse(yaml_file_output)
Compatibility: Schema:
'linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd' YAML Document converted to a Dictionary
See https://pypi.org/project/ruamel.yaml for details
[
{
"key1": string/int/float/boolean/null/array/object,
"key2": string/int/float/boolean/null/array/object
}
]
Examples: Examples:
@ -82,7 +90,8 @@ except Exception:
class info(): class info():
version = '1.3' """Provides parser metadata (version, author, etc.)"""
version = '1.4'
description = 'YAML file parser' description = 'YAML file parser'
author = 'Kelly Brazil' author = 'Kelly Brazil'
author_email = 'kellyjonbrazil@gmail.com' author_email = 'kellyjonbrazil@gmail.com'
@ -95,7 +104,7 @@ class info():
__version__ = info.version __version__ = info.version
def process(proc_data): def _process(proc_data):
""" """
Final processing to conform to the schema. Final processing to conform to the schema.
@ -105,14 +114,7 @@ def process(proc_data):
Returns: Returns:
List of Dictionaries. Each dictionary represents a YAML document: List of Dictionaries. Each dictionary represents a YAML document.
[
{
YAML Document converted to a Dictionary
See https://pypi.org/project/ruamel.yaml for details
}
]
""" """
# No further processing # No further processing
@ -153,4 +155,4 @@ def parse(data, raw=False, quiet=False):
if raw: if raw:
return raw_output return raw_output
else: else:
return process(raw_output) return _process(raw_output)

Binary file not shown.

View File

@ -20,4 +20,6 @@ with open('man/jc.1', 'rb') as f_in:
with gzip.open('man/jc.1.gz', 'wb') as f_out: with gzip.open('man/jc.1.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out) shutil.copyfileobj(f_in, f_out)
shutil.copyfile('man/jc.1.gz', 'jc/man/jc.1.gz')
os.remove('man/jc.1') os.remove('man/jc.1')

View File

@ -5,7 +5,7 @@ with open('README.md', 'r') as f:
setuptools.setup( setuptools.setup(
name='jc', name='jc',
version='1.15.0', version='1.15.1',
author='Kelly Brazil', author='Kelly Brazil',
author_email='kellyjonbrazil@gmail.com', author_email='kellyjonbrazil@gmail.com',
description='Converts the output of popular command-line tools and file-types to JSON.', description='Converts the output of popular command-line tools and file-types to JSON.',

View File

@ -40,7 +40,7 @@ debug - show traceback (\fB-dd\fP for verbose traceback)
.TP .TP
.B .B
\fB-h\fP \fB-h\fP
help help - use `-h --parser_name` for parser documentation
.TP .TP
.B .B
\fB-m\fP \fB-m\fP
@ -105,6 +105,12 @@ or using the magic syntax:
jc \fB-p\fP ls \fB-al\fP jc \fB-p\fP ls \fB-al\fP
For parser documentation:
jc \fB-h\fP \fB--ls\fP
.SH AUTHOR .SH AUTHOR
{{ jc.author }} ({{ jc.author_email }}) {{ jc.author }} ({{ jc.author_email }})

View File

@ -130,7 +130,7 @@ The JSON output can be compact (default) or pretty formatted with the `-p` optio
### Options ### Options
- `-a` about `jc`. Prints information about `jc` and the parsers (in JSON, of course!) - `-a` about `jc`. Prints information about `jc` and the parsers (in JSON, of course!)
- `-d` debug mode. Prints trace messages if parsing issues are encountered (use `-dd` for verbose debugging) - `-d` debug mode. Prints trace messages if parsing issues are encountered (use `-dd` for verbose debugging)
- `-h` `jc` help - `-h` `jc` help. Use `jc -h --parser_name` for parser documentation
- `-m` monochrome JSON output - `-m` monochrome JSON output
- `-p` pretty format the JSON output - `-p` pretty format the JSON output
- `-q` quiet mode. Suppresses parser warning messages - `-q` quiet mode. Suppresses parser warning messages

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
[{"name":"make","epoch":1,"version":"3.82","release":"24.el7","architecture":"x86_64","install_date":"Wed 16 Oct 2019 09:21:42 AM PDT","group":"Development/Tools","size":1160660,"license":"GPLv2+","signature":"RSA/SHA256, Thu 22 Aug 2019 02:34:59 PM PDT, Key ID 24c6a8a7f4a80eb5","source_rpm":"make-3.82-24.el7.src.rpm","build_date":"Thu 08 Aug 2019 05:47:25 PM PDT","build_host":"x86-01.bsys.centos.org","relocations":"(not relocatable)","packager":"CentOS BuildSystem <http://bugs.centos.org>","vendor":"CentOS","url":"http://www.gnu.org/software/make/","summary":"A GNU tool which simplifies the build process for users","description":"A GNU tool for controlling the generation of executables and other non-source files of a program from the program's source files. Make allows users to build and install packages without any significant knowledge about the details of the build process. The details about how the program should be built are provided for make in the program's makefile.","build_epoch":1565311645,"build_epoch_utc":null}] [{"name":"make","epoch":1,"version":"3.82","release":"24.el7","architecture":"x86_64","install_date":"Wed 16 Oct 2019 09:21:42 AM PDT","group":"Development/Tools","size":1160660,"license":"GPLv2+","signature":"RSA/SHA256, Thu 22 Aug 2019 02:34:59 PM PDT, Key ID 24c6a8a7f4a80eb5","source_rpm":"make-3.82-24.el7.src.rpm","build_date":"Thu 08 Aug 2019 05:47:25 PM PDT","build_host":"x86-01.bsys.centos.org","relocations":"(not relocatable)","packager":"CentOS BuildSystem <http://bugs.centos.org>","vendor":"CentOS","url":"http://www.gnu.org/software/make/","summary":"A GNU tool which simplifies the build process for users","description":"A GNU tool for controlling the generation of executables and other non-source files of a program from the program's source files. Make allows users to build and install packages without any significant knowledge about the details of the build process. The details about how the program should be built are provided for make in the program's makefile.","build_epoch":1565311645,"build_epoch_utc":null,"install_date_epoch":1571242902,"install_date_epoch_utc":null}]

View File

@ -19,7 +19,13 @@ class MyTests(unittest.TestCase):
'jc -p -r airport -I': 'airport -I | jc --airport -pr', 'jc -p -r airport -I': 'airport -I | jc --airport -pr',
'jc -prd airport -I': 'airport -I | jc --airport -prd', 'jc -prd airport -I': 'airport -I | jc --airport -prd',
'jc -p nonexistent command': 'nonexistent command', 'jc -p nonexistent command': 'nonexistent command',
'jc -ap': None 'jc -ap': None,
'jc -a arp -a': None,
'jc -v': None,
'jc -h': None,
'jc -h --arp': None,
'jc -h arp': None,
'jc -h arp -a': None
} }
for command, expected_command in commands.items(): for command, expected_command in commands.items():