]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
add initqueue --env and "online" hook
authorWill Woods <wwoods@redhat.com>
Tue, 6 Mar 2012 23:25:25 +0000 (18:25 -0500)
committerHarald Hoyer <harald@redhat.com>
Thu, 8 Mar 2012 10:05:29 +0000 (11:05 +0100)
The "online" hook runs whenever a network interface comes online (that
is, once it's actually up and configured).

The initqueue --env argument is used to set "$netif" to the name of the
newly-online network interface.

dracut-functions.sh
modules.d/40network/net-genrules.sh
modules.d/99base/initqueue.sh

index 05c1d3a58c4e6d7a4f0162325ffe045e62a697eb..f4ccf53a8b6b103a6038b020e9aaa738e6577573 100755 (executable)
@@ -35,7 +35,7 @@ fi
 # export standard hookdirs
 [[ $hookdirs ]] || {
     hookdirs="cmdline pre-udev pre-trigger netroot "
-    hookdirs+="initqueue initqueue/settled initqueue/finished initqueue/timeout "
+    hookdirs+="initqueue initqueue/settled initqueue/online initqueue/finished initqueue/timeout "
     hookdirs+="pre-mount pre-pivot mount "
     hookdirs+="emergency shutdown-emergency shutdown cleanup "
     export hookdirs
index 6c46d9afb55298549281ebdf8e40f8e8945dc949..84fd3ac23cdc1c41d1355a476a93358a2df6b823 100755 (executable)
@@ -31,33 +31,27 @@ fix_bootif() {
         IFACES=${bondslaves%% *}
     fi
 
+    ifup='/sbin/ifup $env{INTERFACE}'
+    [ -z "$netroot" ] && ifup="$ifup -m"
+
     # BOOTIF says everything, use only that one
     BOOTIF=$(getarg 'BOOTIF=')
     if [ -n "$BOOTIF" ] ; then
         BOOTIF=$(fix_bootif "$BOOTIF")
-        if [ -n "$netroot" ]; then
-            printf 'ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="%s", OPTIONS+="event_timeout=360", RUN+="/sbin/initqueue --onetime /sbin/ifup $env{INTERFACE}"\n' "$BOOTIF"
-        else
-            printf 'ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="%s", OPTIONS+="event_timeout=360", RUN+="/sbin/initqueue --onetime /sbin/ifup $env{INTERFACE} -m"\n' "$BOOTIF"
-        fi
+        printf 'ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="%s", RUN+="%s"\n' "$BOOTIF" "/sbin/initqueue --onetime $ifup"
 
     # If we have to handle multiple interfaces, handle only them.
     elif [ -n "$IFACES" ] ; then
         for iface in $IFACES ; do
-            if [ -n "$netroot" ]; then
-                printf 'SUBSYSTEM=="net", ENV{INTERFACE}=="%s", OPTIONS+="event_timeout=360", RUN+="/sbin/initqueue --onetime /sbin/ifup $env{INTERFACE}"\n' "$iface"
-            else
-                printf 'SUBSYSTEM=="net", ENV{INTERFACE}=="%s", OPTIONS+="event_timeout=360", RUN+="/sbin/initqueue --onetime /sbin/ifup $env{INTERFACE} -m"\n' "$iface"
-            fi
+            printf 'SUBSYSTEM=="net", ENV{INTERFACE}=="%s", RUN+="%s"\n' "$iface" "/sbin/initqueue --onetime $ifup"
         done
 
     # Default: We don't know the interface to use, handle all
     else
-        if [ -n "$netroot" ]; then
-            printf 'SUBSYSTEM=="net", OPTIONS+="event_timeout=360", RUN+="/sbin/initqueue --onetime /sbin/ifup $env{INTERFACE}"\n'
-        else
-            printf 'SUBSYSTEM=="net", OPTIONS+="event_timeout=360", RUN+="/sbin/initqueue --onetime /sbin/ifup $env{INTERFACE} -m"\n'
-        fi
+        printf 'SUBSYSTEM=="net", RUN+="%s"\n' "/sbin/initqueue --onetime $ifup"
     fi
 
+    # Run the "online" hook
+    printf 'SUBSYSTEM=="net", ACTION=="online", RUN+="/sbin/initqueue --onetime --env netif=$env{INTERFACE} source_hook initqueue/online"\n'
+
 } > /etc/udev/rules.d/60-net.rules
index 2c06a0b26b24465a21e0071b5f989305c0b8dacf..3387e8888595fb0f95146e75c3a7debbadc06ef8 100755 (executable)
@@ -25,6 +25,8 @@ while [ $# -gt 0 ]; do
             unique="yes";;
         --name)
             name="$2";shift;;
+        --env)
+            env="$2"; shift;;
         *)
             break;;
     esac
@@ -43,14 +45,11 @@ shift
 
 [ -x "$exe" ] || exe=$(command -v $exe)
 
-if [ -n "$onetime" ]; then
-    {
-        echo '[ -e "$job" ] && rm "$job"'
-        echo "$exe $@"
-    } > "/tmp/$$-${job}.sh"
-else
-    echo "$exe $@" > "/tmp/$$-${job}.sh"
-fi
+{
+    [ -n "$onetime" ] && echo '[ -e "$job" ] && rm "$job"'
+    [ -n "$env" ] && echo "$env"
+    echo "$exe $@"
+} > "/tmp/$$-${job}.sh"
 
 mv -f "/tmp/$$-${job}.sh" "$hookdir/initqueue${qname}/${job}.sh"
 [ -z "$qname" ] && >> $hookdir/initqueue/work