python-netgear-switch-library 0.0.post344__tar.gz → 0.0.post346__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.
Files changed (390) hide show
  1. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/PKG-INFO +1 -1
  2. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/_version.py +2 -2
  3. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/aio_api.py +16 -0
  4. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/capabilities.py +22 -0
  5. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli_read.py +14 -0
  6. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/models.py +17 -0
  7. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/cli/commands.py +6 -0
  8. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/cli/parse.py +71 -0
  9. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/sync_api.py +19 -0
  10. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/.github/workflows/ci.yml +0 -0
  11. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/.github/workflows/deb.yml +0 -0
  12. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/.github/workflows/publish-pypi.yml +0 -0
  13. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/.gitignore +0 -0
  14. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/.readthedocs.yaml +0 -0
  15. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/CLAUDE.md +0 -0
  16. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/LICENSE +0 -0
  17. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/README.md +0 -0
  18. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/RELEASING.md +0 -0
  19. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/debian/changelog +0 -0
  20. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/debian/control +0 -0
  21. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/debian/copyright +0 -0
  22. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/debian/rules +0 -0
  23. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/debian/source/format +0 -0
  24. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/Makefile +0 -0
  25. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_ext/filelinks.py +0 -0
  26. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_ext/support_tables.py +0 -0
  27. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/gs105pe.png +0 -0
  28. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/gs110emx.png +0 -0
  29. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/gs305ep.png +0 -0
  30. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/gs728tpp.png +0 -0
  31. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/gsm7228ps.jpg +0 -0
  32. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/gsm7252ps.jpg +0 -0
  33. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/m4300-16x.png +0 -0
  34. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/models/m4300-24x.png +0 -0
  35. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/_static/ngsw.css +0 -0
  36. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/cli.rst +0 -0
  37. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/core.rst +0 -0
  38. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/facades.rst +0 -0
  39. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/index.rst +0 -0
  40. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/mcp.rst +0 -0
  41. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/operations.rst +0 -0
  42. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/protocols.rst +0 -0
  43. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/transport.rst +0 -0
  44. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/api/virtual.rst +0 -0
  45. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/cli.rst +0 -0
  46. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/conf.py +0 -0
  47. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/development.rst +0 -0
  48. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/fake/index.rst +0 -0
  49. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/fake/internals.rst +0 -0
  50. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/fake/serving.rst +0 -0
  51. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/fake/testing.rst +0 -0
  52. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/guide/concepts.rst +0 -0
  53. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/guide/configuration.rst +0 -0
  54. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/guide/installation.rst +0 -0
  55. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/guide/principles.rst +0 -0
  56. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/guide/quickstart.rst +0 -0
  57. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/guide/reading.rst +0 -0
  58. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/guide/writing.rst +0 -0
  59. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/index.rst +0 -0
  60. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/mcp.rst +0 -0
  61. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/gs105pe.rst +0 -0
  62. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/gs110emx.rst +0 -0
  63. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/gs305ep.rst +0 -0
  64. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/gs728tpp.rst +0 -0
  65. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/gsm7228ps.rst +0 -0
  66. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/gsm7252ps.rst +0 -0
  67. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/index.rst +0 -0
  68. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/m4300-16x.rst +0 -0
  69. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/m4300-24x.rst +0 -0
  70. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/models/support.rst +0 -0
  71. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/cli.rst +0 -0
  72. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/http/cheetah-form.rst +0 -0
  73. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/http/cheetah-v1.rst +0 -0
  74. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/http/gambit.rst +0 -0
  75. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/http/merge-hash-cgi.rst +0 -0
  76. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/http/xml-api.rst +0 -0
  77. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/http.rst +0 -0
  78. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/index.rst +0 -0
  79. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/nsdp.rst +0 -0
  80. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/protocols/snmp.rst +0 -0
  81. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-15-foundation.md +0 -0
  82. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-17-slice-02-snmp-read-core.md +0 -0
  83. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-17-slice-03-read-apis.md +0 -0
  84. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-18-slice-04-snmp-write.md +0 -0
  85. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-18-slice-05-nsdp.md +0 -0
  86. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-18-slice-06-http.md +0 -0
  87. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-18-slice-07-cli.md +0 -0
  88. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-18-slice-08-packaging-ci.md +0 -0
  89. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/plans/2026-07-23-gsm7252ps-http-xe-dialect.md +0 -0
  90. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/specs/2026-07-15-netgear-control-library-design.md +0 -0
  91. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/specs/2026-07-23-gsm7252ps-http-xe-dialect-design.md +0 -0
  92. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/docs/superpowers/specs/2026-08-02-snmp-surface-findings.md +0 -0
  93. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/packaging/apt-index.html +0 -0
  94. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/packaging/ci-build.sh +0 -0
  95. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/packaging/deb-version.py +0 -0
  96. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/pyproject.toml +0 -0
  97. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/__init__.py +0 -0
  98. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/_dispatch.py +0 -0
  99. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli/__init__.py +0 -0
  100. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli/capture.py +0 -0
  101. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli/context.py +0 -0
  102. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli/format.py +0 -0
  103. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli/main.py +0 -0
  104. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli/resolve.py +0 -0
  105. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli/safety.py +0 -0
  106. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/cli_write.py +0 -0
  107. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/config.py +0 -0
  108. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/errors.py +0 -0
  109. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/http_read.py +0 -0
  110. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/http_write.py +0 -0
  111. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/mcp/__init__.py +0 -0
  112. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/mcp/server.py +0 -0
  113. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/nsdp_read.py +0 -0
  114. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/nsdp_write.py +0 -0
  115. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/__init__.py +0 -0
  116. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/cli/__init__.py +0 -0
  117. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/http/__init__.py +0 -0
  118. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/http/crypt.py +0 -0
  119. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/http/endpoints.py +0 -0
  120. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/http/forms.py +0 -0
  121. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/http/parse.py +0 -0
  122. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/http/session.py +0 -0
  123. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/http/types.py +0 -0
  124. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/nsdp/__init__.py +0 -0
  125. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/nsdp/auth.py +0 -0
  126. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/nsdp/client.py +0 -0
  127. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/nsdp/parsers.py +0 -0
  128. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/nsdp/protocol.py +0 -0
  129. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/nsdp/types.py +0 -0
  130. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/nsdp/write.py +0 -0
  131. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/snmp/__init__.py +0 -0
  132. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/snmp/client.py +0 -0
  133. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/snmp/oids.py +0 -0
  134. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/snmp/parse.py +0 -0
  135. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/protocols/snmp/write.py +0 -0
  136. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/py.typed +0 -0
  137. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/registry.py +0 -0
  138. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/snmp_read.py +0 -0
  139. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/snmp_write.py +0 -0
  140. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/__init__.py +0 -0
  141. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/aio/__init__.py +0 -0
  142. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/aio/nsdp_udp.py +0 -0
  143. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/aio/snmp_pysnmp.py +0 -0
  144. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/cli/__init__.py +0 -0
  145. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/cli/console.py +0 -0
  146. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/cli/session.py +0 -0
  147. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/cli/ssh.py +0 -0
  148. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/cli/telnet.py +0 -0
  149. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/http/__init__.py +0 -0
  150. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/http/client.py +0 -0
  151. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/sync/__init__.py +0 -0
  152. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/sync/nsdp_udp.py +0 -0
  153. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/transport/sync/snmp_netsnmp_cli.py +0 -0
  154. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/__init__.py +0 -0
  155. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/cli_fastpath.py +0 -0
  156. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/faces/__init__.py +0 -0
  157. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/faces/cli.py +0 -0
  158. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/faces/http.py +0 -0
  159. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/faces/mibview.py +0 -0
  160. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/faces/nsdp.py +0 -0
  161. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/faces/snmp.py +0 -0
  162. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/seed.py +0 -0
  163. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/server.py +0 -0
  164. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/state.py +0 -0
  165. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web.py +0 -0
  166. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_fastpath_vlan.py +0 -0
  167. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_fastpath_xui.py +0 -0
  168. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_gs105pe.py +0 -0
  169. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_gs110emx.py +0 -0
  170. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_gs110emx_templates.py +0 -0
  171. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_gs728tpp.py +0 -0
  172. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_gsm7228ps.py +0 -0
  173. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_gsm7252ps.py +0 -0
  174. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/src/netgear_switch/virtual/web_m4300.py +0 -0
  175. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/capture_parity.py +0 -0
  176. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_capture.py +0 -0
  177. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_cli_integration.py +0 -0
  178. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_control_poe_port.py +0 -0
  179. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_control_vlan_ip.py +0 -0
  180. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_format.py +0 -0
  181. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_main_framework.py +0 -0
  182. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_new_commands.py +0 -0
  183. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_op_coverage.py +0 -0
  184. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_prompt_wiring.py +0 -0
  185. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_read_commands.py +0 -0
  186. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_resolve.py +0 -0
  187. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_safety.py +0 -0
  188. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/cli/test_serve.py +0 -0
  189. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/conftest.py +0 -0
  190. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/equivalence.py +0 -0
  191. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/captures/gsm7228ps.json +0 -0
  192. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/captures/gsm7252ps.json +0 -0
  193. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/captures/m4300-16x.json +0 -0
  194. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/captures/m4300-24x.json +0 -0
  195. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_environment.txt +0 -0
  196. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_lldp.txt +0 -0
  197. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_mac_table.txt +0 -0
  198. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_network.txt +0 -0
  199. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_poe.txt +0 -0
  200. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_port_all.txt +0 -0
  201. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_show_version.txt +0 -0
  202. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_vlan.txt +0 -0
  203. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_vlan_brief.txt +0 -0
  204. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7228ps_vlan_port_all.txt +0 -0
  205. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_environment.txt +0 -0
  206. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_interface_ethernet_1_0_1.txt +0 -0
  207. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_lldp_remote_device_all.txt +0 -0
  208. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_mac_addr_table.txt +0 -0
  209. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_network.txt +0 -0
  210. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_poe_port_info_all.txt +0 -0
  211. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_port_all.txt +0 -0
  212. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_version.txt +0 -0
  213. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_vlan_90.txt +0 -0
  214. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_vlan_brief.txt +0 -0
  215. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/gsm7252ps_show_vlan_port_all.txt +0 -0
  216. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_environment.txt +0 -0
  217. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_interface_ethernet_1_0_1.txt +0 -0
  218. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_ip_management.txt +0 -0
  219. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_lldp_remote_device_all.txt +0 -0
  220. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_mac_addr_table.txt +0 -0
  221. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_poe_port_info_all.txt +0 -0
  222. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_port_all.txt +0 -0
  223. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_version.txt +0 -0
  224. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_vlan.txt +0 -0
  225. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_vlan_1.txt +0 -0
  226. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_vlan_4.txt +0 -0
  227. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_vlan_5.txt +0 -0
  228. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_16x_show_vlan_port_all.txt +0 -0
  229. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_environment.txt +0 -0
  230. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_interface_ethernet_1_0_1.txt +0 -0
  231. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_ip_management.txt +0 -0
  232. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_lldp_remote_device_all.txt +0 -0
  233. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_mac_addr_table.txt +0 -0
  234. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_port_all.txt +0 -0
  235. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_version.txt +0 -0
  236. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_vlan.txt +0 -0
  237. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_vlan_5.txt +0 -0
  238. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_vlan_90.txt +0 -0
  239. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/cli/m4300_24x_show_vlan_port_all.txt +0 -0
  240. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs105pe_membership.html +0 -0
  241. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs105pe_portstats.html +0 -0
  242. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs105pe_pvid.html +0 -0
  243. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs105pe_status.html +0 -0
  244. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs105pe_switch_info.html +0 -0
  245. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs105pe_vlancfg.html +0 -0
  246. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_cf8021q.html +0 -0
  247. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_interface_stats.html +0 -0
  248. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_login.html +0 -0
  249. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_port_settings.html +0 -0
  250. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_pvid.html +0 -0
  251. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_redirect.html +0 -0
  252. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_sysinfo.html +0 -0
  253. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs110emx_vlanmembership.html +0 -0
  254. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs305ep_dashboard.html +0 -0
  255. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs305ep_login.html +0 -0
  256. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs305ep_membership.html +0 -0
  257. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs305ep_poestatus.html +0 -0
  258. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs305ep_portstats.html +0 -0
  259. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs305ep_pvid.html +0 -0
  260. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs305ep_vlancfg.html +0 -0
  261. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_device_info_and_sensors.xml +0 -0
  262. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_lldp.xml +0 -0
  263. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_macs.xml +0 -0
  264. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_mgmt_ip.xml +0 -0
  265. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_poe.xml +0 -0
  266. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_ports.xml +0 -0
  267. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_pvids_membership.xml +0 -0
  268. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_vlan_membership_per_vlan.xml +0 -0
  269. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gs728tpp_vlans.xml +0 -0
  270. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_basicAddressTable.html +0 -0
  271. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_ipConfiguration.html +0 -0
  272. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_lldpRemoteInventory.html +0 -0
  273. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_poeInterfaceConfiguration.html +0 -0
  274. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_portPvidConfiguration.html +0 -0
  275. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_portStatistics.html +0 -0
  276. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_portsConfiguration.html +0 -0
  277. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_sysInfo.html +0 -0
  278. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_vlanPortCfg_vlan5.html +0 -0
  279. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7228ps_vlanStatus.html +0 -0
  280. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_basicAddressTable.html +0 -0
  281. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_ipConfiguration.html +0 -0
  282. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_lldpRemoteInventory.html +0 -0
  283. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_login.html +0 -0
  284. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_poeInterfaceConfiguration.html +0 -0
  285. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_portPvidConfiguration.html +0 -0
  286. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_portStatistics.html +0 -0
  287. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_portsConfiguration.html +0 -0
  288. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_sysInfo.html +0 -0
  289. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan1.html +0 -0
  290. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_vlanPortCfg_vlan141.html +0 -0
  291. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/gsm7252ps_vlanStatus.html +0 -0
  292. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_16x_lldpRemoteInventory.html +0 -0
  293. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_16x_mgmtVlanIpv4Configuration.html +0 -0
  294. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_16x_poeInterfaceConfiguration.html +0 -0
  295. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_16x_portsConfiguration.html +0 -0
  296. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_16x_vlanportcfg_vlan4.html +0 -0
  297. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_24x_poeInterfaceConfiguration.html +0 -0
  298. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_addresstable.html +0 -0
  299. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_lldpRemoteInventory.html +0 -0
  300. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_mgmtVlanIpv4Configuration.html +0 -0
  301. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_ports.html +0 -0
  302. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_portstats.html +0 -0
  303. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_pvid.html +0 -0
  304. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_sysinfo.html +0 -0
  305. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_vlanportcfg_vlan1.html +0 -0
  306. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/http/m4300_vlanstatus.html +0 -0
  307. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/snmp/gsm7252ps_fans.txt +0 -0
  308. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/snmp/gsm7252ps_ifhighspeed.txt +0 -0
  309. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/snmp/gsm7252ps_ifoperstatus.txt +0 -0
  310. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/fixtures/snmp/gsm7252ps_psu.txt +0 -0
  311. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/http_specs.py +0 -0
  312. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/cli/test_cli_parse.py +0 -0
  313. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/http/test_crypt.py +0 -0
  314. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/http/test_endpoints.py +0 -0
  315. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/http/test_forms.py +0 -0
  316. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/http/test_parse.py +0 -0
  317. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/nsdp/test_auth.py +0 -0
  318. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/nsdp/test_parsers.py +0 -0
  319. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/nsdp/test_protocol.py +0 -0
  320. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/nsdp/test_write_frame.py +0 -0
  321. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_client.py +0 -0
  322. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_oids.py +0 -0
  323. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_parse_lldp_macs.py +0 -0
  324. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_parse_mgmt_ip.py +0 -0
  325. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_parse_poe_sensors.py +0 -0
  326. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_parse_ports.py +0 -0
  327. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_parse_system_info.py +0 -0
  328. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_parse_vlans.py +0 -0
  329. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/protocols/snmp/test_write_encode.py +0 -0
  330. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_aio_api.py +0 -0
  331. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_capabilities.py +0 -0
  332. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_cli_read.py +0 -0
  333. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_cli_vlan_write.py +0 -0
  334. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_cli_write.py +0 -0
  335. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_config.py +0 -0
  336. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_cross_backend_equivalence.py +0 -0
  337. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_deb_version.py +0 -0
  338. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_dispatch.py +0 -0
  339. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_docs_coverage.py +0 -0
  340. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_errors.py +0 -0
  341. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_facade_equivalence.py +0 -0
  342. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_http_dispatch.py +0 -0
  343. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_http_equivalence.py +0 -0
  344. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_http_read.py +0 -0
  345. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_http_vlan_membership.py +0 -0
  346. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_http_write.py +0 -0
  347. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_http_xui_writes.py +0 -0
  348. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_import.py +0 -0
  349. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_mcp_server.py +0 -0
  350. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_models.py +0 -0
  351. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_models_snmp_read.py +0 -0
  352. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_nsdp_integration.py +0 -0
  353. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_nsdp_read.py +0 -0
  354. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_nsdp_write.py +0 -0
  355. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_public_api.py +0 -0
  356. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_quality_gates.py +0 -0
  357. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_registry.py +0 -0
  358. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_snmp_integration.py +0 -0
  359. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_snmp_read.py +0 -0
  360. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_snmp_write.py +0 -0
  361. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_sync_api.py +0 -0
  362. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_version.py +0 -0
  363. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/test_write_equivalence.py +0 -0
  364. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/_fastpath_fake.py +0 -0
  365. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_cli_console.py +0 -0
  366. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_cli_scp_cert.py +0 -0
  367. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_cli_telnet.py +0 -0
  368. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_http_client.py +0 -0
  369. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_nsdp_udp_sync.py +0 -0
  370. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_set_transport.py +0 -0
  371. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_snmp_netsnmp_cli.py +0 -0
  372. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_snmp_pysnmp.py +0 -0
  373. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/transport/test_value_parity.py +0 -0
  374. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_cli_cross_backend.py +0 -0
  375. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_cli_gsm7228ps_parity.py +0 -0
  376. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_gsm7228ps_seed.py +0 -0
  377. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_hostname.py +0 -0
  378. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_m4300_seeds.py +0 -0
  379. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_mibview.py +0 -0
  380. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_mutable_state.py +0 -0
  381. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_nsdp_state.py +0 -0
  382. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_serve_daemon.py +0 -0
  383. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_snmp_write_face.py +0 -0
  384. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_state_seed.py +0 -0
  385. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_switchport_vlan_write.py +0 -0
  386. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_virtual_http_face.py +0 -0
  387. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_virtual_nsdp_face.py +0 -0
  388. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_virtual_snmp_face.py +0 -0
  389. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/tests/virtual/test_web_projection.py +0 -0
  390. {python_netgear_switch_library-0.0.post344 → python_netgear_switch_library-0.0.post346}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-netgear-switch-library
