diff -Naur dracut-045/modules.d/40network/dhcpcd-script.sh dracut-045-udhcpc/modules.d/40network/dhcpcd-script.sh --- dracut-045/modules.d/40network/dhcpcd-script.sh 1970-01-01 01:00:00.000000000 +0100 +++ dracut-045-udhcpc/modules.d/40network/dhcpcd-script.sh 2017-04-04 17:14:05.727102593 +0200 @@ -0,0 +1,258 @@ +#!/bin/sh + +PATH=/usr/sbin:/usr/bin:/sbin:/bin + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh +type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh + +# We already need a set netif here +netif=$interface + +setup_interface() { + ip=$new_ip_address + mtu=$new_interface_mtu + mask=$new_subnet_mask + bcast=$new_broadcast_address + gw=${new_routers%%,*} + domain=$new_domain_name + search=$(printf -- "$new_domain_search") + namesrv=$new_domain_name_servers + hostname=$new_host_name + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time + [ -n "$new_max_life" ] && lease_time=$new_max_life + preferred_lft=$lease_time + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life + + [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override + + # Taken from debian dhclient-script: + # 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 [ -n "$mtu" ] && [ $mtu -gt 576 ] ; then + if ! ip link set $netif mtu $mtu ; then + ip link set $netif down + ip link set $netif mtu $mtu + linkup $netif + fi + fi + + ip addr add $ip${mask:+/$mask} ${bcast:+broadcast $bcast} dev $netif \ + ${lease_time:+valid_lft $lease_time} \ + ${preferred_lft:+preferred_lft ${preferred_lft}} + + if [ -n "$gw" ] ; then + if [ "$mask" = "255.255.255.255" ] ; then + # point-to-point connection => set explicit route to gateway + echo ip route add $gw dev $netif > /tmp/net.$netif.gw + fi + + echo "$gw" | { + IFS=' ' read -r main_gw other_gw + echo ip route replace default via $main_gw dev $netif >> /tmp/net.$netif.gw + if [ -n "$other_gw" ] ; then + for g in $other_gw; do + echo ip route add default via $g dev $netif >> /tmp/net.$netif.gw + done + fi + } + fi + + if getargbool 1 rd.peerdns; then + [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf + if [ -n "$namesrv" ] ; then + for s in $namesrv; do + echo nameserver $s + done + fi >> /tmp/net.$netif.resolv.conf + fi + # Note: hostname can be fqdn OR short hostname, so chop off any + # trailing domain name and explicity add any domain if set. + [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname +} + +setup_interface6() { + domain=$new_domain_name + search=$(printf -- "$new_domain_search") + namesrv=$new_domain_name_servers + hostname=$new_host_name + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time + [ -n "$new_max_life" ] && lease_time=$new_max_life + preferred_lft=$lease_time + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life + + [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override + + ip -6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ + dev ${netif} scope global \ + ${lease_time:+valid_lft $lease_time} \ + ${preferred_lft:+preferred_lft ${preferred_lft}} + + if getargbool 1 rd.peerdns; then + [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf + if [ -n "$namesrv" ] ; then + for s in $namesrv; do + echo nameserver $s + done + fi >> /tmp/net.$netif.resolv.conf + fi + + # Note: hostname can be fqdn OR short hostname, so chop off any + # trailing domain name and explicity add any domain if set. + [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname +} + +parse_option_121() { + while [ $# -ne 0 ]; do + mask="$1" + shift + + # Is the destination a multicast group? + if [ $1 -ge 224 -a $1 -lt 240 ]; then + multicast=1 + else + multicast=0 + fi + + # Parse the arguments into a CIDR net/mask string + if [ $mask -gt 24 ]; then + destination="$1.$2.$3.$4/$mask" + shift; shift; shift; shift + elif [ $mask -gt 16 ]; then + destination="$1.$2.$3.0/$mask" + shift; shift; shift + elif [ $mask -gt 8 ]; then + destination="$1.$2.0.0/$mask" + shift; shift + else + destination="$1.0.0.0/$mask" + shift + fi + + # Read the gateway + gateway="$1.$2.$3.$4" + shift; shift; shift; shift + + # Multicast routing on Linux + # - If you set a next-hop address for a multicast group, this breaks with Cisco switches + # - If you simply leave it link-local and attach it to an interface, it works fine. + if [ $multicast -eq 1 ]; then + temp_result="$destination dev $interface" + else + temp_result="$destination via $gateway dev $interface" + fi + + echo "/sbin/ip route add $temp_result" + done +} + + +case $reason in + PREINIT) + echo "dhcp: PREINIT $netif up" + linkup $netif + ;; + + PREINIT6) + echo "dhcp: PREINIT6 $netif up" + linkup $netif + wait_for_ipv6_dad_link $netif + ;; + + BOUND) + echo "dhcp: BOND setting $netif" + unset layer2 + if [ -f /sys/class/net/$netif/device/layer2 ]; then + read layer2 < /sys/class/net/$netif/device/layer2 + fi + if [ "$layer2" != "0" ]; then + if command -v arping2 >/dev/null; then + if arping2 -q -C 1 -c 2 -I $netif -0 $new_ip_address ; then + warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" + exit 1 + fi + else + if ! arping -f -q -D -c 2 -I $netif $new_ip_address ; then + warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" + exit 1 + fi + fi + fi + unset layer2 + setup_interface + set | while read line || [ -n "$line" ]; do + [ "${line#new_}" = "$line" ] && continue + echo "$line" + done >/tmp/dhcpcd.$netif.dhcpopts + + { + echo '. /lib/net-lib.sh' + echo "setup_net $netif" + if [ -n "$new_classless_static_routes" ]; then + modify_routes add "$(parse_option_121 $new_classless_static_routes)" + fi + echo "source_hook initqueue/online $netif" + [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" + echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" + } > $hookdir/initqueue/setup_net_$netif.sh + + echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhcpcd-$netif.sh + >/tmp/net.$netif.up + if [ -e /sys/class/net/${netif}/address ]; then + > /tmp/net.$(cat /sys/class/net/${netif}/address).up + fi + + ;; + + RENEW|REBIND) + unset lease_time + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time + [ -n "$new_max_life" ] && lease_time=$new_max_life + preferred_lft=$lease_time + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life + ip -4 addr change ${new_ip_address}/${new_subnet_mask} broadcast ${new_broadcast_address} dev ${interface} \ + ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ + >/dev/null 2>&1 + ;; + + BOUND6) + echo "dhcp: BOND6 setting $netif" + setup_interface6 + + set | while read line || [ -n "$line" ]; do + [ "${line#new_}" = "$line" ] && continue + echo "$line" + done >/tmp/dhcpcd.$netif.dhcpopts + + { + echo '. /lib/net-lib.sh' + echo "setup_net $netif" + echo "source_hook initqueue/online $netif" + [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" + echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" + } > $hookdir/initqueue/setup_net_$netif.sh + + echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhcpcd-$netif.sh + >/tmp/net.$netif.up + if [ -e /sys/class/net/${netif}/address ]; then + > /tmp/net.$(cat /sys/class/net/${netif}/address).up + fi + ;; + + RENEW6|REBIND6) + unset lease_time + [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time + [ -n "$new_max_life" ] && lease_time=$new_max_life + preferred_lft=$lease_time + [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life + ip -6 addr change ${new_ip6_address}/${new_ip6_prefixlen} dev ${interface} scope global \ + ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ + >/dev/null 2>&1 + ;; + + *) echo "dhcp: $reason";; +esac + +exit 0 diff -Naur dracut-045/modules.d/40network/ifup.sh dracut-045-udhcpc/modules.d/40network/ifup.sh --- dracut-045/modules.d/40network/ifup.sh 2017-04-03 10:26:25.000000000 +0200 +++ dracut-045-udhcpc/modules.d/40network/ifup.sh 2017-04-04 17:18:32.580199239 +0200 @@ -10,6 +10,23 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh +# load magellan settings +[ -f /etc/conf.d/network ] && . /etc/conf.d/network +# some sane defaults +if [[ -n $DEFAULT_DHCP_PROG ]] +then + DHCP_PROG="$DEFAULT_DHCP_PROG" +else + DHCP_PROG="/sbin/dhcpcd" +fi +if [[ -n $DEFAULT_DHCP_START ]] +then + DHCP_START="$DEFAULT_DHCP_START" +else + DHCP_START="-t 10" +fi +DHCP_PROG_NAME="${DHCP_PROG##*/}" + # Huh? No $1? [ -z "$1" ] && exit 1 @@ -25,6 +42,9 @@ # Run dhclient do_dhcp() { + local opts + local timeoutswitch + # dhclient-script will mark the netif up and generate the online # event for nfsroot # XXX add -V vendor class and option parsing per kernel @@ -41,20 +61,37 @@ return 1 fi + case $DHCP_PROG_NAME in + dhclient) + opts="$@ -1 -q" + opts+=" -cf /etc/dhclient.conf" + opts+=" -pf /tmp/$DHCP_PROG_NAME.$netif.pid" + opts+=" -lf /tmp/$DHCP_PROG_NAME.$netif.lease" + timeoutswitch="-timeout" + ;; + + dhcpcd) + opts="$@ -q" + timeoutswitch="--timeout" + ;; + + udhcpc) + opts="-q" + opts+=" -p /tmp/$DHCP_PROG_NAME.$netif.pid" + timeoutswitch="--timeout" + ;; + esac + while [ $_COUNT -lt $_DHCPRETRY ]; do - info "Starting dhcp for interface $netif" - dhclient "$@" \ - ${_timeout:+-timeout $_timeout} \ - -q \ - -cf /etc/dhclient.conf \ - -pf /tmp/dhclient.$netif.pid \ - -lf /tmp/dhclient.$netif.lease \ - $netif \ + info "Starting dhcp ($DHCP_PROG_NAME) for interface $netif" + $DHCP_PROG $opts \ + ${_timeout:+$timeoutswitch $_timeout} \ + $DHCP_START $netif \ && return 0 _COUNT=$(($_COUNT+1)) [ $_COUNT -lt $_DHCPRETRY ] && sleep 1 done - warn "dhcp for interface $netif failed" + warn "dhcp ($DHCP_PROG_NAME) for interface $netif failed" return 1 } diff -Naur dracut-045/modules.d/40network/kill-dhcpcd.sh dracut-045-udhcpc/modules.d/40network/kill-dhcpcd.sh --- dracut-045/modules.d/40network/kill-dhcpcd.sh 1970-01-01 01:00:00.000000000 +0100 +++ dracut-045-udhcpc/modules.d/40network/kill-dhcpcd.sh 2017-04-04 17:19:45.883403170 +0200 @@ -0,0 +1,15 @@ +#!/bin/sh + +for f in /tmp/dhcpcd.*.pid; do + [ -e $f ] || continue + read PID < $f; + kill $PID >/dev/null 2>&1 +done + +sleep 0.1 + +for f in /tmp/dhcpcd.*.pid; do + [ -e $f ] || continue + read PID < $f; + kill -9 $PID >/dev/null 2>&1 +done diff -Naur dracut-045/modules.d/40network/kill-udhcpc.sh dracut-045-udhcpc/modules.d/40network/kill-udhcpc.sh --- dracut-045/modules.d/40network/kill-udhcpc.sh 1970-01-01 01:00:00.000000000 +0100 +++ dracut-045-udhcpc/modules.d/40network/kill-udhcpc.sh 2017-04-04 17:20:09.041151778 +0200 @@ -0,0 +1,15 @@ +#!/bin/sh + +for f in /tmp/udhcpc.*.pid; do + [ -e $f ] || continue + read PID < $f; + kill $PID >/dev/null 2>&1 +done + +sleep 0.1 + +for f in /tmp/udhcpc.*.pid; do + [ -e $f ] || continue + read PID < $f; + kill -9 $PID >/dev/null 2>&1 +done diff -Naur dracut-045/modules.d/40network/module-setup.sh dracut-045-udhcpc/modules.d/40network/module-setup.sh --- dracut-045/modules.d/40network/module-setup.sh 2017-04-03 10:26:25.000000000 +0200 +++ dracut-045-udhcpc/modules.d/40network/module-setup.sh 2017-04-04 17:24:59.932997302 +0200 @@ -3,8 +3,9 @@ # called by dracut check() { local _program + . /etc/conf.d/network - require_binaries ip dhclient || return 1 + require_binaries ip ifconfig route $DEFAULT_DHCP_PROG || return 1 require_any_binary arping arping2 || return 1 return 255 @@ -24,17 +25,20 @@ # called by dracut install() { local _arch _i _dir - inst_multiple ip dhclient sed awk + local _dhcp_prog_name + local _file + . /etc/conf.d/network + _dhcp_prog_name="${DEFAULT_DHCP_PROG##*/}" + + inst_multiple ip $_dhcp_prog_name sed awk + inst_multiple ifconfig route inst_multiple -o arping arping2 inst_multiple -o ping ping6 inst_multiple -o teamd teamdctl teamnl inst_simple /etc/libnl/classid inst_script "$moddir/ifup.sh" "/sbin/ifup" inst_script "$moddir/netroot.sh" "/sbin/netroot" - inst_script "$moddir/dhclient-script.sh" "/sbin/dhclient-script" inst_simple "$moddir/net-lib.sh" "/lib/net-lib.sh" - inst_simple -H "/etc/dhclient.conf" - cat "$moddir/dhclient.conf" >> "${initdir}/etc/dhclient.conf" inst_hook pre-udev 50 "$moddir/ifname-genrules.sh" inst_hook pre-udev 60 "$moddir/net-genrules.sh" inst_hook cmdline 91 "$moddir/dhcp-root.sh" @@ -45,7 +49,30 @@ inst_hook cmdline 97 "$moddir/parse-bridge.sh" inst_hook cmdline 98 "$moddir/parse-ip-opts.sh" inst_hook cmdline 99 "$moddir/parse-ifname.sh" - inst_hook cleanup 10 "$moddir/kill-dhclient.sh" + case $_dhcp_prog_name in + dhclient) + inst_script "$moddir/dhclient-script.sh" "/sbin/dhclient-script" + inst_simple -H "/etc/dhclient.conf" + cat "$moddir/dhclient.conf" >> "${initdir}/etc/dhclient.conf" + inst_hook cleanup 10 "$moddir/kill-dhclient.sh" + ;; + + udhcpc) + inst_script "$moddir/udhcpc-script.sh" "/usr/share/udhcpc/default.script" + inst_hook cleanup 10 "$moddir/kill-udhcpc.sh" + ;; + + dhcpcd) + inst_simple "/etc/dhcpcd.conf" + inst_script -o /usr/lib/dhcpcd/dhcpcd-run-hooks + for _file in $(find /usr/lib/dhcpcd/dhcpcd-hooks -type f); do + inst_simple -o $_file + done + inst_simple "$moddir/dhcpcd-script.sh" "/usr/lib/dhcpcd/dhcpcd-hooks/90-netroot" + inst_hook cleanup 10 "$moddir/kill-dhcpcd.sh" + ;; + esac + inst_simple /etc/conf.d/network # install all config files for teaming unset TEAM_MASTER diff -Naur dracut-045/modules.d/40network/net-lib.sh dracut-045-udhcpc/modules.d/40network/net-lib.sh --- dracut-045/modules.d/40network/net-lib.sh 2017-04-03 10:26:25.000000000 +0200 +++ dracut-045-udhcpc/modules.d/40network/net-lib.sh 2017-04-04 17:25:57.728371148 +0200 @@ -120,6 +120,8 @@ [ -e /tmp/net.$netif.hostname ] && . /tmp/net.$netif.hostname [ -e /tmp/net.$netif.override ] && . /tmp/net.$netif.override [ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts + [ -e /tmp/udhcpc.$netif.dhcpopts ] && . /tmp/udhcpc.$netif.dhcpopts + [ -e /tmp/dhcpcd.$netif.dhcpopts ] && . /tmp/dhcpcd.$netif.dhcpopts # set up resolv.conf [ -e /tmp/net.$netif.resolv.conf ] && \ awk '!array[$0]++' /tmp/net.$netif.resolv.conf > /etc/resolv.conf @@ -196,6 +198,12 @@ for f in /tmp/dhclient.$i.*; do [ -f $f ] && cp -f $f /tmp/net.${f#/tmp/dhclient.} done + for f in /tmp/udhcpc.$i.*; do + [ -f $f ] && cp -f $f /tmp/net.${f#/tmp/udhcpc.} + done + for f in /tmp/dhcpcd.$i.*; do + [ -f $f ] && cp -f $f /tmp/net.${f#/tmp/dhcpcd.} + done done echo $IFACES > /tmp/.net.ifaces.new mv /tmp/.net.ifaces.new /tmp/net.ifaces diff -Naur dracut-045/modules.d/40network/netroot.sh dracut-045-udhcpc/modules.d/40network/netroot.sh --- dracut-045/modules.d/40network/netroot.sh 2017-04-03 10:26:25.000000000 +0200 +++ dracut-045-udhcpc/modules.d/40network/netroot.sh 2017-04-04 17:27:39.875264813 +0200 @@ -41,6 +41,8 @@ if getarg "root=dhcp" || getarg "netroot=dhcp" || getarg "root=dhcp6" || getarg "netroot=dhcp6"; then # Load dhcp options [ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts + [ -e /tmp/dhcpcd.$netif.dhcpopts ] && . /tmp/dhcpcd.$netif.dhcpopts + [ -e /tmp/udhcpc.$netif.dhcpopts ] && . /tmp/udhcpc.$netif.dhcpopts # If we have a specific bootdev with no dhcpoptions or empty root-path, # we die. Otherwise we just warn diff -Naur dracut-045/modules.d/40network/udhcpc-script.sh dracut-045-udhcpc/modules.d/40network/udhcpc-script.sh --- dracut-045/modules.d/40network/udhcpc-script.sh 1970-01-01 01:00:00.000000000 +0100 +++ dracut-045-udhcpc/modules.d/40network/udhcpc-script.sh 2017-04-07 15:47:32.482124028 +0200 @@ -0,0 +1,129 @@ +#!/bin/sh + +# global options passed by udhcpc +# what to run +# $1 - which command to run, possible are: bound|deconfig|nak|renew +# router - a list of routers +# subnet - the assigend subnet mask +# dhcptype - type of dhcp (safely ignored) +# interface - which iface gets configured +# serverid - ip of the dhcd server +# dns - a list of dns server +# ip - ip-address to use +# lease - lease time of a dhcp configuration, in seconds +# mask - the number of bits in the netmask (ie: 24) +# boot_file - the bootp boot file option +# siaddr - the bootp next server option +# sname - the bootp server name option +# timezone - offset in seconds from utc +# timesvr - a list of time servers +# namesvr - a list of ien116 name servers +# logsvr - a list of mit-lcs udp log servers +# cookiesvr - a list of rfc865 cookie servers +# lprsvr - a list of lpr servers +# hostname - the assigned hostname +# bootsize - the length in 512 octect blocks of the bootfile +# domain - the domain name of the network +# swapsvr - the ip address of the clients swap server +# rootpath - the path name of the clients root disk +# ipttl - the ttl to use for this network +# mtu - the mtu to use for this network +# broadcast - the broadcast address for this network +# ntpsrv - a list of ntp servers +# wins - a list of wins servers +# message - reason for a dhcpnak +# tftp - the tftp server name +# bootfile - the bootfile name + +PATH=/usr/sbin:/usr/bin:/sbin:/bin + +type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh +type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh + +# We already need a set netif here +netif="${interface}" + +# Huh? Interface configured? +[ -f "/tmp/net.$netif.up" ] && exit 0 + +# renew dhcp leases +bound() +{ + local RESOLV_CONF="/etc/resolv.conf" + local BROADCAST + local NETMASK + local i + + [[ -n ${broadcast} ]] && BROADCAST="broadcast ${broadcast}" + [[ -n ${subnet} ]] && NETMASK="netmask ${subnet}" + + /sbin/ifconfig ${interface} ${ip} ${BROADCAST} ${NETMASK} + + if [ -n "${router}" ] + then + echo "deleting routers" + while /sbin/route del default gw 0.0.0.0 dev ${interface} + do : + done + + metric=0 + for i in ${router} + do + /sbin/route add default gw ${i} dev ${interface} metric $((metric++)) + done + fi + + echo -n > ${RESOLV_CONF} + [[ -n ${domain} ]] && echo "domain ${domain}" >> ${RESOLV_CONF} + for i in ${dns} + do + echo adding dns ${i} + echo "nameserver ${i}" >> ${RESOLV_CONF} + done + + if [ -n "${hostname}" ] + then + echo "echo ${hostname%.${domain}}${domain:+.${domain}} > /proc/sys/kernel/hostname" > /tmp/net.${netif}.hostname + fi + + set | while read line; do + [ "${line#new_}" = "$line" ] && continue + echo "$line" + done >/tmp/udhcpc.$netif.dhcpopts + + { + echo '. /lib/net-lib.sh' + echo "setup_net $netif" + echo "source_hook initqueue/online $netif" + [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" + echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" + } > $hookdir/initqueue/setup_net_$netif.sh + + echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/udhcpc-$netif.sh + >/tmp/net.$netif.up +} + +renew() +{ + # same as bound() + bound +} + +deconfig() +{ + /sbin/ifconfig ${interface} 0.0.0.0 +} + +# what to do if a dhcp request failed +nak() +{ + echo "Received a NAK: ${message}" +} + + +case $1 in + bound) bound ;; + renew) renew ;; + deconfig) deconfig ;; + nak) nak ;; +esac