[pve-devel] [PATCH V4 manager 2/2] Send an email when a replication job fails.

Wolfgang Link w.link at proxmox.com
Thu Dec 7 12:07:00 CET 2017


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.
---
 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 38449892..8c049363 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 7da94404..cb79e2bf 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 5706d426..e0c082af 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
-- 
2.11.0





More information about the pve-devel mailing list