From: Eric Bollengier Date: Mon, 31 Jan 2022 10:07:54 +0000 (+0100) Subject: Add RunScript when=EndJob option X-Git-Tag: Beta-15.0.0~660 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=046cee3cb378ce7a8c7bdf48146716c99d1b9e31;p=thirdparty%2Fbacula.git Add RunScript when=EndJob option --- diff --git a/bacula/src/dird/admin.c b/bacula/src/dird/admin.c index 80a335ba6..708fda262 100644 --- a/bacula/src/dird/admin.c +++ b/bacula/src/dird/admin.c @@ -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 */ diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index 353291a35..1f232430b 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -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 */ diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index 99e6c67c7..783a035ac 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -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); } diff --git a/bacula/src/dird/fd_cmds.c b/bacula/src/dird/fd_cmds.c index 4249bc113..64738597e 100644 --- a/bacula/src/dird/fd_cmds.c +++ b/bacula/src/dird/fd_cmds.c @@ -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, diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index f1e2c09ad..5c8bdddee 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -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); diff --git a/bacula/src/dird/mac.c b/bacula/src/dird/mac.c index 03e0088c7..aead3e568 100644 --- a/bacula/src/dird/mac.c +++ b/bacula/src/dird/mac.c @@ -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 */ diff --git a/bacula/src/dird/restore.c b/bacula/src/dird/restore.c index 282abce38..911c7523f 100644 --- a/bacula/src/dird/restore.c +++ b/bacula/src/dird/restore.c @@ -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 */ diff --git a/bacula/src/dird/vbackup.c b/bacula/src/dird/vbackup.c index fafbcdc96..465392084 100644 --- a/bacula/src/dird/vbackup.c +++ b/bacula/src/dird/vbackup.c @@ -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 */ diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 999e664d2..87b081f12 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -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 */ diff --git a/bacula/src/jcr.h b/bacula/src/jcr.h index 07bc3d87e..e12b08842 100644 --- a/bacula/src/jcr.h +++ b/bacula/src/jcr.h @@ -92,10 +92,13 @@ #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 }; diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index 1a5a9527c..2724126c8 100644 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -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); diff --git a/bacula/src/lib/runscript.c b/bacula/src/lib/runscript.c index fcc4cf059..7223d0988 100644 --- a/bacula/src/lib/runscript.c +++ b/bacula/src/lib/runscript.c @@ -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)) diff --git a/bacula/src/lib/runscript.h b/bacula/src/lib/runscript.h index f0969007a..8ce8307c7 100644 --- a/bacula/src/lib/runscript.h +++ b/bacula/src/lib/runscript.h @@ -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 };