Wenn der Sambas als WINS-Server konfiguriert ist, so erlaubt die Belegung dieses Parameters, ein externes Programm aufzurufen, sobald sich die Einträge der Samba-WINS-Datenbasis verändern. Dadurch kann ein flexibler und vor allem dynamischer Datenabgleich mit dem DNS durchgeführt werden. (siehe auch Glossar DNSdns)
Bis zur Vorgängerversion musste der Sambas angehalten werden, wenn ein neuer Client dem LAN-Netz hinzugefügt wurde. Mit dieser Option kann der neue Client dem DNS-Server zur Laufzeit bekannt gemacht werden.
Der wins hook-Parameter kann mit einem Skript-Namen belegt werden, dessen Eingabeparameter wie folgt strukturiert werden müssen:
wins_hook <operation> <name> <nametype> <ttl> <IP_list>
Im folgenden wird beschrieben, wie die Parameter belegt werden können und welche Bedeutung sie haben:
Hier wird die Datenbasis-Operation angegeben, die ausgeführt werden soll. Dabei sind folgende Belegungen möglich:
Hier muss der NetBIOS-Name angegeben werden. Es wird zuerst die Gültigkeit der Parameter überprüft. Wird hier kein gültiger NetBIOS-Name angegeben, so wird die komplette wins hook-Belegung ignoriert und keine Aktion ausgeführt.
Hier muss der NetBIOS-Name-Typ als zweistellige hexadeziumale Ziffer eingegeben werden.
Dieser Parameter gibt an, wie lange (in Sekunden) der Name gültig sein soll.
Hier werden die IP-Adressen angegeben, die für den NetBIOS-Namen gültig sind. Wenn hier keine Adresse angegeben wird, so ist das gleichbedeutend mit der Aufforderung, den Eintrag mit dem angegebenen NetBIOS-Namen aus der DNS-Tabelle zu löschen.
Voreinstellung:
keine
Beispiel:
wins hook = nsupdate.sh
Das in 1.21 angegebene Beispiel stammt von Stephen Rothwell und kann im Directory examples der Samba-Quellen nachgeschlagen werden. Ich habe die Kommentare von Stephen ins Deutsche übertragen, sonst an dem Beispiel aber nichts verändert. Das Beispiel ist nicht sehr kompliziert und verdeutlicht, wie die Belegung des Parameters wins hook mit dem Skript nsupdate.sh funktioniert.
#!/bin/sh
#
# Beispiel-Skript fuer wins hook. Das Skript versucht
# den DNS mit einem neuen Eintrag des von Samba uebergebenen
# NetBIOS-Namen zu aktualisieren. Das wird bewerkstelligt
# durch das Loeschen aller Eintraege im DNS, welche diesem
# NetBIOS-Namen entsprechen, und das darauffolgende Eintragen
# aller sogenannter 'A'-Records.
#
# Autor: Stephen Rothwell <sfr@linuxcare.com>
#
#
# Konfigurierbare Einträge
#
# Hier wird die Domain angegeben, in der die Namen erzeugt
# werden.
#
# DIESER EINTRAG MUSS GEAENDERT WERDEN, UND ZWAR
# EINSCHLIESSLICH DES LETZTEN PUNKTES
#
# Es ist ratsam, eine Subdomain der Primary-Domain zu
# verwenden, um sicherzustellen, dass boeswillige Clients
# keine Namen existierender Maschinen verwenden oder
# loeschen koennen.
#
DOMAIN=wins.example.com.
#
# Hier wird der Parameter time to live des Namens in der
# DNS angegeben (in Sekunden)
#
TTL=3600
#
# NETBIOS-Name-Typen fuer die wir DNS Eintraege erzeugen
# wollen:
# 20 ist der server
# 00 ist die workstation
# 03 ist der user
#
USEFUL_TYPES=20 00 03
#
# Hier kann ein Cache angegeben werden, um zu verhindern,
# dass die gleichen Namen und IP-Adressen immer wieder
# aktualisiert werden. Falls diese Variable auskommentiert
# wird, wird kein Cache angelegt.
#
#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 ist vom Typadd, refresh, delete 1>&2
echo name ist der NETBIOS Name 1>&2
echo type ist der NETBIOS Namenstype 1>&2
echo ttl ist die NETBIOS Zeit to live 1>&2
echo ip_addr die IP-Adressen fuer diesen Namen 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 nsupdate kann nicht gefunden werden 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