00a95fda80
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.
145 lines
4.4 KiB
Bash
Executable File
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}"
|