From e44b0d898693a82d9b93f3c0ddb65d2792298413 Mon Sep 17 00:00:00 2001 From: Benjamin <> Date: Thu, 2 Oct 2025 07:56:16 +0200 Subject: [PATCH] implemented sleep mode --- qnapstats/qnap_stats.py | 25 +++++++++++++++++++++++++ tests/test-models.py | 11 ++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/qnapstats/qnap_stats.py b/qnapstats/qnap_stats.py index 1758738..4e59b26 100644 --- a/qnapstats/qnap_stats.py +++ b/qnapstats/qnap_stats.py @@ -92,6 +92,17 @@ def _execute_get_url(self, url, append_sid=True, **kwargs): resp = self._session.get(url, timeout=self._timeout, verify=self._verify_ssl) return self._handle_response(resp, **kwargs) + def _post_url(self, url, data, retry_on_error=False, **kwargs): + """High-level function for making POST requests.""" + self._init_session() + + result = self._execute_post_url(url, data, **kwargs) + if (self._session_error or result is None) and retry_on_error: + self._debuglog("Error occured, retrying...") + self._get_url(url, False, **kwargs) + + return result + def _execute_post_url(self, url, data, append_sid=True, **kwargs): """Low-level function to execute a POST request.""" url = self._base_url + url @@ -376,3 +387,17 @@ def get_storage_information_on_external_device(self): return None return disk_vol + + def put_in_sleep_mode(self): + """Put the qnap in sleep mode.""" + data = { + "subfunc": "power_mgmt", + "apply": "s3", + } + # It is expected to end in read timeout + try: + resp = self._post_url("sys/sysRequest.cgi", data=data) + except requests.exceptions.ReadTimeout: + return None + + return resp diff --git a/tests/test-models.py b/tests/test-models.py index 3203075..52813c0 100644 --- a/tests/test-models.py +++ b/tests/test-models.py @@ -4,6 +4,7 @@ import json import os import qnapstats +import requests import responses @@ -92,13 +93,19 @@ def add_mock_responses(rsps, directory): status=200, content_type='text/xml') + # Sleep mode succeeds but fails in timeout + rsps.add(responses.POST, + 'http://localhost:8080/cgi-bin/sys/sysRequest.cgi', + body=requests.exceptions.ReadTimeout(), + content_type='text/xml') + def file_get_contents(directory, file): file = os.path.join(response_directory, directory, file) if not os.path.exists(file): return None - with open(file, 'r') as myfile: + with open(file, 'r', encoding='utf-8') as myfile: return myfile.read() @@ -130,3 +137,5 @@ def file_get_contents(directory, file): firmwareupdate = file_get_contents(model_directory, 'firmwareupdate.json') if firmwareupdate is not None: assert json.dumps(qnap.get_firmware_update(), sort_keys=True) == firmwareupdate + + assert qnap.put_in_sleep_mode() is None