]> git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN.pm
subnet: disable route option for now and add dns domain format
[pve-network.git] / PVE / Network / SDN.pm
1 package PVE::Network::SDN;
2
3 use strict;
4 use warnings;
5
6 use Data::Dumper;
7 use JSON;
8
9 use PVE::Network::SDN::Vnets;
10 use PVE::Network::SDN::Zones;
11
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);
14
15
16 my $version_cfg = "sdn/.version";
17
18 my $parse_version_cfg = sub {
19 my ($filename, $raw) = @_;
20
21 return 0 if !defined($raw) || $raw eq '';
22
23 warn "invalid sdn version '$raw'" if $raw !~ m/\d+$/;
24
25 return $raw,
26 };
27
28 my $write_version_cfg = sub {
29 my ($filename, $version) = @_;
30
31 warn "invalid sdn version" if $version !~ m/\d+$/;
32
33 return $version;
34 };
35
36 PVE::Cluster::cfs_register_file($version_cfg, $parse_version_cfg, $write_version_cfg);
37
38
39 # improve me : move status code inside plugins ?
40
41 sub ifquery_check {
42
43 my $cmd = ['ifquery', '-a', '-c', '-o','json'];
44
45 my $result = '';
46 my $reader = sub { $result .= shift };
47
48 eval {
49 run_command($cmd, outfunc => $reader);
50 };
51
52 my $resultjson = decode_json($result);
53 my $interfaces = {};
54
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},
61 };
62 }
63
64 return $interfaces;
65 }
66
67 sub status {
68
69 my ($zone_status, $vnet_status) = PVE::Network::SDN::Zones::status();
70 return($zone_status, $vnet_status);
71 }
72
73
74 sub increase_version {
75
76 my $version = cfs_read_file($version_cfg);
77 if ($version) {
78 $version++;
79 } else {
80 $version = 1;
81 }
82
83 cfs_write_file($version_cfg, $version);
84 }
85
86 sub lock_sdn_config {
87 my ($code, $errmsg) = @_;
88
89 cfs_lock_file($version_cfg, undef, $code);
90
91 if (my $err = $@) {
92 $errmsg ? die "$errmsg: $err" : die $err;
93 }
94 }
95
96 sub get_local_vnets {
97
98 my $rpcenv = PVE::RPCEnvironment::get();
99
100 my $authuser = $rpcenv->get_user();
101
102 my $nodename = PVE::INotify::nodename();
103
104 my $vnets_cfg = PVE::Network::SDN::Vnets::config();
105 my $zones_cfg = PVE::Network::SDN::Zones::config();
106
107 my @vnetids = PVE::Network::SDN::Vnets::sdn_vnets_ids($vnets_cfg);
108
109 my $vnets = {};
110
111 foreach my $vnetid (@vnetids) {
112
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' ];
116
117 next if !$zoneid;
118 next if !$rpcenv->check_any($authuser, "/sdn/zones/$zoneid", $privs, 1);
119
120 my $zone_config = PVE::Network::SDN::Zones::sdn_zones_config($zones_cfg, $zoneid);
121
122 next if defined($zone_config->{nodes}) && !$zone_config->{nodes}->{$nodename};
123 $vnets->{$vnetid} = { type => 'vnet', active => '1' };
124 }
125
126 return $vnets;
127 }
128
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);
132 }
133
134 sub generate_controller_config {
135 my ($reload) = @_;
136
137 my $raw_config = PVE::Network::SDN::Controllers::generate_controller_config();
138 PVE::Network::SDN::Controllers::write_controller_config($raw_config);
139
140 PVE::Network::SDN::Controllers::reload_controller() if $reload;
141 }
142
143 1;
144