From: Guillaume via pve-devel <pve-devel@lists.proxmox.com>
To: pve-devel@lists.proxmox.com
Cc: Guillaume <09couplet.bitmap@icloud.com>
Subject: [pve-devel] [PATCH container v2 2/4] setup: add support of el10 and implementing NetworkManager instead fo network-scripts
Date: Mon, 1 Sep 2025 18:20:34 +0200 [thread overview]
Message-ID: <mailman.102.1756744126.418.pve-devel@lists.proxmox.com> (raw)
In-Reply-To: <20250901162036.2651-1-09couplet.bitmap@icloud.com>
[-- Attachment #1: Type: message/rfc822, Size: 9866 bytes --]
From: Guillaume <09couplet.bitmap@icloud.com>
To: pve-devel@lists.proxmox.com
Cc: Guillaume <09couplet.bitmap@icloud.com>
Subject: [PATCH container v2 2/4] setup: add support of el10 and implementing NetworkManager instead fo network-scripts
Date: Mon, 1 Sep 2025 18:20:34 +0200
Message-ID: <20250901162036.2651-3-09couplet.bitmap@icloud.com>
Red Hat remove support for network configuration files in the ifcfg format until version 10.
Signed-off-by: Guillaume <09couplet.bitmap@icloud.com>
---
src/PVE/LXC/Setup/CentOS.pm | 108 +++++++++++++++++++++++++++++++++---
1 file changed, 101 insertions(+), 7 deletions(-)
diff --git a/src/PVE/LXC/Setup/CentOS.pm b/src/PVE/LXC/Setup/CentOS.pm
index 446b49b..06b4dac 100644
--- a/src/PVE/LXC/Setup/CentOS.pm
+++ b/src/PVE/LXC/Setup/CentOS.pm
@@ -4,6 +4,7 @@ use strict;
use warnings;
use UUID;
+use Net::IP;
use PVE::Tools;
use PVE::Network;
@@ -19,16 +20,13 @@ sub new {
my $release = PVE::Tools::file_read_firstline("$rootdir/etc/redhat-release");
die "unable to read version info\n" if !defined($release);
- my $version;
+ my $version = get_centos_version($release);
- if (($release =~ m/release\s+(\d+\.\d+)(\.\d+)?/) || ($release =~ m/release\s+(\d+)/)) {
- if ($1 >= 5 && $1 < 10) {
- $version = $1;
- }
+ # check compatibility
+ if (!($version >= 5 && $version < 11)) {
+ die "unsupported centos version '$version'\n";
}
- die "unsupported centos release '$release'\n" if !$version;
-
my $self = { conf => $conf, rootdir => $rootdir, version => $version };
$conf->{ostype} = "centos";
@@ -36,6 +34,16 @@ sub new {
return bless $self, $class;
}
+sub get_centos_version {
+ my ($release) = @_;
+
+ if (($release =~ m/release\s+(\d+\.\d+)(\.\d+)?/) || ($release =~ m/release\s+(\d+)/)) {
+ return $1;
+ }
+
+ die "unable to parse centos version '$release'\n";
+}
+
my $tty_conf = <<__EOD__;
# tty - getty
#
@@ -182,6 +190,92 @@ sub set_hostname {
sub setup_network {
my ($self, $conf) = @_;
+ my $release = $self->ct_file_get_contents('/etc/redhat-release');
+ my $version = get_centos_version($release);
+
+ if ($version >= 10) {
+ # Use NetworkManager files
+ setup_netork_with_networkmanager($self, $conf)
+ } else {
+ # Use network-scripts files
+ setup_netork_with_network_scripts($self, $conf)
+ }
+}
+
+sub setup_netork_with_networkmanager {
+ my ($self, $conf) = @_;
+
+ $self->ct_make_path('/etc/NetworkManager/system-connections');
+
+ foreach my $k (keys %$conf) {
+ next if $k !~ m/^net(\d+)$/;
+ my $d = PVE::LXC::Config->parse_lxc_network($conf->{$k});
+ next if !$d->{name};
+
+ my $filename = "/etc/NetworkManager/system-connections/$d->{name}.nmconnection";
+
+ my ($searchdomains, $nameserver) = $self->lookup_dns_conf($conf);
+ my @nameservers = PVE::Tools::split_list($nameserver);
+ my @nameserversv4 = grep {
+ my $ip = Net::IP->new($_);
+ $ip && $ip->version == 4;
+ } @nameservers;
+ my @nameserversv6 = grep {
+ my $ip = Net::IP->new($_);
+ $ip && $ip->version == 6;
+ } @nameservers;
+
+
+ my $header = "[connection]\nid=$d->{name}\nuuid=" . UUID::uuid() . "\ntype=ethernet\ninterface-name=$d->{name}\n";
+ my $data = '';
+
+ if ($d->{ip} && $d->{ip} ne 'manual') {
+ $data .= "[ipv4]\n";
+ if ($d->{ip} eq 'dhcp') {
+ $data .= "method=auto\n";
+ } else {
+ $data .= "method=manual\n";
+ $data .= "addresses=$d->{ip}\n";
+ if (defined($d->{gw})) {
+ $data .= "gateway=$d->{gw}\n";
+ if (!PVE::Network::is_ip_in_cidr($d->{gw}, $d->{ip}, 4)) {
+ $data .= "routes=$d->{gw}\n";
+ }
+ }
+ }
+ $data .= "dns=" . join(',', @nameserversv4) . "\n" if @nameserversv4;
+ $data .= "dns-search=" . join(' ', PVE::Tools::split_list($searchdomains)) . "\n" if @nameserversv4 && $searchdomains;
+ }
+
+ if ($d->{ip6} && $d->{ip6} ne 'manual') {
+ $data .= "[ipv6]\n";
+ if ($d->{ip6} eq 'auto' || $d->{ip6} eq 'dhcp') {
+ $data .= "method=auto\n";
+ } else {
+ $data .= "method=manual\naddress=$d->{ip6}\n";
+ if (defined($d->{gw6})) {
+ if (
+ !PVE::Network::is_ip_in_cidr($d->{gw6}, $d->{ip6}, 6)
+ && !PVE::Network::is_ip_in_cidr($d->{gw6}, 'fe80::/10', 6)
+ ) {
+ $data .= "routes=$d->{gw6}\n";
+ } else {
+ $data .= "gateway=$d->{gw6}\n";
+ }
+ }
+ }
+ $data .= "dns=" . join(',', @nameserversv6) . "\n" if @nameserversv6;
+ $data .= "dns-search=" . join(' ', PVE::Tools::split_list($searchdomains)) . "\n" if @nameserversv6 && $searchdomains;
+ }
+
+ next unless $data;
+ $self->ct_file_set_contents($filename, $header . $data, 0600);
+ }
+}
+
+sub setup_netork_with_network_scripts {
+ my ($self, $conf) = @_;
+
my ($gw, $gw6);
$self->ct_make_path('/etc/sysconfig/network-scripts');
--
2.47.2
[-- Attachment #2: Type: text/plain, Size: 160 bytes --]
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-09-01 16:28 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20250901162036.2651-1-09couplet.bitmap@icloud.com>
2025-09-01 16:20 ` [pve-devel] SPAM: [PATCH container v2 1/4] setup: add underscore in regex to parse systemd version Guillaume via pve-devel
2025-09-01 16:20 ` Guillaume via pve-devel [this message]
2025-09-01 16:20 ` [pve-devel] SPAM: [PATCH container v2 3/4] tests: add tests for centos 10 Guillaume via pve-devel
2025-09-01 16:20 ` [pve-devel] [PATCH container v2 4/4] setup: disabled ipv4 or ipv6 if not used in NetworkManager files Guillaume via pve-devel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=mailman.102.1756744126.418.pve-devel@lists.proxmox.com \
--to=pve-devel@lists.proxmox.com \
--cc=09couplet.bitmap@icloud.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.