1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-07-13 01:20:24 +02:00

Merge pull request #168 from kellyjonbrazil/master

Sync master to dev
This commit is contained in:
Kelly Brazil
2021-09-10 08:08:45 -07:00
committed by GitHub
3 changed files with 20 additions and 49 deletions

View File

@ -15,11 +15,12 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu
1. Open an issue to discuss the new feature, bug fix, or parser before opening a pull request. For new parsers, it is important to agree upon a schema before developing the parser. 1. Open an issue to discuss the new feature, bug fix, or parser before opening a pull request. For new parsers, it is important to agree upon a schema before developing the parser.
2. Fork the repo and create your branch from `dev`, if available, otherwise `master`. 2. Fork the repo and create your branch from `dev`, if available, otherwise `master`.
3. If you've added code that should be tested, add tests. All new parsers should have several sample outputs and tests. 3. For new parsers: Use the `jc/parsers/foo.py` parser as a [template](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/foo.py) to get started. You can even place a new parser python module file in the [parser plugin directory](https://github.com/kellyjonbrazil/jc#custom-parsers) to get started right away with just a standard `jc` installation.
4. Documentation is auto-generated from docstrings, so ensure they are clear and accurate. 4. If you've added code that should be tested, add tests. All new parsers should have several sample outputs and tests.
5. Ensure the test suite passes. (Note: "**America/Los_Angeles**" timezone should be configured on the test system) 5. Documentation is auto-generated from docstrings, so ensure they are clear and accurate.
6. Make sure your code lints. 6. Ensure the test suite passes. (Note: "**America/Los_Angeles**" timezone should be configured on the test system)
7. Issue that pull request! 7. Make sure your code lints.
8. Issue that pull request!
## Parser Schema Guidelines ## Parser Schema Guidelines
- Try to keep the schema as flat as possible - typically a list of flat dictionaries - Try to keep the schema as flat as possible - typically a list of flat dictionaries
@ -34,11 +35,11 @@ Bad:
``` ```
{ {
"Interface 1": [ "Interface 1": [
192.168.1.1, "192.168.1.1",
172.16.1.1 "172.16.1.1"
], ],
"Wifi Interface 1": [ "Wifi Interface 1": [
10.1.1.1 "10.1.1.1"
] ]
} }
``` ```
@ -48,14 +49,14 @@ Good:
{ {
"interface": "Interface 1", "interface": "Interface 1",
"ip_addresses": [ "ip_addresses": [
192.168.1.1, "192.168.1.1",
172.16.1.1 "172.16.1.1"
] ]
}, },
{ {
"interface": "Wifi Interface 1", "interface": "Wifi Interface 1",
"ip_addresses": [ "ip_addresses": [
10.1.1.1 "10.1.1.1"
] ]
} }
] ]

View File

@ -31,28 +31,13 @@ $ jc dig example.com | jq -r '.[].answer[].data'
``` ```
The `jc` parsers can also be used as python modules. In this case the output will be a python dictionary, or list of dictionaries, instead of JSON: The `jc` parsers can also be used as python modules. In this case the output will be a python dictionary, or list of dictionaries, instead of JSON:
```python ```python
>>> import subprocess
>>> import jc.parsers.dig >>> import jc.parsers.dig
>>> >>>
>>> data = '''; <<>> DiG 9.10.6 <<>> example.com >>> cmd_output = subprocess.check_output(['dig', 'example.com'], text=True)
... ;; global options: +cmd >>> data = jc.parsers.dig.parse(cmd_output)
... ;; Got answer:
... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64612
... ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
...
... ;; OPT PSEUDOSECTION:
... ; EDNS: version: 0, flags:; udp: 4096
... ;; QUESTION SECTION:
... ;example.com. IN A
...
... ;; ANSWER SECTION:
... example.com. 29658 IN A 93.184.216.34
...
... ;; Query time: 52 msec
... ;; SERVER: 2600:1700:bab0:d40::1#53(2600:1700:bab0:d40::1)
... ;; WHEN: Fri Apr 16 16:13:00 PDT 2021
... ;; MSG SIZE rcvd: 56'''
>>> >>>
>>> jc.parsers.dig.parse(data) >>> data
[{'id': 64612, 'opcode': 'QUERY', 'status': 'NOERROR', 'flags': ['qr', 'rd', 'ra'], 'query_num': 1, 'answer_num': [{'id': 64612, 'opcode': 'QUERY', 'status': 'NOERROR', 'flags': ['qr', 'rd', 'ra'], 'query_num': 1, 'answer_num':
1, 'authority_num': 0, 'additional_num': 1, 'opt_pseudosection': {'edns': {'version': 0, 'flags': [], 'udp': 1, 'authority_num': 0, 'additional_num': 1, 'opt_pseudosection': {'edns': {'version': 0, 'flags': [], 'udp':
4096}}, 'question': {'name': 'example.com.', 'class': 'IN', 'type': 'A'}, 'answer': [{'name': 'example.com.', 4096}}, 'question': {'name': 'example.com.', 'class': 'IN', 'type': 'A'}, 'answer': [{'name': 'example.com.',

View File

@ -31,28 +31,13 @@ $ jc dig example.com | jq -r '.[].answer[].data'
``` ```
The `jc` parsers can also be used as python modules. In this case the output will be a python dictionary, or list of dictionaries, instead of JSON: The `jc` parsers can also be used as python modules. In this case the output will be a python dictionary, or list of dictionaries, instead of JSON:
```python ```python
>>> import subprocess
>>> import jc.parsers.dig >>> import jc.parsers.dig
>>> >>>
>>> data = '''; <<>> DiG 9.10.6 <<>> example.com >>> cmd_output = subprocess.check_output(['dig', 'example.com'], text=True)
... ;; global options: +cmd >>> data = jc.parsers.dig.parse(cmd_output)
... ;; Got answer:
... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64612
... ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
...
... ;; OPT PSEUDOSECTION:
... ; EDNS: version: 0, flags:; udp: 4096
... ;; QUESTION SECTION:
... ;example.com. IN A
...
... ;; ANSWER SECTION:
... example.com. 29658 IN A 93.184.216.34
...
... ;; Query time: 52 msec
... ;; SERVER: 2600:1700:bab0:d40::1#53(2600:1700:bab0:d40::1)
... ;; WHEN: Fri Apr 16 16:13:00 PDT 2021
... ;; MSG SIZE rcvd: 56'''
>>> >>>
>>> jc.parsers.dig.parse(data) >>> data
[{'id': 64612, 'opcode': 'QUERY', 'status': 'NOERROR', 'flags': ['qr', 'rd', 'ra'], 'query_num': 1, 'answer_num': [{'id': 64612, 'opcode': 'QUERY', 'status': 'NOERROR', 'flags': ['qr', 'rd', 'ra'], 'query_num': 1, 'answer_num':
1, 'authority_num': 0, 'additional_num': 1, 'opt_pseudosection': {'edns': {'version': 0, 'flags': [], 'udp': 1, 'authority_num': 0, 'additional_num': 1, 'opt_pseudosection': {'edns': {'version': 0, 'flags': [], 'udp':
4096}}, 'question': {'name': 'example.com.', 'class': 'IN', 'type': 'A'}, 'answer': [{'name': 'example.com.', 4096}}, 'question': {'name': 'example.com.', 'class': 'IN', 'type': 'A'}, 'answer': [{'name': 'example.com.',