DHCP Client Event Scripts
You can set up the Solaris DHCP client to run an executable
program or script that can perform any action that is appropriate for the
client system. The program or script, which is called an event script, is automatically executed
after certain DHCP lease events occur. The event script can be used to
run other commands, programs, or scripts in response to specific lease events. You
must provide your own event script to use this feature.
The following event keywords are used by dhcpagent to signify DHCP lease events:
- Event Keyword
Description
- BOUND
The interface is configured for DHCP. The client receives the acknowledgement message (ACK) from the DHCP server, which grants the lease request for an IP address. The event script is invoked immediately after the interface is configured successfully.
- EXTEND
The client successfully extends a lease. The event script is invoked immediately after the client receives the acknowledgement message from the DHCP server for the renew request.
- EXPIRE
The lease expires when the lease time is up. The event script is invoked immediately before the leased address is removed from the interface and the interface is marked as down.
- DROP
The client drops the lease to remove the interface from DHCP control. The event script is invoked immediately before the interface is removed from DHCP control.
- RELEASE
The client relinquishes the IP address. The event script is invoked immediately before the client releases the address on the interface and sends the RELEASE packet to the DHCP server.
With each of these events, dhcpagent invokes the following command:
/etc/dhcp/eventhook interface event
where interface is the interface that is using DHCP and event is one
of the event keywords described previously. For example, when the ce0 interface is first
configured for DHCP, the dhcpagent invokes the event script as follows:
/etc/dhcp/eventhook ce0 BOUND
To use the event script feature, you must do the following:
Name the executable file /etc/dhcp/eventhook.
Set the owner of the file to be root.
Set permissions to 755 (rwxr-xr-x).
Write the script or program to perform a sequence of actions in response to any of the documented events. Because Sun might add new events, the program must silently ignore any events that are not recognized or do not require action. For example, the program or script might write to a log file when the event is RELEASE, and ignore all other events.
Make the script or program noninteractive. Before the event script is invoked, stdin, stdout, and stderr are connected to /dev/null. To see the output or errors, you must redirect to a file.
Enable the script or program to be run with the following command:
/etc/dhcp/eventhook interface event
The event script inherits its program environment from dhcpagent, and runs with root
privileges. The script can use the dhcpinfo utility to obtain more information
about the interface, if necessary. See the dhcpinfo(1) man page for more information.
The dhcpagent daemon waits for the event script to exit on all events.
If the event script does not exit after 55 seconds, dhcpagent sends
a SIGTERM signal to the script process. If the process still does not
exit after three additional seconds, the daemon sends a SIGKILL signal to kill
the process.
The dhcpagent(1M) man page includes one example of an event script.
Example 16-3 shows how to use a DHCP event script to keep the content
of the /etc/resolv.conf file up to date. When the BOUND and EXTEND events occur,
the script replaces the names of the domain server and name server. When
the EXPIRE, DROP and RELEASE events occur, the script removes the names of
the domain server and name server from the file.
Note - The example script assumes that DHCP is the authoritative source for the names
of the domain server and the name server. The script also assumes that
all interfaces under DHCP control return consistent and current information. These assumptions might
not reflect conditions on your system.
Example 16-3 Event Script for Updating the
/etc/resolv.conf File
#!/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