{"id":13606399,"url":"https://github.com/cidrblock/netcopa","last_synced_at":"2025-08-20T22:32:40.950Z","repository":{"id":53535771,"uuid":"87207829","full_name":"cidrblock/netcopa","owner":"cidrblock","description":"Network Configuration Parser","archived":false,"fork":false,"pushed_at":"2024-01-11T18:20:17.000Z","size":214,"stargazers_count":135,"open_issues_count":5,"forks_count":30,"subscribers_count":16,"default_branch":"master","last_synced_at":"2024-12-10T07:21:46.036Z","etag":null,"topics":["cisco","configuration","ios","network","nx-os","parse","parser","python","router","switch"],"latest_commit_sha":null,"homepage":"","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/cidrblock.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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,"publiccode":null,"codemeta":null}},"created_at":"2017-04-04T16:05:04.000Z","updated_at":"2024-01-25T08:03:28.000Z","dependencies_parsed_at":"2024-08-01T19:53:28.310Z","dependency_job_id":null,"html_url":"https://github.com/cidrblock/netcopa","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cidrblock%2Fnetcopa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cidrblock%2Fnetcopa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cidrblock%2Fnetcopa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cidrblock%2Fnetcopa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cidrblock","download_url":"https://codeload.github.com/cidrblock/netcopa/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":230462914,"owners_count":18229865,"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":["cisco","configuration","ios","network","nx-os","parse","parser","python","router","switch"],"created_at":"2024-08-01T19:01:08.804Z","updated_at":"2024-12-19T16:13:00.211Z","avatar_url":"https://github.com/cidrblock.png","language":"Python","funding_links":[],"categories":["python","Tools"],"sub_categories":["NETCONF"],"readme":"# netcopa (Network Configuration Parser)\n\n### Overview\n\nnetcopa is an engine which implements a template based state machine for parsing semi-formatted text and storing it as structured data in yaml.\n\nNetwork device configurations can be converted from text to yaml:\n\nStart with this:\n```\n!\ninterface GigabitEthernet1/3\n switchport access vlan 267\n switchport mode access\n switchport voice vlan 867\n spanning-tree portfast\n spanning-tree bpduguard enable\n service-policy input company-user-access-450x\n service-policy output company-user-access-dbl\n!\n```\nFinish with this:\n\n```yaml\ninterfaces:\n  GigabitEthernet1/3:\n    name: GigabitEthernet1/3\n    service_policies:\n    - direction: input\n      name: company-user-access-450x\n    - direction: output\n      name: company-user-access-dbl\n    spanning-tree:\n      bpduguard: true\n      portfast: true\n    switchport:\n      access:\n        vlan: 267\n      mode:\n      - access\n      voice:\n        vlan: 867\n```\n\nThe engine takes four inputs:\n  - A network device configuration\n  - A hierarchy of parsers\n  - A hierarchy of rendering templates, referenced by the parsers\n  - An initial variable file for the configuration, indicating the OS of the device\n\nUpon running the engine:\n  - Each configuration is loaded into memory\n  - The OS is retrieved from the file system (`./host_vars/device_name.yml`)\n  - Each parser for the device's OS is added to the device runtime dictionary\n  - Each parser is run against the configuration, data extracted, rendered with the template and compared back to the initial extraction.  This checks the integrity of the data as well as ensures the data can be used to exactly reproduce the original configuration.\n  - Only if the match is successful, the extracted data is written to the filesystem.\n  - Extraction success is reported when the engine is complete\n\n### Getting started\n\nPython 2.7+ will need to be installed.\n- Clone the repository\n- Build a virtual environment\n- Install dependancies\n- Run the engine against the included sample configurations\n- Review the host_vars directory for the resulting yaml extractions\n\n```shell\ngit clone https://github.com/cidrblock/netcopa\ncd netcopa\nvirtualenv venv\n\u003c...\u003e\nsource venv/bin/activate\npip install -r requirements.txt\n\u003c...\u003e\npython runparse.py\n\n*****  Loading configurations\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Copy host_vars entry to temp directory\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Retrieving OS\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Loading OS removers\ncisco_ios-00: cisco_ios                                                [ok]\ncisco_ios-xe-00: cisco_ios-xe                                          [ok]\n*****  Loading OS parsers\ncisco_ios-00: cisco_ios                                                [ok]\ncisco_ios-xe-00: cisco_ios-xe                                          [ok]\n*****  Running parsers and comparing template output to actual\ncisco_ios-00: cisco_ios/aaa accounting                                 [ok]\ncisco_ios-00: cisco_ios/aaa authentication                             [ok]\ncisco_ios-00: cisco_ios/aaa authorization                              [ok]\ncisco_ios-00: cisco_ios/aaa groups                                     [ok]\ncisco_ios-00: cisco_ios/aaa                                            [ok]\ncisco_ios-00: cisco_ios/access-list extended                           [ok]\ncisco_ios-00: cisco_ios/access-list standard                           [ok]\ncisco_ios-00: cisco_ios/alias                                          [ok]\ncisco_ios-00: cisco_ios/banner                                         [ok]\ncisco_ios-00: cisco_ios/clock                                          [ok]\ncisco_ios-00: cisco_ios/control-plane                                  [ok]\ncisco_ios-00: cisco_ios/enable secret                                  [ok]\ncisco_ios-00: cisco_ios/hostname                                       [ok]\ncisco_ios-00: cisco_ios/interface                                      [ok]\ncisco_ios-00: cisco_ios/ip access-list standard                        [ok]\ncisco_ios-00: cisco_ios/ip                                             [ok]\ncisco_ios-00: cisco_ios/ip prefix-list                                 [ok]\ncisco_ios-00: cisco_ios/line con/aux                                   [ok]\ncisco_ios-00: cisco_ios/line vty                                       [ok]\ncisco_ios-00: cisco_ios/logging                                        [ok]\ncisco_ios-00: cisco_ios/ntp servers                                    [ok]\ncisco_ios-00: cisco_ios/route-map                                      [ok]\ncisco_ios-00: cisco_ios/router eigrp                                   [ok]\ncisco_ios-00: cisco_ios/router ospf                                    [ok]\ncisco_ios-00: cisco_ios/services                                       [ok]\ncisco_ios-00: cisco_ios/snmp-server                                    [ok]\ncisco_ios-00: cisco_ios/spanning-tree                                  [ok]\ncisco_ios-00: cisco_ios/tacacs-server                                  [ok]\ncisco_ios-00: cisco_ios/udld                                           [ok]\ncisco_ios-00: cisco_ios/username                                       [ok]\ncisco_ios-00: cisco_ios/version                                        [ok]\ncisco_ios-00: cisco_ios/vlan                                           [ok]\ncisco_ios-xe-00: cisco_ios-xe/aaa accounting                           [ok]\ncisco_ios-xe-00: cisco_ios-xe/aaa authentication                       [ok]\ncisco_ios-xe-00: cisco_ios-xe/aaa authorization                        [ok]\ncisco_ios-xe-00: cisco_ios-xe/aaa groups                               [ok]\ncisco_ios-xe-00: cisco_ios-xe/aaa                                      [ok]\ncisco_ios-xe-00: cisco_ios-xe/access-list extended                     [ok]\ncisco_ios-xe-00: cisco_ios-xe/access-list standard                     [ok]\ncisco_ios-xe-00: cisco_ios-xe/alias                                    [ok]\ncisco_ios-xe-00: cisco_ios-xe/banner                                   [ok]\ncisco_ios-xe-00: cisco_ios-xe/boot                                     [ok]\ncisco_ios-xe-00: cisco_ios-xe/class-map                                [ok]\ncisco_ios-xe-00: cisco_ios-xe/clock                                    [ok]\ncisco_ios-xe-00: cisco_ios-xe/control-plane                            [ok]\ncisco_ios-xe-00: cisco_ios-xe/enable secret                            [ok]\ncisco_ios-xe-00: cisco_ios-xe/hostname                                 [ok]\ncisco_ios-xe-00: cisco_ios-xe/interface                                [ok]\ncisco_ios-xe-00: cisco_ios-xe/ip access-list extended                  [ok]\ncisco_ios-xe-00: cisco_ios-xe/ip access-list standard                  [ok]\ncisco_ios-xe-00: cisco_ios-xe/ip flow                                  [ok]\ncisco_ios-xe-00: cisco_ios-xe/ip                                       [ok]\ncisco_ios-xe-00: cisco_ios-xe/ip prefix-list                           [ok]\ncisco_ios-xe-00: cisco_ios-xe/line con/aux                             [ok]\ncisco_ios-xe-00: cisco_ios-xe/line vty                                 [ok]\ncisco_ios-xe-00: cisco_ios-xe/logging                                  [ok]\ncisco_ios-xe-00: cisco_ios-xe/multilink                                [ok]\ncisco_ios-xe-00: cisco_ios-xe/ntp servers                              [ok]\ncisco_ios-xe-00: cisco_ios-xe/policy-map                               [ok]\ncisco_ios-xe-00: cisco_ios-xe/redundancy                               [ok]\ncisco_ios-xe-00: cisco_ios-xe/route-map                                [ok]\ncisco_ios-xe-00: cisco_ios-xe/router bgp                               [ok]\ncisco_ios-xe-00: cisco_ios-xe/router ospf                              [ok]\ncisco_ios-xe-00: cisco_ios-xe/services                                 [ok]\ncisco_ios-xe-00: cisco_ios-xe/snmp                                     [ok]\ncisco_ios-xe-00: cisco_ios-xe/snmp-server                              [ok]\ncisco_ios-xe-00: cisco_ios-xe/spanning-tree                            [ok]\ncisco_ios-xe-00: cisco_ios-xe/tacacs-server                            [ok]\ncisco_ios-xe-00: cisco_ios-xe/udld                                     [ok]\ncisco_ios-xe-00: cisco_ios-xe/username                                 [ok]\ncisco_ios-xe-00: cisco_ios-xe/version                                  [ok]\ncisco_ios-xe-00: cisco_ios-xe/vlan                                     [ok]\ncisco_ios-xe-00: cisco_ios-xe/vrf                                      [ok]\n*****  Persist vars to temp directory\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Copy temp directory to host_vars entry\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Run removers\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Report extraction success\ncisco_ios-00                                                           [100.0000% 1169.0/0.0]\ncisco_ios-xe-00                                                        [100.0000% 2413.0/0.0]\n*****  Remove temp directory\nlocalhost                                                              [ok]\n```\n\n### Directory layout\n\nThe project has a specific directory layout outlined below:\n\n`./configurations`: The directory from which configurations are pulled\n\n`./host_vars`: The directory in which the extracted structured data is stored\n\n`./parsers`: The directory of parsers, organized by OS and global keyword family\n\n`./removers`: Lines that will be removed from the configuration after data extraction, organized by OS\n\n`./templates`: The templates used to recreate the original configuration and validate data integrity, organized by OS and global keywork family\n\n`./utilities`: additional scripts used during development\n\n### Parser and template design\n\nEach parser consists of a regular expression, keywords, and a structured data tree.\n- The regular expression is run against the lines of the configuration\n- The keywords are used to store the captures from the regular expression\n- The tree is then rendered as a template, substituting values for variables.\n\nFormats:\n\n- Parsers are written in yaml, the parser path is treated as a jinja2 template.\n- Templates are written in jinja2.\n- Extracted data is stored as yaml.\n\n### Simple example:\n\nUsing the following configuration subset:\n\n```\n!\nlogging buffered informational\nlogging console informational\nlogging monitor informational\n!\n```\nUsing a parser located in `./parsers/cisco_ios-xe/logging/main.yml`:\n\n```yaml\n- name: logging\n  tags:\n  - logging\n  matches:\n  - name: logging levels\n    template: logging/levels.j2\n    lines:\n    - regex: '^logging (buffered|console|monitor) (\\w+)$'\n      examples:\n      - 'logging buffered informational'\n      captures:\n      - type\n      - level\n      path:\n        logging:\n          levels:\n          - type: \"{{ type }}\"\n            level: \"{{ level }}\"\n```\n\nRegular expression always match full lines. This regex captures two pieces of information, the logging type and logging level, stored as `type` and `level` respectively.\n\nThe path is treated as a jinja2 template, and the capture values are passed to the jinja2 rendering engine.  The resulting text is:\n\n```yaml\nlogging:\n  levels:\n  - level: informational\n    type: buffered\n  - level: informational\n    type: console\n  - level: informational\n    type: monitor\n```\n\nThe path is then converted from yaml to a python dictionary and stored as extracted data for the device.\n\nAfter each extraction, the device's data is passed to the `template` referenced in the parser.  From `./templates/cisco_ios-xe/logging/levels.j2`:\n\n\n```jinja\n{% for entry in vars['logging']['levels'] %}\n- parents:\n  lines:\n  - 'logging {{ entry['type'] }} {{ entry['level'] }}'\n{% endfor %}\n```\n\nThe template produces yaml.  Both parents and lines can be generated.  Parents and lines are convenience keys to aid in the use of the template for later automation.\n\nThe template result would be as follows:\n\n```yaml\n- parents:\n  lines:\n  - logging buffered informational\n  - logging console informational\n  - logging monitor informational\n```\n\nThe engine combines the parents and lines into a single list of values:\n\n```text\nlogging buffered informational\nlogging console informational\nlogging monitor informational\n```\n\nThe template result is first compared to the lines that were extracted from the configuration. If a match is found the initial full configuration is then walked to find an exact match for the text.  If an exact match is not found, the device will be marked as failed for the remainder of the run.\n\nIf a match is found the lines are removed from the configuration and the next parser is run.\n\n### Adding a parser\n\nIt will be necessary to add parsers to extract lines not covered by the included parsers.  Please feel free to issue a pull request to have additional parsers added.\n\nThe following error is generated when parsing a configuration:\n\n```shell\n'######## JINJA RESULT YAML'\n['interface GigabitEthernet7/9',\n ' switchport access vlan 267',\n ' switchport mode access',\n ' switchport voice vlan 867',\n ' spanning-tree portfast',\n ' service-policy input company-user-access-450x',\n ' service-policy output company-user-access-dbl']\n '######## POSSIBLE MATCHES'\n ['interface GigabitEthernet7/9',\n  ' switchport access vlan 267',\n  ' switchport mode access',\n  ' switchport voice vlan 867',\n  ' spanning-tree portfast',\n  ' spanning-tree bpduguard enable',\n  ' service-policy input company-user-access-450x',\n  ' service-policy output company-user-access-dbl',\n  '!',\n  'interface GigabitEthernet7/10']\n```\n\nThe line ` spanning-tree bpduguard enable` is missing from the extraction.  Since this is a cisco_ios-xe device, navigate to `/parsers/cisco_ios-xe/interface` and open the `main.yml` file.\n\nAdd the following parser near the bottom above the `service-policy` parser.\n\n```yaml\n    - regex: '^ spanning-tree bpduguard enable'\n      examples:\n      -  ' spanning-tree bpduguard enable'\n      path:\n        interfaces:\n          \"{{ name }}\":\n            spanning-tree:\n              bpduguard: True\n```\n\nThe corresponding temple needs to be modified as well. Open `./templates/cisco_ios-xe/interface/default.j2` and add the following just above `service_policies`:\n\n**Note: Sequence matters.** The jinja template has to produce the exact syntax and sequence of lines found and extracted from the configuration.  This validates the completeness and intergrity of the data.\n\n```jinja\n{% if 'spanning-tree' in vars['interfaces'][interface] and 'bpduguard' in vars['interfaces'][interface]['spanning-tree'] and vars['interfaces'][interface]['spanning-tree']['bpduguard'] %}\n- \" spanning-tree bpduguard enable\"\n{% endif %}{# bpduguard #}\n```\n\nThe process would be repeated until the errors are removed.\n\n### Command-line tag and skip-tag support\n\nDuring the development of parsers or the extraction of data, it may be necessary to focus on subsections of the configuration. Each parser is assigned tags which can be used to either include or exclude the parser from the run.\n\nFor instance, to run only the extended ACL parser:\n```\npython runparse.py --tags ip access-list extended\n```\n\nThe tags reference the tags found in the parser:\n\n```yaml\n- name: ip access-list extended\n  tags:\n  - ip\n  - access-list\n  - extended\n  matches:\n  - name: ip access-list extended\n    template: ip/access-lists/extended.j2\n    lines:\n    - regex: '^ip access-list extended (\\S+)$'\n      examples:\n      - 'ip access-list extended qo-global-core-voice-signal'\n      captures:\n      - name\n      path:\n        ip:\n          access_lists:\n            \"{{ name }}\":\n                name: \"{{ name }}\"\n                type: extended\n```\n\nTo skip the boot and aaa parsers:\n\n```\npython runparse.py --skip-tags extended boot aaa\n```\n\n### Using netcopa output with Ansible\n\nSee this repo for an example of using the netcopa output in Ansible\n\nhttps://github.com/cidrblock/ansible_and_netcopa\n\nNote: Two changes needed to be made\n\n- The `vars` key was removed from the host_vars file.\n- An additional blank line was added to the top of the template to force a line feed before `- parents`\n\nThe example doesn't account for the removal of lines from the config, a `default interface` could be added or addtional logic to compare the template output to the running configuration and prepend deltas with `no`.\n\n### Rebuilding an entire configuration from the host_vars\n\nSince the templates exisit for each OS, the host_vars files can be played backwards through netcopa, recreating the configuration.\n\nNote:  The global keyword sequence will vary because the templates are processed in alphabetical order:\n\nUsing the rebuild.py python script:\n\n```\npython rebuild.py\n*****  Loading configurations\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Retrieving OS\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n*****  Rebuilding config\ncisco_ios-00 cisco_ios/aaa/groups.j2                                   [ok]\ncisco_ios-00 cisco_ios/aaa/new_model.j2                                [ok]\ncisco_ios-00 cisco_ios/aaa/session_id.j2                               [ok]\ncisco_ios-00 cisco_ios/aaa/accounting/connection.j2                    [ok]\ncisco_ios-00 cisco_ios/aaa/accounting/exec.j2                          [ok]\ncisco_ios-00 cisco_ios/aaa/accounting/system.j2                        [ok]\ncisco_ios-00 cisco_ios/aaa/authentication/login.j2                     [ok]\ncisco_ios-00 cisco_ios/aaa/authorization/commands.j2                   [ok]\ncisco_ios-00 cisco_ios/aaa/authorization/exec.j2                       [ok]\ncisco_ios-00 cisco_ios/access-list/extended.j2                         [ok]\ncisco_ios-00 cisco_ios/access-list/standard.j2                         [ok]\ncisco_ios-00 cisco_ios/alias/default.j2                                [skipped]\ncisco_ios-00 cisco_ios/banners/default.j2                              [ok]\ncisco_ios-00 cisco_ios/clock/timezone.j2                               [ok]\ncisco_ios-00 cisco_ios/control-plane/default.j2                        [ok]\ncisco_ios-00 cisco_ios/enable/secret.j2                                [ok]\ncisco_ios-00 cisco_ios/hostname/default.j2                             [ok]\ncisco_ios-00 cisco_ios/interface/default.j2                            [ok]\ncisco_ios-00 cisco_ios/ip/classless.j2                                 [ok]\ncisco_ios-00 cisco_ios/ip/domain_list.j2                               [ok]\ncisco_ios-00 cisco_ios/ip/domain_name.j2                               [ok]\ncisco_ios-00 cisco_ios/ip/http_secure-server.j2                        [ok]\ncisco_ios-00 cisco_ios/ip/http_server.j2                               [ok]\ncisco_ios-00 cisco_ios/ip/name-server.j2                               [ok]\ncisco_ios-00 cisco_ios/ip/ospf_name-lookup.j2                          [ok]\ncisco_ios-00 cisco_ios/ip/prefix-lists.j2                              [ok]\ncisco_ios-00 cisco_ios/ip/routes.j2                                    [ok]\ncisco_ios-00 cisco_ios/ip/routing.j2                                   [ok]\ncisco_ios-00 cisco_ios/ip/source-route.j2                              [ok]\ncisco_ios-00 cisco_ios/ip/subnet-zero.j2                               [ok]\ncisco_ios-00 cisco_ios/ip/tacacs_source-interface.j2                   [ok]\ncisco_ios-00 cisco_ios/ip/access-lists/standard.j2                     [ok]\ncisco_ios-00 cisco_ios/line/con_aux.j2                                 [ok]\ncisco_ios-00 cisco_ios/line/vty.j2                                     [ok]\ncisco_ios-00 cisco_ios/logging/facility.j2                             [ok]\ncisco_ios-00 cisco_ios/logging/hosts.j2                                [ok]\ncisco_ios-00 cisco_ios/logging/levels.j2                               [ok]\ncisco_ios-00 cisco_ios/logging/source-interface.j2                     [skipped]\ncisco_ios-00 cisco_ios/ntp/servers.j2                                  [ok]\ncisco_ios-00 cisco_ios/ntp/source.j2                                   [ok]\ncisco_ios-00 cisco_ios/route-maps/default.j2                           [ok]\ncisco_ios-00 cisco_ios/router/eigrp.j2                                 [ok]\ncisco_ios-00 cisco_ios/router/ospf.j2                                  [ok]\ncisco_ios-00 cisco_ios/service/disabled.j2                             [ok]\ncisco_ios-00 cisco_ios/service/enabled.j2                              [ok]\ncisco_ios-00 cisco_ios/service/timestamps.j2                           [ok]\ncisco_ios-00 cisco_ios/snmp/default.j2                                 [skipped]\ncisco_ios-00 cisco_ios/snmp/server/communities.j2                      [ok]\ncisco_ios-00 cisco_ios/snmp/server/contact.j2                          [ok]\ncisco_ios-00 cisco_ios/snmp/server/location.j2                         [ok]\ncisco_ios-00 cisco_ios/snmp/server/view.j2                             [ok]\ncisco_ios-00 cisco_ios/spanning-tree/extend_system-id.j2               [ok]\ncisco_ios-00 cisco_ios/spanning-tree/mode.j2                           [ok]\ncisco_ios-00 cisco_ios/tacacs-server/directed-request.j2               [ok]\ncisco_ios-00 cisco_ios/tacacs-server/hosts.j2                          [ok]\ncisco_ios-00 cisco_ios/tacacs-server/hosts_keyed.j2                    [skipped]\ncisco_ios-00 cisco_ios/tacacs-server/key.j2                            [ok]\ncisco_ios-00 cisco_ios/tacacs-server/timeout.j2                        [ok]\ncisco_ios-00 cisco_ios/udld/default.j2                                 [ok]\ncisco_ios-00 cisco_ios/username/default.j2                             [ok]\ncisco_ios-00 cisco_ios/version/default.j2                              [ok]\ncisco_ios-00 cisco_ios/vlan/internal_allocation_policy.j2              [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/groups.j2                             [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/new_model.j2                          [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/session_id.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/accounting/connection.j2              [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/accounting/exec.j2                    [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/accounting/system.j2                  [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/authentication/login.j2               [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/authorization/commands.j2             [ok]\ncisco_ios-xe-00 cisco_ios-xe/aaa/authorization/default.j2              [ok]\ncisco_ios-xe-00 cisco_ios-xe/access-list/extended.j2                   [skipped]\ncisco_ios-xe-00 cisco_ios-xe/access-list/standard.j2                   [ok]\ncisco_ios-xe-00 cisco_ios-xe/alias/default.j2                          [ok]\ncisco_ios-xe-00 cisco_ios-xe/banners/default.j2                        [ok]\ncisco_ios-xe-00 cisco_ios-xe/boot/default.j2                           [ok]\ncisco_ios-xe-00 cisco_ios-xe/class-maps/default.j2                     [ok]\ncisco_ios-xe-00 cisco_ios-xe/clock/timezone.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/control-plane/default.j2                  [ok]\ncisco_ios-xe-00 cisco_ios-xe/enable/secret.j2                          [ok]\ncisco_ios-xe-00 cisco_ios-xe/hostname/default.j2                       [ok]\ncisco_ios-xe-00 cisco_ios-xe/interface/default.j2                      [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/classless.j2                           [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/domain_list.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/domain_name.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/flow.j2                                [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/http_secure-server.j2                  [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/http_server.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/multicast_routing.j2                   [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/name-server.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/ospf_name-lookup.j2                    [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/pim.j2                                 [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/prefix-lists.j2                        [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/routes.j2                              [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/routing.j2                             [skipped]\ncisco_ios-xe-00 cisco_ios-xe/ip/source-route.j2                        [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/subnet-zero.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/tacacs_source-interface.j2             [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/access-lists/extended.j2               [ok]\ncisco_ios-xe-00 cisco_ios-xe/ip/access-lists/standard.j2               [ok]\ncisco_ios-xe-00 cisco_ios-xe/line/con_aux.j2                           [ok]\ncisco_ios-xe-00 cisco_ios-xe/line/vty.j2                               [ok]\ncisco_ios-xe-00 cisco_ios-xe/logging/facility.j2                       [ok]\ncisco_ios-xe-00 cisco_ios-xe/logging/hosts.j2                          [ok]\ncisco_ios-xe-00 cisco_ios-xe/logging/levels.j2                         [ok]\ncisco_ios-xe-00 cisco_ios-xe/logging/source-interface.j2               [ok]\ncisco_ios-xe-00 cisco_ios-xe/multilink/default.j2                      [ok]\ncisco_ios-xe-00 cisco_ios-xe/ntp/servers.j2                            [ok]\ncisco_ios-xe-00 cisco_ios-xe/ntp/source.j2                             [ok]\ncisco_ios-xe-00 cisco_ios-xe/policy-maps/default.j2                    [ok]\ncisco_ios-xe-00 cisco_ios-xe/redundancy/default.j2                     [ok]\ncisco_ios-xe-00 cisco_ios-xe/route-maps/default.j2                     [ok]\ncisco_ios-xe-00 cisco_ios-xe/router/bgp.j2                             [ok]\ncisco_ios-xe-00 cisco_ios-xe/router/eigrp.j2                           [skipped]\ncisco_ios-xe-00 cisco_ios-xe/router/ospf.j2                            [ok]\ncisco_ios-xe-00 cisco_ios-xe/service/disabled.j2                       [skipped]\ncisco_ios-xe-00 cisco_ios-xe/service/enabled.j2                        [ok]\ncisco_ios-xe-00 cisco_ios-xe/service/timestamps.j2                     [ok]\ncisco_ios-xe-00 cisco_ios-xe/snmp/default.j2                           [ok]\ncisco_ios-xe-00 cisco_ios-xe/snmp/server/communities.j2                [ok]\ncisco_ios-xe-00 cisco_ios-xe/snmp/server/contact.j2                    [ok]\ncisco_ios-xe-00 cisco_ios-xe/snmp/server/location.j2                   [ok]\ncisco_ios-xe-00 cisco_ios-xe/snmp/server/view.j2                       [skipped]\ncisco_ios-xe-00 cisco_ios-xe/spanning-tree/extend_system-id.j2         [skipped]\ncisco_ios-xe-00 cisco_ios-xe/spanning-tree/mode.j2                     [skipped]\ncisco_ios-xe-00 cisco_ios-xe/tacacs-server/directed-request.j2         [skipped]\ncisco_ios-xe-00 cisco_ios-xe/tacacs-server/hosts.j2                    [ok]\ncisco_ios-xe-00 cisco_ios-xe/tacacs-server/hosts_keyed.j2              [skipped]\ncisco_ios-xe-00 cisco_ios-xe/tacacs-server/key.j2                      [ok]\ncisco_ios-xe-00 cisco_ios-xe/tacacs-server/timeout.j2                  [skipped]\ncisco_ios-xe-00 cisco_ios-xe/udld/default.j2                           [skipped]\ncisco_ios-xe-00 cisco_ios-xe/username/default.j2                       [ok]\ncisco_ios-xe-00 cisco_ios-xe/version/default.j2                        [ok]\ncisco_ios-xe-00 cisco_ios-xe/vlan/internal_allocation_policy.j2        [skipped]\ncisco_ios-xe-00 cisco_ios-xe/vrfs/default.j2                           [ok]\n*****  Writing rebuilt config to file\ncisco_ios-00                                                           [ok]\ncisco_ios-xe-00                                                        [ok]\n```\n\nThe restores configurations will be place in `./configurations.rebuilt`\n\n## netcopa Data Model\n\nThis is here as an example.  See the utilities folder in the project for an example of how to extract the model from the parsers.\n\n### aaa accounting exec\n```yaml\naaa:\n  accounting:\n    connection:\n      default:\n        events: '{{ events }}'\n        methods: '{{ groups.replace(\"group\", \"^group\").split(\"^\")[1:] + methods.split(''\n          '') }}'\n    exec:\n      default:\n        events: '{{ events }}'\n        methods: '{{ groups.replace(\"group\", \"^group\").split(\"^\")[1:] + methods.split(''\n          '') }}'\n    system:\n      default:\n        events: '{{ events }}'\n        methods: '{{ groups.replace(\"group\", \"^group\").split(\"^\")[1:] + methods.split(''\n          '') }}'\n\n```\n### aaa authentication login\n```yaml\naaa:\n  authentication:\n    login:\n      activated:\n        methods:\n        - '{{ methods.split('' '') }}'\n      default:\n        methods: '{{ groups.replace(\"group\", \"^group\").split(\"^\")[1:] + methods.split(''\n          '') }}'\n\n```\n### aaa authorization\n```yaml\naaa:\n  authorization:\n    commands:\n      default:\n        methods: '{{ groups.replace(\"group\", \"^group\").split(\"^\")[1:] + methods.split(''\n          '') }}'\n        privilege_level: '{{ privilege_level }}'\n    '{{ aaa_kind }}':\n      activated:\n        methods: '{{ groups.replace(\"group \", \"^group \").split(\"^\")[1:] + methods.split(''\n          '') }}'\n      default:\n        methods: '{{ groups.replace(\"group\", \"^group\").split(\"^\")[1:] + methods.split(''\n          '') }}'\n\n```\n### aaa group\n```yaml\naaa:\n  groups:\n    '{{ group_name }}':\n      name: '{{ group_name }}'\n      servers:\n      - encryption_type: '{{ encryption_type }}'\n        ip: '{{ server_private_ip }}'\n        key: '{{ key }}'\n        private: true\n      tacacs_source_interface: '{{ source_interface }}'\n      type: '{{ group_type }}'\n\n```\n### aaa session-id\n```yaml\naaa:\n  new_model: true\n  session_id: '{{ session_id }}'\n\n```\n### access-list extended\n```yaml\naccess_lists:\n  '{{ number }}':\n    entries:\n    - action: '{{ action }}'\n      destination_network: '{{ destination_network }}'\n      destination_wildcard: 0.0.0.0\n      protocol: '{{ protocol }}'\n      source_network: any\n      source_wildcard: any\n      whitespace: '\"{{ whitespace }}\"'\n    number: '{{ number  }}'\n    type: extended\n\n```\n### access-list standard\n```yaml\naccess_lists:\n  '{{ number }}':\n    entries:\n    - action: '{{ action }}'\n      source_network: '{{ source_network }}'\n      source_wildcard: 0.0.0.0\n      whitespace: '\"{{ whitespace }}\"'\n    - action: '{{ action }}'\n      source_network: '{{ source_network }}'\n      source_wildcard: any\n      whitespace: '\"{{ whitespace }}\"'\n    - action: '{{ action }}'\n      source_network: '{{ source_network }}'\n      source_wildcard: '{{ source_wildcard }}'\n      whitespace: '\"{{ whitespace }}\"'\n    - remark: '{{ remark }}'\n    number: '{{ number  }}'\n    type: standard\n\n```\n### alias\n```yaml\naliases:\n- alias: '{{ alias }}'\n  command: '{{ command }}'\n  mode: '{{ mode }}'\n\n```\n### banner\n```yaml\nbanner:\n  '{{ type }}':\n    delimeter: '{{ delimeter }}'\n    text:\n    - '\"{{ text_line }}\"'\n\n```\n### boot\n```yaml\nboot:\n  system:\n  - filename: '{{ filename }}'\n    flash_fs: '{{ flash_fs }}'\n    from: flash\n\n```\n### class-map\n```yaml\nclass_maps:\n  '{{ name }}':\n    entries:\n    - dscp_values: '{{ dscp_values.split() }}'\n      type: dscp\n    - name: '{{ access_group_name }}'\n      type: access-group\n    match_type: '{{ match_type }}'\n    name: '{{ name }}'\n\n```\n### clock timezone\n```yaml\nclock:\n  hours_offset: '{{ hours_offset }}'\n  minutes_offset: '{{ minutes_offset }}'\n  timezone: '{{ timezone }}'\n\n```\n### control-plane\n```yaml\ncontrol_plane: null\n\n```\n### enable secret\n```yaml\nenable:\n  secret:\n    encryption_type: '{{ encryption_type }}'\n    secret: '{{ secret }}'\n\n```\n### hostname\n```yaml\nhostname: '{{ hostname }}'\n\n```\n### interface\n```yaml\ninterfaces:\n  '{{ name }}':\n    bandwidth: '{{ bandwidth }}'\n    channel_group: '{{ channel_group }}'\n    channel_group_mode: '{{ channel_group_mode.split() }}'\n    description: '\"{{ description }}\"'\n    encapsulation:\n      protocol: '{{ encapsulation_protocol }}'\n      tag: '{{ encapsulation_tag }}'\n    ip:\n      address:\n        ipv4_address: '{{ ipv4_address }}'\n        ipv4_netmask: '{{ ipv4_netmask }}'\n        negate: true\n      flow:\n        directions:\n        - '{{ flow_direction }}'\n      pim:\n        mode: '{{ pim_mode }}'\n    name: '{{ name }}'\n    negotiation:\n      negate: true\n      type: '{{ negotiation }}'\n    service_policies:\n    - direction: '{{ service_policy_direction }}'\n      name: '{{ service_policy_name }}'\n    shutdown: true\n    spanning-tree:\n      bpduguard: true\n      portfast: true\n    switchport:\n      access:\n        vlan: '{{ vlan }}'\n      mode: '{{ mode.split() }}'\n      negate: true\n      present: true\n      trunk:\n        allowed_vlans:\n          add: '\"{{ vlans }}\"'\n          vlans: '\"{{ vlans }}\"'\n        native_vlan: '{{ vlan }}'\n      voice:\n        vlan: '{{ voice_vlan }}'\n    vrf: '{{ vrf }}'\n\n```\n### ip access-list extended\n```yaml\nip:\n  access_lists:\n    '{{ name }}':\n      entries:\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_wildcard: 0.0.0.0\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_wildcard: 0.0.0.0\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_port: '{{ destination_port }}'\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_port: '{{ source_port }}'\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_port: '{{ source_port }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_port: '{{ destination_port }}'\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_port: '{{ destination_port }}'\n        destination_wildcard: 0.0.0.0\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_port: '{{ destination_port }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_port: '{{ source_port }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_port: '{{ destination_port }}'\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_port: '{{ destination_port }}'\n        destination_wildcard: 0.0.0.0\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_port: '{{ source_port }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_port: '{{ destination_port }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_port: '{{ source_port }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_end_port: '{{ destination_end_port }}'\n        destination_network: 0.0.0.0\n        destination_start_port: '{{ destination_start_port }}'\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_end_port: '{{ source_end_port }}'\n        source_network: 0.0.0.0\n        source_start_port: '{{ source_start_port }}'\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_end_port: '{{ source_end_port }}'\n        source_network: '{{ source_network }}'\n        source_start_port: '{{  source_start_port }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_end_port: '{{ source_end_port }}'\n        source_network: '{{ source_network }}'\n        source_start_port: '{{ source_start_port }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        destination_end_port: '{{ destination_end_port }}'\n        destination_network: 0.0.0.0\n        destination_start_port: '{{ destination_start_port }}'\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        destination_end_port: '{{ destination_end_port }}'\n        destination_network: '{{ destination_network }}'\n        destination_start_port: '{{ destination_start_port }}'\n        destination_wildcard: 0.0.0.0\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_end_port: '{{ destination_end_port }}'\n        destination_network: 0.0.0.0\n        destination_start_port: '{{ destination_start_port }}'\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: '{{ source_wildcard}}'\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_end_port: '{{ source_end_port }}'\n        source_network: 0.0.0.0\n        source_start_port: '{{ source_start_port }}'\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_end_port: '{{ destination_end_port }}'\n        destination_network: '{{ destination_network }}'\n        destination_start_port: '{{ destination_start_port }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - action: '{{ action }}'\n        destination_network: '{{ destination_network }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_end_port: '{{ source_end_port }}'\n        source_network: '{{ source_network }}'\n        source_start_port: '{{ source_start_port }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_end_port: '{{ destination_end_port }}'\n        destination_network: '{{ destination_network }}'\n        destination_start_port: '{{ destination_start_port }}'\n        destination_wildcard: '{{ destination_wildcard }}'\n        protocol: '{{ protocol }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - action: '{{ action }}'\n        destination_dscp: '{{ destination_dscp }}'\n        destination_network: 0.0.0.0\n        destination_wildcard: 255.255.255.255\n        protocol: '{{ protocol }}'\n        source_network: 0.0.0.0\n        source_wildcard: 255.255.255.255\n      - remark: '\"{{ remark }}\"'\n      - remark: null\n      name: '{{ name }}'\n      type: extended\n\n```\n### ip access-list standard\n```yaml\nip:\n  access_lists:\n    '{{ name }}':\n      entries:\n      - action: '{{ action }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: 0.0.0.0\n      - action: '{{ action }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: any\n      - action: '{{ action }}'\n        source_network: '{{ source_network }}'\n        source_wildcard: '{{ source_wildcard }}'\n      - remark: '\"{{ remark }}\"'\n      - remark: null\n      name: '{{ name }}'\n      type: standard\n\n```\n### ip flow-export\n```yaml\nip:\n  flow_cache:\n    timeout:\n      active:\n        minutes: '{{ active_timeout }}'\n  flow_export:\n    destinations:\n    - ipv4_address: '{{ destination }}'\n      port: '{{ destination_port }}'\n    source: '{{ source }}'\n    version: '{{ source }}'\n\n```\n### ip multicast routing distributed\n```yaml\nip:\n  classless: true\n  domain_lists:\n  - domain_name: '{{ domain_list }}'\n  domain_names:\n  - domain_name: '{{ domain_name }}'\n  http:\n    secure_server: false\n    server: false\n  multicast_routing:\n    distributed: true\n    enabled: true\n  name-servers:\n  - name_server: '{{ name_server_ip }}'\n  ospf_name-lookup: true\n  pim:\n    rp_address: '{{ rp_address }}'\n  routes:\n  - netmask: '{{ netmask }}'\n    network: '{{ network }}'\n    next_hop: '{{ next_hop }}'\n  source-route: true\n  subnet-zero: true\n  tacacs:\n    source_interface: '{{ source_interface }}'\n\n```\n### ip prefix-list\n```yaml\nip:\n  prefix_lists:\n    '{{ name }}':\n      entries:\n      - action: '{{ action }}'\n        netmask: '{{ netmask }}'\n        network: '{{ network }}'\n        sequence: '{{ sequence }}'\n      - action: '{{ action }}'\n        le_bits: '{{ le_bits }}'\n        netmask: '{{ netmask }}'\n        network: '{{ network }}'\n        sequence: '{{ sequence }}'\n      name: '{{ name }}'\n\n```\n### line con\n```yaml\nline:\n  '{{ type }}':\n    numbers:\n      '{{ number }}':\n        escape_character: '{{ escape_character }}'\n        exec_timeout:\n          minutes: '{{ minutes }}'\n          seconds: '{{ seconds }}'\n        login:\n          authentication: '{{ named_list }}'\n        number: '{{ number }}'\n        password:\n          encryption_type: '{{ encryption_type }}'\n          password: '{{ password }}'\n        stopbits: '{{ stopbits }}'\n        transport:\n          '{{ direction }}':\n            protocols: '{{ protocols.split() }}'\n    type: '{{ type }}'\n\n```\n### line con\n```yaml\nline:\n  vty:\n    '{{ start }}to{{ finish }}':\n      escape_character: '{{ escape_character }}'\n      exec_timeout:\n        minutes: '{{ minutes }}'\n        seconds: '{{ seconds }}'\n      finish: '{{ finish }}'\n      password:\n        encryption_type: '{{ encryption_type }}'\n        password: '{{ password }}'\n      privilege_level: '{{ privilege_level }}'\n      start: '{{ start }}'\n      transport:\n        '{{ direction }}':\n          protocols: '{{ protocols.split() }}'\n\n```\n### logging source\n```yaml\nlogging:\n  facility: '{{ facility }}'\n  hosts:\n  - host: '{{ host }}'\n  levels:\n  - level: '{{ level }}'\n    type: '{{ type }}'\n  source_interface: '{{ source_interface }}'\n\n```\n### multilink\n```yaml\nmultilink:\n  bundle_name:\n    method: '{{ method }}'\n\n```\n### ntp source\n```yaml\nntp:\n  servers:\n  - server_ip: '{{ server_ip }}'\n  source:\n    interface: '{{ interface }}'\n\n```\n### policy-map\n```yaml\npolicy_maps:\n  '{{ policy_name }}':\n    classes:\n      '{{ class_name }}':\n        name: '{{ class_name }}'\n    description: '\"{{ description }}\"'\n    name: '{{ policy_name }}'\n    sequence:\n    - '{{ class_name }}'\n\n```\n### redundancy\n```yaml\nredundancy:\n  enabled: true\n  mode: '{{ mode }}'\n\n```\n### route-map\n```yaml\nroute_maps:\n  '{{ name }}':\n    name: '{{ name }}'\n    statements:\n      '{{ sequence }}':\n        action: '{{ action }}'\n        clauses:\n        - clause: '{{ clause }}'\n          value: '\"{{ value }}\"'\n        sequence: '{{ sequence }}'\n\n```\n### router bgp\n```yaml\nrouter:\n  bgp:\n    '{{ parent_process_id }}':\n      address_families:\n        '\"{{ ip_version }}\"':\n          ip_version: '{{ ip_version }}'\n          vrfs:\n            '{{ vrf_name }}':\n              vrf_name: '{{ vrf_name }}'\n      address_family_delimeter: bang\n      address_family_exit_command: exit-address-family\n      aggregate_addresses:\n      - netmask: '{{ aggregate_netmask }}'\n        network: '{{ aggregate_address }}'\n        summary_only: true\n      auto_summary: false\n      log_neighbor_changes: true\n      neighbors:\n        '{{ ipv4_address }}':\n          default_originate:\n            enabled: true\n            route_map: '{{ default_originate_route_map }}'\n          description: '\"{{ description }}\"'\n          ipv4_address: '{{ ipv4_address }}'\n          next_hop_self: true\n          remote_as: '{{ remote_as }}'\n          route_map_in: '{{ route_map_in }}'\n          route_map_out: '{{ route_map_out }}'\n          soft_reconfiguration_inbound: true\n      process_id: '{{ parent_process_id }}'\n      redistribute:\n        ospf:\n          match:\n          - internal\n          - external 1\n          - external 2\n          process_id: '{{ process_id}}'\n          protocol: ospf\n          route_map: '{{ route_map }}'\n        '{{ protocol }}':\n          protocol: '{{ protocol }}'\n      router_id: '{{ router_id }}'\n      synchronization: false\n\n```\n### router ospf\n```yaml\nrouter:\n  ospf:\n    '{{ parent_process_id }}':\n      auto_cost_reference_bandwidth: '{{ reference_bandwidth }}'\n      default_information:\n        metric: '{{ metric }}'\n        metric_type: '{{ metric_type }}'\n        originate: true\n      distance: '{{ distance }}'\n      distribute_lists:\n      - \u0026id001\n        direction: '{{ direction }}'\n        route_map: '{{ distribute_list_route_map }}'\n      - *id001\n      log_adjacency_changes: true\n      network_statements:\n      - \u0026id002\n        area: '{{ network_area }}'\n        netmask: '{{ network_netmask }}'\n        network: '{{ network_network }}'\n      - *id002\n      passive_interface_default: true\n      passive_interfaces:\n      - \u0026id003\n        interface: '{{ no_passive_interface }}'\n        negate: true\n      - *id003\n      process_id: '{{ parent_process_id }}'\n      redistribute:\n        static:\n          protocol: static\n          subnets: true\n        '{{ protocol }}':\n          metric: '{{ metric }}'\n          metric_types: '{{ metric_types.replace(\"metric-type\", \"\").split('' '') }}'\n          process_id: '{{ redist_process_id }}'\n          protocol: '{{ protocol }}'\n          route_map: '{{ route_map }}'\n          subnets: true\n          tag: '{{ tag }}'\n      router_id: '{{ router_id }}'\n      summary_addresses:\n      - \u0026id004\n        netmask: '{{ summary_netmask }}'\n        network: '{{ summary_network }}'\n      - *id004\n      vrf: '{{ vrf }}'\n\n```\n### disabled services\n```yaml\nservices:\n  disabled:\n  - service_name: '{{ service_name }}'\n  enabled:\n  - service_name: '{{ service_name }}'\n  timestamps:\n  - modifiers: '{{ modifiers.split('' '') }}'\n    type: '{{ type }}'\n\n```\n### snmp ifmib\n```yaml\nsnmp:\n  ifmib:\n    ifindex:\n      persist: true\n\n```\n### snmp-server location\n```yaml\nsnmp:\n  server:\n    communities:\n    - acl: '{{ acl }}'\n      community: '{{ community }}'\n      type: '{{ type }}'\n    contact: '\"{{ contact }}\"'\n    location: '\"{{ location }}\"'\n\n```\n### spanning-tree extend system-id\n```yaml\nspanning-tree:\n  extend_system-id: true\n  mode: '{{ mode }}'\n\n```\n### tacacs-server timeout\n```yaml\ntacacs_server:\n  directed_request: true\n  hosts:\n  - ip: '{{ host }}'\n  - encryption_type: '{{ encryption_type }}'\n    ip: '{{ host }}'\n    password: '{{ password }}'\n  key:\n    encryption_type: '{{ encryption_type }}'\n    password: '{{ password }}'\n  timeout: '{{ timeout }}'\n\n```\n### udld\n```yaml\nudld:\n  enable: true\n\n```\n### username\n```yaml\nusernames:\n- encryption_type: '{{ encryption_type }}'\n  password: '{{ password }}'\n  username: '{{ username }}'\n- encryption_type: '{{ encryption_type }}'\n  secret: '{{ secret }}'\n  username: '{{ username }}'\n\n```\n### version\n```yaml\nversion: '{{ version }}'\n\n```\n### svlan internal allocation policy\n```yaml\nvlan:\n  internal_allocation_policy: '{{ direction }}'\n\n```\n### vrf\n```yaml\nvrfs:\n  '{{ name }}':\n    address_families:\n      '{{ address_family }}':\n        address_family: '{{ address_family }}'\n    address_family_delimeter: bang\n    address_family_exit_command: exit-address-family\n    description: '{{ description }}'\n    name: '{{ name }}'\n    route_distinguisher:\n      arbitrary_number: '{{ arbitrary_number }}'\n      as: '{{ as }}'\n\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcidrblock%2Fnetcopa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcidrblock%2Fnetcopa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcidrblock%2Fnetcopa/lists"}