]>
git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Subnets.pm
1 package PVE
::Network
::SDN
::Subnets
;
6 use Net
::Subnet
qw(subnet_matcher);
8 use NetAddr
::IP
qw(:lower);
10 use PVE
::Cluster
qw(cfs_read_file cfs_write_file cfs_lock_file);
11 use PVE
::Network
::SDN
::Dns
;
12 use PVE
::Network
::SDN
::Ipams
;
14 use PVE
::Network
::SDN
::SubnetPlugin
;
15 PVE
::Network
::SDN
::SubnetPlugin-
>register();
16 PVE
::Network
::SDN
::SubnetPlugin-
>init();
18 sub sdn_subnets_config
{
19 my ($cfg, $id, $noerr) = @_;
21 die "no sdn subnet ID specified\n" if !$id;
23 my $scfg = $cfg->{ids
}->{$id};
24 die "sdn subnet '$id' does not exist\n" if (!$noerr && !$scfg);
27 my ($zone, $network, $mask) = split(/-/, $id);
28 $scfg->{cidr
} = "$network/$mask";
29 $scfg->{zone
} = $zone;
30 $scfg->{network
} = $network;
31 $scfg->{mask
} = $mask;
38 my $config = cfs_read_file
("sdn/subnets.cfg");
44 cfs_write_file
("sdn/subnets.cfg", $cfg);
50 return sort keys %{$cfg->{ids
}};
53 sub complete_sdn_subnet
{
54 my ($cmdname, $pname, $cvalue) = @_;
56 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
58 return $cmdname eq 'add' ?
[] : [ PVE
::Network
::SDN
::Subnets
::sdn_subnets_ids
($cfg) ];
62 my ($subnetid, $running) = @_;
66 my $cfg = PVE
::Network
::SDN
::running_config
();
67 $cfg = $cfg->{subnets
};
69 $cfg = PVE
::Network
::SDN
::Subnets
::config
();
72 my $subnet = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $subnetid, 1);
77 my ($ip, $mask, $subnets) = @_;
82 foreach my $id (sort keys %{$subnets}) {
84 next if $mask ne $subnets->{$id}->{mask
};
85 my $cidr = $subnets->{$id}->{cidr
};
86 my $subnet_matcher = subnet_matcher
($cidr);
87 next if !$subnet_matcher->($ip);
88 $subnet = $subnets->{$id};
92 die "can't find any subnet for ip $ip" if !$subnet;
94 return ($subnetid, $subnet);
98 my ($zone, $dns) = @_;
100 return if !$zone || !$dns;
102 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
103 my $plugin_config = $dns_cfg->{ids
}->{$dns};
104 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
105 $plugin->verify_zone($plugin_config, $zone);
108 sub get_reversedns_zone
{
109 my ($subnetid, $subnet, $dns, $ip) = @_;
111 return if !$subnetid || !$dns || !$ip;
113 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
114 my $plugin_config = $dns_cfg->{ids
}->{$dns};
115 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
116 $plugin->get_reversedns_zone($plugin_config, $subnetid, $subnet, $ip);
120 my ($zone, $dns, $hostname, $ip) = @_;
121 return if !$zone || !$dns || !$hostname || !$ip;
123 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
124 my $plugin_config = $dns_cfg->{ids
}->{$dns};
125 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
126 $plugin->add_a_record($plugin_config, $zone, $hostname, $ip);
130 sub add_dns_ptr_record
{
131 my ($reversezone, $zone, $dns, $hostname, $ip) = @_;
133 return if !$zone || !$reversezone || !$dns || !$hostname || !$ip;
135 $hostname .= ".$zone";
136 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
137 my $plugin_config = $dns_cfg->{ids
}->{$dns};
138 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
139 $plugin->add_ptr_record($plugin_config, $reversezone, $hostname, $ip);
143 my ($zone, $dns, $hostname, $ip) = @_;
145 return if !$zone || !$dns || !$hostname || !$ip;
147 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
148 my $plugin_config = $dns_cfg->{ids
}->{$dns};
149 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
150 $plugin->del_a_record($plugin_config, $zone, $hostname, $ip);
153 sub del_dns_ptr_record
{
154 my ($reversezone, $dns, $ip) = @_;
156 return if !$reversezone || !$dns || !$ip;
158 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
159 my $plugin_config = $dns_cfg->{ids
}->{$dns};
160 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
161 $plugin->del_ptr_record($plugin_config, $reversezone, $ip);
165 my ($zone, $subnetid, $subnet) = @_;
167 my $ipam = $zone->{ipam
};
169 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
170 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
171 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
172 $plugin->add_subnet($plugin_config, $subnetid, $subnet);
176 my ($zone, $subnetid, $subnet) = @_;
178 my $ipam = $zone->{ipam
};
180 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
181 my $plugin_config = $ipam_cfg->{ids
}->{$ipam};
182 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
183 $plugin->del_subnet($plugin_config, $subnetid, $subnet);
187 my ($zone, $subnetid, $subnet, $hostname, $mac, $description, $skipdns) = @_;
191 $description = '' if !$description;
193 my $ipamid = $zone->{ipam
};
194 my $dns = $zone->{dns
};
195 my $dnszone = $zone->{dnszone
};
196 my $reversedns = $zone->{reversedns
};
197 my $dnszoneprefix = $subnet->{dnszoneprefix
};
199 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
201 #verify dns zones before ipam
202 verify_dns_zone
($dnszone, $dns) if !$skipdns;
205 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
206 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
207 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
209 $cidr = $plugin->add_next_freeip($plugin_config, $subnetid, $subnet, $hostname, $mac, $description);
210 ($ip, undef) = split(/\//, $cidr);
216 my $reversednszone = get_reversedns_zone
($subnetid, $subnet, $reversedns, $ip);
220 add_dns_record
($dnszone, $dns, $hostname, $ip);
222 add_dns_ptr_record
($reversednszone, $dnszone, $reversedns, $hostname, $ip);
229 PVE
::Network
::SDN
::Subnets
::del_ip
($zone, $subnetid, $subnet, $ip, $hostname)
237 my ($zone, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway, $skipdns) = @_;
239 return if !$subnet || !$ip;
241 my $ipaddr = NetAddr
::IP-
>new($ip);
242 $ip = $ipaddr->canon();
244 my $ipamid = $zone->{ipam
};
245 my $dns = $zone->{dns
};
246 my $dnszone = $zone->{dnszone
};
247 my $reversedns = $zone->{reversedns
};
248 my $reversednszone = get_reversedns_zone
($subnetid, $subnet, $reversedns, $ip);
249 my $dnszoneprefix = $subnet->{dnszoneprefix
};
251 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
253 #verify dns zones before ipam
255 verify_dns_zone
($dnszone, $dns);
256 verify_dns_zone
($reversednszone, $reversedns);
261 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
262 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
263 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
266 $plugin->add_ip($plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $description, $is_gateway);
274 add_dns_record
($dnszone, $dns, $hostname, $ip);
276 add_dns_ptr_record
($reversednszone, $dnszone, $reversedns, $hostname, $ip);
283 PVE
::Network
::SDN
::Subnets
::del_ip
($zone, $subnetid, $subnet, $ip, $hostname)
290 my ($zone, $subnetid, $subnet, $ip, $hostname, $oldhostname, $mac, $description, $skipdns) = @_;
292 return if !$subnet || !$ip;
294 my $ipaddr = NetAddr
::IP-
>new($ip);
295 $ip = $ipaddr->canon();
297 my $ipamid = $zone->{ipam
};
298 my $dns = $zone->{dns
};
299 my $dnszone = $zone->{dnszone
};
300 my $reversedns = $zone->{reversedns
};
301 my $reversednszone = get_reversedns_zone
($subnetid, $subnet, $reversedns, $ip);
302 my $dnszoneprefix = $subnet->{dnszoneprefix
};
304 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
306 #verify dns zones before ipam
308 verify_dns_zone
($dnszone, $dns);
309 verify_dns_zone
($reversednszone, $reversedns);
313 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
314 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
315 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
317 $plugin->update_ip($plugin_config, $subnetid, $subnet, $ip, $hostname, $mac, $description);
322 return if $hostname eq $oldhostname;
327 del_dns_record
($dnszone, $dns, $oldhostname, $ip);
328 add_dns_record
($dnszone, $dns, $hostname, $ip);
330 del_dns_ptr_record
($reversednszone, $reversedns, $ip);
331 add_dns_ptr_record
($reversednszone, $dnszone, $reversedns, $hostname, $ip);
337 my ($zone, $subnetid, $subnet, $ip, $hostname, $skipdns) = @_;
339 return if !$subnet || !$ip;
341 my $ipaddr = NetAddr
::IP-
>new($ip);
342 $ip = $ipaddr->canon();
344 my $ipamid = $zone->{ipam
};
345 my $dns = $zone->{dns
};
346 my $dnszone = $zone->{dnszone
};
347 my $reversedns = $zone->{reversedns
};
348 my $reversednszone = get_reversedns_zone
($subnetid, $subnet, $reversedns, $ip);
349 my $dnszoneprefix = $subnet->{dnszoneprefix
};
350 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
353 verify_dns_zone
($dnszone, $dns);
354 verify_dns_zone
($reversednszone, $reversedns);
358 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
359 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
360 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
361 $plugin->del_ip($plugin_config, $subnetid, $subnet, $ip);
366 del_dns_record
($dnszone, $dns, $hostname, $ip);
367 del_dns_ptr_record
($reversednszone, $reversedns, $ip);