/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 [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: 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