Config Parsers Development¶
Current Included Parsers¶
OS Name | Parser Class |
---|---|
arista_eos | netutils.config.parser.EOSConfigParser |
aruba_aoscx | netutils.config.parser.ArubaConfigParser |
bigip_f5 | netutils.config.parser.F5ConfigParser |
cisco_aireos | netutils.config.parser.AIREOSConfigParser |
cisco_asa | netutils.config.parser.ASAConfigParser |
cisco_ios | netutils.config.parser.IOSConfigParser |
cisco_iosxr | netutils.config.parser.IOSXRConfigParser |
cisco_nxos | netutils.config.parser.NXOSConfigParser |
citrix_netscaler | netutils.config.parser.NetscalerConfigParser |
extreme_netiron | netutils.config.parser.NetironConfigParser |
fortinet_fortios | netutils.config.parser.FortinetConfigParser |
hp_comware | netutils.config.parser.HPComwareConfigParser |
juniper_junos | netutils.config.parser.JunosConfigParser |
linux | netutils.config.parser.LINUXConfigParser |
mikrotik_routeros | netutils.config.parser.RouterOSConfigParser |
mrv_optiswitch | netutils.config.parser.OptiswitchConfigParser |
netscaler | netutils.config.parser.NetscalerConfigParser |
nokia_sros | netutils.config.parser.NokiaConfigParser |
paloalto_panos | netutils.config.parser.PaloAltoNetworksConfigParser |
ruckus_fastiron | netutils.config.parser.FastironConfigParser |
ubiquiti_airos | netutils.config.parser.UbiquitiAirOSConfigParser |
Building for Actual Use Cases¶
The library attempts to model actual configuration as shown in the running configuration, traditionally shown with a show run
or similar command. Accounting for use cases that do not exist in the running configuration, are generally outside the scope of the project.
There are occasions where there will be a exceptions for valid running configuration and will be documented below.
Fortinet Fortios Parser¶
In order to support html blocks that exist in Fortios configurations, some preprocessing is executed, this is a regex that specifically grabs everything between quotes after the 'set buffer' sub-command. It's explicitly looking for double quote followed by a newline ("\n) to end the captured data. This support for html data will not support any other html that doesn't follow this convention.
F5 Parser¶
The "ltm rule" configuration sections are not uniform nor standardized; therefor, these sections are completely removed from the configuration in a preprocessing event.
Nokia SROS Parser¶
The section banners have been simplified to extract the section header itself. This means that echo "System Configuration"
will be converted to just "System Configuration".
Citrix NetScaler Parser¶
As the NetScaler configuration uses each line to make a specific configuration change there is no support for parent/child relationships in the parser.
Palo Alto Conversion¶
The conversion from curly to set format via the paloalto_panos_brace_to_set
function strips any usage of devices localhost.localdomain
. This will be evaluated in the future to be configurable but it is the current intention.
Duplicate Line Detection¶
In some circumstances replacing lines, such as secrets without uniqueness in the replacement, will result in duplicated lines that are invalid configuration, such as:
There are some known use cases, such as the below that are considered::
router bgp 6500
bgp router-id 10.0.0.11
!
address-family ipv4 unicast
redistribute connected
exit-address-family <--- duplicated hierarchy
!
address-family l2vpn evpn
neighbor underlay activate
exit-address-family <--- duplicated hierarchy
Documented use cases that are actual configuration on a network device are considered valid and should be opened for bug fixes. However, configuration that does not actually exist on the running config of network devices are out of scope for the parser.
New Parsers¶
There are a series of considerations documented below, when developing a new parser.
- Creation of a new class that must be created in
netutils/config/parser.py
file. - Creation of a parser class that inherits from the class
BaseConfigParser
in the Python Method Resolution Order (MRO).- In nearly all cases should inherit directory off of
BaseSpaceConfigParser
orBaseBraceConfigParser
. BaseSpaceConfigParser
is for Cisco IOS-like configurations.BaseBraceConfigParser
is for JUNOS-like configurations that use curly braces.
- In nearly all cases should inherit directory off of
- Create the class name in the format of
{os_name.title()}ConfigParser
.- The classes
__init__
method must keep true to the signature or__init__(self, config)
. - The class must provide a
self.config_lines
that is a list ofConfigLine
named tuples.
- The classes
- Build tests for the
tests/unit/mock/config/compliance/compliance/{os_name}/*
andtests/unit/mock/config/parser/base/{os_name}/*
. - Add to
netutils/config/compliance.py
theparser_map
, that maps the name of the parser to the Plugin.- Ensure that the key name is based on
netutils.lib_mapper.MAIN_LIB_MAPPER_LIB_MAPPER
definitions. - Ensure that it is alpha sorted.
- Ensure that it the key is added to
netutils.lib_mapper.NETUTILSPARSER_LIB_MAPPER
andnetutils.lib_mapper.NETUTILSPARSER_LIB_MAPPER_REVERSE
.
- Ensure that the key name is based on
- Fill out docstrings in the class and methods within the class that describe the parameters and an Example that compiles.
- The following tips will generally be applicable.
- Generally a class method should provide a
comment_chars
andbanner_start
as well as sometimesbanner_end
. - Generally on the
__init__
should call thebuild_config_relationship
method. - Often can inherit directly from
CiscoConfigParser
. - Observe the existing patterns, make use of
super
, and inheritance to reuse existing code.
- Generally a class method should provide a