Files
adguard-register/install.sh
T
hobokenchicken 00a95fda80 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.
2026-05-02 17:41:19 -04:00

145 lines
4.4 KiB
Bash
Executable File

#!/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}"