]> git.ipfire.org Git - thirdparty/dracut-ng.git/commitdiff
fix(systemd-networkd): get DHCP options values from networkctl main
authorLuca Boccassi <luca.boccassi@gmail.com>
Sun, 31 May 2026 14:29:50 +0000 (15:29 +0100)
committerNeal Gompa (ニール・ゴンパ) <ngompa13@gmail.com>
Tue, 2 Jun 2026 12:35:55 +0000 (08:35 -0400)
The internal lease is no longer saved to the private /run/ directory
of networkd since v261, so it cannot be read from there. It was always
clearly marked as private anyway.
Use the new 'dhcp-lease' networkctl verb to print it instead.

modules.d/11systemd-networkd/module-setup.sh
modules.d/11systemd-networkd/networkd-run.sh

index 97f46a158d7e5944279d7101a6eca681aec70961..60dace505e324464fa4b3bdef5499a95e017ef30 100755 (executable)
@@ -58,7 +58,7 @@ install() {
         "$systemdsystemunitdir"/systemd-networkd-wait-online.service \
         "$systemdsystemunitdir"/systemd-networkd-wait-online@.service \
         "$systemdsystemunitdir"/systemd-network-generator.service \
-        ip sed grep
+        ip sed grep networkctl
 
     inst_simple "$moddir"/99-wait-online-dracut.conf \
         "$systemdsystemunitdir"/systemd-networkd-wait-online.service.d/99-dracut.conf
index 1f34043424bc1cf01c75febc08ea0b30afa82634..92a91c6b0147b7934b043bc75f0c776b97be27c4 100755 (executable)
@@ -16,6 +16,18 @@ for ifpath in /sys/class/net/*; do
                 | sed -e "s/NEXT_SERVER=/new_next_server='/" \
                     -e "s/ROOT_PATH=/new_root_path='/" \
                     -e "s/$/'/" > "$dhcpopts_file" || :
+        else
+            # Since systemd v261 the DHCP lease is no longer serialized to /run/, use the new networkctl command.
+            lease=$(networkctl --no-pager --no-legend --full dhcp-lease "$ifname" 2> /dev/null) || lease=""
+            if [ -n "$lease" ]; then
+                {
+                    next_server=$(printf '%s\n' "$lease" | sed -n "s/^[[:space:]]*Server Address:[[:space:]]*//p")
+                    [ -n "$next_server" ] && printf "new_next_server='%s'\n" "$next_server"
+                    # option 17 is the DHCP root-path; strip the leading "<code> <name> " columns
+                    root_path=$(printf '%s\n' "$lease" | sed -n "s/^[[:space:]]*17[[:space:]].*[[:space:]]//p")
+                    [ -n "$root_path" ] && printf "new_root_path='%s'\n" "$root_path"
+                } > "$dhcpopts_file" || :
+            fi
         fi
 
         source_hook initqueue/online "$ifname"