3
- Version: 0.0.post344
3
+ Version: 0.0.post346
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.post344'
22
- __version_tuple__ = version_tuple = (0, 0, 'post344')
21
+ __version__ = version = '0.0.post346'
22
+ __version_tuple__ = version_tuple = (0, 0, 'post346')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -95,6 +95,8 @@ if TYPE_CHECKING:
95
95
  PortStats,
96
96
  PortStatus,
97
97
  Sensor,
98
+ ServiceStatus,
99
+ SwitchUser,
98
100
  SyslogConfig,
99
101
  VLANInfo,
100
102
  VlanMode,
@@ -452,6 +454,20 @@ class AsyncSwitch:
452
454
  """Async twin of ``SyncSwitch.get_syslog`` -- see there."""
453
455
  return await self._read(lambda r: r.get_syslog(), backend)
454
456
 
457
+ async def get_users(self, *, backend: Backend | None = None) -> list[SwitchUser]:
458
+ """Async twin of ``SyncSwitch.get_users``.
459
+
460
+ AsyncSwitch has no CLI backend, so this refuses on every model -- the
461
+ same honest refusal every async CLI read gives.
462
+ """
463
+ return await self._read(lambda r: r.get_users(), backend)
464
+
465
+ async def get_services(
466
+ self, *, backend: Backend | None = None
467
+ ) -> list[ServiceStatus]:
468
+ """Async twin of ``SyncSwitch.get_services`` -- CLI only, see there."""
469
+ return await self._read(lambda r: r.get_services(), backend)
470
+
455
471
  async def get_hostname(self, *, backend: Backend | None = None) -> str:
