]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/job.c
Server address binding + bscan updates -- see kes25Sep02
[bacula/bacula] / bacula / src / dird / job.c
index dee93224dff81e98e00e17af0a4e6126fdb22c6d..ebf9bac1b4b65c4f390d4c993e8d2170e26ac731 100644 (file)
@@ -31,6 +31,7 @@
 
 /* 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);
@@ -44,7 +45,6 @@ extern int do_backup(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 */
@@ -69,12 +69,13 @@ void run_job(JCR *jcr)
 {
    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->level;
+   jcr->jr.Level = jcr->JobLevel;
+   jcr->jr.JobStatus = jcr->JobStatus;
    strcpy(jcr->jr.Name, jcr->job->hdr.name);
    strcpy(jcr->jr.Job, jcr->Job);
 
@@ -90,7 +91,7 @@ void run_job(JCR *jcr)
     * 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));
@@ -101,7 +102,6 @@ void run_job(JCR *jcr)
    }
    Dmsg0(50, "DB opened\n");
 
-
    /*
     * Create Job record  
     */
@@ -152,6 +152,14 @@ static void job_thread(void *arg)
       /* 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);
@@ -161,21 +169,34 @@ static void job_thread(void *arg)
            break;
         case JT_VERIFY:
            do_verify(jcr);
-//         do_autoprune(jcr);
+           if (jcr->JobStatus == JS_Terminated) {
+              do_autoprune(jcr);
+           }
            break;
         case JT_RESTORE:
            do_restore(jcr);
-//         do_autoprune(jcr);
+           if (jcr->JobStatus == JS_Terminated) {
+              do_autoprune(jcr);
+           }
            break;
         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");
@@ -194,16 +215,17 @@ int get_or_create_client_record(JCR *jcr)
    cr.FileRetention = jcr->client->FileRetention;
    cr.JobRetention = jcr->client->JobRetention;
    if (jcr->client_name) {
-      free(jcr->client_name);
+      free_pool_memory(jcr->client_name);
    }
-   jcr->client_name = bstrdup(jcr->client->hdr.name);
+   jcr->client_name = get_memory(strlen(jcr->client->hdr.name) + 1);
+   strcpy(jcr->client_name, jcr->client->hdr.name);
    if (!db_create_client_record(jcr->db, &cr)) {
-      Jmsg(jcr, M_ERROR, 0, _("Could not create Client record. %s"), 
+      Jmsg(jcr, M_FATAL, 0, _("Could not create Client record. %s"), 
         db_strerror(jcr->db));
       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;
 }
@@ -306,6 +328,9 @@ void dird_free_jcr(JCR *jcr)
    if (jcr->RestoreWhere) {
       free(jcr->RestoreWhere);
    }
+   if (jcr->RestoreBootstrap) {
+      free(jcr->RestoreBootstrap);
+   }
    Dmsg0(200, "End dird free_jcr\n");
 }
 
@@ -320,28 +345,113 @@ void set_jcr_defaults(JCR *jcr, JOB *job)
 {
    jcr->job = job;
    jcr->JobType = job->JobType;
-   jcr->level = job->level;
+   jcr->JobLevel = job->level;
    jcr->store = job->storage;
    jcr->client = job->client;
    if (jcr->client_name) {
-      free(jcr->client_name);
+      free_pool_memory(jcr->client_name);
    }
-   jcr->client_name = bstrdup(job->client->hdr.name);
+   jcr->client_name = get_memory(strlen(jcr->client->hdr.name) + 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);
+   }
+   /* This can be overridden by Console program */
+   if (job->RestoreBootstrap) {
+      jcr->RestoreBootstrap = bstrdup(job->RestoreBootstrap);
+   }
    /* If no default level given, set one */
-   if (jcr->level == 0) {
+   if (jcr->JobLevel == 0) {
       switch (jcr->JobType) {
       case JT_VERIFY:
-        jcr->level = L_VERIFY_CATALOG;
+        jcr->JobLevel = L_VERIFY_CATALOG;
         break;
       case JT_BACKUP:
-        jcr->level = L_INCREMENTAL;
+        jcr->JobLevel = L_INCREMENTAL;
         break;
       default:
         break;
       }
    }
 }
+
+/*
+ * 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;
+}