rsnapshot / sourceforge-issues

Issues imported from sourceforge. These are just to track down everything on github. After closing all issues, we remove the repo again. Please don't open any issues here!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[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