diff --git a/backend/logger/logger.py b/backend/logger/logger.py index e8ea853ed..80a5e851e 100644 --- a/backend/logger/logger.py +++ b/backend/logger/logger.py @@ -4,8 +4,8 @@ from datetime import datetime from pathlib import Path from config import LOGS_BASE_PATH -from logger.stdout_formatter import StdoutFormatter -from logger.file_formatter import FileFormatter +from .stdout_formatter import StdoutFormatter +from .file_formatter import FileFormatter # Create logs folder if not exists Path(LOGS_BASE_PATH).mkdir(parents=True, exist_ok=True) diff --git a/backend/main.py b/backend/main.py index 7cf95527c..666c8cb55 100644 --- a/backend/main.py +++ b/backend/main.py @@ -8,7 +8,18 @@ from fastapi_pagination import add_pagination from starlette.middleware.authentication import AuthenticationMiddleware from starlette.middleware.sessions import SessionMiddleware -from config import DEV_PORT, DEV_HOST, ROMM_AUTH_SECRET_KEY, ROMM_AUTH_ENABLED +from config import ( + DEV_PORT, + DEV_HOST, + ROMM_AUTH_SECRET_KEY, + ROMM_AUTH_ENABLED, + ENABLE_RESCAN_ON_FILESYSTEM_CHANGE, + RESCAN_ON_FILESYSTEM_CHANGE_DELAY, + ENABLE_SCHEDULED_RESCAN, + SCHEDULED_RESCAN_CRON, + ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB, + SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON, +) from endpoints import search, platform, rom, identity, oauth, scan # noqa from handler import dbh from utils.socket import socket_app @@ -63,7 +74,15 @@ app.mount("/ws", socket_app) # Endpoint to set the CSRF token in cache @app.get("/heartbeat") def heartbeat(): - return {"ROMM_AUTH_ENABLED": ROMM_AUTH_ENABLED} + return { + "ROMM_AUTH_ENABLED": ROMM_AUTH_ENABLED, + "ENABLE_RESCAN_ON_FILESYSTEM_CHANGE": ENABLE_RESCAN_ON_FILESYSTEM_CHANGE, + "RESCAN_ON_FILESYSTEM_CHANGE_DELAY": RESCAN_ON_FILESYSTEM_CHANGE_DELAY, + "ENABLE_SCHEDULED_RESCAN": ENABLE_SCHEDULED_RESCAN, + "SCHEDULED_RESCAN_CRON": SCHEDULED_RESCAN_CRON, + "ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB": ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB, # noqa + "SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON": SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON, + } @app.on_event("startup") diff --git a/backend/scheduler.py b/backend/scheduler.py index 2a22566c9..98b38625e 100644 --- a/backend/scheduler.py +++ b/backend/scheduler.py @@ -2,6 +2,7 @@ import sys from config import ENABLE_EXPERIMENTAL_REDIS from tasks.utils import tasks_scheduler +from logger.logger import log from tasks.scan_library import scan_library_task from tasks.update_switch_titledb import update_switch_titledb_task @@ -13,5 +14,7 @@ if __name__ == "__main__": scan_library_task.init() update_switch_titledb_task.init() + log.info("Starting scheduler") + # Start the scheduler tasks_scheduler.run() diff --git a/backend/watcher.py b/backend/watcher.py index 6533dcb2c..1e096210e 100644 --- a/backend/watcher.py +++ b/backend/watcher.py @@ -71,6 +71,8 @@ if __name__ == "__main__": observer.schedule(EventHandler(), path, recursive=True) observer.start() + log.info(f"Watching {path} for changes") + try: while observer.is_alive(): observer.join(1) diff --git a/env.template b/env.template index e96bc0549..374592386 100644 --- a/env.template +++ b/env.template @@ -11,7 +11,7 @@ STEAMGRIDDB_API_KEY= # Database driver (mariadb, sqlite) ROMM_DB_DRIVER= -# Database config (only for mariadb) +# Database config (mariadb only) DB_HOST=127.0.0.1 DB_PORT=3306 DB_NAME=romm @@ -20,11 +20,22 @@ DB_PASSWD= DB_ROOT_PASSWD= # Redis config (optional) +ENABLE_EXPERIMENTAL_REDIS=true REDIS_HOST=127.0.0.1 REDIS_PORT=6379 -# Authentication -ROMM_AUTH_SECRET_KEY= +# Authentication (optional) ROMM_AUTH_ENABLED=true ROMM_AUTH_USERNAME=admin ROMM_AUTH_PASSWORD=admin +ROMM_AUTH_SECRET_KEY= + +# Filesystem watcher (optional) +ENABLE_RESCAN_ON_FILESYSTEM_CHANGE=true +RESCAN_ON_FILESYSTEM_CHANGE_DELAY=5 + +# Periodic Tasks (optional) +ENABLE_SCHEDULED_RESCAN=true +SCHEDULED_RESCAN_CRON=0 3 * * * +ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB=true +SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON=0 4 * * * diff --git a/frontend/package-lock.json b/frontend/package-lock.json index abda9fdf7..78829f45b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,6 +11,7 @@ "@mdi/font": "7.0.96", "axios": "^1.3.4", "core-js": "^3.8.3", + "cronstrue": "^2.31.0", "file-saver": "^2.0.5", "js-cookie": "^3.0.5", "jszip": "^3.10.1", @@ -2796,6 +2797,14 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/cronstrue": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.31.0.tgz", + "integrity": "sha512-A1cyfGyLSRdvT9MNn/pggoCTlvxnJyiCUItU9XHSXk89ZyK2YY9q9q7Rf4j8NhV9YwN1BjB0wimZlvKYb/9Bwg==", + "bin": { + "cronstrue": "bin/cli.js" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index b9d84fead..3536ecb36 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "@mdi/font": "7.0.96", "axios": "^1.3.4", "core-js": "^3.8.3", + "cronstrue": "^2.31.0", "file-saver": "^2.0.5", "js-cookie": "^3.0.5", "jszip": "^3.10.1", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index cd08b2228..fc05eeca0 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -3,7 +3,7 @@ import { onBeforeMount } from "vue"; import cookie from "js-cookie"; import storeAuth from "@/stores/auth"; import Notification from "@/components/Notification.vue"; -import { api } from "./services/api"; +import { api } from "@/services/api"; // Props const auth = storeAuth(); diff --git a/frontend/src/views/Settings/General/Settings.vue b/frontend/src/views/Settings/General/Settings.vue index 4e9a2c493..f6e7af598 100644 --- a/frontend/src/views/Settings/General/Settings.vue +++ b/frontend/src/views/Settings/General/Settings.vue @@ -1,14 +1,24 @@ + +