#!/bin/bash

# mknDNS Client Installer for Linux
# Copyright 2026 FluxIT Services

clear
echo "=========================================="
echo "  mknDNS Client - Installation Script"
echo "  Powered by FluxIT Services"
echo "=========================================="
echo ""

# Check if running as root
if [ "$EUID" -ne 0 ]; then 
    echo "ERROR: This script must be run as root"
    echo "Please run: sudo $0"
    exit 1
fi

# Configuration
SERVER_URL="https://dns.mkn.ro"
DOMAIN=".mkn.ro"
INSTALL_DIR="/opt/mkndns"
CONFIG_FILE="/etc/mkndns/client.conf"
SERVICE_FILE="/etc/systemd/system/mkndns-client.service"
UPDATE_SCRIPT="/usr/local/bin/mkndns-update"

# Ask for configuration
echo "Please enter your configuration:"
echo ""

read -p "Hostname (full subdomain, e.g., dns.fluxit): " HOSTNAME
if [ -z "$HOSTNAME" ]; then
    echo "ERROR: Hostname cannot be empty"
    exit 1
fi

read -p "Username: " USERNAME
if [ -z "$USERNAME" ]; then
    echo "ERROR: Username cannot be empty"
    exit 1
fi

read -sp "Password: " PASSWORD
echo ""
if [ -z "$PASSWORD" ]; then
    echo "ERROR: Password cannot be empty"
    exit 1
fi

read -p "Install as system service? (y/n): " INSTALL_SERVICE
INSTALL_SERVICE=${INSTALL_SERVICE,,}

read -p "Update interval in minutes (default: 5): " UPDATE_INTERVAL
UPDATE_INTERVAL=${UPDATE_INTERVAL:-5}

echo ""
echo "Configuration Summary:"
echo "----------------------"
echo "Full hostname: ${HOSTNAME}${DOMAIN}"
echo "Username: ${USERNAME}"
echo "Update interval: ${UPDATE_INTERVAL} minutes"
echo "Install as service: ${INSTALL_SERVICE}"
echo ""

read -p "Is this correct? (y/n): " CONFIRM
CONFIRM=${CONFIRM,,}

if [ "$CONFIRM" != "y" ]; then
    echo "Installation cancelled."
    exit 0
fi

# Install dependencies
echo ""
echo "Installing dependencies..."
apt-get update -qq
apt-get install -y curl jq systemd > /dev/null 2>&1

if [ $? -ne 0 ]; then
    echo "ERROR: Failed to install dependencies"
    exit 1
fi

# Create directories
echo "Creating directories..."
mkdir -p "$INSTALL_DIR"
mkdir -p "$(dirname $CONFIG_FILE)"

# Create configuration file
echo "Creating configuration file..."
cat > "$CONFIG_FILE" <<CONFIGEOF
# mknDNS Client Configuration
# DO NOT EDIT THIS FILE WHILE SERVICE IS RUNNING

SERVER_URL="$SERVER_URL"
HOSTNAME="$HOSTNAME"
DOMAIN="$DOMAIN"
USERNAME="$USERNAME"
PASSWORD="$PASSWORD"
UPDATE_INTERVAL="$UPDATE_INTERVAL"
LOG_FILE="/var/log/mkndns-client.log"
CONFIGEOF

chmod 600 "$CONFIG_FILE"

# Create update script
echo "Creating update script..."
cat > "$UPDATE_SCRIPT" <<'UPDATESCRIPT'
#!/bin/bash

# mknDNS Update Script
# Copyright 2026 FluxIT Services

CONFIG_FILE="/etc/mkndns/client.conf"

if [ ! -f "$CONFIG_FILE" ]; then
    echo "ERROR: Configuration file not found: $CONFIG_FILE"
    exit 1
fi

source "$CONFIG_FILE"

