Initial import.
[dyndns] / bin / update
CommitLineData
751afaff
MW
1#! /bin/sh
2
3set -e
4. ./dyndns.conf
5
6## Check that the environment is set up properly.
7for 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
10done
11
12## Find the client address. This may be useful.
13set -- $SSH_CLIENT; client=$1
14
15## Parse the commad line.
16set -- $SSH_ORIGINAL_COMMAND
17
18fail_usage () {
19 cat >&2 <<EOF
20usage: $0 COMMAND ARGS...
21
22Commands:
23 set [-force] HOST [ADDR]
24 unset HOST
25EOF
26 exit 1
27}
28getarg='case $# in 0) fail_usage ;; esac; arg=$1; shift'
29doneargs='case $# in 0) ;; *) fail_usage ;; esac'
30
31checkhost () {
32 host=$1
33
34 matchp=nil
35 for pat in $DYNDNS_HOST; do
36 case "$host" in $pat) matchp=t ;; esac
37 done
38 case $matchp in nil) echo >&2 "$0: hostname not permitted"; exit 2 ;; esac
39}
40
41doupdate () {
42 cmd=$1
43
44nsupdate -k "$DYNDNS_KEY" <<EOF
45server $DYNDNS_SERVER
46zone $DYNDNS_ZONE
47$cmd
48send
49EOF
50}
51
52eval $getarg; cmd=$arg
53case "$cmd" in
54 set)
55 forcep=nil
56 eval $getarg
57 case "$arg" in -force) forcep=t; eval $getarg ;; esac
58 host=$arg
59 case "$#,$forcep,$1" in
60 0,nil,*) addr=$client ;;
61 0,t,*) fail_usage ;;
62 *,nil,"$client" | *,t,*) addr=$1; shift ;;
63 *)
64 echo >&2 "$0: incorrect address (wanted = $2; found = $addr)"
65 exit 3
66 ;;
67 esac
68 eval $doneargs
69 checkhost "$host"
70 case $addr in
71 *:*) rrtype=AAAA ;;
72 *.*) rrtype=A ;;
73 *) echo >&2 "$0: failed to parse new address"; exit 2 ;;
74 esac
75 name=$host.$DYNDNS_ZONE
76 doupdate "
77 update delete $name IN $rrtype
78 update add $name ${DYNDNS_TTL-14400} IN $rrtype $addr"
79 ;;
80 unset)
81 eval $getarg; host=$arg
82 eval $doneargs
83 checkhost "$host"
84 name=$host.$DYNDNS_ZONE
85 doupdate "update delete $name IN"
86 ;;
87 *)
88 fail_usage
89 ;;
90esac