From 2c91d6f100f51f933af2bc73cc001a2b71307fb7 Mon Sep 17 00:00:00 2001 From: devmatrix Date: Fri, 20 Feb 2026 15:39:18 +0000 Subject: [PATCH] Working auth system --- data/config.json | 45 +++++++++ data/users.json | 1 + reset_password.py | 30 ++++++ server.log | 252 +++++++++++++++++++++++++++++++++++++++++++++- web_server.py | 58 ++++++++--- 5 files changed, 371 insertions(+), 15 deletions(-) create mode 100644 data/config.json create mode 100644 data/users.json create mode 100644 reset_password.py diff --git a/data/config.json b/data/config.json new file mode 100644 index 0000000..59135c9 --- /dev/null +++ b/data/config.json @@ -0,0 +1,45 @@ +{ + "ipmi_host": "192.168.5.191", + "ipmi_username": "root", + "ipmi_password": "calvin", + "ipmi_port": 623, + "ssh_enabled": false, + "ssh_host": null, + "ssh_username": null, + "ssh_password": null, + "ssh_use_key": false, + "ssh_key_file": null, + "ssh_port": 22, + "enabled": true, + "interval": 10, + "min_speed": 10, + "max_speed": 100, + "fan_curve": [ + { + "temp": 30, + "speed": 15 + }, + { + "temp": 40, + "speed": 25 + }, + { + "temp": 50, + "speed": 40 + }, + { + "temp": 60, + "speed": 60 + }, + { + "temp": 70, + "speed": 80 + }, + { + "temp": 80, + "speed": 100 + } + ], + "panic_temp": 85, + "panic_speed": 100 +} \ No newline at end of file diff --git a/data/users.json b/data/users.json new file mode 100644 index 0000000..eb8443e --- /dev/null +++ b/data/users.json @@ -0,0 +1 @@ +{"users": {"admin": "ecd71870d1963316a97e3ac3408c9835ad8cf0f3c1bc703527c30265534f75ae"}} \ No newline at end of file diff --git a/reset_password.py b/reset_password.py new file mode 100644 index 0000000..02d3d2d --- /dev/null +++ b/reset_password.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +"""Reset password for fan controller""" +import json +import hashlib +import sys + +USERS_FILE = "/home/devmatrix/projects/fan-controller-v2/data/users.json" + +def hash_password(password): + return hashlib.sha256(password.encode()).hexdigest() + +if len(sys.argv) != 3: + print("Usage: reset_password.py ") + sys.exit(1) + +username = sys.argv[1] +password = sys.argv[2] + +try: + with open(USERS_FILE) as f: + data = json.load(f) + + data["users"][username] = hash_password(password) + + with open(USERS_FILE, 'w') as f: + json.dump(data, f) + + print(f"Password reset for user: {username}") +except Exception as e: + print(f"Error: {e}") diff --git a/server.log b/server.log index cc7cf1b..d2d448a 100644 --- a/server.log +++ b/server.log @@ -1,7 +1,255 @@ /home/devmatrix/projects/fan-controller-v2/web_server.py:49: PydanticDeprecatedSince20: Pydantic V1 style `@validator` validators are deprecated. You should migrate to Pydantic V2 style `@field_validator` validators, see the migration guide for more details. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/ @validator('new_password') -INFO: Started server process [888347] +INFO: Started server process [893663] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) -INFO: 127.0.0.1:44244 - "GET /api/status HTTP/1.1" 401 Unauthorized +INFO: 192.168.5.30:56770 - "GET /api/status HTTP/1.1" 401 Unauthorized +INFO: 192.168.5.30:56770 - "GET /login HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "POST /api/auth/login HTTP/1.1" 200 OK +INFO: 127.0.0.1:34494 - "GET /api/status HTTP/1.1" 401 Unauthorized +/home/devmatrix/projects/fan-controller-v2/web_server.py:141: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). + expiry = datetime.utcnow() + timedelta(days=7) +INFO: 192.168.5.30:49736 - "POST /api/auth/login HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET / HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:149: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). + if datetime.utcnow() > expiry: +2026-02-20 15:37:16,554 - fan_controller - INFO - Loaded config from /home/devmatrix/projects/fan-controller-v2/data/config.json +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /favicon.ico HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +INFO: 127.0.0.1:34498 - "POST /api/auth/login HTTP/1.1" 200 OK +INFO: 127.0.0.1:34506 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 15:37:24,066 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +2026-02-20 15:37:24,068 - fan_controller - ERROR - IPMI command error: [Errno 2] No such file or directory: 'ipmitool' +2026-02-20 15:37:24,069 - fan_controller - ERROR - Failed to connect to IPMI at 192.168.5.191 +INFO: 192.168.5.30:49736 - "POST /api/config/ipmi HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:149: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). + if datetime.utcnow() > expiry: +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /favicon.ico HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 15:37:27,369 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +2026-02-20 15:37:27,370 - fan_controller - ERROR - IPMI command error: [Errno 2] No such file or directory: 'ipmitool' +2026-02-20 15:37:27,371 - fan_controller - ERROR - Failed to connect to IPMI at 192.168.5.191 +2026-02-20 15:37:27,371 - fan_controller - ERROR - Cannot start service - IPMI connection failed +INFO: 192.168.5.30:49736 - "POST /api/control/auto HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:149: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). + if datetime.utcnow() > expiry: +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +INFO: 127.0.0.1:37104 - "GET / HTTP/1.1" 200 OK +INFO: 127.0.0.1:37118 - "GET /login HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:141: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). + expiry = datetime.utcnow() + timedelta(days=7) +INFO: 127.0.0.1:37130 - "POST /api/auth/login HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +2026-02-20 15:37:33,643 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +INFO: 192.168.5.30:49736 - "POST /api/control/auto HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:49736 - "POST /api/control/manual HTTP/1.1" 500 Internal Server Error +ERROR: Exception in ASGI application +Traceback (most recent call last): + File "/home/devmatrix/.local/lib/python3.12/site-packages/uvicorn/protocols/http/httptools_impl.py", line 419, in run_asgi + result = await app( # type: ignore[func-returns-value] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/uvicorn/middleware/proxy_headers.py", line 84, in __call__ + return await self.app(scope, receive, send) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/applications.py", line 123, in __call__ + await self.middleware_stack(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__ + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/cors.py", line 91, in __call__ + await self.simple_response(scope, receive, send, request_headers=headers) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/cors.py", line 146, in simple_response + await self.app(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + await app(scope, receive, sender) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 762, in __call__ + await self.middleware_stack(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 782, in app + await route.handle(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 297, in handle + await self.app(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 77, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + await app(scope, receive, sender) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 72, in app + response = await func(request) + ^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 299, in app + raise e + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 294, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 191, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/projects/fan-controller-v2/web_server.py", line 1352, in api_control_manual + if not service._init_controller(): + ^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'FanControlService' object has no attribute '_init_controller'. Did you mean: '_init_ipmi_controller'? +2026-02-20 15:37:36,531 - fan_controller - INFO - Saved config to /home/devmatrix/projects/fan-controller-v2/data/config.json +2026-02-20 15:37:36,533 - fan_controller - ERROR - IPMI command error: [Errno 2] No such file or directory: 'ipmitool' +2026-02-20 15:37:36,533 - fan_controller - ERROR - Failed to connect to IPMI at 192.168.5.191 +2026-02-20 15:37:36,533 - fan_controller - ERROR - Cannot start service - IPMI connection failed +INFO: 192.168.5.30:62376 - "POST /api/control/auto HTTP/1.1" 200 OK +/home/devmatrix/projects/fan-controller-v2/web_server.py:149: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). + if datetime.utcnow() > expiry: +INFO: 192.168.5.30:62376 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:62376 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:62376 - "POST /api/control/manual HTTP/1.1" 500 Internal Server Error +ERROR: Exception in ASGI application +Traceback (most recent call last): + File "/home/devmatrix/.local/lib/python3.12/site-packages/uvicorn/protocols/http/httptools_impl.py", line 419, in run_asgi + result = await app( # type: ignore[func-returns-value] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/uvicorn/middleware/proxy_headers.py", line 84, in __call__ + return await self.app(scope, receive, send) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/applications.py", line 123, in __call__ + await self.middleware_stack(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__ + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/cors.py", line 91, in __call__ + await self.simple_response(scope, receive, send, request_headers=headers) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/cors.py", line 146, in simple_response + await self.app(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + await app(scope, receive, sender) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 762, in __call__ + await self.middleware_stack(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 782, in app + await route.handle(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 297, in handle + await self.app(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 77, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + await app(scope, receive, sender) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 72, in app + response = await func(request) + ^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 299, in app + raise e + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 294, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 191, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/projects/fan-controller-v2/web_server.py", line 1352, in api_control_manual + if not service._init_controller(): + ^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'FanControlService' object has no attribute '_init_controller'. Did you mean: '_init_ipmi_controller'? +INFO: 192.168.5.30:55640 - "POST /api/test HTTP/1.1" 500 Internal Server Error +ERROR: Exception in ASGI application +Traceback (most recent call last): + File "/home/devmatrix/.local/lib/python3.12/site-packages/uvicorn/protocols/http/httptools_impl.py", line 419, in run_asgi + result = await app( # type: ignore[func-returns-value] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/uvicorn/middleware/proxy_headers.py", line 84, in __call__ + return await self.app(scope, receive, send) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/applications.py", line 123, in __call__ + await self.middleware_stack(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__ + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__ + await self.app(scope, receive, _send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/cors.py", line 91, in __call__ + await self.simple_response(scope, receive, send, request_headers=headers) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/cors.py", line 146, in simple_response + await self.app(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + await app(scope, receive, sender) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 762, in __call__ + await self.middleware_stack(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 782, in app + await route.handle(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 297, in handle + await self.app(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 77, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 64, in wrapped_app + raise exc + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + await app(scope, receive, sender) + File "/home/devmatrix/.local/lib/python3.12/site-packages/starlette/routing.py", line 72, in app + response = await func(request) + ^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 299, in app + raise e + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 294, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/.local/lib/python3.12/site-packages/fastapi/routing.py", line 191, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/home/devmatrix/projects/fan-controller-v2/web_server.py", line 1323, in api_test + if not service._init_controller(): + ^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'FanControlService' object has no attribute '_init_controller'. Did you mean: '_init_ipmi_controller'? +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:61984 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK +INFO: 192.168.5.30:63389 - "GET /api/status HTTP/1.1" 200 OK diff --git a/web_server.py b/web_server.py index 44f4b17..a34ffb4 100644 --- a/web_server.py +++ b/web_server.py @@ -171,6 +171,7 @@ LOGIN_HTML = ''' + Login - IPMI Fan Controller