4a650b0eaf4ec7a5f3b2fa4e63f1a4513180c2ec
[shutils.git] / nsd / nsd-dynipwatch
1 #!/bin/bash
2
3 logfile=
4 watchfile=
5
6 while true; do
7 case $1 in
8 --log) logfile=$2; shift ;;
9 --watchfile) watchfile=$2; shift ;;
10 -h|--help)
11 echo "$0 [--log logfile] [--watchfile /tmp/\${host}.ip] zonefile host"
12 exit 0
13 ;;
14 *) break ;;
15 esac
16 shift
17 done
18
19
20 zonefile=$1
21 host=$2
22 [ -z "${watchfile}" ] && watchfile=/tmp/${host}.ip
23 [ -z "${logfile}" ] && logfile="/var/log/nsd-dynipwatch-${host}.log"
24
25
26 echo "Watch ${watchfile} for host ${host} and update ${zonefile}. Logfile: ${logfile}"
27
28
29 function getAddrFromZonefile # <host> <zonefile>
30 {
31 egrep "^$1\\s.*\\sA\\s.*" $2 | egrep -o "([0-9]+\\.)+[0-9]+"
32 }
33
34 function setAddrInZonefile # <host> <zonefile> <addr>
35 {
36 sed -i -e "s_^\\($1\\s.*A\\s.*\\s\\)\\([0-9]\\+\\.\\)\\+[0-9]\\+_\\1$3_g" "$2"
37 }
38
39 function getSerialFromZonefile # <zonefile>
40 {
41 awk '/; serial/{print$1}' "$1"
42 }
43
44 function setSerialInZonefile # <zonefile> <serial>
45 {
46 sed -i -e "s_^\\(.*\\s\\)[0-9]\+\\(\\s\\+; serial.*\\)_\\1$2\\2_g" "$1"
47 }
48
49 function run()
50 {
51 touch ${watchfile}
52 while true; do
53 inotifywait -q -t 30 -e close_write "${watchfile}" > /dev/null
54 ret=$?
55 [ "$ret" = "0" ] || continue
56
57 oldip=`getAddrFromZonefile "${host}" "${zonefile}"`
58 newip=`cat ${watchfile}`
59 echo "`date '+%a %F %T'` :: ${oldip} => ${newip}."
60
61 if ! echo "${newip}" | egrep -q "^([0-9]+\\.)+[0-9]+$" ; then
62 echo "Wrong format of new IP address."
63 continue
64 fi
65
66 if ! [ "${oldip}" = "${newip}" ]; then
67 serial=`getSerialFromZonefile "${zonefile}"`
68 serial=$(( $serial + 1))
69 echo " Update IP address. New serial ${serial}."
70 setAddrInZonefile "${host}" "${zonefile}" "${newip}"
71 setSerialInZonefile "${zonefile}" "${serial}"
72 /etc/nsd3/signzone.sh sthu.org
73 nsdc rebuild && nsdc reload && nsdc notify
74 fi
75 done
76 }
77
78
79 run >> $logfile
80