]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/dird.c
Massive SD calling sequence reorganization
[bacula/bacula] / bacula / src / dird / dird.c
index 3865ed058792b681054b740d153fb35ebee91e78..6e36523d4e24cfa5eeaaf990d0dbd1f095580a8e 100644 (file)
@@ -44,8 +44,9 @@ void term_scheduler();
 void term_ua_server();
 int do_backup(JCR *jcr);
 void backup_cleanup(void);
-void start_UA_server(char *addr, int port);
+void start_UA_server(dlist *addrs);
 void init_job_server(int max_workers);
+void term_job_server();
 void store_jobtype(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_level(LEX *lc, RES_ITEM *item, int index, int pass);
 void store_replace(LEX *lc, RES_ITEM *item, int index, int pass);
@@ -213,8 +214,8 @@ int main (int argc, char *argv[])
    }
 
    /* Create pid must come after we are a daemon -- so we have our final pid */
-   create_pid_file(director->pid_directory, "bacula-dir", director->DIRport);
-   read_state_file(director->working_directory, "bacula-dir", director->DIRport);
+   create_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
+   read_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
 
    drop(uid, gid);                   /* reduce priveleges if requested */
 
@@ -226,7 +227,7 @@ int main (int argc, char *argv[])
       4 /* UA */ + 4 /* sched+watchdog+jobsvr+misc */);
 
    Dmsg0(200, "Start UA server\n");
-   start_UA_server(director->DIRaddr, director->DIRport);
+   start_UA_server(director->DIRaddrs);
 
    start_watchdog();                 /* start network watchdog thread */
 
@@ -256,10 +257,11 @@ static void terminate_dird(int sig)
       exit(1);
    }
    already_here = TRUE;
-   write_state_file(director->working_directory, "bacula-dir", director->DIRport);
-   delete_pid_file(director->pid_directory, "bacula-dir", director->DIRport);
+   write_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
+   delete_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
 // signal(SIGCHLD, SIG_IGN);          /* don't worry about children now */
    term_scheduler();
+   term_job_server();
    if (runjob) {
       free(runjob);
    }
@@ -521,6 +523,9 @@ Without that I don't know who I am :-(\n"), configfile);
                  }
                  *svalue = bstrdup(*def_svalue);
                  set_bit(i, job->hdr.item_present);
