[pve-devel] [RFC storage] pvesm import: allow to pass a tcp://<IP> as file

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Jun 27 16:16:09 CEST 2019


To allow getting closer to finally drop "pvecm mtunnel".
Code parts taken from pipe_socket_to_command

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
 PVE/CLI/pvesm.pm | 34 +++++++++++++++++++++++++++++++++-
 PVE/Storage.pm   | 10 ++++------
 2 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/PVE/CLI/pvesm.pm b/PVE/CLI/pvesm.pm
index 0432450..330d748 100755
--- a/PVE/CLI/pvesm.pm
+++ b/PVE/CLI/pvesm.pm
@@ -269,7 +269,9 @@ __PACKAGE__->register_method ({
 		enum => $KNOWN_EXPORT_FORMATS,
 	    },
 	    filename => {
-		description => "Source file name",
+		description => "Source file name. For '-' stdin is used, the " .
+		  "tcp://<IP-or-CIDR> format allows to use a TCP connection as input. " .
+		  "Else, the file is treated as common file.",
 		type => 'string',
 	    },
 	    base => {
@@ -304,6 +306,36 @@ __PACKAGE__->register_method ({
 	my $infh;
 	if ($filename eq '-') {
 	    $infh = \*STDIN;
+	} elsif ($filename =~ m!^tcp://((.+)(/\d+)?)$!) {
+	    my ($cidr, $ip, $subnet) = ($1, $2, $3);
+	    if ($subnet) { # got real CIDR notation, not just IP
+		$ip = PVE::Cluster::get_local_migration_ip($cidr);
+	    }
+	    my $family = PVE::Tools::get_host_address_family($ip);
+	    my $port = PVE::Tools::next_migrate_port($family, $ip);
+
+	    my $sock_params = {
+		Listen => 1,
+		ReuseAddr => 1,
+		Proto => &Socket::IPPROTO_TCP,
+		GetAddrInfoFlags => 0,
+		LocalAddr => $ip,
+		LocalPort => $port,
+	    };
+	    my $socket = IO::Socket::IP->new(%$sock_params)
+	        or die "failed to open socket: $!\n";
+
+	    print "$ip\n$port\n"; # tell remote where to connect
+	    *STDOUT->flush();
+
+	    my $prev_alarm = alarm 0;
+	    local $SIG{ALRM} = sub { die "timed out waiting for client\n" };
+	    alarm 30;
+	    my $client = $socket->accept; # Wait for a client
+	    alarm $prev_alarm;
+	    close($socket);
+
+	    $infh = \*$client;
 	} else {
 	    sysopen($infh, $filename, O_RDONLY)
 		or die "open($filename): $!\n";
diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 0ce942a..5925c69 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -590,17 +590,15 @@ sub storage_migrate {
     die "cannot migrate from storage type '$scfg->{type}' to '$tcfg->{type}'\n" if !@formats;
     my $format = $formats[0];
 
-    my @insecurecmd;
+    my $import_fn = '-'; # let pvesm import read from stdin per default
     if ($insecure) {
-	@insecurecmd = ('pvecm', 'mtunnel', '-run-command', 1);
-	if (my $network = $target_sshinfo->{network}) {
-	    push @insecurecmd, '-migration_network', $network;
-	}
+	my $net = $target_sshinfo->{network} // $target_sshinfo->{ip};
+	$import_fn = "tcp://$net";
     }
 
     $with_snapshots = $with_snapshots ? 1 : 0; # sanitize for passing as cli parameter
     my $send = ['pvesm', 'export', $volid, $format, '-', '-with-snapshots', $with_snapshots];
-    my $recv = [@$ssh, @insecurecmd, '--', 'pvesm', 'import', $volid, $format, '-', '-with-snapshots', $with_snapshots];
+    my $recv = [@$ssh, '--', 'pvesm', 'import', $volid, $format, $import_fn, '-with-snapshots', $with_snapshots];
     if (defined($snapshot)) {
 	push @$send, '-snapshot', $snapshot
     }
-- 
2.20.1





More information about the pve-devel mailing list