This repository has been archived on 2026-10-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
karldns.de/karldns/cli.py
T

50 lines
1.8 KiB
Python
Raw Normal View History

2026-05-20 13:48:24 +02:00
from __future__ import annotations
import argparse
2026-05-21 17:23:08 +02:00
from .app import make_app
from .settings import DdnsSettings
2026-05-20 13:48:24 +02:00
def main() -> None:
2026-05-20 20:03:25 +02:00
parser = argparse.ArgumentParser(prog="karldns")
2026-05-20 13:48:24 +02:00
subparsers = parser.add_subparsers(dest="command", required=True)
2026-05-21 10:05:40 +02:00
render_url = subparsers.add_parser("render-fritz-url", help="Print a FRITZ!Box DynDNS update URL.")
render_url.add_argument("--base-url", required=True, help="Public KarlDNS URL.")
2026-05-21 17:23:08 +02:00
render_url.add_argument("--update-secret", required=True, help="Private router update secret.")
2026-05-20 13:48:24 +02:00
render_url.add_argument("--include-ipv6", action="store_true")
2026-05-21 10:05:40 +02:00
serve = subparsers.add_parser("serve", help="Run the KarlDNS web service.")
2026-05-20 13:48:24 +02:00
serve.add_argument("--host", default="0.0.0.0")
serve.add_argument("--port", type=int, default=8080)
2026-05-20 23:55:27 +02:00
serve.add_argument(
"--access-log",
action="store_true",
2026-05-21 10:05:40 +02:00
help="Enable redacted request logs. Raw web-server access logs stay off because private URLs are secrets.",
2026-05-20 23:55:27 +02:00
)
2026-05-20 13:48:24 +02:00
args = parser.parse_args()
if args.command == "render-fritz-url":
2026-05-21 17:23:08 +02:00
print(_render_fritz_url(args.base_url, args.update_secret, args.include_ipv6))
2026-05-20 13:48:24 +02:00
elif args.command == "serve":
import uvicorn
settings = DdnsSettings.from_env()
if not settings.admin_password:
2026-05-21 10:05:40 +02:00
raise SystemExit("Set DDNS_ADMIN_PASSWORD before starting KarlDNS.")
if args.access_log:
settings = settings.model_copy(update={"redacted_access_log": True})
uvicorn.run(make_app(settings), host=args.host, port=args.port, access_log=False)
2026-05-20 13:48:24 +02:00
2026-05-21 17:23:08 +02:00
def _render_fritz_url(base_url: str, update_secret: str, include_ipv6: bool) -> str:
2026-05-20 13:48:24 +02:00
base = base_url.rstrip("/")
2026-05-21 17:23:08 +02:00
url = f"{base}/api/v1/router/update/{update_secret}?myip=<ipaddr>"
2026-05-20 13:48:24 +02:00
if include_ipv6:
url += "&myipv6=<ip6addr>"
2026-05-21 17:23:08 +02:00
return url
2026-05-20 13:48:24 +02:00
if __name__ == "__main__":
main()