Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package agama-installer for openSUSE:Factory
checked in at 2026-08-11 17:09:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/agama-installer (Old)
and /work/SRC/openSUSE:Factory/.agama-installer.new.17972 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "agama-installer"
Tue Aug 11 17:09:27 2026 rev:39 rq:1370328 version:23.0.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/agama-installer/agama-installer.changes
2026-07-21 22:56:01.768734033 +0200
+++
/work/SRC/openSUSE:Factory/.agama-installer.new.17972/agama-installer.changes
2026-08-11 17:09:36.922928888 +0200
@@ -1,0 +2,11 @@
+Thu Jul 23 19:40:00 UTC 2026 - Knut Anderssen <[email protected]>
+
+- Fix multiple IP/route assignments in multi-bond setups with
+ HCN/HVN inside the initrd (bsc#1272445, related to jsc#PED-14533).
+- Announce the HCN network configuration with an "ip=hcn" marker in
+ /etc/cmdline.d, preventing NetworkManager and the other Agama
+ dracut modules from configuring the bond ports on their own, which
+ could break HCN bonds. It requires NetworkManager with "ip=hcn"
+ support (bsc#1272445, related to jsc#PED-14533 and jsc#PED-14534).
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ config-cdroot.tar.xz ++++++
++++++ config.sh ++++++
--- /var/tmp/diff_new_pack.wpW4o5/_old 2026-08-11 17:09:40.787092670 +0200
+++ /var/tmp/diff_new_pack.wpW4o5/_new 2026-08-11 17:09:40.807093518 +0200
@@ -145,11 +145,11 @@
echo "root=live:LABEL=$label" >/etc/cmdline.d/10-liveroot.conf
echo "root_disk=live:LABEL=$label" >>/etc/cmdline.d/10-liveroot.conf
echo 'install_items+=" /etc/cmdline.d/10-liveroot.conf "'
>/etc/dracut.conf.d/10-liveroot-file.conf
-echo 'add_dracutmodules+=" dracut-menu agama-cmdline agama-dud
live-self-update initrd-nmtui chrony"'
>>/etc/dracut.conf.d/10-liveroot-file.conf
+echo 'add_dracutmodules+=" dracut-menu agama-cmdline agama-dud
live-self-update initrd-nmtui chrony "'
>>/etc/dracut.conf.d/10-liveroot-file.conf
if [ "${arch}" = "ppc64le" ]; then
# Added support for configuring HCN in dracut (jsc#PED-14533) only in
ppc64le.
- echo 'add_dracutmodules+=" hcn"' >>/etc/dracut.conf.d/10-liveroot-file.conf
+ echo 'add_dracutmodules+=" hcn "' >>/etc/dracut.conf.d/10-liveroot-file.conf
fi
++++++ live-root.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usr/bin/kernel-cmdline-conf.sh
new/usr/bin/kernel-cmdline-conf.sh
--- old/usr/bin/kernel-cmdline-conf.sh 2026-07-20 13:59:40.000000000 +0200
+++ new/usr/bin/kernel-cmdline-conf.sh 2026-08-01 09:52:37.000000000 +0200
@@ -32,6 +32,11 @@
rd.peerdns=* | rd.neednet=* | vlan=* | bond=* | team=* | bridge=* |
ifname=*)
_found=1
;;
+ # remove the HCN (Hybrid Cloud Network) options, they are only meaningful
+ # for the installation media, see the 99hcn dracut module
+ rd.hcn | rd.hcn=* | rd.hcn.*)
+ _found=1
+ ;;
esac
if [ -z "$_found" ]; then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh
new/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh
--- old/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh
2026-07-20 13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh
2026-08-01 09:52:37.000000000 +0200
@@ -18,7 +18,8 @@
if grep -q -s -E -e "https?://" -e "ftps?://" -e "smbs?://" -e "scp://"
/tmp/agamadud.info; then
echo "rd.neednet=1" > /etc/cmdline.d/agama-generated.conf
# use DHCP if there is no network configuration provided by user
- if ! getarg "ip=" >/dev/null && ! getarg "rd.hcn.ip=" >/dev/null; then
+ # (the HCN module writes "ip=hcn" when it configures the network itself)
+ if ! getarg "ip=" >/dev/null; then
echo "ip=dhcp" >> /etc/cmdline.d/agama-generated.conf
fi
fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md
new/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md
--- old/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md 2026-07-20
13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md 2026-08-01
09:52:37.000000000 +0200
@@ -21,11 +21,12 @@
**Core Responsibilities:**
1. Parse HCN-specific kernel parameters (`rd.hcn.ip`, `rd.hcn.route`)
-2. Discover HCN device pairs via `/proc/device-tree` properties
-3. Transform HCN parameters into bond-targeted standard dracut parameters
-4. Generate NetworkManager connection profiles via `nm-initrd-generator`
-5. Adapt profiles for `hcnmgr` daemon compatibility
-6. Persist profiles across initramfs and into the installed system
+2. Reserve the network configuration for HCN by writing an `ip=hcn` marker to
`/etc/cmdline.d/`
+3. Discover HCN device pairs via `/proc/device-tree` properties
+4. Transform HCN parameters into bond-targeted standard dracut parameters
+5. Generate NetworkManager connection profiles via `nm-initrd-generator`
+6. Adapt profiles for `hcnmgr` daemon compatibility
+7. Persist profiles across initramfs and into the installed system
## Key Architecture Principles
@@ -43,7 +44,9 @@
4. **No Cmdline Pollution**: Transformed parameters are passed directly to
`nm-initrd-generator` as command-line arguments, never written to
`/etc/cmdline.d/`, preventing other dracut modules from reading them and
regenerating incompatible profiles.
-5. **Timing-Aware Orchestration**: Two-phase execution (cmdline hook + systemd
service) handles the fact that HCN devices may not be available when kernel
command line parsing runs.
+5. **Early Claim of the Network**: The `hcn-cmdline.sh` hook writes a single
`ip=hcn` marker to `/etc/cmdline.d/20-hcn.conf` while the command line is being
parsed. It announces that HCN takes care of the network so that neither
NetworkManager nor the other Agama modules configure the bond ports on their
own. This requires NetworkManager with `ip=hcn` support (jsc#PED-14534). The
marker is **internal**: it is written by the module, never by the user, and it
does not enable HCN by itself (`hcn-init-initrd.service` only reacts to
`rd.hcn*`).
+
+6. **Timing-Aware Orchestration**: Two-phase execution (cmdline hook + systemd
service) handles the fact that HCN devices may not be available when kernel
command line parsing runs. The hook only reserves the network, the actual
configuration happens in the service once udev has discovered the devices.
## Boot-Time Integration & Component Diagram
@@ -71,11 +74,18 @@
v
+-------------------------------------------------------------------------------------------------+
| 1. EARLY CMDLINE & LOGGING PHASE (`dracut-cmdline.service`)
|
+| - Runs the HCN cmdline hook:
`/lib/dracut/hooks/cmdline/20-hcn-cmdline.sh` |
+| * If HCN is requested (rd.hcn=1, rd.hcn.ip or rd.hcn.route) AND the
device tree |
+| contains `ibm,hcn-id` devices: writes `ip=hcn` to
`/etc/cmdline.d/20-hcn.conf`. |
+| * Otherwise: no-op, the boot continues as a standard one.
|
+| - Runs the other Agama cmdline hooks (priority 99: agama-dud,
live-self-update, |
+| initrd-nmtui). They add `ip=dhcp` only when no `ip=` is set, so the
marker above |
+| keeps them away from the HCN bond ports.
|
| - Runs early cmdline hook: `/lib/dracut/hooks/cmdline/99-nm-config.sh`
|
-| - Standard NetworkManager connection generation proceeds normally.
|
|
|
| SLES 16.1 (NM < 1.54):
|
-| - `nm-config.sh` executes `nm_generate_connections` normally.
|
+| - `nm-config.sh` executes `nm_generate_connections` normally. With
`ip=hcn` it |
+| generates nothing, not even the `rd.neednet=1` default connection.
|
|
|
| Tumbleweed (NM >= 1.54):
|
| - No generation in cmdline hook (delegated to systemd service).
|
@@ -85,7 +95,9 @@
+-------------------------------------------------------------------------------------------------+
| 1.5 NETWORK GENERATION SERVICE PHASE (Tumbleweed Only)
|
| Runs `NetworkManager-config-initrd.service` (Before
`systemd-udevd.service`): |
-| - RUNS standard `nm-initrd-generator` normally.
|
+| - RUNS standard `nm-initrd-generator` normally, reading the dracut
command line |
+| (`getcmdline`, see the dracut drop-in) and therefore seeing the
`ip=hcn` marker. |
+| - With `ip=hcn` it generates nothing and leaves the network to the HCN
module. |
+-------------------------------------------------------------------------------------------------+
|
v
@@ -129,15 +141,18 @@
The kernel mounts the initramfs. Systemd starts as PID 1
(`/usr/lib/systemd/systemd`).
2. **Early Cmdline & Discovery Phase (`dracut-cmdline.service`)**:
- - `dracut-cmdline` processes all command line hooks, including
`/lib/dracut/hooks/cmdline/99-nm-config.sh`.
+ - `dracut-cmdline` processes all command line hooks in priority order.
+ - `20-hcn-cmdline.sh` (this module) writes `ip=hcn` to
`/etc/cmdline.d/20-hcn.conf` when HCN is requested and HCN devices exist in
`/proc/device-tree`. Nothing else is written: the transformation of `rd.hcn.*`
still happens much later, in `hcn-init-initrd.service`.
+ - The priority 99 hooks of the other Agama modules (`99agama-dud`,
`99live-self-update`, `99initrd-nmtui`) run afterwards and skip their `ip=dhcp`
fallback because an `ip=` is already present.
- Standard NetworkManager connection generation proceeds normally:
- **SLES 16.1 (NetworkManager < 1.54):** `99-nm-config.sh` calls
`nm_generate_connections` to generate standard connection profiles.
- **Tumbleweed (NetworkManager >= 1.54):** `99-nm-config.sh` does not
call `nm_generate_connections` (which is delegated to a systemd service).
2.5. **Network Generation Service Phase (Tumbleweed with NetworkManager >=
1.54 Only)**:
-- **`NetworkManager-config-initrd.service`** runs (ordered
`Before=systemd-udevd.service` and `systemd-udev-trigger.service`).
-- It runs standard `nm-initrd-generator` normally to generate connection
profiles based on kernel arguments.
+- **`NetworkManager-config-initrd.service`** runs (ordered
`After=dracut-cmdline.service` and `Before=systemd-udevd.service` /
`systemd-udev-trigger.service`).
+- It runs standard `nm-initrd-generator` normally to generate connection
profiles based on kernel arguments. The dracut drop-in
(`NetworkManager-config-initrd-dracut.conf`, from the `35network-manager`
module) makes it use `getcmdline` instead of `cat /proc/cmdline`, so the
`ip=hcn` marker written above is taken into account.
+- On an HCN boot the generator therefore produces no profiles at all, in
particular not the default DHCP connection it would otherwise fabricate for
`rd.neednet=1`. That default would activate the bond ports individually and
break the bond (bsc#1272445).
1. **Udev Device Discovery**:
- `systemd-udevd.service` starts and triggers hardware udev events via
`systemd-udev-trigger.service`.
@@ -273,6 +288,9 @@
- Transformed parameters are **never written to `/etc/cmdline.d/`**
- Passed directly to `nm-initrd-generator` as command-line arguments only
- Other modules have no transformed parameters to misinterpret
+ - The only thing written to `/etc/cmdline.d/` is the `ip=hcn` marker, which
makes both
+ NetworkManager and the other Agama modules keep their hands off the
network instead of
+ falling back to DHCP on the bond ports
2. **Layer 2 - Isolated Generation:**
- Uses custom output directory: `-c /run/hcn/system-connections`
@@ -366,6 +384,7 @@
- `/etc` persists across dracut module execution (unlike `/run` which modules
may clear)
- Other dracut modules don't know about `/run/hcn/system-connections/`
(isolated generation)
- No transformed parameters in `/etc/cmdline.d/` prevents other modules from
regenerating
+- The `ip=hcn` marker in `/etc/cmdline.d/` prevents them from generating
anything of their own
### Stage 2: Installed System Persistence (Agama Module)
@@ -434,6 +453,12 @@
- When no MAC address is specified, first discovered HCN ID is used
- May be unexpected on multi-bond systems
+5. **NetworkManager with `ip=hcn` Support Required:**
+ - The module relies on `nm-initrd-generator` understanding `ip=hcn`
(jsc#PED-14534)
+ - Older versions treat `hcn` as an unknown method and generate their own
wired DHCP
+ connection, which activates the bond ports individually and breaks the
bond
+ - There is no fallback: the marker is written whenever HCN devices are
present
+
### Maintenance Considerations
- **Dracut API Stability:** Module relies on dracut hook conventions (cmdline
phase, systemd service ordering)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh
new/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh
--- old/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh 1970-01-01
01:00:00.000000000 +0100
+++ new/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh 2026-08-01
09:52:37.000000000 +0200
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+# HCN (Hybrid Cloud Network) dracut module - kernel command line hook
+#
+# Announces that HCN takes care of the network configuration by writing an
+# "ip=hcn" marker to /etc/cmdline.d. The configuration itself is done much
+# later by parse-hcn, which has to wait for udev to discover the devices.
+#
+# The marker is internal, users still request HCN with rd.hcn.ip/rd.hcn.route.
+# Writing it by hand does not enable HCN, it only keeps the others away.
+#
+# The marker keeps everybody else away from the HCN bond ports:
+#
+# * nm-initrd-generator skips the argument and, more importantly, does not
+# fabricate its default DHCP connection when rd.neednet=1 is set but the
+# command line produced no connection (PED-14534). That default would bring
+# the bond ports up independently, breaking the bond.
+# * The other Agama modules (99agama-dud, 99live-self-update, 99initrd-nmtui)
+# only add "ip=dhcp" when the user did not configure the network, so an
+# "ip=" of any kind is enough for them to keep their hands off. This hook
+# therefore has to run before them, see the priority in module-setup.sh.
+#
+# Two requirements are worth keeping in mind:
+#
+# * NetworkManager needs "ip=hcn" support (PED-14534). Older versions treat
it
+# as an unknown method and generate their default wired DHCP connection.
+# * The early generation has to read the dracut command line and not just
+# /proc/cmdline. That is the case in a dracut initrd, where the
+# 35network-manager module installs a drop-in for
+# NetworkManager-config-initrd.service replacing "cat /proc/cmdline" with
+# the "getcmdline" dracut function.
+
+command -v getargbool >/dev/null || . /lib/dracut-lib.sh
+
+# Device tree location and generated configuration file. Only overridden by the
+# test suite.
+HCN_DEVICE_TREE="${HCN_DEVICE_TREE:-/proc/device-tree}"
+HCN_CMDLINE_FILE="${HCN_CMDLINE_FILE:-/etc/cmdline.d/20-hcn.conf}"
+
+# Whether the HCN configuration was requested through the kernel command line.
+# Mirrors the conditions of hcn-init-initrd.service.
+hcn_requested() {
+ # rd.hcn=0 disables HCN even when other HCN options are present
+ getargbool 1 rd.hcn || return 1
+
+ getargbool 0 rd.hcn && return 0
+ getarg rd.hcn.ip= >/dev/null && return 0
+ getarg rd.hcn.route= >/dev/null && return 0
+
+ return 1
+}
+
+# Whether the device tree contains any HCN device. Unlike parse-hcn, this does
+# not wait for the devices to show up in sysfs, it only checks whether there is
+# something to be configured at all.
+hcn_devices_present() {
+ local dev
+
+ for dev in "$HCN_DEVICE_TREE"/pci*/ethernet* \
+ "$HCN_DEVICE_TREE"/vdevice/vnic* "$HCN_DEVICE_TREE"/vdevice/l-lan*; do
+ [ -e "$dev/ibm,hcn-id" ] && return 0
+ done
+
+ return 1
+}
+
+hcn_write_cmdline() {
+ hcn_requested || return 0
+
+ # Without HCN devices parse-hcn does not configure anything, so do not claim
+ # the network configuration and let the other modules set it up as usual.
+ if ! hcn_devices_present; then
+ info "hcn-cmdline: HCN requested but no HCN device found in the device
tree"
+ return 0
+ fi
+
+ info "hcn-cmdline: HCN takes care of the network configuration, writing
'ip=hcn'"
+ echo "ip=hcn" > "$HCN_CMDLINE_FILE"
+}
+
+hcn_write_cmdline
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/module-setup.sh
new/usr/lib/dracut/modules.d/99hcn/module-setup.sh
--- old/usr/lib/dracut/modules.d/99hcn/module-setup.sh 2026-07-20
13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99hcn/module-setup.sh 2026-08-01
09:52:37.000000000 +0200
@@ -19,6 +19,9 @@
inst_multiple hexdump ofpathname pseries_platform awk mkdir mv sed sleep tr
inst_script "$moddir/parse-hcn.sh" /usr/bin/parse-hcn
+ # Runs before the cmdline hooks of the other Agama modules, which use the
+ # priority 99 and add "ip=dhcp" when the network is not configured yet
+ inst_hook cmdline 20 "$moddir/hcn-cmdline.sh"
inst_simple "$moddir/hcn-init-initrd.service"
"${systemdsystemunitdir}/hcn-init-initrd.service"
$SYSTEMCTL -q --root "$initdir" enable hcn-init-initrd.service
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh
new/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh
--- old/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh 2026-07-20
13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh 2026-08-01
09:52:37.000000000 +0200
@@ -14,6 +14,11 @@
# 6. Fix up generated connections to use correct bond masters and naming
# 7. Copy connections to /etc/NetworkManager/system-connections for persistence
#
+# This script runs from hcn-init-initrd.service, once udev has discovered the
+# devices. Much earlier, hcn-cmdline.sh has already told NetworkManager and the
+# other dracut modules to leave the network alone by writing an "ip=hcn" marker
+# to /etc/cmdline.d, so nothing configures the bond ports behind our back.
+#
# Usage:
# rd.hcn=1 - Create bond connections only (no IP configuration)
# rd.hcn.ip=<config> - Create bonds with HCN-specific IP configuration
@@ -326,10 +331,20 @@
# Extract unique bond names from discovered mappings
BOND_NAMES=$(echo "$MAPPINGS" | awk '{for(i=1;i<=NF;i+=4) if (!seen[$i]++)
print $i}')
+# First discovered bond. Only unqualified *static* configs (a fixed address
+# with no interface field) fall back to this bond, because a fixed address can
+# belong to a single bond. Method-only configs (dhcp, auto6, ...) carry no
+# per-host address and instead fan out to every discovered bond (see below).
+# NOTE: BOND_NAMES is newline-separated, so it must be left unquoted here for
+# awk to see a single record and return just the first token.
+# shellcheck disable=SC2086
+FIRST_BOND=$(echo $BOND_NAMES | awk '{print $1}')
+
for BONDNAME in $BOND_NAMES; do
SLAVES="" SLAVE_NAMES="" SLAVE_MACS="" PRIMARY=""
+ OTHER_SLAVE_NAMES="" OTHER_SLAVE_MACS=""
- # Extract slaves for this bond from MAPPINGS
+ # Extract slaves for this bond and other bonds from MAPPINGS
set -- $MAPPINGS
while [ $# -ge 4 ]; do
if [ "$1" = "$BONDNAME" ]; then
@@ -337,6 +352,9 @@
[ "$3" != "none" ] && SLAVE_MACS="$SLAVE_MACS $3"
[ "$4" = "primary" ] && PRIMARY="$2"
SLAVES="${SLAVES:+$SLAVES,}$2"
+ else
+ OTHER_SLAVE_NAMES="$OTHER_SLAVE_NAMES $2"
+ [ "$3" != "none" ] && OTHER_SLAVE_MACS="$OTHER_SLAVE_MACS $3"
fi
shift 4
done
@@ -349,32 +367,56 @@
# Process rd.hcn.ip= - replace slave names/MACs with bond name
for HCN_IP in $(getargs rd.hcn.ip); do
+ # Lowercased copy for case-insensitive MAC matching: MACs in MAPPINGS are
+ # lowercase, but may be supplied in uppercase on the kernel command line.
+ HCN_IP_LC=$(echo "$HCN_IP" | tr 'A-Z' 'a-z')
matched=0
for slave in $SLAVE_NAMES $SLAVE_MACS; do
slave_dash=$(str_replace "$slave" ":" "-")
+ # MACs (which contain ':') are compared case-insensitively; interface
+ # names are compared as-is to preserve their case.
+ hcn_cmp=$HCN_IP
+ case "$slave" in *:*) hcn_cmp=$HCN_IP_LC ;; esac
# Check if HCN_IP contains the slave (as a whole word/field)
- if strstr ":$HCN_IP:" ":$slave:" || strstr ":$HCN_IP:" ":$slave_dash:";
then
+ if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:"
":$slave_dash:"; then
matched=1
# Replace slave with bond name (handle boundaries)
- current_hcn_ip=$(echo "$HCN_IP" | sed -E "s#^($slave|$slave_dash)([:
]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([: ]|$)#\1$BONDNAME\3#g")
+ current_hcn_ip=$(echo "$hcn_cmp" | sed -E "s#^($slave|$slave_dash)([:
]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([: ]|$)#\1$BONDNAME\3#g")
NEW_ARGS="$NEW_ARGS ip=$current_hcn_ip"
break
fi
done
- # No slave matched and no bond name present - apply to first bond
+ # Check if this IP is targeted at another bond's slave
+ matched_other=0
+ for slave in $OTHER_SLAVE_NAMES $OTHER_SLAVE_MACS; do
+ slave_dash=$(str_replace "$slave" ":" "-")
+ hcn_cmp=$HCN_IP
+ case "$slave" in *:*) hcn_cmp=$HCN_IP_LC ;; esac
+ if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:"
":$slave_dash:"; then
+ matched_other=1
+ break
+ fi
+ done
+
+ # No slave matched and no bond name present - apply the unqualified config.
+ # Method-only configs (dhcp, auto6, ...) fan out to every bond; unqualified
+ # static addresses fall back to the first bond only (see the *) branch).
has_bond_ip=0
case "$HCN_IP" in
*:bond[0-9]*) has_bond_ip=1 ;;
esac
- if [ $matched -eq 0 ] && [ $has_bond_ip -eq 0 ]; then
+ if [ $matched -eq 0 ] && [ $matched_other -eq 0 ] && [ $has_bond_ip -eq 0
]; then
case "$HCN_IP" in
dhcp | on | any | single-dhcp | dhcp6 | auto6 | ibft | either6 | link6)
+ # Method-only config (no fixed address): each bond obtains its own
+ # configuration independently, so apply it to every discovered bond.
info "parse-hcn: applying $HCN_IP to $BONDNAME"
NEW_ARGS="$NEW_ARGS ip=$BONDNAME:$HCN_IP"
;;
*:dhcp | *:on | *:any | *:dhcp6 | *:auto6 | *:link6)
# Format:
rd.hcn.ip=<interface>:{dhcp|on|any|dhcp6|auto6|link6}[:[<mtu>]]
+ # Method-only config with optional MTU: also applies to every bond.
# Extract optional MTU field (after the method, could be followed by
more colons)
temp_ip=${HCN_IP}
# Count colons to determine if there are extra fields
@@ -391,7 +433,10 @@
fi
;;
*)
- # Static IP configuration - count colons to determine format
+ # Static IP configuration: a fixed address can belong to only one bond,
+ # so an unqualified static config falls back to the first bond only.
+ [ "$BONDNAME" = "$FIRST_BOND" ] || continue
+ # Count colons to determine format
# Standard format:
rd.hcn.ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<dns1>][:<dns2>]]
# Minimum fields: client-IP:gateway:netmask:hostname:interface:method
(5 colons)
# Extended: adds :dns1 and/or :dns2 (up to 7 colons)
@@ -448,23 +493,39 @@
# Process rd.hcn.route= - replace slave names/MACs with bond name
for HCN_ROUTE in $(getargs rd.hcn.route); do
+ # Lowercased copy for case-insensitive MAC matching (see rd.hcn.ip above).
+ HCN_ROUTE_LC=$(echo "$HCN_ROUTE" | tr 'A-Z' 'a-z')
matched=0
for slave in $SLAVE_NAMES $SLAVE_MACS; do
slave_dash=$(str_replace "$slave" ":" "-")
- if strstr ":$HCN_ROUTE:" ":$slave:" || strstr ":$HCN_ROUTE:"
":$slave_dash:"; then
+ hcn_cmp=$HCN_ROUTE
+ case "$slave" in *:*) hcn_cmp=$HCN_ROUTE_LC ;; esac
+ if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:"
":$slave_dash:"; then
matched=1
- current_hcn_route=$(echo "$HCN_ROUTE" | sed -E
"s#^($slave|$slave_dash)([: ]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([:
]|$)#\1$BONDNAME\3#g")
+ current_hcn_route=$(echo "$hcn_cmp" | sed -E
"s#^($slave|$slave_dash)([: ]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([:
]|$)#\1$BONDNAME\3#g")
NEW_ARGS="$NEW_ARGS rd.route=$current_hcn_route"
break
fi
done
+ # Check if this route is targeted at another bond's slave
+ matched_other=0
+ for slave in $OTHER_SLAVE_NAMES $OTHER_SLAVE_MACS; do
+ slave_dash=$(str_replace "$slave" ":" "-")
+ hcn_cmp=$HCN_ROUTE
+ case "$slave" in *:*) hcn_cmp=$HCN_ROUTE_LC ;; esac
+ if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:"
":$slave_dash:"; then
+ matched_other=1
+ break
+ fi
+ done
+
# No slave matched and no bond name present - apply to first bond
has_bond_route=0
case "$HCN_ROUTE" in
*:bond[0-9]*) has_bond_route=1 ;;
esac
- if [ $matched -eq 0 ] && [ $has_bond_route -eq 0 ]; then
+ if [ $matched -eq 0 ] && [ $matched_other -eq 0 ] && [ $has_bond_route -eq
0 ] && [ "$BONDNAME" = "$FIRST_BOND" ]; then
temp_route=${HCN_ROUTE}
colons=0
while [ "${temp_route#*:}" != "$temp_route" ]; do
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh
new/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh
--- old/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh
2026-07-20 13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh
2026-08-01 09:52:37.000000000 +0200
@@ -21,7 +21,8 @@
echo "<5>Enabling network configuration"
echo "rd.neednet=1" > "$FILE"
# use DHCP if there is no network configuration provided by user
- if ! getarg "ip=" >/dev/null && ! getarg "rd.hcn.ip=" >/dev/null; then
+ # (the HCN module writes "ip=hcn" when it configures the network itself)
+ if ! getarg "ip=" >/dev/null; then
echo "Using default DHCP network configuration"
echo "ip=dhcp" >> "$FILE"
fi