From 8b16439d3fedb9f9e0b785f5d1aa68718a66b9d3 Mon Sep 17 00:00:00 2001 From: David Cantrell Date: Mon, 8 Oct 2007 17:58:17 +0000 Subject: [PATCH] - Init script fixes (#320761) - Removed linux.dbus-example script since we aren't using dhcdbd now - Remove dhcdbd leftovers from dhclient-script (#306381) --- dhcp.spec | 24 +- dhcpd.init | 4 +- dhcrelay.init | 2 +- linux | 850 +++++++++++++++++++++++---------------------- linux.dbus-example | 223 ------------ 5 files changed, 448 insertions(+), 655 deletions(-) delete mode 100755 linux.dbus-example diff --git a/dhcp.spec b/dhcp.spec index 4ee7437..bd60f82 100644 --- a/dhcp.spec +++ b/dhcp.spec @@ -13,7 +13,7 @@ Summary: DHCP (Dynamic Host Configuration Protocol) server and relay agent Name: dhcp Version: 3.0.6 -Release: 7%{?dist} +Release: 8%{?dist} Epoch: 12 License: ISC Group: System Environment/Daemons @@ -27,11 +27,10 @@ Source5: libdhcp4client.pc Source6: README.ldap Source7: draft-ietf-dhc-ldap-schema-01.txt Source8: dhcpd-conf-to-ldap -Source9: linux.dbus-example -Source10: linux -Source11: Makefile.dist -Source12: dhcp4client.h -Source13: libdhcp_control.h +Source9: linux +Source10: Makefile.dist +Source11: dhcp4client.h +Source12: libdhcp_control.h Patch0: %{name}-3.0.5-Makefile.patch Patch1: %{name}-3.0.5-warnings.patch @@ -241,18 +240,14 @@ libdhcp4client. %{__install} -p -m 0644 %SOURCE7 doc %{__install} -p -m 0755 %SOURCE8 contrib -# Copy in example dhclient script for use with D-BUS (requires extended -# new option info patch too) -%{__install} -p -m 0755 %SOURCE9 client/scripts - # Copy in the Fedora/RHEL dhclient script -%{__install} -p -m 0755 %SOURCE10 client/scripts +%{__install} -p -m 0755 %SOURCE9 client/scripts # Copy in the libdhcp4client headers and Makefile.dist %{__mkdir} -p libdhcp4client +%{__install} -p -m 0644 %SOURCE10 libdhcp4client %{__install} -p -m 0644 %SOURCE11 libdhcp4client %{__install} -p -m 0644 %SOURCE12 libdhcp4client -%{__install} -p -m 0644 %SOURCE13 libdhcp4client # Ensure we don't pick up Perl as a dependency from the scripts and modules # in the contrib directory (we copy this to /usr/share/doc in the final @@ -431,6 +426,11 @@ fi %{_libdir}/libdhcp4client.a %changelog +* Mon Oct 08 2007 David Cantrell - 12:3.0.6-8 +- Init script fixes (#320761) +- Removed linux.dbus-example script since we aren't using dhcdbd now +- Remove dhcdbd leftovers from dhclient-script (#306381) + * Wed Sep 26 2007 David Cantrell - 12:3.0.6-7 - In dhcp.conf.5, explain that if no next-server statement applies to the requesting client, the address 0.0.0.0 is used (#184484). diff --git a/dhcpd.init b/dhcpd.init index 3836f36..8d50d03 100644 --- a/dhcpd.init +++ b/dhcpd.init @@ -36,7 +36,7 @@ pidfile=/var/run/dhcpd.pid # if the user specified a different config file, make sure we reference it findConfig() { for arg in $DHCPDARGS ; do - if [ $found = 1 ]; then + if [ "$found" = 1 ]; then [ -f "$arg" ] && echo "$arg" return fi @@ -82,7 +82,7 @@ start() { stop() { pidofproc $prog >/dev/null 2>&1 - if [ $? -eq 0 ]; then + if [ $? -ne 0 ]; then RETVAL=7 return $RETVAL fi diff --git a/dhcrelay.init b/dhcrelay.init index dabfe5a..115684f 100644 --- a/dhcrelay.init +++ b/dhcrelay.init @@ -61,7 +61,7 @@ start() { stop() { pidofproc $prog >/dev/null 2>&1 - if [ $? -eq 0 ]; then + if [ $? -ne 0 ]; then RETVAL=7 return $RETVAL fi diff --git a/linux b/linux index 7d54e5c..1d5545f 100755 --- a/linux +++ b/linux @@ -3,6 +3,8 @@ # 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. +# +# Modified by David Cantrell for Fedora and RHEL # Notes: @@ -19,76 +21,70 @@ # 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; +PATH=/bin:/usr/bin function save_previous() { - if [ -e $1 ]; then - /bin/mv $1 $1.predhclient - else - echo ''> $1.predhclient - fi + if [ -e $1 ]; then + 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 + 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 - 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 + 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 + 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 @@ -111,52 +107,46 @@ fi source_config -release=`uname -r` -relmajor=`echo $release |/bin/cut -f1 -d'.'` -relminor=`echo $release |/bin/cut -f2 -d'.'` +release=$(uname -r) +relmajor=$(echo $release | cut -f1 -d'.') +relminor=$(echo $release | cut -f2 -d'.') # simple IP arithmetic functions: - -function quad2num() -{ +function quad2num() { if [ $# -eq 4 ]; then - let n="$1<<24|$2<<16|$3<<8|$4" - echo $n; - return 0; + let n="$1<<24|$2<<16|$3<<8|$4" + echo $n + return 0 fi - echo '0'; - return 1; + echo '0' + return 1 } -function ip2num() -{ - IFS='.' quad2num $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 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() -{ +function mask() { ip=$1 m=$2 - let ip=`IFS='.' ip2num $ip`; - let m=`IFS='.' ip2num $m`; - let n='ip&m'; - num2ip $n; + let ip=$(IFS='.' ip2num $ip) + let m=$(IFS='.' ip2num $m) + let n='ip&m' + num2ip $n } -function mask_bits() -{ +function mask_bits() { ip=$1 - let ip=`IFS='.' ip2num $ip`; + let ip=$(IFS='.' ip2num $ip) let bits=0 for ((bit=1; '((ip&bit)==0) && (bits < 32)'; 'bit<<=1')) do let bits+=1 @@ -165,81 +155,76 @@ function mask_bits() echo $n_bits } -function class_bits() -{ - let ip=`IFS='.' ip2num $1`; +function class_bits() { + let ip=$(IFS='.' ip2num $1) let bits=32 - let mask='255'; + let mask='255' for ((i=0; i <= 3; i++, 'mask<<=8')); do - let v='ip&mask'; - if [ "$v" -eq 0 ] ; then - let bits-=8; + let v='ip&mask' + if [ "$v" -eq 0 ] ; then + let bits-=8 else - break; - fi; - done; - echo $bits; + break + fi + done + echo $bits } -function routerReachable() -{ # Handle silly DHCP servers that give us a router not on our subnet: +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` + 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; + 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() -{ +function add_default_gateway() { router=$1 metric='' - if [ $# -gt 1 ] && [ "$2" -gt 0 ]; then - metric="metric $2"; - fi; + 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; + /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 +function dhconfig() { + 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 + if [ x$reason = xBOUND ] || [ x$reason = xREBOOT ] || [ x$old_ip_address != x$new_ip_address ] || [ x$old_subnet_mask != x$new_subnet_mask ] || @@ -247,315 +232,346 @@ function dhconfig() [ 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 + 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 [ -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 + 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 + + 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 + + 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 + + make_resolv_conf + + if [ -n "$new_host_name" ] && need_hostname; then + hostname $new_host_name + fi + + 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 + + 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 .* # added by /sbin/dhclient-script$'< /etc/ntp.conf.predhclient > /etc/ntp.conf + + for s in $new_ntp_servers; do + echo "server $s # added by /sbin/dhclient-script" >> /etc/ntp.conf + done + + 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 - 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 .* # added by /sbin/dhclient-script$'< /etc/ntp.conf.predhclient > /etc/ntp.conf - for s in $new_ntp_servers; do - echo "server $s # added by /sbin/dhclient-script" >> /etc/ntp.conf; - done - 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" + new_broadcast_arg="broadcast $new_broadcast_address" fi + if [ x$old_broadcast_address != x ]; then - old_broadcast_arg="broadcast $old_broadcast_address" + old_broadcast_arg="broadcast $old_broadcast_address" fi + if [ x$new_subnet_mask != x ]; then - new_subnet_arg="netmask $new_subnet_mask" + new_subnet_arg="netmask $new_subnet_mask" fi + if [ x$old_subnet_mask != x ]; then - old_subnet_arg="netmask $old_subnet_mask" + old_subnet_arg="netmask $old_subnet_mask" fi + if [ x$alias_subnet_mask != x ]; then - alias_subnet_arg="netmask $alias_subnet_mask" + 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 + # Linux doesn't do mediums (ok, ok, media). + exit_with_hooks 0 fi -added_old_broadcast_route=0; +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 + if [ x$alias_ip_address != x ]; then + # Bring down alias interface. Its routes will disappear too. + ifconfig $interface:0- inet 0 + 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; + 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 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 + exit_with_hooks 0 else - exit_with_hooks 1 - fi; + exit_with_hooks 1 + fi fi - + if [ x$reason = xBOUND ] || [ x$reason = xRENEW ] || \ - [ x$reason = xREBIND ] || [ x$reason = xREBOOT ]; then - dhconfig ; + [ 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 + 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 + 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 + 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; + ifconfig $interface inet 0 down + fi + exit_with_hooks 1 elif [ x$reason = xTIMEOUT ]; then - exit_with_hooks 1 + exit_with_hooks 1 fi + exit_with_hooks 0 diff --git a/linux.dbus-example b/linux.dbus-example deleted file mode 100755 index 1ee9e0d..0000000 --- a/linux.dbus-example +++ /dev/null @@ -1,223 +0,0 @@ -#!/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