4 use PVE
::Cluster
qw(cfs_read_file);
6 use PVE
::Network
::SDN
::Plugin
;
7 use PVE
::Network
::SDN
::VnetPlugin
;
8 use PVE
::Network
::SDN
::VlanPlugin
;
9 use PVE
::Network
::SDN
::VxlanMulticastPlugin
;
11 PVE
::Network
::SDN
::VnetPlugin-
>register();
12 PVE
::Network
::SDN
::VlanPlugin-
>register();
13 PVE
::Network
::SDN
::VxlanMulticastPlugin-
>register();
14 PVE
::Network
::SDN
::Plugin-
>init();
17 my $rawconfig = generate_sdn_config
();
19 write_final_config
($rawconfig);
21 sub generate_sdn_config
{
23 #only support ifupdown2
24 die "you need ifupdown2 to reload networking\n" if !-e
'/usr/share/ifupdown2';
26 #read main config for physical interfaces
27 my $current_config_file = "/etc/network/interfaces";
28 my $fh = IO
::File-
>new($current_config_file);
29 my $interfaces_config = PVE
::INotify
::read_etc_network_interfaces
(1,$fh);
34 foreach my $id (keys %{$interfaces_config->{ifaces
}}) {
35 my $interface = $interfaces_config->{ifaces
}->{$id};
36 if (my $uplink = $interface->{'uplink-id'}) {
37 die "uplink-id $uplink is already defined on $uplinks->{$uplink}" if $uplinks->{$uplink};
38 $interface->{name
} = $id;
39 $uplinks->{$interface->{'uplink-id'}} = $interface;
43 my $sdn_cfg = PVE
::Cluster
::cfs_read_file
('sdn.cfg');
45 my $transport_cfg = undef;
47 foreach my $id (keys %{$sdn_cfg->{ids
}}) {
48 if ($sdn_cfg->{ids
}->{$id}->{type
} eq 'vnet') {
49 $vnet_cfg->{ids
}->{$id} = $sdn_cfg->{ids
}->{$id};
51 $transport_cfg->{ids
}->{$id} = $sdn_cfg->{ids
}->{$id};
55 #generate configuration
57 foreach my $id (keys %{$vnet_cfg->{ids
}}) {
58 my $vnet = $vnet_cfg->{ids
}->{$id};
59 my $zone = $vnet->{transportzone
};
61 die "zone $zone don't exist" if !$zone;
62 my $plugin_config = $transport_cfg->{ids
}->{$zone};
63 die "zone $zone don't exist" if !defined($plugin_config);
64 my $plugin = PVE
::Network
::SDN
::Plugin-
>lookup($plugin_config->{type
});
65 $rawconfig .= $plugin->generate_sdn_config($plugin_config, $zone, $id, $vnet, $uplinks);
72 sub write_final_config
{
74 #now write final separate filename
75 my $tmp_file = "/var/tmp/pve-vnet.cfg";
77 my $vnet_interfaces_file = "/etc/network/interfaces.d/vnet";
79 my $writefh = IO
::File-
>new($vnet_interfaces_file,">");
80 print $writefh $rawconfig;