feat: netmover serve und reset-password, ruhigere Scheduler-Logs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
2b0b039aeb
commit
2770c2e204
+37
-4
@@ -1,7 +1,5 @@
|
||||
"""Kommandozeile: ``netmover migrate`` / ``netmover version``.
|
||||
|
||||
``netmover serve`` folgt mit dem Web-Teil (Schritt 5).
|
||||
"""
|
||||
"""Kommandozeile: ``netmover serve`` / ``netmover migrate`` / ``netmover version``
|
||||
/ ``netmover reset-password``."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -22,6 +20,11 @@ def main(argv: Sequence[str] | None = None) -> int:
|
||||
sub = parser.add_subparsers(dest="cmd", required=True)
|
||||
sub.add_parser("version", help="Version ausgeben")
|
||||
sub.add_parser("migrate", help="Datenbank auf den neuesten Stand bringen")
|
||||
sub.add_parser("serve", help="Dienst mit Weboberfläche starten")
|
||||
sub.add_parser(
|
||||
"reset-password",
|
||||
help="Administratorpasswort löschen – beim nächsten Aufruf startet die Einrichtung",
|
||||
)
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
settings = get_settings()
|
||||
@@ -35,6 +38,36 @@ def main(argv: Sequence[str] | None = None) -> int:
|
||||
upgrade(settings.effective_database_url)
|
||||
event(log, "db.migrated", url=settings.effective_database_url)
|
||||
return 0
|
||||
if args.cmd == "serve":
|
||||
import uvicorn
|
||||
|
||||
from netmover.web.app import create_app
|
||||
|
||||
uvicorn.run(
|
||||
create_app(settings),
|
||||
host=settings.host,
|
||||
port=settings.port,
|
||||
log_config=None, # unser strukturiertes Logging
|
||||
proxy_headers=True,
|
||||
forwarded_allow_ips=settings.forwarded_allow_ips,
|
||||
server_header=False,
|
||||
)
|
||||
return 0
|
||||
if args.cmd == "reset-password":
|
||||
from netmover.db import make_engine, make_session_factory
|
||||
from netmover.models import Setting
|
||||
from netmover.web.auth import PASSWORD_KEY
|
||||
|
||||
upgrade(settings.effective_database_url)
|
||||
engine = make_engine(settings.effective_database_url)
|
||||
with make_session_factory(engine)() as s:
|
||||
row = s.get(Setting, PASSWORD_KEY)
|
||||
if row is not None:
|
||||
s.delete(row)
|
||||
s.commit()
|
||||
engine.dispose()
|
||||
print("Passwort gelöscht. Dienst neu starten; der Einrichtungscode steht im Log.")
|
||||
return 0
|
||||
return 2
|
||||
|
||||
|
||||
|
||||
@@ -62,6 +62,9 @@ def setup_logging(level: str = "INFO", fmt: str = "logfmt") -> None:
|
||||
lg = logging.getLogger(name)
|
||||
lg.handlers[:] = []
|
||||
lg.propagate = True
|
||||
# APScheduler meldet jeden Job-Start auf INFO – bei 30-s-Intervallen nur Rauschen.
|
||||
if level != "DEBUG":
|
||||
logging.getLogger("apscheduler").setLevel(logging.WARNING)
|
||||
|
||||
|
||||
def get_logger(name: str) -> logging.Logger:
|
||||
|
||||
Reference in New Issue
Block a user