getarg='case $# in 0) fail_usage ;; esac; arg=$1; shift'
doneargs='case $# in 0) ;; *) fail_usage ;; esac'
+check_current_state () {
+ ck_rrty=$1 ck_name=$2
+ set -- $(adnshost --config "nameserver $DYNDNS_SERVER" \
+ -Fi -Tt -t$ck_rrty "$ck_name")
+ case $1,$2,$3,$5 in
+ ";,failed,permfail,nxdomain" | ";,failed,permfail,nodata")
+ err=$5
+ ;;
+ ";,failed,"*)
+ shift 8
+ echo >&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
doupdate () {
cmd=$1
-
-nsupdate -k "$DYNDNS_KEY" <<EOF
+ case ${DYNDNS_TESTONLY_P-nil} in
+ nil)
+ nsupdate -k "$DYNDNS_KEY" <<EOF
server $DYNDNS_SERVER
zone $DYNDNS_ZONE
$cmd
send
EOF
+ ;;
+ *)
+ cat <<EOF
+$cmd
+EOF
+ ;;
+ esac
}
eval $getarg; cmd=$arg
0,t,*) fail_usage ;;
*,nil,"$client" | *,t,*) addr=$1; shift ;;
*)
- echo >&2 "$0: incorrect address (wanted = $2; found = $addr)"
+ echo >&2 "$0: incorrect address (wanted = $client; found = $1)"
exit 3
;;
esac
*) 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 ${DYNDNS_TTL-14400} IN $rrtype $addr"
+ 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"
;;
*)