From 64d39c2ef26678ddc45508e3dec0086c6c4d4d83 Mon Sep 17 00:00:00 2001 From: Wolfgang Link Date: Thu, 7 Dec 2017 12:07:00 +0100 Subject: [PATCH] Send an email when a replication job fails. A email notification will be send for each job when the job fails. This message will only send when an error occurs and the fail count is on 1. Reviewed-by: Thomas Lamprecht Acked-by: Wolfgang Bumiller --- PVE/API2/Replication.pm | 18 ++++++++++++++++-- PVE/CLI/pvesr.pm | 11 ++++++++++- bin/init.d/pvesr.service | 2 +- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/PVE/API2/Replication.pm b/PVE/API2/Replication.pm index 38449892f..8c049363f 100644 --- a/PVE/API2/Replication.pm +++ b/PVE/API2/Replication.pm @@ -72,7 +72,7 @@ sub run_single_job { # passing $now and $verbose is useful for regression testing sub run_jobs { - my ($now, $logfunc, $verbose) = @_; + my ($now, $logfunc, $verbose, $mail) = @_; my $iteration = $now // time(); @@ -83,7 +83,21 @@ sub run_jobs { while (my $jobcfg = PVE::ReplicationState::get_next_job($iteration, $start_time)) { my $guest_class = $lookup_guest_class->($jobcfg->{vmtype}); - PVE::Replication::run_replication($guest_class, $jobcfg, $iteration, $start_time, $logfunc, 1, $verbose); + + eval { + PVE::Replication::run_replication($guest_class, $jobcfg, $iteration, $start_time, $logfunc, $verbose); + }; + if (my $err = $@) { + warn "$jobcfg->{id}: got unexpected replication job error - $err"; + my $state = PVE::ReplicationState::read_state(); + my $jobstate = PVE::ReplicationState::extract_job_state($state, $jobcfg); + eval { + PVE::Tools::sendmail('root', "Replication Job: $jobcfg->{id} failed", $err) + if $jobstate->{fail_count} == 1 && $mail; + }; + warn ": $@" if $@; + }; + $start_time = $now // time(); } }; diff --git a/PVE/CLI/pvesr.pm b/PVE/CLI/pvesr.pm index 7da94404b..cb79e2bf9 100644 --- a/PVE/CLI/pvesr.pm +++ b/PVE/CLI/pvesr.pm @@ -221,12 +221,21 @@ __PACKAGE__->register_method ({ default => 0, optional => 1, }, + mail => { + description => "Send an email notification in case of a failure.", + type => 'boolean', + default => 0, + optional => 1, + }, }, }, returns => { type => 'null' }, code => sub { my ($param) = @_; + die "Mail and id are mutually exclusive!\n" + if $param->{id} && $param->{mail}; + my $logfunc; if ($param->{verbose}) { @@ -242,7 +251,7 @@ __PACKAGE__->register_method ({ } else { - PVE::API2::Replication::run_jobs(undef, $logfunc); + PVE::API2::Replication::run_jobs(undef, $logfunc, 0, $param->{mail}); } return undef; diff --git a/bin/init.d/pvesr.service b/bin/init.d/pvesr.service index 5706d4265..e0c082afc 100644 --- a/bin/init.d/pvesr.service +++ b/bin/init.d/pvesr.service @@ -4,4 +4,4 @@ ConditionPathExists=/usr/bin/pvesr [Service] Type=oneshot -ExecStart=/usr/bin/pvesr run +ExecStart=/usr/bin/pvesr run --mail 1