#! /bin/sh set -e . ./dyndns.conf ## Check that the environment is set up properly. for i in DYNDNS_ZONE DYNDNS_HOST DYNDNS_SERVER DYNDNS_KEY SSH_CLIENT; do eval havep=\${$i+t}\${$i-nil} case $havep in nil) echo >&2 "$0: variable $i unset"; exit 2 ;; esac done ## Find the client address. This may be useful. set -- $SSH_CLIENT; client=$1 ## Parse the commad line. set -- $SSH_ORIGINAL_COMMAND fail_usage () { cat >&2 <&2 "$0: lookup $ck_name ($ck_rrty) failed: $*" exit 4 ;; *) err=nil cur_ttl=$2 cur_addr=$4 ;; esac } checkhost () { host=$1 case "$host" in *..* | .* | *. | *[!-_.a-zA-Z0-9]*) echo >&2 "$0: invalid hostname" exit 2 ;; esac matchp=nil for pat in $DYNDNS_HOST; do case "$host" in $pat) matchp=t ;; esac done case $matchp in nil) echo >&2 "$0: hostname not permitted"; exit 2 ;; esac } doupdate () { cmd=$1 case ${DYNDNS_TESTONLY_P-nil} in nil) nsupdate -k "$DYNDNS_KEY" <&2 "$0: incorrect address (wanted = $client; found = $1)" exit 3 ;; esac eval $doneargs checkhost "$host" case $addr in *:*) rrtype=AAAA ;; *.*) rrtype=A ;; *) echo >&2 "$0: failed to parse new address"; exit 2 ;; esac name=$host.$DYNDNS_ZONE check_current_state $(echo $rrtype | tr A-Z a-z) "$name" ttl=${DYNDNS_TTL-14400} case $err,$cur_ttl,$cur_addr in nil,$ttl,$addr) echo >&2 "$0: nothing to do"; exit 0 ;; esac doupdate " update delete $name IN $rrtype update add $name $ttl IN $rrtype $addr" ;; unset) eval $getarg; host=$arg eval $doneargs checkhost "$host" name=$host.$DYNDNS_ZONE check_current_state a "$name" case $err in nxdomain) echo >&2 "$0: nothing to do"; exit 0 ;; esac doupdate "update delete $name IN" ;; *) fail_usage ;; esac