[pve-devel] [PATCH manager] Fix #1015: vzdump: send email on early errors
Dominik Csapak
d.csapak at proxmox.com
Mon Jun 6 11:02:20 CEST 2016
comments inline:
> 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 | 4 ++--
> PVE/VZDump.pm | 26 ++++++++++++++++++++++----
> 2 files changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/PVE/API2/VZDump.pm b/PVE/API2/VZDump.pm
> index 91b8a27..2e90078 100644
> --- a/PVE/API2/VZDump.pm
> +++ b/PVE/API2/VZDump.pm
> @@ -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
> };
> diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm
> index 3101b6a..5ee6f0b 100644
> --- a/PVE/VZDump.pm
> +++ b/PVE/VZDump.pm
> @@ -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/) {
should it not be /\n/m for multiline matches?
> + $stat .= ": multiple probles";
s/probles/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);
>
More information about the pve-devel
mailing list