mirror of
https://github.com/pfsense/pfsense.git
synced 2025-10-26 11:38:35 +00:00
If WAN is pppoe, hold down boot until connection is established This will help anyone with PPPOE on WAN and DHCP on OPTx not get incorrect gateways assigned.
281 lines
7.2 KiB
Bash
Executable File
281 lines
7.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# $Id$
|
|
# $OpenBSD: dhclient-script,v 1.6 2004/05/06 18:22:41 claudio Exp $
|
|
# $FreeBSD: src/sbin/dhclient/dhclient-script,v 1.4 2005/06/10 03:41:18 brooks Exp $
|
|
#
|
|
# Copyright (c) 2003 Kenneth R Westerback <krw@openbsd.org>
|
|
#
|
|
# Permission to use, copy, modify, and distribute this software for any
|
|
# purpose with or without fee is hereby granted, provided that the above
|
|
# copyright notice and this permission notice appear in all copies.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
#
|
|
|
|
NETSTAT=/usr/bin/netstat
|
|
GREP=/usr/bin/grep
|
|
AWK=/usr/bin/awk
|
|
HOSTNAME=/bin/hostname
|
|
GREP=/usr/bin/grep
|
|
ROUTE=/sbin/route
|
|
SED=/usr/bin/sed
|
|
ARP=/usr/sbin/arp
|
|
IFCONFIG=/sbin/ifconfig
|
|
|
|
LOCALHOST=127.0.0.1
|
|
|
|
if [ -x /usr/bin/logger ]; then
|
|
LOGGER="/usr/bin/logger -s -p user.notice -t dhclient"
|
|
else
|
|
LOGGER=echo
|
|
fi
|
|
|
|
#
|
|
# Helper functions that implement common actions.
|
|
#
|
|
|
|
check_hostname() {
|
|
current_hostname=`$HOSTNAME`
|
|
if [ -z "$current_hostname" ]; then
|
|
$LOGGER "New Hostname ($interface): $new_host_name"
|
|
$HOSTNAME $new_host_name
|
|
elif [ "$current_hostname" = "$old_host_name" -a \
|
|
"$new_host_name" != "$old_host_name" ]; then
|
|
$LOGGER "New Hostname ($interface): $new_host_name"
|
|
$HOSTNAME $new_host_name
|
|
fi
|
|
}
|
|
|
|
arp_flush() {
|
|
$ARP -an -i $interface | \
|
|
$SED -n -e 's/^.*(\(.*\)) at .*$/arp -d \1/p' | \
|
|
/bin/sh >/dev/null 2>&1
|
|
}
|
|
|
|
delete_old_address() {
|
|
$IFCONFIG $interface inet -alias $old_ip_address $medium
|
|
}
|
|
|
|
add_new_address() {
|
|
$IFCONFIG $interface \
|
|
inet $new_ip_address \
|
|
netmask $new_subnet_mask \
|
|
broadcast $new_broadcast_address \
|
|
$medium
|
|
|
|
$LOGGER "New IP Address ($interface): $new_ip_address"
|
|
$LOGGER "New Subnet Mask ($interface): $new_subnet_mask"
|
|
$LOGGER "New Broadcast Address ($interface): $new_broadcast_address"
|
|
$LOGGER "New Routers ($interface): $new_routers"
|
|
|
|
echo $new_routers > /tmp/${interface}_router
|
|
}
|
|
|
|
delete_old_alias() {
|
|
if [ -n "$alias_ip_address" ]; then
|
|
$IFCONFIG $interface inet -alias $alias_ip_address > /dev/null 2>&1
|
|
$ROUTE delete $alias_ip_address $LOCALHOST > /dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
add_new_alias() {
|
|
if [ -n "$alias_ip_address" ]; then
|
|
$IFCONFIG $interface inet alias $alias_ip_address netmask \
|
|
$alias_subnet_mask
|
|
$ROUTE add $alias_ip_address $LOCALHOST
|
|
fi
|
|
}
|
|
|
|
delete_old_routes() {
|
|
$ROUTE delete "$old_ip_address" $LOCALHOST >/dev/null 2>&1
|
|
# Only allow the default route to be overridden if it's on our own interface
|
|
DEFAULTROUTE_IFACE=`route get default | grep interface | awk '{print $2};'`
|
|
if [ -z "${DEFAULTROUTE_IFACE}" -o "{$interface}" = "${DEFAULTROUTE_IFACE}" ]; then
|
|
for router in $old_routers; do
|
|
if [ $if_defaultroute = x -o $if_defaultroute = $interface ]; then
|
|
$ROUTE delete default $route >/dev/null 2>&1
|
|
/bin/rm -f /tmp/${interface}_router
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ -n "$old_static_routes" ]; then
|
|
set $old_static_routes
|
|
while [ $# -gt 1 ]; do
|
|
$ROUTE delete "$1" "$2"
|
|
shift; shift
|
|
/bin/rm -f /tmp/${interface}_router
|
|
done
|
|
fi
|
|
|
|
arp_flush
|
|
}
|
|
|
|
add_new_routes() {
|
|
$ROUTE add $new_ip_address $LOCALHOST >/dev/null 2>&1
|
|
|
|
# Only allow the default route to be overridden if it's on our own interface
|
|
DEFAULTROUTE_IFACE=`route get default | grep interface | awk '{print $2};'`
|
|
if [ -z "${DEFAULTROUTE_IFACE}" -o "{$interface}" = "${DEFAULTROUTE_IFACE}" ]; then
|
|
for router in $new_routers; do
|
|
if [ "$new_ip_address" = "$router" ]; then
|
|
$ROUTE add default -iface $router
|
|
#>/dev/null 2>&1
|
|
echo $ROUTE add default -iface $router | $LOGGER
|
|
echo $new_routers > /tmp/${interface}_router
|
|
else
|
|
$ROUTE add default $router
|
|
echo $ROUTE add default $router | $LOGGER
|
|
#>/dev/null 2>&1
|
|
echo $new_routers > /tmp/${interface}_router
|
|
fi
|
|
# 2nd and subsequent default routers error out, so explicitly
|
|
# stop processing the list after the first one.
|
|
break
|
|
done
|
|
fi
|
|
|
|
if [ -n "$new_static_routes" ]; then
|
|
$LOGGER "New Static Routes ($interface): $new_static_routes"
|
|
set $new_static_routes
|
|
while [ $# -gt 1 ]; do
|
|
$ROUTE add $1 $2
|
|
shift; shift
|
|
echo $new_routers > /tmp/${interface}_router
|
|
done
|
|
fi
|
|
|
|
# last ditch effort if no route exists.
|
|
DEFAULTROUTE=`$NETSTAT -rn | $GREP default`
|
|
if [ -z "${DEFAULTROUTE}" ]; then
|
|
$ROUTE add default -iface $interface
|
|
fi
|
|
|
|
}
|
|
|
|
add_new_resolv_conf() {
|
|
|
|
/bin/rm -f /var/etc/nameservers.conf
|
|
|
|
if [ -n "$new_domain_name_servers" ]; then
|
|
for nameserver in $new_domain_name_servers; do
|
|
echo $nameserver >>/var/etc/nameservers.conf
|
|
done
|
|
echo $new_domain_name >/var/etc/defaultdomain.conf
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Must be used on exit. Invokes the local dhcp client exit hooks, if any.
|
|
exit_with_hooks() {
|
|
/etc/rc.newwanip {$interface}
|
|
# probably should do something with exit status of the local script
|
|
exit 0
|
|
}
|
|
|
|
#
|
|
# Start of active code.
|
|
#
|
|
|
|
# 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
|
|
|
|
if [ -x $NETSTAT ]; then
|
|
if_defaulroute=`$NETSTAT -rn | $GREP "^default" | $AWK '{print $6}'`
|
|
else
|
|
if_defaultroute="x"
|
|
fi
|
|
|
|
case $reason in
|
|
MEDIUM)
|
|
$IFCONFIG $interface $medium
|
|
$IFCONFIG $interface inet -alias 0.0.0.0 $medium >/dev/null 2>&1
|
|
/bin/sleep 1
|
|
;;
|
|
|
|
PREINIT)
|
|
delete_old_alias
|
|
$IFCONFIG $interface inet 0.0.0.0 netmask 0.0.0.0 broadcast 255.255.255.255 up
|
|
/bin/rm -f /tmp/${interface}_router
|
|
;;
|
|
|
|
ARPCHECK|ARPSEND)
|
|
;;
|
|
|
|
BOUND|RENEW|REBIND|REBOOT)
|
|
check_hostname
|
|
if [ -n "$old_ip_address" ]; then
|
|
if [ "$old_ip_address" != "$alias_ip_address" ]; then
|
|
delete_old_alias
|
|
fi
|
|
if [ "$old_ip_address" != "$new_ip_address" ]; then
|
|
delete_old_address
|
|
delete_old_routes
|
|
fi
|
|
fi
|
|
if [ "$reason" = BOUND ] || \
|
|
[ "$reason" = REBOOT ] || \
|
|
[ -z "$old_ip_address" ] || \
|
|
[ "$old_ip_address" != "$new_ip_address" ]; then
|
|
add_new_address
|
|
add_new_routes
|
|
fi
|
|
if [ "$new_ip_address" != "$alias_ip_address" ]; then
|
|
add_new_alias
|
|
fi
|
|
add_new_resolv_conf
|
|
;;
|
|
|
|
EXPIRE|FAIL)
|
|
delete_old_alias
|
|
if [ -n "$old_ip_address" ]; then
|
|
delete_old_address
|
|
delete_old_routes
|
|
fi
|
|
# XXX Why add alias we just deleted above?
|
|
add_new_alias
|
|
if [ -f /var/etc/resolv.conf.save ]; then
|
|
#cat /var/etc/resolv.conf.save > /var/etc/resolv.conf
|
|
fi
|
|
;;
|
|
|
|
TIMEOUT)
|
|
delete_old_alias
|
|
add_new_address
|
|
/bin/sleep 1
|
|
if [ -n "$new_routers" ]; then
|
|
$LOGGER "New Routers ($interface): $new_routers"
|
|
set "$new_routers"
|
|
if /sbin/ping -q -c 1 -w 1 "$1"; then
|
|
if [ "$new_ip_address" != "$alias_ip_address" ]; then
|
|
add_new_alias
|
|
fi
|
|
add_new_routes
|
|
if add_new_resolv_conf; then
|
|
exit_with_hooks
|
|
fi
|
|
fi
|
|
fi
|
|
$IFCONFIG $interface inet -alias $new_ip_address $medium
|
|
delete_old_routes
|
|
exit_with_hooks
|
|
;;
|
|
esac
|
|
|
|
exit_with_hooks 0
|