chiark / gitweb /
@@ -1,8 +1,9 @@
[userv-utils.git] / dyndns / update
diff --git a/dyndns/update b/dyndns/update
new file mode 100755 (executable)
index 0000000..7a72503
--- /dev/null
@@ -0,0 +1,51 @@
+#!/bin/bash
+set -e
+
+zone="$1"
+subdomain="$2"
+interval_min="$3"
+interval_avg="$4"
+interval_mem="$5"
+
+now=`date +%s`
+charge=0
+
+case $subdomain in
+'@')   files=_                 ;;
+*)     files=$subdomain        ;;
+esac
+
+if test -f $files,timings && read lastup charge <$files,timings
+then
+       if [ $now -lt $[ $lastup + $interval_min ] ]; then
+               echo "wait $[ $lastup + $interval_min - $now ]"
+               echo >&2 "must wait at least $interval_min between updates"
+               exit 75
+       fi
+       charge=$[ $charge + $interval_avg - ($now - $lastup) ]
+       if [ $charge -gt $interval_mem ]; then
+               echo "wait $[ $charge - $interval_mem ]"
+               echo >&2 "must wait on average $interval_avg between updates"
+               exit 75
+       fi
+       if [ $charge -lt 0 ]; then charge=0; fi
+fi
+
+sort >$files,new
+
+if test -f $files,data
+then
+       set +e
+       diff >/dev/null $files,data $files,new
+       diff=$?
+       set -e
+
+       if [ $diff = 0 ]; then echo 'unchanged'; exit 0; fi
+       if [ $diff != 1 ]; then exit 1; fi
+fi
+
+echo $now $charge >$files,timings.new
+mv -f $files,timings.new $files,timings
+mv $files,new $files,data
+
+exec /usr/local/lib/userv/dyndns/install $zone