summaryrefslogtreecommitdiffstats
path: root/modules.d/35connman/netroot.sh
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/35connman/netroot.sh')
-rwxr-xr-xmodules.d/35connman/netroot.sh92
1 files changed, 92 insertions, 0 deletions
diff --git a/modules.d/35connman/netroot.sh b/modules.d/35connman/netroot.sh
new file mode 100755
index 0000000..8f97774
--- /dev/null
+++ b/modules.d/35connman/netroot.sh
@@ -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
+ 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