Skip to content
This repository was archived by the owner on Apr 8, 2025. It is now read-only.
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
174 changes: 79 additions & 95 deletions files/dhclient-script
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ ip=/sbin/ip
make_resolv_conf() {
local new_resolv_conf="/etc/resolv.conf.dhclient-new-$interface"
local old_resolv_conf="/etc/resolv.conf.dhclient-old-$interface"
local resolv_conf="/etc/resolv.conf"
mv -f $new_resolv_conf $old_resolv_conf
if [ -n "$new_domain_name" -o -n "$new_domain_name_servers" ]; then
if [ -n "$new_domain_name" ]; then
Expand All @@ -29,29 +30,29 @@ make_resolv_conf() {
done
fi
elif [ "x${new_dhcp6_name_servers}" != x ] ; then
if [ "x${new_dhcp6_domain_search}" != x ] ; then
echo search ${new_dhcp6_domain_search} >> $new_resolv_conf
fi
for nameserver in ${new_dhcp6_name_servers} ; do
echo nameserver ${nameserver} >> $new_resolv_conf
done
if [ "x${new_dhcp6_domain_search}" != x ] ; then
echo search ${new_dhcp6_domain_search} >> $new_resolv_conf
fi
for nameserver in ${new_dhcp6_name_servers} ; do
echo nameserver ${nameserver} >> $new_resolv_conf
done
else
echo " " > $new_resolv_conf
fi

/opt/vyatta/sbin/vyatta_update_resolv.pl --dhclient-script 1
if ! diff -q $old_resolv_conf $new_resolv_conf >&/dev/null; then
if [ -d /opt/vyatta/config/active/service/dns/forwarding ]; then
/opt/vyatta/sbin/vyatta-dns-forwarding.pl --update-dnsforwarding --outside-cli >&/dev/null
fi
fi
rm -f $old_resolv_conf
mv -f $new_resolv_conf $resolv_conf
}

run_hook() {
local script="$1"
local exit_status
shift # discard the first argument, then the rest are the script's
shift # discard the first argument, then the rest are the script's

if [ -f $script ]; then
. $script "$@"
Expand All @@ -69,7 +70,7 @@ run_hook() {
run_hookdir() {
local dir="$1"
local exit_status
shift # See run_hook
shift # See run_hook

if [ -d "$dir" ]; then
for script in $(run-parts --list $dir); do
Expand Down Expand Up @@ -102,7 +103,7 @@ get_prefix() {
# use existing perl module to compute prefix
# one line don't bother with script
perl -MNetAddr::IP \
-e '$ip = new NetAddr::IP(@ARGV); print $ip->masklen(), "\n"' $*
-e '$ip = new NetAddr::IP(@ARGV); print $ip->masklen(), "\n"' $*
}

set_hostname() {
Expand All @@ -114,16 +115,16 @@ set_hostname() {

set_address() {
if [ -n "$old_ip_address" ] &&
[ "$old_ip_address" != "$new_ip_address" -o "$old_prefix" != "$new_prefix" ] ; then
# Clear out route cache and ARP tables and all addresses and routes
ip -family inet addr flush dev $interface
[ "$old_ip_address" != "$new_ip_address" -o "$old_prefix" != "$new_prefix" ] ; then
# Clear out route cache and ARP tables and all addresses and routes
ip -family inet addr flush dev $interface
fi

if [ "$reason" = "BOUND" ] || [ "$reason" = "REBOOT" ] ||
[ -z "$old_ip_address" -o "$old_ip_address" != "$new_ip_address" ] ||
[ -z "$old_prefix" -o "$old_prefix" != "$new_prefix" ] ; then
ip -family inet addr add $new_ip_address/$new_prefix \
broadcast $new_broadcast_address dev $interface
broadcast $new_broadcast_address dev $interface
fi

if [ -n "$new_interface_mtu" ] &&
Expand All @@ -137,33 +138,33 @@ ZEBRA_ROUTE_DHCP=210

update_routers() {
if [ -n "$old_routers" ]; then
# No change just renewing
if [ "$reason" = "RENEW" -a "$old_routers" = "$new_routers" ]; then
return 0
fi

for router in $old_routers; do
if [ "$old_subnet_mask" == "255.255.255.255" ]; then
vtysh -c "conf t" -c "no ip route $router $interface $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
fi
vtysh -c "conf t" -c "no ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
done
# No change just renewing
if [ "$reason" = "RENEW" -a "$old_routers" = "$new_routers" ]; then
return 0
fi

for router in $old_routers; do
if [ "$old_subnet_mask" == "255.255.255.255" ]; then
vtysh -c "conf t" -c "no ip route $router $interface $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
fi
vtysh -c "conf t" -c "no ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
done
fi

for router in $new_routers; do
# point to point
if [ "$new_subnet_mask" == "255.255.255.255" ]; then
# point to point
if [ "$new_subnet_mask" == "255.255.255.255" ]; then
if vtysh -c exit; then
vtysh -c "conf t" -c "ip route $router $interface $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
vtysh -c "conf t" -c "ip route $router $interface $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
else
ip -4 route add ${router} dev $interface >/dev/null 2>&1
fi
fi
fi

# Note: this should really be $router and $interface but zebra does
# not have way to specify this (yet).
# Note: this should really be $router and $interface but zebra does
# not have way to specify this (yet).
if vtysh -c exit; then
vtysh -c "conf t" -c "ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
vtysh -c "conf t" -c "ip route 0.0.0.0/0 $router $ZEBRA_ROUTE_DHCP" >/dev/null 2>&1
else
ip -4 route add default via ${router} dev $interface >/dev/null 2>&1
fi
Expand All @@ -176,23 +177,6 @@ fi
if [ -n "$old_subnet_mask" ]; then
old_prefix=$(get_prefix $old_ip_address $old_subnet_mask)
fi
if [ -n "$new_interface_mtu" ]; then
# Vyatta configuration overrides response from server to allow user
# to work around broken ISP's
mtu_path=$(/opt/vyatta/sbin/vyatta-interfaces.pl --dev=$interface --path)
if [ -r $mtu_path ]; then
read new_interface_mtu < $mtu_path
fi

# The 576 MTU is only used for X.25 and dialup connections
# where the admin wants low latency. Such a low MTU can cause
# problems with UDP traffic, among other things. As such,
# disallow MTUs from 576 and below by default, so that broken
# MTUs are ignored, but higher stuff is allowed (1492, 1500, etc).
if [ $new_interface_mtu -le 576 ]; then
new_interface_mtu=
fi
fi

# The action starts here

Expand Down Expand Up @@ -231,10 +215,10 @@ case "$reason" in
BOUND|RENEW|REBIND|REBOOT)
set_hostname

make_resolv_conf
set_address
update_routers
make_resolv_conf
set_address
update_routers

# If FRR is not running make sure dhclient daemon does not keep running.
if ! vtysh -c exit; then
killall dhclient
Expand All @@ -244,36 +228,36 @@ case "$reason" in
;;

EXPIRE|FAIL|RELEASE|STOP)
new_routers=""; update_routers
new_routers=""; update_routers

if [ -n "$old_ip_address" ]; then
ip -family inet addr flush dev ${interface}
fi
if [ "$reason" = "STOP" ]; then
if [ "$reason" = "STOP" ]; then
ip link set ${interface} down
fi
fi

make_resolv_conf
make_resolv_conf
;;

TIMEOUT)
if [ -n "$new_routers" ]; then
ip -family inet addr add $new_ip_address/$new_prefix \
broadcast $new_broadcast_address dev $interface
broadcast $new_broadcast_address dev $interface

set -- $new_routers
first_router="$1"

if ping -q -c 1 -I $interface $first_router ; then
make_resolv_conf
set_address
update_routers
make_resolv_conf
set_address
update_routers

exit_with_hooks 0
fi
exit_with_hooks 0
fi
ip -family inet addr flush dev $interface
# Note: this exits with interface still up
# see Debian bug #144666
# Note: this exits with interface still up
# see Debian bug #144666
fi
exit_with_hooks 2 "$@"
;;
Expand All @@ -283,59 +267,59 @@ case "$reason" in
${ip} link set ${interface} up

# Remove any stale addresses from aborted clients.
${ip} -f inet6 addr flush dev ${interface} scope global permanent
${ip} -f inet6 addr flush dev ${interface} scope global permanent

exit_with_hooks 0
;;
exit_with_hooks 0
;;

BOUND6)
if [ x${new_ip6_address} = x ] || [ x${new_ip6_prefixlen} = x ] ; then
exit_with_hooks 2;
fi
exit_with_hooks 2;
fi

${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \
${ip} -f inet6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \
dev ${interface} scope global

# Check for nameserver options.
make_resolv_conf
make_resolv_conf

exit_with_hooks 0
;;
exit_with_hooks 0
;;

RENEW6|REBIND6)
# Make sure nothing has moved around on us.
# Make sure nothing has moved around on us.

# Nameservers/domains/etc.
if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] ||
[ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then
make_resolv_conf
fi
# Nameservers/domains/etc.
if [ "x${new_dhcp6_name_servers}" != "x${old_dhcp6_name_servers}" ] ||
[ "x${new_dhcp6_domain_search}" != "x${old_dhcp6_domain_search}" ] ; then
make_resolv_conf
fi

exit_with_hooks 0
;;
exit_with_hooks 0
;;

DEPREF6)
if [ x${new_ip6_prefixlen} = x ] ; then
exit_with_hooks 2;
fi
exit_with_hooks 2;
fi

${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \
dev ${interface} scope global preferred_lft 0

${ip} -f inet6 addr change ${new_ip6_address}/${new_ip6_prefixlen} \
dev ${interface} scope global preferred_lft 0
exit_with_hooks 0
;;

exit_with_hooks 0
;;

EXPIRE6|RELEASE6|STOP6)
if [ x${old_ip6_address} = x ] || [ x${old_ip6_prefixlen} = x ] ; then
exit_with_hooks 2;
fi
exit_with_hooks 2;
fi

${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \
${ip} -f inet6 addr del ${old_ip6_address}/${old_ip6_prefixlen} \
dev ${interface}

make_resolv_conf
exit_with_hooks 0
;;
make_resolv_conf
exit_with_hooks 0
;;

esac

Expand Down