]> git.proxmox.com Git - pve-manager.git/commitdiff
Fix #1015: vzdump: send email on early errors
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Mon, 6 Jun 2016 10:17:47 +0000 (12:17 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Mon, 6 Jun 2016 11:38:35 +0000 (13:38 +0200)
VZDump->new() dies when a tmpdir or dumpdir is configured
but does not exist. At this point the error is not being
reported via email.

This also moves the instantiation of VZDump into the worker
since new() can now call sendmail() on error.

Additionally rather than only showing a single error if both
tmpdir and dumpdir don't exist, both are included in the
message.

PVE/API2/VZDump.pm
PVE/VZDump.pm

index 91b8a2766294fe9f218e070e26e7aea13f0d9677..2e9007856cfa0dc4a41912828c1dd86425971b2b 100644 (file)
@@ -120,8 +120,6 @@ __PACKAGE__->register_method ({
        $rpcenv->check($user, "/storage/$param->{storage}", [ 'Datastore.AllocateSpace' ])
            if $param->{storage};
 
-       my $vzdump = PVE::VZDump->new($cmdline, $param, $skiplist);
-
        my $worker = sub {
            my $upid = shift;
 
@@ -129,6 +127,8 @@ __PACKAGE__->register_method ({
                die "interrupted by signal\n";
            };
 
+           my $vzdump = PVE::VZDump->new($cmdline, $param, $skiplist);
+
            eval {
                $vzdump->getlock($upid); # only one process allowed
            };
index 3101b6a25e6896fada26d86556b8ce2b743d49ea..4587a9d14a16f58ae14089a524d8a44feddfbe9b 100644 (file)
@@ -391,13 +391,21 @@ sub sendmail {
     return if (!$ecount && !$err && ($notify eq 'failure'));
 
     my $stat = ($ecount || $err) ? 'backup failed' : 'backup successful';
-    $stat .= ": $err" if $err;
+    if ($err) {
+       if ($err =~ /\n/) {
+           $stat .= ": multiple problems";
+       } else {
+           $stat .= ": $err";
+           $err = undef;
+       }
+    }
 
     my $hostname = `hostname -f` || PVE::INotify::nodename();
     chomp $hostname;
 
     # text part
-    my $text = sprintf ("%-10s %-6s %10s %10s  %s\n", qw(VMID STATUS TIME SIZE FILENAME));
+    my $text = $err ? "$err\n\n" : '';
+    $text .= sprintf ("%-10s %-6s %10s %10s  %s\n", qw(VMID STATUS TIME SIZE FILENAME));
     foreach my $task (@$tasklist) {
        my $vmid = $task->{vmid};
        if  ($task->{state} eq 'ok') {
@@ -433,6 +441,7 @@ sub sendmail {
 
     # html part
     my $html = "<html><body>\n";
+    $html .= "<p>" . (escape_html($err) =~ s/\n/<br>/gr) . "</p>\n" if $err;
     $html .= "<table border=1 cellpadding=3>\n";
     $html .= "<tr><td>VMID<td>NAME<td>STATUS<td>TIME<td>SIZE<td>FILENAME</tr>\n";
 
@@ -566,19 +575,28 @@ sub new {
        $opts->{storage} = 'local';
     }
 
+    my $errors = '';
+
     if ($opts->{storage}) {
        my $info = storage_info ($opts->{storage});
        $opts->{dumpdir} = $info->{dumpdir};
        $maxfiles = $info->{maxfiles} if !defined($maxfiles) && defined($info->{maxfiles});
     } elsif ($opts->{dumpdir}) {
-       die "dumpdir '$opts->{dumpdir}' does not exist\n"
+       $errors .= "dumpdir '$opts->{dumpdir}' does not exist"
            if ! -d $opts->{dumpdir};
     } else {
        die "internal error"; 
     }
 
     if ($opts->{tmpdir} && ! -d $opts->{tmpdir}) {
-       die "tmpdir '$opts->{tmpdir}' does not exist\n";
+       $errors .= "\n" if $errors;
+       $errors .= "tmpdir '$opts->{tmpdir}' does not exist";
+    }
+
+    if ($errors) {
+       eval { $self->sendmail([], 0, $errors); };
+       debugmsg ('err', $@) if $@;
+       die "$errors\n";
     }
 
     $opts->{maxfiles} = $maxfiles if defined($maxfiles);