ciscoconfparse2


Nameciscoconfparse2 JSON
Version 0.7.74 PyPI version JSON
download
home_pageNone
SummaryParse, Audit, Query, Build, and Modify Cisco IOS-style and JunOS-style configs
upload_time2024-07-06 11:04:13
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords asa cisco cisco ios juniper nxos parse audit modify query
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            [![logo][66]][66]

# ciscoconfparse2

[![git commits][41]][42] [![Version][2]][3] [![Downloads][6]][7] [![License][8]][9] [![Hatch project][68]][69]

[![SonarCloud][51]][52] [![SonarCloud Maintainability Rating][53]][54] [![SonarCloud Lines of Code][55]][56] [![SonarCloud Bugs][59]][60] [![SonarCloud Code Smells][57]][58] [![SonarCloud Tech Debt][61]][62]

# Introduction: What is ciscoconfparse2?

## Summary

[ciscoconfparse2][17] is similar to an advanced grep and diff that
handles **multi-vendor network configuration files** (such as those from
Arista, Cisco, F5, Juniper, Palo Alto, etc); it is the next generation of
[ciscoconfparse][64], which was the primary development package
from 2007 until 2023.

## A ciscoconfparse2 example

Assume you have a bunch of interfaces in a configuration.  How do you find which ones are shutdown?

One way is manually reading the whole Cisco IOS-XE configuration.  Another option is [ciscoconfparse2][17]

```python
>>> from ciscoconfparse2 import CiscoConfParse
>>>
>>> parse = CiscoConfParse('/path/to/config/file')
>>> intf_cmds = parse.find_parent_objects(['interface', 'shutdown'])
>>>
>>> shut_intf_names = [" ".join(cmd.split()[1:]) for cmd in intf_cmds]
>>>
>>> shut_intf_names
['GigabitEthernet1/5', 'TenGigabitEthernet2/2', 'TenGigabitEthernet2/3']
>>>
```


## Another ciscoconfparse2 example

Assume you have this IOS-XR bgp configuration:

```none
router bgp 65534
  bgp router-id 10.0.0.100
  address-family ipv4 unicast
  !
  neighbor 10.0.0.37
    remote-as 64000
    route-policy EBGP_IN in
    route-policy EBGP_OUT out
  !
  neighbor 10.0.0.1
    remote-as 65534
    update-source Loopback0
    route-policy MANGLE_IN in
    route-policy MANGLE_OUT out
      next-hop-self
  !
  neighbor 10.0.0.34
    remote-as 64000
    route-policy EBGP_IN in
    route-policy EBGP_OUT out
```

You can generate the list of EBGP peers pretty quickly with this script:

```python
from ciscoconfparse2 import CiscoConfParse

parse = CiscoConfParse('/path/to/config/file')   # Or read directly from a list of strings

# Get all neighbor configuration branches
branches = parse.find_object_branches(('router bgp',
                                       'neighbor',
                                       'remote-as'))

# Get the local BGP ASN
bgp_cmd = branches[0][0]
local_asn = bgp_cmd.split()[-1]

# Find EBGP neighbors for any number of peers
for branch in branches:
    neighbor_addr = branch[1].split()[-1]
    remote_asn = branch[2].split()[-1]
    if local_asn != remote_asn:
        print("EBGP NEIGHBOR", neighbor_addr)
```

When you run that, you'll see:

```none
$ python example.py
EBGP NEIGHBOR 10.0.0.37
EBGP NEIGHBOR 10.0.0.34
$
```

