SPAM: [PATCH container 2/3] setup: add support of el10 and implementing NetworkManager instead fo network-scripts

Guillaume 09couplet.bitmap at icloud.com
Sun Aug 24 00:22:57 CEST 2025


Red Hat remove support for network configuration files in the ifcfg format until version 10.

Signed-off-by: Guillaume <09couplet.bitmap at 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




More information about the pve-devel mailing list