#!/bin/bash

PASS_BASE="L4V3rd4d3r4R4z0n"
RUTA_LOGS="/var/www/ddns/log/ddns.log"

if [ ! -f "$RUTA_LOGS" ]; then
    echo 0 > "$RUTA_LOGS"
fi

EMAIL="$1"
ID_HARD="$2"
IP="$3"

url_decode() {
    printf '%b' "$(echo "$1" | sed 's/+/ /g;s/%\([0-9A-Fa-f][0-9A-Fa-f]\)/\\x\1/g')"
}

sql_escape() {
    echo "$1" | sed "s/'/''/g"
}

EMAIL=$(url_decode "$EMAIL")
ID_HARD=$(url_decode "$ID_HARD")
IP=$(url_decode "$IP")

EMAIL_SQL=$(sql_escape "$EMAIL")
ID_HARD_SQL=$(sql_escape "$ID_HARD")
IP_SQL=$(sql_escape "$IP")

CLIENTE_QUERY="SELECT h.idhost, d.nombredominio, h.nombrehost, h.activo, h.valor, TIMESTAMPDIFF(SECOND, h.ultimoupdate, CURRENT_TIMESTAMP()) AS age_sec FROM hosts h JOIN dominios d ON h.iddominio=d.iddominio JOIN clientes c ON h.idcliente=c.idcliente WHERE h.idhardware='${ID_HARD_SQL}' AND LOWER(c.emailaddress)=LOWER('${EMAIL_SQL}') LIMIT 1;"
CLIENTE_RESULT=$(echo "$CLIENTE_QUERY" | mysql -u ddns -p$PASS_BASE ddns -s -N)

echo "$CLIENTE_QUERY" >> "$RUTA_LOGS"
echo "$CLIENTE_RESULT" >> "$RUTA_LOGS"

if [ -z "$CLIENTE_RESULT" ]; then
    echo "$(date) - Error: Host no encontrado para email/HWID!" >> "$RUTA_LOGS"
    printf '2\t\n'
    exit 0
fi

IDHOST=$(echo "$CLIENTE_RESULT" | awk '{print $1}')
NOMBRE_DOMINIO=$(echo "$CLIENTE_RESULT" | awk '{print $2}')
NOMBRE_HOST=$(echo "$CLIENTE_RESULT" | awk '{print $3}')
ACTIVO=$(echo "$CLIENTE_RESULT" | awk '{print $4}')
IP_ACTUAL=$(echo "$CLIENTE_RESULT" | awk '{print $5}')
AGE_SEC=$(echo "$CLIENTE_RESULT" | awk '{print $6}')
FQDN="$NOMBRE_HOST.$NOMBRE_DOMINIO"

if [ "$ACTIVO" = '0' ]; then
    printf '0\t%s\n' "$FQDN"
    exit 0
fi

# Si la IP ya coincide, responder OK con el hostname actual sin tocar DNS ni timestamps.
if [ "$IP_ACTUAL" = "$IP" ]; then
    echo "$(date) - IP sin cambios para $FQDN ($IP). Se responde OK sin nsupdate." >> "$RUTA_LOGS"
    printf '1\t%s\n' "$FQDN"
    exit 0
fi

if [ -z "$AGE_SEC" ] || [ "$AGE_SEC" -le 300 ]; then
    echo "$(date) - Error: host actualizado hace menos de 5 minutos! Omitiendo actualizacion de IP para $FQDN..." >> "$RUTA_LOGS"
    printf '3\t%s\n' "$FQDN"
    exit 0
fi

ZONE="$NOMBRE_DOMINIO"
SERVER="localhost"
DNS_KEY="/var/www/ddns/cgi/ddns.key"

nsupdate -k "$DNS_KEY" <<EOF
server $SERVER
zone $ZONE
update delete $FQDN A
update add $FQDN 300 A $IP
send
EOF

if [ $? -eq 0 ]; then
    echo "$(date) - La IP del host $FQDN fue actualizada exitosamente a $IP en el DNS! Actualizando host en base de datos..." >> "$RUTA_LOGS"
    UPDATE_QUERY="UPDATE hosts SET valor='${IP_SQL}', ultimoupdate=NOW() WHERE idhost='${IDHOST}';"
    echo "$UPDATE_QUERY" | mysql -u ddns -p$PASS_BASE ddns
    echo "$(date) - Actualización de IP para $FQDN a $IP realizada por cliente ${EMAIL}" >> "$RUTA_LOGS"
    printf '1\t%s\n' "$FQDN"
else
    echo "$(date) - Error: No se pudo actualizar el DNS para $FQDN!" >> "$RUTA_LOGS"
    echo "$DNS_KEY" >> "$RUTA_LOGS"
    echo "$SERVER" >> "$RUTA_LOGS"
    echo "$ZONE" >> "$RUTA_LOGS"
    echo "$FQDN" >> "$RUTA_LOGS"
    echo "$IP" >> "$RUTA_LOGS"
    printf '2\t%s\n' "$FQDN"
fi
