From 73f5b3e6fbbdbe9ec984dc3fce719ec121802ac8 Mon Sep 17 00:00:00 2001 From: David Cantrell Date: Wed, 11 Apr 2007 19:38:56 +0000 Subject: [PATCH] Re-added with 0644 permissions. --- dhcpd-conf-to-ldap | 517 +++++++++++++++++++++++++++++++++++++++++ linux | 566 +++++++++++++++++++++++++++++++++++++++++++++ linux.dbus-example | 223 ++++++++++++++++++ 3 files changed, 1306 insertions(+) create mode 100755 dhcpd-conf-to-ldap create mode 100755 linux create mode 100755 linux.dbus-example diff --git a/dhcpd-conf-to-ldap b/dhcpd-conf-to-ldap new file mode 100755 index 0000000..d68d41a --- /dev/null +++ b/dhcpd-conf-to-ldap @@ -0,0 +1,517 @@ +#!/usr/bin/perl -w + +# Brian Masney +# To use this script, set your base DN below. Then run +# ./dhcpd-conf-to-ldap.pl < /path-to-dhcpd-conf/dhcpd.conf > output-file +# The output of this script will generate entries in LDIF format. You can use +# the slapadd command to add these entries into your LDAP server. You will +# definately want to double check that your LDAP entries are correct before +# you load them into LDAP. + +# This script does not do much error checking. Make sure before you run this +# that the DHCP server doesn't give any errors about your config file + +use Sys::Hostname; + +my $basedn = "dc=ntelos, dc=net"; + +sub next_token +{ + local ($lowercase) = @_; + local ($token, $newline); + + do + { + if (!defined ($line) || length ($line) == 0) + { + $line = <>; + return undef if !defined ($line); + chop $line; + $line_number++; + $token_number = 0; + } + + $line =~ s/#.*//; + $line =~ s/^\s+//; + $line =~ s/\s+$//; + } + while (length ($line) == 0); + + if (($token, $newline) = $line =~ /^(.*?)\s+(.*)/) + { + $line = $newline; + } + else + { + $token = $line; + $line = ''; + } + $token_number++; + + $token =~ y/[A-Z]/[a-z]/ if $lowercase; + + return ($token); +} + + +sub remaining_line +{ + local ($tmp, $str); + + $str = ""; + while (($tmp = next_token (0))) + { + $str .= ' ' if !($str eq ""); + $str .= $tmp; + last if $tmp =~ /;\s*$/; + } + + $str =~ s/;$//; + return ($str); +} + + +sub +add_dn_to_stack +{ + local ($dn) = @_; + + $current_dn = "$dn, $current_dn"; +} + + +sub +remove_dn_from_stack +{ + $current_dn =~ s/^.*?,\s*//; +} + + +sub +parse_error +{ + print "Parse error on line number $line_number at token number $token_number\n"; + exit (1); +} + + +sub +print_entry +{ + return if (scalar keys %curentry == 0); + + if (!defined ($curentry{'type'})) + { + $host = hostname (); + $hostdn = "cn=$host, $basedn"; + print "dn: $hostdn\n"; + print "objectClass: top\n"; + print "objectClass: dhcpServer\n"; + print "cn: $host\n"; + print "dhcpServiceDN: $current_dn\n\n"; + + print "dn: $current_dn\n"; + print "cn: DHCP Config\n"; + print "objectClass: top\n"; + print "objectClass: dhcpService\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + print "dhcpPrimaryDN: $hostdn\n"; + } + elsif ($curentry{'type'} eq 'subnet') + { + print "dn: $current_dn\n"; + print "cn: " . $curentry{'ip'} . "\n"; + print "objectClass: top\n"; + print "objectClass: dhcpSubnet\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + + print "dhcpNetMask: " . $curentry{'netmask'} . "\n"; + if (defined ($curentry{'range'})) + { + print "dhcpRange: " . $curentry{'range'} . "\n"; + } + } + elsif ($curentry{'type'} eq 'shared-network') + { + print "dn: $current_dn\n"; + print "cn: " . $curentry{'descr'} . "\n"; + print "objectClass: top\n"; + print "objectClass: dhcpSharedNetwork\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + } + elsif ($curentry{'type'} eq 'group') + { + print "dn: $current_dn\n"; + print "cn: group\n"; + print "objectClass: top\n"; + print "objectClass: dhcpGroup\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + } + elsif ($curentry{'type'} eq 'host') + { + print "dn: $current_dn\n"; + print "cn: " . $curentry{'host'} . "\n"; + print "objectClass: top\n"; + print "objectClass: dhcpHost\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + + if (defined ($curentry{'hwaddress'})) + { + print "dhcpHWAddress: " . $curentry{'hwaddress'} . "\n"; + } + } + elsif ($curentry{'type'} eq 'pool') + { + print "dn: $current_dn\n"; + print "cn: pool\n"; + print "objectClass: top\n"; + print "objectClass: dhcpPool\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + + if (defined ($curentry{'range'})) + { + print "dhcpRange: " . $curentry{'range'} . "\n"; + } + } + elsif ($curentry{'type'} eq 'class') + { + print "dn: $current_dn\n"; + print "cn: " . $curentry{'class'} . "\n"; + print "objectClass: top\n"; + print "objectClass: dhcpClass\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + } + elsif ($curentry{'type'} eq 'subclass') + { + print "dn: $current_dn\n"; + print "cn: " . $curentry{'subclass'} . "\n"; + print "objectClass: top\n"; + print "objectClass: dhcpSubClass\n"; + if (defined ($curentry{'options'})) + { + print "objectClass: dhcpOptions\n"; + } + print "dhcpClassData: " . $curentry{'class'} . "\n"; + } + + if (defined ($curentry{'statements'})) + { + foreach $statement (@{$curentry{'statements'}}) + { + print "dhcpStatements: $statement\n"; + } + } + + if (defined ($curentry{'options'})) + { + foreach $statement (@{$curentry{'options'}}) + { + print "dhcpOption: $statement\n"; + } + } + + print "\n"; + undef (%curentry); +} + + +sub parse_netmask +{ + local ($netmask) = @_; + local ($i); + + if ((($a, $b, $c, $d) = $netmask =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) != 4) + { + parse_error (); + } + + $num = (($a & 0xff) << 24) | + (($b & 0xff) << 16) | + (($c & 0xff) << 8) | + ($d & 0xff); + + for ($i=1; $i<=32 && $num & (1 << (32 - $i)); $i++) + { + } + $i--; + + return ($i); +} + + +sub parse_subnet +{ + local ($ip, $tmp, $netmask); + + print_entry () if %curentry; + + $ip = next_token (0); + parse_error () if !defined ($ip); + + $tmp = next_token (1); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq 'netmask'); + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + $netmask = parse_netmask ($tmp); + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq '{'); + + add_dn_to_stack ("cn=$ip"); + $curentry{'type'} = 'subnet'; + $curentry{'ip'} = $ip; + $curentry{'netmask'} = $netmask; +} + + +sub parse_shared_network +{ + local ($descr, $tmp); + + print_entry () if %curentry; + + $descr = next_token (0); + parse_error () if !defined ($descr); + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq '{'); + + add_dn_to_stack ("cn=$descr"); + $curentry{'type'} = 'shared-network'; + $curentry{'descr'} = $descr; +} + + +sub parse_host +{ + local ($descr, $tmp); + + print_entry () if %curentry; + + $host = next_token (0); + parse_error () if !defined ($host); + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq '{'); + + add_dn_to_stack ("cn=$host"); + $curentry{'type'} = 'host'; + $curentry{'host'} = $host; +} + + +sub parse_group +{ + local ($descr, $tmp); + + print_entry () if %curentry; + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq '{'); + + add_dn_to_stack ("cn=group"); + $curentry{'type'} = 'group'; +} + + +sub parse_pool +{ + local ($descr, $tmp); + + print_entry () if %curentry; + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq '{'); + + add_dn_to_stack ("cn=pool"); + $curentry{'type'} = 'pool'; +} + + +sub parse_class +{ + local ($descr, $tmp); + + print_entry () if %curentry; + + $class = next_token (0); + parse_error () if !defined ($class); + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq '{'); + + $class =~ s/\"//g; + add_dn_to_stack ("cn=$class"); + $curentry{'type'} = 'class'; + $curentry{'class'} = $class; +} + + +sub parse_subclass +{ + local ($descr, $tmp); + + print_entry () if %curentry; + + $class = next_token (0); + parse_error () if !defined ($class); + + $subclass = next_token (0); + parse_error () if !defined ($subclass); + + $tmp = next_token (0); + parse_error () if !defined ($tmp); + parse_error () if !($tmp eq '{'); + + add_dn_to_stack ("cn=$subclass"); + $curentry{'type'} = 'subclass'; + $curentry{'class'} = $class; + $curentry{'subclass'} = $subclass; +} + + +sub parse_hwaddress +{ + local ($type, $hw, $tmp); + + $type = next_token (0); + parse_error () if !defined ($type); + + $hw = next_token (0); + parse_error () if !defined ($hw); + $hw =~ s/;$//; + + $curentry{'hwaddress'} = "$type $hw"; +} + + +sub parse_range +{ + local ($tmp, $str); + + $str = remaining_line (); + + if (!($str eq '')) + { + $str =~ s/;$//; + $curentry{'range'} = $str; + } +} + + +sub parse_statement +{ + local ($token) = shift; + local ($str); + + if ($token eq 'option') + { + $str = remaining_line (); + push (@{$curentry{'options'}}, $str); + } + else + { + $str = $token . " " . remaining_line (); + push (@{$curentry{'statements'}}, $str); + } +} + + +my $token; +my $token_number = 0; +my $line_number = 0; +my %curentry; + +$current_dn = "cn=DHCP Config, $basedn"; +$curentry{'descr'} = 'DHCP Config'; +$line = ''; + +while (($token = next_token (1))) + { + if ($token eq '}') + { + print_entry () if %curentry; + remove_dn_from_stack (); + } + elsif ($token eq 'subnet') + { + parse_subnet (); + next; + } + elsif ($token eq 'shared-network') + { + parse_shared_network (); + next; + } + elsif ($token eq 'class') + { + parse_class (); + next; + } + elsif ($token eq 'subclass') + { + parse_subclass (); + next; + } + elsif ($token eq 'pool') + { + parse_pool (); + next; + } + elsif ($token eq 'group') + { + parse_group (); + next; + } + elsif ($token eq 'host') + { + parse_host (); + next; + } + elsif ($token eq 'hardware') + { + parse_hwaddress (); + next; + } + elsif ($token eq 'range') + { + parse_range (); + next; + } + else + { + parse_statement ($token); + next; + } + } + + diff --git a/linux b/linux new file mode 100755 index 0000000..81b5bd5 --- /dev/null +++ b/linux @@ -0,0 +1,566 @@ +#!/bin/bash +# dhclient-script for Linux. Dan Halbert, March, 1997. +# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. +# No guarantees about this. I'm a novice at the details of Linux +# networking. + +# Notes: + +# 0. This script is based on the netbsd script supplied with dhcp-970306. + +# 1. ifconfig down apparently deletes all relevant routes and flushes +# the arp cache, so this doesn't need to be done explicitly. + +# 2. The alias address handling here has not been tested AT ALL. +# I'm just going by the doc of modern Linux ip aliasing, which uses +# notations like eth0:0, eth0:1, for each alias. + +# 3. I have to calculate the network address, and calculate the broadcast +# address if it is not supplied. This might be much more easily done +# by the dhclient C code, and passed on. + +if [ -n "${dhc_dbus}" ]; then + /bin/dbus-send \ + --system \ + --dest=com.redhat.dhcp \ + --type=method_call \ + /com/redhat/dhcp/$interface \ + com.redhat.dhcp.set \ + 'string:'"`env | /bin/egrep -v '^(PATH|SHLVL|_|PWD|dhc_dbus)\='`"; + if (( ( dhc_dbus & 31 ) == 31 )); then + exit 0; + fi; +fi; + +function save_previous() { + if [ -e $1 ]; then + /bin/mv $1 $1.predhclient + else + echo ''> $1.predhclient + fi +} + +make_resolv_conf() { + if [ "${PEERDNS}" == "no" ]; then + return + fi + + if [ x$reason == xRENEW ] && + [ "$new_domain_name" == "$old_domain_name" ] && + [ "$new_domain_name_servers" == "$old_domain_name_servers" ]; then + return; + fi + + if [ -n "$new_domain_name" ] || [ -n "$new_domain_name_servers" ]; then + cp -fp /etc/resolv.conf /etc/resolv.conf.predhclient + rscf=`mktemp /tmp/XXXXXX`; + echo '; generated by /sbin/dhclient-script' > $rscf + if [ -n "$SEARCH" ]; then + echo search $SEARCH >> $rscf + else + if [ -n "$new_domain_name" ]; then + echo search $new_domain_name >> $rscf + fi + fi + for nameserver in $new_domain_name_servers; do + echo nameserver $nameserver >> $rscf + done + change_resolv_conf $rscf + rm -f $rscf + fi +} + +# Must be used on exit. Invokes the local dhcp client exit hooks, if any. +exit_with_hooks() { + exit_status=$1 + if [ -f /etc/dhclient-exit-hooks ]; then + . /etc/dhclient-exit-hooks + fi +# probably should do something with exit status of the local script + exit $exit_status +} + +# Invoke the local dhcp client enter hooks, if they exist. +if [ -f /etc/dhclient-enter-hooks ]; then + exit_status=0 + . /etc/dhclient-enter-hooks + # allow the local script to abort processing of this state + # local script must set exit_status variable to nonzero. + if [ $exit_status -ne 0 ]; then + exit $exit_status + fi +fi + +# Import Red Hat Linux configuration +cd /etc/sysconfig/network-scripts; +. /etc/sysconfig/network-scripts/network-functions +. /etc/rc.d/init.d/functions + +[ -f ../network ] && . ../network +[ -f ../networking/network ] && . ../networking/network + +CONFIG=$interface + +need_config ${CONFIG} + +if [ -f "${CONFIG}" ]; then + source_config +else + echo $"$0: configuration for $interface not found. Continuing with defaults." >&2 +fi + +source_config + +release=`uname -r` +relmajor=`echo $release |/bin/cut -f1 -d'.'` +relminor=`echo $release |/bin/cut -f2 -d'.'` + +# simple IP arithmetic functions: + +function quad2num() +{ + if [ $# -eq 4 ]; then + let n="$1<<24|$2<<16|$3<<8|$4" + echo $n; + return 0; + fi + echo '0'; + return 1; +} + +function ip2num() +{ + IFS='.' quad2num $1; +} + +function num2ip() +{ + let n="$1"; + let o1='(n>>24)&0xff'; + let o2='(n>>16)&0xff'; + let o3='(n>>8)&0xff'; + let o4='n & 0xff'; + echo $o1.$o2.$o3.$o4; +} + +function mask() +{ + ip=$1 + m=$2 + let ip=`IFS='.' ip2num $ip`; + let m=`IFS='.' ip2num $m`; + let n='ip&m'; + num2ip $n; +} + +function mask_bits() +{ + ip=$1 + let ip=`IFS='.' ip2num $ip`; + let bits=0 + for ((bit=1; '((ip&bit)==0) && (bits < 32)'; 'bit<<=1')) do + let bits+=1 + done + let n_bits=32-bits + echo $n_bits +} + +function class_bits() +{ + let ip=`IFS='.' ip2num $1`; + let bits=32 + let mask='255'; + for ((i=0; i <= 3; i++, 'mask<<=8')); do + let v='ip&mask'; + if [ "$v" -eq 0 ] ; then + let bits-=8; + else + break; + fi; + done; + echo $bits; +} + +function routerReachable() +{ # Handle silly DHCP servers that give us a router not on our subnet: + router=$1 + routerSubnet=`mask $router $new_subnet_mask` + mySubnet=`mask $new_ip_address $new_subnet_mask` + unreachable=0 + if [ "$routerSubnet" != "$mySubnet" ]; then + unreachable=1 + if /sbin/arping -f -q -I $interface -w2 $router; then + /sbin/ip route add ${router}/32 dev $interface + if [ $? -eq 0 ]; then + unreachable=0 + else + /usr/bin/logger -p local7.notice -t "NET" "dhclient: failed to create host route for unreachable router $router not on subnet $mySubnet"; + fi + else + unreachable=1 + if [ -x /usr/bin/logger ]; then + /usr/bin/logger -p local7.notice -t "NET" "dhclient: DHCP router $router is unreachable on DHCP subnet $mySubnet router subnet $routerSubnet"; + fi; + fi; + fi; + return $unreachable; +} + +function add_default_gateway() +{ + router=$1 + metric='' + if [ $# -gt 1 ] && [ "$2" -gt 0 ]; then + metric="metric $2"; + fi; + if routerReachable $router ; then + /sbin/ip route replace default via $router dev $interface $metric; + if [ $? -ne 0 ]; then + /usr/bin/logger -p local7.notice -t "NET" 'dhclient: failed to create default route: '$router dev $interface $metric; + return 1; + else + return 0; + fi; + fi; + return 1; +} + +function dhconfig() +{ + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ + [ x$alias_ip_address != x$old_ip_address ]; then + # Possible new alias. Remove old alias. + ifconfig $interface:0- inet 0 + fi + + if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then + # IP address changed. Bringing down the interface will delete all routes, + # and clear the ARP cache. + ifconfig $interface inet 0 down + fi + fi + if [ x$reason = xBOUND ] || [ x$reason = xREBOOT ] || + [ x$old_ip_address != x$new_ip_address ] || + [ x$old_subnet_mask != x$new_subnet_mask ] || + [ x$new_network_number != x$new_network_number ] || + [ x$old_broadcast_address != x$new_broadcast_address ] || + [ "x$old_routers" != "x$new_routers" ] || + [ x$old_interface_mtu != x$new_interface_mtu ] ; then + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + ifconfig $interface inet $new_ip_address $new_subnet_arg \ + $new_broadcast_arg + if [ -n "$new_interface_mtu" ]; then + /sbin/ip link set $interface mtu $new_interface_mtu; + fi; + if [ -x /etc/dhclient-${interface}-up-hooks ]; then + . /etc/dhclient-${interface}-up-hooks; + elif [ -x /etc/dhclient-up-hooks ]; then + . /etc/dhclient-up-hooks; + fi; + fi; + + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 4 ) != 4 )); then + prefix_bits=`mask_bits $new_subnet_mask` + # Add a network route to the computed network address. + if [ $relmajor -lt 2 ] || \ + ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then + /sbin/ip route replace ${new_network_number}/${prefix_bits} dev $interface + if [ $added_old_broadcast_route -eq 1 ]; then + /sbin/ip route del default; + fi; + fi; + if [[ ( ( -z "$GATEWAYDEV" ) || ( "$GATEWAYDEV" = "$interface" ) ) && ( ( -z "$GATEWAY" ) || ( ( -n "$DHCLIENT_IGNORE_GATEWAY" ) && ( "$DHCLIENT_IGNORE_GATEWAY" = [Yy]* ) ) ) ]]; then + metric=${METRIC:-''}; + let i=${METRIC:-0}; + default_routers=() + for router in $new_routers; do + added_router=0 + for r in ${default_routers[@]}; do + if [ "$r" == "$router" ]; then + added_router=1; + fi; + done + if [ -z "$router" ] || [ "$added_router" -eq 1 ] || [ `IFS=. ip2num $router` -le 0 ] || [[ ( "$router" = "$new_broadcast_address" ) && ( "$new_subnet_mask" != "255.255.255.255" ) ]]; then + continue; + fi; + default_routers=(${default_routers[@]} $router) + add_default_gateway $router $metric; + let i=i+1; + metric=$i; + done + elif [[ ( ( -z "$GATEWAYDEV" ) || ( "$GATEWAYDEV" = "$interface" ) ) && ( -n "$GATEWAY" ) ]]; then + routerSubnet=`mask $GATEWAY $new_subnet_mask` + mySubnet=`mask $new_ip_address $new_subnet_mask` + if [ "$routerSubnet" = "$mySubnet" ]; then + /sbin/ip route replace default via $GATEWAY dev $interface + fi; + fi; + # static routes + if [ "x$new_static_routes" != x ]; then + IFS=', ' static_routes=($new_static_routes) + route_targets=() + for((i=0; i<${#static_routes[@]}; i+=2)); do + target=${static_routes[$i]} + gateway=${static_routes[$i+1]} + metric='' + for t in ${route_targets[@]}; do + if [ $t == $target ]; then + if [ -z "$metric" ]; then + metric=1; + else + ((metric=metric+1)); + fi; + fi; + done; + if [ -n "$metric" ]; then + metric="metric $metric"; + fi; + if routerReachable $gateway; then + /sbin/ip route replace ${target}/`class_bits $target` via ${gateway} dev $interface ${metric} + if [ $? -ne 0 ]; then + /usr/bin/logger -p local7.notice -t 'NET' 'dhclient: failed to create static route:' ${target}/`class_bits $target` via ${gateway} dev $interface ${metric}; + else + route_targets=(${route_targets[@]} $target); + fi; + fi; + done + fi + fi + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; + then + ifconfig $interface:0- inet 0 + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + /sbin/ip route replace ${alias_ip_address}/32 dev $interface:0 + fi + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 1 ) != 1 )); then + make_resolv_conf + + if [ -n "$new_host_name" ] && need_hostname; then + hostname $new_host_name + fi + fi; + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 8 ) != 8 )); then + if [ "${PEERNIS}" = no ]; then + : + elif [ -n "$new_nis_domain" ]; then + domainname "$new_nis_domain" + save_previous /etc/yp.conf + let contents=0 + echo '# generated by /sbin/dhclient-script' > /etc/yp.conf + if [ -n "$new_nis_servers" ]; then + for I in $new_nis_servers; do + echo "domain $new_nis_domain server $I" >> /etc/yp.conf + let contents=contents+1 + done + else + echo "domain $new_nis_domain broadcast" >> /etc/yp.conf + let contents=contents+1 + fi + level=`/sbin/runlevel` + level=${level##*\ } + if [ "$level" = "unknown" ]; then + level=1; + fi + if [ $contents -gt 0 ] && [[ "$level" = [0-6] ]] && /sbin/chkconfig --level=$level ypbind >/dev/null 2>&1 && [ -r /var/run/ypbind.pid ] && yppid=`cat /var/run/ypbind.pid` && [ -d /proc/${yppid} ] && [ "`if [ -x /sbin/busybox ]; then /sbin/busybox readlink /proc/${yppid}/exe; else echo /sbin/ypbind; fi`" = "/sbin/ypbind" ]; then + kill -HUP $yppid; + fi + elif [ -n "$new_nis_servers" ]; then + save_previous /etc/yp.conf + echo '# generated by /sbin/dhclient-script' > /etc/yp.conf + let contents=0 + for I in $new_nis_servers; do + echo "ypserver $I" >> /etc/yp.conf + let contents=contents+1 + done + level=`/sbin/runlevel` + level=${level##*\ } + if [ "$level" = "unknown" ]; then + level=1; + fi + if [ $contents -gt 0 ] && [[ "$level" = [0-6] ]] && /sbin/chkconfig --level=$level ypbind >/dev/null 2>&1 && [ -r /var/run/ypbind.pid ] && yppid=`cat /var/run/ypbind.pid` && [ -d /proc/${yppid} ] && [ "`if [ -x /sbin/busybox ]; then /sbin/busybox readlink /proc/${yppid}/exe; else echo /sbin/ypbind; fi`" = "/sbin/ypbind" ] ; then + kill -HUP $yppid; + fi + fi + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 16 ) != 16 )); then + if [ -n "$DHCP_TIME_OFFSET_SETS_TIMEZONE" ] && [[ "$DHCP_TIME_OFFSET_SETS_TIMEZONE" = [yY1]* ]]; then + if [ -n "$new_time_offset" ]; then + # DHCP option "time-offset" is requested by default and should be handled. + # The geographical zone abbreviation cannot be determined from the GMT offset, + # but the $ZONEINFO/Etc/GMT$offset file can be used - note: this disables DST. + ((z=new_time_offset/3600)); + ((hoursWest=`printf '%+d' $z`)) + if (( $hoursWest < 0 )); then + # tzdata treats negative 'hours west' as positive 'gmtoff' ! + ((hoursWest*=-1)); + fi + tzfile=/usr/share/zoneinfo/Etc/GMT`printf '%+d' $hoursWest`; + if [ -e $tzfile ]; then + /bin/mv -f /etc/localtime /etc/localtime.predhclient; + /bin/cp -fp $tzfile /etc/localtime; + /bin/touch /etc/localtime; + fi; + fi; + fi; + if [ "${PEERNTP}" = no ]; then + : + elif [ -n "$new_ntp_servers" ] && [ -e /etc/ntp.conf ]; then + save_previous /etc/ntp.conf + /bin/egrep -v '(^[\ \ ]*(server|fudge))|(generated by /sbin/dhclient-script)'< /etc/ntp.conf.predhclient > /etc/ntp.conf + echo '# servers generated by /sbin/dhclient-script' >> /etc/ntp.conf + localClocks=(`/bin/egrep '^[\ \ ]*server[\ \ ]+127\.127' /etc/ntp.conf.predhclient | while read s addr rest; do echo $addr; done`) + localClockFudge="`/bin/egrep '^[\ \ ]*fudge[\ \ ]+127\.127' /etc/ntp.conf.predhclient`"; + for s in $new_ntp_servers ${localClocks[@]}; + do + echo 'server '$s >> /etc/ntp.conf; + done + echo "$localClockFudge" >> /etc/ntp.conf; + if [ -x /usr/bin/diff ] && /usr/bin/diff -q /etc/ntp.conf /etc/ntp.conf.predhclient >/dev/null 2>&1; then + : ; + else + /sbin/service ntpd condrestart >/dev/null 2>&1 + fi; + fi + fi; +} + +if [ x$new_broadcast_address != x ] && [ x$new_subnet_mask != x ] && [ "$new_subnet_mask" != "255.255.255.255" ]; then + new_broadcast_arg="broadcast $new_broadcast_address" +fi +if [ x$old_broadcast_address != x ]; then + old_broadcast_arg="broadcast $old_broadcast_address" +fi +if [ x$new_subnet_mask != x ]; then + new_subnet_arg="netmask $new_subnet_mask" +fi +if [ x$old_subnet_mask != x ]; then + old_subnet_arg="netmask $old_subnet_mask" +fi +if [ x$alias_subnet_mask != x ]; then + alias_subnet_arg="netmask $alias_subnet_mask" +fi + +if [ x$reason = xMEDIUM ]; then + # Linux doesn't do mediums (ok, ok, media). + exit_with_hooks 0 +fi + +added_old_broadcast_route=0; +if [ x$reason = xPREINIT ]; then + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + if [ x$alias_ip_address != x ]; then + # Bring down alias interface. Its routes will disappear too. + ifconfig $interface:0- inet 0 + fi + if [ x$keep_old_ip = xyes ]; then + ifconfig $interface up + elif [ $relmajor -lt 2 ] || ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ) then + ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ + broadcast 255.255.255.255 up + # Add route to make broadcast work. Do not omit netmask. + /sbin/ip route replace default dev $interface && added_old_broadcast_route=1; + else + ifconfig $interface 0 up + fi + + # We need to give the kernel some time to get the interface up. + # sleep 1 + # I don't think this is necessary with modern kernels - no problems found during testing - + # JVD, 2005-06-17 + # but just in case: + if [ -n "$DHCLIENT_DELAY" ] && [ "$DHCLIENT_DELAY" -gt 0 ] ; then + sleep $DHCLIENT_DELAY; + fi; + exit_with_hooks 0 + fi; +fi + +if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then + if [ -z "$new_ip_address" ] || [ -z "$interface" ] || /sbin/arping -q -f -c 2 -w 3 -D -I ${interface} ${new_ip_address}; then + exit_with_hooks 0 + else + exit_with_hooks 1 + fi; +fi + +if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ + [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then + dhconfig ; + exit_with_hooks 0 +fi + +if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ + || [ x$reason = xSTOP ]; then + if [ -f /etc/resolv.conf.predhclient ]; then + change_resolv_conf /etc/resolv.conf.predhclient + rm -f /etc/resolv.conf.predhclient + fi + if [ -n "$DHCP_TIME_OFFSET_SETS_TIMEZONE" ] && [[ "$DHCP_TIME_OFFSET_SETS_TIMEZONE" = [yY1]* ]]; then + if [ -e /etc/localtime.predhclient ]; then + /bin/rm -f /etc/localtime + /bin/mv -f /etc/localtime.predhclient /etc/localtime; + /bin/touch /etc/localtime; + fi; + fi; + if [ -f /etc/ntp.conf.predhclient ]; then + /bin/rm -f /etc/ntp.conf + /bin/mv -f /etc/ntp.conf.predhclient /etc/ntp.conf + service ntpd condrestart >/dev/null 2>&1 + fi + if [ -f /etc/yp.conf.predhclient ]; then + /bin/rm -f /etc/yp.conf + /bin/mv -f /etc/yp.conf.predhclient /etc/yp.conf + level=`/sbin/runlevel` + level=${level##*\ } + if [ "$level" = "unknown" ]; then + level=1; + fi + if [[ "$level" = [0-6] ]] && /sbin/chkconfig --level=$level ypbind >/dev/null 2>&1 && [ -r /var/run/ypbind.pid ] && yppid=`cat /var/run/ypbind.pid` && [ -d /proc/${yppid} ] && [ "`if [ -x /sbin/busybox ]; then /sbin/busybox readlink /proc/${yppid}/exe; else echo /sbin/ypbind; fi`" = "/sbin/ypbind" ] ; then + kill -HUP $yppid; + fi + fi + if [ -x /etc/dhclient-${interface}-down-hooks ]; then + . /etc/dhclient-${interface}-down-hooks; + elif [ -x /etc/dhclient-down-hooks ]; then + . /etc/dhclient-down-hooks; + fi; + if [ x$alias_ip_address != x ]; then + # Turn off alias interface. + ifconfig $interface:0- inet 0 + fi + if [ x$old_ip_address != x ]; then + # Shut down interface, which will delete routes and clear arp cache. + ifconfig $interface inet 0 down + fi + if [ x$alias_ip_address != x ]; then + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + /sbin/ip route replace ${alias_ip_address}/32 $interface:0 + fi + exit_with_hooks 0 +fi + +if [ x$reason = xTIMEOUT ] && [ "x$new_routers" != 'x' ]; then + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + if [ x$alias_ip_address != x ]; then + ifconfig $interface:0- inet 0 + fi + ifconfig $interface inet $new_ip_address $new_subnet_arg \ + $new_broadcast_arg + fi; + set $new_routers + if ping -q -c 1 -w 10 -I $interface $1; then + dhconfig ; + exit_with_hooks 0 + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + ifconfig $interface inet 0 down + fi; + exit_with_hooks 1 +elif [ x$reason = xTIMEOUT ]; then + exit_with_hooks 1 +fi +exit_with_hooks 0 diff --git a/linux.dbus-example b/linux.dbus-example new file mode 100755 index 0000000..1ee9e0d --- /dev/null +++ b/linux.dbus-example @@ -0,0 +1,223 @@ +#!/bin/bash +# dhclient-script for Linux. Dan Halbert, March, 1997. +# Updated for Linux 2.[12] by Brian J. Murrell, January 1999. +# No guarantees about this. I'm a novice at the details of Linux +# networking. + +# Notes: + +# 0. This script is based on the netbsd script supplied with dhcp-970306. + +# 1. ifconfig down apparently deletes all relevant routes and flushes +# the arp cache, so this doesn't need to be done explicitly. + +# 2. The alias address handling here has not been tested AT ALL. +# I'm just going by the doc of modern Linux ip aliasing, which uses +# notations like eth0:0, eth0:1, for each alias. + +# 3. I have to calculate the network address, and calculate the broadcast +# address if it is not supplied. This might be much more easily done +# by the dhclient C code, and passed on. + +# 4. TIMEOUT not tested. ping has a flag I don't know, and I'm suspicious +# of the $1 in its args. + +if [ -n "${dhc_dbus}" ]; then + /bin/dbus-send \ + --system --dest=com.redhat.dhcp --type=method_call \ + /com/redhat/dhcp/$interface com.redhat.dhcp.set \ + 'string:'"`env | /bin/egrep -v '^(PATH|SHLVL|_|PWD|dhc_dbus)\='`"; + if (( ( dhc_dbus & 31 ) == 31 )); then + exit 0; + fi; +fi; + +make_resolv_conf() { + if [ "x$new_domain_name" != x ] && [ x"$new_domain_name_servers" != x ]; then + echo search $new_domain_name >/etc/resolv.conf + chmod 644 /etc/resolv.conf + for nameserver in $new_domain_name_servers; do + echo nameserver $nameserver >>/etc/resolv.conf + done + fi +} + +# Must be used on exit. Invokes the local dhcp client exit hooks, if any. +exit_with_hooks() { + exit_status=$1 + if [ -f /etc/dhclient-exit-hooks ]; then + . /etc/dhclient-exit-hooks + fi +# probably should do something with exit status of the local script + exit $exit_status +} + +# Invoke the local dhcp client enter hooks, if they exist. +if [ -f /etc/dhclient-enter-hooks ]; then + exit_status=0 + . /etc/dhclient-enter-hooks + # allow the local script to abort processing of this state + # local script must set exit_status variable to nonzero. + if [ $exit_status -ne 0 ]; then + exit $exit_status + fi +fi + +release=`uname -r` +release=`expr $release : '\(.*\)\..*'` +relminor=`echo $release |sed -e 's/[0-9]*\.\([0-9][0-9]*\)\(\..*\)*$/\1/'` +relmajor=`echo $release |sed -e 's/\([0-9][0-9]*\)\..*$/\1/'` + +if [ x$new_broadcast_address != x ]; then + new_broadcast_arg="broadcast $new_broadcast_address" +fi +if [ x$old_broadcast_address != x ]; then + old_broadcast_arg="broadcast $old_broadcast_address" +fi +if [ x$new_subnet_mask != x ]; then + new_subnet_arg="netmask $new_subnet_mask" +fi +if [ x$old_subnet_mask != x ]; then + old_subnet_arg="netmask $old_subnet_mask" +fi +if [ x$alias_subnet_mask != x ]; then + alias_subnet_arg="netmask $alias_subnet_mask" +fi + +if [ x$reason = xMEDIUM ]; then + # Linux doesn't do mediums (ok, ok, media). + exit_with_hooks 0 +fi + +if [ x$reason = xPREINIT ]; then + if [ x$alias_ip_address != x ]; then + # Bring down alias interface. Its routes will disappear too. + ifconfig $interface:0- inet 0 + fi + if [ $relmajor -lt 2 ] || ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ) + then + ifconfig $interface inet 0.0.0.0 netmask 0.0.0.0 \ + broadcast 255.255.255.255 up + # Add route to make broadcast work. Do not omit netmask. + route add default dev $interface netmask 0.0.0.0 + else + ifconfig $interface 0 up + fi + + # We need to give the kernel some time to get the interface up. + sleep 1 + + exit_with_hooks 0 +fi + +if [ x$reason = xARPCHECK ] || [ x$reason = xARPSEND ]; then + exit_with_hooks 0 +fi + +if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ + [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then + current_hostname=`hostname` + if [ x$current_hostname = x ] || \ + [ x$current_hostname = x$old_host_name ]; then + if [ x$current_hostname = x ] || \ + [ x$new_host_name != x$old_host_name ]; then + hostname $new_host_name + fi + fi + + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \ + [ x$alias_ip_address != x$old_ip_address ]; then + # Possible new alias. Remove old alias. + ifconfig $interface:0- inet 0 + fi + if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then + # IP address changed. Bringing down the interface will delete all routes, + # and clear the ARP cache. + ifconfig $interface inet 0 down + + fi + fi + if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \ + [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + ifconfig $interface inet $new_ip_address $new_subnet_arg \ + $new_broadcast_arg + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 4 ) != 4 )); then + # Add a network route to the computed network address. + if [ $relmajor -lt 2 ] || \ + ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then + route add -net $new_network_number $new_subnet_arg dev $interface + fi + for router in $new_routers; do + route add default gw $router + done + fi + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ]; + then + ifconfig $interface:0- inet 0 + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + route add -host $alias_ip_address $interface:0 + fi + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 1 ) != 1 )); then + make_resolv_conf + fi + exit_with_hooks 0 +fi + +if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then +if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ + || [ x$reason = xSTOP ]; then + if [ x$alias_ip_address != x ]; then + # Turn off alias interface. + ifconfig $interface:0- inet 0 + fi + if [ x$old_ip_address != x ]; then + # Shut down interface, which will delete routes and clear arp cache. + ifconfig $interface inet 0 down + fi + if [ x$alias_ip_address != x ]; then + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + route add -host $alias_ip_address $interface:0 + fi + exit_with_hooks 0 +fi +fi + +if [ x$reason = xTIMEOUT ]; then + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + if [ x$alias_ip_address != x ]; then + ifconfig $interface:0- inet 0 + fi + ifconfig $interface inet $new_ip_address $new_subnet_arg \ + $new_broadcast_arg + fi + set $new_routers + ############## what is -w in ping? + if ping -q -c 1 $1; then + if [ x$new_ip_address != x$alias_ip_address ] && \ + [ x$alias_ip_address != x ]; then + ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg + route add -host $alias_ip_address dev $interface:0 + fi + if [ $relmajor -lt 2 ] || \ + ( [ $relmajor -eq 2 ] && [ $relminor -eq 0 ] ); then + route add -net $new_network_number + fi + for router in $new_routers; do + route add default gw $router + done + make_resolv_conf + exit_with_hooks 0 + fi + if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then + ifconfig $interface inet 0 down + fi + exit_with_hooks 1 +fi + +exit_with_hooks 0