]>
git.proxmox.com Git - pve-network.git/blob - PVE/Network/SDN/Subnets.pm
07ef68868a78c01ba0e40af11a86faffd61aa1d0
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, $subnetslist) = @_;
62 my $subnets_cfg = PVE
::Network
::SDN
::Subnets
::config
();
63 my @subnets = PVE
::Tools
::split_list
($subnetslist) if $subnetslist;
68 foreach my $s (@subnets) {
69 my $subnet_matcher = subnet_matcher
($s);
70 next if !$subnet_matcher->($ip);
71 $subnetid = $s =~ s/\//-/r
;
72 $subnet = $subnets_cfg->{ids
}->{$subnetid};
75 die "can't find any subnet for ip $ip" if !$subnet;
77 return ($subnetid, $subnet);
80 my $verify_dns_zone = sub {
81 my ($zone, $dns) = @_;
83 return if !$zone || !$dns;
85 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
86 my $plugin_config = $dns_cfg->{ids
}->{$dns};
87 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
88 $plugin->verify_zone($plugin_config, $zone);
91 my $add_dns_record = sub {
92 my ($zone, $dns, $hostname, $dnszoneprefix, $ip) = @_;
93 return if !$zone || !$dns || !$hostname || !$ip;
95 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
97 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
98 my $plugin_config = $dns_cfg->{ids
}->{$dns};
99 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
100 $plugin->add_a_record($plugin_config, $zone, $hostname, $ip);
104 my $add_dns_ptr_record = sub {
105 my ($reversezone, $zone, $dns, $hostname, $dnszoneprefix, $ip) = @_;
107 return if !$zone || !$reversezone || !$dns || !$hostname || !$ip;
109 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
110 $hostname .= ".$zone";
111 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
112 my $plugin_config = $dns_cfg->{ids
}->{$dns};
113 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
114 $plugin->add_ptr_record($plugin_config, $reversezone, $hostname, $ip);
117 my $del_dns_record = sub {
118 my ($zone, $dns, $hostname, $dnszoneprefix, $ip) = @_;
120 return if !$zone || !$dns || !$hostname || !$ip;
122 $hostname .= ".$dnszoneprefix" if $dnszoneprefix;
124 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
125 my $plugin_config = $dns_cfg->{ids
}->{$dns};
126 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
127 $plugin->del_a_record($plugin_config, $zone, $hostname, $ip);
130 my $del_dns_ptr_record = sub {
131 my ($reversezone, $dns, $ip) = @_;
133 return if !$reversezone || !$dns || !$ip;
135 my $dns_cfg = PVE
::Network
::SDN
::Dns
::config
();
136 my $plugin_config = $dns_cfg->{ids
}->{$dns};
137 my $plugin = PVE
::Network
::SDN
::Dns
::Plugin-
>lookup($plugin_config->{type
});
138 $plugin->del_ptr_record($plugin_config, $reversezone, $ip);
142 my ($subnetid, $subnet, $hostname) = @_;
147 my $ipamid = $subnet->{ipam
};
148 my $dns = $subnet->{dns
};
149 my $dnszone = $subnet->{dnszone
};
150 my $reversedns = $subnet->{reversedns
};
151 my $reversednszone = $subnet->{reversednszone
};
152 my $dnszoneprefix = $subnet->{dnszoneprefix
};
154 #verify dns zones before ipam
155 &$verify_dns_zone($dnszone, $dns);
156 &$verify_dns_zone($reversednszone, $reversedns);
159 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
160 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
161 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
162 $cidr = $plugin->add_next_freeip($plugin_config, $subnetid, $subnet);
163 ($ip, undef) = split(/\//, $cidr);
168 &$add_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip);
170 &$add_dns_ptr_record($reversednszone, $dnszone, $reversedns, $hostname, $dnszoneprefix, $ip);
176 PVE
::Network
::SDN
::Subnets
::del_ip
($subnetid, $subnet, $ip, $hostname)
184 my ($subnetid, $subnet, $ip, $hostname) = @_;
186 my $ipamid = $subnet->{ipam
};
187 my $dns = $subnet->{dns
};
188 my $dnszone = $subnet->{dnszone
};
189 my $reversedns = $subnet->{reversedns
};
190 my $reversednszone = $subnet->{reversednszone
};
191 my $dnszoneprefix = $subnet->{dnszoneprefix
};
193 #verify dns zones before ipam
194 &$verify_dns_zone($dnszone, $dns);
195 &$verify_dns_zone($reversednszone, $reversedns);
198 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
199 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
200 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
201 $plugin->add_ip($plugin_config, $subnetid, $ip);
206 &$add_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip);
208 &$add_dns_ptr_record($reversednszone, $dnszone, $reversedns, $hostname, $dnszoneprefix, $ip);
214 PVE
::Network
::SDN
::Subnets
::del_ip
($subnetid, $subnet, $ip, $hostname)
221 my ($subnetid, $subnet, $ip, $hostname) = @_;
223 my $ipamid = $subnet->{ipam
};
224 my $dns = $subnet->{dns
};
225 my $dnszone = $subnet->{dnszone
};
226 my $reversedns = $subnet->{reversedns
};
227 my $reversednszone = $subnet->{reversednszone
};
228 my $dnszoneprefix = $subnet->{dnszoneprefix
};
230 &$verify_dns_zone($dnszone, $dns);
231 &$verify_dns_zone($reversednszone, $reversedns);
234 my $ipam_cfg = PVE
::Network
::SDN
::Ipams
::config
();
235 my $plugin_config = $ipam_cfg->{ids
}->{$ipamid};
236 my $plugin = PVE
::Network
::SDN
::Ipams
::Plugin-
>lookup($plugin_config->{type
});
237 $plugin->del_ip($plugin_config, $subnetid, $ip);
241 &$del_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip);
242 &$del_dns_ptr_record($reversednszone, $reversedns, $ip);