Rename project to ddns-service
This commit is contained in:
76
README.md
76
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.
|
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
|
## Project Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
ddns-daemon/
|
ddns-service/
|
||||||
├── ddns-daemon # Main executable
|
├── ddns-service # Main executable
|
||||||
├── ddns_daemon/ # Python package
|
├── ddns_service/ # Python package
|
||||||
│ ├── __init__.py # Version info
|
│ ├── __init__.py # Version info
|
||||||
│ ├── cleanup.py # TTL expiry cleanup
|
│ ├── cleanup.py # TTL expiry cleanup
|
||||||
│ ├── cli.py # CLI commands
|
│ ├── cli.py # CLI commands
|
||||||
@@ -35,7 +35,7 @@ ddns-daemon/
|
|||||||
│ ├── server.py # HTTP server
|
│ ├── server.py # HTTP server
|
||||||
│ └── validation.py # Hostname validation
|
│ └── validation.py # Hostname validation
|
||||||
├── config.example.toml
|
├── config.example.toml
|
||||||
├── ddns-daemon.service
|
├── ddns-service.service
|
||||||
├── requirements.txt
|
├── requirements.txt
|
||||||
└── README.md
|
└── README.md
|
||||||
```
|
```
|
||||||
@@ -56,7 +56,7 @@ pip install -r requirements.txt
|
|||||||
|
|
||||||
## Configuration
|
## 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
|
```toml
|
||||||
[daemon]
|
[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"
|
# log_target = "stdout" # default: "stdout", or "syslog", "file"
|
||||||
# syslog_socket = "/dev/log" # default: "/dev/log"
|
# syslog_socket = "/dev/log" # default: "/dev/log"
|
||||||
# syslog_facility = "daemon" # default: "daemon"
|
# 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_file_size = 52428800 # default: 52428800 (50 MB in bytes)
|
||||||
# log_versions = 5 # default: 5 backup files
|
# log_versions = 5 # default: 5 backup files
|
||||||
# log_requests = false # default: false
|
# log_requests = false # default: false
|
||||||
# ssl = false # default: false
|
# ssl = false # default: false
|
||||||
ssl_cert_file = "/etc/ddns-daemon/cert.pem" # required if ssl = true
|
ssl_cert_file = "/etc/ddns-service/cert.pem" # required if ssl = true
|
||||||
ssl_key_file = "/etc/ddns-daemon/key.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"
|
# proxy_header = "" # default: "" (disabled), e.g. "X-Forwarded-For"
|
||||||
# trusted_proxies = [] # default: [], e.g. ["127.0.0.1", "10.0.0.0/8"]
|
# trusted_proxies = [] # default: [], e.g. ["127.0.0.1", "10.0.0.0/8"]
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
# backend = "sqlite" # default: "sqlite", or "mariadb"
|
# 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]
|
[dns_service]
|
||||||
# manager_config_file = "/etc/dns-manager/config.yml" # default
|
# manager_config_file = "/etc/dns-manager/config.yml" # default
|
||||||
@@ -142,64 +142,64 @@ password = ["password"]
|
|||||||
### Initialize Database
|
### Initialize Database
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./ddns-daemon --init-db
|
./ddns-service --init-db
|
||||||
```
|
```
|
||||||
|
|
||||||
### User Management
|
### User Management
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# List users
|
# List users
|
||||||
./ddns-daemon user list
|
./ddns-service user list
|
||||||
|
|
||||||
# Add user (prompts for password)
|
# 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)
|
# Delete user (fails if hostnames exist)
|
||||||
./ddns-daemon user delete myuser
|
./ddns-service user delete myuser
|
||||||
|
|
||||||
# Change password
|
# Change password
|
||||||
./ddns-daemon user passwd myuser
|
./ddns-service user passwd myuser
|
||||||
|
|
||||||
# Update email
|
# Update email
|
||||||
./ddns-daemon user email myuser new@example.com
|
./ddns-service user email myuser new@example.com
|
||||||
```
|
```
|
||||||
|
|
||||||
### Hostname Management
|
### Hostname Management
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# List all hostnames
|
# List all hostnames
|
||||||
./ddns-daemon hostname list
|
./ddns-service hostname list
|
||||||
|
|
||||||
# List hostnames for specific user
|
# List hostnames for specific user
|
||||||
./ddns-daemon hostname list --user myuser
|
./ddns-service hostname list --user myuser
|
||||||
|
|
||||||
# Add hostname
|
# 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
|
# 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
|
--dns-ttl 60 --expiry-ttl 7200
|
||||||
|
|
||||||
# Modify hostname TTLs
|
# 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
|
# Delete hostname
|
||||||
./ddns-daemon hostname delete mypc.dyn.example.com
|
./ddns-service hostname delete mypc.dyn.example.com
|
||||||
```
|
```
|
||||||
|
|
||||||
### Manual Cleanup
|
### Manual Cleanup
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./ddns-daemon cleanup
|
./ddns-service cleanup
|
||||||
```
|
```
|
||||||
|
|
||||||
### Run Daemon
|
### Run Daemon
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./ddns-daemon --daemon
|
./ddns-service --daemon
|
||||||
|
|
||||||
# With debug logging
|
# With debug logging
|
||||||
./ddns-daemon --daemon --debug
|
./ddns-service --daemon --debug
|
||||||
```
|
```
|
||||||
|
|
||||||
### Debug Mode
|
### Debug Mode
|
||||||
@@ -207,8 +207,8 @@ password = ["password"]
|
|||||||
Use `--debug` to enable debug logging for any command:
|
Use `--debug` to enable debug logging for any command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./ddns-daemon --debug user list
|
./ddns-service --debug user list
|
||||||
./ddns-daemon --debug cleanup
|
./ddns-service --debug cleanup
|
||||||
```
|
```
|
||||||
|
|
||||||
## HTTP API
|
## HTTP API
|
||||||
@@ -276,30 +276,30 @@ useradd -r -s /sbin/nologin ddns
|
|||||||
|
|
||||||
2. Create directories:
|
2. Create directories:
|
||||||
```bash
|
```bash
|
||||||
mkdir -p /etc/ddns-daemon /var/lib/ddns-daemon
|
mkdir -p /etc/ddns-service /var/lib/ddns-service
|
||||||
chown ddns:ddns /var/lib/ddns-daemon
|
chown ddns:ddns /var/lib/ddns-service
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Install files:
|
3. Install files:
|
||||||
```bash
|
```bash
|
||||||
cp -r ddns_daemon /opt/ddns-daemon/
|
cp -r ddns_service /opt/ddns-service/
|
||||||
cp ddns-daemon /opt/ddns-daemon/
|
cp ddns-service /opt/ddns-service/
|
||||||
cp config.example.toml /etc/ddns-daemon/config.toml
|
cp config.example.toml /etc/ddns-service/config.toml
|
||||||
cp ddns-daemon.service /etc/systemd/system/
|
cp ddns-service.service /etc/systemd/system/
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Configure and start:
|
4. Configure and start:
|
||||||
```bash
|
```bash
|
||||||
# Edit config
|
# Edit config
|
||||||
vi /etc/ddns-daemon/config.toml
|
vi /etc/ddns-service/config.toml
|
||||||
|
|
||||||
# Initialize database
|
# Initialize database
|
||||||
/opt/ddns-daemon/ddns_daemon.py --init-db
|
/opt/ddns-service/ddns-service --init-db
|
||||||
|
|
||||||
# Enable and start
|
# Enable and start
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
systemctl enable ddns-daemon
|
systemctl enable ddns-service
|
||||||
systemctl start ddns-daemon
|
systemctl start ddns-service
|
||||||
```
|
```
|
||||||
|
|
||||||
## Security Considerations
|
## 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):
|
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
|
### CLI Logging
|
||||||
|
|||||||
@@ -5,19 +5,19 @@
|
|||||||
# log_target = "stdout" # default, "stdout", "syslog" or "file"
|
# log_target = "stdout" # default, "stdout", "syslog" or "file"
|
||||||
# syslog_socket = "/dev/log" # default
|
# syslog_socket = "/dev/log" # default
|
||||||
# syslog_facility = "daemon" # 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_file_size = 52428800 # default, 50 MB in bytes
|
||||||
# log_versions = 5 # default, 5 backup files
|
# log_versions = 5 # default, 5 backup files
|
||||||
# log_requests = false # default
|
# log_requests = false # default
|
||||||
# ssl = false # default
|
# ssl = false # default
|
||||||
ssl_cert_file = "/etc/ddns-daemon/cert.pem" # required if ssl = true
|
ssl_cert_file = "/etc/ddns-service/cert.pem" # required if ssl = true
|
||||||
ssl_key_file = "/etc/ddns-daemon/key.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"
|
# proxy_header = "" # default (disabled), header name e.g. "X-Forwarded-For"
|
||||||
# trusted_proxies = [] # default, list of trusted proxy IPs/CIDRs
|
# trusted_proxies = [] # default, list of trusted proxy IPs/CIDRs
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
# backend = "sqlite" # default, "sqlite", or "mariadb"
|
# 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
|
# host = "localhost" # required for mariadb
|
||||||
# port = 3306 # required for mariadb
|
# port = 3306 # required for mariadb
|
||||||
# user = "ddns" # required for mariadb
|
# user = "ddns" # required for mariadb
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
#!/sbin/openrc-run
|
#!/sbin/openrc-run
|
||||||
|
|
||||||
description="DDNS Daemon - Dynamic DNS Update Service"
|
description="DDNS Service - Dynamic DNS Update Service"
|
||||||
|
|
||||||
: ${USER:=ddns}
|
: ${USER:=ddns}
|
||||||
: ${GROUP:=ddns}
|
: ${GROUP:=ddns}
|
||||||
: ${OPTIONS:=}
|
: ${OPTIONS:=}
|
||||||
|
|
||||||
command="/usr/bin/ddns-daemon"
|
command="/usr/bin/ddns-service"
|
||||||
command_args="--daemon ${OPTIONS}"
|
command_args="--daemon ${OPTIONS}"
|
||||||
command_user="${USER}:${GROUP}"
|
command_user="${USER}:${GROUP}"
|
||||||
command_background="yes"
|
command_background="yes"
|
||||||
@@ -18,5 +18,5 @@ depend() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
start_pre() {
|
start_pre() {
|
||||||
checkpath --directory --owner ${USER}:${GROUP} --mode 0750 /var/lib/ddns-daemon
|
checkpath --directory --owner ${USER}:${GROUP} --mode 0750 /var/lib/ddns-service
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=DDNS Daemon - Dynamic DNS Update Service
|
Description=DDNS Service - Dynamic DNS Update Service
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=ddns
|
User=ddns
|
||||||
Group=ddns
|
Group=ddns
|
||||||
WorkingDirectory=/opt/ddns-daemon
|
WorkingDirectory=/opt/ddns-service
|
||||||
ExecStart=/usr/bin/ddns-daemon --daemon
|
ExecStart=/usr/bin/ddns-service --daemon
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
Restart=on-failure
|
Restart=on-failure
|
||||||
RestartSec=5
|
RestartSec=5
|
||||||
@@ -17,7 +17,7 @@ NoNewPrivileges=yes
|
|||||||
ProtectSystem=strict
|
ProtectSystem=strict
|
||||||
ProtectHome=yes
|
ProtectHome=yes
|
||||||
PrivateTmp=yes
|
PrivateTmp=yes
|
||||||
ReadWritePaths=/var/lib/ddns-daemon
|
ReadWritePaths=/var/lib/ddns-service
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
@@ -3,10 +3,10 @@ requires = ["setuptools >= 77.0.3"]
|
|||||||
build-backend = "setuptools.build_meta"
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
[tool.setuptools.dynamic]
|
[tool.setuptools.dynamic]
|
||||||
version = {attr = "ddns_daemon.__version__"}
|
version = {attr = "ddns_service.__version__"}
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "ddns_daemon"
|
name = "ddns_service"
|
||||||
dynamic = ["version"]
|
dynamic = ["version"]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dns-manager @ git+https://git.ccc-rheintal.ch/spacefreak/dns-manager.git",
|
"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."
|
description = "Dynamic DNS update service with CLI administration."
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
license = "GPL-3.0-only"
|
license = "GPL-3.0-only"
|
||||||
keywords = ["dns", "ddns", "daemon", "http", "https"]
|
keywords = ["dns", "ddns", "service", "http", "https"]
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Development Status :: 4 - Beta",
|
"Development Status :: 4 - Beta",
|
||||||
"Topic :: Internet :: Name Service (DNS)",
|
"Topic :: Internet :: Name Service (DNS)",
|
||||||
@@ -35,5 +35,5 @@ classifiers = [
|
|||||||
mysql = ["pymysql>=1.1.0"]
|
mysql = ["pymysql>=1.1.0"]
|
||||||
|
|
||||||
[project.scripts]
|
[project.scripts]
|
||||||
ddns-daemon = "ddns_daemon.main:main"
|
ddns-service = "ddns_service.main:main"
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
A daemon that accepts HTTP(S) requests to dynamically update DNS entries.
|
||||||
Includes CLI administration tools for user and hostname management.
|
Includes CLI administration tools for user and hostname management.
|
||||||
@@ -10,7 +10,7 @@ except ImportError:
|
|||||||
|
|
||||||
# Default config paths (searched in order)
|
# Default config paths (searched in order)
|
||||||
CONFIG_PATHS = [
|
CONFIG_PATHS = [
|
||||||
"/etc/ddns-daemon/config.toml",
|
"/etc/ddns-service/config.toml",
|
||||||
"./config.toml",
|
"./config.toml",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ def load_config(config_path):
|
|||||||
cfg["daemon"].setdefault("log_target", "stdout")
|
cfg["daemon"].setdefault("log_target", "stdout")
|
||||||
cfg["daemon"].setdefault("syslog_socket", "/dev/log")
|
cfg["daemon"].setdefault("syslog_socket", "/dev/log")
|
||||||
cfg["daemon"].setdefault("syslog_facility", "daemon")
|
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_file_size", 52428800)
|
||||||
cfg["daemon"].setdefault("log_versions", 5)
|
cfg["daemon"].setdefault("log_versions", 5)
|
||||||
cfg["daemon"].setdefault("log_requests", False)
|
cfg["daemon"].setdefault("log_requests", False)
|
||||||
@@ -70,7 +70,7 @@ def setup_logging(
|
|||||||
target="stdout",
|
target="stdout",
|
||||||
syslog_socket="/dev/log",
|
syslog_socket="/dev/log",
|
||||||
syslog_facility="daemon",
|
syslog_facility="daemon",
|
||||||
log_file="/var/log/ddns-daemon.log",
|
log_file="/var/log/ddns-service.log",
|
||||||
log_file_size=52428800,
|
log_file_size=52428800,
|
||||||
log_versions=5,
|
log_versions=5,
|
||||||
):
|
):
|
||||||
@@ -104,8 +104,8 @@ def setup_logging(
|
|||||||
facility=facility,
|
facility=facility,
|
||||||
)
|
)
|
||||||
formatter = TxnIdFormatter(
|
formatter = TxnIdFormatter(
|
||||||
"ddns-daemon[%(process)d]: [%(levelname)s] [%(txn_id)s] %(message)s",
|
"ddns-service[%(process)d]: [%(levelname)s] [%(txn_id)s] %(message)s",
|
||||||
"ddns-daemon[%(process)d]: [%(levelname)s] %(message)s",
|
"ddns-service[%(process)d]: [%(levelname)s] %(message)s",
|
||||||
)
|
)
|
||||||
elif target == "file":
|
elif target == "file":
|
||||||
handler = logging.handlers.RotatingFileHandler(
|
handler = logging.handlers.RotatingFileHandler(
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
"""
|
"""
|
||||||
DDNS Daemon - Dynamic DNS update service.
|
DDNS Service - Dynamic DNS update service.
|
||||||
|
|
||||||
Main executable for CLI and daemon mode.
|
Main executable for CLI and daemon mode.
|
||||||
"""
|
"""
|
||||||
@@ -30,7 +30,7 @@ from .server import run_daemon
|
|||||||
def build_parser():
|
def build_parser():
|
||||||
"""Build the argument parser."""
|
"""Build the argument parser."""
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description="DDNS Daemon - Dynamic DNS update service",
|
description="DDNS Service - Dynamic DNS update service",
|
||||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
Reference in New Issue
Block a user