]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/qt-console/bat_conf.cpp
Big backport from Enterprise
[bacula/bacula] / bacula / src / qt-console / bat_conf.cpp
index 279e7faf929b50f5325efeaacfea4ee6a5b399b9..ce2ab36fd4934929a03e76ecef2c0ed3d4012359 100644 (file)
@@ -1,17 +1,20 @@
 /*
-   Bacula® - The Network Backup Solution
+   Bacula(R) - The Network Backup Solution
 
-   Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2017 Kern Sibbald
 
-   The main author of Bacula is Kern Sibbald, with contributions from many
-   others, a complete list can be found in the file AUTHORS.
+   The original author of Bacula is Kern Sibbald, with contributions
+   from many others, a complete list can be found in the file AUTHORS.
 
    You may use this file and others of this release according to the
    license defined in the LICENSE file, which includes the Affero General
    Public License, v3.0 ("AGPLv3") and some additional permissions and
    terms pursuant to its AGPLv3 Section 7.
 
-   Bacula® is a registered trademark of Kern Sibbald.
+   This notice must be preserved when any source code is
+   conveyed and/or propagated.
+
+   Bacula(R) is a registered trademark of Kern Sibbald.
 */
 /*
  *   Main configuration file parser for Bacula User Agent
@@ -34,7 +37,6 @@
  *
  *     Kern Sibbald, January MM, September MM
  *
- *     Version $Id$
  */
 
 #include "bacula.h"
@@ -46,8 +48,7 @@
  */
 int32_t r_first = R_FIRST;
 int32_t r_last  = R_LAST;
-static RES *sres_head[R_LAST - R_FIRST + 1];
-RES **res_head = sres_head;
+RES_HEAD **res_head;
 
 /* Forward referenced subroutines */
 
