From 64d01a482cf80a28ff012cf8fac03c6085deefcf Mon Sep 17 00:00:00 2001 From: Cem Keylan Date: Fri, 5 Jun 2020 14:44:55 +0300 Subject: busybox: udhcpc script --- core/busybox/build | 3 + core/busybox/checksums | 3 +- core/busybox/files/.config | 32 +++++---- core/busybox/files/udhcpc.script | 140 +++++++++++++++++++++++++++++++++++++++ core/busybox/sources | 1 + 5 files changed, 164 insertions(+), 15 deletions(-) create mode 100644 core/busybox/files/udhcpc.script (limited to 'core/busybox') diff --git a/core/busybox/build b/core/busybox/build index 568836ed..df00282d 100755 --- a/core/busybox/build +++ b/core/busybox/build @@ -52,3 +52,6 @@ done kinstall 644 ntp.conf "$1/etc/ntp.conf" kinstall 644 inittab "$1/etc/inittab" kinstall 644 mdev.conf "$1/etc/mdev.conf" + +# Install udhcpc configuration script. +kinstall 755 udhcpc.script "$1/etc/udhcpc" diff --git a/core/busybox/checksums b/core/busybox/checksums index fede3dcd..f1625d02 100644 --- a/core/busybox/checksums +++ b/core/busybox/checksums @@ -1,5 +1,5 @@ d0f940a72f648943c1f2211e0e3117387c31d765137d92bd8284a3fb9752a998 busybox-1.31.1.tar.bz2 -ccb775673d9315174b353e137a5362e5446f6593a4bb2b622c22b1e41c219ed8 .config +d72b6a0098c5db4235200c5acc4e327b387951224670b7812012200dce6a8349 .config 47473c15263d52cc741993ca0386d0042a719b23c89e406e173510e42e0f23a5 .config-suid ebd61afac770d3d9cae5c411f44002496fb18b28cf7b77520072a3909852246e acpid.run 814dea14ac612125e97dcc1d619219b2c9dfc14850bf48d858421fb2c98eca12 crond.run @@ -9,6 +9,7 @@ af4c302ed9ae6fa1cd8aa51c6f94de11550625e6f1dc0b138605e3429214d082 mdev.conf 3999bb8986a55b14389196ad70f810c9333ebdf5e03c0fbca2d100a6e8ba3d7e ntpd.run 4a5981f4b0d791fe9b84b0b2e01ae905f6565c8245b3cd603e6decf34ddad71a syslogd.run 2c6012579f669ea790785bb522a879a2005aad0d7977f96863918d3ed3cb03dd ntp.conf +8ce7d65bc9a6da2003bd4dfd89aa355fd8f24fc1fafc37400400f7ac10958caf udhcpc.script 8d84b1719dca2a751c09072c20cd782a3c47f119a68d35316f89d851daf67b88 fsck-resolve-uuid.patch 0f54301a73af461e8066bc805b48d991cfed513d08a2f036e015b19f97cb424a modprobe-kernel-version.patch 09c2f601fec4e5c10664c22f787dafb9424efe219bf826727c356da90dfd60d5 adduser-no-setgid.patch diff --git a/core/busybox/files/.config b/core/busybox/files/.config index 87c7b94f..6d7a181b 100644 --- a/core/busybox/files/.config +++ b/core/busybox/files/.config @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Busybox version: 1.31.1 -# Mon Jun 1 11:10:36 2020 +# Fri Jun 5 11:32:04 2020 # CONFIG_HAVE_DOT_CONFIG=y @@ -979,20 +979,24 @@ CONFIG_WHOIS=y CONFIG_DHCPD_LEASES_FILE="" # CONFIG_DUMPLEASES is not set # CONFIG_DHCPRELAY is not set -# CONFIG_UDHCPC is not set -# CONFIG_FEATURE_UDHCPC_ARPING is not set -# CONFIG_FEATURE_UDHCPC_SANITIZEOPT is not set -CONFIG_UDHCPC_DEFAULT_SCRIPT="" -# CONFIG_UDHCPC6 is not set -# CONFIG_FEATURE_UDHCPC6_RFC3646 is not set -# CONFIG_FEATURE_UDHCPC6_RFC4704 is not set -# CONFIG_FEATURE_UDHCPC6_RFC4833 is not set -# CONFIG_FEATURE_UDHCPC6_RFC5970 is not set +CONFIG_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +CONFIG_FEATURE_UDHCPC_SANITIZEOPT=y +CONFIG_UDHCPC_DEFAULT_SCRIPT="/etc/udhcpc" +CONFIG_UDHCPC6=y +CONFIG_FEATURE_UDHCPC6_RFC3646=y +CONFIG_FEATURE_UDHCPC6_RFC4704=y +CONFIG_FEATURE_UDHCPC6_RFC4833=y +CONFIG_FEATURE_UDHCPC6_RFC5970=y + +# +# Common options for DHCP applets +# # CONFIG_FEATURE_UDHCP_PORT is not set -CONFIG_UDHCP_DEBUG=0 -CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=0 -# CONFIG_FEATURE_UDHCP_RFC3397 is not set -# CONFIG_FEATURE_UDHCP_8021Q is not set +CONFIG_UDHCP_DEBUG=2 +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_FEATURE_UDHCP_RFC3397=y +CONFIG_FEATURE_UDHCP_8021Q=y CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" # diff --git a/core/busybox/files/udhcpc.script b/core/busybox/files/udhcpc.script new file mode 100644 index 00000000..b3003cd0 --- /dev/null +++ b/core/busybox/files/udhcpc.script @@ -0,0 +1,140 @@ +#!/bin/sh +# shellcheck source=/dev/null +# shellcheck disable=1090 + +# script for udhcpc +# Copyright (c) 2008 Natanael Copa +# Copyright (c) 2020 Cem Keylan + +# I have made some minor changes, POSIX shell fixes, and linting. +# Rest of the script is pretty much the same. +# - Cem + +[ -f "${UDHCPC:=/etc/udhcpc.d}/udhcpc.conf" ] && . "$UDHCPC/udhcpc.conf" + +RESOLV_CONF="/etc/resolv.conf" + +# Export variables so that hooks can also make use of them. +export broadcast +export dns +export domain +export interface +export ip +export mask +export metric +export router +export search +export subnet + +run_scripts() { + for file in "$1/"*; do + [ -f "$file" ] && "$file" + done +} + +deconfig() { ip -4 addr flush dev "$interface" ;} + +is_wifi() { [ -e "/sys/class/net/$interface/phy80211" ] ;} + +if_index() { + if [ -e "/sys/class/net/$interface/ifindex" ]; then + read -r ifindex < "/sys/class/net/$interface/ifindex" + else + ifindex="$(ip -4 link show dev "$interface")" + fi + printf '%s\n' "${ifindex%%:*}" +} + +calc_metric() { + is_wifi && { printf '%s\n' "$(( 300 + $(if_index) ))"; return ;} + printf '%s\n' "$(( 200 + $(if_index) ))" +} + +routes() { + [ "$router" ] || return + for i in $NO_GATEWAY; do + [ "$i" = "$interface" ] && return + done + while ip -4 route del default via dev "$interface" 2>/dev/null; do + : + done + num=-1 + for gw in $router; do + if [ "$subnet" = "255.255.255.255" ]; then + # special case for /32 subnets: + # /32 instructs kernel to always use routing for all outgoing packets + # (they can never be sent to local subnet - there is no local subnet for /32). + # Used in datacenters, avoids the need for private ip-addresses between two hops. + ip -4 route add "$gw" dev "$interface" + fi + ip -4 route add 0.0.0.0/0 via "$gw" dev "$interface" \ + metric $(( (num += 1) + ${IF_METRIC:-$(calc_metric)} )) + done +} + +resolvconf() { + case "$IF_PEER_DNS" in yes|'') ;; *) return; esac + case "$RESOLV_CONF" in [Nn][Oo]|'') return; esac + case " $NO_DNS " in *" $interface "*) return; esac + :> "$RESOLV_CONF.$$" + if [ "$search" ]; then + printf 'search %s\n' "$search" >> "$RESOLV_CONF.$$" + elif [ "$domain" ]; then + printf 'search %s\n' "$domain" >> "$RESOLV_CONF.$$" + fi + + # Word-splitting is intentional + # shellcheck disable=2086 + printf 'nameserver %s\n' $dns >> "$RESOLV_CONF.$$" + chmod a+r "$RESOLV_CONF.$$" + mv "$RESOLV_CONF.$$" "$RESOLV_CONF" +} + +bound() { + ip -4 addr add "$ip/$mask" ${broadcast:+broadcast $broadcast} dev "$interface" + ip -4 link set dev "$interface" up + routes + resolvconf +} + +renew() { + ip -4 addr show dev "$interface" | grep -q "$ip/$mask" || { + ip -4 addr flush dev "$interface" + ip -4 addr add "$ip/$mask" ${broadcast:+broadcast $broadcast} dev "$interface" + } + for i in $router; do + ip -4 route show | grep ^default | grep -q "$i" || { + routes + break + } + done + if ! grep -q "^search $domain" "$RESOLV_CONF" ; then + resolvconf + return + fi + for i in $dns; do + if ! grep -q "^nameserver $i" "$RESOLV_CONF" ; then + resolvconf + return + fi + done +} + +case "$1" in + deconfig|renew|bound) + run_scripts "$UDHCPC/pre-$1" + $1 + run_scripts "$UDHCPC/post-$1" + ;; + leasefail) + echo "udhcpc failed to get a DHCP lease" >&2 + ;; + nak) + echo "udhcpc received DHCP NAK" >&2 + ;; + *) + echo "Error: this script should be called from udhcpc" >&2 + exit 1 + ;; +esac +exit 0 diff --git a/core/busybox/sources b/core/busybox/sources index 435b330b..f1190747 100644 --- a/core/busybox/sources +++ b/core/busybox/sources @@ -9,6 +9,7 @@ files/mdev.run files/ntpd.run files/syslogd.run files/ntp.conf +files/udhcpc.script patches/fsck-resolve-uuid.patch patches/modprobe-kernel-version.patch patches/adduser-no-setgid.patch -- cgit v1.2.3