silent update
[ssh-dyndns.git] / ssh-dyndns
1 #!/bin/sh
2 # dyndns via ssh login + tinydns (djbdns/dbndns)
3 #
4 # usage:
5 # $ ssh dyndns@example.org home.example.org
6 #
7 # @author Christian Weiske <cweiske@cweiske.de>
8
9 if [ -z "$SSH_CONNECTION" ]; then
10    echo "no ssh connection" >&2
11    exit 1
12 fi
13
14 remoteip=${SSH_CLIENT%% *}
15 if [ -z "$remoteip" ]; then
16    echo "ssh client IP not found" >&2
17    exit 2
18 fi
19
20 #TODO: allow removal of domains
21 #TODO: support multiple domains
22 if [ -z "$2" ]; then
23     echo Missing argument: domain name >&2
24     exit 3
25 fi
26 domain="$2"
27
28 #load config files
29 if [ -f ~/.config/ssh-dyndns.sh ]; then
30     . ~/.config/ssh-dyndns.sh
31 fi
32 if [ -f /etc/ssh-dyndns.sh ]; then
33     . /etc/ssh-dyndns.sh
34 fi
35
36 if [ -z "$data_dir" ]; then
37     echo '$data_dir not set' >&2
38     exit 4
39 fi
40 if [ ! -d "$data_dir" ]; then
41     echo "$data_dir does not exist" >&2
42     exit 5
43 fi
44 if [ ! -f "$data_dir/Makefile" ]; then
45     echo "$data_dir misses Makefile" >&2
46     exit 6
47 fi
48
49 if [ ! -z "$domain_patterns" ]; then
50     ok=0
51     for single_dp in $domain_patterns; do
52         case "$domain" in
53             ($single_dp) ok=1;;
54         esac
55     done
56     if [ $ok -ne 1 ]; then
57         echo "Domain \"$domain\" does not match \$domain_pattern" >&2
58         exit 7
59     fi
60 fi
61
62
63 file_pattern="${file_pattern:-data-dyndns-%DOMAIN%}"
64 timeout=${timeout:-300}
65
66 datafile=${data_dir}`echo $file_pattern | sed "s/%DOMAIN%/$domain/"`
67
68 if [ `echo "$remoteip"| sed "s/://"` != "$remoteip" ]; then
69     echo "IPv6 not supported yet" >&2
70     # we need ipv6 address expansion
71     exit 8
72 fi
73
74 #=cweiske.de:5.35.241.22
75 djbdnsline="=${domain}:${remoteip}:${timeout}"
76
77 update=1
78 if [ -f "$datafile" ]; then
79     currentdata=`head -n1 "$datafile"|tr -d '\n'`
80     if [ "$currentdata" = "$djbdnsline" ]; then
81         #no need to update
82         update=0
83     fi
84 fi
85 if [ $update -eq 0 ]; then
86     exit
87 fi
88
89 echo $djbdnsline > $datafile
90
91 #TXT record with last update
92 date=`date --rfc-3339=seconds|tr : .|tr -d '\n'`
93 djbdnsTxtLine="'${domain}:Last update ${date}.:${timeout}"
94 echo $djbdnsTxtLine >> $datafile
95
96 #compile dns data
97 cd "$data_dir"
98 sudo make --silent