diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 021f53d0..aa72be1c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -88,7 +88,7 @@ jobs:
strategy:
fail-fast: true
matrix:
- python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"]
+ python-version: ["3.7", "3.8", "3.9", "3.10"]
runs-on: "ubuntu-20.04"
env:
PYTHON_VER: "${{ matrix.python-version }}"
@@ -161,7 +161,7 @@ jobs:
strategy:
fail-fast: true
matrix:
- python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"]
+ python-version: ["3.7", "3.8", "3.9", "3.10"]
runs-on: "ubuntu-20.04"
env:
PYTHON_VER: "${{ matrix.python-version }}"
diff --git a/.readthedocs.yml b/.readthedocs.yml
index 492d9c46..a9d358ef 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -1,12 +1,22 @@
---
+# .readthedocs.yaml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
version: 2
-sphinx:
- builder: "html"
- configuration: "docs/source/conf.py"
- fail_on_warning: false
+# Set the version of Python in the build environment.
+build:
+ os: "ubuntu-22.04"
+ tools:
+ python: "3.10"
+
+mkdocs:
+ configuration: "mkdocs.yml"
+ # fail_on_warning: true
+# Use our docs/requirements.txt during installation.
python:
- version: 3.7
install:
- requirements: "docs/requirements.txt"
diff --git a/CHANGELOG.md b/CHANGELOG.md
deleted file mode 100644
index 56903bfb..00000000
--- a/CHANGELOG.md
+++ /dev/null
@@ -1,153 +0,0 @@
-# Changelog
-
-## v1.2.0 - 2022-08
-
-### Added
-
-- #128 Documentation for Nokia SROS duplicate lines/duplicate line detection
-- #138 Added nxos_ssh to Napalm mapper
-
-### Changed
-
-- #113 Updated lib mapping docs
-- #115 Switched build backend to poetry-core
-- #121 Update banner parsing for EOS
-- #129 Add type hints to the whole project and mypy testing setup and CI
-- #134 Updated CODEOWNERS
-
-### Fixed
-
-- #122 Fixed encrypt type7
-
-## v1.1.0 - 2022-04
-
-### Added
-
-- #90 Uptime Conversions.
-- #102 Add Ansible mapping for Nokia SrOS.
-- #105 Add min_grouping_sizing to vlanlist_to_config method.
-- #106 Add Nokia SrOS Config Parser.
-
-### Changed
-
-- #104 Optimize vlanconfig_to_list using builtin Regex methods.
-
-### Fixed
-
-- #99 Fixed decimal place in bits_to_name.
-- #107 Fix issue when backup or intended is empty.
-
-
-## v1.0.0 - 2021-11
-
-### Added
-
-- #69 Normalise banner delimiter for IOS to ^C & support parsing delimiter ^
-
-### Fixed
-
-- #79 F5 parser fix for irules with multiline single command lines.
-
-### Removed
-
-- #83 remove support for old function 'is_fqdn_valid' as prep for 1.0.0
-
-## v0.2.5 - 2021-11
-
-### Added
-
-- #76 Added wrapper for Python ipaddress methods for use with Jinja
-
-### Fixed
-
-- #75 Updated Python requirements to be loosened
-- #76 Fixed doc errors with ip methods
-- #77 Fixed CI pipeline for docker caching
-
-## v0.2.4 - 2021-11
-
-### Added
-
-- #33 Add interface range compress function
-- #53 Add get peer address function
-- #59 Add bandwidth converting function
-- #65 Added Docker caching
-- #68 Add Fortinet Fortios Parser support
-
-### Changed
-
-- #64 CI implementation on GitHub actions
-
-### Fixed
-
-- #52 Update pyproject.toml build-server
-- #55 update version in toml and init files
-- #63 Fix lack of zero padding on ip to binary conversion
-- #70 Fix lack of zero padding on ip to hex conversion
-- #68 Update Black pinning
-
-## v0.2.3 - 2021-09
-
-### Added
-
-- #45 Added a jinja2 convenience function
-
-### Changed
-
-- #46 Updated NAPALM Maps to include community drivers
-
-### Fixed
-
-- #49 Fix read the docs
-
-## v0.2.2 - 2021-09
-
-### Added
-
-- #35 TCP/UDP Mappings
-- #31 Interface range expansion
-- #28 IPv6 Functionality to IP Module
-- #34 Interface sorting
-
-### Changed
-
-- #39 Updated docs to include automation library mappings
-- #41 Updated docs to include tcp/udp mappings
-
-### Fixed
-
-- Corrected contribution and attribution docs
-
-## v0.2.1 - 2021-06
-
-### Added
-
-- #16 Cisco ASA Parser.
-
-### Changed
-
-- #17 Update interface mapping for Sync, TenGig, Port-channel.
-
-## v0.2.0 - 2021-06
-
-### Fixed
-
-- Enable docstring tests
-- Fix docstring tests
-- Fix wording and links on README
-
-### Changed
-
-- Changed name of is_fqdn_valid to is_fqdn_resolvable, prepare to deprecate is_fqdn_valid
-- Removed automatic import of all functions on initiation of package
-- Moved interface mappings from variables to constants
-
-## v0.1.1 - 2021-05
-
-### Added
-
-- Update travis configuration to release a new version from CI/CD pipeline
-
-## v0.1.0 - 2021-03-19
-
-Initial release
diff --git a/README.md b/README.md
index b9c9e667..5adc023f 100644
--- a/README.md
+++ b/README.md
@@ -1,235 +1,40 @@
-# netutils
+# Netutils
-A Python library that is a collection of objects for common network automation tasks.
+
+
+
+
+
+
+
+
+
+
+
-This library intends to keep the following tenets:
+## Overview
-* Must not be any dependencies required to run the library.
- * May be some optional dependencies, to be managed by the user in opt in fashion.
-* Shall prefer functions over classes.
-* Shall prefer a folder and file structure that is flat.
-* Shall leverage docstrings as the primary documentation mechanism.
- * Must provide examples in every public function.
-* Shall retain a high test coverage.
+A Python library that is a collection of functions that are used in the common network automation tasks. Tasks such as converting a BGP ASN to and from dotted format, normalizing an interface name, or "type 5" encrypting a password. The intention is to centralize these functions while keeping the library light.
-# Function Groupings
+## Documentation
-Functions are grouped with like functions, such as IP or MAC address based functions. Included to date are groupings of:
+Full web-based HTML documentation for this library can be found over on the [Netutils Docs](https://netutils.readthedocs.io) website:
-* Bandwidth - Provides the ability to convert between various bandwidth values.
-* Banner - Provides the ability to normalize the various banner delimiters.
-* BGP ASN - Provides the ability to convert BGP ASN from integer to dot notation.
-* Configuration
- * Cleaning - Provides the ability to remove or replace lines based on regex matches.
- * Compliance - Provides the ability to compare two configurations to sanely understand the differences.
- * Parsing - Provides the ability to parse configuration for the minor differences that are there.
-* DNS - Provides the ability to work with DNS, such as validating that a FQDN is resolvable.
-* Interface - Provides the ability to work with interface names, expanding, abbreviating, and splitting the names.
-* IP Address - Provides the ability to work with IP addresses, primarily exposing Python `ipaddress` functionality.
-* Library Mapper - Provides mappings in expected vendor names between Netmiko, NAPALM, pyntc, ntc-templates, pyats, and scrapli.
-* MAC Address - Provides the ability to work with MAC addresses such as validating or converting to integer.
-* Password - Provides the ability to compare and encrypt common password schemas such as type5 and type7 Cisco passwords.
-* Ping - Provides the ability to ping, currently only tcp ping.
-* Protocol Mapper - Provides a mapping for protocol names to numbers and vice versa.
-* Route - Provides the ability to provide a list of routes and an IP Address and return the longest prefix matched route.
-* Time -Provides the ability to convert between integer time and string times.
-* VLANs - Provide the ability to convert configuration into lists or lists into configuration.
+- [User Guide](https://netutils.readthedocs.io/en/latest/user/lib_overview/) - Overview, Using the library, Getting Started.
+- [Administrator Guide](https://netutils.readthedocs.io/en/latest/admin/install/) - How to Install, Configure, Upgrade, or Uninstall the library.
+- [Developer Guide](https://netutils.readthedocs.io/en/latest/dev/contributing/) - Extending the library, Code Reference, Contribution Guide.
+- [Release Notes / Changelog](https://netutils.readthedocs.io/en/latest/admin/release_notes/).
+- [Frequently Asked Questions](https://netutils.readthedocs.io/en/latest/user/faq/).
-# Installation
+### Contributing to the Docs
-Option 1: Install from PyPI.
+All the Markdown source for the library documentation can be found under the [docs](https://github.com/networktocode/netutils/tree/develop/docs) folder in this repository. For simple edits, a Markdown capable editor is sufficient - clone the repository and edit away.
-```bash
-$ pip install netutils
-```
+If you need to view the fully generated documentation site, you can build it with [mkdocs](https://www.mkdocs.org/). A container hosting the docs will be started using the invoke commands (details in the [Development Environment Guide](https://netutils.readthedocs.io/netutils/en/latest/dev/dev_environment/#docker-development-environment)) on [http://localhost:8001](http://localhost:8001). As your changes are saved, the live docs will be automatically reloaded.
-Option 2: Install from a GitHub branch, such as develop as shown below.
-
-```bash
-$ pip install git+https://github.com/networktocode/netutils.git@develop
-```
-
-# Examples
-
-While all functions come with examples in the docstrings, for quick reference of the types of problems this library intends to
-solve the following examples are provided.
-
-The following function will help in deploying list of VLANs and match the configuration style in a standard IOS-like configurations.
-
-```python
->>> from netutils.vlan import vlanlist_to_config
->>>
->>> vlan_cfg = vlanlist_to_config([1, 2, 3, 5, 6, 1000, 1002, 1004, 1006, 1008, 1010, 1012, 1014, 1016, 1018])
->>>
->>> vlan_cfg
-["1-3,5,6,1000,1002,1004,1006,1008,1010,1012,1014", "1016,1018"]
->>>
->>> for index, line in enumerate(vlan_cfg):
-... if index == 0:
-... print(f" switchport trunk allowed vlan {line}")
-... else:
-... print(f" switchport trunk allowed vlan add {line}")
-...
- switchport trunk allowed vlan 1-3,5,6,1000,1002,1004,1006,1008,1010,1012,1014
- switchport trunk allowed vlan add 1016,1018
->>>
-```
-
-You may want to compare a known password with a given encrypted password. This can help in verifying if the
-passwords are as expected for compliance reasons.
-
-```python
->>> from netutils.password import compare_type5
->>>
->>> compare_type5("cisco","$1$nTc1$Z28sUTcWfXlvVe2x.3XAa.")
-True
->>>
->>> compare_type5("not_cisco","$1$nTc1$Z28sUTcWfXlvVe2x.3XAa.")
-False
->>>
-```
-
-Often times interfaces will come in various different shortened names, and it is helpful to normalize them.
-
-```python
->>> from netutils.interface import canonical_interface_name
->>>
->>> canonical_interface_name("Gi1/0/1")
-'GigabitEthernet1/0/1'
->>>
->>> canonical_interface_name("Eth1")
-'Ethernet1'
->>>
-```
-
-These are just some examples of the many functions provided by this library.
-
-# Attribution
-
-The library was built to be a centralized place for common network automation code to be accessed. While in most cases it is
-difficult, if not impossible to understand the origin of code, the following intends to describe the known motivation for where
-code was derived from and in the few cases where actual code was directly taken from. Except where noted, all code is believed to
-be unattributable, from @itdependsnetworks, or from another Network to Code employee. If this is in fact an error, please open an
-issue, and the proper attribution will be provided. Any errors were not done out of malice, but rather the natural developer
-workflow of pulling snippets of code from existing locations such as StackOverflow and Github over months and years of development.
-As an example it is nearly impossible to understand the original author of Cisco type7 encryption/decryption in the sea of
-available code, and remains unattributable though clearly originally developed prior to this library being created.
-
-Influencers
-* [Netmiko](https://github.com/ktbyers/netmiko)
-* [NAPALM](https://github.com/napalm-automation/napalm)
-* [Ansible](https://github.com/ansible/ansible)
-* [IPCal](https://github.com/ammyblabla/ipcal)
-* [StackOverflow](https://stackoverflow.com/)
-* [Python 3 Docs](https://docs.python.org/3/library/)
-
-In many instances variables and function names were reused, but the code was built from scratch to avoid any potential licensing
-issues. Functions that were known to be rewritten and their known origin.
-
-| Function | Origin |
-| -------- | ------ |
-| asn_to_int | NAPALM |
-| is_ip | IPCal |
-| ip_to_bin | IPCal |
-| get_usable_range | IPCal |
-| encrypt_type7 | unknown |
-| decrypt_type7 | unknown |
-| vlan_to_list | Ansible |
-| sanitize_config | NAPALM |
-
-Relevant PR's
-* https://github.com/napalm-automation/napalm/pull/493
-* https://github.com/ansible/ansible/pull/39901
-* https://github.com/ansible/ansible/pull/26566
-
-In building out the time conversion, the regex patterns are based on NAPALM implementation with their consent.
-
-# Contributing
-
-Pull requests are welcomed and automatically built and tested against multiple versions of Python through TravisCI.
-Except for unit tests, testing is only supported on Python 3.7.
-
-The project is packaged with a light development environment based on `docker-compose` to help with the local development of the project and to run tests within TravisCI.
-
-The project is following Network to Code software development guidelines and are leveraging the following:
-- Black, Pylint, Bandit, Mypy, flake8, and pydocstyle for Python linting and formatting.
-- pytest, coverage, and unittest for unit tests.
-
-There are a number of things that are required in order to have a successful PR.
-
-- All new functions must contain at least 1 example in their docstrings.
-- Docstrings must conform to the google docstring [convention](https://google.github.io/styleguide/pyguide.html#381-docstrings).
-- Unit test for newly added functions are required.
-- If applicable, tests related to config parsing and compliance must be added.
-- Update the jinja2 filter (netutils.utils.jinja2_convenience_function) for any new functions (see below for details).
-- If you create a new file in the `netutils` folder, you must create a new folder and `index.rst` in the docs folder (see below for details).
-- Your PR must not introduce any required dependencies. You can introduce optional or development dependencies.
-
-## Adding to the jinja2 filter function
-
-To add a new function to the jinja2 filter, add a new entry to the `_JINJA2_FUNCTION_MAPPINGS` located in the `utils.py` file. When adding an entry, the key corresponds with the name to call the function and the value to the path to find the function.
-
-## Adding docs for a new python file
-
-If adding a new python file, the docs must be updated to account for the new file.
-
-1. Create a new folder in `docs/source/netutils` matching the name of your new file.
-2. Create an `index.rst` file in that folder.
-3. Add the following to the newly created file.
-
-```python
-#############################
-# ENTER THE TITLE OF THE PAGE
-##############################
-
-.. automodule:: netutils.newfile
- :members:
-```
-
-## CLI Helper Commands
-
-The project features a CLI helper based on [invoke](http://www.pyinvoke.org/) to help setup the development environment. The commands are listed below in 3 categories:
-- `dev environment`
-- `utility`
-- `testing`
-
-Each command can be executed with `invoke `. Each command also has its own help `invoke --help`
-
-### Local dev environment
-
-```
- build Build all docker images.
- clean Remove the project specific image.
- rebuild Clean the Docker image and then rebuild without using cache.
-```
-
-### Utility
-
-```
- clean-docs Removes the build directory and all of its contents.
- check-pypi-version Verify if the version specified already exists on PyPI.
- cli Enter the image to perform troubleshooting or dev work.
- html Creates html docs using sphinx-build command.
-```
-
-### Testing
-
-```
- bandit Run bandit to validate basic static code security analysis.
- black Run black to check that Python files adhere to its style standards.
- coverage Run the coverage report against pytest.
- flake8 Run flake8 to check that Python files adhere to its style standards.
- mypy Run mypy to validate typing-hints.
- pylint Run pylint code analysis.
- pydocstyle Run pydocstyle to validate docstring formatting adheres to NTC defined standards.
- pytest Run pytest for the specified name and Python version.
- tests Run all tests for the specified name and Python version.
- yamllint Run yamllint to validate formatting adheres to NTC defined YAML standards.
-```
+Any PRs with fixes or improvements are very welcome!
## Questions
-Please see [the documentation](https://netutils.readthedocs.io/) for detailed documentation on how to use netutils. For any additional questions or
-comments, feel free to swing by the [Network to Code slack channel](https://networktocode.slack.com/) (channel #networktocode).
-Sign up [here](http://slack.networktocode.com/)
-
+For any questions or comments, please check the [FAQ](https://netutils.readthedocs.io/en/latest/user/faq/) first. Feel free to also swing by the [Network to Code Slack](https://networktocode.slack.com/) (channel `#networktocode`), sign up [here](http://slack.networktocode.com/) if you don't have an account.
diff --git a/development_scripts.py b/development_scripts.py
new file mode 100644
index 00000000..c77fc8a0
--- /dev/null
+++ b/development_scripts.py
@@ -0,0 +1,145 @@
+"""Developer script to generate markdown tables."""
+from jinja2 import Environment, BaseLoader, select_autoescape
+from netutils.utils import _JINJA2_FUNCTION_MAPPINGS
+from netutils import lib_mapper
+from netutils.config.compliance import parser_map
+
+LIB_MAPPER_TEMPLATE = """| {{ header_src }} | | {{ header_dst }} |
+| ---------- | -- | ------ |
+{%- for key, val in _dict|dictsort %}
+| {{ key }} | → | {{ val }} |
+{%- endfor %}
+"""
+
+PARSER_MAPPER_TEMPLATE = """| OS Name | Parser Class |
+| ---------- | ------ |
+{%- for key, val in _dict|dictsort %}
+| {{ key }} | netutils.config.parser.{{ val.__name__ }} |
+{%- endfor %}
+"""
+
+JINJA_MAPPER_TEMPLATE = """| Filter name | Function |
+| ---------- | ------ |
+{%- for key, val in _dict|dictsort(false, 'value') %}
+| {{ key }} | netutils.{{ val }} |
+{%- endfor %}
+"""
+
+TEMPLATE = {
+ "LIB_MAPPER_TEMPLATE": LIB_MAPPER_TEMPLATE,
+ "PARSER_MAPPER_TEMPLATE": PARSER_MAPPER_TEMPLATE,
+ "JINJA_MAPPER_TEMPLATE": JINJA_MAPPER_TEMPLATE,
+}
+
+
+MAPPER = {
+ "LIB_MAPPER_TEMPLATE": {
+ "ansible": {
+ "header_src": "NORMALIZED",
+ "header_dst": "ANSIBLE",
+ "_dict": lib_mapper.ANSIBLE_LIB_MAPPER,
+ "_file": "docs/user/lib_mapper/ansible.md",
+ },
+ "ansible_reverse": {
+ "header_src": "ANSIBLE",
+ "header_dst": "NORMALIZED",
+ "_dict": lib_mapper.ANSIBLE_LIB_MAPPER_REVERSE,
+ "_file": "docs/user/lib_mapper/ansible_reverse.md",
+ },
+ "napalm": {
+ "header_src": "NORMALIZED",
+ "header_dst": "NAPALM",
+ "_dict": lib_mapper.NAPALM_LIB_MAPPER,
+ "_file": "docs/user/lib_mapper/napalm.md",
+ },
+ "napalm_reverse": {
+ "header_src": "NAPALM",
+ "header_dst": "NORMALIZED",
+ "_dict": lib_mapper.NAPALM_LIB_MAPPER_REVERSE,
+ "_file": "docs/user/lib_mapper/napalm_reverse.md",
+ },
+ "ntctemplates": {
+ "header_src": "NORMALIZED",
+ "header_dst": "NTCTEMPLATES",
+ "_dict": lib_mapper.NTCTEMPLATES_LIB_MAPPER,
+ "_file": "docs/user/lib_mapper/ntctemplates.md",
+ },
+ "ntctemplates_reverse": {
+ "header_src": "NTCTEMPLATES",
+ "header_dst": "NORMALIZED",
+ "_dict": lib_mapper.NTCTEMPLATES_LIB_MAPPER_REVERSE,
+ "_file": "docs/user/lib_mapper/ntctemplates_reverse.md",
+ },
+ "pyats": {
+ "header_src": "NORMALIZED",
+ "header_dst": "PYATS",
+ "_dict": lib_mapper.PYATS_LIB_MAPPER,
+ "_file": "docs/user/lib_mapper/pyats.md",
+ },
+ "pyats_reverse": {
+ "header_src": "PYATS",
+ "header_dst": "NORMALIZED",
+ "_dict": lib_mapper.PYATS_LIB_MAPPER_REVERSE,
+ "_file": "docs/user/lib_mapper/pyats_reverse.md",
+ },
+ "pyntc": {
+ "header_src": "NORMALIZED",
+ "header_dst": "PYNTC",
+ "_dict": lib_mapper.PYNTC_LIB_MAPPER,
+ "_file": "docs/user/lib_mapper/pyntc.md",
+ },
+ "pyntc_reverse": {
+ "header_src": "PYNTC",
+ "header_dst": "NORMALIZED",
+ "_dict": lib_mapper.PYNTC_LIB_MAPPER_REVERSE,
+ "_file": "docs/user/lib_mapper/pyntc_reverse.md",
+ },
+ "scrapli": {
+ "header_src": "NORMALIZED",
+ "header_dst": "SCRAPLI",
+ "_dict": lib_mapper.SCRAPLI_LIB_MAPPER,
+ "_file": "docs/user/lib_mapper/scrapli.md",
+ },
+ "scrapli_reverse": {
+ "header_src": "SCRAPLI",
+ "header_dst": "NORMALIZED",
+ "_dict": lib_mapper.SCRAPLI_LIB_MAPPER_REVERSE,
+ "_file": "docs/user/lib_mapper/scrapli_reverse.md",
+ },
+ },
+ "PARSER_MAPPER_TEMPLATE": {
+ "default": {
+ "_dict": parser_map,
+ "_file": "docs/dev/include_parser_list.md",
+ },
+ },
+ "JINJA_MAPPER_TEMPLATE": {
+ "default": {
+ "_dict": _JINJA2_FUNCTION_MAPPINGS,
+ "_file": "docs/user/include_jinja_list.md",
+ },
+ },
+}
+
+
+def main(test=False):
+ """Generate or test generation of standard files."""
+ env = Environment(loader=BaseLoader, autoescape=select_autoescape())
+
+ for template_name, value in MAPPER.items():
+ for data in value.values():
+ _file = data["_file"]
+ output = env.from_string(TEMPLATE[template_name]).render(**data)
+ if test:
+ with open(_file, encoding="utf8") as file:
+ actual = file.read()
+ if output != actual:
+ return False
+ else:
+ with open(_file, "w", encoding="utf8") as file:
+ file.write(output)
+ return True
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docs/admin/install.md b/docs/admin/install.md
new file mode 100644
index 00000000..e6dba18e
--- /dev/null
+++ b/docs/admin/install.md
@@ -0,0 +1,13 @@
+# Installation
+
+Option 1: Install from PyPI.
+
+```bash
+$ pip install netutils
+```
+
+Option 2: Install from a GitHub branch, such as develop as shown below.
+
+```bash
+$ pip install git+https://github.com/networktocode/netutils.git@develop
+```
\ No newline at end of file
diff --git a/docs/admin/release_notes/index.md b/docs/admin/release_notes/index.md
new file mode 100644
index 00000000..12cb5169
--- /dev/null
+++ b/docs/admin/release_notes/index.md
@@ -0,0 +1,3 @@
+# Release Notes
+
+All the published release notes can be found via the navigation menu. All patch releases are included in the same minor release (e.g. `v1.2`) document.
diff --git a/docs/admin/release_notes/version_0.1.md b/docs/admin/release_notes/version_0.1.md
new file mode 100644
index 00000000..baa53062
--- /dev/null
+++ b/docs/admin/release_notes/version_0.1.md
@@ -0,0 +1,15 @@
+# v0.1 Release Notes
+
+## Release Overview
+
+- Initial Release
+
+## [v0.1.1] - 2021-05
+
+### Added
+
+- Update travis configuration to release a new version from CI/CD pipeline.
+
+## [v0.1.0] - 2021-03-19
+
+- Initial release.
diff --git a/docs/admin/release_notes/version_0.2.md b/docs/admin/release_notes/version_0.2.md
new file mode 100644
index 00000000..534b86bd
--- /dev/null
+++ b/docs/admin/release_notes/version_0.2.md
@@ -0,0 +1,98 @@
+# v0.2 Release Notes
+
+## Release Overview
+
+- Update docs, docstrings, and docstring tests
+- Changed name of is_fqdn_valid to is_fqdn_resolvable, prepare to deprecate is_fqdn_valid
+- Removed automatic import of all functions on initiation of package
+- Moved interface mappings from variables to constants
+
+## [v0.2.5] - 2021-11
+
+### Added
+
+- [#76](https://github.com/networktocode/netutils/issues/76) Added wrapper for Python ipaddress methods for use with Jinja
+
+### Fixed
+
+- [#75](https://github.com/networktocode/netutils/issues/75) Updated Python requirements to be loosened
+- [#76](https://github.com/networktocode/netutils/issues/76) Fixed doc errors with ip methods
+- [#77](https://github.com/networktocode/netutils/issues/77) Fixed CI pipeline for docker caching
+
+## [v0.2.4] - 2021-11
+
+### Added
+
+- [#33](https://github.com/networktocode/netutils/issues/33) Add interface range compress function
+- [#53](https://github.com/networktocode/netutils/issues/53) Add get peer address function
+- [#59](https://github.com/networktocode/netutils/issues/59) Add bandwidth converting function
+- [#65](https://github.com/networktocode/netutils/issues/65) Added Docker caching
+- [#68](https://github.com/networktocode/netutils/issues/68) Add Fortinet Fortios Parser support
+
+### Changed
+
+- [#64](https://github.com/networktocode/netutils/issues/64) CI implementation on GitHub actions
+
+### Fixed
+
+- [#52](https://github.com/networktocode/netutils/issues/52) Update pyproject.toml build-server
+- [#55](https://github.com/networktocode/netutils/issues/55) update version in toml and init files
+- [#63](https://github.com/networktocode/netutils/issues/63) Fix lack of zero padding on ip to binary conversion
+- [#70](https://github.com/networktocode/netutils/issues/70) Fix lack of zero padding on ip to hex conversion
+- [#68](https://github.com/networktocode/netutils/issues/68) Update Black pinning
+
+## [v0.2.3] - 2021-09
+
+### Added
+
+- [#45](https://github.com/networktocode/netutils/issues/45) Added a jinja2 convenience function
+
+### Changed
+
+- [#46](https://github.com/networktocode/netutils/issues/46) Updated NAPALM Maps to include community drivers
+
+### Fixed
+
+- [#49](https://github.com/networktocode/netutils/issues/49) Fix read the docs
+
+## [v0.2.2] - 2021-09
+
+### Added
+
+- [#35](https://github.com/networktocode/netutils/issues/35) TCP/UDP Mappings
+- [#31](https://github.com/networktocode/netutils/issues/31) Interface range expansion
+- [#28](https://github.com/networktocode/netutils/issues/28) IPv6 Functionality to IP Module
+- [#34](https://github.com/networktocode/netutils/issues/34) Interface sorting
+
+### Changed
+
+- [#39](https://github.com/networktocode/netutils/issues/39) Updated docs to include automation library mappings
+- [#41](https://github.com/networktocode/netutils/issues/41) Updated docs to include tcp/udp mappings
+
+### Fixed
+
+- Corrected contribution and attribution docs
+
+## [v0.2.1] - 2021-06
+
+### Added
+
+- [#16](https://github.com/networktocode/netutils/issues/16) Cisco ASA Parser.
+
+### Changed
+
+- [#17](https://github.com/networktocode/netutils/issues/17) Update interface mapping for Sync, TenGig, Port-channel.
+
+## [v0.2.0] - 2021-06
+
+### Fixed
+
+- Enable docstring tests
+- Fix docstring tests
+- Fix wording and links on README
+
+### Changed
+
+- Changed name of is_fqdn_valid to is_fqdn_resolvable, prepare to deprecate is_fqdn_valid
+- Removed automatic import of all functions on initiation of package
+- Moved interface mappings from variables to constants
\ No newline at end of file
diff --git a/docs/admin/release_notes/version_1.0.md b/docs/admin/release_notes/version_1.0.md
new file mode 100644
index 00000000..b549f075
--- /dev/null
+++ b/docs/admin/release_notes/version_1.0.md
@@ -0,0 +1,21 @@
+# v1.0 Release Notes
+
+## Release Overview
+
+- Commit to SemVer
+- F5 fixes
+
+## v1.0.0 - 2021-11
+
+### Added
+
+- [#69](https://github.com/networktocode/netutils/issues/69) Normalise banner delimiter for IOS to ^C & support parsing delimiter ^.
+
+### Fixed
+
+- [#79](https://github.com/networktocode/netutils/issues/79) F5 parser fix for irules with multiline single command lines.
+
+### Removed
+
+- [#83](https://github.com/networktocode/netutils/issues/83) Remove support for old function 'is_fqdn_valid' as prep for 1.0.0.
+
diff --git a/docs/admin/release_notes/version_1.1.md b/docs/admin/release_notes/version_1.1.md
new file mode 100644
index 00000000..58711846
--- /dev/null
+++ b/docs/admin/release_notes/version_1.1.md
@@ -0,0 +1,23 @@
+# v1.1 Release Notes
+
+## Release Overview
+
+- Added Nokia SrOS
+
+## [v1.1.0] - 2022-04
+
+### Added
+
+- [#90](https://github.com/networktocode/netutils/issues/90) Uptime Conversions.
+- [#102](https://github.com/networktocode/netutils/issues/102) Add Ansible mapping for Nokia SrOS.
+- [#105](https://github.com/networktocode/netutils/issues/105) Add min_grouping_sizing to vlanlist_to_config method.
+- [#106](https://github.com/networktocode/netutils/issues/106) Add Nokia SrOS Config Parser.
+
+### Changed
+
+- [#104](https://github.com/networktocode/netutils/issues/104) Optimize vlanconfig_to_list using builtin Regex methods.
+
+### Fixed
+
+- [#99](https://github.com/networktocode/netutils/issues/99) Fixed decimal place in bits_to_name.
+- [#107](https://github.com/networktocode/netutils/issues/107) Fix issue when backup or intended is empty.
\ No newline at end of file
diff --git a/docs/admin/release_notes/version_1.2.md b/docs/admin/release_notes/version_1.2.md
new file mode 100644
index 00000000..9488bb6a
--- /dev/null
+++ b/docs/admin/release_notes/version_1.2.md
@@ -0,0 +1,27 @@
+# v1.2 Release Notes
+
+## Release Overview
+
+- Added type hints and mypy testing
+- Encrypt type7 updated
+
+
+## [v1.2.0] - 2022-08
+
+### Added
+
+- [#128](https://github.com/networktocode/netutils/issues/128) Documentation for Nokia SROS duplicate lines/duplicate line detection
+- [#138](https://github.com/networktocode/netutils/issues/138) Added nxos_ssh to Napalm mapper
+
+### Changed
+
+- [#113](https://github.com/networktocode/netutils/issues/113) Updated lib mapping docs
+- [#115](https://github.com/networktocode/netutils/issues/115) Switched build backend to poetry-core
+- [#121](https://github.com/networktocode/netutils/issues/121) Update banner parsing for EOS
+- [#129](https://github.com/networktocode/netutils/issues/129) Add type hints to the whole project and mypy testing setup and CI
+- [#134](https://github.com/networktocode/netutils/issues/134) Updated CODEOWNERS
+
+### Fixed
+
+- [#122](https://github.com/networktocode/netutils/issues/122) Fixed encrypt type7
+
diff --git a/docs/admin/uninstall.md b/docs/admin/uninstall.md
new file mode 100644
index 00000000..c6f249a5
--- /dev/null
+++ b/docs/admin/uninstall.md
@@ -0,0 +1,7 @@
+# Uninstall
+
+Uninstall from environment.
+
+```bash
+$ pip uninstall netutils
+```
\ No newline at end of file
diff --git a/docs/admin/upgrade.md b/docs/admin/upgrade.md
new file mode 100644
index 00000000..6204d1fa
--- /dev/null
+++ b/docs/admin/upgrade.md
@@ -0,0 +1,7 @@
+# Upgrading the Library
+
+Upgrade from PyPI.
+
+```bash
+$ pip install netutils --upgrade
+```
\ No newline at end of file
diff --git a/docs/assets/extra.css b/docs/assets/extra.css
new file mode 100644
index 00000000..50884f4a
--- /dev/null
+++ b/docs/assets/extra.css
@@ -0,0 +1,152 @@
+:root>* {
+ --md-accent-fg-color: #ff8504;
+ --md-primary-fg-color: #ff8504;
+ --md-typeset-a-color: #0097ff;
+}
+
+[data-md-color-scheme="slate"] {
+ --md-default-bg-color: hsla(var(--md-hue), 0%, 15%, 1);
+ --md-typeset-a-color: #0097ff;
+}
+
+/* Accessibility: Increase fonts for dark theme */
+[data-md-color-scheme="slate"] .md-typeset {
+ font-size: 0.9rem;
+}
+
+[data-md-color-scheme="slate"] .md-typeset table:not([class]) {
+ font-size: 0.7rem;
+}
+
+.md-tabs__link {
+ font-size: 0.8rem;
+}
+
+.md-tabs__link--active {
+ color: var(--md-primary-fg-color);
+}
+
+.md-header__button.md-logo :is(img, svg) {
+ height: 2rem;
+}
+
+.md-header__button.md-logo :-webkit-any(img, svg) {
+ height: 2rem;
+}
+
+.md-header__title {
+ font-size: 1.2rem;
+}
+
+img.logo {
+ height: 100px;
+}
+
+img.copyright-logo {
+ height: 24px;
+ vertical-align: middle;
+}
+
+[data-md-color-primary=black] .md-header {
+ background-color: #212121;
+}
+
+@media screen and (min-width: 76.25em) {
+ [data-md-color-primary=black] .md-tabs {
+ background-color: #212121;
+ }
+}
+
+/* Customization for mkdocstrings */
+/* Indentation. */
+div.doc-contents:not(.first) {
+ padding-left: 25px;
+ border-left: .2rem solid var(--md-typeset-table-color);
+}
+
+/* Mark external links as such. */
+a.autorefs-external::after {
+ /* https://primer.style/octicons/arrow-up-right-24 */
+ background-image: url('data:image/svg+xml,');
+ content: ' ';
+
+ display: inline-block;
+ position: relative;
+ top: 0.1em;
+ margin-left: 0.2em;
+ margin-right: 0.1em;
+
+ height: 1em;
+ width: 1em;
+ border-radius: 100%;
+ background-color: var(--md-typeset-a-color);
+}
+
+a.autorefs-external:hover::after {
+ background-color: var(--md-accent-fg-color);
+}
+
+
+/* Customization for mkdocs-version-annotations */
+:root {
+ /* Icon for "version-added" admonition: Material Design Icons "plus-box-outline" */
+ --md-admonition-icon--version-added: url('data:image/svg+xml;charset=utf-8,');
+ /* Icon for "version-changed" admonition: Material Design Icons "delta" */
+ --md-admonition-icon--version-changed: url('data:image/svg+xml;charset=utf-8,');
+ /* Icon for "version-removed" admonition: Material Design Icons "minus-circle-outline" */
+ --md-admonition-icon--version-removed: url('data:image/svg+xml;charset=utf-8,');
+}
+
+/* "version-added" admonition in green */
+.md-typeset .admonition.version-added,
+.md-typeset details.version-added {
+ border-color: rgb(0, 200, 83);
+}
+
+.md-typeset .version-added>.admonition-title,
+.md-typeset .version-added>summary {
+ background-color: rgba(0, 200, 83, .1);
+}
+
+.md-typeset .version-added>.admonition-title::before,
+.md-typeset .version-added>summary::before {
+ background-color: rgb(0, 200, 83);
+ -webkit-mask-image: var(--md-admonition-icon--version-added);
+ mask-image: var(--md-admonition-icon--version-added);
+}
+
+/* "version-changed" admonition in orange */
+.md-typeset .admonition.version-changed,
+.md-typeset details.version-changed {
+ border-color: rgb(255, 145, 0);
+}
+
+.md-typeset .version-changed>.admonition-title,
+.md-typeset .version-changed>summary {
+ background-color: rgba(255, 145, 0, .1);
+}
+
+.md-typeset .version-changed>.admonition-title::before,
+.md-typeset .version-changed>summary::before {
+ background-color: rgb(255, 145, 0);
+ -webkit-mask-image: var(--md-admonition-icon--version-changed);
+ mask-image: var(--md-admonition-icon--version-changed);
+}
+
+/* "version-removed" admonition in red */
+.md-typeset .admonition.version-removed,
+.md-typeset details.version-removed {
+ border-color: rgb(255, 82, 82);
+}
+
+.md-typeset .version-removed>.admonition-title,
+.md-typeset .version-removed>summary {
+ background-color: rgba(255, 82, 82, .1);
+}
+
+.md-typeset .version-removed>.admonition-title::before,
+.md-typeset .version-removed>summary::before {
+ background-color: rgb(255, 82, 82);
+ -webkit-mask-image: var(--md-admonition-icon--version-removed);
+ mask-image: var(--md-admonition-icon--version-removed);
+}
diff --git a/docs/assets/favicon.ico b/docs/assets/favicon.ico
new file mode 100644
index 00000000..9685c83b
Binary files /dev/null and b/docs/assets/favicon.ico differ
diff --git a/docs/assets/networktocode_bw.png b/docs/assets/networktocode_bw.png
new file mode 100644
index 00000000..075c4926
Binary files /dev/null and b/docs/assets/networktocode_bw.png differ
diff --git a/docs/assets/networktocode_logo.png b/docs/assets/networktocode_logo.png
new file mode 100644
index 00000000..b2a3cba2
Binary files /dev/null and b/docs/assets/networktocode_logo.png differ
diff --git a/docs/assets/networktocode_logo.svg b/docs/assets/networktocode_logo.svg
new file mode 100644
index 00000000..348e5241
--- /dev/null
+++ b/docs/assets/networktocode_logo.svg
@@ -0,0 +1,150 @@
+
+
+
diff --git a/docs/assets/overrides/partials/copyright.html b/docs/assets/overrides/partials/copyright.html
new file mode 100644
index 00000000..b623894d
--- /dev/null
+++ b/docs/assets/overrides/partials/copyright.html
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/docs/dev/arch_decision.md b/docs/dev/arch_decision.md
new file mode 100644
index 00000000..ff0d58ac
--- /dev/null
+++ b/docs/dev/arch_decision.md
@@ -0,0 +1,16 @@
+# Architecture Decision Records
+
+The intention is to document deviations from a standard pattern.
+
+## Optional Import for OUI Mapping
+
+The following code is purposeful to ensure that we only import the large `OUI_MAPPINGS` if required. This does not effect the jinja mappings which will load the larger oui_mappings file.
+
+```python
+@_valid_mac
+def get_oui(mac: str) -> str:
+ from netutils.oui_mappings import OUI_MAPPINGS # pylint: disable=import-outside-toplevel
+```
+## Has Lib
+
+_Pending updates from napalm inclusion_
\ No newline at end of file
diff --git a/docs/dev/attribution.md b/docs/dev/attribution.md
new file mode 100644
index 00000000..135ecf6e
--- /dev/null
+++ b/docs/dev/attribution.md
@@ -0,0 +1,33 @@
+# Attribution
+
+The library was built to be a centralized place for common network automation code to be accessed. While in most cases it is difficult, if not impossible to understand the origin of code, the following intends to describe the known motivation for where code was derived from and in the few cases where actual code was directly taken from. Except where noted, all code is believed to be unattributable, from @itdependsnetworks, or from another Network to Code employee. If this is in fact an error, please open an issue, and the proper attribution will be provided. Any errors were not done out of malice, but rather the natural developer workflow of pulling snippets of code from existing locations such as StackOverflow and Github over months and years of development. As an example it is nearly impossible to understand the original author of Cisco type7 encryption/decryption in the sea of available code, and remains unattributable though clearly originally developed prior to this library being created.
+
+Influencers
+
+- [Netmiko](https://github.com/ktbyers/netmiko)
+- [NAPALM](https://github.com/napalm-automation/napalm)
+- [Ansible](https://github.com/ansible/ansible)
+- [IPCal](https://github.com/ammyblabla/ipcal)
+- [StackOverflow](https://stackoverflow.com/)
+- [Python 3 Docs](https://docs.python.org/3/library/)
+
+In many instances variables and function names were reused, but the code was built from scratch to avoid any potential licensing issues. Functions that were known to be rewritten and their known origin.
+
+| Function | Origin |
+| ---------------- | ------- |
+| asn_to_int | NAPALM |
+| is_ip | IPCal |
+| ip_to_bin | IPCal |
+| get_usable_range | IPCal |
+| encrypt_type7 | unknown |
+| decrypt_type7 | unknown |
+| vlan_to_list | Ansible |
+| sanitize_config | NAPALM |
+
+Relevant PR's
+
+- [NAPALM #493](https://github.com/napalm-automation/napalm/pull/493)
+- [Ansible #39901](https://github.com/ansible/ansible/pull/39901)
+- [Ansible #26566](https://github.com/ansible/ansible/pull/26566)
+
+In building out the time conversion, the regex patterns are based on NAPALM implementation with their consent.
\ No newline at end of file
diff --git a/docs/dev/code_reference/asn.md b/docs/dev/code_reference/asn.md
new file mode 100644
index 00000000..11646459
--- /dev/null
+++ b/docs/dev/code_reference/asn.md
@@ -0,0 +1,5 @@
+# BGP ASNs
+
+::: netutils.asn
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/bandwidth.md b/docs/dev/code_reference/bandwidth.md
new file mode 100644
index 00000000..7fb2c861
--- /dev/null
+++ b/docs/dev/code_reference/bandwidth.md
@@ -0,0 +1,5 @@
+# Bandwidth
+
+::: netutils.bandwidth
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/banner.md b/docs/dev/code_reference/banner.md
new file mode 100644
index 00000000..494a3050
--- /dev/null
+++ b/docs/dev/code_reference/banner.md
@@ -0,0 +1,5 @@
+# Banner
+
+::: netutils.banner
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/configs.md b/docs/dev/code_reference/configs.md
new file mode 100644
index 00000000..4ae07072
--- /dev/null
+++ b/docs/dev/code_reference/configs.md
@@ -0,0 +1,5 @@
+# Configs
+
+::: netutils.config
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/dns.md b/docs/dev/code_reference/dns.md
new file mode 100644
index 00000000..b9db6de9
--- /dev/null
+++ b/docs/dev/code_reference/dns.md
@@ -0,0 +1,5 @@
+# DNS
+
+::: netutils.dns
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/index.md b/docs/dev/code_reference/index.md
new file mode 100644
index 00000000..dba1498e
--- /dev/null
+++ b/docs/dev/code_reference/index.md
@@ -0,0 +1,3 @@
+# Code Reference
+
+Auto-generated code reference documentation from docstrings. This is the official method to document examples of using the code, this ensures that there is always an example and that the example is accurate.
diff --git a/docs/dev/code_reference/interface.md b/docs/dev/code_reference/interface.md
new file mode 100644
index 00000000..83d0097b
--- /dev/null
+++ b/docs/dev/code_reference/interface.md
@@ -0,0 +1,5 @@
+# Interface
+
+::: netutils.interface
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/ip.md b/docs/dev/code_reference/ip.md
new file mode 100644
index 00000000..092ee677
--- /dev/null
+++ b/docs/dev/code_reference/ip.md
@@ -0,0 +1,5 @@
+# IP Address
+
+::: netutils.ip
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/lib_mapping.md b/docs/dev/code_reference/lib_mapping.md
new file mode 100644
index 00000000..4994e259
--- /dev/null
+++ b/docs/dev/code_reference/lib_mapping.md
@@ -0,0 +1,7 @@
+# Library Mapping
+
+::: netutils.lib_mapper
+ options:
+ show_submodules: True
+
+Review how to use code within the [user documentation](../../user/lib_use_cases_lib_mapper.md)
\ No newline at end of file
diff --git a/docs/dev/code_reference/mac.md b/docs/dev/code_reference/mac.md
new file mode 100644
index 00000000..80f9bf51
--- /dev/null
+++ b/docs/dev/code_reference/mac.md
@@ -0,0 +1,5 @@
+# Mac Address
+
+::: netutils.mac
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/password.md b/docs/dev/code_reference/password.md
new file mode 100644
index 00000000..11646459
--- /dev/null
+++ b/docs/dev/code_reference/password.md
@@ -0,0 +1,5 @@
+# BGP ASNs
+
+::: netutils.asn
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/ping.md b/docs/dev/code_reference/ping.md
new file mode 100644
index 00000000..88e1f01e
--- /dev/null
+++ b/docs/dev/code_reference/ping.md
@@ -0,0 +1,5 @@
+# Ping
+
+::: netutils.ping
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/protocol_mapper.md b/docs/dev/code_reference/protocol_mapper.md
new file mode 100644
index 00000000..3bd23057
--- /dev/null
+++ b/docs/dev/code_reference/protocol_mapper.md
@@ -0,0 +1,7 @@
+# Protocol Mapper
+
+::: netutils.protocol_mapper
+ options:
+ show_submodules: True
+
+Review how to use code within the [user documentation](../../user/lib_use_cases_protocol_mappers.md)
\ No newline at end of file
diff --git a/docs/dev/code_reference/route.md b/docs/dev/code_reference/route.md
new file mode 100644
index 00000000..fb34c29c
--- /dev/null
+++ b/docs/dev/code_reference/route.md
@@ -0,0 +1,5 @@
+# Route
+
+::: netutils.route
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/time.md b/docs/dev/code_reference/time.md
new file mode 100644
index 00000000..2b09fd26
--- /dev/null
+++ b/docs/dev/code_reference/time.md
@@ -0,0 +1,5 @@
+# Time
+
+::: netutils.time
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/code_reference/utils.md b/docs/dev/code_reference/utils.md
new file mode 100644
index 00000000..b6f61e86
--- /dev/null
+++ b/docs/dev/code_reference/utils.md
@@ -0,0 +1,7 @@
+# Protocol Mapper
+
+::: netutils.utils
+ options:
+ show_submodules: True
+
+Review how to use code within the [user documentation](../../user/lib_use_cases_jinja_filters.md)
\ No newline at end of file
diff --git a/docs/dev/code_reference/vlan.md b/docs/dev/code_reference/vlan.md
new file mode 100644
index 00000000..b619743d
--- /dev/null
+++ b/docs/dev/code_reference/vlan.md
@@ -0,0 +1,5 @@
+# VLAN
+
+::: netutils.vlan
+ options:
+ show_submodules: True
\ No newline at end of file
diff --git a/docs/dev/contributing.md b/docs/dev/contributing.md
new file mode 100644
index 00000000..b3ac7cb5
--- /dev/null
+++ b/docs/dev/contributing.md
@@ -0,0 +1,102 @@
+# Contributing
+
+Pull requests are welcomed and automatically built and tested against multiple versions of Python through GitHub Actions.
+
+Except for unit tests, testing is only supported on Python 3.9.
+
+The project is packaged with a light development environment based on `Docker` to help with the local development of the project and to run tests within GitHub Actions.
+
+The project is following Network to Code software development guidelines and are leveraging the following:
+
+- Black, Pylint, Bandit, Mypy, flake8, and pydocstyle for Python linting and formatting.
+- pytest, coverage, and unittest for unit tests.
+
+There are a number of things that are required in order to have a successful PR.
+
+- All new functions must contain at least 1 example in their docstrings.
+- Docstrings must conform to the google docstring [convention](https://google.github.io/styleguide/pyguide.html#381-docstrings).
+- Unit test for newly added functions are required.
+- If applicable, tests related to config parsing and compliance must be added.
+- Update the jinja2 filter (netutils.utils.jinja2_convenience_function) for any new functions (see below for details).
+- If you create a new file in the `netutils` folder, you must add a new file for including Python and update `mkdocs.yml` to include the addition (see below for details).
+- Your PR must not introduce any required dependencies. You can introduce optional or development dependencies.
+
+Documentation is built using [mkdocs](https://www.mkdocs.org/). The [Docker based development environment](dev_environment.md#docker-development-environment) can be started by running `invoke docs` [http://localhost:8001](http://localhost:8001) that auto-refreshes when you make any changes to your local files.
+
+## Adding docs for a new python file
+
+If adding a new python file, the docs must be updated to account for the new file.
+
+1. Create a new markdown file in `docs/dev/code_reference` matching the name of your new file such as `dns.md`.
+2. Apply the following pattern to the newly created file.
+3. Update the `mydocs.yml` to point to the new file
+
+```python
+# DNS
+
+::: netutils.dns
+ options:
+ show_submodules: True
+```
+
+Update the mkdocs as appropriate, as shown in this truncated example of adding DNS.
+
+```yaml
+nav:
+ - Developer Guide:
+ - Extending the Library: "dev/extending.md"
+ - Contributing to the Library: "dev/contributing.md"
+ - Development Environment: "dev/dev_environment.md"
+ - Development Config: "dev/dev_config.md"
+ - Code Attribution to the Library: "dev/attribution.md"
+ - Code Reference:
+ - "dev/code_reference/index.md"
+ - ASN: "dev/code_reference/asn.md"
+ - Bandwidth: "dev/code_reference/bandwidth.md"
+ - Banner: "dev/code_reference/banner.md"
+ - Configs: "dev/code_reference/configs.md"
+ - DNS: "dev/code_reference/dns.md" <<-- Added
+```
+
+## Adding Lib Mapper, jinja2 filter, or Config Parser
+
+When adding to any of these features, you must run the `development_scripts` from the root directory. This process requires having Jinja2 on the machine that will run the process. This is automatically tested via pytest.
+
+## Adding to the jinja2 filter function
+
+To add a new function to the jinja2 filter, add a new entry to the `_JINJA2_FUNCTION_MAPPINGS` located in the `utils.py` file. When adding an entry, the key corresponds with the name to call the function and the value to the path to find the function.
+
+
+## Branching Policy
+
+The branching policy includes the following tenets:
+
+- The develop branch is the primary branch to develop off of.
+- If there is a reason to have a patch version, the maintainers may use cherry-picking strategy.
+- PRs intended to add new features should be sourced from the develop branch.
+- PRs intended to address bug fixes and security patches should be sourced from the develop branch.
+- PRs intended to add new features that break backward compatibility should be discussed before a PR is created.
+
+Netutils will observe semantic versioning, as of 1.0. This may result in an quick turn around in minor versions to keep pace with an ever growing feature set.
+
+## Release Policy
+
+Netutils has currently no intended scheduled release schedule, and will release new features in minor versions.
+
+When a new release is created the following should happen.
+
+- A release PR is created with:
+ - Update to the changelog in `docs/admin/release_notes/version_..md` file to reflect the changes.
+ - Change the version from `..-beta` to `..` in pyproject.toml.
+ - Set the PR to the main
+- Ensure the tests for the PR pass.
+- Merge the PR.
+- Create a new tag:
+ - The tag should be in the form of `v..`.
+ - The title should be in the form of `v..`.
+ - The description should be the changes that were added to the `version_..md` document.
+- If merged into `main`, then push from `main` to `develop`, in order to retain the merge commit created when the PR was merged
+- A post release PR is created with.
+ - Change the version from `..` to `..-beta` pyproject.toml.
+ - Set the PR to the `develop`.
+ - Once tests pass, merge.
\ No newline at end of file
diff --git a/docs/dev/dev_config.md b/docs/dev/dev_config.md
new file mode 100644
index 00000000..ae5462bd
--- /dev/null
+++ b/docs/dev/dev_config.md
@@ -0,0 +1,71 @@
+# Config Parsers Development
+
+## Current Included Parsers
+
+--8<-- "docs/dev/include_parser_list.md"
+
+## 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".
+
+### 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::
+
+```text
+snmp-server community <> RO SNMP_ACL_RO
+snmp-server community <> RO SNMP_ACL_RO
+```
+
+There are some known use cases, such as the below that are considered::
+
+```text
+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` or `BaseBraceConfigParser`.
+ - `BaseSpaceConfigParser` is for Cisco IOS-like configurations.
+ - `BaseBraceConfigParser` is for JUNOS-like configurations that use curly braces.
+- 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 of `ConfigLine` named tuples.
+- Build tests for the `tests/unit/mock/config/compliance/{os_name}/*` and `tests/unit/mock/config/parser/{os_name}/*`.
+- Add to `netutils/config/compliance.py` the `parser_map`, that maps the name of the parser to the Plugin.
+- 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` and `banner_start` as well as sometimes `banner_end`.
+ - Generally on the `__init__` should call the `build_config_relationship` method.
+ - Often can inherit directly from `CiscoConfigParser`.
+ - Observe the existing patterns, make use of `super`, and inheritance to reuse existing code.
\ No newline at end of file
diff --git a/docs/dev/dev_environment.md b/docs/dev/dev_environment.md
new file mode 100644
index 00000000..01cd8762
--- /dev/null
+++ b/docs/dev/dev_environment.md
@@ -0,0 +1,103 @@
+# Building Your Development Environment
+
+## Quickstart
+
+The development environment can be used in two ways:
+
+1. `Recommended` All services are spun up using Docker and a local mount so you can develop locally, but Netutils is spun up within the Docker container.
+2. With a local poetry environment if you wish to develop outside of Docker.
+
+This is a quick reference guide if you're already familiar with the development environment provided, which you can read more about later in this document.
+
+### Invoke
+
+The [Invoke](http://www.pyinvoke.org/) library is used to provide some helper commands based on the environment. There are a few configuration parameters which can be passed to Invoke to override the default configuration:
+
+- `local`: a boolean flag indicating if invoke tasks should be run on the host or inside the docker containers (default: False, commands will be run in docker containers)
+
+Using **Invoke** these configuration options can be overridden using [several methods](https://docs.pyinvoke.org/en/stable/concepts/configuration.html). Perhaps the simplest is setting an environment variable `INVOKE_NETUTILS_VARIABLE_NAME` where `VARIABLE_NAME` is the variable you are trying to override. There is an example `invoke.yml` (`invoke.example.yml`) in this directory which can be used as a starting point.
+
+### Docker Development Environment
+
+!!! tip
+ This is the recommended option for development.
+
+This project is managed by [Python Poetry](https://python-poetry.org/) and has a few requirements to setup your development environment:
+
+1. Install Poetry, see the [Poetry Documentation](https://python-poetry.org/docs/#installation) for your operating system.
+2. Install Docker, see the [Docker documentation](https://docs.docker.com/get-docker/) for your operating system.
+
+Once you have Poetry and Docker installed you can run the following commands (in the root of the repository) to install all other development dependencies in an isolated Python virtual environment:
+
+```shell
+poetry shell
+poetry install
+cp development/creds.example.env development/creds.env
+invoke build
+invoke start
+```
+
+Live documentation can be viewed at [http://localhost:8001](http://localhost:8001).
+
+To either stop or destroy the development environment use the following options.
+
+- **invoke stop** - Stop the containers, but keep all underlying systems intact
+- **invoke destroy** - Stop and remove all containers, volumes, etc. (This results in data loss due to the volume being deleted)
+
+## Poetry
+
+Poetry is used in lieu of the "virtualenv" commands and is leveraged in both environments. The virtual environment will provide all of the Python packages required to manage the development environment such as **Invoke**. See the [Local Development Environment](#local-poetry-development-environment) section to see how to install Netutils if you're going to be developing locally (i.e. not using the Docker container).
+
+The `pyproject.toml` file outlines all of the relevant dependencies for the project:
+
+- `tool.poetry.dependencies` - the main list of dependencies.
+- `tool.poetry.dev-dependencies` - development dependencies, to facilitate linting, testing, and documentation building.
+
+The `poetry shell` command is used to create and enable a virtual environment managed by Poetry, so all commands ran going forward are executed within the virtual environment. This is similar to running the `source venv/bin/activate` command with virtualenvs. To install project dependencies in the virtual environment, you should run `poetry install` - this will install **both** project and development dependencies.
+
+For more details about Poetry and its commands please check out its [online documentation](https://python-poetry.org/docs/).
+
+## Full Docker Development Environment
+
+This project is set up with a number of **Invoke** tasks consumed as simple CLI commands to get developing fast. You'll use a few `invoke` commands to get your environment up and running.
+
+## CLI Helper Commands
+
+The project features a CLI helper based on [invoke](http://www.pyinvoke.org/) to help setup the development environment. The commands are listed below in 3 categories:
+- `dev environment`
+- `utility`
+- `testing`
+
+Each command can be executed with `invoke `. Each command also has its own help `invoke --help`
+
+### Local dev environment
+
+```
+ build Build all docker images.
+ clean Remove the project specific image.
+ docs Build and serve docs locally.
+ rebuild Clean the Docker image and then rebuild without using cache.
+
+```
+
+### Utility
+
+```
+ cli Enter the image to perform troubleshooting or dev work.
+ clean-container Remove stopped containers that source for image `netutils:`
+```
+
+### Testing
+
+```
+ bandit Run bandit to validate basic static code security analysis.
+ black Run black to check that Python files adhere to its style standards.
+ coverage Run the coverage report against pytest.
+ flake8 Run flake8 to check that Python files adhere to its style standards.
+ mypy Run mypy to validate typing-hints.
+ pylint Run pylint code analysis.
+ pydocstyle Run pydocstyle to validate docstring formatting adheres to NTC defined standards.
+ pytest Run pytest for the specified name and Python version.
+ tests Run all tests for the specified name and Python version.
+ yamllint Run yamllint to validate formatting adheres to NTC defined YAML standards.
+```
\ No newline at end of file
diff --git a/docs/dev/extending.md b/docs/dev/extending.md
new file mode 100644
index 00000000..e974b82a
--- /dev/null
+++ b/docs/dev/extending.md
@@ -0,0 +1,4 @@
+# Extending the Library
+
+Extending the library is welcome, however it is best to open an issue first, to ensure that a PR would be accepted and makes sense in terms of features and design.
+
diff --git a/docs/dev/include_parser_list.md b/docs/dev/include_parser_list.md
new file mode 100644
index 00000000..cf94b258
--- /dev/null
+++ b/docs/dev/include_parser_list.md
@@ -0,0 +1,12 @@
+| OS Name | Parser Class |
+| ---------- | ------ |
+| arista_eos | netutils.config.parser.EOSConfigParser |
+| 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_nxos | netutils.config.parser.NXOSConfigParser |
+| fortinet_fortios | netutils.config.parser.FortinetConfigParser |
+| juniper_junos | netutils.config.parser.JunosConfigParser |
+| linux | netutils.config.parser.LINUXConfigParser |
+| nokia_sros | netutils.config.parser.NokiaConfigParser |
\ No newline at end of file
diff --git a/docs/images/.keep b/docs/images/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/images/icon-Netutils.png b/docs/images/icon-Netutils.png
new file mode 100644
index 00000000..7ae2f426
Binary files /dev/null and b/docs/images/icon-Netutils.png differ
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 00000000..f32fd72b
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,6 @@
+---
+hide:
+ - navigation
+---
+
+--8<-- "README.md"
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 9b0a1811..f403e1aa 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,5 +1,8 @@
-m2r2==0.2.7
-mistune==0.8.4
-Sphinx
-toml
-sphinx-rtd-theme
\ No newline at end of file
+mkdocs==1.3.1
+# Material for MkDocs theme
+mkdocs-material==8.3.9
+# Render custom markdown for version added/changed/remove notes
+mkdocs-version-annotations==1.0.0
+# Automatic documentation from sources, for MkDocs
+mkdocstrings==0.19
+mkdocstrings-python==0.7.1
\ No newline at end of file
diff --git a/docs/source/_static/schema-page.css b/docs/source/_static/schema-page.css
deleted file mode 100644
index 78f9f02c..00000000
--- a/docs/source/_static/schema-page.css
+++ /dev/null
@@ -1,62 +0,0 @@
-body {
- font-family: 'Fira Sans', 'Noto Sans', 'Source Sans Pro', 'Segoe UI', Roboto, 'Lucida Sans Unicode', 'Lucida Grande', 'DejaVu Sans', sans-serif;
-}
-@media (min-width: 60em) {
- body {
- display: flex;
- flex-direction: row;
- }
-}
-#jschemer-nav {
- min-width: 15rem;
- padding: 1em;
-}
-.jschemer-schema {
- border: 0.05em solid #CCC;
- border-radius: 0.25em;
- margin: 0.5em;
- max-width: 60em;
- padding: 1em;
-}
-.jschemer-schema code,
-.jschemer-schema pre {
- background-color: rgba(27, 31, 35, 0.05);
- border-radius: 0.1em;
- font-size: 85%;
- line-height: 1.5;
-}
-.jschemer-schema pre {
- padding: 1em 0.5em;
-}
-.jschemer-schema code {
- display: inline;
- font-family: 'Fira Mono', 'Noto Mono', 'Source Code Pro', Consolas, 'Roboto Mono', 'Lucida Console', Monaco, 'DejaVu Sans Mono', monospace;
- font-size: 85%;
- line-height: inherit;
- padding: 0.2em 0.4em;
- word-wrap: normal;
-}
-.jschemer-schema pre > code {
- background-color: transparent;
- padding: 0;
-}
-.jschemer-schema h1 {
- display: inline;
- font-size: 1.5em;
- vertical-align: middle;
-}
-.jschemer-schema h1 code::before {
- content: '"';
-}
-.jschemer-schema h1 code::after {
- content: '"';
-}
-.jschemer-schema h2 {
- font-size: 1em;
-}
-main > .jschemer-schema > details > summary > h1 {
- font-size: 2em;
-}
-main ul {
- list-style: disc;
-}
\ No newline at end of file
diff --git a/docs/source/_static/theme_overrides.css b/docs/source/_static/theme_overrides.css
deleted file mode 100644
index 63ee6cc7..00000000
--- a/docs/source/_static/theme_overrides.css
+++ /dev/null
@@ -1,13 +0,0 @@
-/* override table width restrictions */
-@media screen and (min-width: 767px) {
-
- .wy-table-responsive table td {
- /* !important prevents the common CSS stylesheets from overriding
- this as on RTD they are loaded after this stylesheet */
- white-space: normal !important;
- }
-
- .wy-table-responsive {
- overflow: visible !important;
- }
-}
diff --git a/docs/source/attribution/index.rst b/docs/source/attribution/index.rst
deleted file mode 100644
index 0e535ee1..00000000
--- a/docs/source/attribution/index.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-###########
-Attribution
-###########
-
-.. mdinclude:: ../../../README.md
- :start-line: 108
- :end-line: 145
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
deleted file mode 100644
index 8660f462..00000000
--- a/docs/source/conf.py
+++ /dev/null
@@ -1,95 +0,0 @@
-# Configuration file for the Sphinx documentation builder.
-#
-# This file only contains a selection of the most common options. For a full
-# list see the documentation:
-# https://www.sphinx-doc.org/en/master/usage/configuration.html
-
-# -- Path setup --------------------------------------------------------------
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-# pylint: disable=W,C
-import os
-import sys
-import toml
-from jinja2 import Environment, FileSystemLoader
-
-
-sys.path.insert(0, os.path.abspath("../.."))
-from netutils import lib_mapper # noqa: E402
-
-DIR_PATH = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.abspath("sphinxext"))
-toml_dict = toml.load("../../pyproject.toml")
-
-# -- Project information -----------------------------------------------------
-
-project = toml_dict["tool"]["poetry"]["name"]
-copyright = f"{toml_dict['tool']['poetry']['authors'][0]}, 2021"
-author = ",".join(toml_dict["tool"]["poetry"]["authors"])
-
-# The full version, including alpha/beta/rc tags
-release = toml_dict["tool"]["poetry"]["version"]
-
-
-# -- General configuration ---------------------------------------------------
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = ["sphinx.ext.autodoc", "sphinx.ext.napoleon", "m2r2", "exec"]
-
-autodoc_default_options = {
- "members": True,
- "show-inheritance": True,
- "special-members": "__init__",
- "undoc-members": True,
-}
-
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ["_templates"]
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-html_theme = "sphinx_rtd_theme"
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ["_static"]
-
-
-def build_mapping_tables(app):
- """Build the library mappings tables."""
- env = Environment(loader=FileSystemLoader(f"{DIR_PATH}"))
- template_file = env.get_template("table_template.j2")
-
- LIST_OF_MAP_DICTS = []
- for attr in dir(lib_mapper):
- if (attr.endswith("MAPPER_REVERSE") or attr.endswith("_MAPPER")) and not (
- attr.startswith("_") or attr.startswith("NETMIKO") or attr.startswith("MAIN")
- ):
- LIST_OF_MAP_DICTS.append(attr)
-
- for dict_name in LIST_OF_MAP_DICTS:
- lib_name = dict_name.split("_")[0]
- filename = f"{lib_name}_reverse" if "REVERSE" in dict_name else lib_name
- headers = ["NORMALIZED", lib_name] if "REVERSE" in dict_name else [lib_name, "NORMALIZED"]
- rendered_template = template_file.render(lib_names=headers, mappings=getattr(lib_mapper, dict_name))
- with open(f"{DIR_PATH}/netutils/lib_mapping/{filename}_table.rst", "w") as table_file:
- table_file.write(rendered_template)
-
-
-def setup(app):
- """Call methods during builder initiated."""
- app.connect("builder-inited", build_mapping_tables)
diff --git a/docs/source/contributing/index.rst b/docs/source/contributing/index.rst
deleted file mode 100644
index 3aec60de..00000000
--- a/docs/source/contributing/index.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-############
-Contributing
-############
-
-.. mdinclude:: ../../../README.md
- :start-line: 148
- :end-line: 234
-
diff --git a/docs/source/examples/index.rst b/docs/source/examples/index.rst
deleted file mode 100644
index dd83b1a8..00000000
--- a/docs/source/examples/index.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-########
-Examples
-########
-
-.. mdinclude:: ../../../README.md
- :start-line: 53
- :end-line: 105
\ No newline at end of file
diff --git a/docs/source/index.rst b/docs/source/index.rst
deleted file mode 100644
index aee8b299..00000000
--- a/docs/source/index.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. netutils documentation master file, created by
- sphinx-quickstart on Wed May 5 01:15:43 2021.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
-Welcome to netutils's documentation!
-====================================
-
-.. toctree::
- :maxdepth: 2
- :caption: Contents:
-
- overview/index
- installation/index
- examples/index
- netutils/index
- attribution/index
- contributing/index
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
diff --git a/docs/source/installation/index.rst b/docs/source/installation/index.rst
deleted file mode 100644
index 9e1bb66a..00000000
--- a/docs/source/installation/index.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-############
-Installation
-############
-
-.. mdinclude:: ../../../README.md
- :start-line: 39
- :end-line: 50
\ No newline at end of file
diff --git a/docs/source/netutils/asn/index.rst b/docs/source/netutils/asn/index.rst
deleted file mode 100644
index cadaaac0..00000000
--- a/docs/source/netutils/asn/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-*********
-BGP ASNs
-*********
-
-.. automodule:: netutils.asn
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/bandwidth/index.rst b/docs/source/netutils/bandwidth/index.rst
deleted file mode 100644
index ae5b96d1..00000000
--- a/docs/source/netutils/bandwidth/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-*********
-Bandwidth
-*********
-
-.. automodule:: netutils.bandwidth
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/banner/index.rst b/docs/source/netutils/banner/index.rst
deleted file mode 100644
index 06a746b5..00000000
--- a/docs/source/netutils/banner/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-*******
-Banner
-*******
-
-.. automodule:: netutils.banner
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/configs/index.rst b/docs/source/netutils/configs/index.rst
deleted file mode 100644
index 3c49cc5b..00000000
--- a/docs/source/netutils/configs/index.rst
+++ /dev/null
@@ -1,49 +0,0 @@
-*******
-Configs
-*******
-
-.. automodule:: netutils.config.clean
- :members:
-
-.. automodule:: netutils.config.compliance
- :members:
-
-.. automodule:: netutils.config.parser
- :members:
-
-Edge Cases
-==============
-
-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".
-
-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::
-
- snmp-server community <> RO SNMP_ACL_RO
- snmp-server community <> RO SNMP_ACL_RO
-
-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.
diff --git a/docs/source/netutils/dns/index.rst b/docs/source/netutils/dns/index.rst
deleted file mode 100644
index 5032e8cc..00000000
--- a/docs/source/netutils/dns/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-****
-DNS
-****
-
-.. automodule:: netutils.dns
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/index.rst b/docs/source/netutils/index.rst
deleted file mode 100644
index 3f24639f..00000000
--- a/docs/source/netutils/index.rst
+++ /dev/null
@@ -1,23 +0,0 @@
-******************
-Netutils Functions
-******************
-
-.. toctree::
- :maxdepth: 2
-
- asn/index
- bandwidth/index
- banner/index
- configs/index
- dns/index
- interface/index
- ip/index
- lib_mapping/index
- mac/index
- password/index
- ping/index
- protocol_mapper/index
- route/index
- time/index
- utilities/index
- vlan/index
diff --git a/docs/source/netutils/interface/index.rst b/docs/source/netutils/interface/index.rst
deleted file mode 100644
index 77dfdf97..00000000
--- a/docs/source/netutils/interface/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-***********
-Interfaces
-***********
-
-.. automodule:: netutils.interface
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/ip/index.rst b/docs/source/netutils/ip/index.rst
deleted file mode 100644
index 7af1d2ab..00000000
--- a/docs/source/netutils/ip/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-**************
-IP addresses
-**************
-
-.. automodule:: netutils.ip
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/ANSIBLE_reverse_table.rst b/docs/source/netutils/lib_mapping/ANSIBLE_reverse_table.rst
deleted file mode 100755
index 01b2482c..00000000
--- a/docs/source/netutils/lib_mapping/ANSIBLE_reverse_table.rst
+++ /dev/null
@@ -1,78 +0,0 @@
-.. raw:: html
-
-
-
NORMALIZED
ANSIBLE
-
-
-
arista_eos
arista.eos.eos
-
-
-
ciena_saos
ciena.saos6.saos6
-
-
-
cisco_asa
cisco.asa.asa
-
-
-
cisco_ios
cisco.ios.ios
-
-
-
cisco_xr
cisco.iosxr.iosxr
-
-
-
cisco_nxos
cisco.nxos.nxos
-
-
-
huawei
community.network.ce
-
-
-
dell_os6
dellemc.os6.os6
-
-
-
dell_os9
dellemc.os9.os9
-
-
-
dell_os10
dellemc.os10.0s10
-
-
-
ericsson_ipos
community.network.eric_eccli
-
-
-
extreme_exos
community.network.exos
-
-
-
extreme_netiron
community.network.ironware
-
-
-
extreme_nos
community.network.nos
-
-
-
extreme_slx
community.network.slxos
-
-
-
extreme_vsp
community.network.voss
-
-
-
juniper_junos
junipernetworks.junos.junos
-
-
-
lenovo_cnos
community.network.cnos
-
-
-
lenovo_enos
community.network.enos
-
-
-
mikrotik_routeros
community.network.routeros
-
-
-
nokia_sros
community.network.sros
-
-
-
pluribus
community.network.netvisor
-
-
-
ruckus_icx
community.network.icx
-
-
-
vyos
vyos.vyos.vyos
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/ANSIBLE_table.rst b/docs/source/netutils/lib_mapping/ANSIBLE_table.rst
deleted file mode 100755
index d5fb3069..00000000
--- a/docs/source/netutils/lib_mapping/ANSIBLE_table.rst
+++ /dev/null
@@ -1,78 +0,0 @@
-.. raw:: html
-
-
-
ANSIBLE
NORMALIZED
-
-
-
arista.eos.eos
arista_eos
-
-
-
ciena.saos6.saos6
ciena_saos
-
-
-
cisco.asa.asa
cisco_asa
-
-
-
cisco.ios.ios
cisco_ios
-
-
-
cisco.iosxr.iosxr
cisco_xr
-
-
-
cisco.nxos.nxos
cisco_nxos
-
-
-
community.network.ce
huawei
-
-
-
dellemc.os6.os6
dell_os6
-
-
-
dellemc.os9.os9
dell_os9
-
-
-
dellemc.os10.0s10
dell_os10
-
-
-
community.network.eric_eccli
ericsson_ipos
-
-
-
community.network.exos
extreme_exos
-
-
-
community.network.ironware
extreme_netiron
-
-
-
community.network.nos
extreme_nos
-
-
-
community.network.slxos
extreme_slx
-
-
-
community.network.voss
extreme_vsp
-
-
-
junipernetworks.junos.junos
juniper_junos
-
-
-
community.network.cnos
lenovo_cnos
-
-
-
community.network.enos
lenovo_enos
-
-
-
community.network.routeros
mikrotik_routeros
-
-
-
community.network.netvisor
pluribus
-
-
-
community.network.icx
ruckus_icx
-
-
-
community.network.sros
nokia_sros
-
-
-
vyos.vyos.vyos
vyos
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/NAPALM_reverse_table.rst b/docs/source/netutils/lib_mapping/NAPALM_reverse_table.rst
deleted file mode 100755
index b5513e2c..00000000
--- a/docs/source/netutils/lib_mapping/NAPALM_reverse_table.rst
+++ /dev/null
@@ -1,42 +0,0 @@
-.. raw:: html
-
-
-
NORMALIZED
NAPALM
-
-
-
arista_eos
eos
-
-
-
brocade_vyos
vyos
-
-
-
cisco_asa
asa
-
-
-
cisco_ios
ios
-
-
-
cisco_nxos
nxos
-
-
-
cisco_xr
iosxr
-
-
-
cisco_wlc
cisco_wlc_ssh
-
-
-
fortinet
fortios
-
-
-
huawei_vrp
huawei
-
-
-
juniper_junos
junos
-
-
-
paloalto_panos
panos
-
-
-
nokia_sros
sros
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/NAPALM_table.rst b/docs/source/netutils/lib_mapping/NAPALM_table.rst
deleted file mode 100755
index a693ce4d..00000000
--- a/docs/source/netutils/lib_mapping/NAPALM_table.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-.. raw:: html
-
-
-
NAPALM
NORMALIZED
-
-
-
asa
cisco_asa
-
-
-
cisco_wlc_ssh
cisco_wlc
-
-
-
eos
arista_eos
-
-
-
fortios
fortinet
-
-
-
huawei
huawei_vrp
-
-
-
ios
cisco_ios
-
-
-
nxos_ssh
cisco_nxos
-
-
-
nxos
cisco_nxos
-
-
-
iosxr
cisco_xr
-
-
-
junos
juniper_junos
-
-
-
panos
paloalto_panos
-
-
-
sros
nokia_sros
-
-
-
vyos
brocade_vyos
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/NTCTEMPLATES_reverse_table.rst b/docs/source/netutils/lib_mapping/NTCTEMPLATES_reverse_table.rst
deleted file mode 100755
index 7da16de3..00000000
--- a/docs/source/netutils/lib_mapping/NTCTEMPLATES_reverse_table.rst
+++ /dev/null
@@ -1,339 +0,0 @@
-.. raw:: html
-
-
-
NORMALIZED
NTCTEMPLATES
-
-
-
a10
a10
-
-
-
accedian
accedian
-
-
-
adtran_os
adtran_os
-
-
-
alcatel_aos
alcatel_aos
-
-
-
alcatel_sros
alcatel_sros
-
-
-
apresia_aeos
apresia_aeos
-
-
-
arista_eos
arista_eos
-
-
-
aruba_os
aruba_os
-
-
-
aruba_osswitch
aruba_osswitch
-
-
-
aruba_procurve
aruba_procurve
-
-
-
avaya_ers
avaya_ers
-
-
-
avaya_vsp
avaya_vsp
-
-
-
allied_telesis_awplus
allied_telesis_awplus
-
-
-
broadcom_icos
broadcom_icos
-
-
-
brocade_fos
brocade_fos
-
-
-
brocade_fastiron
brocade_fastiron
-
-
-
brocade_netiron
brocade_netiron
-
-
-
brocade_nos
brocade_nos
-
-
-
brocade_vdx
brocade_vdx
-
-
-
brocade_vyos
brocade_vyos
-
-
-
checkpoint_gaia
checkpoint_gaia
-
-
-
calix_b6
calix_b6
-
-
-
centec_os
centec_os
-
-
-
ciena_saos
ciena_saos
-
-
-
cisco_asa
cisco_asa
-
-
-
cisco_ftd
cisco_ftd
-
-
-
cisco_ios
cisco_ios
-
-
-
cisco_nxos
cisco_nxos
-
-
-
cisco_s300
cisco_s300
-
-
-
cisco_tp
cisco_tp
-
-
-
cisco_wlc
cisco_wlc
-
-
-
cisco_xe
cisco_xe
-
-
-
cisco_xr
cisco_xr
-
-
-
cloudgenix_ion
cloudgenix_ion
-
-
-
coriant
coriant
-
-
-
dell_dnos9
dell_dnos9
-
-
-
dell_force10
dell_force10
-
-
-
dell_os6
dell_os6
-
-
-
dell_os9
dell_os9
-
-
-
dell_os10
dell_os10
-
-
-
dell_powerconnect
dell_powerconnect
-
-
-
dell_isilon
dell_isilon
-
-
-
dlink_ds
dlink_ds
-
-
-
endace
endace
-
-
-
eltex
eltex
-
-
-
eltex_esr
eltex_esr
-
-
-
enterasys
enterasys
-
-
-
ericsson_ipos
ericsson_ipos
-
-
-
extreme
extreme
-
-
-
extreme_ers
extreme_ers
-
-
-
extreme_exos
extreme_exos
-
-
-
extreme_netiron
extreme_netiron
-
-
-
extreme_nos
extreme_nos
-
-
-
extreme_slx
extreme_slx
-
-
-
extreme_vdx
extreme_vdx
-
-
-
extreme_vsp
extreme_vsp
-
-
-
extreme_wing
extreme_wing
-
-
-
f5_ltm
f5_ltm
-
-
-
f5_tmsh
f5_tmsh
-
-
-
f5_linux
f5_linux
-
-
-
flexvnf
flexvnf
-
-
-
fortinet
fortinet
-
-
-
generic
generic
-
-
-
generic_termserver
generic_termserver
-
-
-
hp_comware
hp_comware
-
-
-
hp_procurve
hp_procurve
-
-
-
huawei
huawei
-
-
-
huawei_smartax
huawei_smartax
-
-
-
huawei_olt
huawei_olt
-
-
-
huawei_vrpv8
huawei_vrpv8
-
-
-
ipinfusion_ocnos
ipinfusion_ocnos
-
-
-
juniper
juniper
-
-
-
juniper_junos
juniper_junos
-
-
-
juniper_screenos
juniper_screenos
-
-
-
keymile
keymile
-
-
-
keymile_nos
keymile_nos
-
-
-
linux
linux
-
-
-
mikrotik_routeros
mikrotik_routeros
-
-
-
mikrotik_switchos
mikrotik_switchos
-
-
-
mellanox
mellanox
-
-
-
mellanox_mlnxos
mellanox_mlnxos
-
-
-
mrv_lx
mrv_lx
-
-
-
mrv_optiswitch
mrv_optiswitch
-
-
-
netapp_cdot
netapp_cdot
-
-
-
netgear_prosafe
netgear_prosafe
-
-
-
netscaler
netscaler
-
-
-
nokia_sros
nokia_sros
-
-
-
oneaccess_oneos
oneaccess_oneos
-
-
-
ovs_linux
ovs_linux
-
-
-
paloalto_panos
paloalto_panos
-
-
-
pluribus
pluribus
-
-
-
quanta_mesh
quanta_mesh
-
-
-
rad_etx
rad_etx
-
-
-
raisecom_roap
raisecom_roap
-
-
-
ruckus_fastiron
ruckus_fastiron
-
-
-
ruijie_os
ruijie_os
-
-
-
sixwind_os
sixwind_os
-
-
-
sophos_sfos
sophos_sfos
-
-
-
tplink_jetstream
tplink_jetstream
-
-
-
ubiquiti_edge
ubiquiti_edge
-
-
-
ubiquiti_edgerouter
ubiquiti_edgerouter
-
-
-
ubiquiti_edgeswitch
ubiquiti_edgeswitch
-
-
-
ubiquiti_unifiswitch
ubiquiti_unifiswitch
-
-
-
vyatta_vyos
vyatta_vyos
-
-
-
vyos
vyos
-
-
-
watchguard_fireware
watchguard_fireware
-
-
-
zte_zxros
zte_zxros
-
-
-
yamaha
yamaha
-
-
-
watchguard_firebox
watchguard_firebox
-
-
-
huawei_vrp
huawei_vrp
-
-
-
vmware_nsxv
vmware_nsxv
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/NTCTEMPLATES_table.rst b/docs/source/netutils/lib_mapping/NTCTEMPLATES_table.rst
deleted file mode 100755
index 35ab51ff..00000000
--- a/docs/source/netutils/lib_mapping/NTCTEMPLATES_table.rst
+++ /dev/null
@@ -1,339 +0,0 @@
-.. raw:: html
-
-
-
NTCTEMPLATES
NORMALIZED
-
-
-
a10
a10
-
-
-
accedian
accedian
-
-
-
adtran_os
adtran_os
-
-
-
alcatel_aos
alcatel_aos
-
-
-
alcatel_sros
alcatel_sros
-
-
-
apresia_aeos
apresia_aeos
-
-
-
arista_eos
arista_eos
-
-
-
aruba_os
aruba_os
-
-
-
aruba_osswitch
aruba_osswitch
-
-
-
aruba_procurve
aruba_procurve
-
-
-
avaya_ers
avaya_ers
-
-
-
avaya_vsp
avaya_vsp
-
-
-
allied_telesis_awplus
allied_telesis_awplus
-
-
-
broadcom_icos
broadcom_icos
-
-
-
brocade_fos
brocade_fos
-
-
-
brocade_fastiron
brocade_fastiron
-
-
-
brocade_netiron
brocade_netiron
-
-
-
brocade_nos
brocade_nos
-
-
-
brocade_vdx
brocade_vdx
-
-
-
brocade_vyos
brocade_vyos
-
-
-
checkpoint_gaia
checkpoint_gaia
-
-
-
calix_b6
calix_b6
-
-
-
centec_os
centec_os
-
-
-
ciena_saos
ciena_saos
-
-
-
cisco_asa
cisco_asa
-
-
-
cisco_ftd
cisco_ftd
-
-
-
cisco_ios
cisco_ios
-
-
-
cisco_nxos
cisco_nxos
-
-
-
cisco_s300
cisco_s300
-
-
-
cisco_tp
cisco_tp
-
-
-
cisco_wlc
cisco_wlc
-
-
-
cisco_xe
cisco_xe
-
-
-
cisco_xr
cisco_xr
-
-
-
cloudgenix_ion
cloudgenix_ion
-
-
-
coriant
coriant
-
-
-
dell_dnos9
dell_dnos9
-
-
-
dell_force10
dell_force10
-
-
-
dell_os6
dell_os6
-
-
-
dell_os9
dell_os9
-
-
-
dell_os10
dell_os10
-
-
-
dell_powerconnect
dell_powerconnect
-
-
-
dell_isilon
dell_isilon
-
-
-
dlink_ds
dlink_ds
-
-
-
endace
endace
-
-
-
eltex
eltex
-
-
-
eltex_esr
eltex_esr
-
-
-
enterasys
enterasys
-
-
-
ericsson_ipos
ericsson_ipos
-
-
-
extreme
extreme
-
-
-
extreme_ers
extreme_ers
-
-
-
extreme_exos
extreme_exos
-
-
-
extreme_netiron
extreme_netiron
-
-
-
extreme_nos
extreme_nos
-
-
-
extreme_slx
extreme_slx
-
-
-
extreme_vdx
extreme_vdx
-
-
-
extreme_vsp
extreme_vsp
-
-
-
extreme_wing
extreme_wing
-
-
-
f5_ltm
f5_ltm
-
-
-
f5_tmsh
f5_tmsh
-
-
-
f5_linux
f5_linux
-
-
-
flexvnf
flexvnf
-
-
-
fortinet
fortinet
-
-
-
generic
generic
-
-
-
generic_termserver
generic_termserver
-
-
-
hp_comware
hp_comware
-
-
-
hp_procurve
hp_procurve
-
-
-
huawei
huawei
-
-
-
huawei_smartax
huawei_smartax
-
-
-
huawei_olt
huawei_olt
-
-
-
huawei_vrpv8
huawei_vrpv8
-
-
-
ipinfusion_ocnos
ipinfusion_ocnos
-
-
-
juniper
juniper
-
-
-
juniper_junos
juniper_junos
-
-
-
juniper_screenos
juniper_screenos
-
-
-
keymile
keymile
-
-
-
keymile_nos
keymile_nos
-
-
-
linux
linux
-
-
-
mikrotik_routeros
mikrotik_routeros
-
-
-
mikrotik_switchos
mikrotik_switchos
-
-
-
mellanox
mellanox
-
-
-
mellanox_mlnxos
mellanox_mlnxos
-
-
-
mrv_lx
mrv_lx
-
-
-
mrv_optiswitch
mrv_optiswitch
-
-
-
netapp_cdot
netapp_cdot
-
-
-
netgear_prosafe
netgear_prosafe
-
-
-
netscaler
netscaler
-
-
-
nokia_sros
nokia_sros
-
-
-
oneaccess_oneos
oneaccess_oneos
-
-
-
ovs_linux
ovs_linux
-
-
-
paloalto_panos
paloalto_panos
-
-
-
pluribus
pluribus
-
-
-
quanta_mesh
quanta_mesh
-
-
-
rad_etx
rad_etx
-
-
-
raisecom_roap
raisecom_roap
-
-
-
ruckus_fastiron
ruckus_fastiron
-
-
-
ruijie_os
ruijie_os
-
-
-
sixwind_os
sixwind_os
-
-
-
sophos_sfos
sophos_sfos
-
-
-
tplink_jetstream
tplink_jetstream
-
-
-
ubiquiti_edge
ubiquiti_edge
-
-
-
ubiquiti_edgerouter
ubiquiti_edgerouter
-
-
-
ubiquiti_edgeswitch
ubiquiti_edgeswitch
-
-
-
ubiquiti_unifiswitch
ubiquiti_unifiswitch
-
-
-
vyatta_vyos
vyatta_vyos
-
-
-
vyos
vyos
-
-
-
watchguard_fireware
watchguard_fireware
-
-
-
zte_zxros
zte_zxros
-
-
-
yamaha
yamaha
-
-
-
watchguard_firebox
watchguard_firebox
-
-
-
huawei_vrp
huawei_vrp
-
-
-
vmware_nsxv
vmware_nsxv
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/PYATS_reverse_table.rst b/docs/source/netutils/lib_mapping/PYATS_reverse_table.rst
deleted file mode 100755
index 405e1a43..00000000
--- a/docs/source/netutils/lib_mapping/PYATS_reverse_table.rst
+++ /dev/null
@@ -1,36 +0,0 @@
-.. raw:: html
-
-
-
NORMALIZED
PYATS
-
-
-
cisco_asa
asa
-
-
-
f5_tmsh
bigip
-
-
-
cisco_dnac
dnac
-
-
-
cisco_ios
iosxe
-
-
-
cisco_xr
iosxr
-
-
-
juniper_junos
junos
-
-
-
linux
linux
-
-
-
cisco_nxos
nxos
-
-
-
nokia_sros
sros
-
-
-
cisco_viptella
viptela
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/PYATS_table.rst b/docs/source/netutils/lib_mapping/PYATS_table.rst
deleted file mode 100755
index 1ffc20c7..00000000
--- a/docs/source/netutils/lib_mapping/PYATS_table.rst
+++ /dev/null
@@ -1,39 +0,0 @@
-.. raw:: html
-
-
-
PYATS
NORMALIZED
-
-
-
asa
cisco_asa
-
-
-
bigip
f5_tmsh
-
-
-
dnac
cisco_dnac
-
-
-
ios
cisco_ios
-
-
-
iosxe
cisco_ios
-
-
-
iosxr
cisco_xr
-
-
-
junos
juniper_junos
-
-
-
linux
linux
-
-
-
nxos
cisco_nxos
-
-
-
sros
nokia_sros
-
-
-
viptela
cisco_viptella
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/PYNTC_reverse_table.rst b/docs/source/netutils/lib_mapping/PYNTC_reverse_table.rst
deleted file mode 100755
index c6ce781d..00000000
--- a/docs/source/netutils/lib_mapping/PYNTC_reverse_table.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-.. raw:: html
-
-
-
NORMALIZED
PYNTC
-
-
-
cisco_asa
cisco_asa_ssh
-
-
-
arista_eos
arista_eos_eapi
-
-
-
f5_tmsh
f5_tmos_icontrol
-
-
-
cisco_ios
cisco_ios_ssh
-
-
-
juniper_junos
juniper_junos_netconf
-
-
-
cisco_nxos
cisco_nxos_nxapi
-
-
-
cisco_wlc
cisco_aireos_ssh
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/PYNTC_table.rst b/docs/source/netutils/lib_mapping/PYNTC_table.rst
deleted file mode 100755
index 53470f21..00000000
--- a/docs/source/netutils/lib_mapping/PYNTC_table.rst
+++ /dev/null
@@ -1,27 +0,0 @@
-.. raw:: html
-
-
-
PYNTC
NORMALIZED
-
-
-
cisco_asa_ssh
cisco_asa
-
-
-
arista_eos_eapi
arista_eos
-
-
-
f5_tmos_icontrol
f5_tmsh
-
-
-
cisco_ios_ssh
cisco_ios
-
-
-
juniper_junos_netconf
juniper_junos
-
-
-
cisco_nxos_nxapi
cisco_nxos
-
-
-
cisco_aireos_ssh
cisco_wlc
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/SCRAPLI_reverse_table.rst b/docs/source/netutils/lib_mapping/SCRAPLI_reverse_table.rst
deleted file mode 100755
index cdd7f74f..00000000
--- a/docs/source/netutils/lib_mapping/SCRAPLI_reverse_table.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-.. raw:: html
-
-
-
NORMALIZED
SCRAPLI
-
-
-
cisco_ios
cisco_iosxe
-
-
-
cisco_xr
cisco_iosxr
-
-
-
cisco_nxos
cisco_nxos
-
-
-
arista_eos
arista_eos
-
-
-
juniper_junos
juniper_junos
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/SCRAPLI_table.rst b/docs/source/netutils/lib_mapping/SCRAPLI_table.rst
deleted file mode 100755
index f420334b..00000000
--- a/docs/source/netutils/lib_mapping/SCRAPLI_table.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-.. raw:: html
-
-
-
SCRAPLI
NORMALIZED
-
-
-
cisco_iosxe
cisco_ios
-
-
-
cisco_iosxr
cisco_xr
-
-
-
cisco_nxos
cisco_nxos
-
-
-
arista_eos
arista_eos
-
-
-
juniper_junos
juniper_junos
-
-
\ No newline at end of file
diff --git a/docs/source/netutils/lib_mapping/index.rst b/docs/source/netutils/lib_mapping/index.rst
deleted file mode 100644
index 52af9f92..00000000
--- a/docs/source/netutils/lib_mapping/index.rst
+++ /dev/null
@@ -1,91 +0,0 @@
-*****************
-Library Mappings
-*****************
-
-These dictionaries provide mappings in expected vendor names between Netmiko, NAPALM, pyntc, ntc-templates, pyats, and scrapli. For each non-reversed mapper, the keys of the dictionary represent the driver used for that library while the values represent the "normalized" driver based on netmiko.
-
-These dictionaries allow you to keep your Source of Truth platform data consistent and still easily switch between automation libraries. For example, you may be storing your device platform data in Nautobot. In a Nautobot platform, you can store the NAPALM driver needed for that platform. What if you wanted to write
-a python script to leverage the backup capabilities of pyntc? Here's an example of how you could use the following dictionaries to perform mappings from your stored Nautobot NAPALM driver to the pyntc driver needed for your script.
-
-.. code-block:: python
-
- import pynautobot
- from netutils.lib_mapper import NAPALM_LIB_MAPPER, PYNTC_LIB_MAPPER_REVERSE
- from pyntc import ntc_device as NTC
-
-
- # Get device from Nautobot
- nautobot = pynautobot.api(url="http://mynautobotinstance.com",token="mytoken")
-
- # Get Napalm driver and save for later use.
- device = nautobot.dcim.devices.get(name="mydevice")
- sot_driver = device.platform.napalm_driver
-
-
- # Connect to device via Napalm
- driver = napalm.get_network_driver("ios")
-
- device = driver(
- hostname="device.name",
- username="demo",
- password="secret"
- )
-
- # Do Napalm tasks
-
- pyntc_driver = PYNTC_LIB_MAPPER_REVERSE.get(NAPALM_LIB_MAPPER.get(sot_driver))
- net_con = NTC(host=device.name, username="demo", password="secret", device_type=pyntc_driver)
-
- # Do pyntc tasks
-
-Another use case could be using an example like the above in an Ansible filter. That would allow you to write a filter utilizing whichever automation library you needed without having to store the driver for each one in your Source of Truth.
-
-Napalm Mapper
-==============================
-.. include:: NAPALM_table.rst
-
-Reverse Napalm Mapper
-==============================
-.. include:: NAPALM_reverse_table.rst
-
-PyNTC Mapper
-==============================
-.. include:: PYNTC_table.rst
-
-Reverse PyNTC Mapper
-==============================
-.. include:: PYNTC_reverse_table.rst
-
-Ansible Mapper
-==============================
-.. include:: ANSIBLE_table.rst
-
-Reverse Ansible Mapper
-==============================
-.. include:: ANSIBLE_reverse_table.rst
-
-PyATS Mapper
-==============================
-.. include:: PYATS_table.rst
-
-Reverse PyATS Mapper
-==============================
-.. include:: PYATS_reverse_table.rst
-
-Scrapli Mapper
-==============================
-.. include:: SCRAPLI_table.rst
-
-Reverse Scrapli Mapper
-==============================
-.. include:: SCRAPLI_reverse_table.rst
-
-NTC Templates Mapper
-==============================
-.. include:: NTCTEMPLATES_table.rst
-
-Reverse NTC Templates Mapper
-==============================
-.. include:: NTCTEMPLATES_reverse_table.rst
-
-
diff --git a/docs/source/netutils/mac/index.rst b/docs/source/netutils/mac/index.rst
deleted file mode 100644
index b946598c..00000000
--- a/docs/source/netutils/mac/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-**************
-MAC addresses
-**************
-
-.. automodule:: netutils.mac
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/password/index.rst b/docs/source/netutils/password/index.rst
deleted file mode 100644
index 76b64e05..00000000
--- a/docs/source/netutils/password/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-***********
-Passwords
-***********
-
-.. automodule:: netutils.password
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/ping/index.rst b/docs/source/netutils/ping/index.rst
deleted file mode 100644
index 959ae66e..00000000
--- a/docs/source/netutils/ping/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-******
-Ping
-******
-
-.. automodule:: netutils.ping
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/protocol_mapper/index.rst b/docs/source/netutils/protocol_mapper/index.rst
deleted file mode 100644
index 5ddc9223..00000000
--- a/docs/source/netutils/protocol_mapper/index.rst
+++ /dev/null
@@ -1,68 +0,0 @@
-*****************
-Protocol Mappers
-*****************
-
-These protocol mappers can be used when you have either the application protocol name or number but need the corresponding value. Something to note is that these mappings are divided up per IP protocol.
-The reasoning behind this is that the same port number could be tied to two different application protocols depending on the underlying IP protocol. For example, when using UDP, port 13400 is the application protocol `doip-disc`. Looking at the same port using TCP the application protocol is `doip-data`.
-
-
-Here are currently available mappers:
-
- * **DCCP_NAME_TO_NUM** - Allows mapping from a known DCCP application protocol name to DCCP application protocol number.
-
- * **DCCP_NUM_TO_NAME** - Allows mapping from a known DCCP application protocol name to DCCP application protocol number.
-
- * **PROTO_NAME_TO_NUM** - Allows mapping from a known IP protocol name to IP protocol number.
-
- * **PROTO_NUM_TO_NAME** - Allows mapping from a known IP protocol number to IP protocol name.
-
- * **SCTP_NAME_TO_NUM** - Allows mapping from a known SCTP application protocol name to SCTP application protocol number.
-
- * **SCTP_NUM_TO_NAME** - Allows mapping from a known SCTP application protocol number to SCTP application protocol name.
-
- * **TCP_NAME_TO_NUM** - Allows mapping from a known TCP application protocol name to TCP application protocol number.
-
- * **TCP_NUM_TO_NAME** - Allows mapping from a known TCP application protocol number to TCP application protocol name.
-
- * **UDP_NAME_TO_NUM** - Allows mapping from a known UDP application protocol name to UDP application protocol number.
-
- * **UDP_NUM_TO_NAME** - Allows mapping from a known UDP application protocol number to UDP application protocol name.
-
-
-Here are a few examples showing how you would use these in your python code.
-
-.. code-block:: python
-
- from netutils.protocol_mapper import (
-
- PROTO_NAME_TO_NUM,
- PROTO_NUM_TO_NAME,
- TCP_NAME_TO_NUM,
- TCP_NUM_TO_NAME,
- UDP_NAME_TO_NUM,
- UDP_NUM_TO_NAME,
- SCTP_NAME_TO_NUM,
- SCTP_NUM_TO_NAME,
- DCCP_NAME_TO_NUM,
- DCCP_NUM_TO_NAME,
- )
-
- # Get DCCP protocol port from known DCCP application name
- LTP_DEEPSPACE_PORT = DCCP_NAME_TO_NUM("ltp-deepspace")
- print(LTP_DEEPSPACE_PORT)
- # 1113
-
- # Get TCP protocol port from known TCP application name
- SSH_PORT = TCP_NAME_TO_NUM["ssh"]
- print(SSH_PORT)
- # 22
-
- # Get SCTP protocol name from known SCTP application port.
- SCTP_PORT_1021_APPLICATION_NAME = SCTP_NUM_TO_NAME[1021]
- print(SCTP_PORT_1021_APPLICATION_NAME)
- # "exp1"
-
- # Get UDP protocol name from known UDP application port
- UDP_PORT_20_APPLICATION_NAME = UDP_NUM_TO_NAME[20]
- print(UDP_PORT_20_APPLICATION_NAME)
- # "ftp-data
\ No newline at end of file
diff --git a/docs/source/netutils/route/index.rst b/docs/source/netutils/route/index.rst
deleted file mode 100644
index 555c421b..00000000
--- a/docs/source/netutils/route/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-*********
-Routing
-*********
-
-.. automodule:: netutils.route
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/time/index.rst b/docs/source/netutils/time/index.rst
deleted file mode 100644
index ba12a978..00000000
--- a/docs/source/netutils/time/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-*******
-Time
-*******
-
-.. automodule:: netutils.time
- :members:
\ No newline at end of file
diff --git a/docs/source/netutils/utilities/index.rst b/docs/source/netutils/utilities/index.rst
deleted file mode 100644
index 57c6c598..00000000
--- a/docs/source/netutils/utilities/index.rst
+++ /dev/null
@@ -1,116 +0,0 @@
-*******************
-Netutils Utilities
-*******************
-
-Netutils to Jinja2 Filters
-============================
-
-In an effort to simplify the process of adding netutils' functions to jinja2 as filters we have created a convenience function. Let's go through how you could add the filters to your jinja2 environment.
-Here is the current folder structure.
-
-.. code-block:: python
-
- .
- ├── jinja2_environment.py
- └── templates
- └── test.j2
-
-Below is the code in the `test.j2` file.
-
-.. code-block:: jinja
-
- IP Address + 200 = {{ "192.168.0.1/10" | ip_addition(200) }}
-
-Below is a code in the `jinja2_environment.py` folder.
-
-.. code-block:: python
-
- from jinja2.loaders import FileSystemLoader, PackageLoader
- from jinja2 import Environment, PackageLoader, select_autoescape
- from netutils.utils import jinja2_convenience_function
-
- env = Environment(
- loader=FileSystemLoader("templates"),
- autoescape=select_autoescape()
- )
-
- env.filters.update(jinja2_convenience_function())
-
- template = env.get_template("test.j2")
- result = template.render()
- print(result)
-
-When you run `jinja2_environment.py` the output will be:
-
-.. code-block:: python
-
- IP Address + 200 = 192.168.0.201
-
-
-Netutils to Jinja2 Filters List
-======================================
-
-The below list shows what jinja2 filters are added when you add them using the process above. The keys of the dictionary are the names you would use to call the jinja2 filter.
-
-.. note::
- The jinja2 filter names match the python function names.
-
-.. exec::
- import json
- from netutils.utils import jinja2_convenience_function
- data = list(jinja2_convenience_function().keys())
- json_obj = json.dumps(data, sort_keys=True, indent=4)
- json_obj = json_obj[:-1] + " ]"
- print(f".. code-block:: JavaScript\n\n {json_obj}\n\n")
-
-
-ipaddress Convenience Functions
----------------------------------
-
-When adding the netutils functions to your jinja2 environment, you also gain access to the built-in ipaddress python library using these three jinja2 filters.
-
-.. code-block:: python
-
- "ipaddress_address": "ip.ipaddress_address",
- "ipaddress_interface": "ip.ipaddress_interface",
- "ipaddress_network": "ip.ipaddress_network",
-
-When using these filters, you must specify an attribute of that given class. Here is an example of how you would use the `version` if the `ipaddress_interface` filter.
-
-.. code-block:: python
-
- .
- ├── jinja2_environment.py
- └── templates
- └── test.j2
-
-Below is the code in the `test.j2` file.
-
-.. code-block:: jinja
-
- The version of 192.168.0.1/24 is IPv{{ "192.168.0.1/24" | ipaddress_interface("version") }}.
-
-Below is a code in the `jinja2_environment.py` folder.
-
-.. code-block:: python
-
- from jinja2.loaders import FileSystemLoader, PackageLoader
- from jinja2 import Environment, PackageLoader, select_autoescape
- from netutils.utils import jinja2_convenience_function
-
- env = Environment(
- loader=FileSystemLoader("templates"),
- autoescape=select_autoescape()
- )
-
- env.filters.update(jinja2_convenience_function())
-
- template = env.get_template("test.j2")
- result = template.render()
- print(result)
-
-When you run `jinja2_environment.py` the output will be:
-
-.. code-block:: python
-
- The version of 192.168.0.1/24 is IPv4.
\ No newline at end of file
diff --git a/docs/source/netutils/vlan/index.rst b/docs/source/netutils/vlan/index.rst
deleted file mode 100644
index 59397828..00000000
--- a/docs/source/netutils/vlan/index.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-*******
-VLANS
-*******
-
-.. automodule:: netutils.vlan
- :members:
\ No newline at end of file
diff --git a/docs/source/overview/index.rst b/docs/source/overview/index.rst
deleted file mode 100644
index 267fe23e..00000000
--- a/docs/source/overview/index.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-*********
-Overview
-*********
-
-.. mdinclude:: ../../../README.md
- :start-line: 0
- :end-line: 36
\ No newline at end of file
diff --git a/docs/source/sphinxext/exec.py b/docs/source/sphinxext/exec.py
deleted file mode 100644
index 6cdf5b26..00000000
--- a/docs/source/sphinxext/exec.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""File used to define sphinx exec directive."""
-import sys
-from os.path import basename
-
-try:
- from StringIO import StringIO
-except ImportError:
- from io import StringIO
-
-from docutils.parsers.rst import Directive
-from docutils import nodes, statemachine
-
-
-class ExecDirective(Directive):
- """Execute the specified python code and insert the output into the document."""
-
- has_content = True
-
- def run(self):
- """Function used when adding the directive to an index.rst."""
- old_stdoutout, sys.stdout = sys.stdout, StringIO()
-
- tab_width = self.options.get("tab-width", self.state.document.settings.tab_width)
- source = self.state_machine.input_lines.source(self.lineno - self.state_machine.input_offset - 1)
-
- try:
- exec("\n".join(self.content)) # pylint: disable=exec-used
- text = sys.stdout.getvalue()
- lines = statemachine.string2lines(text, tab_width, convert_whitespace=True)
- self.state_machine.insert_input(lines, source)
- return []
- except Exception: # pylint: disable=W0703
- return [
- nodes.error(
- None,
- nodes.paragraph(text=f"Unable to execute python code at {basename(source)}:{self.lineno}:"),
- nodes.paragraph(text=str(sys.exc_info()[1])),
- )
- ]
- finally:
- sys.stdout = old_stdoutout
-
-
-def setup(app):
- """Adds class as sphinx directive."""
- app.add_directive("exec", ExecDirective)
diff --git a/docs/source/table_template.j2 b/docs/source/table_template.j2
deleted file mode 100644
index b9394d03..00000000
--- a/docs/source/table_template.j2
+++ /dev/null
@@ -1,9 +0,0 @@
-.. raw:: html
-
-
- {% for lib_name in lib_names %}
{{lib_name|upper}}
{% endfor %}
- {% for specific_driver, normalized_driver in mappings.items() %}
-