feat: adguard-register — auto DNS registration agent for AdGuard Home
Registers {hostname}.home.dustin.coffee → host IP on boot via AdGuard Home API.
Deploy to any LXC/VM with ./install.sh — supports root (system service),
sudo user (system via sudo), and unprivileged user (systemd --user or crontab).
Files:
- adguard-register.sh — detects hostname+IP, idempotent create/update
- install.sh — deployment script with auto-detection of install method
- uninstall.sh — removes service and binary
- README.md — full documentation
Tested across 24 hosts (LXCs and VMs) on a 172.20.0.0/16 home lab network.
This commit is contained in:
Executable
+144
@@ -0,0 +1,144 @@
|
||||
#!/bin/bash
|
||||
# install.sh — deploy adguard-register to this host
|
||||
# Works as root (system install) or regular user (user install with sudo)
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
# Root: system-wide install
|
||||
BIN_PATH="/usr/local/bin/adguard-register"
|
||||
SERVICE_PATH="/etc/systemd/system/adguard-register.service"
|
||||
SERVICE_TYPE="system"
|
||||
else
|
||||
# Non-root: user install, try sudo for systemd, fall back to cron
|
||||
BIN_PATH="${HOME}/.local/bin/adguard-register"
|
||||
mkdir -p "${HOME}/.local/bin"
|
||||
SERVICE_TYPE="user"
|
||||
|
||||
# Check if we can sudo
|
||||
if sudo -n true 2>/dev/null; then
|
||||
HAS_SUDO=1
|
||||
else
|
||||
HAS_SUDO=0
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "=== Installing adguard-register (${SERVICE_TYPE}) ==="
|
||||
|
||||
# Copy script
|
||||
if [ "$(id -u)" -eq 0 ]; then
|
||||
cp "${SCRIPT_DIR}/adguard-register.sh" "${BIN_PATH}"
|
||||
else
|
||||
# May need sudo for the copy if dir is protected
|
||||
cp "${SCRIPT_DIR}/adguard-register.sh" "${BIN_PATH}" 2>/dev/null || \
|
||||
sudo cp "${SCRIPT_DIR}/adguard-register.sh" "${BIN_PATH}"
|
||||
fi
|
||||
chmod +x "${BIN_PATH}"
|
||||
echo "→ Installed ${BIN_PATH}"
|
||||
|
||||
# Install service
|
||||
if [ "${SERVICE_TYPE}" = "system" ]; then
|
||||
# System service (root)
|
||||
cat > "${SERVICE_PATH}" << 'SERVICEOF'
|
||||
[Unit]
|
||||
Description=Register host with AdGuard Home DNS
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/adguard-register
|
||||
RemainAfterExit=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
SERVICEOF
|
||||
echo "→ Created ${SERVICE_PATH}"
|
||||
systemctl daemon-reload
|
||||
systemctl enable adguard-register.service
|
||||
echo "→ Enabled adguard-register.service"
|
||||
systemctl start adguard-register.service 2>&1 || true
|
||||
echo "→ Registration result:"
|
||||
systemctl status adguard-register.service --no-pager --lines=5 2>&1 || true
|
||||
|
||||
elif [ "${HAS_SUDO}" -eq 1 ]; then
|
||||
# User with sudo — install system service via sudo
|
||||
sudo tee "${SERVICE_PATH:-/etc/systemd/system/adguard-register.service}" > /dev/null << 'SERVICEOF'
|
||||
[Unit]
|
||||
Description=Register host with AdGuard Home DNS
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=/usr/local/bin/adguard-register
|
||||
RemainAfterExit=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
SERVICEOF
|
||||
sudo cp "${BIN_PATH}" /usr/local/bin/adguard-register
|
||||
sudo chmod +x /usr/local/bin/adguard-register
|
||||
BIN_PATH="/usr/local/bin/adguard-register"
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable adguard-register.service
|
||||
echo "→ Enabled adguard-register.service (system via sudo)"
|
||||
sudo systemctl start adguard-register.service 2>&1 || true
|
||||
sudo systemctl status adguard-register.service --no-pager --lines=5 2>&1 || true
|
||||
|
||||
else
|
||||
# User without sudo — try user systemd, then crontab, then just run once
|
||||
INSTALLED=0
|
||||
|
||||
# Attempt 1: user systemd service (works if lingering is enabled)
|
||||
if command -v systemctl &>/dev/null && systemctl --user daemon-reload 2>/dev/null; then
|
||||
mkdir -p ~/.config/systemd/user
|
||||
cat > ~/.config/systemd/user/adguard-register.service << SERVICEOF
|
||||
[Unit]
|
||||
Description=Register host with AdGuard Home DNS
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
ExecStart=${BIN_PATH}
|
||||
RemainAfterExit=yes
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
SERVICEOF
|
||||
systemctl --user daemon-reload
|
||||
systemctl --user enable adguard-register.service 2>/dev/null && {
|
||||
echo "→ Enabled user systemd service"
|
||||
systemctl --user start adguard-register.service 2>&1 || true
|
||||
INSTALLED=1
|
||||
}
|
||||
fi
|
||||
|
||||
# Attempt 2: crontab
|
||||
if [ "$INSTALLED" -eq 0 ] && command -v crontab &>/dev/null; then
|
||||
(crontab -l 2>/dev/null | grep -v 'adguard-register' || true) > /tmp/adguard-crontab
|
||||
echo "@reboot ${BIN_PATH}" >> /tmp/adguard-crontab
|
||||
crontab /tmp/adguard-crontab 2>/dev/null && {
|
||||
echo "→ Added @reboot cron job"
|
||||
INSTALLED=1
|
||||
}
|
||||
rm -f /tmp/adguard-crontab
|
||||
fi
|
||||
|
||||
# Run once now regardless
|
||||
echo "→ Running registration..."
|
||||
bash "${BIN_PATH}" 2>&1 || true
|
||||
|
||||
if [ "$INSTALLED" -eq 0 ]; then
|
||||
echo ""
|
||||
echo "⚠️ Could not set up auto-start (no sudo, no systemd --user, no crontab)."
|
||||
echo " The script is installed at ${BIN_PATH}"
|
||||
echo " Run it manually or set up auto-start yourself."
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== Installation complete ==="
|
||||
echo "The agent will auto-run on every boot."
|
||||
echo "To manually re-register: ${BIN_PATH}"
|
||||
Reference in New Issue
Block a user