Bug 49158

Summary: Misbehavior in the sed regex inside add_systemd_networkd_ini_option() function
Product: Sisyphus Reporter: Nikolay A. Fetisov <naf>
Component: alterator-net-functionsAssignee: Mikhail Efremov <sem>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: boyarsh, sem, zerg
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description Nikolay A. Fetisov 2024-01-23 15:17:15 MSK
Для alterator-net-function 2.1.1-alt1 в функции add_systemd_networkd_ini_option()
для добавления дополнительного значения параметра в network-файл после уже там
имеющегося используется sed вида (строка 1089)

sed -i -e "1,// s/^\(\s*\)\($latest\)$/\1\2\n\1$3 = $4/" -- "$1"

В функции write_systemd_networkd_bootproto() (строка 1179) эта функция вызывается
для добавления в network-файлов адресов IP - которые указываются с маской.
В sed как разделитель для оператора замены 's' используется '/' - после подставления
в строку запуска sed адреса IP получается синтаксическая ошибка.

Пример для проверки:
------------8<--------------
#!/bin/sh

. alterator-net-functions

network_filename=$(mktemp /tmp/XXXX.network)
for addr in 10.0.0.1/8 10.0.0.2/8 10.0.0.3/8 fd00:1/64 fd00:2/64; do
        echo "ADDR=$addr"
        add_systemd_networkd_ini_option "$network_filename" "Network" "Address" "$addr"
done

echo
echo "Network file:"
cat $network_filename
rm -f "$network_filename"
------------8<--------------

Результат запуска:
------------8<--------------
ADDR=10.0.0.1/8
ADDR=10.0.0.2/8
sed: -e expression #1, char 42: unknown option to `s'
ADDR=10.0.0.3/8
sed: -e expression #1, char 42: unknown option to `s'
ADDR=fd00:1/64
sed: -e expression #1, char 42: unknown option to `s'
ADDR=fd00:2/64
sed: -e expression #1, char 42: unknown option to `s'

Network file:
[Network]
        Address = 10.0.0.1/8
------------8<--------------

В network-файл добавился только первый адрес, т.к. для него в add_systemd_networkd_ini_option() строка с sed не использовалась,
остальные вызвали ошибки.

По-видимому, надо заменить разделитель на что-либо другое - как вариант, на ' .
Хотя это зависит от того, где используется эта функция - но в alterator-net-function
через неё записываются только Address, Gateway и DNS - в них кавычек быть не может
(% и много другое может быть в DNS как часть адреса IPv6).
Comment 1 Mikhail Efremov 2024-01-23 20:30:45 MSK
Спасибо за подробный анализ.
> По-видимому, надо заменить разделитель на что-либо другое - как вариант, на
> ' .
> Хотя это зависит от того, где используется эта функция - но в
> alterator-net-function
> через неё записываются только Address, Gateway и DNS - в них кавычек быть не
> может
> (% и много другое может быть в DNS как часть адреса IPv6).

Думаю | вполне подойдет.
Comment 2 Repository Robot 2024-01-23 21:20:04 MSK
alterator-net-functions-2.1.2-alt1 -> sisyphus:

 Tue Jan 23 2024 Mikhail Efremov <sem@altlinux> 2.1.2-alt1
 - Fix write_systemd_networkd_bootproto() (closes: #49159).
 - Fix sed regex for systemd-networkd config (closes: #49158).