[![Build Status](https://app.travis-ci.com/jefvantongerloo/textfsm-aos.svg?branch=main)](https://app.travis-ci.com/jefvantongerloo/textfsm-aos)
# TEXTFSM-AOS
> Alcatel-Lucent Enterprise AOS CLI parsing
Python package for Alcatel-Lucent Enterprise aos6 and aos8 parsing based on TextFSM templates.
## Why TextFSM-AOS?
Parse semi-structured cli data to structured data ready to be ingested by your network automation pipeline. Automatically transform gathered output from screen-scraping tools like Netmiko, Scrapli and Paramiko. Receive uniform data across Alcatel-Lucent Enterprise devices running aos6 or aos8.
## Installation
Textfsm-aos can be installed using Git + Poetry or PyPI.
s
## Git
```bash
git clone https://github.com/jefvantongerloo/textfsm-aos
poetry install
```
## PyPI
```bash
pip install textfsm-aos
```
## Getting started
Provide screen-scraped data to parser
```python
from textfsm_aos.parser import parse
sample_data = """
Package Release Size Description
-----------------+---------------+--------+-----------------------------------
KFbase.img 6.7.2.89.R06 18059551 Alcatel-Lucent Enterprise Base Softw
KFos.img 6.7.2.89.R06 3566798 Alcatel-Lucent Enterprise OS
KFeni.img 6.7.2.89.R06 6123991 Alcatel-Lucent Enterprise NI softwar
KFsecu.img 6.7.2.89.R06 649383 Alcatel-Lucent Enterprise Security M
"""
parse("ale_aos6", "show microcode", sample_data)
```
parsed result
```python
[
{
"package":"KFbase.img",
"release":"6.7.2.89.R06",
"size":"18059551",
"description":"Alcatel-Lucent Enterprise Base Softw"
},
{
"package":"KFos.img",
"release":"6.7.2.89.R06",
"size":"3566798",
"description":"Alcatel-Lucent Enterprise OS"
},
{
"package":"KFeni.img",
"release":"6.7.2.89.R06",
"size":"6123991",
"description":"Alcatel-Lucent Enterprise NI softwar"
},
{
"package":"KFsecu.img",
"release":"6.7.2.89.R06",
"size":"649383",
"description":"Alcatel-Lucent Enterprise Security M"
}
]
```
## Integration tests
Due to sensitive information the gathered live data for integration testing is stored in a private repository. Releases are tested against following aos versions:
| aos version | tests |
|-----------------------------------|:-----------------------------------:|
| 6.7.2.122.R08 | :heavy_check_mark: |
| 8.9.73.R01 | :heavy_check_mark: |
| 8.8.56.R02 | :heavy_check_mark: |
| 8.8.152.R01 | :heavy_check_mark: |
| 8.9.73.R01 | :heavy_check_mark: |
| 8.9.107.R02 | :heavy_check_mark: |
## Supported commands
| command | aos6 | aos8 |
|--------------------------------|:-----------------------------------:|:---------------------------------:|
| history | `alias: show history` | :heavy_check_mark: |
| show 802.1x users | :heavy_check_mark: | `alias: show unp user` |
| show 802.1x users unp | :heavy_check_mark: | :x: |
| show 802.1x non-supplicant | :heavy_check_mark: | :x: |
| show 802.1x non-supplicant unp | :heavy_check_mark: | :x: |
| show arp | :x: | :heavy_check_mark: |
| show chassis | :heavy_check_mark: | :heavy_check_mark: |
| show cmm | :x: | :heavy_check_mark: |
| show command-log | :heavy_check_mark: | :heavy_check_mark: |
| show hardware-info | :x: | :heavy_check_mark: |
| show health | :heavy_check_mark: | :heavy_check_mark: |
| show history | :heavy_check_mark: | `alias: history` |
| show interface status | :heavy_check_mark: | :heavy_check_mark: |
| show interfaces | :x: | :heavy_check_mark: |
| show ip interface | :heavy_check_mark: | :heavy_check_mark: |
| show ip route | :heavy_check_mark: | `alias: show ip routes` |
| show ip router database | :x: | :heavy_check_mark: |
| show ip routes | `alias: show ip route` | :heavy_check_mark: |
| show linkagg | :x: | :heavy_check_mark: |
| show linkagg port | :x: | :heavy_check_mark: |
| show lld remote system | :heavy_check_mark: | :x: |
| show log events | :x: | :heavy_check_mark: |
| show mac-address-table | :heavy_check_mark: | `alias: show mac-learning` |
| show mac-learning | `alias: show mac-address-table` | :heavy_check_mark: |
| show microcode | :heavy_check_mark: | :heavy_check_mark: |
| show ntp server status | :heavy_check_mark: | :heavy_check_mark: |
| show port-security brief | :x: | :heavy_check_mark: |
| show qos port | :x: | :heavy_check_mark: |
| show unp user | `alias: show 802.1x users` | :heavy_check_mark: |
| show unp user details | :x: | :heavy_check_mark: |
| show user | :heavy_check_mark: | :heavy_check_mark: |
| show running-directory | :x: | :heavy_check_mark: |
| show qos log | :x: | :heavy_check_mark: |
| show snmp station | :heavy_check_mark: | :heavy_check_mark: |
| show snmp community map | :heavy_check_mark: | `alias: show snmp community-map` |
| show snmp community-map | `alias: show snmp community map` | :heavy_check_mark: |
| show spantree ports | :x: | :heavy_check_mark: |
| show system | :heavy_check_mark: | :heavy_check_mark: |
| show transceivers | :x: | :heavy_check_mark: |
| show vlan | :heavy_check_mark: | :heavy_check_mark: |
| show vlan members | :x: | :heavy_check_mark: |
| show vlan port mobile | :heavy_check_mark: | :x: |
## Direct TextFSM example usage
Bypass the build-in parser functionality and use the TextFSM templates directly in network cli scraping and orchestration tools like Netmiko, Scrapli and Ansible.
### Scrapli
Python script:
```python
from scrapli import Scrapli
from scrapli.helper import textfsm_parse
device = {
"host": "<host ip>",
"auth_username": "<username>",
"auth_password": "<password>",
"auth_strict_key": False,
"transport": "ssh2",
"platform": "alcatel_aos",
}
with Scrapli(**device) as conn:
response = conn.send_command("show health").result
structured_response = textfsm_parse(
"templates/ale_aos6_show_health.textfsm", response
)
```
Example output:
```python
[
{
"resource":"Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Transmit/Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Memory",
"limit":"80",
"current":"76",
"min_avg":"76",
"hr_avg":"76",
"hr_max":"76"
},
{
"resource":"Cpu",
"limit":"80",
"current":"32",
"min_avg":"33",
"hr_avg":"29",
"hr_max":"97"
}
]
```
### Netmiko
Python script:
```python
from netmiko import ConnectHandler
device = {
'device_type': 'alcatel_aos',
'host': '<host ip>',
'username': '<username>',
'password': '<password>'
}
with ConnectHandler(**device) as conn:
output = conn.send_command("show health", use_textfsm=True, textfsm_template="textfsm-aos/templates/ale_aos6_show_health.textfsm")
```
Example Output:
```python
[
{
"resource":"Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Transmit/Receive",
"limit":"80",
"current":"01",
"min_avg":"01",
"hr_avg":"01",
"hr_max":"01"
},
{
"resource":"Memory",
"limit":"80",
"current":"76",
"min_avg":"76",
"hr_avg":"76",
"hr_max":"76"
},
{
"resource":"Cpu",
"limit":"80",
"current":"32",
"min_avg":"33",
"hr_avg":"29",
"hr_max":"97"
}
]
```
### Ansible
Ansible task:
```yaml
- name: AOS6 >> parsed with textfsm
set_fact:
health: "{{ health-aos6 | ansible.netcommon.parse_cli_textfsm('textfsm/templates/ale_aos6_show_health.textfsm') }}"
```
Example Output:
```yaml
health:
- healthModuleCpu1HrAvg: '29'
healthModuleCpu1HrMax: '98'
healthModuleCpu1MinAvg: '26'
healthModuleCpuLatest: '31'
healthModuleCpuLimit: '80'
healthModuleMemory1HrAvg: '76'
healthModuleMemory1HrMax: '76'
healthModuleMemory1MinAvg: '76'
healthModuleMemoryLatest: '76'
healthModuleMemoryLimit: '80'
healthModuleRx1HrAvg: '01'
healthModuleRx1HrMax: '01'
healthModuleRx1MinAvg: '01'
healthModuleRxLatest: '01'
healthModuleRxLimit: '80'
healthModuleRxTxRx1HrAvg: '01'
healthModuleRxTxRx1HrMax: '01'
healthModuleRxTxRx1MinAvg: '01'
healthModuleRxTxRxLatest: '01'
healthModuleRxTxRxLimit: '80'
healthModuleSlot: '1'
```
## How to contribute
1. Fork and create a branch with naming `<platform>_<command>` (for example: ale_aos8_show_system).
2. Add TextFSM template file in templates folder with naming `<platform>_<command>.textfsm`.
3. Add entry in templates_index with attribute command and platform.
4. Add test folder in 'templates' with naming `<platform>_<command>`.
5. Add sample cli output file in newly created folder `<platform>_<command>.txt`.
6. Add expected parsed data from sample cli output in `<platform>_<command>.yml`.
7. Run linting `tox` and tests `pytest`.
## How to setup development environment
1. Install `Poetry` package manager via `pip install poetry`
2. Install dev dependencies and textfsm-aos package in development mode with `poetry install`
3. Open virtual environment `poetry shell`
## Related projects
- Google TextFSM: [https://github.com/google/textfsm](https://github.com/google/textfsm)
- Scrapli: [https://github.com/carlmontanari/scrapli](https://github.com/carlmontanari/scrapli)
- Netmiko: [https://github.com/ktbyers/netmiko](https://github.com/ktbyers/netmiko)
- Getting started with TextFSM: [https://pyneng.readthedocs.io](https://pyneng.readthedocs.io/en/latest/book/21_textfsm/index.html)
Raw data
{
"_id": null,
"home_page": "https://github.com/jefvantongerloo/textfsm-aos",
"name": "textfsm-aos",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "network automation,textfsm,scraping,Alcatel-Lucent Enterprise,infrastructure",
"author": "Jef Vantongerloo",
"author_email": "jefvantongerloo@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/f6/97/641fc5675726f1d4ffa5491b1c5e1320c14842c1bcfffc57c2ff2ad55519/textfsm_aos-1.1.3.tar.gz",
"platform": null,
"description": "[![Build Status](https://app.travis-ci.com/jefvantongerloo/textfsm-aos.svg?branch=main)](https://app.travis-ci.com/jefvantongerloo/textfsm-aos)\n\n# TEXTFSM-AOS\n\n> Alcatel-Lucent Enterprise AOS CLI parsing\n\nPython package for Alcatel-Lucent Enterprise aos6 and aos8 parsing based on TextFSM templates.\n\n## Why TextFSM-AOS?\n\nParse semi-structured cli data to structured data ready to be ingested by your network automation pipeline. Automatically transform gathered output from screen-scraping tools like Netmiko, Scrapli and Paramiko. Receive uniform data across Alcatel-Lucent Enterprise devices running aos6 or aos8.\n\n## Installation\n\nTextfsm-aos can be installed using Git + Poetry or PyPI.\ns\n## Git\n\n```bash\ngit clone https://github.com/jefvantongerloo/textfsm-aos\npoetry install\n```\n\n## PyPI\n\n```bash\npip install textfsm-aos\n```\n\n## Getting started\n\nProvide screen-scraped data to parser\n\n```python\nfrom textfsm_aos.parser import parse\n\nsample_data = \"\"\"\n Package Release Size Description\n-----------------+---------------+--------+-----------------------------------\nKFbase.img 6.7.2.89.R06 18059551 Alcatel-Lucent Enterprise Base Softw\nKFos.img 6.7.2.89.R06 3566798 Alcatel-Lucent Enterprise OS\nKFeni.img 6.7.2.89.R06 6123991 Alcatel-Lucent Enterprise NI softwar\nKFsecu.img 6.7.2.89.R06 649383 Alcatel-Lucent Enterprise Security M\n\"\"\"\n\nparse(\"ale_aos6\", \"show microcode\", sample_data)\n```\n\nparsed result\n\n```python\n[\n {\n \"package\":\"KFbase.img\",\n \"release\":\"6.7.2.89.R06\",\n \"size\":\"18059551\",\n \"description\":\"Alcatel-Lucent Enterprise Base Softw\"\n },\n {\n \"package\":\"KFos.img\",\n \"release\":\"6.7.2.89.R06\",\n \"size\":\"3566798\",\n \"description\":\"Alcatel-Lucent Enterprise OS\"\n },\n {\n \"package\":\"KFeni.img\",\n \"release\":\"6.7.2.89.R06\",\n \"size\":\"6123991\",\n \"description\":\"Alcatel-Lucent Enterprise NI softwar\"\n },\n {\n \"package\":\"KFsecu.img\",\n \"release\":\"6.7.2.89.R06\",\n \"size\":\"649383\",\n \"description\":\"Alcatel-Lucent Enterprise Security M\"\n }\n]\n```\n\n## Integration tests\n\nDue to sensitive information the gathered live data for integration testing is stored in a private repository. Releases are tested against following aos versions:\n\n| aos version | tests |\n|-----------------------------------|:-----------------------------------:|\n| 6.7.2.122.R08 | :heavy_check_mark: |\n| 8.9.73.R01 | :heavy_check_mark: |\n| 8.8.56.R02 | :heavy_check_mark: |\n| 8.8.152.R01 | :heavy_check_mark: |\n| 8.9.73.R01 | :heavy_check_mark: |\n| 8.9.107.R02 | :heavy_check_mark: |\n\n## Supported commands\n\n| command | aos6 | aos8 |\n|--------------------------------|:-----------------------------------:|:---------------------------------:|\n| history | `alias: show history` | :heavy_check_mark: |\n| show 802.1x users | :heavy_check_mark: | `alias: show unp user` |\n| show 802.1x users unp | :heavy_check_mark: | :x: |\n| show 802.1x non-supplicant | :heavy_check_mark: | :x: |\n| show 802.1x non-supplicant unp | :heavy_check_mark: | :x: |\n| show arp | :x: | :heavy_check_mark: |\n| show chassis | :heavy_check_mark: | :heavy_check_mark: |\n| show cmm | :x: | :heavy_check_mark: |\n| show command-log | :heavy_check_mark: | :heavy_check_mark: |\n| show hardware-info | :x: | :heavy_check_mark: |\n| show health | :heavy_check_mark: | :heavy_check_mark: |\n| show history | :heavy_check_mark: | `alias: history` |\n| show interface status | :heavy_check_mark: | :heavy_check_mark: |\n| show interfaces | :x: | :heavy_check_mark: |\n| show ip interface | :heavy_check_mark: | :heavy_check_mark: |\n| show ip route | :heavy_check_mark: | `alias: show ip routes` |\n| show ip router database | :x: | :heavy_check_mark: |\n| show ip routes | `alias: show ip route` | :heavy_check_mark: |\n| show linkagg | :x: | :heavy_check_mark: |\n| show linkagg port | :x: | :heavy_check_mark: |\n| show lld remote system | :heavy_check_mark: | :x: |\n| show log events | :x: | :heavy_check_mark: |\n| show mac-address-table | :heavy_check_mark: | `alias: show mac-learning` |\n| show mac-learning | `alias: show mac-address-table` | :heavy_check_mark: |\n| show microcode | :heavy_check_mark: | :heavy_check_mark: |\n| show ntp server status | :heavy_check_mark: | :heavy_check_mark: |\n| show port-security brief | :x: | :heavy_check_mark: |\n| show qos port | :x: | :heavy_check_mark: |\n| show unp user | `alias: show 802.1x users` | :heavy_check_mark: |\n| show unp user details | :x: | :heavy_check_mark: |\n| show user | :heavy_check_mark: | :heavy_check_mark: |\n| show running-directory | :x: | :heavy_check_mark: |\n| show qos log | :x: | :heavy_check_mark: |\n| show snmp station | :heavy_check_mark: | :heavy_check_mark: |\n| show snmp community map | :heavy_check_mark: | `alias: show snmp community-map` |\n| show snmp community-map | `alias: show snmp community map` | :heavy_check_mark: |\n| show spantree ports | :x: | :heavy_check_mark: |\n| show system | :heavy_check_mark: | :heavy_check_mark: |\n| show transceivers | :x: | :heavy_check_mark: |\n| show vlan | :heavy_check_mark: | :heavy_check_mark: |\n| show vlan members | :x: | :heavy_check_mark: |\n| show vlan port mobile | :heavy_check_mark: | :x: |\n\n## Direct TextFSM example usage\n\nBypass the build-in parser functionality and use the TextFSM templates directly in network cli scraping and orchestration tools like Netmiko, Scrapli and Ansible.\n\n### Scrapli\n\nPython script:\n\n```python\nfrom scrapli import Scrapli\nfrom scrapli.helper import textfsm_parse\n\ndevice = {\n \"host\": \"<host ip>\",\n \"auth_username\": \"<username>\",\n \"auth_password\": \"<password>\",\n \"auth_strict_key\": False,\n \"transport\": \"ssh2\",\n \"platform\": \"alcatel_aos\",\n}\n\nwith Scrapli(**device) as conn:\n response = conn.send_command(\"show health\").result\n structured_response = textfsm_parse(\n \"templates/ale_aos6_show_health.textfsm\", response\n )\n```\n\nExample output:\n\n```python\n[\n {\n \"resource\":\"Receive\",\n \"limit\":\"80\",\n \"current\":\"01\",\n \"min_avg\":\"01\",\n \"hr_avg\":\"01\",\n \"hr_max\":\"01\"\n },\n {\n \"resource\":\"Transmit/Receive\",\n \"limit\":\"80\",\n \"current\":\"01\",\n \"min_avg\":\"01\",\n \"hr_avg\":\"01\",\n \"hr_max\":\"01\"\n },\n {\n \"resource\":\"Memory\",\n \"limit\":\"80\",\n \"current\":\"76\",\n \"min_avg\":\"76\",\n \"hr_avg\":\"76\",\n \"hr_max\":\"76\"\n },\n {\n \"resource\":\"Cpu\",\n \"limit\":\"80\",\n \"current\":\"32\",\n \"min_avg\":\"33\",\n \"hr_avg\":\"29\",\n \"hr_max\":\"97\"\n }\n]\n```\n\n### Netmiko\n\nPython script:\n\n```python\nfrom netmiko import ConnectHandler\n\ndevice = {\n 'device_type': 'alcatel_aos',\n 'host': '<host ip>',\n 'username': '<username>',\n 'password': '<password>'\n}\n\nwith ConnectHandler(**device) as conn:\n output = conn.send_command(\"show health\", use_textfsm=True, textfsm_template=\"textfsm-aos/templates/ale_aos6_show_health.textfsm\")\n```\n\nExample Output:\n\n```python\n[\n {\n \"resource\":\"Receive\",\n \"limit\":\"80\",\n \"current\":\"01\",\n \"min_avg\":\"01\",\n \"hr_avg\":\"01\",\n \"hr_max\":\"01\"\n },\n {\n \"resource\":\"Transmit/Receive\",\n \"limit\":\"80\",\n \"current\":\"01\",\n \"min_avg\":\"01\",\n \"hr_avg\":\"01\",\n \"hr_max\":\"01\"\n },\n {\n \"resource\":\"Memory\",\n \"limit\":\"80\",\n \"current\":\"76\",\n \"min_avg\":\"76\",\n \"hr_avg\":\"76\",\n \"hr_max\":\"76\"\n },\n {\n \"resource\":\"Cpu\",\n \"limit\":\"80\",\n \"current\":\"32\",\n \"min_avg\":\"33\",\n \"hr_avg\":\"29\",\n \"hr_max\":\"97\"\n }\n]\n```\n\n### Ansible\n\nAnsible task:\n\n```yaml\n- name: AOS6 >> parsed with textfsm\n set_fact:\n health: \"{{ health-aos6 | ansible.netcommon.parse_cli_textfsm('textfsm/templates/ale_aos6_show_health.textfsm') }}\"\n```\n\nExample Output:\n\n```yaml\n health:\n - healthModuleCpu1HrAvg: '29'\n healthModuleCpu1HrMax: '98'\n healthModuleCpu1MinAvg: '26'\n healthModuleCpuLatest: '31'\n healthModuleCpuLimit: '80'\n healthModuleMemory1HrAvg: '76'\n healthModuleMemory1HrMax: '76'\n healthModuleMemory1MinAvg: '76'\n healthModuleMemoryLatest: '76'\n healthModuleMemoryLimit: '80'\n healthModuleRx1HrAvg: '01'\n healthModuleRx1HrMax: '01'\n healthModuleRx1MinAvg: '01'\n healthModuleRxLatest: '01'\n healthModuleRxLimit: '80'\n healthModuleRxTxRx1HrAvg: '01'\n healthModuleRxTxRx1HrMax: '01'\n healthModuleRxTxRx1MinAvg: '01'\n healthModuleRxTxRxLatest: '01'\n healthModuleRxTxRxLimit: '80'\n healthModuleSlot: '1'\n```\n\n## How to contribute\n\n1. Fork and create a branch with naming `<platform>_<command>` (for example: ale_aos8_show_system).\n\n2. Add TextFSM template file in templates folder with naming `<platform>_<command>.textfsm`.\n\n3. Add entry in templates_index with attribute command and platform.\n\n4. Add test folder in 'templates' with naming `<platform>_<command>`.\n\n5. Add sample cli output file in newly created folder `<platform>_<command>.txt`.\n\n6. Add expected parsed data from sample cli output in `<platform>_<command>.yml`.\n\n7. Run linting `tox` and tests `pytest`.\n\n## How to setup development environment\n\n1. Install `Poetry` package manager via `pip install poetry`\n\n2. Install dev dependencies and textfsm-aos package in development mode with `poetry install`\n\n3. Open virtual environment `poetry shell`\n\n## Related projects\n\n- Google TextFSM: [https://github.com/google/textfsm](https://github.com/google/textfsm)\n- Scrapli: [https://github.com/carlmontanari/scrapli](https://github.com/carlmontanari/scrapli)\n- Netmiko: [https://github.com/ktbyers/netmiko](https://github.com/ktbyers/netmiko)\n- Getting started with TextFSM: [https://pyneng.readthedocs.io](https://pyneng.readthedocs.io/en/latest/book/21_textfsm/index.html)\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Alcatel-Lucent Enterprise AOS CLI parsing (TextFSM)",
"version": "1.1.3",
"project_urls": {
"Homepage": "https://github.com/jefvantongerloo/textfsm-aos",
"Repository": "https://github.com/jefvantongerloo/textfsm-aos"
},
"split_keywords": [
"network automation",
"textfsm",
"scraping",
"alcatel-lucent enterprise",
"infrastructure"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "f6553102b778288d1065fdf297c3029c575e0683bc9a81d6942cd030e733ccd6",
"md5": "7456de453db1769c03721aefe010e86e",
"sha256": "30b53f923c09dcdd2c48dfb8f5920472720fa421c0c9738b036cb5e37f99e8ce"
},
"downloads": -1,
"filename": "textfsm_aos-1.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7456de453db1769c03721aefe010e86e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 40380,
"upload_time": "2023-06-19T14:18:18",
"upload_time_iso_8601": "2023-06-19T14:18:18.208827Z",
"url": "https://files.pythonhosted.org/packages/f6/55/3102b778288d1065fdf297c3029c575e0683bc9a81d6942cd030e733ccd6/textfsm_aos-1.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f697641fc5675726f1d4ffa5491b1c5e1320c14842c1bcfffc57c2ff2ad55519",
"md5": "b23b0ab73ef0897c890adbcbec08842c",
"sha256": "e0e99eb214a7863b2b4ee2c2af027efcd08d08f80ded8268e8eeac09ec0c9ac2"
},
"downloads": -1,
"filename": "textfsm_aos-1.1.3.tar.gz",
"has_sig": false,
"md5_digest": "b23b0ab73ef0897c890adbcbec08842c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 26072,
"upload_time": "2023-06-19T14:18:20",
"upload_time_iso_8601": "2023-06-19T14:18:20.024959Z",
"url": "https://files.pythonhosted.org/packages/f6/97/641fc5675726f1d4ffa5491b1c5e1320c14842c1bcfffc57c2ff2ad55519/textfsm_aos-1.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-06-19 14:18:20",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jefvantongerloo",
"github_project": "textfsm-aos",
"travis_ci": true,
"coveralls": false,
"github_actions": false,
"requirements": [],
"tox": true,
"lcname": "textfsm-aos"
}