agama/live/live-root/usr/lib/dracut/modules.d/99agama-cmdline/agama-network-compat.sh
2025-05-27 07:28:16 +01:00

191 lines
4.2 KiB
Bash
Executable file

#!/bin/bash
# Takes care of persist the `hostname` and `ifname` configuration as well of translating the
# linuxrc `ifcfg` option into its `ip` equivalent
[ -e /dracut-state.sh ] && . /dracut-state.sh
. /lib/dracut-lib.sh
. /lib/net-lib.sh
# Parses the `ifname` option generating a systemd network link file under Agama's run directory
#
# Example:
#
# ifname=bootdev:aa:bb:cc:dd:ee:ff
#
# Generates:
#
# cat /run/agama/systemd/network/10-agama-ifname-bootdev.link
# # Generated by Agama's dracut module
#
# [Match]
# MACAddress=aa:bb:cc:dd:ee:ff
#
# [Link]
# Name=bootdev
parse_ifname() {
while read -r i; do
set --
echo "### Processing $i ###"
set -- "$@" "${i%%=*}"
local v="${1}"
local iface="${v%%:*}"
local mac="${v#*:}"
if strglob "$mac" "*:*:*:*:*:*"; then
local path="/run/agama/systemd/network/10-agama-ifname-${iface}.link"
mkdir -p /run/agama/systemd/network
cat >"$path" <<EOF
# Generated by Agama's dracut module
[Match]
MACAddress=${mac}
[Link]
Name=${iface}
EOF
fi
done <<<"$(getargs ifname)"
}
ifcfg_to_ip() {
local ip
local conf_path="/etc/cmdline.d/40-agama-network.conf"
if [ -n "$2" ]; then
local v="${2}",
local interface="$1"
set --
while [ -n "$v" ]; do
set -- "$@" "${v%%,*}"
v=${v#*,}
done
else
local interface="*"
fi
### See https://en.opensuse.org/SDB:Linuxrc#Network_Config
# ifcfg=<interface_spec>=[try,]dhcp*,[rfc2132,]OPTION1=value1,OPTION2=value2...
if str_starts "$1" "dhcp"; then
autoconf="$1"
if [ "$autoconf" = "dhcp4" ]; then
autoconf="dhcp"
fi
case $autoconf in
"dhcp" | "dhcp6")
if [ "$interface" = "*" ]; then
echo "ip=${1}" >>$conf_path
else
echo "ip=${interface}:${1}" >>$conf_path
fi
;;
*)
echo "No supported option ${1}"
;;
esac
return 0
fi
# ifcifg=<interface_spec>=ip,gateway,nameserver,domain
if strglob "$1" "*.*.*.*/*"; then
[[ -n "$2" ]] && gateway=$2
[[ -n "$3" ]] && nameserver=$3
ip="$1 "
set --
while [ -n "$ip" ]; do
set -- "$@" "${ip%% *}"
ip="${ip#* }"
done
## TODO: IP is a LIST_IP
ip="$1"
mask=${ip##*/}
ip=${ip%%/*}
shift
## Configure the first interface, the gateway must belong to the same network
echo "ip=${ip}::${gateway}:$mask::${interface}" >>$conf_path
## Configure multiple addresses for the same interface
while [[ $# -gt 0 ]]; do
ip="$1"
mask=${ip##*/}
ip=${ip%%/*}
echo "ip=${ip}:::$mask::${interface}" >>$conf_path
shift
done
## Configure nameservers
if [[ -n $nameserver ]]; then
nameserver="$nameserver "
while [ -n "$nameserver" ]; do
echo "nameserver=${nameserver%% *}" >>$conf_path
nameserver="${nameserver#* }"
done
fi
fi
return 0
}
parse_hostname() {
local hostname
hostname=$(getarg hostname=)
if [[ -n $hostname ]]; then
echo "${hostname}" >/etc/hostname
fi
if ! getargbool 1 SetHostname=; then
mkdir -p /run/NetworkManager/conf.d
echo '[main]' >/run/NetworkManager/conf.d/10-agama-hostname.conf
echo 'hostname-mode=none' >>/run/NetworkManager/conf.d/10-agama-hostname.conf
fi
return 0
}
translate_ifcfg() {
local i
local vlan
local phydevice
local conf_path="/etc/cmdline.d/40-agama-network.conf"
while read -r i; do
set --
echo "### Processing $i ###"
set -- "$@" "${i%%=*}"
options="${i#*=}"
pattern="$1"
unset vlan phydevice
if str_starts "$options" "try,"; then
options="${i#*try,*}"
fi
# The pattern Looks like a VLAN like eth0.10
if strglobin "$pattern" "*.[0-9]*"; then
phydevice=${pattern%.*}
vlan="vlan=$1:$phydevice"
echo "$vlan" >>$conf_path
fi
# Try to translate the pattern as it is, we cannot try to apply the config to check if
# it is valid because the nm-initrd-generator is called by a cmdline hook unless we call
# explicitly passing the getcmdline result
ifcfg_to_ip "$pattern" "$options"
set --
unset options pattern CMDLINE
done <<<"$(getargs ifcfg)"
return 0
}
parse_hostname
parse_ifname
translate_ifcfg