python-netgear-switch-library 0.0.post343__tar.gz → 0.0.post345__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/PKG-INFO +1 -1
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/_version.py +2 -2
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli_read.py +24 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/models.py +39 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/cli/commands.py +9 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/cli/parse.py +132 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/.github/workflows/ci.yml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/.github/workflows/deb.yml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/.github/workflows/publish-pypi.yml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/.gitignore +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/.readthedocs.yaml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/CLAUDE.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/LICENSE +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/README.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/RELEASING.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/debian/changelog +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/debian/control +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/debian/copyright +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/debian/rules +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/debian/source/format +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/Makefile +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_ext/filelinks.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_ext/support_tables.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/gs105pe.png +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/gs110emx.png +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/gs305ep.png +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/gs728tpp.png +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/gsm7228ps.jpg +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/gsm7252ps.jpg +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/m4300-16x.png +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/models/m4300-24x.png +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/_static/ngsw.css +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/cli.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/core.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/facades.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/index.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/mcp.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/operations.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/protocols.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/transport.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/api/virtual.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/cli.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/conf.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/development.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/fake/index.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/fake/internals.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/fake/serving.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/fake/testing.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/guide/concepts.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/guide/configuration.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/guide/installation.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/guide/principles.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/guide/quickstart.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/guide/reading.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/guide/writing.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/index.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/mcp.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/gs105pe.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/gs110emx.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/gs305ep.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/gs728tpp.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/gsm7228ps.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/gsm7252ps.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/index.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/m4300-16x.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/m4300-24x.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/models/support.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/cli.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/http/cheetah-form.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/http/cheetah-v1.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/http/gambit.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/http/merge-hash-cgi.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/http/xml-api.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/http.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/index.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/nsdp.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/protocols/snmp.rst +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-15-foundation.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-17-slice-02-snmp-read-core.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-17-slice-03-read-apis.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-18-slice-04-snmp-write.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-18-slice-05-nsdp.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-18-slice-06-http.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-18-slice-07-cli.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-18-slice-08-packaging-ci.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/plans/2026-07-23-gsm7252ps-http-xe-dialect.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/specs/2026-07-15-netgear-control-library-design.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/specs/2026-07-23-gsm7252ps-http-xe-dialect-design.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/superpowers/specs/2026-08-02-snmp-surface-findings.md +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/packaging/apt-index.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/packaging/ci-build.sh +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/packaging/deb-version.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/pyproject.toml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/_dispatch.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/aio_api.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/capabilities.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli/capture.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli/context.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli/format.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli/main.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli/resolve.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli/safety.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/cli_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/config.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/errors.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/http_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/http_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/mcp/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/mcp/server.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/nsdp_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/nsdp_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/cli/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/http/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/http/crypt.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/http/endpoints.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/http/forms.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/http/parse.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/http/session.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/http/types.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/nsdp/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/nsdp/auth.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/nsdp/client.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/nsdp/parsers.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/nsdp/protocol.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/nsdp/types.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/nsdp/write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/snmp/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/snmp/client.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/snmp/oids.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/snmp/parse.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/protocols/snmp/write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/py.typed +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/registry.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/snmp_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/snmp_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/sync_api.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/aio/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/aio/nsdp_udp.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/aio/snmp_pysnmp.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/cli/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/cli/console.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/cli/session.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/cli/ssh.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/cli/telnet.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/http/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/http/client.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/sync/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/sync/nsdp_udp.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/transport/sync/snmp_netsnmp_cli.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/cli_fastpath.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/faces/__init__.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/faces/cli.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/faces/http.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/faces/mibview.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/faces/nsdp.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/faces/snmp.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/seed.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/server.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/state.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_fastpath_vlan.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_fastpath_xui.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_gs105pe.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_gs110emx.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_gs110emx_templates.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_gs728tpp.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_gsm7228ps.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_gsm7252ps.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/src/netgear_switch/virtual/web_m4300.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/capture_parity.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_capture.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_cli_integration.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_control_poe_port.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_control_vlan_ip.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_format.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_main_framework.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_new_commands.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_op_coverage.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_prompt_wiring.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_read_commands.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_resolve.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_safety.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/cli/test_serve.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/conftest.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/equivalence.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/captures/gsm7228ps.json +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/captures/gsm7252ps.json +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/captures/m4300-16x.json +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/captures/m4300-24x.json +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_environment.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_lldp.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_mac_table.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_network.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_poe.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_show_version.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_vlan.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_vlan_brief.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7228ps_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_environment.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_interface_ethernet_1_0_1.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_lldp_remote_device_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_mac_addr_table.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_network.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_poe_port_info_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_version.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_vlan_90.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_vlan_brief.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/gsm7252ps_show_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_environment.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_interface_ethernet_1_0_1.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_ip_management.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_lldp_remote_device_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_mac_addr_table.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_poe_port_info_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_version.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_vlan.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_vlan_1.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_vlan_4.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_vlan_5.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_16x_show_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_environment.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_interface_ethernet_1_0_1.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_ip_management.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_lldp_remote_device_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_mac_addr_table.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_version.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_vlan.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_vlan_5.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_vlan_90.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/cli/m4300_24x_show_vlan_port_all.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs105pe_membership.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs105pe_portstats.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs105pe_pvid.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs105pe_status.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs105pe_switch_info.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs105pe_vlancfg.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_cf8021q.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_interface_stats.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_login.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_port_settings.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_pvid.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_redirect.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_sysinfo.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs110emx_vlanmembership.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs305ep_dashboard.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs305ep_login.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs305ep_membership.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs305ep_poestatus.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs305ep_portstats.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs305ep_pvid.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs305ep_vlancfg.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_device_info_and_sensors.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_lldp.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_macs.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_mgmt_ip.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_poe.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_ports.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_pvids_membership.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_vlan_membership_per_vlan.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gs728tpp_vlans.xml +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_basicAddressTable.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_ipConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_portPvidConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_portStatistics.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_portsConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_sysInfo.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_vlanPortCfg_vlan5.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7228ps_vlanStatus.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_basicAddressTable.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_ipConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_login.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_portPvidConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_portStatistics.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_portsConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_sysInfo.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan1.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan141.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/gsm7252ps_vlanStatus.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_16x_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_16x_mgmtVlanIpv4Configuration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_16x_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_16x_portsConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_16x_vlanportcfg_vlan4.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_24x_poeInterfaceConfiguration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_addresstable.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_lldpRemoteInventory.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_mgmtVlanIpv4Configuration.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_ports.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_portstats.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_pvid.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_sysinfo.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_vlanportcfg_vlan1.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/http/m4300_vlanstatus.html +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/snmp/gsm7252ps_fans.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/snmp/gsm7252ps_ifhighspeed.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/snmp/gsm7252ps_ifoperstatus.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/fixtures/snmp/gsm7252ps_psu.txt +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/http_specs.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/cli/test_cli_parse.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/http/test_crypt.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/http/test_endpoints.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/http/test_forms.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/http/test_parse.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/nsdp/test_auth.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/nsdp/test_parsers.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/nsdp/test_protocol.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/nsdp/test_write_frame.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_client.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_oids.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_parse_lldp_macs.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_parse_mgmt_ip.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_parse_poe_sensors.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_parse_ports.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_parse_system_info.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_parse_vlans.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/protocols/snmp/test_write_encode.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_aio_api.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_capabilities.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_cli_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_cli_vlan_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_cli_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_config.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_cross_backend_equivalence.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_deb_version.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_dispatch.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_docs_coverage.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_errors.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_facade_equivalence.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_http_dispatch.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_http_equivalence.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_http_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_http_vlan_membership.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_http_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_http_xui_writes.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_import.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_mcp_server.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_models.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_models_snmp_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_nsdp_integration.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_nsdp_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_nsdp_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_public_api.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_quality_gates.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_registry.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_snmp_integration.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_snmp_read.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_snmp_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_sync_api.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_version.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/test_write_equivalence.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/_fastpath_fake.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_cli_console.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_cli_scp_cert.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_cli_telnet.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_http_client.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_nsdp_udp_sync.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_set_transport.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_snmp_netsnmp_cli.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_snmp_pysnmp.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/transport/test_value_parity.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_cli_cross_backend.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_cli_gsm7228ps_parity.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_gsm7228ps_seed.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_hostname.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_m4300_seeds.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_mibview.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_mutable_state.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_nsdp_state.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_serve_daemon.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_snmp_write_face.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_state_seed.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_switchport_vlan_write.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_virtual_http_face.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_virtual_nsdp_face.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_virtual_snmp_face.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/tests/virtual/test_web_projection.py +0 -0
- {python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/uv.lock +0 -0
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-netgear-switch-library
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.post345
|
|
4
4
|
Summary: Python library and CLI to query and control Netgear switches over SNMP, NSDP and HTTP.
|
|
5
5
|
Author-email: Tim Ansell <me@mith.ro>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 0, '
|
|
21
|
+
__version__ = version = '0.0.post345'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 0, 'post345')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -36,6 +36,8 @@ if TYPE_CHECKING:
|
|
|
36
36
|
PortStats,
|
|
37
37
|
PortStatus,
|
|
38
38
|
Sensor,
|
|
39
|
+
ServiceStatus,
|
|
40
|
+
SwitchUser,
|
|
39
41
|
SyslogConfig,
|
|
40
42
|
VLANInfo,
|
|
41
43
|
)
|
|
@@ -104,6 +106,28 @@ class CliReader:
|
|
|
104
106
|
def get_mgmt_ip(self) -> MgmtIpConfig:
|
|
105
107
|
return parse.parse_mgmt_ip(self.session.run(self._spec.network_cmd))
|
|
106
108
|
|
|
109
|
+
def get_services(self) -> list[ServiceStatus]:
|
|
110
|
+
"""Which management services are enabled, and on which ports.
|
|
111
|
+
|
|
112
|
+
Three commands, because the switch splits it that way -- and the telnet
|
|
113
|
+
one is ``show telnetcon``, not ``show telnet``. See
|
|
114
|
+
``parse.parse_services`` for why that distinction matters.
|
|
115
|
+
"""
|
|
116
|
+
return parse.parse_services(
|
|
117
|
+
self.session.run(self._spec.http_service_cmd),
|
|
118
|
+
self.session.run(self._spec.telnet_service_cmd),
|
|
119
|
+
self.session.run(self._spec.ssh_service_cmd),
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
def get_users(self) -> list[SwitchUser]:
|
|
123
|
+
"""The switch's local login accounts, from ``show users``.
|
|
124
|
+
|
|
125
|
+
The access-mode wording differs between firmware images, so
|
|
126
|
+
``SwitchUser.access_mode`` keeps the raw text and ``privileged``
|
|
127
|
+
carries the normalised reading -- see ``parse.parse_users``.
|
|
128
|
+
"""
|
|
129
|
+
return parse.parse_users(self.session.run(self._spec.users_cmd))
|
|
130
|
+
|
|
107
131
|
def get_syslog(self) -> SyslogConfig:
|
|
108
132
|
"""Remote-logging configuration, from ``show logging`` + its host table.
|
|
109
133
|
|
|
@@ -119,6 +119,45 @@ class MgmtIpConfig:
|
|
|
119
119
|
base_mac: str | None = None
|
|
120
120
|
|
|
121
121
|
|
|
122
|
+
@dataclass(frozen=True)
|
|
123
|
+
class ServiceStatus:
|
|
124
|
+
"""One management service the switch offers, and whether it is on.
|
|
125
|
+
|
|
126
|
+
Covers the four protocols an operator turns on or off to control how the
|
|
127
|
+
switch itself can be reached: ``http``, ``https``, ``telnet`` and ``ssh``.
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
#: One of ``http``, ``https``, ``telnet``, ``ssh``.
|
|
131
|
+
name: str
|
|
132
|
+
enabled: bool
|
|
133
|
+
#: The TCP port the service listens on, or ``None`` where the firmware does
|
|
134
|
+
#: not report one. Measured: gsm7252ps omits the ``SSH Port`` line that
|
|
135
|
+
#: m4300-24x prints, so this is genuinely absent rather than defaulted to 22.
|
|
136
|
+
port: int | None = None
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
@dataclass(frozen=True)
|
|
140
|
+
class SwitchUser:
|
|
141
|
+
"""One local login account on the switch."""
|
|
142
|
+
|
|
143
|
+
name: str
|
|
144
|
+
#: The access mode exactly as this firmware words it. Kept verbatim because
|
|
145
|
+
#: the vocabulary is NOT the same across images: measured 2026-08-02, the
|
|
146
|
+
#: m4300-24x prints ``Privilege-15``/``Privilege-1`` where the gsm7252ps
|
|
147
|
+
#: prints ``Read/Write``/``Read Only`` for the same two accounts.
|
|
148
|
+
access_mode: str
|
|
149
|
+
#: Whether ``access_mode`` is the full-privilege level, normalised across
|
|
150
|
+
#: both vocabularies so callers do not have to know which image they are on.
|
|
151
|
+
#: ``None`` when the text is neither spelling -- an unrecognised level is
|
|
152
|
+
#: reported honestly rather than guessed as unprivileged.
|
|
153
|
+
privileged: bool | None
|
|
154
|
+
#: The three SNMPv3 columns the same table carries. ``None`` where the
|
|
155
|
+
#: firmware prints nothing.
|
|
156
|
+
snmpv3_access: str | None = None
|
|
157
|
+
snmpv3_auth: str | None = None
|
|
158
|
+
snmpv3_encryption: str | None = None
|
|
159
|
+
|
|
160
|
+
|
|
122
161
|
@dataclass(frozen=True)
|
|
123
162
|
class SyslogServer:
|
|
124
163
|
"""One remote syslog collector the switch is configured to send to."""
|
|
@@ -103,6 +103,15 @@ class CliModelSpec:
|
|
|
103
103
|
# SNMP's sysName, so it is what keeps the two backends returning the same
|
|
104
104
|
# answer for the same switch.
|
|
105
105
|
hosts_cmd: str = "show hosts"
|
|
106
|
+
# Local login accounts. Present on both FASTPATH images measured; the
|
|
107
|
+
# ACCESS-MODE vocabulary differs between them (see parse.parse_users).
|
|
108
|
+
users_cmd: str = "show users"
|
|
109
|
+
# Management services. `show ip http` covers BOTH web servers; the inbound
|
|
110
|
+
# telnet server is `show telnetcon` and NOT `show telnet`, which reports
|
|
111
|
+
# the switch as an outbound telnet CLIENT (measured 2026-08-02).
|
|
112
|
+
http_service_cmd: str = "show ip http"
|
|
113
|
+
telnet_service_cmd: str = "show telnetcon"
|
|
114
|
+
ssh_service_cmd: str = "show ip ssh"
|
|
106
115
|
# Remote logging. `show syslog` does NOT exist -- all three FASTPATH
|
|
107
116
|
# switches answered "% Invalid input detected" on 2026-08-02.
|
|
108
117
|
logging_cmd: str = "show logging"
|
|
@@ -42,6 +42,8 @@ from ...models import (
|
|
|
42
42
|
PortStats,
|
|
43
43
|
PortStatus,
|
|
44
44
|
Sensor,
|
|
45
|
+
ServiceStatus,
|
|
46
|
+
SwitchUser,
|
|
45
47
|
SyslogConfig,
|
|
46
48
|
SyslogServer,
|
|
47
49
|
VLANInfo,
|
|
@@ -608,6 +610,136 @@ def parse_environment(text: str) -> list[Sensor]:
|
|
|
608
610
|
return out
|
|
609
611
|
|
|
610
612
|
|
|
613
|
+
# ---------------------------------------------------------------------------
|
|
614
|
+
# show ip http / show telnetcon / show ip ssh -> management services
|
|
615
|
+
# ---------------------------------------------------------------------------
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
def _enabled(text: str) -> bool:
|
|
619
|
+
"""FASTPATH spells this two ways: "Enabled" and "Enable"."""
|
|
620
|
+
return text.strip().lower() in {"enabled", "enable", "yes"}
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
def parse_services(
|
|
624
|
+
http_text: str, telnet_text: str, ssh_text: str
|
|
625
|
+
) -> list[ServiceStatus]:
|
|
626
|
+
"""The four management services, from the three commands that report them.
|
|
627
|
+
|
|
628
|
+
Captured 2026-08-02 from m4300-24x (10.1.5.13) and gsm7252ps (10.1.5.22).
|
|
629
|
+
|
|
630
|
+
``show ip http`` carries BOTH the plain and secure web servers::
|
|
631
|
+
|
|
632
|
+
HTTP Mode (Unsecure)........................... Enabled
|
|
633
|
+
HTTP Port...................................... 80
|
|
634
|
+
HTTP Mode (Secure)............................. Enabled
|
|
635
|
+
Secure Port.................................... 443
|
|
636
|
+
|
|
637
|
+
``show telnetcon`` -- NOT ``show telnet`` -- reports the INBOUND server::
|
|
638
|
+
|
|
639
|
+
Telnet Server Admin Mode....................... Enable
|
|
640
|
+
Telnet Server Port............................. 23
|
|
641
|
+
|
|
642
|
+
``show telnet`` describes the switch as a telnet *client* ("Allow New
|
|
643
|
+
Outbound Telnet Sessions"), which says nothing about whether the server this
|
|
644
|
+
library's TELNET backend connects to is running. Reading it as the server
|
|
645
|
+
state would be wrong in the way that looks right.
|
|
646
|
+
|
|
647
|
+
``show ip ssh`` reports SSH, and its field set differs by firmware: the
|
|
648
|
+
gsm7252ps prints no ``SSH Port`` line at all, so that port is honestly None
|
|
649
|
+
rather than assumed to be 22.
|
|
650
|
+
"""
|
|
651
|
+
http = labelled_values(http_text)
|
|
652
|
+
telnet = labelled_values(telnet_text)
|
|
653
|
+
# `show ip ssh` writes its labels WITH a trailing colon before the dotted
|
|
654
|
+
# leader ("Administrative Mode: ......... Enabled"), unlike every other
|
|
655
|
+
# FASTPATH scalar command. Measured on both m4300-24x and gsm7252ps. Without
|
|
656
|
+
# stripping it the lookup misses and SSH reads as disabled on a switch whose
|
|
657
|
+
# own output says Enabled -- which is exactly what the first live run did.
|
|
658
|
+
ssh = {k.rstrip(":").strip(): v for k, v in labelled_values(ssh_text).items()}
|
|
659
|
+
return [
|
|
660
|
+
ServiceStatus(
|
|
661
|
+
name="http",
|
|
662
|
+
enabled=_enabled(http.get("HTTP Mode (Unsecure)", "")),
|
|
663
|
+
port=_int(http.get("HTTP Port", "")),
|
|
664
|
+
),
|
|
665
|
+
ServiceStatus(
|
|
666
|
+
name="https",
|
|
667
|
+
enabled=_enabled(http.get("HTTP Mode (Secure)", "")),
|
|
668
|
+
port=_int(http.get("Secure Port", "")),
|
|
669
|
+
),
|
|
670
|
+
ServiceStatus(
|
|
671
|
+
name="telnet",
|
|
672
|
+
enabled=_enabled(telnet.get("Telnet Server Admin Mode", "")),
|
|
673
|
+
port=_int(telnet.get("Telnet Server Port", "")),
|
|
674
|
+
),
|
|
675
|
+
ServiceStatus(
|
|
676
|
+
name="ssh",
|
|
677
|
+
enabled=_enabled(ssh.get("Administrative Mode", "")),
|
|
678
|
+
port=_int(ssh.get("SSH Port", "")),
|
|
679
|
+
),
|
|
680
|
+
]
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
# ---------------------------------------------------------------------------
|
|
684
|
+
# show users -> local login accounts
|
|
685
|
+
# ---------------------------------------------------------------------------
|
|
686
|
+
|
|
687
|
+
#: Access-mode text meaning full privilege, in BOTH vocabularies FASTPATH uses.
|
|
688
|
+
#: Measured 2026-08-02: m4300-24x prints "Privilege-15"/"Privilege-1" while
|
|
689
|
+
#: gsm7252ps prints "Read/Write"/"Read Only" for the same admin/guest pair. A
|
|
690
|
+
#: parser that knew only one spelling would silently mis-report the other image.
|
|
691
|
+
_PRIVILEGED_ACCESS = frozenset({"privilege-15", "read/write"})
|
|
692
|
+
_UNPRIVILEGED_ACCESS = frozenset({"privilege-1", "read only", "no access"})
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
def _privileged(access_mode: str) -> bool | None:
|
|
696
|
+
text = access_mode.strip().lower()
|
|
697
|
+
if text in _PRIVILEGED_ACCESS:
|
|
698
|
+
return True
|
|
699
|
+
if text in _UNPRIVILEGED_ACCESS:
|
|
700
|
+
return False
|
|
701
|
+
return None
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
def parse_users(text: str) -> list[SwitchUser]:
|
|
705
|
+
"""``show users`` -> the switch's local login accounts.
|
|
706
|
+
|
|
707
|
+
Captured 2026-08-02 from m4300-24x (10.1.5.13) and gsm7252ps (10.1.5.22);
|
|
708
|
+
both list ``admin`` and ``guest``, under a header that wraps over three
|
|
709
|
+
lines::
|
|
710
|
+
|
|
711
|
+
User SNMPv3 SNMPv3 SNMPv3
|
|
712
|
+
User Name Access Mode Access Mode Authentication Encryption
|
|
713
|
+
------------------------ ------------ ----------- -------------- ----------
|
|
714
|
+
admin Privilege-15 Read Only MD5 None
|
|
715
|
+
|
|
716
|
+
Sliced by the ruler rather than split on whitespace, because an access mode
|
|
717
|
+
legitimately contains a space (``Read Only``, ``Read/Write``) and a naive
|
|
718
|
+
split would tear it in half.
|
|
719
|
+
|
|
720
|
+
The ACCESS-MODE VOCABULARY differs by firmware -- see ``_PRIVILEGED_ACCESS``
|
|
721
|
+
-- so the raw text is preserved on ``SwitchUser.access_mode`` and only the
|
|
722
|
+
normalised ``privileged`` flag interprets it.
|
|
723
|
+
"""
|
|
724
|
+
users: list[SwitchUser] = []
|
|
725
|
+
for cells in iter_table_rows(text):
|
|
726
|
+
if not cells or not cells[0].strip():
|
|
727
|
+
continue
|
|
728
|
+
padded = [*cells, "", "", "", ""]
|
|
729
|
+
name, access, snmp_access, snmp_auth, snmp_enc = (c.strip() for c in padded[:5])
|
|
730
|
+
users.append(
|
|
731
|
+
SwitchUser(
|
|
732
|
+
name=name,
|
|
733
|
+
access_mode=access,
|
|
734
|
+
privileged=_privileged(access),
|
|
735
|
+
snmpv3_access=snmp_access or None,
|
|
736
|
+
snmpv3_auth=snmp_auth or None,
|
|
737
|
+
snmpv3_encryption=snmp_enc or None,
|
|
738
|
+
)
|
|
739
|
+
)
|
|
740
|
+
return users
|
|
741
|
+
|
|
742
|
+
|
|
611
743
|
# ---------------------------------------------------------------------------
|
|
612
744
|
# show logging / show logging hosts -> syslog configuration
|
|
613
745
|
# ---------------------------------------------------------------------------
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/.gitignore
RENAMED
|
File without changes
|
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/CLAUDE.md
RENAMED
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/LICENSE
RENAMED
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/README.md
RENAMED
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/RELEASING.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/debian/rules
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/cli.rst
RENAMED
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/conf.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_netgear_switch_library-0.0.post343 → python_netgear_switch_library-0.0.post345}/docs/mcp.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|