]>
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);
7 use PVE
::Cluster
qw(cfs_read_file cfs_write_file cfs_lock_file);
10 use PVE
::Network
::SDN
::Ipams
;
11 use PVE
::Network
::SDN
::Dns
;
12 use PVE
::Network
::SDN
::SubnetPlugin
;
13 PVE
::Network
::SDN
::SubnetPlugin-
>register();
14 PVE
::Network
::SDN
::SubnetPlugin-
>init();
16 sub sdn_subnets_config
{
17 my ($cfg, $id, $noerr) = @_;
19 die "no sdn subnet ID specified\n" if !$id;
21 my $scfg = $cfg->{ids
}->{$id};
22 die "sdn subnet '$id' does not exist\n" if (!$noerr && !$scfg);
28 my $config = cfs_read_file
("sdn/subnets.cfg");
34 cfs_write_file
("sdn/subnets.cfg", $cfg);
40 return keys %{$cfg->{ids
}};
43 sub complete_sdn_subnet
{
44 my ($cmdname, $pname, $cvalue) = @_;
46 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
48 return $cmdname eq 'add' ?
[] : [ PVE
::Network
::SDN
::Subnets
::sdn_subnets_ids
($cfg) ];
54 my $cfg = PVE
::Network
::SDN
::Subnets
::config
();
55 my $subnet = PVE
::Network
::SDN
::Subnets
::sdn_subnets_config
($cfg, $subnetid, 1);
60 my ($ip, $subnets) = @_;
65 foreach my $id (sort keys %{$subnets}) {
66 my $cidr = $id =~ s/-/\//r
;
67 my $subnet_matcher = subnet_matcher
($cidr);
68 next if !$subnet_matcher->($ip);
69 $subnet = $subnets->{$id};
73 die "can't find any subnet for ip $ip" if !$subnet;
75 return ($subnetid, $subnet);
78 my $verify_dns_zone = sub {
79 my ($zone, $dns) = @_;
81 return if !$zone || !$dns;
83 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
84 my $plugin_config = $dns_cfg->{ids
}->{$dns};
85 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
86 $plugin->verify_zone($plugin_config, $zone);
89 my $add_dns_record = sub {
90 my ($zone, $dns, $hostname, $dnszoneprefix, $ip) = @_;
91 return if !$zone || !$dns || !$hostname || !$ip;
93 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
95 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
96 my $plugin_config = $dns_cfg->{ids
}->{$dns};
97 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
98 $plugin->add_a_record($plugin_config, $zone, $hostname, $ip);
102 my $add_dns_ptr_record = sub {
103 my ($reversezone, $zone, $dns, $hostname, $dnszoneprefix, $ip) = @_;
105 return if !$zone || !$reversezone || !$dns || !$hostname || !$ip;
107 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
108 $hostname .= ".$zone";
109 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
110 my $plugin_config = $dns_cfg->{ids
}->{$dns};
111 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
112 $plugin->add_ptr_record($plugin_config, $reversezone, $hostname, $ip);
115 my $del_dns_record = sub {
116 my ($zone, $dns, $hostname, $dnszoneprefix, $ip) = @_;
118 return if !$zone || !$dns || !$hostname || !$ip;
120 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
122 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
123 my $plugin_config = $dns_cfg->{ids
}->{$dns};
124 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
125 $plugin->del_a_record($plugin_config, $zone, $hostname, $ip);
128 my $del_dns_ptr_record = sub {
129 my ($reversezone, $dns, $ip) = @_;
131 return if !$reversezone || !$dns || !$ip;
133 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
134 my $plugin_config = $dns_cfg->{ids
}->{$dns};
135 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
136 $plugin->del_ptr_record($plugin_config, $reversezone, $ip);
140 my ($subnetid, $subnet, $hostname) = @_;
145 my $ipamid = $subnet->{ipam
};
146 my $dns = $subnet->{dns
};
147 my $dnszone = $subnet->{dnszone
};
148 my $reversedns = $subnet->{reversedns
};
149 my $reversednszone = $subnet->{reversednszone
};
150 my $dnszoneprefix = $subnet->{dnszoneprefix
};
152 #verify dns zones before ipam
153 &$verify_dns_zone($dnszone, $dns);
154 &$verify_dns_zone($reversednszone, $reversedns);
157 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
158 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
159 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
161 $cidr = $plugin->add_next_freeip($plugin_config, $subnetid, $subnet);
162 ($ip, undef) = split(/\//, $cidr);
169 &$add_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip);
171 &$add_dns_ptr_record($reversednszone, $dnszone, $reversedns, $hostname, $dnszoneprefix, $ip);
177 PVE
::Network
::SDN
::Subnets
::del_ip
($subnetid, $subnet, $ip, $hostname)
185 my ($subnetid, $subnet, $ip, $hostname) = @_;
189 my $ipamid = $subnet->{ipam
};
190 my $dns = $subnet->{dns
};
191 my $dnszone = $subnet->{dnszone
};
192 my $reversedns = $subnet->{reversedns
};
193 my $reversednszone = $subnet->{reversednszone
};
194 my $dnszoneprefix = $subnet->{dnszoneprefix
};
196 #verify dns zones before ipam
197 &$verify_dns_zone($dnszone, $dns);
198 &$verify_dns_zone($reversednszone, $reversedns);
201 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
202 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
203 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
205 $plugin->add_ip($plugin_config, $subnetid, $ip);
212 &$add_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip);
214 &$add_dns_ptr_record($reversednszone, $dnszone, $reversedns, $hostname, $dnszoneprefix, $ip);
220 PVE
::Network
::SDN
::Subnets
::del_ip
($subnetid, $subnet, $ip, $hostname)
227 my ($subnetid, $subnet, $ip, $hostname) = @_;
231 my $ipamid = $subnet->{ipam
};
232 my $dns = $subnet->{dns
};
233 my $dnszone = $subnet->{dnszone
};
234 my $reversedns = $subnet->{reversedns
};
235 my $reversednszone = $subnet->{reversednszone
};
236 my $dnszoneprefix = $subnet->{dnszoneprefix
};
238 &$verify_dns_zone($dnszone, $dns);
239 &$verify_dns_zone($reversednszone, $reversedns);
242 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
243 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
244 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
245 $plugin->del_ip($plugin_config, $subnetid, $ip);
249 &$del_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip);
250 &$del_dns_ptr_record($reversednszone, $reversedns, $ip);