1
0
mirror of https://github.com/CumulusNetworks/ifupdown2.git synced 2024-05-06 15:54:50 +00:00

Create a networking service script, so we can run it after switchd

Ticket: CM-8790
Reviewed By: wkok,roopa
Testing Done: built, installed, rebooted

jessie's networking starts as an init.d service.   Trying to force ordering
between init.d and systemd services when there are dependencies doesn't work
well (especially since the init.d/networking service is forced very early
because of the remote filesystem requirement in jesie).

Converting networking to a script run as a systemd service allows us to start
networking after switchd.  The new script is /sbin/start-networking.  I chose
to keep it in /sbin, rather than put it in /usr/cumulus/bin, because it's core
functionaity.

I am not removing /etc/init.d/networking, it just gets ignored unless somebody
types it manually.  If somebody does that, systemctl runs through the lsb
hooks.  The two lost abilities below are just ignored if passed.  I'm
also preventing creating the rc.d symlinks to the init.d/networking
script to reduce future confusion.

We lose some init.d "convenience" functionality because it's not available
through systemd.  What we lose are:
  reload-currently-up - can still be done with ifreload --currently-up
  force-reload - can still be done with ifreload -f -a
We keep start, stop, reload, restart
This commit is contained in:
Dave Olson
2016-01-20 11:57:41 -08:00
parent 9022763806
commit 07678ee4ce
4 changed files with 171 additions and 3 deletions

View File

@@ -1,2 +1,3 @@
sbin/ifupdown2 /usr/share/ifupdown2/
sbin/start-networking /sbin
debian/networking.default /etc/default/networking

16
debian/ifupdown2.networking.service vendored Normal file
View File

@@ -0,0 +1,16 @@
[Unit]
Description=Cumulus Linux networking initialization
After=switchd.service
[Service]
Type=oneshot
RemainAfterExit=yes
SyslogIdentifier=networking
TimeoutSec=60s
TimeoutStopSec=30s
ExecStart=/sbin/start-networking start
ExecStop=/sbin/start-networking stop
ExecReload=/sbin/start-networking reload
[Install]
WantedBy=basic.target network.target

13
debian/rules vendored
View File

@@ -5,12 +5,19 @@ export PYBUILD_NAME=ifupdown2
export PYBUILD_INSTALL_ARGS=--install-lib=/usr/share/ifupdown2 --install-scripts=/usr/share/ifupdown2
%:
dh $@ --with python2 --buildsystem=pybuild
dh $@ --with python2 --with systemd --buildsystem=pybuild
override_dh_installman:
./scripts/genmanpages.sh ./man.rst ./man
dh_installman
override_dh_installinit:
override_dh_systemd_start:
dh_systemd_start --name=networking --no-start
override_dh_systemd_enable:
dh_systemd_enable --name=networking
dh_installinit --name=networking --no-start
# init.d/networking is installed, but we don't want any symlinks; it's
# never used by anything, so avoid the confusion of the symlinks.
override_dh_installinit:
dh_installinit --name=networking --no-start -uremove networking.init

144
sbin/start-networking Executable file
View File

@@ -0,0 +1,144 @@
#!/bin/bash
# This overrides /etc/init.d/networking
# Only has start, stop, reload, because that's all systemd has.
# restart is implemented in systemd by stop then start.
PATH="/sbin:/bin"
RUN_DIR="/run/network"
IFSTATE="$RUN_DIR/ifstate"
NAME=networking
[ -x /sbin/ifup ] || exit 0
[ -x /sbin/ifdown ] || exit 0
CONFIGURE_INTERFACES=yes
EXTRA_ARGS=
[ -f /etc/default/networking ] && . /etc/default/networking
[ "$VERBOSE" = yes ] && EXTRA_ARGS=-v
[ "$DEBUG" = yes ] && EXTRA_ARGS="$EXTRA_ARGS -d"
[ "$SYSLOG" = yes ] && EXTRA_ARGS="$EXTRA_ARGS --syslog"
perf_options() {
# At bootup lets set perfmode
[ -f /var/tmp/network/ifstatenew ] && echo -n "" && return
echo -n "--perfmode"
}
process_exclusions() {
set -- $EXCLUDE_INTERFACES
exclusions=""
for d
do
exclusions="-X $d $exclusions"
done
echo $exclusions
}
check_network_file_systems() {
[ -e /proc/mounts ] || return 0
if [ -e /etc/iscsi/iscsi.initramfs ]; then
echo ${NAME}':' "not deconfiguring network interfaces: iSCSI root is mounted."
exit 0
fi
while read DEV MTPT FSTYPE REST; do
case $DEV in
/dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*)
echo ${NAME}':' "not deconfiguring network interfaces: network devices still mounted."
exit 0
;;
esac
case $FSTYPE in
nfs|nfs4|smbfs|ncp|ncpfs|cifs|coda|ocfs2|gfs|pvfs|pvfs2|fuse.httpfs|fuse.curlftpfs)
echo ${NAME}':' "not deconfiguring network interfaces: network file systems still mounted."
exit 0
;;
esac
done < /proc/mounts
}
check_network_swap() {
[ -e /proc/swaps ] || return 0
while read DEV MTPT FSTYPE REST; do
case $DEV in
/dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*)
echo ${NAME}':' "not deconfiguring network interfaces: network swap still mounted."
exit 0
;;
esac
done < /proc/swaps
}
ifup_hotplug () {
if [ -d /sys/class/net ]
then
ifaces=$(for iface in $(ifquery --list --allow=hotplug 2>/dev/null)
do
link=${iface##:*}
link=${link##.*}
if [ -e "/sys/class/net/$link" ] && [ "$(cat /sys/class/net/$link/operstate)" = up ]
then
echo "$iface"
fi
done)
if [ -n "$ifaces" ]
then
ifup $ifaces "$@" || true
fi
fi
}
ifupdown_init() {
[ ! -e /run/network ] && mkdir -p /run/network &>/dev/null
[ ! -e /etc/network/run ] && \
ln -sf /run/network /etc/network/run &>/dev/null
}
case "$1" in
start)
ifupdown_init
if [ "$CONFIGURE_INTERFACES" = no ]
then
echo ${NAME}':' "Not configuring network interfaces, see /etc/default/networking"
exit 0
fi
set -f
exclusions=$(process_exclusions)
perfoptions=$(perf_options)
echo ${NAME}':' "Configuring network interfaces"
ifup -a $EXTRA_ARGS $exclusions $perfoptions
;;
stop)
ifupdown_init
check_network_file_systems
check_network_swap
exclusions=$(process_exclusions)
echo ${NAME}':' "Deconfiguring network interfaces"
ifdown -a $EXTRA_ARGS
;;
reload)
ifupdown_init
echo ${NAME}':' "Reloading network interfaces configuration"
ifreload -a $EXTRA_ARGS
;;
*)
echo ${NAME}':' "Usage: $0 {start|stop|reload}"
exit 1
;;
esac
exit 0