From 365c39a71049d0eebeabfdf9602ae769061db1ac Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Thu, 29 Apr 2021 12:43:22 +0200 Subject: [PATCH 1/2] Add `SystemInfo` model. --- compal/models.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/compal/models.py b/compal/models.py index 44ec719..db5423b 100644 --- a/compal/models.py +++ b/compal/models.py @@ -4,6 +4,16 @@ from typing import Optional, List +@dataclass +class SystemInfo: + docsis_mode: Optional[str] = None + hardware_version: Optional[str] = None + mac_address: Optional[str] = None + serial_number: Optional[str] = None + uptime: Optional[int] = None + network_access: Optional[str] = None + + @dataclass class BandSetting: radio: Optional[int] = None From f9b1deb969aefb5e54af0483805235d66881cf4e Mon Sep 17 00:00:00 2001 From: Markus Reiter Date: Thu, 29 Apr 2021 12:49:33 +0200 Subject: [PATCH 2/2] Add `system_info` method. --- compal/__init__.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/compal/__init__.py b/compal/__init__.py index 32771d0..3c1fb15 100644 --- a/compal/__init__.py +++ b/compal/__init__.py @@ -5,9 +5,11 @@ import io import itertools import logging +import re import time import urllib from collections import OrderedDict +from datetime import timedelta from enum import Enum from xml.dom import minidom @@ -24,6 +26,7 @@ PortForward, Proto, RadioSettings, + SystemInfo, TimerMode, ) @@ -228,6 +231,50 @@ def parse_response(text): return res + def system_info(self): + """ + Get system information + """ + system_info = SystemInfo() + + parser = etree.XMLParser(recover=True) + res = self.xml_getter(GetFunction.CM_SYSTEM_INFO, {}) + xml = etree.fromstring(res.content, parser=parser) + + cm_docsis_mode = xml.find("cm_docsis_mode") + if cm_docsis_mode is not None: + system_info.docsis_mode = cm_docsis_mode.text + + cm_hardware_version = xml.find("cm_hardware_version") + if cm_hardware_version is not None: + system_info.hardware_version = cm_hardware_version.text + + cm_mac_addr = xml.find("cm_mac_addr") + if cm_mac_addr is not None: + system_info.mac_address = cm_mac_addr.text + + cm_serial_number = xml.find("cm_serial_number") + if cm_serial_number is not None: + system_info.serial_number = cm_serial_number.text + + cm_system_uptime = xml.find("cm_system_uptime") + if cm_system_uptime is not None: + match = re.match( + r"^(\d+)day(?:\(s\))?(\d+)h?\:(\d+)m?\:(\d+)s?$", cm_system_uptime.text + ) + system_info.uptime = timedelta( + days=int(match[1]), + hours=int(match[2]), + minutes=int(match[3]), + seconds=int(match[4]), + ) + + cm_network_access = xml.find("cm_network_access") + if cm_network_access is not None: + system_info.network_access = cm_network_access.text + + return system_info + def reboot(self): """ Reboot the router