#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=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 if [ -z "$2" ]; then [ -d $NEWROOT/proc ] && exit 0 [ -z "$netroot" ] && exit 1 fi # Let's see if we have to wait for other interfaces # Note: exit works just fine, since the last interface to be # online'd should see all files all_ifaces_up || exit 1 # Set or override primary interface netif=$1 [ -e "/tmp/net.bootdev" ] && read netif < /tmp/net.bootdev if [ -e /tmp/net.$netif.manualup ]; then rm -f /tmp/net.$netif.manualup fi # 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 [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; then # Unset root so we can check later unset root # Load dhcp options [ -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 '$BOOTDEV' trying other interfaces if available" exit 1 fi # Set netroot to new_root_path, so cmdline parsers don't call netroot=$new_root_path # FIXME! for f in $hookdir/cmdline/90*.sh; do [ -f "$f" ] && . "$f"; done else rootok="1" fi # Check: do we really know how to handle (net)root? [ -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 # We're here, so we can assume that upping interfaces is now ok setup_net $netif # exit in case manually bring up network [ -n "$2" ] && exit 0 # Source netroot hooks before we start the handler source_hook netroot # Run the handler; don't store the root, it may change from device to device # XXX other variables to export? if $handler $netif $netroot $NEWROOT; then # Network rootfs mount successful for iface in $IFACES ; do [ -f /tmp/dhclient.$iface.lease ] && cp /tmp/dhclient.$iface.lease /tmp/net.$iface.lease [ -f /tmp/dhclient.$iface.dhcpopts ] && cp /tmp/dhclient.$iface.dhcpopts /tmp/net.$iface.dhcpopts done # Save used netif for later use [ ! -f /tmp/net.ifaces ] && echo $netif > /tmp/net.ifaces else warn "Mounting root via '$netif' failed" # If we're trying with multiple interfaces, put that one down. [ -z "$BOOTDEV" ] && ifdown $netif fi exit 0