]>
Commit | Line | Data |
---|---|---|
70b03506 AD |
1 | package PVE::Network::SDN::Ipams; |
2 | ||
3 | use strict; | |
4 | use warnings; | |
5 | ||
70b03506 | 6 | use JSON; |
8a8bba70 | 7 | use Net::IP; |
70b03506 AD |
8 | |
9 | use PVE::Tools qw(extract_param dir_glob_regex run_command); | |
8a8bba70 | 10 | use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file cfs_lock_file); |
70b03506 AD |
11 | use PVE::Network; |
12 | ||
13 | use PVE::Network::SDN::Ipams::PVEPlugin; | |
14 | use PVE::Network::SDN::Ipams::NetboxPlugin; | |
15 | use PVE::Network::SDN::Ipams::PhpIpamPlugin; | |
16 | use PVE::Network::SDN::Ipams::Plugin; | |
17 | ||
18 | PVE::Network::SDN::Ipams::PVEPlugin->register(); | |
19 | PVE::Network::SDN::Ipams::NetboxPlugin->register(); | |
20 | PVE::Network::SDN::Ipams::PhpIpamPlugin->register(); | |
21 | PVE::Network::SDN::Ipams::Plugin->init(); | |
22 | ||
8a8bba70 SH |
23 | my $macdb_filename = 'priv/macs.db'; |
24 | ||
25 | cfs_register_file($macdb_filename, \&json_reader, \&json_writer); | |
26 | ||
27 | sub json_reader { | |
28 | my ($filename, $data) = @_; | |
29 | ||
30 | return defined($data) && length($data) > 0 ? decode_json($data) : {}; | |
31 | } | |
32 | ||
33 | sub json_writer { | |
34 | my ($filename, $data) = @_; | |
35 | ||
36 | return encode_json($data); | |
37 | } | |
38 | ||
39 | sub read_macdb { | |
40 | my () = @_; | |
41 | ||
42 | return cfs_read_file($macdb_filename); | |
43 | } | |
44 | ||
45 | sub write_macdb { | |
46 | my ($data) = @_; | |
47 | ||
48 | cfs_write_file($macdb_filename, $data); | |
49 | } | |
50 | ||
51 | sub 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 | ||
66 | sub 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 | |
82 | sub 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 | ||
93 | sub 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 | ||
100 | sub 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 | ||
107 | sub write_config { | |
108 | my ($cfg) = @_; | |
109 | ||
110 | cfs_write_file("sdn/ipams.cfg", $cfg); | |
111 | } | |
112 | ||
113 | sub sdn_ipams_ids { | |
114 | my ($cfg) = @_; | |
115 | ||
116 | return keys %{$cfg->{ids}}; | |
117 | } | |
118 | ||
119 | sub 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 |
127 | sub 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 |
142 | 1; |
143 |