/* Forward referenced subroutines */
static void job_thread(void *arg);
+static char *edit_run_codes(JCR *jcr, char *omsg, char *imsg);
/* Exported subroutines */
void run_job(JCR *jcr);
extern int do_restore(JCR *jcr);
extern int do_verify(JCR *jcr);
extern void backup_cleanup(void);
-extern void start_UA_server(int port);
/* Queue of jobs to be run */
static workq_t job_wq; /* our job work queue */
{
int stat, errstat;
- init_msg(jcr, jcr->msgs);
+ init_msg(jcr, jcr->messages);
create_unique_job_name(jcr, jcr->job->hdr.name);
jcr->jr.SchedTime = jcr->sched_time;
jcr->jr.StartTime = jcr->start_time;
jcr->jr.Type = jcr->JobType;
jcr->jr.Level = jcr->JobLevel;
+ jcr->jr.JobStatus = jcr->JobStatus;
strcpy(jcr->jr.Name, jcr->job->hdr.name);
strcpy(jcr->jr.Job, jcr->Job);
* Open database
*/
Dmsg0(50, "Open database\n");
- jcr->db=db_init_database(jcr->catalog->db_name, jcr->catalog->db_user,
+ jcr->db=db_init_database(jcr, jcr->catalog->db_name, jcr->catalog->db_user,
jcr->catalog->db_password);
if (!db_open_database(jcr->db)) {
Jmsg(jcr, M_FATAL, 0, "%s", db_strerror(jcr->db));
/* Run Job */
jcr->JobStatus = JS_Running;
+ if (jcr->job->RunBeforeJob) {
+ POOLMEM *before = get_pool_memory(PM_FNAME);
+ int status;
+
+ before = edit_run_codes(jcr, before, jcr->job->RunBeforeJob);
+ status = run_program(before, 0, NULL);
+ free_pool_memory(before);
+ }
switch (jcr->JobType) {
case JT_BACKUP:
do_backup(jcr);
case JT_ADMIN:
/* No actual job */
do_autoprune(jcr);
+ jcr->JobStatus = JS_Terminated;
break;
default:
- Dmsg1(0, "Unimplemented job type: %d\n", jcr->JobType);
+ Pmsg1(0, "Unimplemented job type: %d\n", jcr->JobType);
break;
}
}
+ if (jcr->job->RunAfterJob) {
+ POOLMEM *after = get_pool_memory(PM_FNAME);
+ int status;
+
+ after = edit_run_codes(jcr, after, jcr->job->RunAfterJob);
+ status = run_program(after, 0, NULL);
+ free_pool_memory(after);
+ }
Dmsg0(50, "Before free jcr\n");
free_jcr(jcr);
Dmsg0(50, "======== End Job ==========\n");
return 0;
}
jcr->jr.ClientId = cr.ClientId;
- Dmsg2(9, "Created Client %s record %d\n", jcr->client->hdr.name,
+ Dmsg2(100, "Created Client %s record %d\n", jcr->client->hdr.name,
jcr->jr.ClientId);
return 1;
}
strcpy(jcr->client_name, jcr->client->hdr.name);
jcr->pool = job->pool;
jcr->catalog = job->client->catalog;
- jcr->fileset = job->fs;
- jcr->msgs = job->messages;
+ jcr->fileset = job->fileset;
+ jcr->messages = job->messages;
if (jcr->RestoreBootstrap) {
free(jcr->RestoreBootstrap);
}
}
}
}
+
+/*
+ * Edit codes into Run command
+ * %% = %
+ * %c = Client's name
+ * %d = Director's name
+ * %i = JobId
+ * %e = Job Exit
+ * %j = Job
+ * %l = Job Level
+ * %n = Job name
+ * %t = Job type
+ *
+ * omsg = edited output message
+ * imsg = input string containing edit codes (%x)
+ *
+ */
+static char *edit_run_codes(JCR *jcr, char *omsg, char *imsg)
+{
+ char *p;
+ const char *str;
+ char add[20];
+
+ *omsg = 0;
+ Dmsg1(200, "edit_run_codes: %s\n", imsg);
+ for (p=imsg; *p; p++) {
+ if (*p == '%') {
+ switch (*++p) {
+ case '%':
+ str = "%";
+ break;
+ case 'c':
+ str = jcr->client_name;
+ if (!str) {
+ str = "";
+ }
+ break;
+ case 'd':
+ str = my_name;
+ break;
+ case 'e':
+ str = job_status_to_str(jcr->JobStatus);
+ break;
+ case 'i':
+ sprintf(add, "%d", jcr->JobId);
+ str = add;
+ break;
+ case 'j': /* Job */
+ str = jcr->Job;
+ break;
+ case 'l':
+ str = job_level_to_str(jcr->JobLevel);
+ break;
+ case 'n':
+ str = jcr->job->hdr.name;
+ break;
+ case 't':
+ str = job_type_to_str(jcr->JobType);
+ break;
+ default:
+ add[0] = '%';
+ add[1] = *p;
+ add[2] = 0;
+ str = add;
+ break;
+ }
+ } else {
+ add[0] = *p;
+ add[1] = 0;
+ str = add;
+ }
+ Dmsg1(200, "add_str %s\n", str);
+ pm_strcat(&omsg, (char *)str);
+ Dmsg1(200, "omsg=%s\n", omsg);
+ }
+ return omsg;
+}