move to modern source package format
[debian/amanda] / application-src / amzfs-sendrecv.pl
index 63bb0bcc073f727fecd0664687ccb382e3e97de5..cd009933324264d2d8ecdbdb30ad0aaa5cf6a15e 100644 (file)
@@ -1,5 +1,5 @@
 #!@PERL@
-# Copyright (c) 2008,2009 Zmanda, Inc.  All Rights Reserved.
+# Copyright (c) 2008, 2009, 2010 Zmanda, Inc.  All Rights Reserved.
 #
 # This program is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License version 2 as published
@@ -19,6 +19,7 @@
 
 use lib '@amperldir@';
 use strict;
+use warnings;
 use Getopt::Long;
 
 package Amanda::Application::Amzfs_sendrecv;
@@ -89,7 +90,7 @@ sub command_support {
    print "HOST YES\n";
    print "DISK YES\n";
    print "MAX-LEVEL 9\n";
-   print "INDEX-LINE NO\n";
+   print "INDEX-LINE YES\n";
    print "INDEX-XML NO\n";
    print "MESSAGE-LINE YES\n";
    print "MESSAGE-XML NO\n";
@@ -168,12 +169,6 @@ sub output_size {
 sub command_backup {
     my $self = shift;
 
-    my $mesgout_fd;
-    open($mesgout_fd, '>&=3') ||
-       $self->print_to_server_and_die("Can't open mesgout_fd: $!",
-                                      $Amanda::Script_App::ERROR);
-    $self->{mesgout} = $mesgout_fd;
-
     if ($#{$self->{include_list}} >= 0) {
        $self->print_to_server("include-list not supported for backup",
                               $Amanda::Script_App::ERROR);
@@ -196,7 +191,7 @@ sub command_backup {
       my $refsnapshotname = $self->zfs_find_snapshot_level($level-1);
       debug "Referenced snapshot name: $refsnapshotname|";
       if ($refsnapshotname ne "") {
-        $cmd = "$self->{pfexec_cmd} $self->{zfs_path} send -i $refsnapshotname $self->{filesystem}\@$self->{snapshot} | $Amanda::Paths::amlibexecdir/teecount";
+        $cmd = "$self->{pfexec_cmd} $self->{zfs_path} send -i $self->{filesystem}\@$refsnapshotname $self->{filesystem}\@$self->{snapshot} | $Amanda::Paths::amlibexecdir/teecount";
       } else {
         $self->print_to_server_and_die("cannot backup snapshot '$self->{filesystem}\@$self->{snapshot}': reference snapshot doesn't exists for level $level", $Amanda::Script_App::ERROR);
       }
@@ -208,6 +203,16 @@ sub command_backup {
     $err = Symbol::gensym;
     $pid = open3($wtr, '>&STDOUT', $err, $cmd);
     close $wtr;
+
+    if (defined($self->{index})) {
+       my $indexout;
+       open($indexout, '>&=4') ||
+       $self->print_to_server_and_die("Can't open indexout: $!",
+                                      $Amanda::Script_App::ERROR);
+       print $indexout "/\n";
+       close($indexout);
+    }
+
     $errmsg = <$err>;
     waitpid $pid, 0;
     close $err;
@@ -224,8 +229,8 @@ sub command_backup {
     my($ksize) = int ($size/1024);
     $ksize=32 if ($ksize<32);
 
-    print $mesgout_fd "sendbackup: size $ksize\n";
-    print $mesgout_fd "sendbackup: end\n";
+    print {$self->{mesgout}} "sendbackup: size $ksize\n";
+    print {$self->{mesgout}} "sendbackup: end\n";
 
     # destroy all snapshot of this level and higher
     $self->zfs_purge_snapshot($level, 9);
@@ -326,11 +331,40 @@ sub command_index_from_output {
 sub command_index_from_image {
 }
 
-#sub command_restore {
-#    my $self = shift;
-#
-#TODO
-#}
+sub command_restore {
+    my $self = shift;
+
+    my $level = $self->{level}[0];
+    my $device = $self->{device};
+    $device = $self->{directory} if defined $self->{directory};
+    $device =~ s,^/,,;
+    my $current_snapshot = $self->zfs_build_snapshotname($device);
+    $self->{'snapshot'} = $self->zfs_build_snapshotname($device, $level);
+
+    my @cmd = ();
+
+    if ($self->{pfexec_cmd}) {
+       push @cmd, $self->{pfexec_cmd};
+    }
+    push @cmd, $self->{zfs_path};
+    push @cmd, "recv";
+    push @cmd, $device;
+
+    debug("cmd:" . join(" ", @cmd));
+    system @cmd;
+
+    @cmd = ();
+    if ($self->{pfexec_cmd}) {
+       push @cmd, $self->{pfexec_cmd};
+    }
+    push @cmd, $self->{zfs_path};
+    push @cmd, "rename";
+    push @cmd, "$device\@$current_snapshot";
+    push @cmd, "$device\@$self->{'snapshot'}";
+
+    debug("cmd:" . join(" ", @cmd));
+    system @cmd;
+}
 
 sub command_print_command {
 }