There is a lot more possible; see the [tutorial](http://www.pennington.net/py/ciscoconfparse2/tutorial.html).

## CLI Tool

[ciscoconfparse2][17] distributes a [CLI tool][67] that will diff and grep various
network configuration or text files.

## API Examples

The API examples are [documented on the web][70]


# Why

[ciscoconfparse2][17] is a [Python][10] library
that helps you quickly search for questions like these in your
router / switch / firewall / load-balancer / wireless text
configurations:

- What interfaces are shutdown?
- Which interfaces are in trunk mode?
- What address and subnet mask is assigned to each interface?
- Which interfaces are missing a critical command?
- Is this configuration missing a standard config line?

It can help you:

- Audit existing router / switch / firewall / wlc configurations
- Modify existing configurations
- Build new configurations

Speaking generally, the library examines a text network config and breaks
it into a set of linked parent / child relationships. You can perform
complex queries about these relationships.

[![Cisco IOS config: Parent / child][11]][11]

## What changed in ciscoconfparse2?

In late 2023, I started a rewrite because [ciscoconfparse][64] is too large 
and has some defaults that I wish it didn't have.  I froze
[ciscoconfparse][64] PYPI releases at [version 1.9.41][65]; there will be no
more [ciscoconfparse][64] PYPI releases.

What do you do?  Upgrade to [ciscoconfparse2][17]!

Here's why, it:

- Includes a handy [CLI command][67] (including greps for mac addresses and IPv4 / IPv6 subnets)
- Streamlines the API towards a simpler user interface.
- Removes legacy and flawed methods from the original (this could be a breaking change for old scripts).
- Adds string methods to `BaseCfgLine()` objects
- Defaults `ignore_blank_lines=False` (this could be a breaking change for old scripts).
- Is better at handling multiple-child-level configurations (such as IOS XR and JunOS)
- Can search for parents and children using an *arbitrary list of ancestors*
- Adds the concept of change commits; this is a config-modification safety feature that [ciscoconfparse][64] lacks
- Adds an `auto_commit` keyword, which defaults True
- Documents much more of the API
- Intentionally requires a different import statement to minimize confusion between the original and [ciscoconfparse2][17]
- Vasly improves Cisco IOS diffs

# Docs, Installation, and Dependencies

- The latest copy of the docs are [archived on the web][15]

## Installation and Downloads

-   Use `pip` for Python3.x\... :

        python -m pip install ciscoconfparse2

## Dependencies

- [Python 3](https://python.org/)
- [attrs](https://github.com/python-attrs/attrs)
- [passlib](https://github.com/glic3rinu/passlib)
- [tomlkit](https://github.com/sdispater/tomlkit)
- [dnspython](https://github.com/rthalley/dnspython)
- [`hier_config`](https://github.com/netdevops/hier_config)
- [`PyYAML`](https://github.com/yaml/pyyaml)
- [`pyparsing`](https://github.com/pyparsing/pyparsing)
- [typeguard](https://github.com/agronholm/typeguard)
- [loguru](https://github.com/Delgan/loguru)


## Pre-requisites

[The ciscoconfparse2 python package][3] requires Python versions 3.7+.

Type-hinting (work-in-progress) targets Python3.9+ due to the need for `tuple[str, ...]` hints.

## What is the pythonic way of handling script credentials?

1. Never hard-code credentials
2. Use [python-dotenv](https://github.com/theskumar/python-dotenv)

# Other Resources

- [Dive into Python3](http://www.diveintopython3.net/) is a good way to learn Python
- [Team CYMRU][30] has a [Secure IOS Template][29], which is especially useful for external-facing routers / switches
- [Cisco\'s Guide to hardening IOS devices][31]
- [Center for Internet Security Benchmarks][32] (An email address, cookies, and javascript are required)

## Are you releasing licensing besides GPLv3?

I will not. however, if it's truly a problem for your company, there are commercial solutions available (to include purchasing the project, or hiring me).

## Bug Tracker and Support

- Please report any suggestions, bug reports, or annoyances with a [github bug report][24].
- If you\'re having problems with general python issues, consider searching for a solution on [Stack Overflow][33].  If you can\'t find a solution for your problem or need more help, you can [ask on Stack Overflow][34] or [reddit/r/Python][39].
- If you\'re having problems with your Cisco devices, you can contact:
  - [Cisco TAC][28]
  - [reddit/r/Cisco][35]
  - [reddit/r/networking][36]
  - [NetworkEngineering.se][23]

# License and Copyright

[ciscoconfparse2][3] is licensed [GPLv3][21]

- Copyright (C) 2023-2024 David Michael Pennington

The word \"Cisco\" is a registered trademark of [Cisco Systems][27].

# Author

[ciscoconfparse2][3] was written by [David Michael Pennington][25].



  [1]: https://github.com/mpenning/ciscoconfparse2/blob/main/.github/workflows/tests.yml
  [2]: https://img.shields.io/pypi/v/ciscoconfparse2.svg
  [3]: https://pypi.python.org/pypi/ciscoconfparse2/
  [4]: https://github.com/mpenning/ciscoconfparse2/actions/workflows/tests.yml/badge.svg
  [5]: https://github.com/mpenning/ciscoconfparse2/actions/workflows/tests.yml
  [6]: https://pepy.tech/badge/ciscoconfparse2
  [7]: https://pepy.tech/project/ciscoconfparse2
  [8]: http://img.shields.io/badge/license-GPLv3-blue.svg
  [9]: https://www.gnu.org/copyleft/gpl.html
  [10]: https://www.python.org
  [11]: https://raw.githubusercontent.com/mpenning/ciscoconfparse/master/sphinx-doc/_static/ciscoconfparse_overview_75pct.png
  [12]: https://github.com/mpenning/ciscoconfparse2/blob/main/pyproject.toml
  [13]: https://github.com/mpenning/ciscoconfparse2/blob/master/configs/sample_01.junos
  [14]: https://github.com/mpenning/ciscoconfparse/issues/17
  [15]: http://www.pennington.net/py/ciscoconfparse2/
  [16]: http://pennington.net/tutorial/ciscoconfparse2/ccp_tutorial.html
  [17]: https://github.com/mpenning/ciscoconfparse2
  [18]: https://github.com/mpenning/ciscoconfparse/issues/117
  [19]: https://github.com/mpenning/ciscoconfparse/issues/13
  [20]: https://github.com/CrackerJackMack/
  [21]: http://www.gnu.org/licenses/gpl-3.0.html
  [22]: https://pypy.org
  [23]: https://networkengineering.stackexchange.com/
  [24]: https://github.com/mpenning/ciscoconfparse2/issues/new/choose
  [25]: https://github.com/mpenning
  [26]: https://github.com/muir
  [27]: https://www.cisco.com/
  [28]: https://www.cisco.com/go/support
  [29]: https://www.cymru.com/Documents/secure-ios-template.html
  [30]: https://team-cymru.com/company/
  [31]: http://www.cisco.com/c/en/us/support/docs/ip/access-lists/13608-21.html
  [32]: https://learn.cisecurity.org/benchmarks
  [33]: https://stackoverflow.com
  [34]: http://stackoverflow.com/questions/ask
  [35]: https://www.reddit.com/r/Cisco/
  [36]: https://www.reddit.com/r/networking
  [37]: https://snyk.io/advisor/python/ciscoconfparse2/badge.svg
  [38]: https://snyk.io/advisor/python/ciscoconfparse2
  [39]: https://www.reddit.com/r/Python/
  [41]: https://img.shields.io/github/commit-activity/m/mpenning/ciscoconfparse2
  [42]: https://img.shields.io/github/commit-activity/m/mpenning/ciscoconfparse2
  [43]: https://www.codefactor.io/Content/badges/B.svg
  [44]: https://www.codefactor.io/repository/github/mpenning/ciscoconfparse2/
  [45]: https://fossa.com/blog/open-source-software-licenses-101-gpl-v3/
  [46]: https://app.codacy.com/project/badge/Grade/4774ebb0292d4e1d9dc30bf263d9df14
  [47]: https://app.codacy.com/gh/mpenning/ciscoconfparse2/dashboard
  [48]: https://commitizen-tools.github.io/commitizen/
  [49]: https://semver.org/
  [50]: https://www.conventionalcommits.org/en/v1.0.0/
  [51]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=alert_status
  [52]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2
  [53]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=sqale_rating
  [54]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2
  [55]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=ncloc
  [56]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2
  [57]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=code_smells
  [58]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2
  [59]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=bugs
  [60]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2
  [61]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=sqale_index
  [62]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2
  [63]: https://docs.pytest.org/en/
  [64]: https://github.com/mpenning/ciscoconfparse
  [65]: https://pypi.org/project/ciscoconfparse/1.9.41/
  [66]: https://raw.githubusercontent.com/mpenning/ciscoconfparse2/main/sphinx-doc/_static/ciscoconfparse_logo_bw_01.png
  [67]: http://www.pennington.net/py/ciscoconfparse2/cli.html
  [68]: https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg
  [69]: https://github.com/pypa/hatch
  [70]: http://www.pennington.net/py/ciscoconfparse2/examples.html


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ciscoconfparse2",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "ASA, Cisco, Cisco IOS, Juniper, NXOS, Parse, audit, modify, query",
    "author": null,
    "author_email": "Mike Pennington <mike@pennington.net>",
    "download_url": "https://files.pythonhosted.org/packages/9b/33/4c973f59601fd398729dd7354675acd6e657fc299e4e3aab84f619d5498e/ciscoconfparse2-0.7.74.tar.gz",
    "platform": null,
    "description": "[![logo][66]][66]\n\n# ciscoconfparse2\n\n[![git commits][41]][42] [![Version][2]][3] [![Downloads][6]][7] [![License][8]][9] [![Hatch project][68]][69]\n\n[![SonarCloud][51]][52] [![SonarCloud Maintainability Rating][53]][54] [![SonarCloud Lines of Code][55]][56] [![SonarCloud Bugs][59]][60] [![SonarCloud Code Smells][57]][58] [![SonarCloud Tech Debt][61]][62]\n\n# Introduction: What is ciscoconfparse2?\n\n## Summary\n\n[ciscoconfparse2][17] is similar to an advanced grep and diff that\nhandles **multi-vendor network configuration files** (such as those from\nArista, Cisco, F5, Juniper, Palo Alto, etc); it is the next generation of\n[ciscoconfparse][64], which was the primary development package\nfrom 2007 until 2023.\n\n## A ciscoconfparse2 example\n\nAssume you have a bunch of interfaces in a configuration.  How do you find which ones are shutdown?\n\nOne way is manually reading the whole Cisco IOS-XE configuration.  Another option is [ciscoconfparse2][17]\n\n```python\n>>> from ciscoconfparse2 import CiscoConfParse\n>>>\n>>> parse = CiscoConfParse('/path/to/config/file')\n>>> intf_cmds = parse.find_parent_objects(['interface', 'shutdown'])\n>>>\n>>> shut_intf_names = [\" \".join(cmd.split()[1:]) for cmd in intf_cmds]\n>>>\n>>> shut_intf_names\n['GigabitEthernet1/5', 'TenGigabitEthernet2/2', 'TenGigabitEthernet2/3']\n>>>\n```\n\n\n## Another ciscoconfparse2 example\n\nAssume you have this IOS-XR bgp configuration:\n\n```none\nrouter bgp 65534\n  bgp router-id 10.0.0.100\n  address-family ipv4 unicast\n  !\n  neighbor 10.0.0.37\n    remote-as 64000\n    route-policy EBGP_IN in\n    route-policy EBGP_OUT out\n  !\n  neighbor 10.0.0.1\n    remote-as 65534\n    update-source Loopback0\n    route-policy MANGLE_IN in\n    route-policy MANGLE_OUT out\n      next-hop-self\n  !\n  neighbor 10.0.0.34\n    remote-as 64000\n    route-policy EBGP_IN in\n    route-policy EBGP_OUT out\n```\n\nYou can generate the list of EBGP peers pretty quickly with this script:\n\n```python\nfrom ciscoconfparse2 import CiscoConfParse\n\nparse = CiscoConfParse('/path/to/config/file')   # Or read directly from a list of strings\n\n# Get all neighbor configuration branches\nbranches = parse.find_object_branches(('router bgp',\n                                       'neighbor',\n                                       'remote-as'))\n\n# Get the local BGP ASN\nbgp_cmd = branches[0][0]\nlocal_asn = bgp_cmd.split()[-1]\n\n# Find EBGP neighbors for any number of peers\nfor branch in branches:\n    neighbor_addr = branch[1].split()[-1]\n    remote_asn = branch[2].split()[-1]\n    if local_asn != remote_asn:\n        print(\"EBGP NEIGHBOR\", neighbor_addr)\n```\n\nWhen you run that, you'll see:\n\n```none\n$ python example.py\nEBGP NEIGHBOR 10.0.0.37\nEBGP NEIGHBOR 10.0.0.34\n$\n```\n\nThere is a lot more possible; see the [tutorial](http://www.pennington.net/py/ciscoconfparse2/tutorial.html).\n\n## CLI Tool\n\n[ciscoconfparse2][17] distributes a [CLI tool][67] that will diff and grep various\nnetwork configuration or text files.\n\n## API Examples\n\nThe API examples are [documented on the web][70]\n\n\n# Why\n\n[ciscoconfparse2][17] is a [Python][10] library\nthat helps you quickly search for questions like these in your\nrouter / switch / firewall / load-balancer / wireless text\nconfigurations:\n\n- What interfaces are shutdown?\n- Which interfaces are in trunk mode?\n- What address and subnet mask is assigned to each interface?\n- Which interfaces are missing a critical command?\n- Is this configuration missing a standard config line?\n\nIt can help you:\n\n- Audit existing router / switch / firewall / wlc configurations\n- Modify existing configurations\n- Build new configurations\n\nSpeaking generally, the library examines a text network config and breaks\nit into a set of linked parent / child relationships. You can perform\ncomplex queries about these relationships.\n\n[![Cisco IOS config: Parent / child][11]][11]\n\n## What changed in ciscoconfparse2?\n\nIn late 2023, I started a rewrite because [ciscoconfparse][64] is too large \nand has some defaults that I wish it didn't have.  I froze\n[ciscoconfparse][64] PYPI releases at [version 1.9.41][65]; there will be no\nmore [ciscoconfparse][64] PYPI releases.\n\nWhat do you do?  Upgrade to [ciscoconfparse2][17]!\n\nHere's why, it:\n\n- Includes a handy [CLI command][67] (including greps for mac addresses and IPv4 / IPv6 subnets)\n- Streamlines the API towards a simpler user interface.\n- Removes legacy and flawed methods from the original (this could be a breaking change for old scripts).\n- Adds string methods to `BaseCfgLine()` objects\n- Defaults `ignore_blank_lines=False` (this could be a breaking change for old scripts).\n- Is better at handling multiple-child-level configurations (such as IOS XR and JunOS)\n- Can search for parents and children using an *arbitrary list of ancestors*\n- Adds the concept of change commits; this is a config-modification safety feature that [ciscoconfparse][64] lacks\n- Adds an `auto_commit` keyword, which defaults True\n- Documents much more of the API\n- Intentionally requires a different import statement to minimize confusion between the original and [ciscoconfparse2][17]\n- Vasly improves Cisco IOS diffs\n\n# Docs, Installation, and Dependencies\n\n- The latest copy of the docs are [archived on the web][15]\n\n## Installation and Downloads\n\n-   Use `pip` for Python3.x\\... :\n\n        python -m pip install ciscoconfparse2\n\n## Dependencies\n\n- [Python 3](https://python.org/)\n- [attrs](https://github.com/python-attrs/attrs)\n- [passlib](https://github.com/glic3rinu/passlib)\n- [tomlkit](https://github.com/sdispater/tomlkit)\n- [dnspython](https://github.com/rthalley/dnspython)\n- [`hier_config`](https://github.com/netdevops/hier_config)\n- [`PyYAML`](https://github.com/yaml/pyyaml)\n- [`pyparsing`](https://github.com/pyparsing/pyparsing)\n- [typeguard](https://github.com/agronholm/typeguard)\n- [loguru](https://github.com/Delgan/loguru)\n\n\n## Pre-requisites\n\n[The ciscoconfparse2 python package][3] requires Python versions 3.7+.\n\nType-hinting (work-in-progress) targets Python3.9+ due to the need for `tuple[str, ...]` hints.\n\n## What is the pythonic way of handling script credentials?\n\n1. Never hard-code credentials\n2. Use [python-dotenv](https://github.com/theskumar/python-dotenv)\n\n# Other Resources\n\n- [Dive into Python3](http://www.diveintopython3.net/) is a good way to learn Python\n- [Team CYMRU][30] has a [Secure IOS Template][29], which is especially useful for external-facing routers / switches\n- [Cisco\\'s Guide to hardening IOS devices][31]\n- [Center for Internet Security Benchmarks][32] (An email address, cookies, and javascript are required)\n\n## Are you releasing licensing besides GPLv3?\n\nI will not. however, if it's truly a problem for your company, there are commercial solutions available (to include purchasing the project, or hiring me).\n\n## Bug Tracker and Support\n\n- Please report any suggestions, bug reports, or annoyances with a [github bug report][24].\n- If you\\'re having problems with general python issues, consider searching for a solution on [Stack Overflow][33].  If you can\\'t find a solution for your problem or need more help, you can [ask on Stack Overflow][34] or [reddit/r/Python][39].\n- If you\\'re having problems with your Cisco devices, you can contact:\n  - [Cisco TAC][28]\n  - [reddit/r/Cisco][35]\n  - [reddit/r/networking][36]\n  - [NetworkEngineering.se][23]\n\n# License and Copyright\n\n[ciscoconfparse2][3] is licensed [GPLv3][21]\n\n- Copyright (C) 2023-2024 David Michael Pennington\n\nThe word \\\"Cisco\\\" is a registered trademark of [Cisco Systems][27].\n\n# Author\n\n[ciscoconfparse2][3] was written by [David Michael Pennington][25].\n\n\n\n  [1]: https://github.com/mpenning/ciscoconfparse2/blob/main/.github/workflows/tests.yml\n  [2]: https://img.shields.io/pypi/v/ciscoconfparse2.svg\n  [3]: https://pypi.python.org/pypi/ciscoconfparse2/\n  [4]: https://github.com/mpenning/ciscoconfparse2/actions/workflows/tests.yml/badge.svg\n  [5]: https://github.com/mpenning/ciscoconfparse2/actions/workflows/tests.yml\n  [6]: https://pepy.tech/badge/ciscoconfparse2\n  [7]: https://pepy.tech/project/ciscoconfparse2\n  [8]: http://img.shields.io/badge/license-GPLv3-blue.svg\n  [9]: https://www.gnu.org/copyleft/gpl.html\n  [10]: https://www.python.org\n  [11]: https://raw.githubusercontent.com/mpenning/ciscoconfparse/master/sphinx-doc/_static/ciscoconfparse_overview_75pct.png\n  [12]: https://github.com/mpenning/ciscoconfparse2/blob/main/pyproject.toml\n  [13]: https://github.com/mpenning/ciscoconfparse2/blob/master/configs/sample_01.junos\n  [14]: https://github.com/mpenning/ciscoconfparse/issues/17\n  [15]: http://www.pennington.net/py/ciscoconfparse2/\n  [16]: http://pennington.net/tutorial/ciscoconfparse2/ccp_tutorial.html\n  [17]: https://github.com/mpenning/ciscoconfparse2\n  [18]: https://github.com/mpenning/ciscoconfparse/issues/117\n  [19]: https://github.com/mpenning/ciscoconfparse/issues/13\n  [20]: https://github.com/CrackerJackMack/\n  [21]: http://www.gnu.org/licenses/gpl-3.0.html\n  [22]: https://pypy.org\n  [23]: https://networkengineering.stackexchange.com/\n  [24]: https://github.com/mpenning/ciscoconfparse2/issues/new/choose\n  [25]: https://github.com/mpenning\n  [26]: https://github.com/muir\n  [27]: https://www.cisco.com/\n  [28]: https://www.cisco.com/go/support\n  [29]: https://www.cymru.com/Documents/secure-ios-template.html\n  [30]: https://team-cymru.com/company/\n  [31]: http://www.cisco.com/c/en/us/support/docs/ip/access-lists/13608-21.html\n  [32]: https://learn.cisecurity.org/benchmarks\n  [33]: https://stackoverflow.com\n  [34]: http://stackoverflow.com/questions/ask\n  [35]: https://www.reddit.com/r/Cisco/\n  [36]: https://www.reddit.com/r/networking\n  [37]: https://snyk.io/advisor/python/ciscoconfparse2/badge.svg\n  [38]: https://snyk.io/advisor/python/ciscoconfparse2\n  [39]: https://www.reddit.com/r/Python/\n  [41]: https://img.shields.io/github/commit-activity/m/mpenning/ciscoconfparse2\n  [42]: https://img.shields.io/github/commit-activity/m/mpenning/ciscoconfparse2\n  [43]: https://www.codefactor.io/Content/badges/B.svg\n  [44]: https://www.codefactor.io/repository/github/mpenning/ciscoconfparse2/\n  [45]: https://fossa.com/blog/open-source-software-licenses-101-gpl-v3/\n  [46]: https://app.codacy.com/project/badge/Grade/4774ebb0292d4e1d9dc30bf263d9df14\n  [47]: https://app.codacy.com/gh/mpenning/ciscoconfparse2/dashboard\n  [48]: https://commitizen-tools.github.io/commitizen/\n  [49]: https://semver.org/\n  [50]: https://www.conventionalcommits.org/en/v1.0.0/\n  [51]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=alert_status\n  [52]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2\n  [53]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=sqale_rating\n  [54]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2\n  [55]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=ncloc\n  [56]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2\n  [57]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=code_smells\n  [58]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2\n  [59]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=bugs\n  [60]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2\n  [61]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse2&metric=sqale_index\n  [62]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse2\n  [63]: https://docs.pytest.org/en/\n  [64]: https://github.com/mpenning/ciscoconfparse\n  [65]: https://pypi.org/project/ciscoconfparse/1.9.41/\n  [66]: https://raw.githubusercontent.com/mpenning/ciscoconfparse2/main/sphinx-doc/_static/ciscoconfparse_logo_bw_01.png\n  [67]: http://www.pennington.net/py/ciscoconfparse2/cli.html\n  [68]: https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg\n  [69]: https://github.com/pypa/hatch\n  [70]: http://www.pennington.net/py/ciscoconfparse2/examples.html\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Parse, Audit, Query, Build, and Modify Cisco IOS-style and JunOS-style configs",
    "version": "0.7.74",
    "project_urls": {
        "changelog": "https://github.com/mpenning/ciscoconfparse2/blob/main/CHANGES.md",
        "documentation": "http://www.pennington.net/py/ciscoconfparse2/",
        "homepage": "http://github.com/mpenning/ciscoconfparse2",
        "repository": "https://github.com/mpenning/ciscoconfparse2"
    },
    "split_keywords": [
        "asa",
        " cisco",
        " cisco ios",
        " juniper",
        " nxos",
        " parse",
        " audit",
        " modify",
        " query"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "12605f2e0135f15e6a13d1edb6d9600440de5dcbeb8caa5645d13722b448dbcb",
                "md5": "b9061e6ae7b5e3defa671fafb32d8d87",
                "sha256": "3ccd1a4fe966d4fd5c9515fd9b0f2145688e0433f65c0e3760620652fb82c2d2"
            },
            "downloads": -1,
            "filename": "ciscoconfparse2-0.7.74-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b9061e6ae7b5e3defa671fafb32d8d87",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 422458,
            "upload_time": "2024-07-06T11:04:11",
            "upload_time_iso_8601": "2024-07-06T11:04:11.296350Z",
            "url": "https://files.pythonhosted.org/packages/12/60/5f2e0135f15e6a13d1edb6d9600440de5dcbeb8caa5645d13722b448dbcb/ciscoconfparse2-0.7.74-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9b334c973f59601fd398729dd7354675acd6e657fc299e4e3aab84f619d5498e",
                "md5": "fb79faed60303c3fc75ae18ad805c3fa",
                "sha256": "ef75d7e938281ecd9bd9d14a7228a8982c73fea99f3e4a07a32c0665acfa447b"
            },
            "downloads": -1,
            "filename": "ciscoconfparse2-0.7.74.tar.gz",
            "has_sig": false,
            "md5_digest": "fb79faed60303c3fc75ae18ad805c3fa",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 1346510,
            "upload_time": "2024-07-06T11:04:13",
            "upload_time_iso_8601": "2024-07-06T11:04:13.956838Z",
            "url": "https://files.pythonhosted.org/packages/9b/33/4c973f59601fd398729dd7354675acd6e657fc299e4e3aab84f619d5498e/ciscoconfparse2-0.7.74.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-07-06 11:04:13",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "mpenning",
    "github_project": "ciscoconfparse2",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "tox": true,
    "lcname": "ciscoconfparse2"
}
        
Elapsed time: 1.06587s