diff options
| author | Alexandre Derumier <aderumier@odiso.com> | 2020-10-05 17:08:52 +0200 |
|---|---|---|
| committer | Thomas Lamprecht <t.lamprecht@proxmox.com> | 2020-10-06 18:12:38 +0200 |
| commit | ee4f339e8026c7dbe793e112bdcb5b1981c6a66e (patch) | |
| tree | 3efef498011e00bd4acb404e5dc7b482c0943f80 /PVE/Network/SDN/Subnets.pm | |
| parent | 70b035064290a014759ce62e0093df00cd7d62fe (diff) | |
add DNS plugin
Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
Diffstat (limited to 'PVE/Network/SDN/Subnets.pm')
| -rw-r--r-- | PVE/Network/SDN/Subnets.pm | 172 |
1 files changed, 153 insertions, 19 deletions
diff --git a/PVE/Network/SDN/Subnets.pm b/PVE/Network/SDN/Subnets.pm index 3ce2d44..07ef688 100644 --- a/PVE/Network/SDN/Subnets.pm +++ b/PVE/Network/SDN/Subnets.pm @@ -5,8 +5,10 @@ use warnings; use Net::Subnet qw(subnet_matcher); use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file); +use Net::IP; use PVE::Network::SDN::Ipams; +use PVE::Network::SDN::Dns; use PVE::Network::SDN::SubnetPlugin; PVE::Network::SDN::SubnetPlugin->register(); PVE::Network::SDN::SubnetPlugin->init(); @@ -75,41 +77,173 @@ sub find_ip_subnet { return ($subnetid, $subnet); } +my $verify_dns_zone = sub { + my ($zone, $dns) = @_; + + return if !$zone || !$dns; + + my $dns_cfg = PVE::Network::SDN::Dns::config(); + my $plugin_config = $dns_cfg->{ids}->{$dns}; + my $plugin = PVE::Network::SDN::Dns::Plugin->lookup($plugin_config->{type}); + $plugin->verify_zone($plugin_config, $zone); +}; + +my $add_dns_record = sub { + my ($zone, $dns, $hostname, $dnszoneprefix, $ip) = @_; + return if !$zone || !$dns || !$hostname || !$ip; + + $hostname .= ".$dnszoneprefix" if $dnszoneprefix; + + my $dns_cfg = PVE::Network::SDN::Dns::config(); + my $plugin_config = $dns_cfg->{ids}->{$dns}; + my $plugin = PVE::Network::SDN::Dns::Plugin->lookup($plugin_config->{type}); + $plugin->add_a_record($plugin_config, $zone, $hostname, $ip); + +}; + +my $add_dns_ptr_record = sub { + my ($reversezone, $zone, $dns, $hostname, $dnszoneprefix, $ip) = @_; + + return if !$zone || !$reversezone || !$dns || !$hostname || !$ip; + + $hostname .= ".$dnszoneprefix" if $dnszoneprefix; + $hostname .= ".$zone"; + my $dns_cfg = PVE::Network::SDN::Dns::config(); + my $plugin_config = $dns_cfg->{ids}->{$dns}; + my $plugin = PVE::Network::SDN::Dns::Plugin->lookup($plugin_config->{type}); + $plugin->add_ptr_record($plugin_config, $reversezone, $hostname, $ip); +}; + +my $del_dns_record = sub { + my ($zone, $dns, $hostname, $dnszoneprefix, $ip) = @_; + + return if !$zone || !$dns || !$hostname || !$ip; + + $hostname .= ".$dnszoneprefix" if $dnszoneprefix; + + my $dns_cfg = PVE::Network::SDN::Dns::config(); + my $plugin_config = $dns_cfg->{ids}->{$dns}; + my $plugin = PVE::Network::SDN::Dns::Plugin->lookup($plugin_config->{type}); + $plugin->del_a_record($plugin_config, $zone, $hostname, $ip); +}; + +my $del_dns_ptr_record = sub { + my ($reversezone, $dns, $ip) = @_; + + return if !$reversezone || !$dns || !$ip; + + my $dns_cfg = PVE::Network::SDN::Dns::config(); + my $plugin_config = $dns_cfg->{ids}->{$dns}; + my $plugin = PVE::Network::SDN::Dns::Plugin->lookup($plugin_config->{type}); + $plugin->del_ptr_record($plugin_config, $reversezone, $ip); +}; + sub next_free_ip { - my ($subnetid, $subnet) = @_; + my ($subnetid, $subnet, $hostname) = @_; + + my $cidr = undef; + my $ip = undef; my $ipamid = $subnet->{ipam}; - return if !$ipamid; + my $dns = $subnet->{dns}; + my $dnszone = $subnet->{dnszone}; + my $reversedns = $subnet->{reversedns}; + my $reversednszone = $subnet->{reversednszone}; + my $dnszoneprefix = $subnet->{dnszoneprefix}; + + #verify dns zones before ipam + &$verify_dns_zone($dnszone, $dns); + &$verify_dns_zone($reversednszone, $reversedns); + + if($ipamid) { + my $ipam_cfg = PVE::Network::SDN::Ipams::config(); + my $plugin_config = $ipam_cfg->{ids}->{$ipamid}; + my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type}); + $cidr = $plugin->add_next_freeip($plugin_config, $subnetid, $subnet); + ($ip, undef) = split(/\//, $cidr); + } - my $ipam_cfg = PVE::Network::SDN::Ipams::config(); - my $plugin_config = $ipam_cfg->{ids}->{$ipamid}; - my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type}); - my $ip = $plugin->add_next_freeip($plugin_config, $subnetid, $subnet); - return $ip; + eval { + #add dns + &$add_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip); + #add reverse dns + &$add_dns_ptr_record($reversednszone, $dnszone, $reversedns, $hostname, $dnszoneprefix, $ip); + }; + if ($@) { + #rollback + my $err = $@; + eval { + PVE::Network::SDN::Subnets::del_ip($subnetid, $subnet, $ip, $hostname) + }; + die $err; + } + return $cidr; } sub add_ip { - my ($subnetid, $subnet, $ip) = @_; + my ($subnetid, $subnet, $ip, $hostname) = @_; my $ipamid = $subnet->{ipam}; - return if !$ipamid; + my $dns = $subnet->{dns}; + my $dnszone = $subnet->{dnszone}; + my $reversedns = $subnet->{reversedns}; + my $reversednszone = $subnet->{reversednszone}; + my $dnszoneprefix = $subnet->{dnszoneprefix}; + + #verify dns zones before ipam + &$verify_dns_zone($dnszone, $dns); + &$verify_dns_zone($reversednszone, $reversedns); + + if ($ipamid) { + my $ipam_cfg = PVE::Network::SDN::Ipams::config(); + my $plugin_config = $ipam_cfg->{ids}->{$ipamid}; + my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type}); + $plugin->add_ip($plugin_config, $subnetid, $ip); + } - my $ipam_cfg = PVE::Network::SDN::Ipams::config(); - my $plugin_config = $ipam_cfg->{ids}->{$ipamid}; - my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type}); - $plugin->add_ip($plugin_config, $subnetid, $ip); + eval { + #add dns + &$add_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip); + #add reverse dns + &$add_dns_ptr_record($reversednszone, $dnszone, $reversedns, $hostname, $dnszoneprefix, $ip); + }; + if ($@) { + #rollback + my $err = $@; + eval { + PVE::Network::SDN::Subnets::del_ip($subnetid, $subnet, $ip, $hostname) + }; + die $err; + } } sub del_ip { - my ($subnetid, $subnet, $ip) = @_; + my ($subnetid, $subnet, $ip, $hostname) = @_; my $ipamid = $subnet->{ipam}; - return if !$ipamid; + my $dns = $subnet->{dns}; + my $dnszone = $subnet->{dnszone}; + my $reversedns = $subnet->{reversedns}; + my $reversednszone = $subnet->{reversednszone}; + my $dnszoneprefix = $subnet->{dnszoneprefix}; + + &$verify_dns_zone($dnszone, $dns); + &$verify_dns_zone($reversednszone, $reversedns); + + if ($ipamid) { + my $ipam_cfg = PVE::Network::SDN::Ipams::config(); + my $plugin_config = $ipam_cfg->{ids}->{$ipamid}; + my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type}); + $plugin->del_ip($plugin_config, $subnetid, $ip); + } - my $ipam_cfg = PVE::Network::SDN::Ipams::config(); - my $plugin_config = $ipam_cfg->{ids}->{$ipamid}; - my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type}); - $plugin->del_ip($plugin_config, $subnetid, $ip); + eval { + &$del_dns_record($dnszone, $dns, $hostname, $dnszoneprefix, $ip); + &$del_dns_ptr_record($reversednszone, $reversedns, $ip); + }; + if ($@) { + warn $@; + } } 1; |
