Am 27.02.2011 22:36, schrieb Michael Biebl:

> My sugggestion would be something like this:
> 
> in net.agent:
> 
> if [ -d /sys/fs/cgoup/systemd ] ; then
>   systemctl start ifup@$INTERFACE.service
> else
>   exec ifup --allow=hotplug $INTERFACE
> fi
> 
> and provide a instanced ifup@.serivce file, which has the necessary 
> dependencies.

Attached is a very simple implementation for this idea.
Please test and report back if this fixes your problem:
1) Copy net.agent to /lib/udev . It will overwrite your existing net.agent file,
so I'd suggest you make a copy first.
2) Copy ifup@.service to /etc/systemd/system/
3) Reboot and test if interface was brought up correctly. systemctl | grep ifup
should show something like "ifup@eth0.service"

Cheers,
Michael

-- 
Why is it that all of the instruments seeking intelligent life in the
universe are pointed away from Earth?
[Unit]
Description=Start ifup for %I
After=local-fs.target

[Service]
ExecStart=/sbin/ifup --allow=hotplug %I
ExecStop=/sbin/ifdown %I
RemainAfterExit=true

#!/bin/sh -e
#
# run /sbin/{ifup,ifdown} with the --allow=hotplug option.
#

. /lib/udev/hotplug.functions

if [ -z "$INTERFACE" ]; then
    mesg "Bad net.agent invocation: \$INTERFACE is not set"
    exit 1
fi

check_program() {
    [ -x $1 ] && return 0

    mesg "ERROR: $1 not found. You need to install the ifupdown package."
    mesg "net.agent $ACTION event for $INTERFACE not handled."
    exit 1
}

wait_for_interface() {
    local interface=$1

    while :; do
        local state="$(cat /sys/class/net/$interface/operstate 2>/dev/null || 
true)"
        if [ "$state" != down ]; then
                return 0
        fi
        sleep 1
    done
}

net_ifup() {
    check_program /sbin/ifup

    if grep -q '^auto[[:space:]].*\<'"$INTERFACE"'\>' \
            /etc/network/interfaces; then
        # this $INTERFACE is marked as "auto"
        IFUPARG='\('$INTERFACE'\|-a\|--all\)'
    else
        IFUPARG=$INTERFACE
    fi

    if ps -C ifup ho args | grep -q "$IFUPARG"; then
        debug_mesg "Already ifup-ing interface $INTERFACE"
        exit 0
    fi

    wait_for_interface lo
    if [ -e /sys/fs/cgroup/systemd ]; then
      systemctl start ifup@${INTERFACE}.service
    else
      exec ifup --allow=hotplug $INTERFACE
    fi

}

net_ifdown() {
    check_program /sbin/ifdown

    if ps -C ifdown ho args | grep -q $INTERFACE; then
        debug_mesg "Already ifdown-ing interface $INTERFACE"
        exit 0
    fi

    exec ifdown --allow=hotplug $INTERFACE
}

do_everything() {

case "$ACTION" in
    add)
    # these interfaces generate hotplug events *after* they are brought up
    case $INTERFACE in
        ppp*|ippp*|isdn*|plip*|lo|irda*|ipsec*)
        exit 0 ;;
    esac

    net_ifup
    ;;

    remove)
    # the pppd persist option may have been used, so it should not be killed
    case $INTERFACE in
        ppp*)
        exit 0 ;;
    esac

    net_ifdown
    ;;

    *)
    debug_mesg "NET $ACTION event not supported"
    exit 1
    ;;
esac

}

# When udev_log="debug" stdout and stderr are pipes connected to udevd.
# They need to be closed or udevd will wait for this process which will
# deadlock with udevsettle until the timeout.
do_everything > /dev/null 2> /dev/null &

exit 0

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to