]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Add RunScript when=EndJob option
authorEric Bollengier <eric@baculasystems.com>
Mon, 31 Jan 2022 10:07:54 +0000 (11:07 +0100)
committerEric Bollengier <eric@baculasystems.com>
Thu, 14 Sep 2023 11:56:57 +0000 (13:56 +0200)
13 files changed:
bacula/src/dird/admin.c
bacula/src/dird/backup.c
bacula/src/dird/dird_conf.c
bacula/src/dird/fd_cmds.c
bacula/src/dird/job.c
bacula/src/dird/mac.c
bacula/src/dird/restore.c
bacula/src/dird/vbackup.c
bacula/src/dird/verify.c
bacula/src/jcr.h
bacula/src/lib/jcr.c
bacula/src/lib/runscript.c
bacula/src/lib/runscript.h

index 80a335ba69373a02d1cef03e7f9a3a0cf4c567d9..708fda262cf321d6424bfaf65e6a61351c4f13ed 100644 (file)
@@ -80,7 +80,7 @@ void admin_cleanup(JCR *jcr, int TermCode)
    /* Job needs to be marked as terminated before running the after runscript */
    jcr->setJobStatus(TermCode);
 
-   run_scripts(jcr, jcr->job->RunScripts, "AfterJob");
+   run_scripts(jcr, jcr->job->RunScripts, "EndJob");
 
    /* Runscript could have changed JobStatus,
     * now check if it should be changed in the report or not */
index 353291a35f5fdf7a563807bb7b2b3760a84c8477..1f232430bde2c764ddc9a7ee48bf87423a94949e 100644 (file)
@@ -994,7 +994,7 @@ void backup_cleanup(JCR *jcr, int TermCode)
    /* Job needs to be marked as terminated before running the after runscript */
    jcr->setJobStatus(TermCode);
 
-   run_scripts(jcr, jcr->job->RunScripts, "AfterJob");
+   run_scripts(jcr, jcr->job->RunScripts, "EndJob");
 
    /* Runscript could have changed JobStatus,
     * now check if it should be changed in the report or not */
index 99e6c67c7d38af55c19a1746da23252303c9fd8c..783a035ac4508778fd93aef5f6f91c3c4d9f5c2d 100644 (file)
@@ -2481,10 +2481,12 @@ static void store_runscript_when(LEX *lc, RES_ITEM *item, int index, int pass)
       *(uint32_t *)(item->value) = SCRIPT_AfterVSS;
    } else if (strcasecmp(lc->str, "aftersnapshot") == 0) {
       *(uint32_t *)(item->value) = SCRIPT_AfterVSS;
+   } else if (strcasecmp(lc->str, "endjob") == 0) {
+      *(uint32_t *)(item->value) = SCRIPT_EndJob;
    } else if (strcasecmp(lc->str, "always") == 0) {
       *(uint32_t *)(item->value) = SCRIPT_Any;
    } else {
-      scan_err2(lc, _("Expect %s, got: %s"), "Before, After, AfterVSS or Always", lc->str);
+      scan_err2(lc, _("Expect %s, got: %s"), "Before, EndJob, After, AfterVSS or Always", lc->str);
    }
    scan_to_eol(lc);
 }
index 4249bc11372f2da3ec378cff0cedb8dbde32658f..64738597e7c3c1b1bdddf9e2770a809d0b61ddcd 100644 (file)
@@ -832,6 +832,8 @@ int send_runscripts_commands(JCR *jcr)
                result = send_runscript_with_old_proto(jcr, cmd->when, msg);
 
             } else {
+               /* On the FileDaemon, EndJob is a synonym of After */
+               cmd->when = (cmd->when == SCRIPT_EndJob) ? SCRIPT_After : cmd->when;
                fd->fsend(runscript, cmd->on_success,
                                     cmd->on_failure,
                                     cmd->fail_on_error,
index f1e2c09ad9d5e79829b1e1373c304445fd23ba78..5c8bdddeee4f57eddf4a7b9933def0b42e8a0691 100644 (file)
@@ -509,6 +509,8 @@ static void *job_thread(void *arg)
       break;
    }
 
+   run_scripts(jcr, jcr->job->RunScripts, "AfterJob");
+
    /* Send off any queued messages */
    if (jcr->msg_queue && jcr->msg_queue->size() > 0) {
       dequeue_messages(jcr);
index 03e0088c77f8556b46010984535bf3dc1667b939..aead3e5686a43249f990c2c933064ab5636a3151 100644 (file)
@@ -855,7 +855,7 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode)
          db_sql_query(wjcr->db, query.c_str(), NULL, NULL);
       }
    }
-   run_scripts(jcr, jcr->job->RunScripts, "AfterJob");
+   run_scripts(jcr, jcr->job->RunScripts, "EndJob");
 
    /* Runscript could have changed JobStatus,
     * now check if it should be changed in the report or not */
index 282abce382af6a0e1557e1ae4fbf462ed1c5daa6..911c7523f7dcc6f1cde7d4b44c589cec259b71de 100644 (file)
@@ -661,7 +661,7 @@ void restore_cleanup(JCR *jcr, int TermCode)
    /* Job needs to be marked as terminated before running the after runscript */
    jcr->setJobStatus(TermCode);
 
-   run_scripts(jcr, jcr->job->RunScripts, "AfterJob");
+   run_scripts(jcr, jcr->job->RunScripts, "EndJob");
 
    /* Runscript could have changed JobStatus,
     * now check if it should be changed in the report or not */
