From ee504e09a102a7b15cbdecc7ca10376077d6c6b9 Mon Sep 17 00:00:00 2001 From: Quentin POLLET Date: Sat, 2 May 2020 11:46:06 +0200 Subject: [PATCH] Add API SYNO.DSM.Network --- synology_dsm/api/dsm/network.py | 57 +++++++++++++++++++ synology_dsm/synology_dsm.py | 10 ++++ tests/__init__.py | 6 ++ tests/api_data/dsm_6/__init__.py | 1 + .../api_data/dsm_6/dsm/const_6_dsm_network.py | 38 +++++++++++++ tests/test_synology_dsm.py | 12 ++++ 6 files changed, 124 insertions(+) create mode 100644 synology_dsm/api/dsm/network.py create mode 100644 tests/api_data/dsm_6/dsm/const_6_dsm_network.py diff --git a/synology_dsm/api/dsm/network.py b/synology_dsm/api/dsm/network.py new file mode 100644 index 00000000..4a68f103 --- /dev/null +++ b/synology_dsm/api/dsm/network.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +"""DSM Network data.""" + + +class SynoDSMNetwork(object): + """Class containing Network data.""" + + API_KEY = "SYNO.DSM.Network" + + def __init__(self, raw_data): + self._data = {} + self.update(raw_data) + + def update(self, raw_data): + """Updates network data.""" + if raw_data: + self._data = raw_data["data"] + + @property + def dns(self): + """DNS of the NAS.""" + return self._data.get("dns") + + @property + def gateway(self): + """Gateway of the NAS.""" + return self._data.get("gateway") + + @property + def hostname(self): + """Host name of the NAS.""" + return self._data.get("hostname") + + @property + def interfaces(self): + """Interfaces of the NAS.""" + return self._data.get("interfaces", []) + + def interface(self, eth_id): + """Interface of the NAS.""" + for interface in self.interfaces: + if interface["id"] == eth_id: + return interface + return None + + @property + def macs(self): + """MACs of the NAS.""" + macs = [] + for interface in self.interfaces: + macs.append(interface["mac"]) + return macs + + @property + def workgroup(self): + """Workgroup of the NAS.""" + return self._data.get("workgroup") diff --git a/synology_dsm/synology_dsm.py b/synology_dsm/synology_dsm.py index d6b1a4d1..3f8c2b36 100644 --- a/synology_dsm/synology_dsm.py +++ b/synology_dsm/synology_dsm.py @@ -19,6 +19,7 @@ ) from .api.core.utilization import SynoCoreUtilization from .api.dsm.information import SynoDSMInformation +from .api.dsm.network import SynoDSMNetwork from .api.storage.storage import SynoStorage @@ -60,6 +61,7 @@ def __init__( "SYNO.API.Info": {"maxVersion": 1, "minVersion": 1, "path": "query.cgi"} } self._information = None + self._network = None self._utilisation = None self._storage = None @@ -273,6 +275,14 @@ def information(self): self._information = SynoDSMInformation(data) return self._information + @property + def network(self): + """Gets NAS network informations.""" + if not self._network: + data = self.get(SynoDSMNetwork.API_KEY, "list") + self._network = SynoDSMNetwork(data) + return self._network + @property def utilisation(self): """Gets NAS utilisation informations.""" diff --git a/tests/__init__.py b/tests/__init__.py index f029b0ff..4e7e696b 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -8,6 +8,7 @@ from synology_dsm.exceptions import SynologyDSMRequestException from synology_dsm.api.core.utilization import SynoCoreUtilization from synology_dsm.api.dsm.information import SynoDSMInformation +from synology_dsm.api.dsm.network import SynoDSMNetwork from synology_dsm.api.storage.storage import SynoStorage from .const import ( @@ -22,6 +23,7 @@ DSM_6_AUTH_LOGIN_2SA, DSM_6_AUTH_LOGIN_2SA_OTP, DSM_6_DSM_INFORMATION, + DSM_6_DSM_NETWORK, DSM_6_CORE_UTILIZATION, DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS, DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL, @@ -54,6 +56,7 @@ "AUTH_LOGIN_2SA": DSM_6_AUTH_LOGIN_2SA, "AUTH_LOGIN_2SA_OTP": DSM_6_AUTH_LOGIN_2SA_OTP, "DSM_INFORMATION": DSM_6_DSM_INFORMATION, + "DSM_NETWORK": DSM_6_DSM_NETWORK, "CORE_UTILIZATION": DSM_6_CORE_UTILIZATION, "STORAGE_STORAGE": { "RAID": DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL, @@ -168,6 +171,9 @@ def _execute_request(self, method, url, **kwargs): if SynoDSMInformation.API_KEY in url: return API_SWITCHER[self.dsm_version]["DSM_INFORMATION"] + if SynoDSMNetwork.API_KEY in url: + return API_SWITCHER[self.dsm_version]["DSM_NETWORK"] + if SynoCoreUtilization.API_KEY in url: return API_SWITCHER[self.dsm_version]["CORE_UTILIZATION"] diff --git a/tests/api_data/dsm_6/__init__.py b/tests/api_data/dsm_6/__init__.py index 55bdcf92..aeb1e09a 100644 --- a/tests/api_data/dsm_6/__init__.py +++ b/tests/api_data/dsm_6/__init__.py @@ -7,6 +7,7 @@ ) from .core.const_6_core_utilization import DSM_6_CORE_UTILIZATION from .dsm.const_6_dsm_info import DSM_6_DSM_INFORMATION +from .dsm.const_6_dsm_network import DSM_6_DSM_NETWORK from .storage.const_6_storage_storage import ( DSM_6_STORAGE_STORAGE_DS213_PLUS_SHR1_2DISKS_2VOLS, DSM_6_STORAGE_STORAGE_DS918_PLUS_RAID5_3DISKS_1VOL, diff --git a/tests/api_data/dsm_6/dsm/const_6_dsm_network.py b/tests/api_data/dsm_6/dsm/const_6_dsm_network.py new file mode 100644 index 00000000..48304626 --- /dev/null +++ b/tests/api_data/dsm_6/dsm/const_6_dsm_network.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +"""DSM 6 SYNO.DSM.Network data.""" + +DSM_6_DSM_NETWORK = { + "data": { + "dns": ["192.168.0.35"], + "gateway": "192.168.0.254", + "hostname": "NAS_[NAME]", + "interfaces": [ + { + "id": "eth0", + "ip": [{"address": "192.168.0.35", "netmask": "255.255.255.0"}], + "ipv6": [ + { + "address": "2a01:e35:2434:d420:211:32ff:fea6:ca59", + "prefix_length": 64, + "scope": "global", + }, + { + "address": "fe80::211:32ff:fea6:ca59", + "prefix_length": 64, + "scope": "link", + }, + ], + "mac": "00-11-32-XX-XX-59", + "type": "lan", + }, + { + "id": "eth1", + "ip": [{"address": "169.254.158.209", "netmask": "255.255.0.0"}], + "mac": "00-11-32-XX-XX-5A", + "type": "lan", + }, + ], + "workgroup": "WORKGROUP", + }, + "success": True, +} diff --git a/tests/test_synology_dsm.py b/tests/test_synology_dsm.py index 2fd9171c..6d934add 100644 --- a/tests/test_synology_dsm.py +++ b/tests/test_synology_dsm.py @@ -200,6 +200,18 @@ def test_information(self): assert self.api.information.version == "24922" assert self.api.information.version_string == "DSM 6.2.2-24922 Update 4" + def test_network(self): + """Test network.""" + assert self.api.network + assert self.api.network.dns + assert self.api.network.gateway + assert self.api.network.hostname + assert self.api.network.interfaces + assert self.api.network.interface("eth0") + assert self.api.network.interface("eth1") + assert self.api.network.macs + assert self.api.network.workgroup + def test_utilisation(self): """Test utilization.""" assert self.api.utilisation