Vous pouvez configurer le client DHCP Oracle Solaris de façon à l'utiliser comme un programme ou un script exécutable en vue d'effectuer toute actions nécessaire sur le système client. Le programme ou le script, appelé script d'événement, est exécuté automatiquement dès que certains événements liés au bail DHCP se produisent. Vous pouvez vous servir du script d'événement pour exécuter d'autres commandes, programmes ou scripts en réponse à des événements de bail spécifiques. Pour ce faire, vous devez fournir votre propre script d'événement.
Les mots-clés d'événement suivants sont utilisés par dhcpagent pour signifier des événements de bail DHCP :
Description
L'interface est configurée pour DHCP. Le client reçoit l'accusé de réception (DHCPv4 ACK) ou (DHCPv6 Reply ) du serveur DHCP, qui lui accorde la demande de bail pour une adresse IP. Le script d'événement est appelé immédiatement après la configuration de l'interface.
Le client prolonge le bail de la ligne spécialisée. Le script d'événement est appelé dès que le client reçoit l'accusé de réception du serveur DHCP ayant trait à la demande de renouvellement.
Le bail expire à la date butoir fixée. Pour DHCPv4, le script d'événement est appelé avant la suppression de l'adresse louée de l'interface et l'interface est signalée comme arrêtée. Pour DHCPv6, le script d'événement est appelé avant la suppression des dernières adresses louées de l'interface.
Le client abandonne la ligne spécialisée pour retirer l'interface du contrôle de DHCP. Le script d'événement est appelé juste avant que l'interface n'échappe au contrôle de DHCP.
Le client libère l'adresse IP. Le script d'événement est appelé juste avant que le client ne libère l'adresse sur l'interface et n'envoie le paquet DHCPv4 RELEASE ou DHCPv6 Release au serveur DHCP.
Une interface se procure des données de configuration nouvelles ou mises à jour à partir d'un serveur DHCP par l'intermédiaire du paquet DHCPv4 INFORM ou du message DHCPv6 Information-Request. Ces événements se produisent si le client DHCP obtient uniquement les paramètres de configuration du serveur, mais pas le bail d'une adresse IP.
Pendant la phase d'expiration, lorsqu'il reste un ou plusieurs baux valides, le script d'événement est appelé juste avant la suppression des adresses expirées. Les adresses effacées sont signalées par l'indicateur IFF_DEPRECATED.
Pour chacun de ces événements, dhcpagent exécute la commande suivante :
/etc/dhcp/eventhook interface event |
où interface représente l'interface faisant appel à DHCP et événement correspond à un des mots-clés d'événement décrits précédemment. Par exemple, la première fois que vous configurez l'interface ce0 pour DHCP, dhcpagent appelle le script d'événement de la façon suivante :
/etc/dhcp/eventhook ce0 BOUND |
Pour utiliser la fonction de script d'événement, vous devez effectuer les opérations suivantes :
Donner le nom /etc/dhcp/eventhook au fichier exécutable.
Définir root comme propriétaire du fichier.
Configurer les permissions sur 755 (rwxr-xr-x ).
Écrire le script ou le programme afin de réaliser une série d'actions en réponse à un des événements documentés. Comme Sun est susceptible d'ajouter de nouveaux événements, le programme doit ignorer, en silence, les événements qui ne sont pas reconnus ou qui n'exigent aucune action. Le programme ou le script peut, par exemple, inscrire des informations dans un fichier journal en présence de l'événement RELEASE, et ignorer tous les autres événements.
Rendre le script ou le programme non interactif. Avant de recourir au script d'événement, stdin, stdout et stderr se connectent à /dev/null. Pour afficher la sortie ou les erreurs, vous devez la/les rediriger vers un fichier.
Le script d'événement hérite son environnement de programme de dhcpagent et s'exécute avec les privilèges root. Il peut faire appel à l'utilitaire dhcpinfo pour obtenir des informations supplémentaires au sujet de l'interface, si cela est nécessaire. Pour plus d'informations, reportez-vous à la page de manuel dhcpinfo(1).
Le démon dhcpagent attend que le script d'événement prenne fin pour tous les événements. Si le script d'événement ne se termine au bout de 55 secondes, dhcpagent envoie un signal SIGTERM au processus du script. Si le processus ne se termine par au bout de trois secondes supplémentaires, le démon envoie un signal SIGKILL pour interrompre le processus.
Vous trouverez un exemple de script d'événement dans la page de manuel dhcpagent(1M).
L'Exemple 16–3 illustre l'utilisation d'un script d'événement DHCP pour maintenir le contenu du fichier /etc/resolv.conf à jour. Lorsque les événements BOUND et EXTEND se produisent, le script remplace les noms du serveur de domaine et du serveur de noms. Lorsque les événements EXPIRE, DROP et RELEASE se produisent, le script supprime les noms du serveur de domaine et du serveur de noms du fichier.
Le script proposé en exemple considère que DHCP est la source qui fait autorité pour les noms du serveur de domaine et le serveur de noms. Il suppose également que toutes les interfaces sous le contrôle de DHCP renvoient des informations cohérentes et à jour. Il est possible que ces conditions ne soient pas réunies sur votre système.
#!/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