]>
git.proxmox.com Git - pve-network.git/blob - src/PVE/Network/SDN/Dhcp.pm
1 package PVE
::Network
::SDN
::Dhcp
;
6 use PVE
::Cluster
qw(cfs_read_file);
9 use PVE
::Network
::SDN
::SubnetPlugin
;
10 use PVE
::Network
::SDN
::Dhcp
qw(config);
11 use PVE
::Network
::SDN
::Ipams
;
12 use PVE
::Network
::SDN
::Subnets
qw(sdn_subnets_config config get_dhcp_ranges);
13 use PVE
::Network
::SDN
::Dhcp
::Plugin
;
14 use PVE
::Network
::SDN
::Dhcp
::Dnsmasq
;
16 use PVE
::INotify
qw(nodename);
18 PVE
::Network
::SDN
::Dhcp
::Plugin-
>init();
20 PVE
::Network
::SDN
::Dhcp
::Dnsmasq-
>register();
21 PVE
::Network
::SDN
::Dhcp
::Dnsmasq-
>init();
24 my ($vnetid, $mac, $ip4, $ip6) = @_;
26 my $vnet = PVE
::Network
::SDN
::Vnets
::get_vnet
($vnetid);
29 my $zoneid = $vnet->{zone
};
30 my $zone = PVE
::Network
::SDN
::Zones
::get_zone
($zoneid);
32 return if !$zone->{ipam
} || !$zone->{dhcp
};
34 my $dhcptype = $zone->{dhcp
};
36 my $macdb = PVE
::Network
::SDN
::Ipams
::read_macdb
();
37 my $dhcp_plugin = PVE
::Network
::SDN
::Dhcp
::Plugin-
>lookup($dhcptype);
38 $dhcp_plugin->add_ip_mapping($zoneid, $macdb, $mac, $ip4, $ip6)
42 my ($vnetid, $mac) = @_;
44 my $vnet = PVE
::Network
::SDN
::Vnets
::get_vnet
($vnetid);
47 my $zoneid = $vnet->{zone
};
48 my $zone = PVE
::Network
::SDN
::Zones
::get_zone
($zoneid);
50 return if !$zone->{ipam
} || !$zone->{dhcp
};
52 my $dhcp_plugin = PVE
::Network
::SDN
::Dhcp
::Plugin-
>lookup($zone->{dhcp
});
53 $dhcp_plugin->del_ip_mapping($zoneid, $mac);
56 sub regenerate_config
{
59 my $cfg = PVE
::Network
::SDN
::running_config
();
61 my $zone_cfg = $cfg->{zones
};
62 my $vnet_cfg = $cfg->{vnets
};
63 my $subnet_cfg = $cfg->{subnets
};
64 return if !$zone_cfg && !$subnet_cfg;
66 my $nodename = PVE
::INotify
::nodename
();
68 my $plugins = PVE
::Network
::SDN
::Dhcp
::Plugin-
>lookup_types();
70 my $any_zone_needs_dhcp = grep { $_->{dhcp
} } values $zone_cfg->{ids
}->%*;
72 foreach my $plugin_name (@$plugins) {
73 my $plugin = PVE
::Network
::SDN
::Dhcp
::Plugin-
>lookup($plugin_name);
74 eval { $plugin->before_regenerate(!$any_zone_needs_dhcp) };
75 die "Could not run before_regenerate for DHCP plugin $plugin_name $@\n" if $@;
78 foreach my $zoneid (sort keys %{$zone_cfg->{ids
}}) {
79 my $zone = $zone_cfg->{ids
}->{$zoneid};
80 next if !$zone->{dhcp
};
82 my $dhcp_plugin_name = $zone->{dhcp
};
83 my $dhcp_plugin = PVE
::Network
::SDN
::Dhcp
::Plugin-
>lookup($dhcp_plugin_name);
85 die "Could not find DHCP plugin: $dhcp_plugin_name" if !$dhcp_plugin;
87 eval { $dhcp_plugin->before_configure($zoneid) };
88 die "Could not run before_configure for DHCP server $zoneid $@\n" if $@;
90 for my $vnetid (sort keys %{$vnet_cfg->{ids
}}) {
91 my $vnet = $vnet_cfg->{ids
}->{$vnetid};
92 next if $vnet->{zone
} ne $zoneid;
95 my $subnets = PVE
::Network
::SDN
::Vnets
::get_subnets
($vnetid);
97 foreach my $subnet_id (sort keys %{$subnets}) {
98 my $subnet_config = $subnets->{$subnet_id};
99 my $dhcp_ranges = PVE
::Network
::SDN
::Subnets
::get_dhcp_ranges
($subnet_config);
101 my ($zone, $subnet_network, $subnet_mask) = split(/-/, $subnet_id);
102 next if $zone ne $zoneid;
103 next if !$dhcp_ranges;
105 eval { $dhcp_plugin->configure_subnet($config, $zoneid, $vnetid, $subnet_config) };
106 warn "Could not configure subnet $subnet_id: $@\n" if $@;
108 foreach my $dhcp_range (@$dhcp_ranges) {
109 eval { $dhcp_plugin->configure_range($config, $zoneid, $vnetid, $subnet_config, $dhcp_range) };
110 warn "Could not configure DHCP range for $subnet_id: $@\n" if $@;
114 eval { $dhcp_plugin->configure_vnet($config, $zoneid, $vnetid, $vnet) };
115 warn "Could not configure vnet $vnetid: $@\n" if $@;
118 eval { $dhcp_plugin->after_configure($zoneid, !$any_zone_needs_dhcp) };
119 warn "Could not run after_configure for DHCP server $zoneid $@\n" if $@;
123 foreach my $plugin_name (@$plugins) {
124 my $plugin = PVE
::Network
::SDN
::Dhcp
::Plugin-
>lookup($plugin_name);
126 eval { $plugin->after_regenerate() };
127 warn "Could not run after_regenerate for DHCP plugin $plugin_name $@\n" if $@;