From 6995afb6f1b01938e4a3ca0daf375dfe276181d5 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 11 Aug 2021 15:58:09 +0200 Subject: Implement blocking network.target and network-online.target Add two services that will delay reaching the according targets, until conditions we consider reasonable are reached. For network.target that is finishing DHCP for the primary interface, for network-online.target we want to see a default gateway or a proxy server configured. Both have a timeout of about 10 seconds for now; this might be increased later on, if necessary. --- .../data/opt/openslx/scripts/udhcpc-openslx | 37 ++++++---------------- .../data/etc/systemd/system/network-dns.target | 2 -- .../data/etc/systemd/system/network-gateway.target | 2 -- .../network-online.target.d/00-slx-targets.conf | 4 --- .../network-online-slx-targets/module.build | 12 ------- .../modules/network-online-slx-targets/module.conf | 1 - .../data/etc/sysctl.d/90-openslx.conf | 3 ++ .../slx-wait-online.service | 1 + .../slx-wait-primary-dhcp.service | 1 + .../etc/systemd/system/slx-wait-online.service | 7 ++++ .../systemd/system/slx-wait-primary-dhcp.service | 7 ++++ .../data/opt/openslx/scripts/systemd-wait_online | 21 ++++++++++++ .../opt/openslx/scripts/systemd-wait_primary_dhcp | 18 +++++++++++ .../slx-network-configs-targets/module.build | 12 +++++++ .../slx-network-configs-targets/module.conf | 1 + .../systemd/system/early-network-triggers.service | 13 -------- .../data/etc/systemd/system/network-dns.target | 4 --- .../data/etc/systemd/system/network-gateway.target | 4 --- .../early-network-triggers.service | 1 - .../openslx/scripts/systemd-early_network_triggers | 33 ------------------- core/targets/bwlp/slx-network-configs-targets | 1 + core/targets/stage4/network-online-slx-targets | 1 - 22 files changed, 81 insertions(+), 105 deletions(-) delete mode 100644 core/modules/network-online-slx-targets/data/etc/systemd/system/network-dns.target delete mode 100644 core/modules/network-online-slx-targets/data/etc/systemd/system/network-gateway.target delete mode 100644 core/modules/network-online-slx-targets/data/etc/systemd/system/network-online.target.d/00-slx-targets.conf delete mode 100644 core/modules/network-online-slx-targets/module.build delete mode 100644 core/modules/network-online-slx-targets/module.conf create mode 100644 core/modules/slx-network-configs-targets/data/etc/sysctl.d/90-openslx.conf create mode 120000 core/modules/slx-network-configs-targets/data/etc/systemd/system/network-online.target.wants/slx-wait-online.service create mode 120000 core/modules/slx-network-configs-targets/data/etc/systemd/system/network.target.wants/slx-wait-primary-dhcp.service create mode 100644 core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-online.service create mode 100644 core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-primary-dhcp.service create mode 100755 core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_online create mode 100755 core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_primary_dhcp create mode 100644 core/modules/slx-network-configs-targets/module.build create mode 100644 core/modules/slx-network-configs-targets/module.conf delete mode 100644 core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service delete mode 100644 core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target delete mode 100644 core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target delete mode 120000 core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service delete mode 100755 core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers create mode 120000 core/targets/bwlp/slx-network-configs-targets delete mode 120000 core/targets/stage4/network-online-slx-targets diff --git a/core/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx b/core/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx index 05cded10..3e30da55 100755 --- a/core/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx +++ b/core/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx @@ -24,6 +24,7 @@ declare -rg primary="${SLX_BRIDGE:-br0}" declare -rg RESOLV_CONF="/opt/openslx/resolv.conf" declare -rg THIS_RESOLV="/run/network/${interface}.resolv" +declare -rg flag="/run/network/primary-dhcp.flag" shopt -s extglob @@ -94,15 +95,6 @@ check_env() { fi } -if [ ! -d /run ]; then - echo -n "Waiting for /run." >&2 - while [ ! -d /run ]; do - echo -n "." >&2 - usleep 500000 - done - echo "" >&2 -fi - mkdir -p "/run/network" case "$1" in @@ -190,34 +182,31 @@ case "$1" in fi # Only if network is not ready yet - if ! [ -e "/run/network/network-ready" ] || ! [ -e "/etc/hostname" ] || grep -q '^noname-' "/etc/hostname"; then + if ! [ -e "$flag" ]; then # Update hostname if [ -z "$dns_fqdn" ] && [ -n "$domain" ] && [ -n "$hostname" ]; then # fallback to what the dhcp told us dns_fqdn="${hostname}.${domain}" fi - if [ -z "$dns_fqdn" ]; then - # only if there is no /etc/hostname, we fall back (far back, that is) - [ ! -s "/etc/hostname" ] && dns_fqdn="slx-client" + if [ -z "$dns_fqdn" ] && ! [ -s "/etc/hostname" ]; then + dns_fqdn="noname-${ip//./-}" fi # finally, if dns_fqdn was set to anything, apply it if [ -n "$dns_fqdn" ]; then dns_short="${dns_fqdn%%.*}" echo "$dns_short" > "/proc/sys/kernel/hostname" echo "$dns_short" > "/etc/hostname" - if grep '^SLX_HOSTNAME=' /opt/openslx/config 2>/dev/null; then - sed -i "s/^\(SLX_HOSTNAME=\).*$/\1'$dns_short'/" /opt/openslx/config - else + if [ -z "$SLX_HOSTNAME" ]; then echo "# Config written by openslx-dhcp-script (1)" >> /opt/openslx/config echo "SLX_HOSTNAME='$dns_short'" >> /opt/openslx/config + elif [ "$SLX_HOSTNAME" != "$dns_short" ]; then + sed -i "s/^\(SLX_HOSTNAME=\).*$/\1'$dns_short'/" /opt/openslx/config fi fi # Update /etc/issue for proper spacing /opt/openslx/scripts/openslx-create_issue - touch "/run/network/network-ready" - # Mark network target as reached - systemctl start network.target & + touch "$flag" fi # end "network not ready yet" # Remove any stray addresses; we expect the primary interface to only have one # address supplied via DHCP. We do this after adding the new one, obviously. @@ -253,18 +242,10 @@ case "$1" in # Get rid of orphaned lines in /etc/hosts sed -i -r '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s*$/d' /etc/hosts - # "dns ready" target - if [ -n "$dns" ] && [ ! -e "/run/network/dns-ready" ]; then - touch "/run/network/dns-ready" + if [ -n "$dns" ] && [ -z "$SLX_DNS" ]; then # Write to openslx-config echo "# Config written by openslx-dhcp-script (2)" >> /opt/openslx/config echo "SLX_DNS='$dns'" >> /opt/openslx/config - systemctl start network-dns.target & - fi - # "default route exists" target - if [ -n "$router" ] && [ ! -e "/run/network/gateway-ready" ]; then - touch "/run/network/gateway-ready" - systemctl start network-gateway.target & fi ;; diff --git a/core/modules/network-online-slx-targets/data/etc/systemd/system/network-dns.target b/core/modules/network-online-slx-targets/data/etc/systemd/system/network-dns.target deleted file mode 100644 index 8bc541ab..00000000 --- a/core/modules/network-online-slx-targets/data/etc/systemd/system/network-dns.target +++ /dev/null @@ -1,2 +0,0 @@ -[Unit] -Description=DNS Server available diff --git a/core/modules/network-online-slx-targets/data/etc/systemd/system/network-gateway.target b/core/modules/network-online-slx-targets/data/etc/systemd/system/network-gateway.target deleted file mode 100644 index 11139162..00000000 --- a/core/modules/network-online-slx-targets/data/etc/systemd/system/network-gateway.target +++ /dev/null @@ -1,2 +0,0 @@ -[Unit] -Description=Default route configured diff --git a/core/modules/network-online-slx-targets/data/etc/systemd/system/network-online.target.d/00-slx-targets.conf b/core/modules/network-online-slx-targets/data/etc/systemd/system/network-online.target.d/00-slx-targets.conf deleted file mode 100644 index 81208043..00000000 --- a/core/modules/network-online-slx-targets/data/etc/systemd/system/network-online.target.d/00-slx-targets.conf +++ /dev/null @@ -1,4 +0,0 @@ -[Unit] -Wants=network-gateway.target network-dns.target network.target -Before=network-gateway.target network-dns.target -After=network.target diff --git a/core/modules/network-online-slx-targets/module.build b/core/modules/network-online-slx-targets/module.build deleted file mode 100644 index 241bcd5e..00000000 --- a/core/modules/network-online-slx-targets/module.build +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -fetch_source() { - : -} - -build() { - pinfo "Static module, nothing to build." -} - -post_copy() { - : -} diff --git a/core/modules/network-online-slx-targets/module.conf b/core/modules/network-online-slx-targets/module.conf deleted file mode 100644 index c01ade29..00000000 --- a/core/modules/network-online-slx-targets/module.conf +++ /dev/null @@ -1 +0,0 @@ -# Nothing diff --git a/core/modules/slx-network-configs-targets/data/etc/sysctl.d/90-openslx.conf b/core/modules/slx-network-configs-targets/data/etc/sysctl.d/90-openslx.conf new file mode 100644 index 00000000..04f988df --- /dev/null +++ b/core/modules/slx-network-configs-targets/data/etc/sysctl.d/90-openslx.conf @@ -0,0 +1,3 @@ +# Make sure ARP replies only go out on the matching interface +net.ipv4.conf.all.arp_filter=1 +net.ipv4.conf.default.arp_filter=1 diff --git a/core/modules/slx-network-configs-targets/data/etc/systemd/system/network-online.target.wants/slx-wait-online.service b/core/modules/slx-network-configs-targets/data/etc/systemd/system/network-online.target.wants/slx-wait-online.service new file mode 120000 index 00000000..8e346eac --- /dev/null +++ b/core/modules/slx-network-configs-targets/data/etc/systemd/system/network-online.target.wants/slx-wait-online.service @@ -0,0 +1 @@ +../slx-wait-online.service \ No newline at end of file diff --git a/core/modules/slx-network-configs-targets/data/etc/systemd/system/network.target.wants/slx-wait-primary-dhcp.service b/core/modules/slx-network-configs-targets/data/etc/systemd/system/network.target.wants/slx-wait-primary-dhcp.service new file mode 120000 index 00000000..e7f32c14 --- /dev/null +++ b/core/modules/slx-network-configs-targets/data/etc/systemd/system/network.target.wants/slx-wait-primary-dhcp.service @@ -0,0 +1 @@ +../slx-wait-primary-dhcp.service \ No newline at end of file diff --git a/core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-online.service b/core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-online.service new file mode 100644 index 00000000..7765ebdd --- /dev/null +++ b/core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-online.service @@ -0,0 +1,7 @@ +[Unit] +Description=Wait until we are online, ie. a gateway or proxy is configured +Before=network-online.target + +[Service] +Type=oneshot +ExecStart=/opt/openslx/scripts/systemd-wait_online diff --git a/core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-primary-dhcp.service b/core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-primary-dhcp.service new file mode 100644 index 00000000..68dc13f7 --- /dev/null +++ b/core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-primary-dhcp.service @@ -0,0 +1,7 @@ +[Unit] +Description=Wait until DHCP for the primary NIC has finished +Before=network.target + +[Service] +Type=oneshot +ExecStart=/opt/openslx/scripts/systemd-wait_primary_dhcp diff --git a/core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_online b/core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_online new file mode 100755 index 00000000..aaee9c32 --- /dev/null +++ b/core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_online @@ -0,0 +1,21 @@ +#!/bin/ash + +# Wait until we have a nameserver in resolv.conf +# and we have a gateway configured + +w=0 +while ! grep -q ^nameserver /etc/resolv.conf && [ "$w" -lt 10 ]; do + let w++ + sleep 1 +done + +# We don't consider a missing nameserver fatal, but a missing gateway, if no proxy is set +. /etc/profile +while [ -z "$http_proxy" ] && [ -z "$ALL_PROXY" ] && ! ip route show | grep -q ^default; do + [ "$w" -gt 12 ] && exit 1 # Give up - not online + let w++ + sleep 1 + . /etc/profile +done + +exit 0 diff --git a/core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_primary_dhcp b/core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_primary_dhcp new file mode 100755 index 00000000..3e452549 --- /dev/null +++ b/core/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_primary_dhcp @@ -0,0 +1,18 @@ +#!/bin/ash + +flag="/run/network/primary-dhcp.flag" +readonly flag +w=0 + +# Wait a maximum of 10 seconds for the flag file +while ! [ -e "$flag" ] && [ "$w" -lt 10 ]; do + let w++ + sleep 1 +done + +# Then touch it anyways, this will prevent the DHCP +# trigger script from changing the hostname later on +mkdir -p /run/network +touch "$flag" + +exit 0 diff --git a/core/modules/slx-network-configs-targets/module.build b/core/modules/slx-network-configs-targets/module.build new file mode 100644 index 00000000..241bcd5e --- /dev/null +++ b/core/modules/slx-network-configs-targets/module.build @@ -0,0 +1,12 @@ +#!/bin/bash +fetch_source() { + : +} + +build() { + pinfo "Static module, nothing to build." +} + +post_copy() { + : +} diff --git a/core/modules/slx-network-configs-targets/module.conf b/core/modules/slx-network-configs-targets/module.conf new file mode 100644 index 00000000..c01ade29 --- /dev/null +++ b/core/modules/slx-network-configs-targets/module.conf @@ -0,0 +1 @@ +# Nothing diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service deleted file mode 100644 index 2c5d7769..00000000 --- a/core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service +++ /dev/null @@ -1,13 +0,0 @@ -# This will trigger network.target etc. at an early point, -# if network setup happened in stage31 (dhcp...) -[Unit] -Description=Trigger network targets early -DefaultDependencies=no -Wants=systemd-tmpfiles-setup.service -Before=sysinit.target -After=systemd-tmpfiles-setup.service - -[Service] -Type=oneshot -ExecStart=/opt/openslx/scripts/systemd-early_network_triggers -RemainAfterExit=yes diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target b/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target deleted file mode 100644 index bc12cd1b..00000000 --- a/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target +++ /dev/null @@ -1,4 +0,0 @@ -[Unit] -Description=DNS Server available -ConditionPathExists=/run/network/dns-ready - diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target b/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target deleted file mode 100644 index 770eb697..00000000 --- a/core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target +++ /dev/null @@ -1,4 +0,0 @@ -[Unit] -Description=Default route configured -ConditionPathExists=/run/network/gateway-ready - diff --git a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service b/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service deleted file mode 120000 index 8aec0a6d..00000000 --- a/core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service +++ /dev/null @@ -1 +0,0 @@ -../early-network-triggers.service \ No newline at end of file diff --git a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers b/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers deleted file mode 100755 index 64ea853e..00000000 --- a/core/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/ash - -# This script will trigger several network targets if -# applicable at an early point. -# This happens if dhcp/network setup was successful in stage31 - -# Main interface -BRIDGE="br0" - -if [ ! -e "/sys/class/net/${BRIDGE}/operstate" -o "x$(cat "/sys/class/net/${BRIDGE}/operstate")" == "xup" ] && [ -e "/opt/openslx/uniontmp/etc/hostname" -o -e "/etc/resolv.conf" ]; then - echo "Triggering network.target" - touch "/run/network/network-ready" - systemctl start network.target & -fi - -if [ -s "/etc/resolv.conf" ] && grep -q "^nameserver" "/etc/resolv.conf"; then - echo "Triggering network-dns.target" - touch "/run/network/dns-ready" - systemctl start network-dns.target & -fi - -if route -n | grep -q -E '^0\.0\.0\.0.*U.*G'; then - echo "Triggering network-gateway.target" - touch "/run/network/gateway-ready" - systemctl start network-gateway.target & -fi - -# In case we have multiple NICs per subnet, don't send arp -# replies on all NICs -echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter - -exit 0 - diff --git a/core/targets/bwlp/slx-network-configs-targets b/core/targets/bwlp/slx-network-configs-targets new file mode 120000 index 00000000..9aa45e71 --- /dev/null +++ b/core/targets/bwlp/slx-network-configs-targets @@ -0,0 +1 @@ +../../modules/slx-network-configs-targets \ No newline at end of file diff --git a/core/targets/stage4/network-online-slx-targets b/core/targets/stage4/network-online-slx-targets deleted file mode 120000 index b022ecc2..00000000 --- a/core/targets/stage4/network-online-slx-targets +++ /dev/null @@ -1 +0,0 @@ -../../modules/network-online-slx-targets \ No newline at end of file -- cgit v1.2.3-55-g7522