]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/dird.c
Cleanup new timeout code for bconsole
[bacula/bacula] / bacula / src / dird / dird.c
index fc59364e1f084ba1a9d91c7d457cdba8a3243d5c..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 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()) {
+   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) {
@@ -1055,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 */