Sie können den Oracle Solaris DHCP-Client so konfigurieren, dass er ein ausführbares Programm oder ein Skript aufruft, das eine für das Clientsystem geeignete Aktion ausführt. Dieses Programm oder Skript, das als Ereignisskript bezeichnet wird, wird automatisch ausgeführt, nachdem bestimmte DHCP-Leasing-Ereignisse aufgetreten sind. Das Ereignisskript kann zum Ausführen anderer Befehle, Programme oder Skripten als Reaktion auf bestimmte Leasing-Ereignisse verwendet werden. Zum Verwenden dieser Funktion müssen Sie eigene Ereignisskripten bereitstellen.
Die folgenden Ereignis-Schlüsselwörter werden von dhcpagent-Daemon verwendet, um DHCP-Leasing-Ereignisse zu kennzeichnen:
Beschreibung
Die Schnittstelle wird für DHCP konfiguriert. Der Client erhält eine Bestätigungsnachricht (DHCPv4 ACK) oder (DHCPv6 Reply) vom DHCP-Server, die eine Leasing-Anforderung nach einer IP-Adresse gewährt. Das Ereignisskript wird unmittelbar nach der erfolgreichen Konfiguration der Schnittstelle aufgerufen.
Der Client verlängert erfolgreich ein Leasing. Das Ereignisskript wird aufgerufen, unmittelbar nachdem der Client die Bestätigungsnachricht vom DHCP-Server über die Erneuerungsanforderung erhalten hat.
Das Leasing läuft ab, wenn die Leasing-Zeit gestrichen ist. Bei DHCPv4 wird das Ereignisskript aufgerufen, unmittelbar bevor die geleaste Adresse von der Schnittstelle entfernt und die Schnittstelle als offline gekennzeichnet wird. Bei DHCPv6 wird das Ereignisskript aufgerufen, unmittelbar bevor die letzte verbleibende geleaste Adresse von der Schnittstelle entfernt wird.
Der Client verwirft das Leasing, um die Schnittstelle aus der DHCP-Verwaltung zu entfernen. Das Ereignisskript wird aufgerufen, unmittelbar bevor die Schnittstelle aus der DHCP-Verwaltung entfernt wird.
Der Client gibt die IP-Adresse frei. Das Ereignisskript wird ausgeführt, unmittelbar bevor der Client die Adresse der Schnittstelle freigibt und RELEASE- oder DHCPv6 Release-Pakete an den DHCP-Server sendet.
Eine Schnittstelle bezieht über die DHCPv4 INFORM- oder die DHCPv6 Information-Request-Nachricht neue oder aktualisierte Konfigurationsinformationen von einem DHCP-Server. Dieser Ereignisse treten auf, wenn der DHCP-Client nur Konfigurationsinformationen vom Server und kein Leasing für eine IP-Adresse bezieht.
Während des Ablaufs der Leasing-Zeit, wenn noch mindestens ein Leasing gültig ist, wird das Ereignisskript aufgerufen, bevor abgelaufene Adressen entfernt werden. Die entfernten Adressen werden mit dem Flag IFF_DEPRECATED gekennzeichnet.
Bei jedem dieser Ereignisse ruft der dhcpagent-Daemon den folgenden Befehl auf:
/etc/dhcp/eventhook interface event |
dabei steht Schnittstelle für die Schnittstelle, die DHCP verwendet und Ereignis ist eines der oben beschriebenen Ereignisschlüsselwörter. Angenommen, die Schnittstelle ce0 wurde als erstes für DHCP konfiguriert, so ruft der dhcpagent-Daemon das Ereignisskript wie folgt auf:
/etc/dhcp/eventhook ce0 BOUND |
Um ein Ereignisskript verwenden zu können, müssen Sie Folgendes ausführen:
Benennen der ausführbaren Datei /etc/dhcp/eventhook.
Einstellen des Eigners der Datei auf root.
Einstellen der Berichtigungen auf 755 (rwxr-xr-x ).
Schreiben Sie das Skript oder Programm, um eine Abfolge von Aktionen als Reaktion auf eines der dokumentierten Ereignisse auszuführen. Da Sun eventuell neue Ereignismodelle hinzufügt, muss das Programm alle nicht erkannten Ereignisse oder solche, die keine Aktionen erfordern, stillschweigend ignorieren. Beispielsweise könnte das Programm oder Skript in eine Protokolldatei schreiben, wenn das Ereignis RELEASE lautet und alle anderen Ereignisse ignorieren.
Sorgen Sie dafür, das Skript bzw. Programm nicht-interaktiv ist. Bevor das Ereignis wird aufgerufen wird, sind stdin, stdout und stderr mit /dev/null verbunden. Um die Ausgabe oder Fehler zu sehen, müssen Sie zu einer Datei umleiten.
Das Ereignisskript übernimmt die Programmumgebung vom dhcpagent-Daemon und wird mit root-Berechtigungen ausgeführt. Das Skript kann das Dienstprogramm dhcpinfo verwenden, um ggf. weitere Informationen zur Schnittstelle zu beziehen. Weitere Informationen finden Sie in der Manpage dhcpinfo(1).
Der dhcpagent-Daemon wartet, bis das Ereignisskript für alle Ereignisse beendet ist. Wenn das Ereignisskript nach 55 Sekunden nicht beendet ist, sendet der dhcpagent-Daemon ein SIGTERM-Signal an den Skriptprozess. Wird der Prozess nach weiteren 3 Sekunden nicht beendet, sendet der Daemon ein SIGKILL-Signal, um den Prozess zu beenden.
Ein Beispiel eines Ereignisskripts finden Sie in der Manpage dhcpagent(1M).
Beispiel 16–3 zeigt, wie Sie ein DHCP-Ereignisskript verwenden, um den Inhalt der /etc/resolv.conf-Datei auf dem neuesten Stand zu halten. Wenn die Ereignisse BOUND und EXTEND auftreten, ersetzt das Skript die Namen von Domänenserver und Namensserver. Wenn die Ereignisse EXPIRE, DROP und RELEASE auftreten, entfernt das Skript die Namen von Domänenserver und Namensserver aus der Datei.
Das Beispielskript geht davon aus, dass DHCP die autoritative Quelle für die Namen von Domänenserver und Namensserver ist. Weiterhin geht das Skript davon aus, dass alle Schnittstellen unter der Verwaltung von DHCP konsistente und aktuelle Informationen zurückgeben. Diese Annahmen spiegeln eventuell nicht die Bedingungen auf Ihrem System wider.
#!/bin/ksh -p PATH=/bin:/sbin export PATH umask 0222 # Refresh the domain and name servers on /etc/resolv.conf insert () { dnsservers=`dhcpinfo -i $1 DNSserv` if [ -n "$dnsservers" ]; then # remove the old domain and name servers if [ -f /etc/resolv.conf ]; then rm -f /tmp/resolv.conf.$$ sed -e '/^domain/d' -e '/^nameserver/d' \ /etc/resolv.conf > /tmp/resolv.conf.$$ fi # add the new domain dnsdomain=`dhcpinfo -i $1 DNSdmain` if [ -n "$dnsdomain" ]; then echo "domain $dnsdomain" >> /tmp/resolv.conf.$$ fi # add new name servers for name in $dnsservers; do echo nameserver $name >> /tmp/resolv.conf.$$ done mv -f /tmp/resolv.conf.$$ /etc/resolv.conf fi } # Remove the domain and name servers from /etc/resolv.conf remove () { if [ -f /etc/resolv.conf ]; then rm -f /tmp/resolv.conf.$$ sed -e '/^domain/d' -e '/^nameserver/d' \ /etc/resolv.conf > /tmp/resolv.conf.$$ mv -f /tmp/resolv.conf.$$ /etc/resolv.conf fi } case $2 in BOUND | EXTEND) insert $1 exit 0 ;; EXPIRE | DROP | RELEASE) remove exit 0 ;; *) exit 0 ;; esac