mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-08-14 05:07:31 +00:00
5to6: add Corosync resolve helper
copied from PVE 6.x's pve-cluster. since Corosync 2.x has a different default value for ip_version, we don't want to backport this for general usage in PVE::Corosync. the check here needs the default of Corosync 3.x, since that is what we upgrade to. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
parent
a8b2fd71bd
commit
e9ad9ab43f
@ -15,9 +15,10 @@ use PVE::INotify;
|
||||
use PVE::JSONSchema;
|
||||
use PVE::RPCEnvironment;
|
||||
use PVE::Storage;
|
||||
use PVE::Tools qw(run_command);
|
||||
use PVE::Tools qw(run_command $IPV4RE $IPV6RE);
|
||||
use PVE::QemuServer;
|
||||
|
||||
use Socket qw(AF_INET AF_INET6 inet_ntop);
|
||||
use Term::ANSIColor;
|
||||
|
||||
use PVE::CLIHandler;
|
||||
@ -136,6 +137,69 @@ my $get_pkg = sub {
|
||||
}
|
||||
};
|
||||
|
||||
# taken from pve-cluster 6.0-4
|
||||
my $resolve_hostname_like_corosync = sub {
|
||||
my ($hostname, $corosync_conf) = @_;
|
||||
|
||||
my $corosync_strategy = $corosync_conf->{main}->{totem}->{ip_version};
|
||||
$corosync_strategy = lc ($corosync_strategy // "ipv6-4");
|
||||
|
||||
my $match_ip_and_version = sub {
|
||||
my ($addr) = @_;
|
||||
|
||||
return undef if !defined($addr);
|
||||
|
||||
if ($addr =~ m/^$IPV4RE$/) {
|
||||
return ($addr, 4);
|
||||
} elsif ($addr =~ m/^$IPV6RE$/) {
|
||||
return ($addr, 6);
|
||||
}
|
||||
|
||||
return undef;
|
||||
};
|
||||
|
||||
my ($resolved_ip, $ip_version) = $match_ip_and_version->($hostname);
|
||||
|
||||
return ($resolved_ip, $ip_version) if defined($resolved_ip);
|
||||
|
||||
my $resolved_ip4;
|
||||
my $resolved_ip6;
|
||||
|
||||
my @resolved_raw;
|
||||
eval { @resolved_raw = PVE::Tools::getaddrinfo_all($hostname); };
|
||||
|
||||
return undef if ($@ || !@resolved_raw);
|
||||
|
||||
foreach my $socket_info (@resolved_raw) {
|
||||
next if !$socket_info->{addr};
|
||||
|
||||
my ($family, undef, $host) = PVE::Tools::unpack_sockaddr_in46($socket_info->{addr});
|
||||
|
||||
if ($family == AF_INET && !defined($resolved_ip4)) {
|
||||
$resolved_ip4 = inet_ntop(AF_INET, $host);
|
||||
} elsif ($family == AF_INET6 && !defined($resolved_ip6)) {
|
||||
$resolved_ip6 = inet_ntop(AF_INET6, $host);
|
||||
}
|
||||
|
||||
last if defined($resolved_ip4) && defined($resolved_ip6);
|
||||
}
|
||||
|
||||
# corosync_strategy specifies the order in which IP addresses are resolved
|
||||
# by corosync. We need to match that order, to ensure we create firewall
|
||||
# rules for the correct address family.
|
||||
if ($corosync_strategy eq "ipv4") {
|
||||
$resolved_ip = $resolved_ip4;
|
||||
} elsif ($corosync_strategy eq "ipv6") {
|
||||
$resolved_ip = $resolved_ip6;
|
||||
} elsif ($corosync_strategy eq "ipv6-4") {
|
||||
$resolved_ip = $resolved_ip6 // $resolved_ip4;
|
||||
} elsif ($corosync_strategy eq "ipv4-6") {
|
||||
$resolved_ip = $resolved_ip4 // $resolved_ip6;
|
||||
}
|
||||
|
||||
return $match_ip_and_version->($resolved_ip);
|
||||
};
|
||||
|
||||
sub check_pve_packages {
|
||||
print_header("CHECKING VERSION INFORMATION FOR PVE PACKAGES");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user