Skip to content

Commit 1512d29

Browse files
committed
fix client command-line argument parsing
1 parent 27e85c9 commit 1512d29

5 files changed

Lines changed: 74 additions & 25 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ jobs:
2626
- name: Check clients, WebUI and shell scripts
2727
run: |
2828
python3 -m py_compile clients/client-linux.py clients/client-psutil.py
29+
python3 -m unittest clients/test_client_args.py
2930
sh -n clients/entrypoint.sh
3031
bash -n status.sh
3132
node --check web/js/app.js

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ docker run -d --restart=always --name=serverstatus-server \
4040
- 健康检查:http://127.0.0.1:8080/api/health
4141
- API 描述:http://127.0.0.1:8080/api/schema
4242
- OpenAPI 3.1:http://127.0.0.1:8080/api/openapi.json
43-
- 客户端上报端口:`35601/tcp`,`ADMIN_TOKEN` 不设置时,监控页面仍可读取,管理 API 返回 `503`,WebUI 的“配置”页不能修改数据。
43+
- 客户端上报端口:`35601/tcp`
44+
45+
`ADMIN_TOKEN` 不设置时,监控页面仍可读取,管理 API 返回 `503`,WebUI 的“配置”页不能修改数据。
4446

4547
## 二、客户端
4648

@@ -319,7 +321,7 @@ docker compose -f docker-compose-server.yml config
319321
docker compose -f docker-compose-client.yml config
320322
```
321323

322-
CI 还会检查 Go 格式、Python 客户端、Shell 脚本、WebUI JavaScript、主服务/客户端/Telegram Compose 文件和两个 Docker 镜像。
324+
CI 还会检查 Go 格式、Python 客户端、Shell 脚本、WebUI JavaScript、服务端/客户端 Compose 文件和两个 Docker 镜像。
323325

324326
## 从旧服务端迁移
325327

@@ -335,4 +337,4 @@ CI 还会检查 Go 格式、Python 客户端、Shell 脚本、WebUI JavaScript
335337
## 致谢
336338

337339
- BotoX:https://github.com/BotoX/ServerStatus
338-
- mojeda:https://github.com/mojeda/ServerStatus
340+
- mojeda:https://github.com/mojeda/ServerStatus

clients/client-linux.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ def _env_int(name, default):
6060
CT = _env_str("CT", CT)
6161
CM = _env_str("CM", CM)
6262

63+
def parse_cli_args(arguments):
64+
overrides = {}
65+
for argument in arguments:
66+
key, separator, value = argument.partition('=')
67+
if separator and key in {'SERVER', 'PORT', 'USER', 'PASSWORD', 'INTERVAL'}:
68+
overrides[key] = value
69+
return overrides
70+
6371
def get_uptime():
6472
with open('/proc/uptime', 'r') as f:
6573
uptime = f.readline().split('.', 2)
@@ -509,17 +517,12 @@ def byte_str(object):
509517
print(type(object))
510518

511519
if __name__ == '__main__':
512-
for argc in sys.argv:
513-
if 'SERVER' in argc:
514-
SERVER = argc.split('SERVER=')[-1]
515-
elif 'PORT' in argc:
516-
PORT = int(argc.split('PORT=')[-1])
517-
elif 'USER' in argc:
518-
USER = argc.split('USER=')[-1]
519-
elif 'PASSWORD' in argc:
520-
PASSWORD = argc.split('PASSWORD=')[-1]
521-
elif 'INTERVAL' in argc:
522-
INTERVAL = int(argc.split('INTERVAL=')[-1])
520+
cli_args = parse_cli_args(sys.argv[1:])
521+
SERVER = cli_args.get('SERVER', SERVER)
522+
PORT = int(cli_args.get('PORT', PORT))
523+
USER = cli_args.get('USER', USER)
524+
PASSWORD = cli_args.get('PASSWORD', PASSWORD)
525+
INTERVAL = int(cli_args.get('INTERVAL', INTERVAL))
523526
socket.setdefaulttimeout(30)
524527
get_realtime_data()
525528
while True:

clients/client-psutil.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ def _env_int(name, default):
6060
CT = _env_str("CT", CT)
6161
CM = _env_str("CM", CM)
6262

63+
def parse_cli_args(arguments):
64+
overrides = {}
65+
for argument in arguments:
66+
key, separator, value = argument.partition('=')
67+
if separator and key in {'SERVER', 'PORT', 'USER', 'PASSWORD', 'INTERVAL'}:
68+
overrides[key] = value
69+
return overrides
70+
6371
def get_uptime():
6472
return int(time.time() - psutil.boot_time())
6573

@@ -456,17 +464,12 @@ def byte_str(object):
456464
print(type(object))
457465

458466
if __name__ == '__main__':
459-
for argc in sys.argv:
460-
if 'SERVER' in argc:
461-
SERVER = argc.split('SERVER=')[-1]
462-
elif 'PORT' in argc:
463-
PORT = int(argc.split('PORT=')[-1])
464-
elif 'USER' in argc:
465-
USER = argc.split('USER=')[-1]
466-
elif 'PASSWORD' in argc:
467-
PASSWORD = argc.split('PASSWORD=')[-1]
468-
elif 'INTERVAL' in argc:
469-
INTERVAL = int(argc.split('INTERVAL=')[-1])
467+
cli_args = parse_cli_args(sys.argv[1:])
468+
SERVER = cli_args.get('SERVER', SERVER)
469+
PORT = int(cli_args.get('PORT', PORT))
470+
USER = cli_args.get('USER', USER)
471+
PASSWORD = cli_args.get('PASSWORD', PASSWORD)
472+
INTERVAL = int(cli_args.get('INTERVAL', INTERVAL))
470473
socket.setdefaulttimeout(30)
471474
get_realtime_data()
472475
while 1:

clients/test_client_args.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import importlib.util
2+
import runpy
3+
import sys
4+
import types
5+
import unittest
6+
from pathlib import Path
7+
8+
9+
CLIENT_DIR = Path(__file__).resolve().parent
10+
11+
12+
class ClientArgumentTests(unittest.TestCase):
13+
def test_password_with_user_text_does_not_replace_username(self):
14+
if importlib.util.find_spec("psutil") is None:
15+
sys.modules["psutil"] = types.ModuleType("psutil")
16+
17+
arguments = [
18+
"SERVER=127.0.0.1",
19+
"PORT=35601",
20+
"USER=s01",
21+
"PASSWORD=USER_DEFAULT_PASSWORD",
22+
"INTERVAL=2",
23+
"NOTUSER=ignored",
24+
]
25+
expected = {
26+
"SERVER": "127.0.0.1",
27+
"PORT": "35601",
28+
"USER": "s01",
29+
"PASSWORD": "USER_DEFAULT_PASSWORD",
30+
"INTERVAL": "2",
31+
}
32+
33+
for filename in ("client-linux.py", "client-psutil.py"):
34+
with self.subTest(client=filename):
35+
namespace = runpy.run_path(str(CLIENT_DIR / filename))
36+
self.assertEqual(namespace["parse_cli_args"](arguments), expected)
37+
38+
39+
if __name__ == "__main__":
40+
unittest.main()

0 commit comments

Comments
 (0)