diff options
Diffstat (limited to 'sh')
-rw-r--r-- | sh/.gitignore | 1 | ||||
-rw-r--r-- | sh/Makefile.Linux | 4 | ||||
-rw-r--r-- | sh/udhcpc-hook.sh.in | 117 |
3 files changed, 120 insertions, 2 deletions
diff --git a/sh/.gitignore b/sh/.gitignore index f416d5b9..bc5c074e 100644 --- a/sh/.gitignore +++ b/sh/.gitignore @@ -7,3 +7,4 @@ init.sh init-early.sh ifwatchd-carrier.sh ifwatchd-nocarrier.sh +udhcpc-hook.sh diff --git a/sh/Makefile.Linux b/sh/Makefile.Linux index bb48f42e..fb9208c4 100644 --- a/sh/Makefile.Linux +++ b/sh/Makefile.Linux @@ -1,5 +1,5 @@ -SRCS+= init.sh.in init-early.sh.in -BIN+= init-early.sh +SRCS+= init.sh.in init-early.sh.in udhcpc-hook.sh.in +BIN+= init-early.sh udhcpc-hook.sh .SUFFIXES: .sh.Linux.in .sh.Linux.in.sh: diff --git a/sh/udhcpc-hook.sh.in b/sh/udhcpc-hook.sh.in new file mode 100644 index 00000000..a14cac99 --- /dev/null +++ b/sh/udhcpc-hook.sh.in @@ -0,0 +1,117 @@ +#!@SHELL@ +# busybox udhcp setup script + +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +peer_var() +{ + [ -n "$1" ] && [ "$1" != "yes" ] +} + +update_dns() +{ + peer_var "${PEER_DNS}" && return + [ -z "${domain}" ] && [ -z "${dns}" ] && return + + conf="# Generated by udhcpc for ${interface}\n" + [ -n "${domain}" ] && conf="${conf}search ${domain}\n" + for i in ${dns} ; do + conf="${conf}nameserver ${i}\n" + done + if [ -x /sbin/resolvconf ] ; then + printf "${conf}" | resolvconf -a ${interface} + else + printf "${conf}" > /etc/resolv.conf + chmod 644 /etc/resolv.conf + fi +} + +update_ntp() +{ + peer_var "${PEER_NTP}" && return + [ -z "${ntpsrv}" ] && return + + conf="# Generated by udhcpc for interface ${interface}\n" + conf="${conf}restrict default noquery notrust nomodify\n" + conf="${conf}restrict 127.0.0.1\n" + for i in ${ntpsrv} ; do + conf="${conf}restrict ${i} nomodify notrap noquery\n" + conf="${conf}server ${i}\n" + done + conf="${conf}driftfile /var/lib/ntp/ntp.drift\n" + conf="${conf}logfile /var/log/ntp.log\n" + printf "${conf}" > /etc/ntp.conf + chmod 644 /etc/ntp.conf +} + +update_hostname() +{ + peer_var "${PEER_HOSTNAME}" && return + [ -z "${hostname}" ] && return + + myhost="$(hostname)" + [ -z "${myhost}" ] || [ "${myhost}" = "(none)" ] && hostname "${hostname}" +} + +update_interface() +{ + [ -n "${broadcast}" ] && broadcast="broadcast ${broadcast}" + [ -n "${subnet}" ] && netmask="netmask ${subnet}" + [ -n "${mtu}" ] && mtu="mtu ${mtu}" + ifconfig "${interface}" ${ip} ${broadcast} ${netmask} ${mtu} +} + +update_routes() +{ + peer_var "${PEER_ROUTERS}" && return + + if [ -n "${router}" ] ; then + metric= + [ -n "${IF_METRIC}" ] && metric="metric ${IF_METRIC}" + for i in ${router} ; do + route add default gw "${i}" ${metric} dev "${interface}" + done + fi +} + +deconfig() +{ + ifconfig "${interface}" 0.0.0.0 + + if ! peer_var "${PEER_ROUTERS}" ; then + while route del default dev "${interface}" >& /dev/null; do + : + done + fi + + if ! peer_var "${PEER_DNS}" ; then + [ -x /sbin/resolvconf ] && resolvconf -d "${interface}" + fi +} + +if [ -r "/var/run/udhcpc-${interface}.conf" ]; then + . "/var/run/udhcpc-${interface}.conf" +fi + +case "$1" in + bound|renew) + update_hostname + update_interface + update_routes + update_dns + update_ntp + ;; + deconfig|leasefail) + deconfig + ;; + nak) + echo "nak: ${message}" + ;; + *) + echo "unknown option $1" >&2 + echo "Usage: $0 {bound|deconfig|leasefail|nak|renew}" >&2 + exit 1 + ;; +esac + +exit 0 |