[pve-devel] [PATCH pve-storage 1/2] iSCSI ipv6 support
Wolfgang Bumiller
w.bumiller at proxmox.com
Mon Aug 31 11:02:25 CEST 2015
---
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.1.4
More information about the pve-devel
mailing list