]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/filed/filed.c
Restore win32 dir from Branch-5.2 and update it
[bacula/bacula] / bacula / src / filed / filed.c
index 69d5aa95f49b0232acab8e452f5efe63ca54e798..be146bbb96f97c6515de24b0af66bc307006369c 100644 (file)
@@ -1,28 +1,29 @@
 /*
-   Bacula® - The Network Backup Solution
+   Bacula(R) - The Network Backup Solution
 
-   Copyright (C) 2000-2014 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.
 */
 /*
  *  Bacula File Daemon
  *
- *    Written by Kern Sibbald, March MM
- *
+ *    Kern Sibbald, March MM
  */
 
 #include "bacula.h"
 #include "filed.h"
-#include "lib/mntent_cache.h"
 
 /* Imported Functions */
 extern void *handle_connection_request(void *dir_sock);
@@ -37,10 +38,15 @@ bool no_signals = false;
 void *start_heap;
 extern struct s_cmds cmds[];
 
-#define CONFIG_FILE "bacula-fd.conf" /* default config file */
+#ifndef CONFIG_FILE                   /* Might be overwritten */
+ #define CONFIG_FILE "bacula-fd.conf" /* default config file */
+ #define PROG_NAME   "bacula-fd"
+#endif
 
 char *configfile = NULL;
+static bool test_config = false;
 static bool foreground = false;
+static bool make_pid_file = true;     /* create pid file */
 static workq_t dir_workq;             /* queue of work from Director */
 static pthread_t server_tid;
 static CONFIG *config;
@@ -48,23 +54,24 @@ static CONFIG *config;
 static void usage()
 {
    fprintf(stderr, _(
-PROG_COPYRIGHT
-"\n%sVersion: %s (%s)\n\n"
-"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n"
-"     -c <file>        use <file> as configuration file\n"
-"     -d <n>[,<tags>]  set debug level to <nn>, debug tags to <tags>\n"
-"     -dt              print a timestamp in debug output\n"
-"     -f               run in foreground (for debugging)\n"
-"     -g               groupid\n"
-"     -k               keep readall capabilities\n"
-"     -m               print kaboom output (for debugging)\n"
-"     -s               no signals (for debugging)\n"
-"     -t               test configuration file and exit\n"
-"     -T               set trace on\n"
-"     -u               userid\n"
-"     -v               verbose user messages\n"
-"     -?               print this message.\n"
-"\n"), 2000, "", VERSION, BDATE);
+      PROG_COPYRIGHT
+      "\nVersion: %s (%s)\n\n"
+      "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n"
+      "     -c <file>        use <file> as configuration file\n"
+      "     -d <n>[,<tags>]  set debug level to <nn>, debug tags to <tags>\n"
+      "     -dt              print a timestamp in debug output\n"
+      "     -f               run in foreground (for debugging)\n"
+      "     -g               groupid\n"
+      "     -k               keep readall capabilities\n"
+      "     -m               print kaboom output (for debugging)\n"
+      "     -P               do not create pid file\n"
+      "     -s               no signals (for debugging)\n"
+      "     -t               test configuration file and exit\n"
+      "     -T               set trace on\n"
+      "     -u               userid\n"
+      "     -v               verbose user messages\n"
+      "     -?               print this message.\n"
+      "\n"), 2000, VERSION, BDATE);
 
    exit(1);
 }
@@ -79,10 +86,9 @@ PROG_COPYRIGHT
 #define main BaculaMain
 #endif
 
