"""Log viewing API blueprint. Wraps raw log text in the standard JSON response contract. """ import logging from flask import Blueprint from daemon.client import NotFound, get from daemon.iface import ( GET_LOGS_APP, GET_LOGS_DNSMASQ, GET_LOGS_JOURNAL, GET_LOGS_NGINX_ACCESS, GET_LOGS_NGINX_ERROR, ) from webui.api.common import _error, _ok logger = logging.getLogger(__name__) bp = Blueprint("logs", __name__) @bp.route("/journal") def journal(): """GET /api/logs/journal — Return systemd journal log lines.""" try: return _ok(get(GET_LOGS_JOURNAL)) except RuntimeError: return _error("error reading journal", 500) @bp.route("/nginx/access") def nginx_access(): """GET /api/logs/nginx/access — Return nginx access log lines.""" try: return _ok(get(GET_LOGS_NGINX_ACCESS)) except NotFound: return _error("log file not found", 404) except RuntimeError: return _error("error reading log", 500) @bp.route("/nginx/error") def nginx_error(): """GET /api/logs/nginx/error — Return nginx error log lines.""" try: return _ok(get(GET_LOGS_NGINX_ERROR)) except NotFound: return _error("log file not found", 404) except RuntimeError: return _error("error reading log", 500) @bp.route("/dnsmasq") def dnsmasq(): """GET /api/logs/dnsmasq — Return dnsmasq log lines.""" try: return _ok(get(GET_LOGS_DNSMASQ)) except RuntimeError: return _error("error reading journal", 500) @bp.route("/app") def app_log(): """GET /api/logs/app — Return application log lines.""" try: return _ok(get(GET_LOGS_APP)) except NotFound: return _error("log file not found", 404) except RuntimeError: return _error("error reading log", 500)