diff options
author | Evan Hunt <each@isc.org> | 2007-04-27 23:34:39 +0000 |
---|---|---|
committer | Evan Hunt <each@isc.org> | 2007-04-27 23:34:39 +0000 |
commit | 46153375b006bf72b3bb7c7b097ff32f0ccd1427 (patch) | |
tree | 99a40889cb6c243f0209c89fa3cec3b1d507fe58 | |
parent | 1ba87b376be00aa767e70da4e7932c8857c7db85 (diff) | |
download | isc-dhcp-46153375b006bf72b3bb7c7b097ff32f0ccd1427.tar.gz |
Added contrib/dhclient-tz-exithook.sh script for processing tzname (option 101)
[rt16755]
-rw-r--r-- | contrib/dhclient-tz-exithook.sh | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/contrib/dhclient-tz-exithook.sh b/contrib/dhclient-tz-exithook.sh new file mode 100644 index 00000000..9aa63c03 --- /dev/null +++ b/contrib/dhclient-tz-exithook.sh @@ -0,0 +1,179 @@ +#!/bin/bash +# +# dhclient-tz-exithook.sh +# Version 1.01 elear +# +# Copyright (c) 2007, Cisco Systems, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# - Neither the name of Cisco Systems, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# the following script is used to set the timezone based on the new +# dhcp timezone option defined currently in the IETF document +# draft-ietf-dhc-timezone-option-04.txt. + +# this code is intended for use with ISC's dhclient. it is to be called +# either as, or by, dhclient-exit-hooks +# +# As this is test code, in order for it to be called two changes +# must be made to /etc/dhclient.conf. First, dhclient.conf must be +# aware of the tzName option. The IANA has assigned tzName option +# code 101. You may need to add this to your configuration file. +# +# option tzName code 101 = text; +# +# Next, add tzName to the list of options in the "request" statement. +# For example: +# +# request subnet-mask, broadcast-address, time-offset, routers, +# domain-name, domain-name-servers, host-name, tzName; +# +# +# And of course make sure that your dhcp server is transmitting timezone +# information for option 101. For IOS this can be done as follows: +# +# option 101 ascii "Europe/Berlin" +# + +timefile=/etc/localtime +oldfile=$timefile.old +tmpfile=$timefile.$$ + +# function to clean up just in case we are interrupted or something +# bad happens. +restore_file () { + + if [ ! -f $timefile ]; then + $DEBUG mv $tmpfile $timefile + fi + $DEBUG rm $tmpfile + exit +} + + +#set DEBUG to "echo" to see what would happen. +if [ x$DEBUG = x ]; then + DEBUG= +fi + +# if something has already gone wrong we're not doing a thing. +if [ x$exit_status != x0 ]; then + exit $exit_status +fi + + +# if we don't have a new timezone, then we have nothing to change, so +# goodbye. +if [ x$new_tzName = x ]; then + exit 0 +fi + +# if the timezone doesn't exist, goodbye. +if [ ! -e $timefile ]; then + exit 0 +fi + +# find zoneinfo. use the first one. +ftz=0 +for a in /usr/share/zoneinfo /usr/lib/zoneinfo /var/share/zoneinfo /var/zoneinfo; do + if [ -d $a -a $ftz = 0 ]; then + zoneinfo=$a + ftz=1 + fi +done + +# no zoneinfo found. goodbye. +if [ x$zoneinfo = x ]; then + exit 0 +fi + +# timezone not found. goodbye. +if [ ! -f $zoneinfo/$new_tzName ]; then + exit 0 +fi + +# if we're here we can actually do something useful. +# first, link a copy of the existing timefile. + +$DEBUG ln $timefile $tmpfile + +if [ $? != 0 ]; then + echo "unable to create temporary file" + exit -1 +fi + +# in case of interrupt, cleanup. +trap restore_file SIGINT SIGSEGV SIGQUIT SIGTERM + +# we destroy old backup files in this process. if we cannot and the +# file exists then something went wrong. +if [ -e $oldfile ]; then + $DEBUG rm $oldfile + if [ $? != 0 ]; then + echo "$0: failed to remove $oldfile" + rm -f $tmpfile + exit -1 + fi +fi + +# sensitive part happens here: +# +$DEBUG mv $timefile $oldfile + + if [ $? != 0 ]; then + echo "$0: failed to move old $timefile file out of the way" + rm $tmpfile + exit -1 + fi + +$DEBUG ln $zoneinfo/$new_tzName $timefile + +# we don't complain just yet- a hard link could fail because +# we're on two different file systems. Go for a soft link. +# + +if [ $? != 0 ]; then + $DEBUG ln -s $zoneinfo/$new_tzName $timefile +fi + +if [ $? != 0 ]; then # failed to softlink. now we're getting nervous. + echo "$0: unable to establish new timezone. Attempting to revert." + $DEBUG ln $tmpfile $timefile +fi + + +if [ $? != 0 ]; then # we're absolutely hosed + echo "$0: unable to link or softlink timezone file, and unable to restore old file - giving up!" + exit -1 +fi + +$DEBUG rm $tmpfile + +exit $? |