diff --git a/README.md b/README.md index 2d686c3..4a98e8b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# DDNS Daemon +# DDNS Service Dynamic DNS update service with CLI administration. Accepts HTTP(S) requests to update DNS A/AAAA records using the dns-manager library. @@ -20,9 +20,9 @@ Dynamic DNS update service with CLI administration. Accepts HTTP(S) requests to ## Project Structure ``` -ddns-daemon/ -├── ddns-daemon # Main executable -├── ddns_daemon/ # Python package +ddns-service/ +├── ddns-service # Main executable +├── ddns_service/ # Python package │ ├── __init__.py # Version info │ ├── cleanup.py # TTL expiry cleanup │ ├── cli.py # CLI commands @@ -35,7 +35,7 @@ ddns-daemon/ │ ├── server.py # HTTP server │ └── validation.py # Hostname validation ├── config.example.toml -├── ddns-daemon.service +├── ddns-service.service ├── requirements.txt └── README.md ``` @@ -56,7 +56,7 @@ pip install -r requirements.txt ## Configuration -Copy `config.example.toml` to `/etc/ddns-daemon/config.toml` or `./config.toml`: +Copy `config.example.toml` to `/etc/ddns-service/config.toml` or `./config.toml`: ```toml [daemon] @@ -66,19 +66,19 @@ Copy `config.example.toml` to `/etc/ddns-daemon/config.toml` or `./config.toml`: # log_target = "stdout" # default: "stdout", or "syslog", "file" # syslog_socket = "/dev/log" # default: "/dev/log" # syslog_facility = "daemon" # default: "daemon" -# log_file = "/var/log/ddns-daemon.log" # default, used if log_target = "file" +# log_file = "/var/log/ddns-service.log" # default, used if log_target = "file" # log_file_size = 52428800 # default: 52428800 (50 MB in bytes) # log_versions = 5 # default: 5 backup files # log_requests = false # default: false # ssl = false # default: false -ssl_cert_file = "/etc/ddns-daemon/cert.pem" # required if ssl = true -ssl_key_file = "/etc/ddns-daemon/key.pem" # required if ssl = true +ssl_cert_file = "/etc/ddns-service/cert.pem" # required if ssl = true +ssl_key_file = "/etc/ddns-service/key.pem" # required if ssl = true # proxy_header = "" # default: "" (disabled), e.g. "X-Forwarded-For" # trusted_proxies = [] # default: [], e.g. ["127.0.0.1", "10.0.0.0/8"] [database] # backend = "sqlite" # default: "sqlite", or "mariadb" -path = "/var/lib/ddns-daemon/ddns.db" # required for sqlite +path = "/var/lib/ddns-service/ddns.db" # required for sqlite [dns_service] # manager_config_file = "/etc/dns-manager/config.yml" # default @@ -142,64 +142,64 @@ password = ["password"] ### Initialize Database ```bash -./ddns-daemon --init-db +./ddns-service --init-db ``` ### User Management ```bash # List users -./ddns-daemon user list +./ddns-service user list # Add user (prompts for password) -./ddns-daemon user add myuser user@example.com +./ddns-service user add myuser user@example.com # Delete user (fails if hostnames exist) -./ddns-daemon user delete myuser +./ddns-service user delete myuser # Change password -./ddns-daemon user passwd myuser +./ddns-service user passwd myuser # Update email -./ddns-daemon user email myuser new@example.com +./ddns-service user email myuser new@example.com ``` ### Hostname Management ```bash # List all hostnames -./ddns-daemon hostname list +./ddns-service hostname list # List hostnames for specific user -./ddns-daemon hostname list --user myuser +./ddns-service hostname list --user myuser # Add hostname -./ddns-daemon hostname add myuser mypc.dyn.example.com dyn.example.com +./ddns-service hostname add myuser mypc.dyn.example.com dyn.example.com # Add hostname with custom TTLs -./ddns-daemon hostname add myuser mypc.dyn.example.com dyn.example.com \ +./ddns-service hostname add myuser mypc.dyn.example.com dyn.example.com \ --dns-ttl 60 --expiry-ttl 7200 # Modify hostname TTLs -./ddns-daemon hostname modify mypc.dyn.example.com --dns-ttl 120 +./ddns-service hostname modify mypc.dyn.example.com --dns-ttl 120 # Delete hostname -./ddns-daemon hostname delete mypc.dyn.example.com +./ddns-service hostname delete mypc.dyn.example.com ``` ### Manual Cleanup ```bash -./ddns-daemon cleanup +./ddns-service cleanup ``` ### Run Daemon ```bash -./ddns-daemon --daemon +./ddns-service --daemon # With debug logging -./ddns-daemon --daemon --debug +./ddns-service --daemon --debug ``` ### Debug Mode @@ -207,8 +207,8 @@ password = ["password"] Use `--debug` to enable debug logging for any command: ```bash -./ddns-daemon --debug user list -./ddns-daemon --debug cleanup +./ddns-service --debug user list +./ddns-service --debug cleanup ``` ## HTTP API @@ -276,30 +276,30 @@ useradd -r -s /sbin/nologin ddns 2. Create directories: ```bash -mkdir -p /etc/ddns-daemon /var/lib/ddns-daemon -chown ddns:ddns /var/lib/ddns-daemon +mkdir -p /etc/ddns-service /var/lib/ddns-service +chown ddns:ddns /var/lib/ddns-service ``` 3. Install files: ```bash -cp -r ddns_daemon /opt/ddns-daemon/ -cp ddns-daemon /opt/ddns-daemon/ -cp config.example.toml /etc/ddns-daemon/config.toml -cp ddns-daemon.service /etc/systemd/system/ +cp -r ddns_service /opt/ddns-service/ +cp ddns-service /opt/ddns-service/ +cp config.example.toml /etc/ddns-service/config.toml +cp ddns-service.service /etc/systemd/system/ ``` 4. Configure and start: ```bash # Edit config -vi /etc/ddns-daemon/config.toml +vi /etc/ddns-service/config.toml # Initialize database -/opt/ddns-daemon/ddns_daemon.py --init-db +/opt/ddns-service/ddns-service --init-db # Enable and start systemctl daemon-reload -systemctl enable ddns-daemon -systemctl start ddns-daemon +systemctl enable ddns-service +systemctl start ddns-service ``` ## Security Considerations @@ -352,7 +352,7 @@ Each HTTP request is assigned a random 8-character transaction ID for log correl When using syslog, timestamps are omitted (syslog provides them): ``` -ddns-daemon[12345]: [INFO] [a1b2c3d4] Updated: hostname=mypc.dyn.example.com ipv4=1.2.3.4 ipv6=N/A +ddns-service[12345]: [INFO] [a1b2c3d4] Updated: hostname=mypc.dyn.example.com ipv4=1.2.3.4 ipv6=N/A ``` ### CLI Logging diff --git a/config.example.toml b/config.example.toml index ab7ee93..4a3c862 100644 --- a/config.example.toml +++ b/config.example.toml @@ -5,19 +5,19 @@ # log_target = "stdout" # default, "stdout", "syslog" or "file" # syslog_socket = "/dev/log" # default # syslog_facility = "daemon" # default -# log_file = "/var/log/ddns-daemon.log" # default, used if log_target = "file" +# log_file = "/var/log/ddns-service.log" # default, used if log_target = "file" # log_file_size = 52428800 # default, 50 MB in bytes # log_versions = 5 # default, 5 backup files # log_requests = false # default # ssl = false # default -ssl_cert_file = "/etc/ddns-daemon/cert.pem" # required if ssl = true -ssl_key_file = "/etc/ddns-daemon/key.pem" # required if ssl = true +ssl_cert_file = "/etc/ddns-service/cert.pem" # required if ssl = true +ssl_key_file = "/etc/ddns-service/key.pem" # required if ssl = true # proxy_header = "" # default (disabled), header name e.g. "X-Forwarded-For" # trusted_proxies = [] # default, list of trusted proxy IPs/CIDRs [database] # backend = "sqlite" # default, "sqlite", or "mariadb" -path = "/var/lib/ddns-daemon/ddns.db" # required for sqlite +path = "/var/lib/ddns-service/ddns.db" # required for sqlite # host = "localhost" # required for mariadb # port = 3306 # required for mariadb # user = "ddns" # required for mariadb diff --git a/ddns-daemon.initd b/ddns-service.initd similarity index 74% rename from ddns-daemon.initd rename to ddns-service.initd index a0824fe..76d91d0 100644 --- a/ddns-daemon.initd +++ b/ddns-service.initd @@ -1,12 +1,12 @@ #!/sbin/openrc-run -description="DDNS Daemon - Dynamic DNS Update Service" +description="DDNS Service - Dynamic DNS Update Service" : ${USER:=ddns} : ${GROUP:=ddns} : ${OPTIONS:=} -command="/usr/bin/ddns-daemon" +command="/usr/bin/ddns-service" command_args="--daemon ${OPTIONS}" command_user="${USER}:${GROUP}" command_background="yes" @@ -18,5 +18,5 @@ depend() { } start_pre() { - checkpath --directory --owner ${USER}:${GROUP} --mode 0750 /var/lib/ddns-daemon + checkpath --directory --owner ${USER}:${GROUP} --mode 0750 /var/lib/ddns-service } diff --git a/ddns-daemon.service b/ddns-service.service similarity index 61% rename from ddns-daemon.service rename to ddns-service.service index f402246..980b74f 100644 --- a/ddns-daemon.service +++ b/ddns-service.service @@ -1,13 +1,13 @@ [Unit] -Description=DDNS Daemon - Dynamic DNS Update Service +Description=DDNS Service - Dynamic DNS Update Service After=network.target [Service] Type=simple User=ddns Group=ddns -WorkingDirectory=/opt/ddns-daemon -ExecStart=/usr/bin/ddns-daemon --daemon +WorkingDirectory=/opt/ddns-service +ExecStart=/usr/bin/ddns-service --daemon ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5 @@ -17,7 +17,7 @@ NoNewPrivileges=yes ProtectSystem=strict ProtectHome=yes PrivateTmp=yes -ReadWritePaths=/var/lib/ddns-daemon +ReadWritePaths=/var/lib/ddns-service [Install] WantedBy=multi-user.target diff --git a/pyproject.toml b/pyproject.toml index 5c4dbc4..635d2a9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,10 +3,10 @@ requires = ["setuptools >= 77.0.3"] build-backend = "setuptools.build_meta" [tool.setuptools.dynamic] -version = {attr = "ddns_daemon.__version__"} +version = {attr = "ddns_service.__version__"} [project] -name = "ddns_daemon" +name = "ddns_service" dynamic = ["version"] dependencies = [ "dns-manager @ git+https://git.ccc-rheintal.ch/spacefreak/dns-manager.git", @@ -23,7 +23,7 @@ maintainers = [ description = "Dynamic DNS update service with CLI administration." readme = "README.md" license = "GPL-3.0-only" -keywords = ["dns", "ddns", "daemon", "http", "https"] +keywords = ["dns", "ddns", "service", "http", "https"] classifiers = [ "Development Status :: 4 - Beta", "Topic :: Internet :: Name Service (DNS)", @@ -35,5 +35,5 @@ classifiers = [ mysql = ["pymysql>=1.1.0"] [project.scripts] -ddns-daemon = "ddns_daemon.main:main" +ddns-service = "ddns_service.main:main" diff --git a/src/ddns_daemon/__init__.py b/src/ddns_service/__init__.py similarity index 90% rename from src/ddns_daemon/__init__.py rename to src/ddns_service/__init__.py index fc351b0..9b51eba 100644 --- a/src/ddns_daemon/__init__.py +++ b/src/ddns_service/__init__.py @@ -1,5 +1,5 @@ """ -DDNS Daemon - Dynamic DNS update service. +DDNS Service - Dynamic DNS update service. A daemon that accepts HTTP(S) requests to dynamically update DNS entries. Includes CLI administration tools for user and hostname management. diff --git a/src/ddns_daemon/app.py b/src/ddns_service/app.py similarity index 100% rename from src/ddns_daemon/app.py rename to src/ddns_service/app.py diff --git a/src/ddns_daemon/cleanup.py b/src/ddns_service/cleanup.py similarity index 100% rename from src/ddns_daemon/cleanup.py rename to src/ddns_service/cleanup.py diff --git a/src/ddns_daemon/cli.py b/src/ddns_service/cli.py similarity index 100% rename from src/ddns_daemon/cli.py rename to src/ddns_service/cli.py diff --git a/src/ddns_daemon/config.py b/src/ddns_service/config.py similarity index 98% rename from src/ddns_daemon/config.py rename to src/ddns_service/config.py index 6b64148..41d52a0 100644 --- a/src/ddns_daemon/config.py +++ b/src/ddns_service/config.py @@ -10,7 +10,7 @@ except ImportError: # Default config paths (searched in order) CONFIG_PATHS = [ - "/etc/ddns-daemon/config.toml", + "/etc/ddns-service/config.toml", "./config.toml", ] @@ -133,7 +133,7 @@ def load_config(config_path): cfg["daemon"].setdefault("log_target", "stdout") cfg["daemon"].setdefault("syslog_socket", "/dev/log") cfg["daemon"].setdefault("syslog_facility", "daemon") - cfg["daemon"].setdefault("log_file", "/var/log/ddns-daemon.log") + cfg["daemon"].setdefault("log_file", "/var/log/ddns-service.log") cfg["daemon"].setdefault("log_file_size", 52428800) cfg["daemon"].setdefault("log_versions", 5) cfg["daemon"].setdefault("log_requests", False) diff --git a/src/ddns_daemon/dns.py b/src/ddns_service/dns.py similarity index 100% rename from src/ddns_daemon/dns.py rename to src/ddns_service/dns.py diff --git a/src/ddns_daemon/email.py b/src/ddns_service/email.py similarity index 100% rename from src/ddns_daemon/email.py rename to src/ddns_service/email.py diff --git a/src/ddns_daemon/logging.py b/src/ddns_service/logging.py similarity index 95% rename from src/ddns_daemon/logging.py rename to src/ddns_service/logging.py index 683459d..2d16f3f 100644 --- a/src/ddns_daemon/logging.py +++ b/src/ddns_service/logging.py @@ -70,7 +70,7 @@ def setup_logging( target="stdout", syslog_socket="/dev/log", syslog_facility="daemon", - log_file="/var/log/ddns-daemon.log", + log_file="/var/log/ddns-service.log", log_file_size=52428800, log_versions=5, ): @@ -104,8 +104,8 @@ def setup_logging( facility=facility, ) formatter = TxnIdFormatter( - "ddns-daemon[%(process)d]: [%(levelname)s] [%(txn_id)s] %(message)s", - "ddns-daemon[%(process)d]: [%(levelname)s] %(message)s", + "ddns-service[%(process)d]: [%(levelname)s] [%(txn_id)s] %(message)s", + "ddns-service[%(process)d]: [%(levelname)s] %(message)s", ) elif target == "file": handler = logging.handlers.RotatingFileHandler( diff --git a/src/ddns_daemon/main.py b/src/ddns_service/main.py similarity index 98% rename from src/ddns_daemon/main.py rename to src/ddns_service/main.py index 775ab61..8842b94 100644 --- a/src/ddns_daemon/main.py +++ b/src/ddns_service/main.py @@ -1,5 +1,5 @@ """ -DDNS Daemon - Dynamic DNS update service. +DDNS Service - Dynamic DNS update service. Main executable for CLI and daemon mode. """ @@ -30,7 +30,7 @@ from .server import run_daemon def build_parser(): """Build the argument parser.""" parser = argparse.ArgumentParser( - description="DDNS Daemon - Dynamic DNS update service", + description="DDNS Service - Dynamic DNS update service", formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument( diff --git a/src/ddns_daemon/models.py b/src/ddns_service/models.py similarity index 100% rename from src/ddns_daemon/models.py rename to src/ddns_service/models.py diff --git a/src/ddns_daemon/ratelimit.py b/src/ddns_service/ratelimit.py similarity index 100% rename from src/ddns_daemon/ratelimit.py rename to src/ddns_service/ratelimit.py diff --git a/src/ddns_daemon/server.py b/src/ddns_service/server.py similarity index 100% rename from src/ddns_daemon/server.py rename to src/ddns_service/server.py diff --git a/src/ddns_daemon/validation.py b/src/ddns_service/validation.py similarity index 100% rename from src/ddns_daemon/validation.py rename to src/ddns_service/validation.py