]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/runscript.c
Working directory pane in restore. Will get this into the stack next.
[bacula/bacula] / bacula / src / lib / runscript.c
index c73cc1012c47d04351d88171b28752ba8718ecc5..871de9ebbf92529926843dafda9851efe23b9370 100644 (file)
@@ -7,19 +7,32 @@
  *
  */
 /*
-   Copyright (C) 2000-2006 Kern Sibbald
+   Bacula® - The Network Backup Solution
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License
-   version 2 as amended with additional clauses defined in the
-   file LICENSE in the main source directory.
+   Copyright (C) 2006-2006 Free Software Foundation Europe e.V.
 
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
-   the file LICENSE for additional details.
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version two of the GNU General Public
+   License as published by the Free Software Foundation plus additions
+   that are listed in the file LICENSE.
 
- */
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+   Bacula® is a registered trademark of John Walker.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
 
 
 #include "bacula.h"
@@ -52,6 +65,7 @@ void RUNSCRIPT::reset_default(bool free_strings)
    on_failure = false;
    abort_on_error = true;
    when = SCRIPT_Never;
+   old_proto = false;        /* TODO: drop this with bacula 1.42 */
 }
 
 RUNSCRIPT *copy_runscript(RUNSCRIPT *src)
@@ -91,6 +105,14 @@ int run_scripts(JCR *jcr, alist *runscripts, const char *label)
    bool runit;
    bool status;
 
+   int when;
+
+   if (strstr(label, NT_("Before"))) {
+      when = SCRIPT_Before;
+   } else {
+      when = SCRIPT_After;
+   }
+
    if (runscripts == NULL) {
       Dmsg0(100, "runscript: WARNING RUNSCRIPTS list is NULL\n");
       return 0;
@@ -100,29 +122,33 @@ int run_scripts(JCR *jcr, alist *runscripts, const char *label)
       Dmsg2(200, "runscript: try to run %s:%s\n", NPRT(script->target), NPRT(script->command));
       runit=false;
 
-      if ((script->when & SCRIPT_Before) && (jcr->JobStatus == JS_Created)) {
-        Dmsg0(200, "runscript: Run it because SCRIPT_Before\n");
-        runit = true;
-      }
-
-      if ((script->when & SCRIPT_Before) && (jcr->JobStatus == JS_Running)) {
-        Dmsg0(200, "runscript: Run it because SCRIPT_Before\n");
-        runit = true;
+      if ((script->when & SCRIPT_Before) && (when & SCRIPT_Before)) {
+        if (  (script->on_success && (jcr->JobStatus == JS_Running || jcr->JobStatus == JS_Created))
+              ||
+              (script->on_failure && job_canceled(jcr))
+           )
+        {
+           Dmsg4(200, "runscript: Run it because SCRIPT_Before (%s,%i,%i,%c)\n", script->command,
+                                                                                  script->on_success,
+                                                                                  script->on_failure,
+                                                                                  jcr->JobStatus );
+
+           runit = true;
+        }
       }
 
-      if (script->when & SCRIPT_After) {
-        if (  (script->on_success && (jcr->JobStatus == JS_Terminated))
-            ||
-              (script->on_failure && job_canceled(jcr))
-           )
-        {
-           Dmsg4(200, "runscript: Run it because SCRIPT_After (%s,%i,%i,%c)\n", script->command,
-                                                                                script->on_success,
-                                                                                script->on_failure,
-                                                                                jcr->JobStatus );
-           script->when ^= SCRIPT_After; /* reset SCRIPT_After bit */
-           runit = true;
-        }
+      if ((script->when & SCRIPT_After) && (when & SCRIPT_After)) {
+        if (  (script->on_success && (jcr->JobStatus == JS_Terminated))
+              ||
+              (script->on_failure && job_canceled(jcr))
+           )
+        {
+           Dmsg4(200, "runscript: Run it because SCRIPT_After (%s,%i,%i,%c)\n", script->command,
+                                                                                 script->on_success,
+                                                                                 script->on_failure,
+                                                                                 jcr->JobStatus );
+           runit = true;
+        }
       }
 
       if (!script->is_local()) {
@@ -136,7 +162,7 @@ int run_scripts(JCR *jcr, alist *runscripts, const char *label)
         /* cancel running job properly */
         if (   script->abort_on_error 
             && (status == false) 
-            && (jcr->JobStatus == JS_Created)
+            && (jcr->JobStatus == JS_Created || jcr->JobStatus == JS_Running)
            )
         {
            set_jcr_job_status(jcr, JS_ErrorTerminated);
@@ -174,7 +200,7 @@ void RUNSCRIPT::set_command(const POOLMEM *cmd)
 /* set this->target to client_name */
 void RUNSCRIPT::set_target(const POOLMEM *client_name)
 {
-   Dmsg1(500, "runscript: setting target\n", NPRT(client_name));
+   Dmsg1(500, "runscript: setting target = %s\n", NPRT(client_name));
 
    if (!client_name) {
       return;
@@ -203,7 +229,7 @@ int RUNSCRIPT::run(JCR *jcr, const char *name)
    free_pool_memory(ecmd);
    if (bpipe == NULL) {
       berrno be;
-      Jmsg(jcr, M_FATAL, 0, _("%s could not execute. ERR=%s\n"), name,
+      Jmsg(jcr, M_ERROR, 0, _("Runscript: %s could not execute. ERR=%s\n"), name,
          be.strerror());
       return false;
    }
@@ -217,8 +243,8 @@ int RUNSCRIPT::run(JCR *jcr, const char *name)
    status = close_bpipe(bpipe);
    if (status != 0) {
       berrno be;
-      Jmsg(jcr, M_FATAL, 0, _("%s returned non-zero status=%d. ERR=%s\n"), name,
-         status, be.strerror(status));
+      Jmsg(jcr, M_ERROR, 0, _("Runscript: %s returned non-zero status=%d. ERR=%s\n"), name,
+         be.code(status), be.strerror(status));
       return false;
    }
    return true;