1 package PVE
::Network
::SDN
;
9 use PVE
::Network
::SDN
::Vnets
;
10 use PVE
::Network
::SDN
::Zones
;
12 use PVE
::Tools
qw(extract_param dir_glob_regex run_command);
13 use PVE
::Cluster
qw(cfs_read_file cfs_write_file cfs_lock_file);
16 my $version_cfg = "sdn/.version";
18 my $parse_version_cfg = sub {
19 my ($filename, $raw) = @_;
21 return 0 if !defined($raw) || $raw eq '';
23 warn "invalid sdn version '$raw'" if $raw !~ m/\d+$/;
28 my $write_version_cfg = sub {
29 my ($filename, $version) = @_;
31 warn "invalid sdn version" if $version !~ m/\d+$/;
36 PVE
::Cluster
::cfs_register_file
($version_cfg, $parse_version_cfg, $write_version_cfg);
39 # improve me : move status code inside plugins ?
43 my $cmd = ['ifquery', '-a', '-c', '-o','json'];
46 my $reader = sub { $result .= shift };
49 run_command
($cmd, outfunc
=> $reader);
52 my $resultjson = decode_json
($result);
55 foreach my $interface (@$resultjson) {
56 my $name = $interface->{name
};
57 $interfaces->{$name} = {
58 status
=> $interface->{status
},
59 config
=> $interface->{config
},
60 config_status
=> $interface->{config_status
},
69 my ($zone_status, $vnet_status) = PVE
::Network
::SDN
::Zones
::status
();
70 return($zone_status, $vnet_status);
74 sub increase_version
{
76 my $version = cfs_read_file
($version_cfg);
83 cfs_write_file
($version_cfg, $version);
87 my ($code, $errmsg) = @_;
89 cfs_lock_file
($version_cfg, undef, $code);
92 $errmsg ?
die "$errmsg: $err" : die $err;
98 my $rpcenv = PVE
::RPCEnvironment
::get
();
100 my $authuser = $rpcenv->get_user();
102 my $nodename = PVE
::INotify
::nodename
();
104 my $vnets_cfg = PVE
::Network
::SDN
::Vnets
::config
();
105 my $zones_cfg = PVE
::Network
::SDN
::Zones
::config
();
107 my @vnetids = PVE
::Network
::SDN
::Vnets
::sdn_vnets_ids
($vnets_cfg);
111 foreach my $vnetid (@vnetids) {
113 my $vnet = PVE
::Network
::SDN
::Vnets
::sdn_vnets_config
($vnets_cfg, $vnetid);
114 my $zoneid = $vnet->{zone
};
115 my $privs = [ 'SDN.Audit', 'SDN.Allocate' ];
118 next if !$rpcenv->check_any($authuser, "/sdn/zones/$zoneid", $privs, 1);
120 my $zone_config = PVE
::Network
::SDN
::Zones
::sdn_zones_config
($zones_cfg, $zoneid);
122 next if defined($zone_config->{nodes
}) && !$zone_config->{nodes
}->{$nodename};
123 $vnets->{$vnetid} = { type
=> 'vnet', active
=> '1' };
129 sub generate_zone_config
{
130 my $raw_config = PVE
::Network
::SDN
::Zones
::generate_etc_network_config
();
131 PVE
::Network
::SDN
::Zones
::write_etc_network_config
($raw_config);
134 sub generate_controller_config
{
137 my $raw_config = PVE
::Network
::SDN
::Controllers
::generate_controller_config
();
138 PVE
::Network
::SDN
::Controllers
::write_controller_config
($raw_config);
140 PVE
::Network
::SDN
::Controllers
::reload_controller
() if $reload;