# Python Library for NETGEAR Plus Switches
## What it does
Grabs statistical network data from [supported NETGEAR Switches](#supported-and-tested-netgear-modelsproducts-and-firmwares) from the
[Plus Managed Network Switch](https://www.netgear.com/business/wired/switches/plus/) line. These switches can only be managed using a
Web interface and not through SNMP or cli. This library uses web scraping to collect the switch configuration, statistics and
some basic configuration updates.
## How it works
1. Detecting Switch Model/Product in login.cgi
2. Connects to the Switch and asks for a cookie (`http://IP_OF_SWITCH/login.cgi`)
3. HTTP-Request send to the Switch twice (`http://IP_OF_SWITCH/portStatistics.cgi`) and compared with previous data ("in response time")
### List of port statistics
| Name | key from `get_switch_infos()` | Unit |
| ----------------------------- | ---------------------------------- | ----------------------------------- |
| Port {port} Traffic Received | `port_{port}_traffic_rx_mbytes` | MB (in response time) |
| Port {port} Traffic Sent | `port_{port}_traffic_tx_mbytes` | MB (in response time) |
| Port {port} Receiving | `port_{port}_speed_rx_mbytes` | MB/s |
| Port {port} Transferring | `port_{port}_speed_tx_mbytes` | MB/s |
| Port {port} IO | `port_{port}_speed_io_mbytes` | MB/s |
| Port {port} Total Received | `port_{port}_sum_rx_mbytes` | MB (since last switch reboot/reset) |
| Port {port} Total Transferred | `port_{port}_sum_tx_mbytes` | MB (since last switch reboot/reset) |
| Port {port} Connection Speed | `port_{port}_connection_speed` | MB/s |
| Port {port} Status | `port_{port}_status` | "on"/"off" |
| Port {poe_port} POE Power | `port_{poe_port}_poe_power_active` | "on"/"off" |
### List of aggregated statistics
| Sensor Name | key from `get_switch_infos()` | Unit |
| ----------------------- | ----------------------------- | --------------------- |
| Switch IO | `sum_port_speed_bps_io` | MB/s |
| Switch Traffic Received | `sum_port_traffic_rx` | MB (in response time) |
| Switch Traffic Sent | `sum_port_traffic_tx` | MB (in response time) |
## Supported and tested NETGEAR Models/Products and firmware versions
| Model | Ports | Firmware versions | Bootloader versions |
| -------- | ----- | -------------------------------------- | ------------------- |
| GS105E | 5 | ? | |
| GS108E | 8 | V1.00.11 | V1.00.03 |
| GS105Ev3 | 5 | ? | |
| GS108Ev3 | 8 | V2.00.05, V2.06.10, V2.06.17, V2.06.24 | V2.06.01 - V2.06.03 |
| GS305EP | 5 | V1.0.1.1 | |
| GS305EPP | 5 | V1.0.1.4 | |
| GS308EP | 8 | V1.0.0.10, V1.0.1.4 | |
| GS308EPP | 8 | V1.0.1.4 | |
| GS316EP | 16 | V1.0.4.4 | |
| GS316EPP | 16 | V1.0.4.4 | |
Supported firmware languages: GR (German), EN (English)
## Unsupported models
| Model | Support status |
| --------- | --------------- |
| GS108PEv3 | Not yet started |
| GS105Ev2 | Not yet started |
| GS110EMX | Not yet started |
| XS512EM | Not yet started |
## CLI usage
```shell
export NETGEAR_PLUS_PASSWORD=s3cr3t # replace with your password
ngp-cli login 192.168.178.68 # replace with IP address of your switch
ngp-cli status
ngp-cli logout
ngp-cli -h
```
## Library Usage
### Create a python virtual environment
```shell
python3 -m venv .venv
source .venv/bin/activate
pip install py-netgear-plus
```
Using this VENV go to your local source folder
### Example calls
```shell
cd src
python3
```
```python
ip = '192.168.178.68' # replace with IP address of your switch
p = 'fyce4gKZemkqjDY' # replace with your password
import py_netgear_plus
sw = py_netgear_plus.NetgearSwitchConnector(ip, p)
sw.autodetect_model()
sw.get_login_cookie()
data = sw.get_switch_infos()
print(sw.switch_model.MODEL_NAME)
print(data["port_1_sum_rx_mbytes"])
print(data)
sw.turn_off_poe_port(1) # Supported only on PoE capable models
sw.turn_on_poe_port(1)
```
Raw data
{
"_id": null,
"home_page": null,
"name": "py-netgear-plus",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "api, library, netgear, plus, switch",
"author": null,
"author_email": "Michiel Fokke <github@fokke.org>, Christian Karri\u00e9 <ckarrie@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/c5/78/fb8b748f468c4653cd0dd673ec5bd7f3d50caf825c8fb799a569bd978101/py_netgear_plus-0.4.0.tar.gz",
"platform": null,
"description": "# Python Library for NETGEAR Plus Switches\n\n## What it does\n\nGrabs statistical network data from [supported NETGEAR Switches](#supported-and-tested-netgear-modelsproducts-and-firmwares) from the\n[Plus Managed Network Switch](https://www.netgear.com/business/wired/switches/plus/) line. These switches can only be managed using a\nWeb interface and not through SNMP or cli. This library uses web scraping to collect the switch configuration, statistics and\nsome basic configuration updates.\n\n## How it works\n\n1. Detecting Switch Model/Product in login.cgi\n2. Connects to the Switch and asks for a cookie (`http://IP_OF_SWITCH/login.cgi`)\n3. HTTP-Request send to the Switch twice (`http://IP_OF_SWITCH/portStatistics.cgi`) and compared with previous data (\"in response time\")\n\n### List of port statistics\n\n| Name | key from `get_switch_infos()` | Unit |\n| ----------------------------- | ---------------------------------- | ----------------------------------- |\n| Port {port} Traffic Received | `port_{port}_traffic_rx_mbytes` | MB (in response time) |\n| Port {port} Traffic Sent | `port_{port}_traffic_tx_mbytes` | MB (in response time) |\n| Port {port} Receiving | `port_{port}_speed_rx_mbytes` | MB/s |\n| Port {port} Transferring | `port_{port}_speed_tx_mbytes` | MB/s |\n| Port {port} IO | `port_{port}_speed_io_mbytes` | MB/s |\n| Port {port} Total Received | `port_{port}_sum_rx_mbytes` | MB (since last switch reboot/reset) |\n| Port {port} Total Transferred | `port_{port}_sum_tx_mbytes` | MB (since last switch reboot/reset) |\n| Port {port} Connection Speed | `port_{port}_connection_speed` | MB/s |\n| Port {port} Status | `port_{port}_status` | \"on\"/\"off\" |\n| Port {poe_port} POE Power | `port_{poe_port}_poe_power_active` | \"on\"/\"off\" |\n\n### List of aggregated statistics\n\n| Sensor Name | key from `get_switch_infos()` | Unit |\n| ----------------------- | ----------------------------- | --------------------- |\n| Switch IO | `sum_port_speed_bps_io` | MB/s |\n| Switch Traffic Received | `sum_port_traffic_rx` | MB (in response time) |\n| Switch Traffic Sent | `sum_port_traffic_tx` | MB (in response time) |\n\n## Supported and tested NETGEAR Models/Products and firmware versions\n\n| Model | Ports | Firmware versions | Bootloader versions |\n| -------- | ----- | -------------------------------------- | ------------------- |\n| GS105E | 5 | ? | |\n| GS108E | 8 | V1.00.11 | V1.00.03 |\n| GS105Ev3 | 5 | ? | |\n| GS108Ev3 | 8 | V2.00.05, V2.06.10, V2.06.17, V2.06.24 | V2.06.01 - V2.06.03 |\n| GS305EP | 5 | V1.0.1.1 | |\n| GS305EPP | 5 | V1.0.1.4 | |\n| GS308EP | 8 | V1.0.0.10, V1.0.1.4 | |\n| GS308EPP | 8 | V1.0.1.4 | |\n| GS316EP | 16 | V1.0.4.4 | |\n| GS316EPP | 16 | V1.0.4.4 | |\n\nSupported firmware languages: GR (German), EN (English)\n\n## Unsupported models\n\n| Model | Support status |\n| --------- | --------------- |\n| GS108PEv3 | Not yet started |\n| GS105Ev2 | Not yet started |\n| GS110EMX | Not yet started |\n| XS512EM | Not yet started |\n\n## CLI usage\n\n```shell\nexport NETGEAR_PLUS_PASSWORD=s3cr3t # replace with your password\nngp-cli login 192.168.178.68 # replace with IP address of your switch\nngp-cli status\nngp-cli logout\nngp-cli -h\n```\n\n## Library Usage\n\n### Create a python virtual environment\n\n```shell\npython3 -m venv .venv\nsource .venv/bin/activate\npip install py-netgear-plus\n```\n\nUsing this VENV go to your local source folder\n\n### Example calls\n\n```shell\ncd src\npython3\n```\n\n```python\nip = '192.168.178.68' # replace with IP address of your switch\np = 'fyce4gKZemkqjDY' # replace with your password\nimport py_netgear_plus\nsw = py_netgear_plus.NetgearSwitchConnector(ip, p)\nsw.autodetect_model()\nsw.get_login_cookie()\n\ndata = sw.get_switch_infos()\nprint(sw.switch_model.MODEL_NAME)\nprint(data[\"port_1_sum_rx_mbytes\"])\nprint(data)\nsw.turn_off_poe_port(1) # Supported only on PoE capable models\nsw.turn_on_poe_port(1)\n```\n",
"bugtrack_url": null,
"license": null,
"summary": "A library for interacting with Netgear Plus switches.",
"version": "0.4.0",
"project_urls": {
"Homepage": "https://github.com/foxey/py-netgear-plus",
"Issues": "https://github.com/foxey/py-netgear-plus/issues"
},
"split_keywords": [
"api",
" library",
" netgear",
" plus",
" switch"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "82c7c0485380eeafd048760fd52dac771abe3fb798996be35072e5e17261a3b8",
"md5": "728316511a2764c4ed56ad11263dde6d",
"sha256": "8b3b04df5b7ff9157d08a37df560dd1c4d5871ac8d43e6789f0cb61864cb2ca6"
},
"downloads": -1,
"filename": "py_netgear_plus-0.4.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "728316511a2764c4ed56ad11263dde6d",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 26569,
"upload_time": "2025-01-17T15:54:34",
"upload_time_iso_8601": "2025-01-17T15:54:34.022667Z",
"url": "https://files.pythonhosted.org/packages/82/c7/c0485380eeafd048760fd52dac771abe3fb798996be35072e5e17261a3b8/py_netgear_plus-0.4.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c578fb8b748f468c4653cd0dd673ec5bd7f3d50caf825c8fb799a569bd978101",
"md5": "62fcd7144484e5621e7aa1cf301e2d9b",
"sha256": "f5f66c87d4d998aa2c2e01e243516de1be5671871c4fd3b6594fe4c297eed67e"
},
"downloads": -1,
"filename": "py_netgear_plus-0.4.0.tar.gz",
"has_sig": false,
"md5_digest": "62fcd7144484e5621e7aa1cf301e2d9b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 92977,
"upload_time": "2025-01-17T15:54:37",
"upload_time_iso_8601": "2025-01-17T15:54:37.629464Z",
"url": "https://files.pythonhosted.org/packages/c5/78/fb8b748f468c4653cd0dd673ec5bd7f3d50caf825c8fb799a569bd978101/py_netgear_plus-0.4.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-17 15:54:37",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "foxey",
"github_project": "py-netgear-plus",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "colorlog",
"specs": [
[
"==",
"6.9.0"
]
]
},
{
"name": "ruff",
"specs": [
[
"==",
"0.9.1"
]
]
},
{
"name": "hatchling",
"specs": [
[
"==",
"1.27.0"
]
]
},
{
"name": "build",
"specs": [
[
"==",
"1.2.2.post1"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.3.4"
]
]
},
{
"name": "pytest-cov",
"specs": [
[
"==",
"6.0.0"
]
]
}
],
"lcname": "py-netgear-plus"
}