# Detect public IP address
PUBLIC_IP=$(curl -s -m 5 https://api.ipify.org 2>/dev/null)

if [ -z "$PUBLIC_IP" ]; then
    PUBLIC_IP=$(curl -s -m 5 https://icanhazip.com 2>/dev/null | tr -d '\n')
fi

if [ -z "$PUBLIC_IP" ]; then
    PUBLIC_IP=$(curl -s -m 5 https://ifconfig.me 2>/dev/null)
fi

if [ -z "$PUBLIC_IP" ]; then
    TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$TIMESTAMP] ERROR: Cannot detect public IP address" >> "$LOG_FILE"
    echo "ERROR: Cannot detect public IP address"
    exit 1
fi

# Build full hostname: hostname + domain
FULL_HOSTNAME="${HOSTNAME}${DOMAIN}"
UPDATE_URL="${SERVER_URL}/update.php?hostname=${FULL_HOSTNAME}&myip=${PUBLIC_IP}&username=${USERNAME}&password=${PASSWORD}"

TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# Make request with timeout
RESPONSE=$(curl -s -m 10 "$UPDATE_URL" 2>&1)
CURL_EXIT=$?

if [ $CURL_EXIT -ne 0 ]; then
    echo "[$TIMESTAMP] ERROR: Connection failed (curl exit code: $CURL_EXIT)" >> "$LOG_FILE"
    echo "ERROR: Connection failed"
    exit 1
fi

# Log response
echo "[$TIMESTAMP] Response: $RESPONSE | Hostname: $FULL_HOSTNAME | IP: $PUBLIC_IP" >> "$LOG_FILE"

# Parse response
if [[ "$RESPONSE" == good* ]]; then
    IP=$(echo "$RESPONSE" | cut -d' ' -f2)
    echo "[$TIMESTAMP] SUCCESS: Updated $FULL_HOSTNAME to $IP" >> "$LOG_FILE"
    echo "SUCCESS: DNS updated to $IP"
    exit 0
elif [[ "$RESPONSE" == "badauth" ]]; then
    echo "[$TIMESTAMP] ERROR: Authentication failed for $FULL_HOSTNAME" >> "$LOG_FILE"
    echo "ERROR: Authentication failed"
    exit 1
elif [[ "$RESPONSE" == "badparam" ]]; then
    echo "[$TIMESTAMP] ERROR: Invalid parameters for $FULL_HOSTNAME" >> "$LOG_FILE"
    echo "ERROR: Invalid parameters"
    exit 1
elif [[ "$RESPONSE" == "911" ]]; then
    echo "[$TIMESTAMP] ERROR: Server error (911) for $FULL_HOSTNAME" >> "$LOG_FILE"
    echo "ERROR: Server error"
    exit 1
else
    echo "[$TIMESTAMP] ERROR: Update failed - $RESPONSE" >> "$LOG_FILE"
    echo "ERROR: Update failed - $RESPONSE"
    exit 1
fi
UPDATESCRIPT

chmod +x "$UPDATE_SCRIPT"

# Create log file
touch "/var/log/mkndns-client.log"
chmod 644 "/var/log/mkndns-client.log"

# Test update
echo ""
echo "Testing DNS update..."
if $UPDATE_SCRIPT; then
    echo "✓ DNS update successful!"
else
    echo "✗ DNS update failed. Please check your credentials."
    read -p "Continue anyway? (y/n): " CONTINUE
    CONTINUE=${CONTINUE,,}
    if [ "$CONTINUE" != "y" ]; then
        echo "Installation cancelled."
        exit 1
    fi
fi

# Install as service
if [ "$INSTALL_SERVICE" == "y" ]; then
    echo ""
    echo "Installing systemd service..."
    
    # Create service file
    cat > "$SERVICE_FILE" <<SERVICEFILE
[Unit]
Description=mknDNS Dynamic DNS Client
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=$UPDATE_SCRIPT
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
SERVICEFILE

    # Create timer file
    cat > "/etc/systemd/system/mkndns-client.timer" <<TIMERFILE
[Unit]
Description=mknDNS Dynamic DNS Update Timer
Requires=mkndns-client.service

[Timer]
OnBootSec=1min
OnUnitActiveSec=${UPDATE_INTERVAL}min
AccuracySec=1s

[Install]
WantedBy=timers.target
TIMERFILE

    # Reload systemd
    systemctl daemon-reload
    
    # Enable and start timer
    systemctl enable mkndns-client.timer
    systemctl start mkndns-client.timer
    
    echo "✓ Service installed and started"
    echo ""
    echo "Service commands:"
    echo "  Status:  systemctl status mkndns-client.timer"
    echo "  Stop:    sudo systemctl stop mkndns-client.timer"
    echo "  Start:   sudo systemctl start mkndns-client.timer"
    echo "  Restart: sudo systemctl restart mkndns-client.timer"
    echo "  Logs:    sudo journalctl -u mkndns-client -f"
    echo "  Log file: tail -f /var/log/mkndns-client.log"
else
    echo ""
    echo "Service not installed."
    echo "To manually update DNS, run: mkndns-update"
    
    # Create cron job option
    read -p "Create cron job instead? (y/n): " INSTALL_CRON
    INSTALL_CRON=${INSTALL_CRON,,}
    
    if [ "$INSTALL_CRON" == "y" ]; then
        # Add cron job
        CRON_LINE="*/${UPDATE_INTERVAL} * * * * $UPDATE_SCRIPT >> /var/log/mkndns-client.log 2>&1"
        (crontab -l 2>/dev/null; echo "$CRON_LINE") | crontab -
        echo "✓ Cron job installed (runs every ${UPDATE_INTERVAL} minutes)"
    fi
fi

# Create uninstall script
cat > "$INSTALL_DIR/uninstall.sh" <<'UNINSTALL'
#!/bin/bash

if [ "$EUID" -ne 0 ]; then 
    echo "ERROR: Must run as root"
    exit 1
fi

echo "Uninstalling mknDNS Client..."

# Stop and disable service
systemctl stop mkndns-client.timer 2>/dev/null
systemctl disable mkndns-client.timer 2>/dev/null
rm -f /etc/systemd/system/mkndns-client.service
rm -f /etc/systemd/system/mkndns-client.timer
systemctl daemon-reload

# Remove cron job
crontab -l 2>/dev/null | grep -v "mkndns-update" | crontab - 2>/dev/null

# Remove files
rm -f /usr/local/bin/mkndns-update
rm -rf /etc/mkndns
rm -rf /opt/mkndns
rm -f /var/log/mkndns-client.log

echo "✓ mknDNS Client uninstalled successfully"
UNINSTALL

chmod +x "$INSTALL_DIR/uninstall.sh"

echo ""
echo "=========================================="
echo "  Installation Complete!"
echo "=========================================="
echo ""
echo "Configuration:"
echo "  Hostname: ${HOSTNAME}${DOMAIN}"
echo "  Config file: $CONFIG_FILE"
echo "  Log file: /var/log/mkndns-client.log"
echo ""
echo "Commands:"
echo "  Manual update: mkndns-update"
echo "  View logs: tail -f /var/log/mkndns-client.log"
echo ""
if [ "$INSTALL_SERVICE" == "y" ]; then
    echo "Service Management:"
    echo "  Status: systemctl status mkndns-client.timer"
    echo "  Logs: journalctl -u mkndns-client -f"
fi
echo ""
echo "  Uninstall: sudo $INSTALL_DIR/uninstall.sh"
echo ""
echo "Powered by FluxIT Services - www.fluxit.ro"
echo "=========================================="
