diff options
Diffstat (limited to 'modules.d/40network')
-rwxr-xr-x | modules.d/40network/dhcp-root.sh | 30 | ||||
-rwxr-xr-x | modules.d/40network/ifname-genrules.sh | 32 | ||||
-rwxr-xr-x | modules.d/40network/module-setup.sh | 18 | ||||
-rwxr-xr-x | modules.d/40network/net-lib.sh | 906 | ||||
-rwxr-xr-x | modules.d/40network/netroot.sh | 92 |
5 files changed, 1 insertions, 1077 deletions
diff --git a/modules.d/40network/dhcp-root.sh b/modules.d/40network/dhcp-root.sh deleted file mode 100755 index 3f11221..0000000 --- a/modules.d/40network/dhcp-root.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -# This script is sourced, so root should be set. But let's be paranoid -[ -z "$root" ] && root=$(getarg root=) - -if [ -z "$netroot" ]; then - for netroot in $(getargs netroot=); do - [ "$netroot" = "dhcp" ] && break - [ "$netroot" = "dhcp6" ] && break - done - [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] || unset netroot -fi - -if [ "$root" = "dhcp" ] || [ "$root" = "dhcp6" ] || [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ]; then - # Tell ip= checker that we need dhcp - # shellcheck disable=SC2034 - NEEDDHCP="1" - - # Done, all good! - # shellcheck disable=SC2034 - rootok=1 - if [ "$netroot" != "dhcp" ] && [ "$netroot" != "dhcp6" ]; then - netroot=$root - fi - - # Shut up init error check - [ -z "$root" ] && root="dhcp" - # shellcheck disable=SC2016 - echo '[ -d $NEWROOT/proc -o -e /dev/root ]' > "$hookdir"/initqueue/finished/dhcp.sh -fi diff --git a/modules.d/40network/ifname-genrules.sh b/modules.d/40network/ifname-genrules.sh deleted file mode 100755 index b9b95c4..0000000 --- a/modules.d/40network/ifname-genrules.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -# if there are no ifname parameters, just use NAME=KERNEL -if ! getarg ifname= > /dev/null; then - return -fi - -command -v parse_ifname_opts > /dev/null || . /lib/net-lib.sh - -{ - for p in $(getargs ifname=); do - parse_ifname_opts "$p" - - if [ -f /tmp/ifname-"$ifname_mac" ]; then - read -r oldif < /tmp/ifname-"$ifname_mac" - fi - if [ -f /tmp/ifname-"$ifname_if" ]; then - read -r oldmac < /tmp/ifname-"$ifname_if" - fi - if [ -n "$oldif" -a -n "$oldmac" -a "$oldif" = "$ifname_if" -a "$oldmac" = "$ifname_mac" ]; then - # skip same ifname= declaration - continue - fi - - [ -n "$oldif" ] && warn "Multiple interface names specified for MAC $ifname_mac: $oldif" - [ -n "$oldmac" ] && warn "Multiple MAC specified for $ifname_if: $oldmac" - - printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{type}=="1", NAME="%s"\n' "$ifname_mac" "$ifname_if" - echo "$ifname_if" > /tmp/ifname-"$ifname_mac" - echo "$ifname_mac" > /tmp/ifname-"$ifname_if" - done -} >> /etc/udev/rules.d/80-ifname.rules diff --git a/modules.d/40network/module-setup.sh b/modules.d/40network/module-setup.sh index 4c77ff3..970c252 100755 --- a/modules.d/40network/module-setup.sh +++ b/modules.d/40network/module-setup.sh @@ -27,22 +27,6 @@ depends() { network_handler="network-legacy" fi fi - echo "kernel-network-modules $network_handler" + echo "net-lib kernel-network-modules $network_handler" return 0 } - -# called by dracut -installkernel() { - return 0 -} - -# called by dracut -install() { - inst_script "$moddir/netroot.sh" "/sbin/netroot" - inst_simple "$moddir/net-lib.sh" "/lib/net-lib.sh" - inst_hook pre-udev 50 "$moddir/ifname-genrules.sh" - inst_hook cmdline 91 "$moddir/dhcp-root.sh" - inst_multiple ip sed awk grep pgrep tr - inst_multiple -o arping arping2 - dracut_need_initqueue -} diff --git a/modules.d/40network/net-lib.sh b/modules.d/40network/net-lib.sh deleted file mode 100755 index 9d88e0d..0000000 --- a/modules.d/40network/net-lib.sh +++ /dev/null @@ -1,906 +0,0 @@ -#!/bin/sh - -# shellcheck disable=SC2034 -IFNETFILE="/tmp/bootnetif" - -is_ip() { - echo "$1" | { - IFS=. read -r a b c d - test "$a" -ge 0 -a "$a" -le 255 \ - -a "$b" -ge 0 -a "$b" -le 255 \ - -a "$c" -ge 0 -a "$c" -le 255 \ - -a "$d" -ge 0 -a "$d" -le 255 \ - 2> /dev/null - } && return 0 - return 1 -} - -get_ip() { - local iface="$1" ip="" - ip=$(ip -f inet addr show "$iface") - ip=${ip%%/*} - ip=${ip##* } - echo "$ip" -} - -iface_for_remote_addr() { - # shellcheck disable=SC2046 - set -- $(ip route get to "$@" | sed 's/.*\bdev\b//p;q') - echo "$1" -} - -iface_for_ip() { - # shellcheck disable=SC2046 - set -- $(ip addr show to "$@") - echo "${2%:}" -} - -iface_for_mac() { - local interface="" - local mac - mac="$(echo "$@" | sed 'y/ABCDEF/abcdef/')" - for interface in /sys/class/net/*; do - if [ "$(cat "$interface"/address)" = "$mac" ]; then - echo "${interface##*/}" - fi - done -} - -# get the iface name for the given identifier - either a MAC, IP, or iface name -iface_name() { - case "$1" in - ??:??:??:??:??:?? | ??-??-??-??-??-??) iface_for_mac "$1" ;; - *:*:* | *.*.*.*) iface_for_ip "$1" ;; - *) echo "$1" ;; - esac -} - -# list the configured interfaces -configured_ifaces() { - local IFACES="" iface_id="" rv=1 - [ -e "/tmp/net.ifaces" ] && read -r IFACES < /tmp/net.ifaces - if { pidof udevd || pidof systemd-udevd; } > /dev/null; then - for iface_id in $IFACES; do - printf "%s\n" "$(iface_name "$iface_id")" - rv=0 - done - else - warn "configured_ifaces called before udev is running" - echo "$IFACES" - [ -n "$IFACES" ] && rv=0 - fi - return $rv -} - -all_ifaces_up() { - local iface="" IFACES="" - [ -e "/tmp/net.ifaces" ] && read -r IFACES < /tmp/net.ifaces - for iface in $IFACES; do - [ -e /tmp/net."$iface".up ] || return 1 - done -} - -all_ifaces_setup() { - local iface="" IFACES="" - [ -e "/tmp/net.ifaces" ] && read -r IFACES < /tmp/net.ifaces - for iface in $IFACES; do - [ -e /tmp/net."$iface".did-setup ] || return 1 - done -} - -get_netroot_ip() { - local prefix="" server="" rest="" - splitsep ":" "$1" prefix server rest - case $server in - [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*) - echo "$server" - return 0 - ;; - esac - return 1 -} - -ip_is_local() { - li=$(ip route get "$@" 2> /dev/null) - if [ -n "$li" ]; then - strstr "$li" " via " || return 0 - fi - return 1 -} - -ifdown() { - local netif="$1" - # ip down/flush ensures that routing info goes away as well - ip link set "$netif" down - ip addr flush dev "$netif" - echo "#empty" > /etc/resolv.conf - rm -f -- /tmp/net."$netif".did-setup - [ -z "$DO_VLAN" ] \ - && [ -e /sys/class/net/"$netif"/address ] \ - && rm -f -- "/tmp/net.$(cat /sys/class/net/"$netif"/address).did-setup" - # TODO: send "offline" uevent? -} - -setup_net() { - local netif="$1" f="" gw_ip="" netroot_ip="" iface="" IFACES="" - local _p - [ -e /tmp/net."$netif".did-setup ] && return - [ -z "$DO_VLAN" ] \ - && [ -e /sys/class/net/"$netif"/address ] \ - && [ -e "/tmp/net.$(cat /sys/class/net/"$netif"/address).did-setup" ] && return - [ -e "/tmp/net.ifaces" ] && read -r IFACES < /tmp/net.ifaces - [ -z "$IFACES" ] && IFACES="$netif" - # run the scripts written by ifup - # shellcheck disable=SC1090 - [ -e /tmp/net."$netif".hostname ] && . /tmp/net."$netif".hostname - # shellcheck disable=SC1090 - [ -e /tmp/net."$netif".override ] && . /tmp/net."$netif".override - # shellcheck disable=SC1090 - [ -e /tmp/dhclient."$netif".dhcpopts ] && . /tmp/dhclient."$netif".dhcpopts - # set up resolv.conf - [ -e /tmp/net."$netif".resolv.conf ] \ - && awk '!array[$0]++' /tmp/net."$netif".resolv.conf > /etc/resolv.conf - # shellcheck disable=SC1090 - [ -e /tmp/net."$netif".gw ] && . /tmp/net."$netif".gw - - # add static route - for _p in $(getargs rd.route); do - route_to_var "$_p" || continue - [ -n "$route_dev" ] && [ "$route_dev" != "$netif" ] && continue - ip route add "$route_mask" ${route_gw:+via $route_gw} ${route_dev:+dev $route_dev} - if strstr "$route_mask" ":"; then - printf -- "%s\n" "$route_mask ${route_gw:+via $route_gw} ${route_dev:+dev $route_dev}" \ - > /tmp/net.route6."$netif" - else - printf -- "%s\n" "$route_mask ${route_gw:+via $route_gw} ${route_dev:+dev $route_dev}" \ - > /tmp/net.route."$netif" - fi - done - - # If a static route was necessary to reach the gateway, the - # first gateway setup call will have failed with - # RTNETLINK answers: Network is unreachable - # Replace the default route again after static routes to cover - # this scenario. - # shellcheck disable=SC1090 - [ -e /tmp/net."$netif".gw ] && . /tmp/net."$netif".gw - - # Handle STP Timeout: arping the default gateway. - # (or the root server, if a) it's local or b) there's no gateway.) - # Note: This assumes that if no router is present the - # root server is on the same subnet. - - # Get DHCP-provided router IP, or the cmdline-provided "gw=" argument - [ -n "$new_routers" ] && gw_ip=${new_routers%%,*} - [ -n "$gw" ] && gw_ip=$gw - - # Get the "netroot" IP (if there's an IP address in there) - netroot_ip=$(get_netroot_ip "$netroot") - - # try netroot if it's local (or there's no gateway) - if ip_is_local "$netroot_ip" || [ -z "$gw_ip" ]; then - dest="$netroot_ip" - else - dest="$gw_ip" - fi - - unset layer2 - if [ -f /sys/class/net/"$netif"/device/layer2 ]; then - read -r layer2 < /sys/class/net/"$netif"/device/layer2 - fi - - if [ "$layer2" != "0" ] && [ -n "$dest" ] && ! strstr "$dest" ":"; then - if command -v arping2 > /dev/null; then - arping2 -q -C 1 -c 60 -I "$netif" "$dest" || info "Resolving $dest via ARP on $netif failed" - else - arping -q -f -w 60 -I "$netif" "$dest" || info "Resolving $dest via ARP on $netif failed" - fi - fi - unset layer2 - - : > /tmp/net."$netif".did-setup - [ -z "$DO_VLAN" ] \ - && [ -e /sys/class/net/"$netif"/address ] \ - && : > "/tmp/net.$(cat /sys/class/net/"$netif"/address).did-setup" -} - -save_netinfo() { - local netif="$1" IFACES="" f="" i="" - [ -e /tmp/net.ifaces ] && read -r IFACES < /tmp/net.ifaces - # Add $netif to the front of IFACES (if it's not there already). - set -- "$netif" - for i in $IFACES; do [ "$i" != "$netif" ] && set -- "$@" "$i"; done - IFACES="$*" - for i in $IFACES; do - for f in "/tmp/dhclient.$i."*; do - [ -f "$f" ] && cp -f "$f" /tmp/net."${f#/tmp/dhclient.}" - done - done - echo "$IFACES" > /tmp/.net.ifaces.new - mv /tmp/.net.ifaces.new /tmp/net.ifaces -} - -set_ifname() { - local name="$1" mac="$2" num=-1 n="" - # if it's already set, return the existing name - for n in $(getargs ifname=); do - strstr "$n" "$mac" && echo "${n%%:*}" && return - done - [ ! -f "/tmp/set_ifname_$name" ] || read -r num < "/tmp/set_ifname_$name" - # otherwise, pick a new name and use that - while :; do - num=$((num + 1)) - [ -e /sys/class/net/"$name"$num ] && continue - for n in $(getargs ifname=); do - [ "$name$num" = "${n%%:*}" ] && continue 2 - done - break - done - echo "ifname=$name$num:$mac" >> /etc/cmdline.d/45-ifname.conf - echo "$num" > "/tmp/set_ifname_$name" - echo "$name$num" -} - -# pxelinux provides macaddr '-' separated, but we need ':' -fix_bootif() { - local macaddr="${1}" - local IFS='-' - # shellcheck disable=SC2086 - macaddr=$(printf '%s:' ${macaddr}) - macaddr=${macaddr%:} - # strip hardware type field from pxelinux - [ -n "${macaddr%??:??:??:??:??:??}" ] && macaddr=${macaddr#??:} - # return macaddr with lowercase alpha characters expected by udev - echo "$macaddr" | sed 'y/ABCDEF/abcdef/' -} - -ibft_to_cmdline() { - local iface="" - modprobe -q iscsi_ibft - ( - for iface in /sys/firmware/ibft/ethernet*; do - local mac="" dev="" - local dhcp="" ip="" gw="" mask="" hostname="" - local dns1 dns2 - - [ -e "${iface}"/mac ] || continue - read -r mac < "${iface}"/mac - [ -z "$mac" ] && continue - dev=$(set_ifname ibft "$mac") - - [ -e /tmp/net."${dev}".has_ibft_config ] && continue - - [ -e "${iface}"/flags ] && read -r flags < "${iface}"/flags - # Skip invalid interfaces - awk -- 'BEGIN { exit (!and('"$flags"',1)) }' || continue - # Skip interfaces not used for booting unless using multipath - if ! getargbool 0 rd.iscsi.mp; then - awk -- 'BEGIN { exit (!and('"$flags"',2)) }' || continue - fi - [ -e "${iface}"/dhcp ] && read -r dhcp < "${iface}"/dhcp - [ -e "${iface}"/origin ] && read -r origin < "${iface}"/origin - [ -e "${iface}"/ip-addr ] && read -r ip < "${iface}"/ip-addr - - if [ -n "$ip" ]; then - case "$ip" in - *.*.*.*) - family=ipv4 - ;; - *:*) - family=ipv6 - ;; - esac - fi - if [ -n "$dhcp" ] || [ "$origin" -eq 3 ]; then - if [ "$family" = "ipv6" ]; then - echo "ip=$dev:dhcp6" - else - echo "ip=$dev:dhcp" - fi - elif [ -e "${iface}"/ip-addr ]; then - # skip not assigned ip addresses - [ "$ip" = "0.0.0.0" ] && continue - [ -e "${iface}"/gateway ] && read -r gw < "${iface}"/gateway - [ "$gw" = "0.0.0.0" ] && unset gw - [ -e "${iface}"/subnet-mask ] && read -r mask < "${iface}"/subnet-mask - [ -e "${iface}"/prefix-len ] && read -r prefix < "${iface}"/prefix-len - [ -e "${iface}"/primary-dns ] && read -r dns1 < "${iface}"/primary-dns - [ "$dns1" = "0.0.0.0" ] && unset dns1 - [ -e "${iface}"/secondary-dns ] && read -r dns2 < "${iface}"/secondary-dns - [ "$dns2" = "0.0.0.0" ] && unset dns - [ -e "${iface}"/hostname ] && read -r hostname < "${iface}"/hostname - if [ "$family" = "ipv6" ]; then - if [ -n "$ip" ]; then - [ -n "$prefix" ] || prefix=128 - ip="[${ip}]" - mask=$prefix - fi - if [ -n "$gw" ]; then - gw="[${gw}]" - fi - fi - if [ -n "$ip" ] && [ -n "$mask" -o -n "$prefix" ]; then - echo "ip=$ip::$gw:$mask:$hostname:$dev:none${dns1:+:$dns1}${dns2:+:$dns2}" - else - warn "${iface} does not contain a valid iBFT configuration" - warn "ip-addr=$ip" - warn "gateway=$gw" - warn "subnet-mask=$mask" - warn "hostname=$hostname" - fi - else - info "${iface} does not contain a valid iBFT configuration" - # shellcheck disable=SC2012 - ls -l "${iface}" | vinfo - fi - - if [ -e "${iface}"/vlan ]; then - read -r vlan < "${iface}"/vlan - if [ "$vlan" -ne "0" ]; then - case "$vlan" in - [0-9]*) - echo "vlan=$dev.$vlan:$dev" - echo "$mac" > /tmp/net."${dev}"."${vlan}".has_ibft_config - ;; - *) - echo "vlan=$vlan:$dev" - echo "$mac" > /tmp/net."${vlan}".has_ibft_config - ;; - esac - else - echo "$mac" > /tmp/net."${dev}".has_ibft_config - fi - else - echo "$mac" > /tmp/net."${dev}".has_ibft_config - fi - - done - ) >> /etc/cmdline.d/40-ibft.conf -} - -parse_iscsi_root() { - local v - v=${1#iscsi:} - - # extract authentication info - case "$v" in - *@*:*:*:*:*) - authinfo=${v%%@*} - v=${v#*@} - # allow empty authinfo to allow having an @ in iscsi_target_name like this: - # netroot=iscsi:@192.168.1.100::3260::iqn.2009-01.com.example:testdi@sk - if [ -n "$authinfo" ]; then - OLDIFS="$IFS" - IFS=: - # shellcheck disable=SC2086 - set $authinfo - IFS="$OLDIFS" - if [ $# -gt 4 ]; then - warn "Wrong authentication info in iscsi: parameter!" - return 1 - fi - iscsi_username=$1 - iscsi_password=$2 - if [ $# -gt 2 ]; then - iscsi_in_username=$3 - iscsi_in_password=$4 - fi - fi - ;; - esac - - # extract target ip - case "$v" in - [[]*[]]:*) - iscsi_target_ip=${v#[[]} - iscsi_target_ip=${iscsi_target_ip%%[]]*} - v=${v#[[]"$iscsi_target_ip"[]]:} - ;; - *) - iscsi_target_ip=${v%%[:]*} - v=${v#"$iscsi_target_ip":} - ;; - esac - - unset iscsi_target_name - # extract target name - case "$v" in - *:iqn.*) - iscsi_target_name=iqn.${v##*:iqn.} - v=${v%:iqn.*}: - ;; - *:eui.*) - iscsi_target_name=eui.${v##*:eui.} - v=${v%:eui.*}: - ;; - *:naa.*) - iscsi_target_name=naa.${v##*:naa.} - v=${v%:naa.*}: - ;; - esac - - # parse the rest - OLDIFS="$IFS" - IFS=: - # shellcheck disable=SC2086 - set $v - IFS="$OLDIFS" - - iscsi_protocol=$1 - shift # ignored - iscsi_target_port=$1 - shift - - if [ -n "$iscsi_target_name" ]; then - if [ $# -eq 3 ]; then - iscsi_iface_name=$1 - shift - fi - if [ $# -eq 2 ]; then - iscsi_netdev_name=$1 - shift - fi - iscsi_lun=$1 - shift - if [ $# -ne 0 ]; then - warn "Invalid parameter in iscsi: parameter!" - return 1 - fi - return 0 - fi - - if [ $# -gt 3 ] && [ -n "$1$2" ]; then - if [ -z "$3" ] || [ "$3" -ge 0 ] 2> /dev/null; then - iscsi_iface_name=$1 - shift - iscsi_netdev_name=$1 - shift - fi - fi - - iscsi_lun=$1 - shift - - iscsi_target_name=$(printf "%s:" "$@") - iscsi_target_name=${iscsi_target_name%:} -} - -ip_to_var() { - local v="${1}": - local i - set -- - while [ -n "$v" ]; do - if [ "${v#\[*:*:*\]:}" != "$v" ]; then - # handle IPv6 address - i="${v%%\]:*}" - i="${i##\[}" - set -- "$@" "$i" - v=${v#\["$i"\]:} - else - set -- "$@" "${v%%:*}" - v=${v#*:} - fi - done - - unset ip srv gw mask hostname dev autoconf macaddr mtu dns1 dns2 - - if [ $# -eq 0 ]; then - autoconf="error" - return 0 - fi - - if [ $# -eq 1 ]; then - # format: ip={dhcp|on|any|dhcp6|auto6|either6|single-dhcp} - # or - # ip=<ipv4-address> means anaconda-style static config argument cluster - autoconf="$1" - - if strglob "$autoconf" "*.*.*.*"; then - # ip=<ipv4-address> means anaconda-style static config argument cluster: - # ip=<ip> gateway=<gw> netmask=<nm> hostname=<host> mtu=<mtu> - # ksdevice={link|bootif|ibft|<MAC>|<ifname>} - ip="$autoconf" - gw=$(getarg gateway=) - mask=$(getarg netmask=) - hostname=$(getarg hostname=) - dev=$(getarg ksdevice=) - autoconf="none" - mtu=$(getarg mtu=) - - # handle special values for ksdevice - case "$dev" in - bootif | BOOTIF) dev=$(fix_bootif "$(getarg BOOTIF=)") ;; - link) dev="" ;; # FIXME: do something useful with this - ibft) dev="" ;; # ignore - ibft is handled elsewhere - esac - fi - return 0 - fi - - if [ "$2" = "dhcp" -o "$2" = "on" -o "$2" = "any" -o "$2" = "dhcp6" -o "$2" = "auto6" -o "$2" = "either6" ]; then - # format: ip=<interface>:{dhcp|on|any|dhcp6|auto6}[:[<mtu>][:<macaddr>]] - [ -n "$1" ] && dev="$1" - [ -n "$2" ] && autoconf="$2" - [ -n "$3" ] && mtu=$3 - if [ -z "$5" ]; then - macaddr="$4" - else - macaddr="${4}:${5}:${6}:${7}:${8}:${9}" - fi - return 0 - fi - - # format: ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}:[:[<mtu>][:<macaddr>]] - - [ -n "$1" ] && ip=$1 - [ -n "$2" ] && srv=$2 - [ -n "$3" ] && gw=$3 - [ -n "$4" ] && mask=$4 - [ -n "$5" ] && hostname=$5 - [ -n "$6" ] && dev=$6 - [ -n "$7" ] && autoconf=$7 - case "$8" in - [0-9a-fA-F]*:* | [0-9]*.[0-9]*.[0-9]*.[0-9]*) - dns1="$8" - [ -n "$9" ] && dns2="$9" - ;; - [0-9]*) - mtu="$8" - if [ -n "${9}" -a -z "${10}" ]; then - macaddr="${9}" - elif [ -n "${9}" -a -n "${10}" -a -n "${11}" -a -n "${12}" -a -n "${13}" -a -n "${14}" ]; then - macaddr="${9}:${10}:${11}:${12}:${13}:${14}" - fi - ;; - *) - if [ -n "${9}" -a -z "${10}" ]; then - macaddr="${9}" - elif [ -n "${9}" -a -n "${10}" -a -n "${11}" -a -n "${12}" -a -n "${13}" -a -n "${14}" ]; then - macaddr="${9}:${10}:${11}:${12}:${13}:${14}" - fi - ;; - esac - return 0 -} - -route_to_var() { - local v="${1}": - local i - set -- - while [ -n "$v" ]; do - if [ "${v#\[*:*:*\]:}" != "$v" ]; then - # handle IPv6 address - i="${v%%\]:*}" - i="${i##\[}" - set -- "$@" "$i" - v=${v#\["$i"\]:} - else - set -- "$@" "${v%%:*}" - v=${v#*:} - fi - done - - unset route_mask route_gw route_dev - case $# in - 2) - [ -n "$1" ] && route_mask="$1" - [ -n "$2" ] && route_gw="$2" - return 0 - ;; - 3) - [ -n "$1" ] && route_mask="$1" - [ -n "$2" ] && route_gw="$2" - [ -n "$3" ] && route_dev="$3" - return 0 - ;; - *) return 1 ;; - esac -} - -parse_ifname_opts() { - local IFS=: - # shellcheck disable=SC2086 - set -- $1 - - case $# in - 7) - ifname_if=$1 - # udev requires MAC addresses to be lower case - ifname_mac=$(echo "$2:$3:$4:$5:$6:$7" | sed 'y/ABCDEF/abcdef/') - ;; - 21) - ifname_if=$1 - # udev requires MAC addresses to be lower case - ifname_mac=$(echo "$2:$3:$4:$5:$6:$7:$8:$9:${10}:${11}:${12}:${13}:${14}:${15}:${16}:${17}:${18}:${19}:${20}:${21}" | sed 'y/ABCDEF/abcdef/') - ;; - *) - die "Invalid arguments for ifname=" - ;; - esac - - case $ifname_if in - eth[0-9] | eth[0-9][0-9] | eth[0-9][0-9][0-9] | eth[0-9][0-9][0-9][0-9]) - warn "ifname=$ifname_if uses the kernel name space for interfaces" - warn "This can fail for multiple network interfaces and is discouraged!" - warn 'Please use a custom name like "netboot" or "bluesocket"' - warn "or use biosdevname and no ifname= at all." - ;; - esac - -} - -# some network driver need long time to initialize, wait before it's ready. -wait_for_if_link() { - local cnt=0 - local li - local timeout - timeout=$(getargs rd.net.timeout.iflink=) - timeout=${timeout:-60} - timeout=$((timeout * 10)) - - while [ $cnt -lt $timeout ]; do - li=$(ip link show dev "$@" 2> /dev/null) - [ -n "$li" ] && return 0 - sleep 0.1 - cnt=$((cnt + 1)) - done - return 1 -} - -wait_for_if_up() { - local cnt=0 - local li - local timeout - timeout=$(getargs rd.net.timeout.ifup=) - timeout=${timeout:-20} - timeout=$((timeout * 10)) - - while [ $cnt -lt $timeout ]; do - li=$(ip link show up dev "$@") - if [ -n "$li" ]; then - case "$li" in - *\<UP*) - return 0 - ;; - *\<*,UP\>*) - return 0 - ;; - *\<*,UP,*\>*) - return 0 - ;; - esac - fi - if strstr "$li" "LOWER_UP" \ - && strstr "$li" "state UNKNOWN" \ - && ! strstr "$li" "DORMANT"; then - return 0 - fi - sleep 0.1 - cnt=$((cnt + 1)) - done - return 1 -} - -wait_for_route_ok() { - local cnt=0 - local timeout - timeout=$(getargs rd.net.timeout.route=) - timeout=${timeout:-20} - timeout=$((timeout * 10)) - - while [ $cnt -lt $timeout ]; do - li=$(ip route show) - [ -n "$li" ] && [ -z "${li##*"$1"*}" ] && return 0 - sleep 0.1 - cnt=$((cnt + 1)) - done - return 1 -} - -wait_for_ipv6_dad_link() { - local cnt=0 - local timeout - timeout=$(getargs rd.net.timeout.ipv6dad=) - timeout=${timeout:-50} - timeout=$((timeout * 10)) - - while [ $cnt -lt $timeout ]; do - [ -n "$(ip -6 addr show dev "$@" scope link)" ] \ - && [ -z "$(ip -6 addr show dev "$@" scope link tentative)" ] \ - && return 0 - [ -n "$(ip -6 addr show dev "$@" scope link dadfailed)" ] \ - && return 1 - sleep 0.1 - cnt=$((cnt + 1)) - done - return 1 -} - -wait_for_ipv6_dad() { - local cnt=0 - local timeout - timeout=$(getargs rd.net.timeout.ipv6dad=) - timeout=${timeout:-50} - timeout=$((timeout * 10)) - - while [ $cnt -lt $timeout ]; do - [ -n "$(ip -6 addr show dev "$@")" ] \ - && [ -z "$(ip -6 addr show dev "$@" tentative)" ] \ - && return 0 - [ -n "$(ip -6 addr show dev "$@" dadfailed)" ] \ - && return 1 - sleep 0.1 - cnt=$((cnt + 1)) - done - return 1 -} - -wait_for_ipv6_auto() { - local cnt=0 - local timeout - timeout=$(getargs rd.net.timeout.ipv6auto=) - timeout=${timeout:-40} - timeout=$((timeout * 10)) - - while [ $cnt -lt $timeout ]; do - [ -z "$(ip -6 addr show dev "$@" tentative)" ] \ - && { ip -6 route list proto ra dev "$@" | grep -q ^default; } \ - && return 0 - sleep 0.1 - cnt=$((cnt + 1)) - done - return 1 -} - -linkup() { - wait_for_if_link "$@" 2> /dev/null && ip link set "$@" up 2> /dev/null && wait_for_if_up "$@" 2> /dev/null -} - -type hostname > /dev/null 2>&1 \ - || hostname() { - cat /proc/sys/kernel/hostname - } - -iface_has_carrier() { - local cnt=0 - local iface="$1" flags="" - local timeout - local iface_sys_path - [ -n "$iface" ] || return 2 - iface_sys_path="/sys/class/net/$iface" - [ -d "$iface_sys_path" ] || return 2 - timeout=$(getargs rd.net.timeout.carrier=) - timeout=${timeout:-10} - timeout=$((timeout * 10)) - - linkup "$1" - - li=$(ip link show up dev "$iface") - strstr "$li" "NO-CARRIER" && _no_carrier_flag=1 - - while [ $cnt -lt $timeout ]; do - if [ -n "$_no_carrier_flag" ]; then - li=$(ip link show up dev "$iface") - # NO-CARRIER flag was cleared - strstr "$li" "NO-CARRIER" || return 0 - elif ! [ -e "$iface_sys_path/carrier" ]; then - # sysfs not available and "NO-CARRIER" not displayed - return 0 - fi - # double check the syscfs carrier flag - [ -e "$iface_sys_path/carrier" ] && [ "$(cat "$iface_sys_path"/carrier)" = 1 ] && return 0 - sleep 0.1 - cnt=$((cnt + 1)) - done - return 1 -} - -iface_has_link() { - iface_has_carrier "$@" -} - -iface_is_enslaved() { - local _li - _li=$(ip link show dev "$@") - strstr "$_li" " master " || return 1 - return 0 -} - -find_iface_with_link() { - local iface_path="" iface="" - for iface_path in /sys/class/net/*; do - iface=${iface_path##*/} - str_starts "$iface" "lo" && continue - if iface_has_link "$iface"; then - echo "$iface" - return 0 - fi - done - return 1 -} - -is_persistent_ethernet_name() { - local _netif="$1" - local _name_assign_type="0" - - [ -f "/sys/class/net/$_netif/name_assign_type" ] \ - && read -r _name_assign_type < "/sys/class/net/$_netif/name_assign_type" 2> /dev/null - - # NET_NAME_ENUM 1 - [ "$_name_assign_type" = "1" ] && return 1 - - # NET_NAME_PREDICTABLE 2 - [ "$_name_assign_type" = "2" ] && return 0 - - case "$_netif" in - # udev persistent interface names - eno[0-9] | eno[0-9][0-9] | eno[0-9][0-9][0-9]*) ;; - - ens[0-9] | ens[0-9][0-9] | ens[0-9][0-9][0-9]*) ;; - - enp[0-9]s[0-9]* | enp[0-9][0-9]s[0-9]* | enp[0-9][0-9][0-9]*s[0-9]*) ;; - - enP*p[0-9]s[0-9]* | enP*p[0-9][0-9]s[0-9]* | enP*p[0-9][0-9][0-9]*s[0-9]*) ;; - - # biosdevname - em[0-9] | em[0-9][0-9] | em[0-9][0-9][0-9]*) ;; - - p[0-9]p[0-9]* | p[0-9][0-9]p[0-9]* | p[0-9][0-9][0-9]*p[0-9]*) ;; - - *) - return 1 - ;; - esac - return 0 -} - -is_kernel_ethernet_name() { - local _netif="$1" - local _name_assign_type="1" - - if [ -e "/sys/class/net/$_netif/name_assign_type" ]; then - read -r _name_assign_type < "/sys/class/net/$_netif/name_assign_type" - - case "$_name_assign_type" in - 2 | 3 | 4) - # NET_NAME_PREDICTABLE 2 - # NET_NAME_USER 3 - # NET_NAME_RENAMED 4 - return 1 - ;; - 1 | *) - # NET_NAME_ENUM 1 - return 0 - ;; - esac - fi - - # fallback to error prone manual name check - case "$_netif" in - eth[0-9] | eth[0-9][0-9] | eth[0-9][0-9][0-9]*) - return 0 - ;; - *) - return 1 - ;; - esac - -} - -iface_get_subchannels() { - local _netif - local _subchannels - - _netif="$1" - - _subchannels=$({ - for i in /sys/class/net/"$_netif"/device/cdev[0-9]*; do - [ -e "$i" ] || continue - channel=$(readlink -f "$i") - printf -- "%s" "${channel##*/}," - done - }) - [ -n "$_subchannels" ] || return 1 - - printf -- "%s" "${_subchannels%,}" -} diff --git a/modules.d/40network/netroot.sh b/modules.d/40network/netroot.sh deleted file mode 100755 index 8f97774..0000000 --- a/modules.d/40network/netroot.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh - -PATH=/usr/sbin:/usr/bin:/sbin:/bin -command -v getarg > /dev/null || . /lib/dracut-lib.sh -command -v setup_net > /dev/null || . /lib/net-lib.sh - -# Huh? Empty $1? -[ -z "$1" ] && exit 1 - -# [ ! -z $2 ] means this is for manually bringing up network -# instead of real netroot; If It's called without $2, then there's -# no sense in doing something if no (net)root info is available -# or root is already there -[ -d "$NEWROOT"/proc ] && exit 0 - -if [ -z "$netroot" ]; then - netroot=$(getarg netroot=) -fi - -[ -z "$netroot" ] && exit 1 - -# Set or override primary interface -netif=$1 -[ -e "/tmp/net.bootdev" ] && read -r netif < /tmp/net.bootdev - -case "$netif" in - ??:??:??:??:??:??) # MAC address - for i in /sys/class/net/*/address; do - read -r mac < "$i" - if [ "$mac" = "$netif" ]; then - i=${i%/address} - netif=${i##*/} - break - fi - done ;; -esac - -# Figure out the handler for root=dhcp by recalling all netroot cmdline -# handlers when this is not called from manually network bringing up. -if [ -z "$2" ]; then - if getarg "root=dhcp" || getarg "netroot=dhcp" || getarg "root=dhcp6" || getarg "netroot=dhcp6"; then - # Load dhcp options - # shellcheck disable=SC1090 - [ -e /tmp/dhclient."$netif".dhcpopts ] && . /tmp/dhclient."$netif".dhcpopts - - # If we have a specific bootdev with no dhcpoptions or empty root-path, - # we die. Otherwise we just warn - if [ -z "$new_root_path" ]; then - [ -n "$BOOTDEV" ] && die "No dhcp root-path received for '$BOOTDEV'" - warn "No dhcp root-path received for '$netif' trying other interfaces if available" - exit 1 - fi - - rm -f -- "$hookdir"/initqueue/finished/dhcp.sh - - # Set netroot to new_root_path, so cmdline parsers don't call - netroot=$new_root_path - - # FIXME! - unset rootok - for f in "$hookdir"/cmdline/90*.sh; do - # shellcheck disable=SC1090 - [ -f "$f" ] && . "$f" - done - else - rootok="1" - fi - - # Check: do we really know how to handle (net)root? - if [ -z "$root" ]; then - root=$(getarg root=) - fi - [ -z "$root" ] && die "No or empty root= argument" - [ -z "$rootok" ] && die "Don't know how to handle 'root=$root'" - - handler=${netroot%%:*} - handler=${handler%%4} - handler=$(command -v "${handler}"root) - if [ -z "$netroot" ] || [ ! -e "$handler" ]; then - die "No handler for netroot type '$netroot'" - fi -fi - -# Source netroot hooks before we start the handler -source_hook netroot "$netif" - -# Run the handler; don't store the root, it may change from device to device -# XXX other variables to export? -[ -n "$handler" ] && "$handler" "$netif" "$netroot" "$NEWROOT" -save_netinfo "$netif" - -exit 0 |