generate /etc/network/interfaces.d/vnet

reloading is not yet implemented

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 test/generateconfig.pl | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 95 insertions(+)
 create mode 100644 test/generateconfig.pl

diff --git a/test/generateconfig.pl b/test/generateconfig.pl
new file mode 100644
index 0000000..afc8fa8
--- /dev/null
+++ b/test/generateconfig.pl
@@ -0,0 +1,95 @@
+use strict;
+use warnings;
+use File::Copy;
+use PVE::Cluster qw(cfs_read_file);
+
+use PVE::Network::Vnet;
+use PVE::Network::Plugin;
+use PVE::Network::VlanPlugin;
+use PVE::Network::VxlanMulticastPlugin;
+
+PVE::Network::VlanPlugin->register();
+PVE::Network::VxlanMulticastPlugin->register();
+PVE::Network::Plugin->init();
+
+
+my $rawconfig = generate_network_config();
+verify_merged_config($rawconfig);
+write_final_config($rawconfig);
+print $rawconfig;
+
+sub generate_network_config {
+
+     #only support ifupdown2
+    die "you need ifupdown2 to reload networking\n" if !-e 
'/usr/share/ifupdown2';
+
+     #read main config for physical interfaces
+     my $current_config_file = "/etc/network/interfaces";
+     my $fh = IO::File->new($current_config_file);
+     my $interfaces_config = PVE::INotify::read_etc_network_interfaces(1,$fh);
+     $fh->close();
+
+     #check uplinks
+     my $uplinks = {};
+     foreach my $id (keys %{$interfaces_config->{ifaces}}) {
+        my $interface = $interfaces_config->{ifaces}->{$id};
+       if (my $uplink = $interface->{'uplink-id'}) {
+               die "uplink-id $uplink is already defined on 
$uplinks->{$uplink}" if $uplinks->{$uplink};
+               $uplinks->{$interface->{'uplink-id'}} = $id;
+       }
+     }
+
+      my $vnet_cfg = PVE::Cluster::cfs_read_file('network/vnet.cfg');
+      my $transport_cfg = 
PVE::Cluster::cfs_read_file('network/transports.cfg');
+
+       #generate configuration
+       my $rawconfig = "";
+       foreach my $id (keys %{$vnet_cfg->{ids}}) {
+            my $vnet = $vnet_cfg->{ids}->{$id};
+            my $zone = $vnet->{transportzone};
+
+            my $plugin_config = $transport_cfg->{ids}->{$zone};
+            die "zone $zone don't exist" if !defined($plugin_config);
+             my $plugin = PVE::Network::Plugin->lookup($plugin_config->{type});
+             $rawconfig .= $plugin->generate_network_config($plugin_config, 
$zone, $id, $vnet, $interfaces_config, $uplinks);
+        }
+
+return $rawconfig;
+}
+
+#implement reload (split and reuse code from API2/Network.pm for bridge delete 
verification)
+
+sub verify_merged_config {
+    my ($rawconfig) = @_;
+
+       #merge main network intefaces and vnet file for possible conflict 
verification
+       my $tmp_merged_network_interfaces = 
"/var/tmp/pve-merged_network_interfaces";
+       copy("/etc/network/interfaces", $tmp_merged_network_interfaces);
+
+       my $writefh = IO::File->new($tmp_merged_network_interfaces, '>>');
+       print $writefh $rawconfig;
+       $writefh->close();
+
+       my $readfh = IO::File->new($tmp_merged_network_interfaces);
+       my $merged_interfaces_config = 
PVE::INotify::read_etc_network_interfaces(1,$readfh);
+       $readfh->close();
+       unlink $tmp_merged_network_interfaces;
+       PVE::INotify::__write_etc_network_interfaces($merged_interfaces_config, 
1);
+
+}
+
+sub write_final_config {
+    my ($rawconfig) = @_;
+       #now write final separate filename
+       my $tmp_file = "/var/tmp/pve-vnet.cfg";
+
+       my $vnet_interfaces_file = "/etc/network/interfaces.d/vnet";
+
+       my $writefh = IO::File->new($vnet_interfaces_file,">");
+       print $writefh $rawconfig;
+       $writefh->close();
+}
+
+
+
+
-- 
2.11.0

_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to