From 1689e627a698a21404f6912b7f94e918b00a8831 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Mon, 31 Aug 2015 11:02:25 +0200 Subject: [PATCH] iSCSI ipv6 support --- PVE/Storage.pm | 9 ++++----- PVE/Storage/ISCSIPlugin.pm | 12 +++++------- PVE/Storage/LunCmd/Iet.pm | 8 ++++---- PVE/Storage/Plugin.pm | 2 +- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index d55b645..927219a 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -12,7 +12,7 @@ use File::Path; use Cwd 'abs_path'; use Socket; -use PVE::Tools qw(run_command file_read_firstline); +use PVE::Tools qw(run_command file_read_firstline $IPV6RE); use PVE::Cluster qw(cfs_read_file cfs_lock_file); use PVE::Exception qw(raise_param_exc); use PVE::JSONSchema; @@ -1008,12 +1008,11 @@ sub scan_zfs { sub resolv_portal { my ($portal, $noerr) = @_; - if ($portal =~ m/^([^:]+)(:(\d+))?$/) { - my $server = $1; - my $port = $3; - + my ($server, $port) = PVE::Tools::parse_host_and_port($portal); + if ($server) { if (my $ip = resolv_server($server)) { $server = $ip; + $server = "[$server]" if $server =~ /^$IPV6RE$/; return $port ? "$server:$port" : $server; } } diff --git a/PVE/Storage/ISCSIPlugin.pm b/PVE/Storage/ISCSIPlugin.pm index 7614bf0..b6c7224 100644 --- a/PVE/Storage/ISCSIPlugin.pm +++ b/PVE/Storage/ISCSIPlugin.pm @@ -5,10 +5,9 @@ use warnings; use File::stat; use IO::Dir; use IO::File; -use PVE::Tools qw(run_command file_read_firstline trim dir_glob_regex dir_glob_foreach); +use PVE::Tools qw(run_command file_read_firstline trim dir_glob_regex dir_glob_foreach $IPV4RE $IPV6RE); use PVE::Storage::Plugin; use PVE::JSONSchema qw(get_standard_option); -use Net::Ping; use base qw(PVE::Storage::Plugin); @@ -62,10 +61,9 @@ sub iscsi_session_list { sub iscsi_test_portal { my ($portal) = @_; - my ($server, $port) = split(':', $portal); - my $p = Net::Ping->new("tcp", 2); - $p->port_number($port || 3260); - return $p->ping($server); + my ($server, $port) = PVE::Tools::parse_host_and_port($portal); + return 0 if !$server; + return PVE::Network::tcp_ping($server, $port || 3260, 2); } sub iscsi_discovery { @@ -83,7 +81,7 @@ sub iscsi_discovery { run_command($cmd, outfunc => sub { my $line = shift; - if ($line =~ m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+)\,\S+\s+(\S+)\s*$/) { + if ($line =~ m/^((?:$IPV4RE|\[$IPV6RE\]):\d+)\,\S+\s+(\S+)\s*$/) { my $portal = $1; my $target = $2; # one target can have more than one portal (multipath). diff --git a/PVE/Storage/LunCmd/Iet.pm b/PVE/Storage/LunCmd/Iet.pm index 98c062b..4a8ebd5 100644 --- a/PVE/Storage/LunCmd/Iet.pm +++ b/PVE/Storage/LunCmd/Iet.pm @@ -57,12 +57,12 @@ my $execute_command = sub { $err .= "$line"; }; - $target = 'root@' . $scfg->{portal}; - if ($exec eq 'scp') { - $cmd = [@scp_cmd, '-i', "$id_rsa_path/$scfg->{portal}_id_rsa", $method, "$target:$params[0]"]; + $target = 'root@[' . $scfg->{portal} . ']'; + $cmd = [@scp_cmd, '-i', "$id_rsa_path/$scfg->{portal}_id_rsa", '--', $method, "$target:$params[0]"]; } else { - $cmd = [@ssh_cmd, '-i', "$id_rsa_path/$scfg->{portal}_id_rsa", $target, $method, @params]; + $target = 'root@' . $scfg->{portal}; + $cmd = [@ssh_cmd, '-i', "$id_rsa_path/$scfg->{portal}_id_rsa", $target, '--', $method, @params]; } eval { diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm index 7325535..6741fec 100644 --- a/PVE/Storage/Plugin.pm +++ b/PVE/Storage/Plugin.pm @@ -133,7 +133,7 @@ sub verify_portal_dns { my ($portal, $noerr) = @_; # IP or DNS name with optional port - if ($portal !~ m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|[[:alnum:]\-\.]+)(:\d+)?$/) { + if (!PVE::Tools::parse_host_and_port($portal)) { return undef if $noerr; die "value does not look like a valid portal address\n"; } -- 2.39.2