-int main (int argc, char *argv[])
+int main(int argc, char *argv[])
 {
    int ch;
-   bool test_config = false;
    bool keep_readall_caps = false;
    char *uid = NULL;
    char *gid = NULL;
@@ -93,11 +99,12 @@ int main (int argc, char *argv[])
    textdomain("bacula");
 
    init_stack_dump();
-   my_name_is(argc, argv, "bacula-fd");
+   my_name_is(argc, argv, PROG_NAME);
    init_msg(NULL, NULL);
    daemon_start_time = time(NULL);
+   setup_daemon_message_queue();
 
-   while ((ch = getopt(argc, argv, "c:d:fg:kmstTu:v?D:")) != -1) {
+   while ((ch = getopt(argc, argv, "c:d:fg:kmPstTu:v?D:")) != -1) {
       switch (ch) {
       case 'c':                    /* configuration file */
          if (configfile != NULL) {
@@ -120,7 +127,7 @@ int main (int argc, char *argv[])
                debug_level = 1;
             }
             if (p) {
-               debug_parse_tags(p+1, &debug_level);
+               debug_parse_tags(p+1, &debug_level_tags);
             }
          }
          break;
@@ -141,6 +148,10 @@ int main (int argc, char *argv[])
          prt_kaboom = true;
          break;
 
+      case 'P':
+         make_pid_file = false;
+         break;
+
       case 's':
          no_signals = true;
          break;
@@ -186,6 +197,16 @@ int main (int argc, char *argv[])
    }
 
    server_tid = pthread_self();
+
+   if (configfile == NULL) {
+      configfile = bstrdup(CONFIG_FILE);
+   }
+
+   if (!foreground && !test_config) {
+      daemon_start();
+      init_stack_dump();              /* set new pid */
+   }
+
    if (!no_signals) {
       init_signals(terminate_filed);
    } else {
@@ -193,11 +214,7 @@ int main (int argc, char *argv[])
       watchdog_sleep_time = 120;      /* long timeout for debugging */
    }
 
-   if (configfile == NULL) {
-      configfile = bstrdup(CONFIG_FILE);
-   }
-
-   config = new_config_parser();
+   config = New(CONFIG());
    parse_fd_config(config, configfile, M_ERROR_TERM);
 
    if (init_crypto() != 0) {
@@ -216,18 +233,15 @@ int main (int argc, char *argv[])
       terminate_filed(0);
    }
 
-   if (!foreground) {
-      daemon_start();
-      init_stack_dump();              /* set new pid */
-   }
-
    set_thread_concurrency(me->MaxConcurrentJobs + 10);
    lmgr_init_thread(); /* initialize the lockmanager stack */
 
    /* Maximum 1 daemon at a time */
-   create_pid_file(me->pid_directory, "bacula-fd",
-                   get_first_port_host_order(me->FDaddrs));
-   read_state_file(me->working_directory, "bacula-fd",
+   if (make_pid_file) {
+      create_pid_file(me->pid_directory, PROG_NAME,
+                      get_first_port_host_order(me->FDaddrs));
+   }
+   read_state_file(me->working_directory, PROG_NAME,
                    get_first_port_host_order(me->FDaddrs));
 
    load_fd_plugins(me->plugin_directory);
@@ -238,6 +252,11 @@ int main (int argc, char *argv[])
    me += 1000000;
 #endif
 
+   /* Setup default value for the the snapshot handler */
+   if (!me->snapshot_command) {
+      me->snapshot_command = snapshot_get_command();
+   }
+
    if (!no_signals) {
       start_watchdog();               /* start watchdog thread */
       init_jcr_subsystem();           /* start JCR watchdogs etc. */
@@ -271,9 +290,17 @@ void terminate_filed(int sig)
    bnet_stop_thread_server(server_tid);
    generate_daemon_event(NULL, "Exit");
    unload_plugins();
-   flush_mntent_cache();
-   write_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
-   delete_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
+
+   free_daemon_message_queue();
+
+   if (!test_config) {
+      write_state_file(me->working_directory,
+                       "bacula-fd", get_first_port_host_order(me->FDaddrs));
+      if (make_pid_file) {
+         delete_pid_file(me->pid_directory,
+                         "bacula-fd", get_first_port_host_order(me->FDaddrs));
+      }
+   }
 
    if (configfile != NULL) {
       free(configfile);
@@ -282,13 +309,15 @@ void terminate_filed(int sig)
    if (debug_level > 0) {
       print_memory_pool_stats();
    }
+
    if (config) {
-      config->free_resources();
-      free(config);
+      delete config;
       config = NULL;
    }
    term_msg();
    cleanup_crypto();
+   free(res_head);
+   res_head = NULL;
    close_memory_pool();               /* release free memory in pool */
    lmgr_cleanup_main();
    sm_dump(false);                    /* dump orphaned buffers */
@@ -531,7 +560,7 @@ static bool check_resources()
 
       /* Construct disabled command array */
       for (i=0; cmds[i].cmd; i++) { }  /* Count commands */
-      if (me->disable_cmds) {
+      if (director->disable_cmds) {
          director->disabled_cmds_array = (bool *)malloc(i);
          memset(director->disabled_cmds_array, 0, i);
          foreach_alist(cmd, director->disable_cmds) {
@@ -611,6 +640,60 @@ static bool check_resources()
       }
    }
 
+   CONSRES *console;
+   foreach_res(console, R_CONSOLE) {
+      /* tls_require implies tls_enable */
+      if (console->tls_require) {
+#ifndef HAVE_TLS
+         Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
+         OK = false;
+         continue;
+#else
+         console->tls_enable = true;
+#endif
+      }
+      need_tls = console->tls_enable || console->tls_authenticate;
+
+      if (!console->tls_certfile && need_tls) {
+         Emsg2(M_FATAL, 0, _("\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n"),
+               console->hdr.name, configfile);
+         OK = false;
+      }
+
+      if (!console->tls_keyfile && need_tls) {
+         Emsg2(M_FATAL, 0, _("\"TLS Key\" file not defined for Console \"%s\" in %s.\n"),
+               console->hdr.name, configfile);
+         OK = false;
+      }
+
+      if ((!console->tls_ca_certfile && !console->tls_ca_certdir) && need_tls && console->tls_verify_peer) {
+         Emsg2(M_FATAL, 0, _("Neither \"TLS CA Certificate\""
+                             " or \"TLS CA Certificate Dir\" are defined for Console \"%s\" in %s."
+                             " At least one CA certificate store is required"
+                             " when using \"TLS Verify Peer\".\n"),
+                             console->hdr.name, configfile);
+         OK = false;
+      }
+
+      /* If everything is well, attempt to initialize our per-resource TLS context */
+      if (OK && (need_tls || console->tls_require)) {
+         /* Initialize TLS context:
+          * Args: CA certfile, CA certdir, Certfile, Keyfile,
+          * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
+         console->tls_ctx = new_tls_context(console->tls_ca_certfile,
+            console->tls_ca_certdir, console->tls_certfile,
+            console->tls_keyfile, NULL, NULL, console->tls_dhfile,
+            console->tls_verify_peer);
+
+         if (!console->tls_ctx) {
+            Emsg2(M_FATAL, 0, _("Failed to initialize TLS context for Console \"%s\" in %s.\n"),
+                                console->hdr.name, configfile);
+            OK = false;
+         }
+      }
+   }
+   
    UnlockRes();
 
    if (OK) {