[Bug] Exit if cmd_{pre,post}exec fail [sf#36]
bebehei opened this issue · comments
Reported by jasperla on 2012-06-15 07:56 UTC
Currently rsnapshot will just continue trying to do it's thing, even if cmd_{pre,post}exec fail for whatever reason. This can be quite nasty in case the
preexec script is meant to mount the target filesystem for example.
This patch adds support for cmd_preexec_error and cmd_postexec_error, a boolean variable.
Commented by jasperla on 2012-06-15 07:56 UTC
Implement cmd_{pre,post}exec_error options.
Attached filersnapshot.diff:
--- rsnapshot.conf.default.in.orig Sun Apr 27 12:26:16 2008
+++ rsnapshot.conf.default.in Fri Jun 15 09:34:03 2012
@@ -80,6 +80,14 @@ snapshot_root /.snapshots/
#
#cmd_postexec /path/to/postexec/script
+# If cmd_preexec_error is enabled, rsnapshot will treat a non-zero return-code from
+# cmd_preexec as fatal and will exit.
+#cmd_preexec_error 1
+
+# If cmd_postexec_error is enabled, rsnapshot will treat a non-zero return-code from
+# cmd_postexec as fatal and will exit.
+#cmd_postexec_error 1
+
#########################################
# BACKUP INTERVALS #
# Must be unique and in ascending order #
--- rsnapshot-program.pl.orig Sun Aug 31 13:17:07 2008
+++ rsnapshot-program.pl Fri Jun 15 09:32:20 2012
@@ -829,7 +829,43 @@ sub parse_config_file {
$line_syntax_ok = 1;
next;
}
-
+
+ # CHECK FOR cmd_preexec_error (optional)
+ if ($var eq 'cmd_preexec_error') {
+ if (defined($value)) {
+ if ('1' eq $value) {
+ $config_vars{'cmd_preexec_error'} = 1;
+ $line_syntax_ok = 1;
+ next;
+ } elsif ('0' eq $value) {
+ $config_vars{'cmd_preexec_error'} = 0;
+ $line_syntax_ok = 1;
+ next;
+ } else {
+ config_err($file_line_num, "$line - cmd_preexec_error must be set to either 1 or 0");
+ next;
+ }
+ }
+ }
+
+ # CHECK FOR cmd_postexec_error (optional)
+ if ($var eq 'cmd_postexec_error') {
+ if (defined($value)) {
+ if ('1' eq $value) {
+ $config_vars{'cmd_postexec_error'} = 1;
+ $line_syntax_ok = 1;
+ next;
+ } elsif ('0' eq $value) {
+ $config_vars{'cmd_postexec_error'} = 0;
+ $line_syntax_ok = 1;
+ next;
+ } else {
+ config_err($file_line_num, "$line - cmd_preexec_error must be set to either 1 or 0");
+ next;
+ }
+ }
+ }
+
# CHECK FOR rsnapshot-diff (optional)
if ($var eq 'cmd_rsnapshot_diff') {
$value =~ s/\s+$//; $value =~ s/\s+$//;
@@ -4058,13 +4092,25 @@ sub exec_cmd_preexec {
}
if (!defined($retval)) {
- print_err("$config_vars{'cmd_preexec'} not found", 2);
+ if (1 == $config_vars{'cmd_preexec_error'}) {
+ print_err ("$config_vars{'cmd_preexec'} not found", 2);
+ syslog_err("$config_vars{'cmd_preexec'} not found");
+ exit(1);
+ } else {
+ print_err ("$config_vars{'cmd_preexec'} not found", 2);
+ }
}
-
+
if (0 != $retval) {
- print_warn("cmd_preexec \"$config_vars{'cmd_preexec'}\" returned $retval", 2);
+ if (1 == $config_vars{'cmd_preexec_error'}) {
+ print_err ("cmd_preexec \"$config_vars{'cmd_preexec'}\" returned $retval", 2);
+ syslog_err ("cmd_preexec \"$config_vars{'cmd_preexec'}\" returned $retval");
+ exit(1);
+ } else {
+ print_warn("cmd_preexec \"$config_vars{'cmd_preexec'}\" returned $retval", 2);
+ }
}
-
+
return ($retval);
}
@@ -4079,13 +4125,25 @@ sub exec_cmd_postexec {
}
if (!defined($retval)) {
- print_err("$config_vars{'cmd_postexec'} not found", 2);
+ if (1 == $config_vars{'cmd_postexec_error'}) {
+ print_err ("$config_vars{'cmd_postexec'} not found", 2);
+ syslog_err("$config_vars{'cmd_postexec'} not found");
+ exit(1);
+ } else {
+ print_err ("$config_vars{'cmd_postexec'} not found", 2);
+ }
}
if (0 != $retval) {
- print_warn("cmd_postexec \"$config_vars{'cmd_postexec'}\" returned $retval", 2);
+ if (1 == $config_vars{'cmd_postexec_error'}) {
+ print_err ("cmd_postexec \"$config_vars{'cmd_postexec'}\" returned $retval", 1);
+ syslog_err ("cmd_postexec \"$config_vars{'cmd_postexec'}\" returned $retval");
+ exit(1);
+ } else {
+ print_warn("cmd_postexec \"$config_vars{'cmd_postexec'}\" returned $retval", 2);
+ }
}
-
+
return ($retval);
}
@@ -6206,6 +6260,17 @@ rotations).
=back
+B<cmd_preexec_error>
+
+B<cmd_postexec_error>
+
+=over 4
+
+If set to 1, rsnapshot will treat any non-zero return code from the
+cmd_preexec, cmd_postexec commands as fatal and will exit.
+
+=back
+
B<linux_lvm_cmd_lvcreate>
B<linux_lvm_cmd_lvremove>
ported to main repository: rsnapshot/rsnapshot#74