[pve-devel] r5333 - vzdump/trunk
svn-commits at proxmox.com
svn-commits at proxmox.com
Mon Dec 6 10:41:10 CET 2010
Author: dietmar
Date: 2010-12-06 10:41:10 +0100 (Mon, 06 Dec 2010)
New Revision: 5333
Modified:
vzdump/trunk/ChangeLog
vzdump/trunk/OpenVZ.pm
vzdump/trunk/Plugin.pm
vzdump/trunk/VZDump.pm
vzdump/trunk/vzrestore
Log:
Modified: vzdump/trunk/ChangeLog
===================================================================
--- vzdump/trunk/ChangeLog 2010-12-06 06:27:03 UTC (rev 5332)
+++ vzdump/trunk/ChangeLog 2010-12-06 09:41:10 UTC (rev 5333)
@@ -1,7 +1,11 @@
2010-12-06 Proxmox Support Team <support at proxmox.com>
+ * vzrestore (restore_openvz): allow restore from STDIN ('-')
+
* VZDump.pm (debugmsg): never print to STDOUT (use STDERR instead)
- (run_command): allow to pass GLOB/IO:File references for $input
+ (run_command): new syntax, use %param hash
+ (run_command): allow to pass "<&XXX" for $input
+ (run_command): allow to specify $output ">&=N"
* vzdump (print_usage): add new --stdout option (make sure that
nobody writes STDOUT by redirectind STDOUT to STDERR (saving old
Modified: vzdump/trunk/OpenVZ.pm
===================================================================
--- vzdump/trunk/OpenVZ.pm 2010-12-06 06:27:03 UTC (rev 5332)
+++ vzdump/trunk/OpenVZ.pm 2010-12-06 09:41:10 UTC (rev 5333)
@@ -355,16 +355,22 @@
$taropts .= " --remove-files"; # try to save space
}
- my $out = ">$filename";
+ my $cmd = "(";
+ $cmd .= "cd $snapdir;find . $findargs|sed 's/\\\\/\\\\\\\\/g'|";
+ $cmd .= "tar c${zflag}pf - $taropts --null -T -";
if ($opts->{bwlimit}) {
my $bwl = $opts->{bwlimit}*1024; # bandwidth limit for cstream
- $out = "|cstream -t $bwl $out";
+ $cmd .= "|cstream -t $bwl";
}
- $self->cmd ("(cd $snapdir;find . $findargs|sed 's/\\\\/\\\\\\\\/g'|" .
- "tar c${zflag}pf - $taropts --null -T - $out )");
+ $cmd .= ")";
+ if ($opts->{stdout}) {
+ $self->cmd ($cmd, output => ">&=" . fileno($opts->{stdout}));
+ } else {
+ $self->cmd ("$cmd >$filename");
+ }
}
sub cleanup {
Modified: vzdump/trunk/Plugin.pm
===================================================================
--- vzdump/trunk/Plugin.pm 2010-12-06 06:27:03 UTC (rev 5332)
+++ vzdump/trunk/Plugin.pm 2010-12-06 09:41:10 UTC (rev 5333)
@@ -30,16 +30,16 @@
}
sub cmd {
- my ($self, $cmdstr, $input) = @_;
+ my ($self, $cmdstr, %param) = @_;
- return PVE::VZDump::run_command ($self->{logfd}, $cmdstr, $input);
+ return PVE::VZDump::run_command($self->{logfd}, $cmdstr, %param);
}
sub cmd_noerr {
- my ($self, $cmdstr, $input) = @_;
+ my ($self, $cmdstr, %param) = @_;
my $res;
- eval { $res = $self->cmd ($cmdstr, $input); };
+ eval { $res = $self->cmd($cmdstr, %param); };
$self->logerr ($@) if $@;
return $res;
}
Modified: vzdump/trunk/VZDump.pm
===================================================================
--- vzdump/trunk/VZDump.pm 2010-12-06 06:27:03 UTC (rev 5332)
+++ vzdump/trunk/VZDump.pm 2010-12-06 09:41:10 UTC (rev 5333)
@@ -82,12 +82,26 @@
}
sub run_command {
- my ($logfd, $cmdstr, $input, $timeout) = @_;
+ my ($logfd, $cmdstr, %param) = @_;
- $input = '' if !defined($input);
+ my $timeout;
+ my $input;
+ my $output;
- my $reader = IO::File->new();
- my $writer = ref($input) ? $input : IO::File->new();
+ foreach my $p (keys %param) {
+ if ($p eq 'timeout') {
+ $timeout = $param{$p};
+ } elsif ($p eq 'input') {
+ $input = $param{$p};
+ } elsif ($p eq 'output') {
+ $output = $param{$p};
+ } else {
+ die "got unknown parameter '$p' for run_command\n";
+ }
+ }
+
+ my $reader = $output && $output =~ m/^>&/ ? $output : IO::File->new();
+ my $writer = $input && $input =~ m/^<&/ ? $input : IO::File->new();
my $error = IO::File->new();
my $orig_pid = $$;
@@ -104,20 +118,20 @@
# catch exec errors
if ($orig_pid != $$) {
- debugmsg ('err', "command '$cmdstr' failed - fork failed", $logfd);
+ debugmsg ('err', "command '$cmdstr' failed - fork failed: $!", $logfd);
POSIX::_exit (1);
kill ('KILL', $$);
}
die $err if $err;
- if (!ref($input)) {
+ if (ref($writer)) {
print $writer $input if defined $input;
close $writer;
}
my $select = new IO::Select;
- $select->add ($reader);
+ $select->add ($reader) if ref($reader);
$select->add ($error);
my ($ostream, $estream, $logout, $logerr) = ('', '', '', '');
@@ -784,15 +798,18 @@
my $logfile = $task->{logfile} = "$opts->{dumpdir}/$basename.log";
my $ext = $opts->{compress} ? '.tgz' : '.tar';
- my $tarfile = $task->{tarfile} = "$opts->{dumpdir}/$basename$ext";
- $task->{tmptar} = $task->{tarfile};
- $task->{tmptar} =~ s/\.[^\.]+$/\.dat/;
+ if ($opts->{stdout}) {
+ $task->{tarfile} = '-';
+ } else {
+ my $tarfile = $task->{tarfile} = "$opts->{dumpdir}/$basename$ext";
+ $task->{tmptar} = $task->{tarfile};
+ $task->{tmptar} =~ s/\.[^\.]+$/\.dat/;
+ unlink $task->{tmptar};
+ }
$task->{vmtype} = $vmtype;
- unlink $task->{tmptar};
-
if ($opts->{tmpdir}) {
$task->{tmpdir} = "$opts->{tmpdir}/vzdumptmp$$";
} else {
@@ -938,6 +955,14 @@
$plugin->assemble ($task, $vmid);
# produce archive
+
+ if ($opts->{stdout}) {
+ debugmsg ('info', "sending archive to stdout", $logfd);
+ $plugin->archive ($task, $vmid, $task->{tmptar});
+ $self->run_hook_script ('backup-end', $task, $logfd);
+ return;
+ }
+
debugmsg ('info', "creating archive '$task->{tarfile}'", $logfd);
$plugin->archive ($task, $vmid, $task->{tmptar});
Modified: vzdump/trunk/vzrestore
===================================================================
--- vzdump/trunk/vzrestore 2010-12-06 06:27:03 UTC (rev 5332)
+++ vzdump/trunk/vzrestore 2010-12-06 09:41:10 UTC (rev 5333)
@@ -96,10 +96,14 @@
my $cmd = "tar xpf $archive --totals --sparse -C $private";
- debugmsg ('info', "extracting archive '$archive'");
+ if ($archive eq '-') {
+ debugmsg ('info', "extracting archive from STDIN");
+ run_command ($cmd, input => "<&STDIN");
+ } else {
+ debugmsg ('info', "extracting archive '$archive'");
+ run_command ($cmd);
+ }
- run_command ($cmd);
-
debugmsg ('info', "extracting configuration to '$conffile'");
my $qroot = $vzconf->{rootdir};
@@ -134,9 +138,11 @@
my $plugin = PVE::VZDump::OpenVZ->new();
-my $firstfile = PVE::VZDump::read_firstfile ($archive);
-if ($firstfile eq 'qemu-server.conf') {
- die "ERROR: please use 'qmrestore' to restore QemuServer VMs\n";
+if ($archive ne '-') {
+ my $firstfile = PVE::VZDump::read_firstfile ($archive);
+ if ($firstfile eq 'qemu-server.conf') {
+ die "ERROR: please use 'qmrestore' to restore QemuServer VMs\n";
+ }
}
my $lock = $plugin->lock_vm ($vmid);
More information about the pve-devel
mailing list