456
472
  """Async twin of ``SyncSwitch.get_hostname`` -- see there."""
457
473
  return await self._read(lambda r: r.get_hostname(), backend)
@@ -114,6 +114,28 @@ READ_OPERATIONS: tuple[Operation, ...] = (
114
114
  Operation("get_sensors", OperationKind.READ, "Fan/PSU/temperature sensors"),
115
115
  Operation("get_mgmt_ip", OperationKind.READ, "Management IP configuration"),
116
116
  Operation("get_hostname", OperationKind.READ, "The switch's host name"),
117
+ Operation(
118
+ "get_users",
119
+ OperationKind.READ,
120
+ "Local login accounts and their access level",
121
+ # CLI only, deliberately. The S3300's vendor SNMP user table holds ONE
122
+ # account where its own CLI lists two, so the two backends do not report
123
+ # the same set; claiming both serve this would assert an equivalence the
124
+ # hardware contradicts. Restricting it to the CLI makes no cross-backend
125
+ # claim at all, and leaves the SNMP question open rather than answered
126
+ # wrongly.
127
+ backends=_CLI_BACKENDS,
128
+ ),
129
+ Operation(
130
+ "get_services",
131
+ OperationKind.READ,
132
+ "Which management services (http/https/telnet/ssh) are enabled",
133
+ # CLI only so far: `show ip http`, `show telnetcon` and `show ip ssh`
134
+ # are measured, and the SNMP/HTTP/NSDP equivalents are unlocated rather
135
+ # than absent. The four models with no CLI backend therefore have no
136
+ # route to this yet, which the support table now shows as a hole.
137
+ backends=_CLI_BACKENDS,
138
+ ),
117
139
  Operation(
118
140
  "get_syslog",
119
141
  OperationKind.READ,
@@ -36,6 +36,7 @@ if TYPE_CHECKING:
36
36
  PortStats,
37
37
  PortStatus,
38
38
  Sensor,
39
+ ServiceStatus,
39
40
  SwitchUser,
40
41
  SyslogConfig,
41
42
  VLANInfo,
@@ -105,6 +106,19 @@ class CliReader:
105
106
  def get_mgmt_ip(self) -> MgmtIpConfig:
106
107
  return parse.parse_mgmt_ip(self.session.run(self._spec.network_cmd))
107
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
+
108
122
  def get_users(self) -> list[SwitchUser]:
109
123
  """The switch's local login accounts, from ``show users``.
110
124
 
@@ -119,6 +119,23 @@ 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
+
122
139
  @dataclass(frozen=True)
123
140
  class SwitchUser:
124
141
  """One local login account on the switch."""
@@ -106,6 +106,12 @@ class CliModelSpec:
106
106
  # Local login accounts. Present on both FASTPATH images measured; the
107
107
  # ACCESS-MODE vocabulary differs between them (see parse.parse_users).
108
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"
109
115
  # Remote logging. `show syslog` does NOT exist -- all three FASTPATH
110
116
  # switches answered "% Invalid input detected" on 2026-08-02.
111
117
  logging_cmd: str = "show logging"
@@ -42,6 +42,7 @@ from ...models import (
42
42
  PortStats,
43
43
  PortStatus,
44
44
  Sensor,
45
+ ServiceStatus,
45
46
  SwitchUser,
46
47
  SyslogConfig,
47
48
  SyslogServer,
@@ -609,6 +610,76 @@ def parse_environment(text: str) -> list[Sensor]:
609
610
  return out
610
611
 
611
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
+
612
683
  # ---------------------------------------------------------------------------
613
684
  # show users -> local login accounts
614
685
  # ---------------------------------------------------------------------------
@@ -157,6 +157,8 @@ if TYPE_CHECKING:
157
157
  PortStats,
158
158
  PortStatus,
159
159
  Sensor,
160
+ ServiceStatus,
161
+ SwitchUser,
160
162
  SyslogConfig,
161
163
  VLANInfo,
162
164
  VlanMode,
@@ -564,6 +566,23 @@ class SyncSwitch:
564
566
  """
565
567
  return self._read(lambda r: r.get_syslog(), backend)
566
568
 
569
+ def get_users(self, *, backend: Backend | None = None) -> list[SwitchUser]:
570
+ """The switch's local login accounts.
571
+
572
+ Served over the FASTPATH CLI. ``SwitchUser.access_mode`` keeps the
573
+ firmware's own wording, which differs between images, and
574
+ ``privileged`` carries the normalised reading.
575
+ """
576
+ return self._read(lambda r: r.get_users(), backend)
577
+
578
+ def get_services(self, *, backend: Backend | None = None) -> list[ServiceStatus]:
579
+ """Which management services are enabled, and on which ports.
580
+
581
+ Served over the FASTPATH CLI. A ``port`` of ``None`` means the firmware
582
+ reports no port for that service, not that a default applies.
583
+ """
584
+ return self._read(lambda r: r.get_services(), backend)
585
+
567
586
  def get_hostname(self, *, backend: Backend | None = None) -> str:
568
587
  """The switch's host name.
569
588