mirror of
https://git.proxmox.com/git/systemd
synced 2026-01-07 21:11:18 +00:00
This ensures that ifdown is run when the device is removed and the service is stopped. Closes: #660861, #703033 We eventually should rework that and instead of calling systemctl in net.agent, start the service directly from the udev rule via ENV{SYSTEMD_WANTS}.
112 lines
2.3 KiB
Bash
112 lines
2.3 KiB
Bash
#!/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 [ -d /run/systemd/system ]; then
|
|
exec systemctl start ifup@${INTERFACE}.service
|
|
else
|
|
exec ifup --allow=hotplug $INTERFACE
|
|
fi
|
|
}
|
|
|
|
net_ifdown() {
|
|
check_program /sbin/ifdown
|
|
|
|
# systemd will automatically ifdown the interface on device
|
|
# removal by binding the instanced service to the network device
|
|
if [ -d /run/systemd/system ]; then
|
|
exit 0
|
|
fi
|
|
|
|
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
|
|
|