]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/dird.c
Implement store_size32 and store_size64
[bacula/bacula] / bacula / src / dird / dird.c
index da5361b75308c15911f1ee07b438394bdbf4cdc6..86e73503a90dffe0861f87662d7df19f637ef439 100644 (file)
@@ -53,7 +53,6 @@ extern int job_setattr(PyObject *self, char *attrname, PyObject *value);
 /* Forward referenced subroutines */
 void terminate_dird(int sig);
 static bool check_resources();
-static bool check_catalog();
 static void dir_sql_query(JCR *jcr, const char *cmd);
   
 /* Exported subroutines */
@@ -96,8 +95,16 @@ extern "C" { // work around visual compiler mangling variables
 extern URES res_all;
 #endif
 
+typedef enum {
+   CHECK_CONNECTION,  /* Check catalog connection */
+   UPDATE_CATALOG,    /* Ensure that catalog is ok with conf */
+   UPDATE_AND_FIX     /* Ensure that catalog is ok, and fix old jobs */
+} cat_op;
+static bool check_catalog(cat_op mode);
+
 #define CONFIG_FILE "bacula-dir.conf" /* default configuration file */
 
+
 static void usage()
 {
    fprintf(stderr, _(
@@ -263,13 +270,16 @@ int main (int argc, char *argv[])
 
    load_dir_plugins(director->plugin_directory);
 
-   drop(uid, gid);                    /* reduce privileges if requested */
+   drop(uid, gid, false);                    /* reduce privileges if requested */
 
-   if (!check_catalog()) {
+   /* If we are in testing mode, we don't try to fix the catalog */
+   cat_op mode=(test_config)?CHECK_CONNECTION:UPDATE_AND_FIX;
+
+   if (!check_catalog(mode)) {
       Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
    }
-
-   if (test_config) {
+   
+   if (test_config) {      
       terminate_dird(0);
    }
 
@@ -513,7 +523,7 @@ void reload_config(int sig)
    ok = parse_dir_config(config, configfile, M_ERROR);
 
    Dmsg0(100, "Reloaded config file\n");
-   if (!ok || !check_resources() || !check_catalog()) {
+   if (!ok || !check_resources() || !check_catalog(UPDATE_CATALOG)) {
       rtable = find_free_reload_table_entry();    /* save new, bad table */
       if (rtable < 0) {
          Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
@@ -745,6 +755,7 @@ static bool check_resources()
                           job_items[i].handler == store_jobtype ||
                           job_items[i].handler == store_level   ||
                           job_items[i].handler == store_int32   ||
+                          job_items[i].handler == store_size32  ||
                           job_items[i].handler == store_migtype ||
                           job_items[i].handler == store_replace) {
                   def_ivalue = (uint32_t *)((char *)(job->jobdefs) + offset);
@@ -757,7 +768,7 @@ static bool check_resources()
                 * Handle 64 bit integer fields
                 */
                } else if (job_items[i].handler == store_time   ||
-                          job_items[i].handler == store_size   ||
+                          job_items[i].handler == store_size64 ||
                           job_items[i].handler == store_int64) {
                   def_lvalue = (int64_t *)((char *)(job->jobdefs) + offset);
                   Dmsg5(400, "Job \"%s\", field \"%s\" def_lvalue=%" lld " item %d offset=%u\n",
@@ -905,7 +916,13 @@ static bool check_resources()
    return OK;
 }
 
-static bool check_catalog()
+/* 
+ * In this routine, 
+ *  - we can check the connection (mode=CHECK_CONNECTION)
+ *  - we can synchronize the catalog with the configuration (mode=UPDATE_CATALOG)
+ *  - we can synchronize, and fix old job records (mode=UPDATE_AND_FIX)
+ */
+static bool check_catalog(cat_op mode)
 {
    bool OK = true;
    bool need_tls;
@@ -936,6 +953,12 @@ static bool check_catalog()
          continue;
       }
 
+      /* we are in testing mode, so don't touch anything in the catalog */
+      if (mode == CHECK_CONNECTION) {
+         db_close_database(NULL, db);
+         continue;
+      }
+
       /* Loop over all pools, defining/updating them in each database */
       POOL *pool;
       foreach_res(pool, R_POOL) {
@@ -957,14 +980,26 @@ static bool check_catalog()
           *   in that catalog.
           */
          if (!pool->catalog || pool->catalog == catalog) {
-            update_pool_recyclepool(NULL, db, pool);
+            update_pool_references(NULL, db, pool);
          }
       }
 
+      /* Ensure basic client record is in DB */
+      CLIENT *client;
+      foreach_res(client, R_CLIENT) {
+         CLIENT_DBR cr;
+         memset(&cr, 0, sizeof(cr));
+         bstrncpy(cr.Name, client->name(), sizeof(cr.Name));
+         db_create_client_record(NULL, db, &cr);
+      }
+
+      /* Ensure basic storage record is in DB */
       STORE *store;
       foreach_res(store, R_STORAGE) {
          STORAGE_DBR sr;
          MEDIATYPE_DBR mr;
+         memset(&sr, 0, sizeof(sr));
+         memset(&mr, 0, sizeof(mr));
          if (store->media_type) {
             bstrncpy(mr.MediaType, store->media_type, sizeof(mr.MediaType));
             mr.ReadOnly = 0;
@@ -1043,6 +1078,12 @@ static bool check_catalog()
             counter->CurrentValue = counter->MinValue;  /* default value */
          }
       }
+      /* cleanup old job records */
+      if (mode == UPDATE_AND_FIX) {
+         db_sql_query(db, cleanup_created_job, NULL, NULL);
+         db_sql_query(db, cleanup_running_job, NULL, NULL);
+      }
+
       db_close_database(NULL, db);
    }
    /* Set type in global for debugging */