index fafbcdc960500e3eccc26b6ef49d0fee667b5663..46539208481dd6baddcfdf7018090ee91c3e2438 100644 (file)
@@ -405,7 +405,7 @@ void vbackup_cleanup(JCR *jcr, int TermCode)
    /* Job needs to be marked as terminated before running the after runscript */
    jcr->setJobStatus(TermCode);
 
-   run_scripts(jcr, jcr->job->RunScripts, "AfterJob");
+   run_scripts(jcr, jcr->job->RunScripts, "EndJob");
 
    /* Runscript could have changed JobStatus,
     * now check if it should be changed in the report or not */
index 999e664d229521f88f3a6c3bf882915882db5bff..87b081f12ab08cda2c298fbe2c8ce659525de9a5 100644 (file)
@@ -472,7 +472,7 @@ void verify_cleanup(JCR *jcr, int TermCode)
    /* Job needs to be marked as terminated before running the after runscript */
    jcr->setJobStatus(TermCode);
 
-   run_scripts(jcr, jcr->job->RunScripts, "AfterJob");
+   run_scripts(jcr, jcr->job->RunScripts, "EndJob");
 
    /* Runscript could have changed JobStatus,
     * now check if it should be changed in the report or not */
index 07bc3d87ea4c4bf47dfe70af825e39da31e9aa88..e12b0884274da4d79fde0d4710d3fd8b2784909c 100644 (file)
 #define JS_CloudUpload           'u'  /* Cloud upload */
 #define JS_CloudDownload         'w'  /* Cloud download */
 
-/* Helper for more descriptive job status */
+/* Helper for more descriptive job status 
+ * Edit jcr.c as well for the string mapping
+ */
 enum {
    JOB_TASK_ZERO = 0,
    JOB_TASK_BEFORE_SCRIPT = 100,
+   JOB_TASK_ENDJOB_SCRIPT,
    JOB_TASK_AFTER_SCRIPT
 };
 
index 1a5a9527c4fd0b0089f7d667cd3de1f5924b42d3..2724126c825b46575156ab804fb42c7c2d59d83b 100644 (file)
@@ -82,9 +82,10 @@ static char Job_status[] = "Status JobId=%ld JobStatus=%d\n";
 
 /* Mapping of operation code to operation description */
 const struct job_task job_task_map[] = {
-   { JOB_TASK_ZERO, "\0" },
-   { JOB_TASK_BEFORE_SCRIPT, "executing Before Job Scripts" },
-   { JOB_TASK_AFTER_SCRIPT, "executing After Job Scripts" }
+   { JOB_TASK_ZERO, "" },
+   { JOB_TASK_BEFORE_SCRIPT, _("executing Before Job Scripts") },
+   { JOB_TASK_ENDJOB_SCRIPT, _("executing End Job Scripts") },
+   { JOB_TASK_AFTER_SCRIPT, _("executing After Job Scripts") }
 };
 
 const uint32_t job_task_map_size = sizeof(job_task_map) / sizeof(job_task);
index fcc4cf0591c900339d8d6987d95fd2c8b8e2d0df..7223d0988f783c57a82a10a7f30ae84306297bcb 100644 (file)
@@ -107,6 +107,8 @@ int run_scripts(JCR *jcr, alist *runscripts, const char *label)
       when = SCRIPT_Before;
    } else if (bstrcmp(label, NT_("ClientAfterVSS"))) {
       when = SCRIPT_AfterVSS;
+   } else if (bstrcmp(label, NT_("EndJob"))) {
+      when = SCRIPT_EndJob;
    } else {
       when = SCRIPT_After;
    }
@@ -150,6 +152,23 @@ int run_scripts(JCR *jcr, alist *runscripts, const char *label)
          }
       }
 
+      if ((script->when & SCRIPT_EndJob) && (when & SCRIPT_EndJob)) {
+         Dmsg1(0, "EndJob jobstatus=%c\n", jcr->JobStatus);
+         if ((script->on_success &&
+              (jcr->JobStatus == JS_Terminated || jcr->JobStatus == JS_Warnings))
+            || (script->on_failure &&
+                (job_canceled(jcr) || jcr->JobStatus == JS_Differences))
+            )
+         {
+            Dmsg4(200, "runscript: Run it because SCRIPT_EndJob (%s,%i,%i,%c)\n",
+                  script->command, script->on_success, script->on_failure,
+                  jcr->JobStatus );
+            /* Set job task code */
+            jcr->job_task = JOB_TASK_ENDJOB_SCRIPT;
+            runit = true;
+         }
+      }
+
       if ((script->when & SCRIPT_After) && (when & SCRIPT_After)) {
          if ((script->on_success &&
               (jcr->JobStatus == JS_Terminated || jcr->JobStatus == JS_Warnings))
index f0969007afcbe54b6dd29b97b2744a0c88065f49..8ce8307c789e13f6adf14a33c5d5ef8a32bfd0ec 100644 (file)
@@ -49,6 +49,7 @@ enum {
    SCRIPT_After  = (1<<0),      /* AfterJob */
    SCRIPT_Before = (1<<1),      /* BeforeJob */
    SCRIPT_AfterVSS = (1<<2),    /* BeforeJob and After VSS */
+   SCRIPT_EndJob = (1<<3),      /* Before AfterJob on the Director, take status in account */
    SCRIPT_Any    = SCRIPT_Before | SCRIPT_After
 };