6 ## Check that the environment is set up properly.
7 for i
in DYNDNS_ZONE DYNDNS_HOST DYNDNS_SERVER DYNDNS_KEY SSH_CLIENT
; do
8 eval havep
=\
${$i+t}\
${$i-nil}
9 case $havep in nil
) echo >&2 "$0: variable $i unset"; exit 2 ;; esac
12 ## Find the client address. This may be useful.
13 set -- $SSH_CLIENT; client
=$1
15 ## Parse the commad line.
16 set -- $SSH_ORIGINAL_COMMAND
20 usage: $0 COMMAND ARGS...
23 set [-force] HOST [ADDR]
28 getarg
='case $# in 0) fail_usage ;; esac; arg=$1; shift'
29 doneargs
='case $# in 0) ;; *) fail_usage ;; esac'
31 check_current_state
() {
33 set -- $
(adnshost
--config
"nameserver $DYNDNS_SERVER" \
34 -Fi
-Tt
-t
$ck_rrty "$ck_name")
36 ";,failed,permfail,nxdomain" |
";,failed,permfail,nodata")
41 echo >&2 "$0: lookup $ck_name ($ck_rrty) failed: $*"
45 err
=nil cur_ttl
=$2 cur_addr
=$4
54 *..
* | .
* |
*. |
*[!-_.a-zA-Z0-9
]*)
55 echo >&2 "$0: invalid hostname"
61 for pat
in $DYNDNS_HOST; do
62 case "$host" in $pat) matchp
=t
;; esac
64 case $matchp in nil
) echo >&2 "$0: hostname not permitted"; exit 2 ;; esac
69 case ${DYNDNS_TESTONLY_P-nil} in
71 nsupdate
-k
"$DYNDNS_KEY" <<EOF
86 eval $getarg; cmd
=$arg
91 case "$arg" in -force
) forcep
=t
; eval $getarg ;; esac
93 case "$#,$forcep,$1" in
94 0,nil
,*) addr
=$client ;;
96 *,nil
,"$client" |
*,t
,*) addr
=$1; shift ;;
98 echo >&2 "$0: incorrect address (wanted = $client; found = $1)"
107 *) echo >&2 "$0: failed to parse new address"; exit 2 ;;
109 name
=$host.
$DYNDNS_ZONE
110 check_current_state $
(echo $rrtype |
tr A-Z a-z
) "$name"
111 ttl
=${DYNDNS_TTL-14400}
112 case $err,$cur_ttl,$cur_addr in
113 nil
,$ttl,$addr) echo >&2 "$0: nothing to do"; exit 0 ;;
116 update delete $name IN $rrtype
117 update add $name $ttl IN $rrtype $addr"
120 eval $getarg; host=$arg
123 name
=$host.
$DYNDNS_ZONE
124 check_current_state a
"$name"
126 nxdomain
) echo >&2 "$0: nothing to do"; exit 0 ;;
128 doupdate
"update delete $name IN"