use strict;
use warnings;
-use PVE::Tools qw(run_command lock_file);
-use PVE::ProcFSTools;
+
use PVE::INotify;
+use PVE::ProcFSTools;
+use PVE::Tools qw(run_command lock_file);
+
use File::Basename;
use IO::Socket::IP;
-use Socket qw(NI_NUMERICHOST NI_NUMERICSERV);
-use POSIX qw(ECONNREFUSED);
-
use Net::IP;
+use POSIX qw(ECONNREFUSED);
+use Socket qw(NI_NUMERICHOST NI_NUMERICSERV);
# host network related utility functions
sub get_local_ip_from_cidr {
my ($cidr) = @_;
- my $cmd = ['/sbin/ip', 'address', 'show', 'to', $cidr, 'up'];
-
my $IPs = [];
-
- my $code = sub {
- my $line = shift;
-
- if ($line =~ m!^\s*inet(?:6)?\s+($PVE::Tools::IPRE)(?:/\d+|\s+peer\s+)!) {
+ run_command(['/sbin/ip', 'address', 'show', 'to', $cidr, 'up'], outfunc => sub {
+ if ($_[0] =~ m!^\s*inet(?:6)?\s+($PVE::Tools::IPRE)(?:/\d+|\s+peer\s+)!) {
push @$IPs, $1;
}
- };
-
- PVE::Tools::run_command($cmd, outfunc => $code);
+ });
return $IPs;
}
sub get_ip_from_hostname {
my ($hostname, $noerr) = @_;
- my ($family, $ip);
-
- eval {
- my @res = PVE::Tools::getaddrinfo_all($hostname);
- $family = $res[0]->{family};
- $ip = addr_to_ip($res[0]->{addr})
- };
+ my @res = eval { PVE::Tools::getaddrinfo_all($hostname) };
if ($@) {
die "hostname lookup '$hostname' failed - $@" if !$noerr;
return undef;
}
- if ($ip =~ m/^127\.|^::1$/) {
+ my ($ip, $family);
+ for my $ai (@res) {
+ $family = $ai->{family};
+ my $tmpip = addr_to_ip($ai->{addr});
+ if ($tmpip !~ m/^127\.|^::1$/) {
+ $ip = $tmpip;
+ last;
+ }
+ }
+ if (!defined($ip) ) {
die "hostname lookup '$hostname' failed - got local IP address '$ip'\n" if !$noerr;
return undef;
}