]>
Commit | Line | Data |
---|---|---|
86d22462 | 1 | package PVE::Network::SDN; |
92b6f291 AD |
2 | |
3 | use strict; | |
4 | use warnings; | |
434125ce | 5 | |
92b6f291 | 6 | use Data::Dumper; |
c665cefc | 7 | use JSON; |
434125ce | 8 | |
7129a3ca | 9 | use PVE::Network::SDN::Vnets; |
f5eabba0 AD |
10 | use PVE::Network::SDN::Zones; |
11 | ||
434125ce | 12 | use PVE::Tools qw(extract_param dir_glob_regex run_command); |
92b6f291 | 13 | use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file); |
92b6f291 | 14 | |
f9bc9640 AD |
15 | |
16 | my $version_cfg = "sdn/.version"; | |
17 | ||
18 | my $parse_version_cfg = sub { | |
19 | my ($filename, $raw) = @_; | |
20 | ||
28664c9b TL |
21 | return 0 if !defined($raw) || $raw eq ''; |
22 | ||
23 | warn "invalid sdn version '$raw'" if $raw !~ m/\d+$/; | |
f9bc9640 AD |
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 | ||
f5eabba0 | 39 | # improve me : move status code inside plugins ? |
92b6f291 | 40 | |
e424c7ac | 41 | sub ifquery_check { |
c665cefc AD |
42 | |
43 | my $cmd = ['ifquery', '-a', '-c', '-o','json']; | |
c665cefc | 44 | |
0c5021ad TL |
45 | my $result = ''; |
46 | my $reader = sub { $result .= shift }; | |
c665cefc AD |
47 | |
48 | eval { | |
6e9fff39 | 49 | run_command($cmd, outfunc => $reader); |
c665cefc AD |
50 | }; |
51 | ||
6e9fff39 | 52 | my $resultjson = decode_json($result); |
c665cefc AD |
53 | my $interfaces = {}; |
54 | ||
55 | foreach my $interface (@$resultjson) { | |
6e9fff39 AD |
56 | my $name = $interface->{name}; |
57 | $interfaces->{$name} = { | |
58 | status => $interface->{status}, | |
59 | config => $interface->{config}, | |
60 | config_status => $interface->{config_status}, | |
61 | }; | |
c665cefc AD |
62 | } |
63 | ||
64 | return $interfaces; | |
65 | } | |
66 | ||
e424c7ac AD |
67 | sub status { |
68 | ||
56cdcac9 AD |
69 | my ($zone_status, $vnet_status) = PVE::Network::SDN::Zones::status(); |
70 | return($zone_status, $vnet_status); | |
e424c7ac AD |
71 | } |
72 | ||
f9bc9640 AD |
73 | |
74 | sub increase_version { | |
75 | ||
76 | my $version = cfs_read_file($version_cfg); | |
22b24447 | 77 | if ($version) { |
f9bc9640 AD |
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 | ||
7129a3ca AD |
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 | ||
22b24447 TL |
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 | ||
e424c7ac | 143 | 1; |
80348b2d | 144 |