@@ -80,7 +81,7 @@ static RES_ITEM dir_items[] = {
    {"tlscacertificatedir", store_dir,  ITEM(dir_res.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(dir_res.tls_certfile), 0, 0, 0},
    {"tlskey",         store_dir,       ITEM(dir_res.tls_keyfile), 0, 0, 0},
-   {"heartbeatinterval", store_time, ITEM(dir_res.heartbeat_interval), 0, ITEM_DEFAULT, 0},
+   {"heartbeatinterval", store_time, ITEM(dir_res.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60},
    {NULL, NULL, {0}, 0, 0, 0}
 };
 
@@ -95,8 +96,9 @@ static RES_ITEM con_items[] = {
    {"tlscacertificatedir", store_dir,  ITEM(con_res.tls_ca_certdir), 0, 0, 0},
    {"tlscertificate", store_dir,       ITEM(con_res.tls_certfile), 0, 0, 0},
    {"tlskey",         store_dir,       ITEM(con_res.tls_keyfile), 0, 0, 0},
-   {"heartbeatinterval", store_time, ITEM(con_res.heartbeat_interval), 0, ITEM_DEFAULT, 0},
+   {"heartbeatinterval", store_time, ITEM(con_res.heartbeat_interval), 0, ITEM_DEFAULT, 5 * 60},
    {"director",       store_str,       ITEM(con_res.director), 0, 0, 0},
+   {"CommCompression",   store_bool, ITEM(con_res.comm_compression), 0, ITEM_DEFAULT, true},
    {NULL, NULL, {0}, 0, 0, 0}
 };
 
@@ -121,9 +123,10 @@ RES_TABLE resources[] = {
 
 
 /* Dump contents of resource */
-void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fmt, ...), void *sock)
+void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, ...), void *sock)
 {
-   URES *res = (URES *)reshdr;
+   RES *next;
+   URES *res = (URES *)ares;
    bool recurse = true;
 
    if (res == NULL) {
@@ -136,21 +139,24 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm
    }
    switch (type) {
    case R_DIRECTOR:
-      printf(_("Director: name=%s address=%s DIRport=%d\n"), reshdr->name,
+      printf(_("Director: name=%s address=%s DIRport=%d\n"), ares->name,
               res->dir_res.address, res->dir_res.DIRport);
       break;
    case R_CONSOLE:
-      printf(_("Console: name=%s\n"), reshdr->name);
+      printf(_("Console: name=%s\n"), ares->name);
       break;
    case R_CONSOLE_FONT:
       printf(_("ConsoleFont: name=%s font face=%s\n"),
-             reshdr->name, NPRT(res->con_font.fontface));
+             ares->name, NPRT(res->con_font.fontface));
       break;
    default:
       printf(_("Unknown resource type %d\n"), type);
    }
-   if (recurse && res->dir_res.hdr.next) {
-      dump_resource(type, res->dir_res.hdr.next, sendit, sock);
+   if (recurse) {
+      next = GetNextRes(0, (RES *)res);
+      if (next) {
+         dump_resource(type, next, sendit, sock);
+      }
    }
 }
 
@@ -163,14 +169,12 @@ void dump_resource(int type, RES *reshdr, void sendit(void *sock, const char *fm
  */
 void free_resource(RES *sres, int type)
 {
-   RES *nres;
    URES *res = (URES *)sres;
 
    if (res == NULL)
       return;
 
    /* common stuff -- free the resource name */
-   nres = (RES *)res->dir_res.hdr.next;
    if (res->dir_res.hdr.name) {
       free(res->dir_res.hdr.name);
    }
@@ -183,7 +187,7 @@ void free_resource(RES *sres, int type)
       if (res->dir_res.address) {
          free(res->dir_res.address);
       }
-      if (res->dir_res.tls_ctx) {
+      if (res->dir_res.tls_ctx) { 
          free_tls_context(res->dir_res.tls_ctx);
       }
       if (res->dir_res.tls_ca_certfile) {
@@ -203,7 +207,7 @@ void free_resource(RES *sres, int type)
       if (res->con_res.password) {
          free(res->con_res.password);
       }
-      if (res->con_res.tls_ctx) {
+      if (res->con_res.tls_ctx) { 
          free_tls_context(res->con_res.tls_ctx);
       }
       if (res->con_res.tls_ca_certfile) {
@@ -231,9 +235,8 @@ void free_resource(RES *sres, int type)
       printf(_("Unknown resource type %d\n"), type);
    }
    /* Common stuff again -- free the resource, recurse to next one */
-   free(res);
-   if (nres) {
-      free_resource(nres, type);
+   if (res) {
+      free(res);
    }
 }
 
@@ -241,9 +244,8 @@ void free_resource(RES *sres, int type)
  * the resource. If this is pass 2, we update any resource
  * pointers (currently only in the Job resource).
  */
-void save_resource(int type, RES_ITEM *items, int pass)
+bool save_resource(CONFIG *config, int type, RES_ITEM *items, int pass)
 {
-   URES *res;
    int rindex = type - r_first;
    int i, size = 0;
    int error = 0;
@@ -253,10 +255,11 @@ void save_resource(int type, RES_ITEM *items, int pass)
     */
    for (i=0; items[i].name; i++) {
       if (items[i].flags & ITEM_REQUIRED) {
-            if (!bit_is_set(i, res_all.dir_res.hdr.item_present)) {
-               Emsg2(M_ABORT, 0, _("%s item is required in %s resource, but not found.\n"),
-                 items[i].name, resources[rindex]);
-             }
+         if (!bit_is_set(i, res_all.dir_res.hdr.item_present)) {
+            Mmsg(config->m_errmsg, _("\"%s\" directive is required in \"%s\" resource, but not found.\n"),
+                 items[i].name, resources[rindex].name);
+            return false;
+         }
       }
    }
 
@@ -291,7 +294,7 @@ void save_resource(int type, RES_ITEM *items, int pass)
          free(res_all.dir_res.hdr.desc);
          res_all.dir_res.hdr.desc = NULL;
       }
-      return;
+      return true;
    }
 
    /* The following code is only executed during pass 1 */
@@ -312,31 +315,16 @@ void save_resource(int type, RES_ITEM *items, int pass)
    }
    /* Common */
    if (!error) {
-      res = (URES *)malloc(size);
-      memcpy(res, &res_all, size);
-      if (!res_head[rindex]) {
-         res_head[rindex] = (RES *)res; /* store first entry */
-      } else {
-         RES *next, *last;
-         /* Add new res to end of chain */
-         for (last=next=res_head[rindex]; next; next=next->next) {
-            last = next;
-            if (strcmp(next->name, res->dir_res.hdr.name) == 0) {
-               Emsg2(M_ERROR_TERM, 0,
-                  _("Attempt to define second %s resource named \"%s\" is not permitted.\n"),
-                  resources[rindex].name, res->dir_res.hdr.name);
-            }
-         }
-         last->next = (RES *)res;
-         Dmsg2(90, "Inserting %s res: %s\n", res_to_str(type),
-               res->dir_res.hdr.name);
+      if (!config->insert_res(rindex, size)) {
+         return false;
       }
    }
+   return true;
 }
 
 bool parse_bat_config(CONFIG *config, const char *configfile, int exit_code)
 {
    config->init(configfile, NULL, exit_code, (void *)&res_all, res_all_size,
-      r_first, r_last, resources, res_head);
+      r_first, r_last, resources, &res_head);
    return config->parse_config();
 }