summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2021-08-11 15:58:09 +0200
committerSimon Rettberg2021-08-11 15:58:09 +0200
commit6995afb6f1b01938e4a3ca0daf375dfe276181d5 (patch)
tree3b8883351554bc4f7f949495c8164a99d0403be5
parent[redsocks] Upper- and lowercase proxy env (diff)
downloadmltk-6995afb6f1b01938e4a3ca0daf375dfe276181d5.tar.gz
mltk-6995afb6f1b01938e4a3ca0daf375dfe276181d5.tar.xz
mltk-6995afb6f1b01938e4a3ca0daf375dfe276181d5.zip
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.
-rwxr-xr-xcore/modules/dhcpc-busybox/data/opt/openslx/scripts/udhcpc-openslx37
-rw-r--r--core/modules/network-online-slx-targets/data/etc/systemd/system/network-dns.target2
-rw-r--r--core/modules/network-online-slx-targets/data/etc/systemd/system/network-gateway.target2
-rw-r--r--core/modules/network-online-slx-targets/data/etc/systemd/system/network-online.target.d/00-slx-targets.conf4
-rw-r--r--core/modules/slx-network-configs-targets/data/etc/sysctl.d/90-openslx.conf3
l---------core/modules/slx-network-configs-targets/data/etc/systemd/system/network-online.target.wants/slx-wait-online.service1
l---------core/modules/slx-network-configs-targets/data/etc/systemd/system/network.target.wants/slx-wait-primary-dhcp.service1
-rw-r--r--core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-online.service7
-rw-r--r--core/modules/slx-network-configs-targets/data/etc/systemd/system/slx-wait-primary-dhcp.service7
-rwxr-xr-xcore/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_online21
-rwxr-xr-xcore/modules/slx-network-configs-targets/data/opt/openslx/scripts/systemd-wait_primary_dhcp18
-rw-r--r--core/modules/slx-network-configs-targets/module.build (renamed from core/modules/network-online-slx-targets/module.build)0
-rw-r--r--core/modules/slx-network-configs-targets/module.conf (renamed from core/modules/network-online-slx-targets/module.conf)0
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/early-network-triggers.service13
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/network-dns.target4
-rw-r--r--core/rootfs/rootfs-stage32/data/etc/systemd/system/network-gateway.target4
l---------core/rootfs/rootfs-stage32/data/etc/systemd/system/sysinit.target.wants/early-network-triggers.service1
-rwxr-xr-xcore/rootfs/rootfs-stage32/data/opt/openslx/scripts/systemd-early_network_triggers33
l---------core/targets/bwlp/slx-network-configs-targets1
l---------core/targets/stage4/network-online-slx-targets1
20 files changed, 68 insertions, 92 deletions
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/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/network-online-slx-targets/module.build b/core/modules/slx-network-configs-targets/module.build
index 241bcd5e..241bcd5e 100644
--- a/core/modules/network-online-slx-targets/module.build
+++ b/core/modules/slx-network-configs-targets/module.build
diff --git a/core/modules/network-online-slx-targets/module.conf b/core/modules/slx-network-configs-targets/module.conf
index c01ade29..c01ade29 100644
--- a/core/modules/network-online-slx-targets/module.conf
+++ b/core/modules/slx-network-configs-targets/module.conf
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