+              /*
+               * Handle resources   
+               */
               } else if (job_items[i].handler == store_res) {
                  def_svalue = (char **)((char *)(job->jobdefs) + offset);
                   Dmsg4(400, "Job \"%s\", field \"%s\" item %d offset=%u\n", 
@@ -531,6 +536,22 @@ Without that I don't know who I am :-(\n"), configfile);
                  }
                  *svalue = *def_svalue;
                  set_bit(i, job->hdr.item_present);
+              /*
+               * Handle alist resources
+               */
+              } else if (job_items[i].handler == store_alist_res) {
+                 int count = job_items[i].default_value;
+                 def_svalue = (char **)((char *)(job->jobdefs) + offset);
+                  Dmsg4(400, "Job \"%s\", field \"%s\" item %d offset=%u\n", 
+                      job->hdr.name, job_items[i].name, i, offset);
+                 svalue = (char **)((char *)job + offset);
+                 if (*svalue) {
+                     Pmsg1(000, "Hey something is wrong. p=0x%lu\n", *svalue);
+                 }
+                 while (count--) {
+                    *svalue++ = *def_svalue++;
+                 }
+                 set_bit(i, job->hdr.item_present);
               /*
                * Handle integer fields 
                *    Note, our store_yesno does not handle bitmaped fields
@@ -569,7 +590,7 @@ Without that I don't know who I am :-(\n"), configfile);
       for (i=0; job_items[i].name; i++) {
         if (job_items[i].flags & ITEM_REQUIRED) {
               if (!bit_is_set(i, job->hdr.item_present)) {  
-                  Jmsg(NULL, M_FATAL, 0, "Field \"%s\" in Job \"%s\" resource is required, but not found.\n",
+                  Jmsg(NULL, M_FATAL, 0, "\"%s\" directive in Job \"%s\" resource is required, but not found.\n",
                    job_items[i].name, job->hdr.name);
                  OK = false;
                }
@@ -579,59 +600,63 @@ Without that I don't know who I am :-(\n"), configfile);
             Emsg0(M_ERROR_TERM, 0, "Too many items in Job resource\n");
         }
       }
-      if (job->client && job->client->catalog) {
-        CAT *catalog = job->client->catalog;
-        B_DB *db;
-
-        /*
-         * Make sure we can open catalog, otherwise print a warning
-         * message because the server is probably not running.
-         */
-        db = db_init_database(NULL, catalog->db_name, catalog->db_user,
-                           catalog->db_password, catalog->db_address,
-                           catalog->db_port, catalog->db_socket);
-        if (!db || !db_open_database(NULL, db)) {
-            Jmsg(NULL, M_FATAL, 0, _("Could not open database \"%s\".\n"),
-                catalog->db_name);
-           if (db) {
-               Jmsg(NULL, M_FATAL, 0, _("%s"), db_strerror(db));
-           }
-           OK = false;
-        } else {
-           /* If a pool is defined for this job, create the pool DB       
-            *  record if it is not already created. 
-            */
-           if (job->pool) {
-              create_pool(NULL, db, job->pool, POOL_OP_UPDATE);  /* update request */
+   } /* End loop over Job res */
+
+   /* Loop over databases */
+   CAT *catalog;
+   foreach_res(catalog, R_CATALOG) {
+      B_DB *db;
+      /*
+       * Make sure we can open catalog, otherwise print a warning
+       * message because the server is probably not running.
+       */
+      db = db_init_database(NULL, catalog->db_name, catalog->db_user,
+                        catalog->db_password, catalog->db_address,
+                        catalog->db_port, catalog->db_socket, 
+                        catalog->mult_db_connections);
+      if (!db || !db_open_database(NULL, db)) {
+         Jmsg(NULL, M_FATAL, 0, _("Could not open database \"%s\".\n"),
+             catalog->db_name);
+        if (db) {
+            Jmsg(NULL, M_FATAL, 0, _("%s"), db_strerror(db));
+        }
+        OK = false;
+        continue;
+      } 
+
+      /* Loop over all pools, defining/updating them in each database */
+      POOL *pool;
+      foreach_res(pool, R_POOL) {
+        create_pool(NULL, db, pool, POOL_OP_UPDATE);  /* update request */
+      }      
+      /* Loop over all counters, defining them in each database */
+
+      /* Set default value in all counters */
+      COUNTER *counter;
+      foreach_res(counter, R_COUNTER) {
+        /* Write to catalog? */
+        if (!counter->created && counter->Catalog == catalog) {
+           COUNTER_DBR cr;
+           bstrncpy(cr.Counter, counter->hdr.name, sizeof(cr.Counter));
+           cr.MinValue = counter->MinValue;
+           cr.MaxValue = counter->MaxValue;
+           cr.CurrentValue = counter->MinValue;
+           if (counter->WrapCounter) {
+              bstrncpy(cr.WrapCounter, counter->WrapCounter->hdr.name, sizeof(cr.WrapCounter));
+           } else {
+              cr.WrapCounter[0] = 0;  /* empty string */
            }
-           /* Set default value in all counters */
-           COUNTER *counter;
-           foreach_res(counter, R_COUNTER) {
-              /* Write to catalog? */
-              if (!counter->created && counter->Catalog == catalog) {
-                 COUNTER_DBR cr;
-                 bstrncpy(cr.Counter, counter->hdr.name, sizeof(cr.Counter));
-                 cr.MinValue = counter->MinValue;
-                 cr.MaxValue = counter->MaxValue;
-                 cr.CurrentValue = counter->MinValue;
-                 if (counter->WrapCounter) {
-                    bstrncpy(cr.WrapCounter, counter->WrapCounter->hdr.name, sizeof(cr.WrapCounter));
-                 } else {
-                    cr.WrapCounter[0] = 0;  /* empty string */
-                 }
-                 if (db_create_counter_record(NULL, db, &cr)) {
-                    counter->CurrentValue = cr.CurrentValue;
-                    counter->created = true;
-                     Dmsg2(100, "Create counter %s val=%d\n", counter->hdr.name, counter->CurrentValue);
-                 }
-              } 
-              if (!counter->created) {
-                 counter->CurrentValue = counter->MinValue;  /* default value */
-              }
+           if (db_create_counter_record(NULL, db, &cr)) {
+              counter->CurrentValue = cr.CurrentValue;
+              counter->created = true;
+               Dmsg2(100, "Create counter %s val=%d\n", counter->hdr.name, counter->CurrentValue);
            }
+        } 
+        if (!counter->created) {
+           counter->CurrentValue = counter->MinValue;  /* default value */
         }
-        db_close_database(NULL, db);
       }
+      db_close_database(NULL, db);
    }
 
    UnlockRes();