Bug 38762 - Неверно сохраняется маска подсети из веб-интерфейса PVE
Summary: Неверно сохраняется маска подсети из веб-интерфейса PVE
Status: CLOSED FIXED
Alias: None
Product: Альт Сервер Виртуализации
Classification: Distributions
Component: Ошибки работы (show other bugs)
Version: 9.0
Hardware: x86_64 Linux
: P5 normal
Assignee: Alexey Shabalin
QA Contact: Alexey Shabalin
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-07-27 14:24 MSK by Kot_Uchoniy
Modified: 2020-11-10 14:18 MSK (History)
3 users (show)

See Also:


Attachments
__unwrap_netmask4(): не конвертировать маску в формате A.B.C.D (431 bytes, patch)
2020-07-27 18:44 MSK, Andrew Vasilyev
no flags Details | Diff
etcnet-to-network: принимать маску сети в длинном формате (1.19 KB, patch)
2020-08-12 18:51 MSK, Andrew Vasilyev
no flags Details | Diff
pve-common: принимать маску сети из etcnet в любом формате (компактная версия) (831 bytes, patch)
2020-08-13 16:46 MSK, Andrew Vasilyev
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Kot_Uchoniy 2020-07-27 14:24:15 MSK
Если в /etc/net/ifaces/eth0/ipv4address маска подсети указана в виде 
192.168.1.1/255.255.255.192, 
то в веб-интерфейсе PVE CIDR имеет значение 32.
В случае, если происходит изменение настроек сети через веб-интерфейс PVE, то при сохранении настроек CIDR 32 применяется к настройкам сетевой карты и файл /etc/net/ifaces/eth0/ipv4address принимает вид:
192.168.1.1/255.255.255.255
При этом, если изначально файл /etc/net/ifaces/eth0/ipv4address имеет вид:
192.168.1.1/26, 
то в веб-интерфейсе PVE маска подсети отображается правильно, но после сохранения настроек из веб-интерфейса файл /etc/net/ifaces/eth0/ipv4address приводится к виду:
192.168.1.1/255.255.255.192
В результате при повторном сохранении маска выставляется неверно.
Comment 1 Andrew Vasilyev 2020-07-27 18:36:38 MSK
В функции __read_ipv4address_into() netmask через вызов __unwrap_netmask4()
превращается из "/26" в "255.255.255.192" и перезаписывается в таком виде, 
при повторном вызове __unwrap_netmask4("255.255.255.192") превращает маску в "255.255.255.255", т.к. считает, что получила на входе 255, а проверок на допустимые значения там никаких нет:

sub __unwrap_netmask4 {
    my $in=shift;
    my @out;
    while (@out<4) {
        if ($in>8) {
            push @out, '255';
            $in -= 8;
            print "DEBUG: in=$in\n";
        } else {
            push @out, $nm4prefix{$in};
            $in = 0;
        }
    }
    return join('.',@out);
}

  а после коммита 4507a5e5268f924be6627a5df8a161f7921d9243 
  функция __interface_to_etcnet() использует netmask без изменений (до этого netmask конвертировалась из "255.255.255.192" в "/26"). Т.е. имеет место быть интерференция старой ошибки (или неопределённого поведения) и новой фичи.

  Наверное, можно исправить функцию __unwrap_netmask4() так, чтобы она возвращала строку netmask без изменения, если там /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/. Тогда маска будет всегда в длинном формате.

  Вопрос: это именно то поведение, которое задумывалось для указанного коммита?
Comment 2 Andrew Vasilyev 2020-07-27 18:44:43 MSK
Created attachment 8885 [details]
__unwrap_netmask4(): не конвертировать маску в формате A.B.C.D
Comment 3 Alexey Shabalin 2020-08-06 21:00:46 MSK
(Ответ для Kot_Uchoniy на комментарий #0)
> Если в /etc/net/ifaces/eth0/ipv4address маска подсети указана в виде 
> 192.168.1.1/255.255.255.192

В etcnet нельзя так указывать маску. В web интерфейсе у pve тоже маска указывается как CIDR (/24)
Откуда берется такой вид маски?
Comment 4 Kot_Uchoniy 2020-08-07 07:22:45 MSK
(In reply to Alexey Shabalin from comment #3)
> (Ответ для Kot_Uchoniy на комментарий #0)
> > Если в /etc/net/ifaces/eth0/ipv4address маска подсети указана в виде 
> > 192.168.1.1/255.255.255.192
> 
> В etcnet нельзя так указывать маску. В web интерфейсе у pve тоже маска
> указывается как CIDR (/24)
> Откуда берется такой вид маски?

Берется при перезапуске pve-cluster. Во время перезапуска этого сервиса судя по всему обновляется настройка сети для PVE и правятся настройки etcnet. И вот как раз в этот момент маска в /etc/net/ifaces/eth0/ipv4address сохраняется в таком виде. И даже больше скажу, etcnet с маской такого вида у меня работал.
Comment 5 Valery Inozemtsev 2020-08-11 12:49:37 MSK
читайте документацию к etcnet и проблем не будет
Comment 6 Alexey Shabalin 2020-08-11 18:17:26 MSK
(Ответ для Valery Inozemtsev на комментарий #5)
> читайте документацию к etcnet и проблем не будет

Валера, а что мешает применить выше указанный патч для исправления?
Хотелось бы исправить ошибку и иметь возможность настраивать сеть из web-интерфейса PVE, а не закрывать глаза и отправлять читать доку по etcnet.
Comment 7 Valery Inozemtsev 2020-08-11 19:42:19 MSK
это проявляется только в том случае если неправильно указать маску в etcnet
Comment 8 Kot_Uchoniy 2020-08-11 20:24:48 MSK
(Ответ для Valery Inozemtsev на комментарий #7)
> это проявляется только в том случае если неправильно указать маску в etcnet

При чем тут документация от etcnet, если веб-интерфейс неправильно сохраняет маску? Могу тогда порекомендовать читать доки тем, кто прорабатывал сохранение настроек PVE в etcnet. С Вашим решением не согласен, прочитайте первый коммендарий, там все описано
Comment 9 Andrew Vasilyev 2020-08-12 18:51:09 MSK
Created attachment 8907 [details]
etcnet-to-network: принимать маску сети в длинном формате

Различать формат маски сети в /etc/net/ifaces/XX/ipv4address, в PVE /etc/network/interfaces пишется в длинном формате, как и раньше. В интерфейсе PVE можно ввести только CIDR формат.
Comment 10 Andrew Vasilyev 2020-08-13 16:46:38 MSK
Created attachment 8908 [details]
pve-common: принимать маску сети из etcnet в любом формате (компактная версия)

Более короткая версия. Чтобы не потерялось.
Comment 11 Kot_Uchoniy 2020-11-10 14:18:30 MSK
Ошибка больше не наблюдается после выхода релиза 9.1