]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Added contrib/dhclient-tz-exithook.sh script for processing tzname (option 101)
authorEvan Hunt <each@isc.org>
Fri, 27 Apr 2007 23:34:39 +0000 (23:34 +0000)
committerEvan Hunt <each@isc.org>
Fri, 27 Apr 2007 23:34:39 +0000 (23:34 +0000)
[rt16755]

contrib/dhclient-tz-exithook.sh [new file with mode: 0644]

diff --git a/contrib/dhclient-tz-exithook.sh b/contrib/dhclient-tz-exithook.sh
new file mode 100644 (file)
index 0000000..9aa63c0
--- /dev/null
@@ -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 $?