]> git.proxmox.com Git - pve-network.git/blame - src/PVE/Network/SDN/Ipams.pm
ipam: plugins: preparations for DHCP
[pve-network.git] / src / PVE / Network / SDN / Ipams.pm
CommitLineData
70b03506
AD
1package PVE::Network::SDN::Ipams;
2
3use strict;
4use warnings;
5
70b03506 6use JSON;
8a8bba70 7use Net::IP;
70b03506
AD
8
9use PVE::Tools qw(extract_param dir_glob_regex run_command);
8a8bba70 10use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file cfs_lock_file);
70b03506
AD
11use PVE::Network;
12
13use PVE::Network::SDN::Ipams::PVEPlugin;
14use PVE::Network::SDN::Ipams::NetboxPlugin;
15use PVE::Network::SDN::Ipams::PhpIpamPlugin;
16use PVE::Network::SDN::Ipams::Plugin;
17
18PVE::Network::SDN::Ipams::PVEPlugin->register();
19PVE::Network::SDN::Ipams::NetboxPlugin->register();
20PVE::Network::SDN::Ipams::PhpIpamPlugin->register();
21PVE::Network::SDN::Ipams::Plugin->init();
22
8a8bba70
SH
23my $macdb_filename = 'priv/macs.db';
24
25cfs_register_file($macdb_filename, \&json_reader, \&json_writer);
26
27sub json_reader {
28 my ($filename, $data) = @_;
29
30 return defined($data) && length($data) > 0 ? decode_json($data) : {};
31}
32
33sub json_writer {
34 my ($filename, $data) = @_;
35
36 return encode_json($data);
37}
38
39sub read_macdb {
40 my () = @_;
41
42 return cfs_read_file($macdb_filename);
43}
44
45sub write_macdb {
46 my ($data) = @_;
47
48 cfs_write_file($macdb_filename, $data);
49}
50
51sub add_cache_mac_ip {
52 my ($mac, $ip) = @_;
53
54 cfs_lock_file($macdb_filename, undef, sub {
55 my $db = read_macdb();
56 if (Net::IP::ip_is_ipv4($ip)) {
57 $db->{macs}->{$mac}->{ip4} = $ip;
58 } else {
59 $db->{macs}->{$mac}->{ip6} = $ip;
60 }
61 write_macdb($db);
62 });
63 warn "$@" if $@;
64}
65
66sub del_cache_mac_ip {
67 my ($mac, $ip) = @_;
68
69 cfs_lock_file($macdb_filename, undef, sub {
70 my $db = read_macdb();
71 if (Net::IP::ip_is_ipv4($ip)) {
72 delete $db->{macs}->{$mac}->{ip4};
73 } else {
74 delete $db->{macs}->{$mac}->{ip6};
75 }
76 delete $db->{macs}->{$mac} if !defined($db->{macs}->{$mac}->{ip4}) && !defined($db->{macs}->{$mac}->{ip6});
77 write_macdb($db);
78 });
79 warn "$@" if $@;
80}
70b03506
AD
81
82sub sdn_ipams_config {
83 my ($cfg, $id, $noerr) = @_;
84
85 die "no sdn ipam ID specified\n" if !$id;
86
87 my $scfg = $cfg->{ids}->{$id};
88 die "sdn '$id' does not exist\n" if (!$noerr && !$scfg);
89
90 return $scfg;
91}
92
93sub config {
94 my $config = cfs_read_file("sdn/ipams.cfg");
9dfa9202
AD
95 #add default internal pve
96 $config->{ids}->{pve}->{type} = 'pve';
70b03506
AD
97 return $config;
98}
99
100sub get_plugin_config {
8a8bba70
SH
101 my ($zone) = @_;
102 my $ipamid = $zone->{ipam};
70b03506
AD
103 my $ipam_cfg = PVE::Network::SDN::Ipams::config();
104 return $ipam_cfg->{ids}->{$ipamid};
105}
106
107sub write_config {
108 my ($cfg) = @_;
109
110 cfs_write_file("sdn/ipams.cfg", $cfg);
111}
112
113sub sdn_ipams_ids {
114 my ($cfg) = @_;
115
116 return keys %{$cfg->{ids}};
117}
118
119sub complete_sdn_vnet {
120 my ($cmdname, $pname, $cvalue) = @_;
121
122 my $cfg = PVE::Network::SDN::Ipams::config();
123
124 return $cmdname eq 'add' ? [] : [ PVE::Network::SDN::Vnets::sdn_ipams_ids($cfg) ];
125}
126
8a8bba70
SH
127sub get_ips_from_mac {
128 my ($mac, $zoneid, $zone) = @_;
129
130 my $macdb = read_macdb();
131 return ($macdb->{macs}->{$mac}->{ip4}, $macdb->{macs}->{$mac}->{ip6}) if $macdb->{macs}->{$mac};
132
133 my $plugin_config = get_plugin_config($zone);
134 my $plugin = PVE::Network::SDN::Ipams::Plugin->lookup($plugin_config->{type});
135 ($macdb->{macs}->{$mac}->{ip4}, $macdb->{macs}->{$mac}->{ip6}) = $plugin->get_ips_from_mac($plugin_config, $mac, $zoneid);
136
137 write_macdb($macdb);
138
139 return ($macdb->{macs}->{$mac}->{ip4}, $macdb->{macs}->{$mac}->{ip6});
140}
141
70b03506
AD
1421;
143