[pve-devel] [PATCH v2 manager 13/14] api: ceph: mon: fix handling of IPv6 addresses in destroymon

Fabian Ebner f.ebner at proxmox.com
Mon May 10 14:18:25 CEST 2021


by also comparing the canonical form to decide when to remove an address. When
getting the IP from the rados information, also drop eventual brackets, so our
existing function can handle it. Add the brackets back within the
remove_addr_from_mon_host function.

Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
---

New in v2.

 PVE/API2/Ceph/MON.pm | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/PVE/API2/Ceph/MON.pm b/PVE/API2/Ceph/MON.pm
index e5f11c8a..6244655d 100644
--- a/PVE/API2/Ceph/MON.pm
+++ b/PVE/API2/Ceph/MON.pm
@@ -130,6 +130,8 @@ my $assert_mon_can_remove = sub {
 my $remove_addr_from_mon_host = sub {
     my ($monhost, $addr) = @_;
 
+    $addr = "[$addr]" if PVE::JSONSchema::pve_verify_ipv6($addr, 1);
+
     # various replaces to remove the ip
     # we always match the beginning or a separator (also at the end)
     # so we do not accidentally remove a wrong ip
@@ -485,6 +487,7 @@ __PACKAGE__->register_method ({
 		    if ($mon->{name} eq $monid) {
 			$addr = $mon->{public_addr} // $mon->{addr};
 			($addr) = $addr =~ m|^(.*):\d+/\d+$|; # extract the ip without port/nonce
+			($addr) = $addr =~ m|^\[?(.*?)\]?$|; # remove brackets
 			last;
 		    }
 		}
@@ -499,7 +502,22 @@ __PACKAGE__->register_method ({
 
 		# delete from mon_host
 		if (my $monhost = $cfg->{global}->{mon_host}) {
-		    $cfg->{global}->{mon_host} = $remove_addr_from_mon_host->($monhost, $addr);
+		    $monhost = $remove_addr_from_mon_host->($monhost, $addr);
+
+		    # also remove matching IPs that differ syntactically
+		    if (PVE::JSONSchema::pve_verify_ip($addr, 1)) {
+			$addr = PVE::Network::canonical_ip($addr);
+
+			my $mon_host_ips = $ips_from_mon_host->($cfg->{global}->{mon_host});
+
+			for my $mon_host_ip (@{$mon_host_ips}) {
+			    # match canonical addresses, but remove as present in mon_host
+			    if (PVE::Network::canonical_ip($mon_host_ip) eq $addr) {
+				$monhost = $remove_addr_from_mon_host->($monhost, $mon_host_ip);
+			    }
+			}
+		    }
+		    $cfg->{global}->{mon_host} = $monhost;
 		}
 
 		cfs_write_file('ceph.conf', $cfg);
-- 
2.20.1






More information about the pve-devel mailing list