mirror of
https://github.com/kellyjonbrazil/jc.git
synced 2025-07-13 01:20:24 +02:00
@ -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"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
23
README.md
23
README.md
@ -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.',
|
||||||
|
@ -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.',
|
||||||
|
Reference in New Issue
Block a user