{"id":13498163,"url":"https://github.com/mpenning/ciscoconfparse","last_synced_at":"2026-01-11T03:48:24.034Z","repository":{"id":13972110,"uuid":"16672723","full_name":"mpenning/ciscoconfparse","owner":"mpenning","description":"Parse, Audit, Query, Build, and Modify Cisco IOS-style configurations.","archived":false,"fork":false,"pushed_at":"2024-04-12T23:22:06.000Z","size":4740,"stargazers_count":783,"open_issues_count":0,"forks_count":220,"subscribers_count":108,"default_branch":"main","last_synced_at":"2024-05-29T12:25:25.005Z","etag":null,"topics":["automation","cisco","cisco-asa","cisco-ios","configs","configuration-parser","firewall","network","network-management","parse","python","router","switch"],"latest_commit_sha":null,"homepage":"http://www.pennington.net/py/ciscoconfparse/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mpenning.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2014-02-09T18:46:18.000Z","updated_at":"2024-05-25T20:41:44.000Z","dependencies_parsed_at":"2023-10-16T03:33:50.429Z","dependency_job_id":"5dc3101a-fd0f-4cbb-b970-707fe1d7f1ec","html_url":"https://github.com/mpenning/ciscoconfparse","commit_stats":{"total_commits":2447,"total_committers":8,"mean_commits":305.875,"dds":0.04699632202697179,"last_synced_commit":"749ed2948a96a8a8ef725e06e75301cdfe5928b2"},"previous_names":[],"tags_count":157,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpenning%2Fciscoconfparse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpenning%2Fciscoconfparse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpenning%2Fciscoconfparse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpenning%2Fciscoconfparse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mpenning","download_url":"https://codeload.github.com/mpenning/ciscoconfparse/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219855486,"owners_count":16556093,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","cisco","cisco-asa","cisco-ios","configs","configuration-parser","firewall","network","network-management","parse","python","router","switch"],"created_at":"2024-07-31T20:00:52.696Z","updated_at":"2026-01-11T03:48:23.792Z","avatar_url":"https://github.com/mpenning.png","language":"Python","readme":"# ciscoconfparse\n\n[![git commits][41]][42] [![Version][2]][3] [![Downloads][6]][7] [![License][8]][9]\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[![Snyk Package Health][37]][38]\n\n# Important: ciscoconfparse2\n\n**ciscoconfparse is End of Life**\n\nAs of December 14, 2023 [ciscoconfparse2][64] is released; this is equivalent to version 2.0 of [ciscoconfparse][17], but [ciscoconfparse2][64] is a different PYPI project.\n\nYou should upgrade; here's why, [ciscoconfparse2][64]:\n\n- It supports all major network vendor text configuration files (Arista, Cisco, F5, Juniper, Palo Alto)\n- It supports searching across any number of configuration levels ([ciscoconfparse][17] only supports two config levels : a parent and child)\n- It adds a [string methods](http://www.pennington.net/py/ciscoconfparse2/tutorial_get_config_values.html#string-methods) so you don't need to use regex matching if you don't want to\n- It adds a [CLI command](http://www.pennington.net/py/ciscoconfparse2/cli.html)\n- Revamped documentation\n- It simplifies the user interface and fixes broken [ciscoconfparse][17] default parameters (this could require changing old scripts using the original API)\n- It intentionally uses a new python import to minimize confusion between itself and the original\n\n*NOTE [ciscoconfparse2][64] deprecates many legacy [ciscoconfparse][17] APIs; overall this is a good thing because [ciscoconfparse2][64] is easier to use.  As such, test your code before using [ciscoconfparse2][64] as a drop-in replacement.*\n\n\n## Introduction: What is ciscoconfparse?\n\nShort answer: ciscoconfparse is a [Python][10] library\nthat helps you quickly answer questions like these about your\nCisco configurations:\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 an IOS-style 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## Generic Usage\n\nThe following code will parse a configuration stored in\n`exampleswitch.conf` and select interfaces that are shutdown.\n\nIn this case, the parent is a line containing `interface` and\nthe child is a line containing the word `shutdown`.\n\n```python\nfrom ciscoconfparse import CiscoConfParse\n\nparse = CiscoConfParse('exampleswitch.conf', syntax='ios')\n\nfor intf_obj in parse.find_parent_objects('^interface', '^\\s+shutdown'):\n    print(\"Shutdown: \" + intf_obj.text)\n```\n\nThe next example will find the IP address assigned to interfaces.\n\n```python\nfrom ciscoconfparse import CiscoConfParse\n\nparse = CiscoConfParse('exampleswitch.conf', syntax='ios')\n\nfor ccp_obj in parse.find_objects('^interface'):\n\n    intf_name = ccp_obj.re_match_typed('^interface\\s+(\\S.+?)$')\n\n    # Search children of all interfaces for a regex match and return\n    # the value matched in regex match group 1.  If there is no match,\n    # return a default value: ''\n    intf_ip_addr = ccp_obj.re_match_iter_typed(\n        r'ip\\saddress\\s(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s', result_type=str,\n        group=1, default='')\n    print(f\"{intf_name}: {intf_ip_addr}\")\n```\n\n## Cisco IOS Factory Usage\n\nCiscoConfParse has a special feature that abstracts common IOS / NXOS / ASA / IOSXR fields; at this time, it is only supported on those configuration types. You will see factory parsing in CiscoConfParse code as parsing the configuration with `factory=True`.  A fraction of these pre-parsed Cisco IOS fields follows; some variables are not used below, but simply called out for quick reference.\n\n```python\nfrom ciscoconfparse import IPv4Obj, IPv6Obj\nfrom ciscoconfparse import CiscoConfParse\n\n##############################################################################\n# Parse an example Cisco IOS HSRP configuration from:\n#     tests/fixtures/configs/sample_08.ios\n#\n# !\n# interface FastEthernet0/0\n#  ip address 172.16.2.1 255.255.255.0\n#  ipv6 dhcp server IPV6_2FL_NORTH_LAN\n#  ipv6 address fd01:ab00::/64 eui-64\n#  ipv6 address fe80::1 link-local\n#  ipv6 enable\n#  ipv6 ospf 11 area 0\n#  standby 110 ip 172.16.2.254\n#  standby 110 ipv6 autoconfig\n#  standby 110 priority 150\n#  standby 110 preempt delay minimum 15\n#  standby 110 track Dialer1 75\n#  standby 110 track FastEthernet 0/1\n#  standby 110 track FastEthernet1/0 30\n#  standby 111 ip 172.16.2.253\n#  standby 111 priority 150\n#  standby 111 preempt delay minimum 15\n#  standby 111 track Dialer1 50\n#\n##############################################################################\nparse = CiscoConfParse('tests/fixtures/configs/sample_08.ios', syntax='ios', factory=True)\nfor ccp_obj in parse.find_objects('^interface'):\n\n    # Skip if there are no HSRPInterfaceGroup() instances...\n    if len(ccp_obj.hsrp_interfaces) == 0:\n        continue\n\n    # Interface name, such as 'FastEthernet0/0'\n    intf_name = ccp_obj.name\n\n    # Interface description\n    intf_description = ccp_obj.description\n\n    # IPv4Obj\n    intf_v4obj = ccp_obj.ipv4_addr_object\n\n    # IPv4 address object: ipaddress.IPv4Address()\n    intf_v4addr = ccp_obj.ipv4_addr_object.ip\n\n    # IPv4 netmask object: ipaddress.IPv4Address()\n    intf_v4masklength = ccp_obj.ipv4_addr_object.masklength\n\n    # set() of IPv4 secondary address/prefixlen strings\n    intf_v4secondary_networks = ccp_obj.ip_secondary_networks\n\n    # set() of IPv4 secondary address strings\n    intf_v4secondary_addresses = ccp_obj.ip_secondary_addresses\n\n    # List of HSRP IPv4 addrs from the ciscoconfpasre/models_cisco.py HSRPInterfaceGroup()\n    intf_hsrp_addresses = [hsrp_grp.ip for hsrp_grp in ccp_obj.hsrp_interfaces]\n\n    # A bool for using HSRP bia mac-address...\n    intf_hsrp_usebia = any([ii.use_bia for ii in ccp_obj.hsrp_interfaces])\n\n    ##########################################################################\n    # Print a simple interface summary\n    ##########################################################################\n    print(\"----\")\n    print(f\"Interface {ccp_obj.interface_object.name}: {intf_v4addr}/{intf_v4masklength}\")\n    print(f\"  Interface {intf_name} description: {intf_description}\")\n\n    ##########################################################################\n    # Print HSRP Group interface tracking information\n    ##########################################################################\n    print(\"\")\n    print(f\"  HSRP tracking for {set([ii.interface_name for ii in ccp_obj.hsrp_interfaces])}\")\n    for hsrp_intf_group in ccp_obj.hsrp_interfaces:\n        group = hsrp_intf_group.hsrp_group\n        # hsrp_intf_group.interface_tracking is a list of dictionaries\n        if len(hsrp_intf_group.interface_tracking) \u003e 0:\n            print(f\"  --- HSRP Group {group} ---\")\n            for track_intf in hsrp_intf_group.interface_tracking:\n                print(f\"    --- Tracking {track_intf.interface} ---\")\n                print(f\"    Tracking interface: {track_intf.interface}\")\n                print(f\"    Tracking decrement: {track_intf.decrement}\")\n                print(f\"    Tracking weighting: {track_intf.weighting}\")\n\n\n    ##########################################################################\n    # Break out inidividual interface name components\n    #   Example: 'Serial3/4/5.6:7 multipoint'\n    ##########################################################################\n    # The base ciscoconfparse/ccp_util.py CiscoInterface() instance\n    intf_cisco_interface = ccp_obj.interface_object\n    # The ciscoconfparse/ccp_util.py CiscoInterface() name, 'Serial3/4/5.6:7 multipoint'\n    intf_name = ccp_obj.interface_object.name\n    # The ciscoconfparse/ccp_util.py CiscoInterface() prefix, 'Serial'\n    intf_prefix = ccp_obj.interface_object.prefix\n    # The ciscoconfparse/ccp_util.py CiscoInterface() digit separator, '/'\n    digit_separator = ccp_obj.interface_object.digit_separator or \"\"\n    # The ciscoconfparse/ccp_util.py CiscoInterface() slot, 3\n    intf_slot = ccp_obj.interface_object.slot or \"\"\n    # The ciscoconfparse/ccp_util.py CiscoInterface() card, 4\n    intf_card = ccp_obj.interface_object.card or \"\"\n    # The ciscoconfparse/ccp_util.py CiscoInterface() card, 5\n    intf_port = ccp_obj.interface_object.port\n    # The ciscoconfparse/ccp_util.py CiscoInterface() subinterface, 6\n    intf_subinterface = ccp_obj.interface_object.subinterface or \"\"\n    # The ciscoconfparse/ccp_util.py CiscoInterface() channel, 7\n    intf_channel = ccp_obj.interface_object.channel or \"\"\n    # The ciscoconfparse/ccp_util.py CiscoInterface() interface_class, 'multipoint'\n    intf_class = ccp_obj.interface_object.interface_class or \"\"\n\n    ##########################################################################\n    # Extract all IPv4Obj() with re_match_iter_typed()\n    ##########################################################################\n    _default = None\n    for _obj in ccp_obj.children:\n        # Get a dict() from re_match_iter_typed() by caling it with 'groupdict'\n        intf_dict = _obj.re_match_iter_typed(\n            # Add a regex match-group called 'v4addr'\n            r\"ip\\s+address\\s+(?P\u003cv4addr\u003e\\S.+?\\d)\\s*(?P\u003csecondary\u003esecondary)*$\",\n            # Cast the v4addr regex match group as an IPv4Obj() type\n            groupdict={\"v4addr\": IPv4Obj, \"secondary\": str},\n            # Default to None if there is no regex match\n            default=_default,\n        )\n        intf_ipv4obj = intf_dict[\"v4addr\"]\n\n    ##########################################################################\n    # Extract all IPv6Obj() with re_match_iter_typed()\n    ##########################################################################\n    _default = None\n    for _obj in ccp_obj.children:\n        # Get a dict() from re_match_iter_typed() by caling it with 'groupdict'\n        intf_dict = _obj.re_match_iter_typed(\n            # Add regex match-groups called 'v6addr' and an optional 'ipv6type'\n            r\"ipv6\\s+address\\s+(?P\u003cv6addr\u003e\\S.+?\\d)\\s*(?P\u003cv6type\u003eeui.64|link.local)*$\",\n            # Cast the v6addr regex match group as an IPv6Obj() type\n            groupdict={\"v6addr\": IPv6Obj, \"v6type\": str},\n            # Default to None if there is no regex match\n            default=_default,\n        )\n        intf_ipv6obj = intf_dict[\"v6addr\"]\n        intf_ipv6type = intf_dict[\"v6type\"]\n        # Skip this object if it has no IPv6 address\n        if intf_ipv6obj is _default:\n            continue\n```\n\nWhen that is run, you will see information similar to this...\n\n```\n----\nInterface FastEthernet0/0: 172.16.2.1/24\n  Interface FastEthernet0/0 description: [IPv4 and IPv6 desktop / laptop hosts on 2nd-floor North LAN]\n\n  HSRP Group tracking for {'FastEthernet0/0'}\n  --- HSRP Group 110 ---\n    --- Tracking Dialer1 ---\n    Tracking interface: Dialer1\n    Tracking decrement: 75\n    Tracking weighting: None\n    --- Tracking FastEthernet 0/1 ---\n    Tracking interface: FastEthernet 0/1\n    Tracking decrement: 10\n    Tracking weighting: None\n    --- Tracking FastEthernet1/0 ---\n    Tracking interface: FastEthernet1/0\n    Tracking decrement: 30\n    Tracking weighting: None\n  --- HSRP Group 111 ---\n    --- Tracking Dialer1 ---\n    Tracking interface: Dialer1\n    Tracking decrement: 50\n    Tracking weighting: None\nGRP {'addr': \u003cIPv6Obj fd01:ab00::/64\u003e}\nRESULT \u003cIOSIntfLine # 231 'FastEthernet0/0' primary_ipv4: '172.16.2.1/24'\u003e \u003cIPv6Obj fd01:ab00::/64\u003e\n```\n\n\n## Are there private copies of CiscoConfParse()?\n\nYes.  [Cisco Systems][27] maintains their own copy of `CiscoConfParse()`. The terms of the GPLv3\nlicense allow this as long as they don't distribute their modified private copy in\nbinary form.  Also refer to this [GPLv3 License primer / GPLv3 101][45].  Officially, [modified\ncopies of CiscoConfParse source-code must also be licensed as GPLv3][45].\n\nDear [Cisco Systems][27]: please consider porting your improvements back into\nthe [`github ciscoconfparse repo`](https://github.com/mpenning/ciscoconfparse).\n\n## Are you releasing licensing besides GPLv3?\n\n[I will not](https://github.com/mpenning/ciscoconfparse/issues/270#issuecomment-1774035592); however, you can take the solution Cisco does above as long as you comply with the GPLv3 terms.  If it's truly a problem for your company, there are commercial solutions available (to include purchasing the project, or hiring me).\n\n## What if we don\\'t use Cisco IOS?\n\nDon\\'t let that stop you.\n\nAs of CiscoConfParse 1.2.4, you can parse [brace-delimited configurations][13] into a Cisco IOS style (see [Github Issue \\#17][14]), which means that CiscoConfParse can parse these configurations:\n\n- Juniper Networks Junos\n- Palo Alto Networks Firewall configurations\n- F5 Networks configurations\n\nCiscoConfParse also handles anything that has a Cisco IOS style of configuration, which includes:\n\n- Cisco IOS, Cisco Nexus, Cisco IOS-XR, Cisco IOS-XE, Aironet OS, Cisco ASA, Cisco CatOS\n- Arista EOS\n- Brocade\n- HP Switches\n- Force 10 Switches\n- Dell PowerConnect Switches\n- Extreme Networks\n- Enterasys\n- Screenos\n\n## Docs\n\n- Blogs\n  - Kirk Byers published [a ciscoconfparse blog piece](https://pynet.twb-tech.com/blog/parsing-configurations-w-ciscoconfparse.html)\n  - Henry Ölsner published [a ciscoconfparse blog piece](https://codingnetworker.com/2016/06/parse-cisco-ios-configuration-ciscoconfparse/)\n- The latest copy of the docs are [archived on the web][15]\n- There is also a [CiscoConfParse Tutorial][16]\n\n## Installation and Downloads\n\n-   Use `poetry` for Python3.x\\... :\n\n        python -m pip install ciscoconfparse\n\nIf you\\'re interested in the source, you can always pull from the [github repo][17]:\n\n- Download from [the github repo][17]: :\n\n        git clone git://github.com/mpenning/ciscoconfparse\n        cd ciscoconfparse/\n        python -m pip install .\n\n## Github Star History\n\n[![Github Star History Chart][40]][40]\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\n## Is this a tool, or is it artwork?\n\nThat depends on who you ask.  Many companies use CiscoConfParse as part of their\nnetwork engineering toolbox; others regard it as a form of artwork.\n\n## Pre-requisites\n\n[The ciscoconfparse python package][3] requires Python versions 3.7+ (note: Python version 3.7.0 has a bug - ref [Github issue \\#117][18], but version 3.7.1 works); the OS should not matter.\n\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## 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## Dependencies\n\n- [Python 3](https://python.org/)\n- [passlib](https://github.com/glic3rinu/passlib)\n- [toml](https://github.com/uiri/toml)\n- [dnspython](https://github.com/rthalley/dnspython)\n- [loguru](https://github.com/Delgan/loguru)\n- [deprecated](https://github.com/tantale/deprecated)\n\n\n## Unit-Tests and Development\n\n- We are manually disabling some [SonarCloud](https://sonarcloud.io/) alerts with:\n  - `#pragma warning disable S1313`\n  - `#pragma warning restore S1313`\n  - Where `S1313` is a False-positive that [SonarCloud](https://sonarcloud.io) flags in [CiscoConfParse](https://github.com/mpenning/ciscoconfparse/).\n  - Those `#pragma warning` lines should be carefully-fenced to ensure that we don't disable a [SonarCloud](https://sonarcloud.io/) alert that is useful.\n\n### Semantic Versioning and Conventional Commits\n\n- At this point, [CiscoConfParse][3] does NOT adhere to [Semantic Versioning][49]\n- Although we added [commitizen][48] as a dev dependency, we are NOT enforcing commit rules (such as [Conventional Commits][50]) yet.\n\n### Execute Unit tests\n\nThe project\\'s [test workflow][1] checks ciscoconfparse on Python versions 3.7 and higher, as well as a [pypy JIT][22] executable.\n\nIf you already git cloned the repo and want to manually run tests either run with `make test` from the base directory, or manually run with [`pytest`][63] in a unix-like system...\n\n```shell\n$ cd tests\n$ pytest -vvs ./test_*py\n...\n```\n\n### Execute Miss Report\n\nIf you already have have `pytest` and `pytest-cov` installed, run a test line miss report as shown below.\n\n```shell\n$ cd tests\n$ pytest --cov-report=term-missing --cov=ciscoconfparse ./\n...\n```\n\n\n## Editing the Package\n\nThis uses the example of editing the package on a git branch called `develop`...\n\n-   `git clone https://github.com/mpenning/ciscoconfparse`\n-   `cd ciscoconfparse`\n-   `git branch develop`\n-   `git checkout develop`\n-   Add / modify / delete on the `develop` branch\n-   `make test`\n-   If tests run clean, `git commit` all the pending changes on the `develop` branch\n-   If you plan to publish this as an official version rev, edit the version number in [pyproject.toml][12].  In the future, we want to integrate `commitizen` to manage versioning.\n-   `git checkout main`\n-   `git merge develop`\n-   `make test`\n-   `git push origin main`\n-   `make pypi`\n\n## Sphinx Documentation\n\nBuilding the ciscoconfparse documentation tarball comes down to this one wierd trick:\n\n- `cd sphinx-doc/`\n- `pip install -r ./requirements.txt;  # install Sphinx dependencies`\n- `pip install -r ../requirements.txt; # install ccp dependencies`\n- `make html`\n\n## License and Copyright\n\n[ciscoconfparse][3] is licensed [GPLv3][21]\n\n- Copyright (C) 2022-2023 David Michael Pennington\n- Copyright (C) 2022 David Michael Pennington at WellSky\n- Copyright (C) 2022 David Michael Pennington\n- Copyright (C) 2019-2021 David Michael Pennington at Cisco Systems / ThousandEyes\n- Copyright (C) 2012-2019 David Michael Pennington at Samsung Data Services\n- Copyright (C) 2011-2012 David Michael Pennington at Dell Computer Corp\n- Copyright (C) 2007-2011 David Michael Pennington\n\nThe word \\\"Cisco\\\" is a registered trademark of [Cisco Systems][27].\n\n## Author\n\n[ciscoconfparse][3] was written by [David Michael Pennington][25] (mike \\[\\~at\\~\\] pennington \\[.dot.\\] net).\n\n## Interesting Users (and some downstream projects)\n\nThe following are featured [CiscoConfParse](https://github.com/mpenning/ciscoconfparse/) users / projects:\n\n- [salt](https://github.com/saltstack/salt)\n- [suzieq](https://github.com/netenglabs/suzieq):  SuzieQ collects, normalizes, and stores timestamped data that is otherwise only available to engineers by logging into each device, providing a rich data lake that can be queried and leveraged for next generation monitoring and alerting\n- [netwalk](https://github.com/icovada/netwalk): Python library to discover, parse, analyze and change Cisco switched networks\n- [netlint](https://github.com/Kircheneer/netlint)\n- [cisco_switchport_auditor](https://github.com/corvese/cisco_switchport_auditor): Parses Cisco switch configuration into Switch \u0026 Interface objects to access configuration details of the aforementioned in a programatic manner. Works with SSH, RESTCONF, or with running/start-up config files.\n- [nipper-ng](https://github.com/arpitn30/nipper-ng): a network security analyzer\n- [pynipper-ng](https://github.com/syn-4ck/pynipper-ng): a network security analyzer\n- [build_fabric](https://github.com/sjhloco/build_fabric): Build a declarative Cisco NXOS leaf and spine fabric using Ansible\n- [junos-ansible](https://github.com/yzguy/junos-ansible)\n- [faddr](https://github.com/kido5217/faddr)\n- [NetOpsNornir](https://github.com/wangcongxing/NetOpsNornir/)\n- [adala](https://github.com/blindhog/adala): Extract useful information about your Cisco network\n- [xlina](https://github.com/blindhog/xlina):\n  - organize_acls.py: Extract and organize access-list configurations and organizes associated objects and object-groups.\n  - organize_anyconnect.py: Extract and organize Anyconnect profiles and associated group policies, auth servers, access-lists, etc\n  - organize_static_nats.py: Extract and organize static nat configurations and associated objects and object-groups\n  - organize_auto_nat.py: Extract and organize auto nat configurations with associated objects\n  - organize_crypto_maps.py: Extract and organize crypto map configurations and associated access-lists, transform-sets, tunnel-groups, etc\n- [Catalyst_2_Meraki_Config_Checker](https://github.com/fadysharobeem/Catalyst_2_Meraki_Config_Checker): Check the Cisco Catalyst configuration text file and verify if they are supported by the Meraki MS platform.\n- [parse_nxos_config](https://github.com/ocptech/parse_nxos_config): Generates an Excel file with the information gathered from running-config file from Cisco NXOS\n- [Nornir3_CDP_map](https://github.com/nouse4it/Nornir3_CDP_map): Set interface descriptions by looking at the hostname of its CDP neighbor\n- [devicebanner](https://github.com/labeveryday/devicebanner/): Update the banner message of the day on network devices\n- [iosconfigslicer](https://github.com/imanassypov/iosconfigslicer): Simple script to slice Cisco configuration file, and replicate sections of the config via SSH to another device\n- [ciscocfg](https://github.com/Mareel-io/ciscocfg): a simple RPCd for ciscoconfparse\n- [confParser](https://github.com/yshornikov/confParser/): SSH with paramiko, and dump information about your configs into sqllite3 / Excel\n- [parse_config](https://github.com/Sergey-Link/parse_config/): Dump information about your Vlans / VRFs to excel\n- Finally, _[Cisco Systems](https://cisco.com/) Product Engineering and Advanced Services_\n\n## Other Useful Network Management Projects\n\n- [netbox](https://github.com/netbox-community/netbox/): NetBox is the source of truth for everything on your network, from physical components like power systems and cabling to virtual assets like IP addresses and VLANs\n  - [ntc-netbox-plugin-onboarding](https://github.com/networktocode/ntc-netbox-plugin-onboarding): A plugin for NetBox to easily onboard new devices.\n- [nautobot](https://github.com/nautobot/nautobot): Network Source of Truth \u0026 Network Automation Platform.\n- [nornir](https://github.com/nornir-automation/nornir): Network Automation via Plugins - A pluggable multi-threaded framework with inventory management to help operate collections of devices\n- [network-importer](https://github.com/networktocode/network-importer/): The network importer is a tool/library to analyze and/or synchronize an existing network with a Network Source of Truth (SOT), it's designed to be idempotent and by default it's only showing the difference between the running network and the remote SOT.\n- [nuts](https://github.com/network-unit-testing-system/nuts): NUTS defines a desired network state and checks it against a real network using pytest and nornir.\n- [jerikan](https://vincent.bernat.ch/en/blog/2021-network-jerikan-ansible):\n- [nettowel](https://github.com/InfrastructureAsCode-ch/nettowel/): Collection of useful network automation functions\n- [napalm-panos](https://github.com/napalm-automation-community/napalm-panos)\n- [Tacquito](https://github.com/facebookincubator/tacquito/): A go TACACS+ implementation\n- [assessment-cmds](https://github.com/blindhog/assessment-cmds/): Useful show commands to check your Cisco router's health\n- [learn-to-cloud](https://github.com/labeveryday/learn-to-cloud): Primer for Cloud-computing fundamentals\n\n\n\n  [1]: https://github.com/mpenning/ciscoconfparse/blob/main/.github/workflows/tests.yml\n  [2]: https://img.shields.io/pypi/v/ciscoconfparse.svg\n  [3]: https://pypi.python.org/pypi/ciscoconfparse/\n  [4]: https://github.com/mpenning/ciscoconfparse/actions/workflows/tests.yml/badge.svg\n  [5]: https://github.com/mpenning/ciscoconfparse/actions/workflows/tests.yml\n  [6]: https://pepy.tech/badge/ciscoconfparse\n  [7]: https://pepy.tech/project/ciscoconfparse\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/ciscoconfparse/blob/main/pyproject.toml\n  [13]: https://github.com/mpenning/ciscoconfparse/blob/master/configs/sample_01.junos\n  [14]: https://github.com/mpenning/ciscoconfparse/issues/17\n  [15]: http://www.pennington.net/py/ciscoconfparse/\n  [16]: http://pennington.net/tutorial/ciscoconfparse/ccp_tutorial.html\n  [17]: https://github.com/mpenning/ciscoconfparse\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/ciscoconfparse/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/ciscoconfparse/badge.svg\n  [38]: https://snyk.io/advisor/python/ciscoconfparse\n  [39]: https://www.reddit.com/r/Python/\n  [40]: https://api.star-history.com/svg?repos=mpenning/ciscoconfparse\u0026type=Date\n  [41]: https://img.shields.io/github/commit-activity/m/mpenning/ciscoconfparse\n  [42]: https://img.shields.io/github/commit-activity/m/mpenning/ciscoconfparse\n  [43]: https://www.codefactor.io/Content/badges/B.svg\n  [44]: https://www.codefactor.io/repository/github/mpenning/ciscoconfparse/\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/ciscoconfparse/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_ciscoconfparse\u0026metric=alert_status\n  [52]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse\n  [53]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse\u0026metric=sqale_rating\n  [54]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse\n  [55]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse\u0026metric=ncloc\n  [56]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse\n  [57]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse\u0026metric=code_smells\n  [58]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse\n  [59]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse\u0026metric=bugs\n  [60]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse\n  [61]: https://sonarcloud.io/api/project_badges/measure?project=mpenning_ciscoconfparse\u0026metric=sqale_index\n  [62]: https://sonarcloud.io/summary/new_code?id=mpenning_ciscoconfparse\n  [63]: https://docs.pytest.org/en/\n  [64]: https://github.com/mpenning/ciscoconfparse2\n","funding_links":[],"categories":["Python","python","Library"],"sub_categories":["NETCONF"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpenning%2Fciscoconfparse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmpenning%2Fciscoconfparse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpenning%2Fciscoconfparse/lists"}