[pve-devel] [RFC pve-container 2/4] centos: deal with gateways outside the subnet

Wolfgang Bumiller w.bumiller at proxmox.com
Fri Oct 16 15:57:11 CEST 2015


---
 src/PVE/LXC/Setup/Redhat.pm | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/src/PVE/LXC/Setup/Redhat.pm b/src/PVE/LXC/Setup/Redhat.pm
index c15673a..095507a 100644
--- a/src/PVE/LXC/Setup/Redhat.pm
+++ b/src/PVE/LXC/Setup/Redhat.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 use Data::Dumper;
 use PVE::Tools;
+use PVE::Network;
 use PVE::LXC;
 
 use PVE::LXC::Setup::Base;
@@ -195,6 +196,8 @@ sub setup_network {
 	next if !$d->{name};
 
 	my $filename = "/etc/sysconfig/network-scripts/ifcfg-$d->{name}";
+	my $routefile = "/etc/sysconfig/network-scripts/route-$d->{name}";
+	my $routes = '';
 	my $had_v4 = 0;
 
 	if ($d->{ip} && $d->{ip} ne 'manual') {
@@ -212,6 +215,10 @@ sub setup_network {
 		}
 	    }
 	    $self->ct_file_set_contents($filename, $data);
+	    if (!PVE::Network::is_ip_in_cidr($d->{gw}, $d->{ip}, 4)) {
+		$routes .= "$d->{gw} dev $d->{name}\n";
+		$routes .= "default via $d->{gw}\n";
+	    }
 	    # If we also have an IPv6 configuration it'll end up in an alias
 	    # interface becuase otherwise RH doesn't support mixing dhcpv4 with
 	    # a static ipv6 address.
@@ -241,6 +248,29 @@ sub setup_network {
 		}
 	    }
 	    $self->ct_file_set_contents($filename, $data);
+	    if (!PVE::Network::is_ip_in_cidr($d->{gw6}, $d->{ip6}, 6)) {
+		$routes .= "$d->{gw6} dev $d->{name}\n";
+		$routes .= "default via $d->{gw6}\n";
+	    }
+	}
+
+	# To keep user-defined routes in route-$iface we mark ours:
+	my $head = "# --- BEGIN PVE ROUTES ---\n";
+	my $tail = "# --- END PVE ROUTES ---\n";
+	$routes = $head . $routes . $tail if $routes;
+	if ($self->ct_file_exists($routefile)) {
+	    # if it exists we update by first removing our old rules
+	    my $old = $self->ct_file_get_contents($routefile);
+	    $old =~ s/(?:^|(?<=\n))\Q$head\E.*\Q$tail\E//gs;
+	    chomp $old;
+	    if ($old) {
+		$self->ct_file_set_contents($routefile, $routes . $old . "\n");
+	    } else {
+		# or delete if we aren't adding routes and the file's now empty
+		$self->ct_unlink($routefile);
+	    }
+	} elsif ($routes) {
+	    $self->ct_file_set_contents($routefile, $routes);
 	}
     }
 }
-- 
2.1.4




More information about the pve-devel mailing list