summaryrefslogtreecommitdiffstats
path: root/examples/scripts/wins_hook/dns_update
blob: 14fc1fe74dde3fc137af49054c02a2014edc6ca8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/bin/sh
#
# Example script for "wins hook".  This attempts to update the DNS with
# new A records for the NETBIOS name that Samba passes us. We do this
# the simple way, by deleting all DNS records for the name and then
# re-adding all the expected 'A' records.
#
# Written by Stephen Rothwell <sfr@linuxcare.com>
#

#
# Configurable things
#
# The domain in which to create names
#   YOU MUST CHANGE THIS
# N.B. include the trailing dot
#
# It is a good idea to use a subdomain of your primary domain to ensure
# that rogue machines can't take over (or delete) important names on
# your network.
DOMAIN=wins.example.com.

#
# The DNS TTL to give the records (in seconds)
#
TTL=3600
#
# NETBIOS name types that we want to create DNS records for:
#	20 is server
#	00 is workstation
#	03 is user
#
USEFUL_TYPES="20 00 03"
#
# The name of a cache file to use to avoid continual updates
# of the same name and IP addresses.  If you comment this out
# then the cache is not kept at all.
#
#CACHE_FILE=/usr/local/samba/var/wins_update.cache

if [ $# -lt 4 ]; then
	echo "Usage: $0 op name type ttl [ip_addr ...]" 1>&2
	echo "       op is one of add, refresh, delete" 1>&2
	echo "       name is the NETBIOS name" 1>&2
	echo "       type is the NETBIOS name type" 1>&2
	echo "       ttl is the NETBIOS time to live" 1>&2
	echo "       ip_addr's are the remaining IP addresses for this name" 1>&2
	exit 1
fi

NSUPDATE=$(which nsupdate)
[ -x "$NSUPDATE" ] || NSUPDATE=/usr/bin/nsupdate
[ -x "$NSUPDATE" ] || NSUPDATE=/sbin/nsupdate
[ -x "$NSUPDATE" ] || NSUPDATE=/usr/sbin/nsupdate
[ -x "$NSUPDATE" ] || {
	echo "Cannot find nsupdate." 1>&2
	exit 1
}

OP=$1
NAME=$2
TYPE=$3
WINS_TTL=$4
shift 4
IP_ADDRS="$@"

do_update=0
for i in $USEFUL_TYPES; do
	[ "$TYPE" = "$i" ] && do_update=1
done
[ $do_update = 1 ] || exit 0

if [ -n "$CACHE_FILE" ]; then
	if [ -r "$CACHE_FILE" ]; then
		fgrep -q -x -i "$NAME $IP_ADDRS" "$CACHE_FILE" &&
			exit 0
		grep -v -i "^$NAME " "$CACHE_FILE" >"$CACHE_FILE".$$
	fi
	echo "$NAME $IP_ADDRS" >>"$CACHE_FILE".$$
	mv "$CACHE_FILE" "$CACHE_FILE".old 2>/dev/null
	mv "$CACHE_FILE".$$ "$CACHE_FILE"
fi

{
	echo update delete $NAME.$DOMAIN
	for i in $IP_ADDRS; do
		echo update add $NAME.$DOMAIN $TTL A $i
	done
	echo
} 2>/dev/null | $NSUPDATE >/dev/null 2>&1 &

exit 0