]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(connman): copy netroot.sh from the network module and install it
authorZoltán Böszörményi <zboszor@gmail.com>
Sat, 26 Mar 2022 11:36:05 +0000 (12:36 +0100)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Mon, 28 Mar 2022 08:01:46 +0000 (08:01 +0000)
As requested by johannbg.

Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com>
modules.d/35connman/module-setup.sh
modules.d/35connman/netroot.sh [new file with mode: 0755]

index cf8ca4c342745cc56021ea4ca31eb321cfcef438..6502d307ed5c6cc989fdd2e5e966a4551d7f3651 100755 (executable)
@@ -25,6 +25,7 @@ install() {
     # in an emergency shell.
     inst_multiple ip sed grep
 
+    inst_script "$moddir/netroot.sh" "/sbin/netroot"
     inst connmand
     inst connmanctl
     inst connmand-wait-online
diff --git a/modules.d/35connman/netroot.sh b/modules.d/35connman/netroot.sh
new file mode 100755 (executable)
index 0000000..7fc8397
--- /dev/null
@@ -0,0 +1,92 @@
+#!/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
+            mac=$(cat "$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