summaryrefslogtreecommitdiffstats
path: root/modules.d/35network-manager
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-03 13:54:25 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-03 13:54:25 +0000
commit9cb1c4df7b9ce1a9ad1312621b0f2b16a94fba3a (patch)
tree2efb72864cc69e174c9c5ee33efb88a5f1553b48 /modules.d/35network-manager
parentInitial commit. (diff)
downloaddracut-9cb1c4df7b9ce1a9ad1312621b0f2b16a94fba3a.tar.xz
dracut-9cb1c4df7b9ce1a9ad1312621b0f2b16a94fba3a.zip
Adding upstream version 060+5.upstream/060+5
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'modules.d/35network-manager')
-rw-r--r--modules.d/35network-manager/initrd-no-auto-default.conf5
-rwxr-xr-xmodules.d/35network-manager/module-setup.sh84
-rwxr-xr-xmodules.d/35network-manager/nm-config.sh35
-rw-r--r--modules.d/35network-manager/nm-initrd.service31
-rwxr-xr-xmodules.d/35network-manager/nm-lib.sh34
-rwxr-xr-xmodules.d/35network-manager/nm-run.sh68
-rw-r--r--modules.d/35network-manager/nm-wait-online-initrd.service16
7 files changed, 273 insertions, 0 deletions
diff --git a/modules.d/35network-manager/initrd-no-auto-default.conf b/modules.d/35network-manager/initrd-no-auto-default.conf
new file mode 100644
index 0000000..8a06e52
--- /dev/null
+++ b/modules.d/35network-manager/initrd-no-auto-default.conf
@@ -0,0 +1,5 @@
+[.config]
+enable=env:initrd
+
+[main]
+no-auto-default=*
diff --git a/modules.d/35network-manager/module-setup.sh b/modules.d/35network-manager/module-setup.sh
new file mode 100755
index 0000000..d9a244a
--- /dev/null
+++ b/modules.d/35network-manager/module-setup.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+
+# called by dracut
+check() {
+ require_binaries sed grep NetworkManager || return 1
+
+ # do not add this module by default
+ return 255
+}
+
+# called by dracut
+depends() {
+ echo dbus bash
+ return 0
+}
+
+# called by dracut
+installkernel() {
+ return 0
+}
+
+# called by dracut
+install() {
+ local _nm_version
+
+ _nm_version=${NM_VERSION:-$(NetworkManager --version)}
+
+ # We don't need `ip` but having it is *really* useful for people debugging
+ # in an emergency shell.
+ inst_multiple ip sed grep
+
+ inst NetworkManager
+ inst_multiple -o /usr/{lib,libexec}/nm-initrd-generator
+ inst_multiple -o /usr/{lib,libexec}/nm-daemon-helper
+ inst_multiple -o teamd dhclient
+ inst_hook cmdline 99 "$moddir/nm-config.sh"
+ if dracut_module_included "systemd"; then
+
+ inst "$dbussystem"/org.freedesktop.NetworkManager.conf
+ inst_multiple nmcli nm-online
+
+ # teaming support under systemd+dbus
+ inst_multiple -o \
+ "$dbussystem"/teamd.conf \
+ "$dbussystemconfdir"/teamd.conf
+
+ # Install a configuration snippet to prevent the automatic creation of
+ # "Wired connection #" DHCP connections for Ethernet interfaces
+ inst_simple "$moddir"/initrd-no-auto-default.conf /usr/lib/NetworkManager/conf.d/
+
+ inst_simple "$moddir"/nm-initrd.service "$systemdsystemunitdir"/nm-initrd.service
+ inst_simple "$moddir"/nm-wait-online-initrd.service "$systemdsystemunitdir"/nm-wait-online-initrd.service
+
+ # Adding default link
+ inst_multiple -o "${systemdnetwork}/99-default.link"
+ [[ $hostonly ]] && inst_multiple -H -o "${systemdnetworkconfdir}/*.link"
+
+ $SYSTEMCTL -q --root "$initdir" enable nm-initrd.service
+ fi
+
+ inst_hook initqueue/settled 99 "$moddir/nm-run.sh"
+
+ inst_rules 85-nm-unmanaged.rules
+ inst_libdir_dir "NetworkManager/$_nm_version"
+ inst_libdir_file "NetworkManager/$_nm_version/libnm-device-plugin-team.so"
+ inst_simple "$moddir/nm-lib.sh" "/lib/nm-lib.sh"
+
+ if [[ -x "$initdir/usr/sbin/dhclient" ]]; then
+ inst_multiple -o /usr/{lib,libexec}/nm-dhcp-helper
+ elif ! [[ -e "$initdir/etc/machine-id" ]]; then
+ # The internal DHCP client silently fails if we
+ # have no machine-id
+ systemd-machine-id-setup --root="$initdir"
+ fi
+
+ # We don't install the ifcfg files from the host automatically.
+ # But the user might choose to include them, so we pull in the machinery to read them.
+ inst_libdir_file "NetworkManager/$_nm_version/libnm-settings-plugin-ifcfg-rh.so"
+
+ _arch=${DRACUT_ARCH:-$(uname -m)}
+
+ inst_libdir_file {"tls/$_arch/",tls/,"$_arch/",}"libnss_dns.so.*" \
+ {"tls/$_arch/",tls/,"$_arch/",}"libnss_mdns4_minimal.so.*"
+}
diff --git a/modules.d/35network-manager/nm-config.sh b/modules.d/35network-manager/nm-config.sh
new file mode 100755
index 0000000..2b13d0a
--- /dev/null
+++ b/modules.d/35network-manager/nm-config.sh
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+type nm_generate_connections > /dev/null 2>&1 || . /lib/nm-lib.sh
+
+if [ -n "$netroot" ] || [ -e /tmp/net.ifaces ]; then
+ echo rd.neednet >> /etc/cmdline.d/35-neednet.conf
+fi
+
+if getargbool 0 rd.debug -d -y rdinitdebug -d -y rdnetdebug; then
+ # shellcheck disable=SC2174
+ mkdir -m 0755 -p /run/NetworkManager/conf.d
+ (
+ echo '[.config]'
+ echo 'enable=env:initrd'
+ echo
+ echo '[logging]'
+ echo 'level=TRACE'
+ ) > /run/NetworkManager/conf.d/initrd-logging.conf
+
+ if [ -n "$DRACUT_SYSTEMD" ]; then
+ # Enable tty output if a usable console is found
+ # See https://github.com/coreos/fedora-coreos-tracker/issues/943
+ # shellcheck disable=SC2217
+ if [ -w /dev/console ] && (echo < /dev/console) > /dev/null 2> /dev/null; then
+ mkdir -p /run/systemd/system/nm-initrd.service.d
+ cat << EOF > /run/systemd/system/nm-initrd.service.d/tty-output.conf
+[Service]
+StandardOutput=tty
+EOF
+ systemctl --no-block daemon-reload
+ fi
+ fi
+fi
+
+nm_generate_connections
diff --git a/modules.d/35network-manager/nm-initrd.service b/modules.d/35network-manager/nm-initrd.service
new file mode 100644
index 0000000..dbd8caa
--- /dev/null
+++ b/modules.d/35network-manager/nm-initrd.service
@@ -0,0 +1,31 @@
+[Unit]
+DefaultDependencies=no
+Wants=systemd-udev-trigger.service
+After=systemd-udev-trigger.service
+After=dracut-cmdline.service
+After=dbus.service
+Wants=network.target
+Before=network.target
+ConditionPathExists=/run/NetworkManager/initrd/neednet
+ConditionPathExistsGlob=|/usr/lib/NetworkManager/system-connections/*
+ConditionPathExistsGlob=|/run/NetworkManager/system-connections/*
+ConditionPathExistsGlob=|/etc/NetworkManager/system-connections/*
+ConditionPathExistsGlob=|/etc/sysconfig/network-scripts/ifcfg-*
+
+[Service]
+Type=dbus
+BusName=org.freedesktop.NetworkManager
+ExecReload=/usr/bin/busctl call org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Reload u 0
+ExecStart=/usr/sbin/NetworkManager --debug
+KillMode=process
+# The following gets changed to StandardOutput=tty by nm-config.sh
+# when debug is enabled and a usable console is found.
+StandardOutput=null
+Environment=NM_CONFIG_ENABLE_TAG=initrd
+Restart=on-failure
+ProtectSystem=true
+ProtectHome=read-only
+
+[Install]
+WantedBy=initrd.target
+Also=nm-wait-online-initrd.service
diff --git a/modules.d/35network-manager/nm-lib.sh b/modules.d/35network-manager/nm-lib.sh
new file mode 100755
index 0000000..32a288d
--- /dev/null
+++ b/modules.d/35network-manager/nm-lib.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+type getcmdline > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+nm_generate_connections() {
+ rm -f /run/NetworkManager/system-connections/*
+ if [ -x /usr/libexec/nm-initrd-generator ]; then
+ # shellcheck disable=SC2046
+ /usr/libexec/nm-initrd-generator -- $(getcmdline)
+ elif [ -x /usr/lib/nm-initrd-generator ]; then
+ # shellcheck disable=SC2046
+ /usr/lib/nm-initrd-generator -- $(getcmdline)
+ else
+ warn "nm-initrd-generator not found"
+ fi
+
+ if getargbool 0 rd.neednet; then
+ for i in /usr/lib/NetworkManager/system-connections/* \
+ /run/NetworkManager/system-connections/* \
+ /etc/NetworkManager/system-connections/* \
+ /etc/sysconfig/network-scripts/ifcfg-*; do
+ [ -f "$i" ] || continue
+ mkdir -p "$hookdir"/initqueue/finished
+ echo '[ -f /tmp/nm.done ]' > "$hookdir"/initqueue/finished/nm.sh
+ mkdir -p /run/NetworkManager/initrd
+ : > /run/NetworkManager/initrd/neednet # activate NM services
+ break
+ done
+ fi
+}
+
+nm_reload_connections() {
+ [ -n "$DRACUT_SYSTEMD" ] && systemctl is-active nm-initrd.service && nmcli connection reload
+}
diff --git a/modules.d/35network-manager/nm-run.sh b/modules.d/35network-manager/nm-run.sh
new file mode 100755
index 0000000..14b9cb1
--- /dev/null
+++ b/modules.d/35network-manager/nm-run.sh
@@ -0,0 +1,68 @@
+#!/bin/bash
+
+type source_hook > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+if [ -z "$DRACUT_SYSTEMD" ]; then
+ # Only start NM if networking is needed
+ if [ -e /run/NetworkManager/initrd/neednet ]; then
+ for i in /usr/lib/NetworkManager/system-connections/* \
+ /run/NetworkManager/system-connections/* \
+ /etc/NetworkManager/system-connections/* \
+ /etc/sysconfig/network-scripts/ifcfg-*; do
+ [ -f "$i" ] || continue
+ /usr/sbin/NetworkManager --configure-and-quit=initrd --no-daemon
+ break
+ done
+ fi
+fi
+
+if [ -s /run/NetworkManager/initrd/hostname ]; then
+ cat /run/NetworkManager/initrd/hostname > /proc/sys/kernel/hostname
+fi
+
+kf_get_string() {
+ # NetworkManager writes keyfiles (glib's GKeyFile API). Have a naive
+ # parser for it.
+ #
+ # But GKeyFile will backslash escape certain keys (\s, \t, \n) but also
+ # escape backslash. As an approximation, interpret the string with printf's
+ # '%b'.
+ #
+ # This is supposed to mimic g_key_file_get_string() (poorly).
+
+ v1="$(sed -n "s/^$1=/=/p" | sed '1!d')"
+ test "$v1" = "${v1#=}" && return 1
+ printf "%b" "${v1#=}"
+}
+
+kf_unescape() {
+ # Another layer of unescaping. While values in GKeyFile format
+ # are backslash escaped, the original strings (which are in no
+ # defined encoding) are backslash escaped too to be valid UTF-8.
+ # This will undo the second layer of escaping to give binary "strings".
+ printf "%b" "$1"
+}
+
+kf_parse() {
+ v3="$(kf_get_string "$1")" || return 1
+ v3="$(kf_unescape "$v3")"
+ printf '%s=%s\n' "$2" "$(printf '%q' "$v3")"
+}
+
+dhcpopts_create() {
+ kf_parse root-path new_root_path < "$1"
+ kf_parse next-server new_next_server < "$1"
+ kf_parse dhcp-bootfile filename < "$1"
+}
+
+for _i in /sys/class/net/*; do
+ [ -d "$_i" ] || continue
+ state="/run/NetworkManager/devices/$(cat "$_i"/ifindex)"
+ grep -q '^connection-uuid=' "$state" 2> /dev/null || continue
+ ifname="${_i##*/}"
+ dhcpopts_create "$state" > /tmp/dhclient."$ifname".dhcpopts
+ source_hook initqueue/online "$ifname"
+ /sbin/netroot "$ifname"
+done
+
+: > /tmp/nm.done
diff --git a/modules.d/35network-manager/nm-wait-online-initrd.service b/modules.d/35network-manager/nm-wait-online-initrd.service
new file mode 100644
index 0000000..ac8762a
--- /dev/null
+++ b/modules.d/35network-manager/nm-wait-online-initrd.service
@@ -0,0 +1,16 @@
+[Unit]
+DefaultDependencies=no
+Requires=nm-initrd.service
+After=nm-initrd.service
+Before=network-online.target
+Before=dracut-initqueue.service
+ConditionPathExists=/run/NetworkManager/initrd/neednet
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/nm-online -s -q -t 3600
+RemainAfterExit=yes
+
+[Install]
+WantedBy=initrd.target
+WantedBy=network-online.target