#!/bin/sh
#
# Set either username/password or key in /etc/default/ddnss.
# The key is preferred.
#
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

NAME=ddnss
ENABLE=false
UPDATE=false
LOG_IP=false
CONFIG=/etc/default/${NAME}
IP_ADDR=0.0.0.0
CACHE_DIR=/var/cache/${NAME}
URL=https://www.ddnss.de
EXT_URL=http://icanhazip.com
LOGFILE=/var/log/${NAME}

print() { echo "$1"; [ x$2 = x ] || exit $2; }

[ x$(whoami) = xroot ] || print "ERROR: You're not root" 1

[ -e $CONFIG ] || print "ERROR: Configuration file $CONFIG not found" 1
. $CONFIG

[ x$ENABLE = x1 ] || [ x$ENABLE = xtrue ] || print "INFO: $NAME is disabled in $CONFIG" 0
[ x$HOSTNAME != x ] || print "ERROR: HOSTNAME is not set in $CONFIG" 1

GATEWAY=$(LANG=C route -n | grep ^0.0.0.0 | head -n1 | cut -d' ' -f10)
[ x$GATEWAY != x ] || print "ERROR: No default gateway" 1

[ -d "$CACHE_DIR" ] || mkdir -p $CACHE_DIR || print "ERROR: Can't create $CACHE_DIR" 1
[ -f "$CACHE_DIR/ip-address" ] || echo $IP_ADDR >$CACHE_DIR/ip-address || print "ERROR: Can't create $CACHE_DIR/ip-address" 1

if [ x$KEY = x ]; then
    [ -n "$USERNAME" ] || print "ERROR: USERNAME is not set in $CONFIG" 1
    [ -n "$PASSWORD" ] || print "ERROR: PASSWORD is not set in $CONFIG" 1
fi

IP_ADDR=$(wget -qO- "http://$GATEWAY:49000/igdupnp/control/WANIPConn1"\
 --header "Content-Type: text/xml; charset="utf-8""\
 --header "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress"\
 --post-data="<?xml version='1.0' encoding='utf-8'?>\
 <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'\
 xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>\
 <s:Body> <u:GetExternalIPAddress xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' />\
 </s:Body> </s:Envelope>" | grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>')

[ x$IP_ADDR != x0.0.0.0 ] || IP_ADDR=$(curl -sk $EXT_URL) || print "ERROR: Can't get actual ip-address" 1
[ x$IP_ADDR != x ] || IP_ADDR=0.0.0.0

OLD_IP_ADDR=$(cat $CACHE_DIR/ip-address)
if [ x$IP_ADDR != x ] && [ x$IP_ADDR != x0.0.0.0 ] && [ x$IP_ADDR != x$OLD_IP_ADDR ]; then
    rm -f $CACHE_DIR/ip-address
    echo $IP_ADDR >$CACHE_DIR/ip-address
    logger -t ${NAME}[$$] "$OLD_IP_ADDR -> $IP_ADDR"

    for HOST in $(echo $HOSTNAME | sed s/,/\ /g); do
	[ -e $CACHE_DIR/$HOST ] || ln -s $CACHE_DIR/ip-address $CACHE_DIR/$HOST
    done

    if [ x$LOG_IP = x1 ] || [ x$LOG_IP = xtrue ]; then
	echo "$(date +%Y.%m.%d-%H:%M:%S): $OLD_IP_ADDR -> $IP_ADDR" >>$LOGFILE
    fi

    if [ x$UPDATE = x1 ] || [ x$UPDATE = xtrue ]; then
	if [ x$KEY != x ]; then
	    curl -sk "${URL}/upd.php?key=$KEY&host=$HOSTNAME" >/dev/null 2>&1
	else
	    curl -sk "${URL}/upd.php?user=$USERNAME&pwd=$PASSWORD&host=$HOSTNAME" >/dev/null 2>&1
	fi
    fi
fi

if [ x$1 = x-v ] || [ x$1 = x--verbose ]; then echo $IP_ADDR; fi

exit 0
