Annotation of embedaddon/dhcp/contrib/dhclient-tz-exithook.sh, revision 1.1
1.1 ! misho 1: #!/bin/bash
! 2: #
! 3: # dhclient-tz-exithook.sh
! 4: # Version 1.01 elear
! 5: #
! 6: # Copyright (c) 2007, Cisco Systems, Inc.
! 7: # All rights reserved.
! 8: #
! 9: # Redistribution and use in source and binary forms, with or without
! 10: # modification, are permitted provided that the following conditions
! 11: # are met:
! 12: #
! 13: # - Redistributions of source code must retain the above copyright
! 14: # notice, this list of conditions and the following disclaimer.
! 15: #
! 16: # - Redistributions in binary form must reproduce the above copyright
! 17: # notice, this list of conditions and the following disclaimer in
! 18: # the documentation and/or other materials provided with the
! 19: # distribution.
! 20: #
! 21: # - Neither the name of Cisco Systems, Inc. nor the names of its
! 22: # contributors may be used to endorse or promote products derived
! 23: # from this software without specific prior written permission.
! 24: #
! 25: # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
! 26: # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
! 27: # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
! 28: # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
! 29: # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
! 30: # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 31: # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
! 32: # GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 33: # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! 34: # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
! 35: # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 36: # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 37: #
! 38: # the following script is used to set the timezone based on the new
! 39: # dhcp timezone option defined currently in the IETF document
! 40: # draft-ietf-dhc-timezone-option-04.txt.
! 41:
! 42: # this code is intended for use with ISC's dhclient. it is to be called
! 43: # either as, or by, dhclient-exit-hooks
! 44: #
! 45: # As this is test code, in order for it to be called two changes
! 46: # must be made to /etc/dhclient.conf. First, dhclient.conf must be
! 47: # aware of the tzName option. The IANA has assigned tzName option
! 48: # code 101. You may need to add this to your configuration file.
! 49: #
! 50: # option tzName code 101 = text;
! 51: #
! 52: # Next, add tzName to the list of options in the "request" statement.
! 53: # For example:
! 54: #
! 55: # request subnet-mask, broadcast-address, time-offset, routers,
! 56: # domain-name, domain-name-servers, host-name, tzName;
! 57: #
! 58: #
! 59: # And of course make sure that your dhcp server is transmitting timezone
! 60: # information for option 101. For IOS this can be done as follows:
! 61: #
! 62: # option 101 ascii "Europe/Berlin"
! 63: #
! 64:
! 65: timefile=/etc/localtime
! 66: oldfile=$timefile.old
! 67: tmpfile=$timefile.$$
! 68:
! 69: # function to clean up just in case we are interrupted or something
! 70: # bad happens.
! 71: restore_file () {
! 72:
! 73: if [ ! -f $timefile ]; then
! 74: $DEBUG mv $tmpfile $timefile
! 75: fi
! 76: $DEBUG rm $tmpfile
! 77: exit
! 78: }
! 79:
! 80:
! 81: #set DEBUG to "echo" to see what would happen.
! 82: if [ x$DEBUG = x ]; then
! 83: DEBUG=
! 84: fi
! 85:
! 86: # if something has already gone wrong we're not doing a thing.
! 87: if [ x$exit_status != x0 ]; then
! 88: exit $exit_status
! 89: fi
! 90:
! 91:
! 92: # if we don't have a new timezone, then we have nothing to change, so
! 93: # goodbye.
! 94: if [ x$new_tzName = x ]; then
! 95: exit 0
! 96: fi
! 97:
! 98: # if the timezone doesn't exist, goodbye.
! 99: if [ ! -e $timefile ]; then
! 100: exit 0
! 101: fi
! 102:
! 103: # find zoneinfo. use the first one.
! 104: ftz=0
! 105: for a in /usr/share/zoneinfo /usr/lib/zoneinfo /var/share/zoneinfo /var/zoneinfo; do
! 106: if [ -d $a -a $ftz = 0 ]; then
! 107: zoneinfo=$a
! 108: ftz=1
! 109: fi
! 110: done
! 111:
! 112: # no zoneinfo found. goodbye.
! 113: if [ x$zoneinfo = x ]; then
! 114: exit 0
! 115: fi
! 116:
! 117: # timezone not found. goodbye.
! 118: if [ ! -f $zoneinfo/$new_tzName ]; then
! 119: exit 0
! 120: fi
! 121:
! 122: # if we're here we can actually do something useful.
! 123: # first, link a copy of the existing timefile.
! 124:
! 125: $DEBUG ln $timefile $tmpfile
! 126:
! 127: if [ $? != 0 ]; then
! 128: echo "unable to create temporary file"
! 129: exit -1
! 130: fi
! 131:
! 132: # in case of interrupt, cleanup.
! 133: trap restore_file SIGINT SIGSEGV SIGQUIT SIGTERM
! 134:
! 135: # we destroy old backup files in this process. if we cannot and the
! 136: # file exists then something went wrong.
! 137: if [ -e $oldfile ]; then
! 138: $DEBUG rm $oldfile
! 139: if [ $? != 0 ]; then
! 140: echo "$0: failed to remove $oldfile"
! 141: rm -f $tmpfile
! 142: exit -1
! 143: fi
! 144: fi
! 145:
! 146: # sensitive part happens here:
! 147: #
! 148: $DEBUG mv $timefile $oldfile
! 149:
! 150: if [ $? != 0 ]; then
! 151: echo "$0: failed to move old $timefile file out of the way"
! 152: rm $tmpfile
! 153: exit -1
! 154: fi
! 155:
! 156: $DEBUG ln $zoneinfo/$new_tzName $timefile
! 157:
! 158: # we don't complain just yet- a hard link could fail because
! 159: # we're on two different file systems. Go for a soft link.
! 160: #
! 161:
! 162: if [ $? != 0 ]; then
! 163: $DEBUG ln -s $zoneinfo/$new_tzName $timefile
! 164: fi
! 165:
! 166: if [ $? != 0 ]; then # failed to softlink. now we're getting nervous.
! 167: echo "$0: unable to establish new timezone. Attempting to revert."
! 168: $DEBUG ln $tmpfile $timefile
! 169: fi
! 170:
! 171:
! 172: if [ $? != 0 ]; then # we're absolutely hosed
! 173: echo "$0: unable to link or softlink timezone file, and unable to restore old file - giving up!"
! 174: exit -1
! 175: fi
! 176:
! 177: $DEBUG rm $tmpfile
! 178:
! 179: exit $?
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>