From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id B3DFC9D9F3 for ; Fri, 27 Oct 2023 13:30:42 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 979FE38B8C for ; Fri, 27 Oct 2023 13:30:12 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Fri, 27 Oct 2023 13:30:12 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id D369C42546; Fri, 27 Oct 2023 13:30:11 +0200 (CEST) From: Stefan Lendl To: pve-devel@lists.proxmox.com Date: Fri, 27 Oct 2023 13:29:55 +0200 Message-ID: <20231027113000.2008166-2-s.lendl@proxmox.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20231027113000.2008166-1-s.lendl@proxmox.com> References: <87v8axbjh1.fsf@gmail.com> <20231027113000.2008166-1-s.lendl@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.074 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [pveplugin.pm, dnsmasq.pm] Subject: [pve-devel] [RFC pve-network 1/6] dhcp add ip returns IP if already present for MAC X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Oct 2023 11:30:42 -0000 Signed-off-by: Stefan Lendl --- src/PVE/Network/SDN/Dhcp/Dnsmasq.pm | 23 +++++++++++++++++++++++ src/PVE/Network/SDN/Ipams/PVEPlugin.pm | 16 ++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/PVE/Network/SDN/Dhcp/Dnsmasq.pm b/src/PVE/Network/SDN/Dhcp/Dnsmasq.pm index af109b8..6f8b1c4 100644 --- a/src/PVE/Network/SDN/Dhcp/Dnsmasq.pm +++ b/src/PVE/Network/SDN/Dhcp/Dnsmasq.pm @@ -18,6 +18,29 @@ sub type { return 'dnsmasq'; } +sub generate_config { + my ($class, $dhcp_config, $ip_mappings) = @_; + + my $ethers_file = "$DNSMASQ_CONFIG_ROOT/$dhcp_config->{id}/ethers"; + my $ethers_tmp_file = "$ethers_file.tmp"; + + open(my $out, '>', $ethers_file) or die "Could not open file '$ethers_file' $!\n"; + + foreach my $ip (keys %$ip_mappings) { + if (exists $ip_mappings->{$ip}{mac}) { + my $mac = $ip_mappings->{$ip}{mac}; + print $out "$mac,$ip\n"; + } + } + + close $out; + + chmod 0644, $ethers_file; + + my $service_name = "dnsmasq\@$dhcp_config->{id}"; + PVE::Tools::run_command(['systemctl', 'reload', $service_name]); +} + sub del_ip_mapping { my ($class, $dhcp_config, $mac) = @_; diff --git a/src/PVE/Network/SDN/Ipams/PVEPlugin.pm b/src/PVE/Network/SDN/Ipams/PVEPlugin.pm index fcc8282..40b4a8f 100644 --- a/src/PVE/Network/SDN/Ipams/PVEPlugin.pm +++ b/src/PVE/Network/SDN/Ipams/PVEPlugin.pm @@ -161,6 +161,8 @@ sub add_dhcp_ip { my $cidr = $subnet->{cidr}; my $zone = $subnet->{zone}; + my $vmid = $data->{vmid}; + my $mac = $data->{mac}; cfs_lock_file($ipamdb_file, undef, sub { my $db = read_db(); @@ -174,11 +176,25 @@ sub add_dhcp_ip { my $ip = new Net::IP ("$dhcp_range->{'start-address'} - $dhcp_range->{'end-address'}") or die "Invalid IP address(es) in DHCP Range!\n"; + do { + my $ip_address = $ip->ip(); + if (exists $dbsubnet->{ips}->{$ip_address} && + exists $dbsubnet->{ips}->{$ip_address}->{mac} && + $dbsubnet->{ips}->{$ip_address}->{mac} eq $mac) { + print "IP '$ip_address' already exist for $mac in $vmid\n"; + + return $ip_address; + } + } while (++$ip); + + $ip = new Net::IP ("$dhcp_range->{'start-address'} - $dhcp_range->{'end-address'}"); + do { my $ip_address = $ip->ip(); if (!$dbsubnet->{ips}->{$ip_address}) { $dbsubnet->{ips}->{$ip_address} = $data; write_db($db); + print "New IP '$ip_address' added for $mac at $vmid\n"; return $ip_address; } -- 2.41.0