2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version two of the GNU General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
30 * Bacula Director daemon -- this is the main program
32 * Kern Sibbald, March MM
40 /* Forward referenced subroutines */
41 void terminate_dird(int sig);
42 static bool check_resources();
43 static bool check_catalog();
44 static void dir_sql_query(JCR *jcr, const char *cmd);
46 /* Exported subroutines */
47 extern "C" void reload_config(int sig);
48 extern void invalidate_schedules();
49 extern bool parse_dir_config(CONFIG *config, const char *configfile, int exit_code);
51 /* Imported subroutines */
52 JCR *wait_for_next_job(char *runjob);
53 void term_scheduler();
54 void term_ua_server();
55 void start_UA_server(dlist *addrs);
56 void init_job_server(int max_workers);
57 void term_job_server();
58 void store_jobtype(LEX *lc, RES_ITEM *item, int index, int pass);
59 void store_level(LEX *lc, RES_ITEM *item, int index, int pass);
60 void store_replace(LEX *lc, RES_ITEM *item, int index, int pass);
61 void store_migtype(LEX *lc, RES_ITEM *item, int index, int pass);
62 void init_device_resources();
64 static char *runjob = NULL;
65 static int background = 1;
66 static void init_reload(void);
67 static CONFIG *config;
69 /* Globals Exported */
70 DIRRES *director; /* Director resource */
73 char *configfile = NULL;
76 /* Globals Imported */
77 extern RES_ITEM job_items[];
79 extern "C" { // work around visual compiler mangling variables
86 #define CONFIG_FILE "bacula-dir.conf" /* default configuration file */
92 "\nVersion: %s (%s)\n\n"
93 "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n"
94 " -c <file> set configuration file to file\n"
95 " -d <nn> set debug level to <nn>\n"
96 " -dt print timestamp in debug output\n"
97 " -f run in foreground (for debugging)\n"
99 " -r <job> run <job> now\n"
101 " -t test - read configuration and exit\n"
103 " -v verbose user messages\n"
104 " -? print this message.\n"
105 "\n"), 2000, VERSION, BDATE);
111 /*********************************************************************
113 * Main Bacula Server program
116 #if defined(HAVE_WIN32)
117 /* For Win32 main() is in src/win32 code ... */
118 #define main BaculaMain
121 int main (int argc, char *argv[])
125 bool no_signals = false;
126 bool test_config = false;
130 start_heap = sbrk(0);
131 setlocale(LC_ALL, "");
132 bindtextdomain("bacula", LOCALEDIR);
133 textdomain("bacula");
136 my_name_is(argc, argv, "bacula-dir");
137 init_msg(NULL, NULL); /* initialize message handler */
139 daemon_start_time = time(NULL);
141 console_command = run_console_command;
143 while ((ch = getopt(argc, argv, "c:d:fg:r:stu:v?")) != -1) {
145 case 'c': /* specify config file */
146 if (configfile != NULL) {
149 configfile = bstrdup(optarg);
152 case 'd': /* set debug level */
153 if (*optarg == 't') {
154 dbg_timestamp = true;
156 debug_level = atoi(optarg);
157 if (debug_level <= 0) {
161 Dmsg1(10, "Debug level = %d\n", debug_level);
164 case 'f': /* run in foreground */
168 case 'g': /* set group id */
172 case 'r': /* run job */
173 if (runjob != NULL) {
177 runjob = bstrdup(optarg);
181 case 's': /* turn off signals */
185 case 't': /* test config */
189 case 'u': /* set uid */
193 case 'v': /* verbose */
207 init_signals(terminate_dird);
211 if (configfile != NULL) {
214 configfile = bstrdup(*argv);
222 if (configfile == NULL) {
223 configfile = bstrdup(CONFIG_FILE);
226 config = new_config_parser();
227 parse_dir_config(config, configfile, M_ERROR_TERM);
229 if (init_crypto() != 0) {
230 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
233 if (!check_resources()) {
234 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
237 if (!test_config) { /* we don't need to do this block in test mode */
240 init_stack_dump(); /* grab new pid */
243 /* Create pid must come after we are a daemon -- so we have our final pid */
244 create_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
245 read_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
248 load_dir_plugins(director->plugin_directory);
250 drop(uid, gid); /* reduce privileges if requested */
252 if (!check_catalog()) {
253 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
260 my_name_is(0, NULL, director->name()); /* set user defined name */
262 /* Plug database interface for library routines */
263 p_sql_query = (sql_query)dir_sql_query;
264 p_sql_escape = (sql_escape)db_escape_string;
266 FDConnectTimeout = (int)director->FDConnectTimeout;
267 SDConnectTimeout = (int)director->SDConnectTimeout;
270 #if !defined(HAVE_WIN32)
271 signal(SIGHUP, reload_config);
274 init_console_msg(working_directory);
276 init_python_interpreter(director->name(), director->scripts_directory,
279 set_thread_concurrency(director->MaxConcurrentJobs * 2 +
280 4 /* UA */ + 4 /* sched+watchdog+jobsvr+misc */);
282 Dmsg0(200, "Start UA server\n");
283 start_UA_server(director->DIRaddrs);
285 start_watchdog(); /* start network watchdog thread */
287 init_jcr_subsystem(); /* start JCR watchdogs etc. */
289 init_job_server(director->MaxConcurrentJobs);
291 // init_device_resources();
293 Dmsg0(200, "wait for next job\n");
294 /* Main loop -- call scheduler to get next job to run */
295 while ( (jcr = wait_for_next_job(runjob)) ) {
296 run_job(jcr); /* run job */
297 free_jcr(jcr); /* release jcr */
298 if (runjob) { /* command line, run a single job? */
299 break; /* yes, terminate */
309 * This allows the message handler to operate on the database
310 * by using a pointer to this function. The pointer is
311 * needed because the other daemons do not have access
312 * to the database. If the pointer is
313 * not defined (other daemons), then writing the database
316 static void dir_sql_query(JCR *jcr, const char *cmd)
318 if (!jcr || !jcr->db) {
321 db_sql_query(jcr->db, cmd, NULL, NULL);
324 /* Cleanup and then exit */
325 void terminate_dird(int sig)
327 static bool already_here = false;
329 if (already_here) { /* avoid recursive temination problems */
330 bmicrosleep(2, 0); /* yield */
334 debug_level = 0; /* turn off debug */
336 generate_daemon_event(NULL, "Exit");
338 write_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
339 delete_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
345 if (configfile != NULL) {
348 if (debug_level > 5) {
349 print_memory_pool_stats();
352 config->free_resources();
357 term_msg(); /* terminate message handler */
359 close_memory_pool(); /* release free memory in pool */
364 struct RELOAD_TABLE {
369 static const int max_reloads = 32;
370 static RELOAD_TABLE reload_table[max_reloads];
372 static void init_reload(void)
374 for (int i=0; i < max_reloads; i++) {
375 reload_table[i].job_count = 0;
376 reload_table[i].res_table = NULL;
380 static void free_saved_resources(int table)
382 int num = r_last - r_first + 1;
383 RES **res_tab = reload_table[table].res_table;
385 Dmsg1(100, "res_tab for table %d already released.\n", table);
388 Dmsg1(100, "Freeing resources for table %d\n", table);
389 for (int j=0; j<num; j++) {
390 free_resource(res_tab[j], r_first + j);
393 reload_table[table].job_count = 0;
394 reload_table[table].res_table = NULL;
398 * Called here at the end of every job that was
399 * hooked decrementing the active job_count. When
400 * it goes to zero, no one is using the associated
401 * resource table, so free it.
403 static void reload_job_end_cb(JCR *jcr, void *ctx)
405 int reload_id = (int)((long int)ctx);
406 Dmsg3(100, "reload job_end JobId=%d table=%d cnt=%d\n", jcr->JobId,
407 reload_id, reload_table[reload_id].job_count);
410 if (--reload_table[reload_id].job_count <= 0) {
411 free_saved_resources(reload_id);
417 static int find_free_reload_table_entry()
420 for (int i=0; i < max_reloads; i++) {
421 if (reload_table[i].res_table == NULL) {
430 * If we get here, we have received a SIGHUP, which means to
431 * reread our configuration file.
433 * The algorithm used is as follows: we count how many jobs are
434 * running and mark the running jobs to make a callback on
435 * exiting. The old config is saved with the reload table
436 * id in a reload table. The new config file is read. Now, as
437 * each job exits, it calls back to the reload_job_end_cb(), which
438 * decrements the count of open jobs for the given reload table.
439 * When the count goes to zero, we release those resources.
440 * This allows us to have pointers into the resource table (from
441 * jobs), and once they exit and all the pointers are released, we
442 * release the old table. Note, if no new jobs are running since the
443 * last reload, then the old resources will be immediately release.
444 * A console is considered a job because it may have pointers to
445 * resources, but a SYSTEM job is not since it *should* not have any
446 * permanent pointers to jobs.
449 void reload_config(int sig)
451 static bool already_here = false;
452 #if !defined(HAVE_WIN32)
456 int njobs = 0; /* number of running jobs */
461 abort(); /* Oops, recursion -> die */
465 #if !defined(HAVE_WIN32)
467 sigaddset(&set, SIGHUP);
468 sigprocmask(SIG_BLOCK, &set, NULL);
474 table = find_free_reload_table_entry();
476 Jmsg(NULL, M_ERROR, 0, _("Too many open reload requests. Request ignored.\n"));
480 Dmsg1(100, "Reload_config njobs=%d\n", njobs);
481 reload_table[table].res_table = config->save_resources();
482 Dmsg1(100, "Saved old config in table %d\n", table);
484 ok = parse_dir_config(config, configfile, M_ERROR);
486 Dmsg0(100, "Reloaded config file\n");
487 if (!ok || !check_resources() || !check_catalog()) {
488 rtable = find_free_reload_table_entry(); /* save new, bad table */
490 Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
491 Jmsg(NULL, M_ERROR_TERM, 0, _("Out of reload table entries. Giving up.\n"));
493 Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
494 Jmsg(NULL, M_ERROR, 0, _("Resetting previous configuration.\n"));
496 reload_table[rtable].res_table = config->save_resources();
497 /* Now restore old resoure values */
498 int num = r_last - r_first + 1;
499 RES **res_tab = reload_table[table].res_table;
500 for (int i=0; i<num; i++) {
501 res_head[i] = res_tab[i];
503 table = rtable; /* release new, bad, saved table below */
505 invalidate_schedules();
507 * Hook all active jobs so that they release this table
510 if (jcr->get_JobType() != JT_SYSTEM) {
511 reload_table[table].job_count++;
512 job_end_push(jcr, reload_job_end_cb, (void *)((long int)table));
520 set_working_directory(director->working_directory);
521 FDConnectTimeout = director->FDConnectTimeout;
522 SDConnectTimeout = director->SDConnectTimeout;
523 Dmsg0(10, "Director's configuration file reread.\n");
525 /* Now release saved resources, if no jobs using the resources */
527 free_saved_resources(table);
533 #if !defined(HAVE_WIN32)
534 sigprocmask(SIG_UNBLOCK, &set, NULL);
535 signal(SIGHUP, reload_config);
537 already_here = false;
541 * Make a quick check to see that we have all the
544 * **** FIXME **** this routine could be a lot more
545 * intelligent and comprehensive.
547 static bool check_resources()
555 job = (JOB *)GetNextRes(R_JOB, NULL);
556 director = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
558 Jmsg(NULL, M_FATAL, 0, _("No Director resource defined in %s\n"
559 "Without that I don't know who I am :-(\n"), configfile);
562 set_working_directory(director->working_directory);
563 if (!director->messages) { /* If message resource not specified */
564 director->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
565 if (!director->messages) {
566 Jmsg(NULL, M_FATAL, 0, _("No Messages resource defined in %s\n"), configfile);
570 if (GetNextRes(R_DIRECTOR, (RES *)director) != NULL) {
571 Jmsg(NULL, M_FATAL, 0, _("Only one Director resource permitted in %s\n"),
575 /* tls_require implies tls_enable */
576 if (director->tls_require) {
578 director->tls_enable = true;
580 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
585 need_tls = director->tls_enable || director->tls_authenticate;
587 if (!director->tls_certfile && need_tls) {
588 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
589 director->name(), configfile);
593 if (!director->tls_keyfile && need_tls) {
594 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
595 director->name(), configfile);
599 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) &&
600 need_tls && director->tls_verify_peer) {
601 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\" or \"TLS CA"
602 " Certificate Dir\" are defined for Director \"%s\" in %s."
603 " At least one CA certificate store is required"
604 " when using \"TLS Verify Peer\".\n"),
605 director->name(), configfile);
609 /* If everything is well, attempt to initialize our per-resource TLS context */
610 if (OK && (need_tls || director->tls_require)) {
611 /* Initialize TLS context:
612 * Args: CA certfile, CA certdir, Certfile, Keyfile,
613 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
614 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
615 director->tls_ca_certdir, director->tls_certfile,
616 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
617 director->tls_verify_peer);
619 if (!director->tls_ctx) {
620 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
621 director->name(), configfile);
628 Jmsg(NULL, M_FATAL, 0, _("No Job records defined in %s\n"), configfile);
631 foreach_res(job, R_JOB) {
635 /* Handle Storage alists specifically */
636 JOB *jobdefs = job->jobdefs;
637 if (jobdefs->storage && !job->storage) {
639 job->storage = New(alist(10, not_owned_by_alist));
640 foreach_alist(st, jobdefs->storage) {
641 job->storage->append(st);
644 /* Handle RunScripts alists specifically */
645 if (jobdefs->RunScripts) {
648 if (!job->RunScripts) {
649 job->RunScripts = New(alist(10, not_owned_by_alist));
652 foreach_alist(rs, jobdefs->RunScripts) {
653 elt = copy_runscript(rs);
654 job->RunScripts->append(elt); /* we have to free it */
658 /* Transfer default items from JobDefs Resource */
659 for (i=0; job_items[i].name; i++) {
660 char **def_svalue, **svalue; /* string value */
661 uint32_t *def_ivalue, *ivalue; /* integer value */
662 bool *def_bvalue, *bvalue; /* bool value */
663 int64_t *def_lvalue, *lvalue; /* 64 bit values */
666 Dmsg4(1400, "Job \"%s\", field \"%s\" bit=%d def=%d\n",
667 job->name(), job_items[i].name,
668 bit_is_set(i, job->hdr.item_present),
669 bit_is_set(i, job->jobdefs->hdr.item_present));
671 if (!bit_is_set(i, job->hdr.item_present) &&
672 bit_is_set(i, job->jobdefs->hdr.item_present)) {
673 Dmsg2(400, "Job \"%s\", field \"%s\": getting default.\n",
674 job->name(), job_items[i].name);
675 offset = (char *)(job_items[i].value) - (char *)&res_all;
677 * Handle strings and directory strings
679 if (job_items[i].handler == store_str ||
680 job_items[i].handler == store_dir) {
681 def_svalue = (char **)((char *)(job->jobdefs) + offset);
682 Dmsg5(400, "Job \"%s\", field \"%s\" def_svalue=%s item %d offset=%u\n",
683 job->name(), job_items[i].name, *def_svalue, i, offset);
684 svalue = (char **)((char *)job + offset);
686 Pmsg1(000, _("Hey something is wrong. p=0x%lu\n"), *svalue);
688 *svalue = bstrdup(*def_svalue);
689 set_bit(i, job->hdr.item_present);
693 } else if (job_items[i].handler == store_res) {
694 def_svalue = (char **)((char *)(job->jobdefs) + offset);
695 Dmsg4(400, "Job \"%s\", field \"%s\" item %d offset=%u\n",
696 job->name(), job_items[i].name, i, offset);
697 svalue = (char **)((char *)job + offset);
699 Pmsg1(000, _("Hey something is wrong. p=0x%lu\n"), *svalue);
701 *svalue = *def_svalue;
702 set_bit(i, job->hdr.item_present);
704 * Handle alist resources
706 } else if (job_items[i].handler == store_alist_res) {
707 if (bit_is_set(i, job->jobdefs->hdr.item_present)) {
708 set_bit(i, job->hdr.item_present);
711 * Handle integer fields
712 * Note, our store_bit does not handle bitmaped fields
714 } else if (job_items[i].handler == store_bit ||
715 job_items[i].handler == store_pint32 ||
716 job_items[i].handler == store_jobtype ||
717 job_items[i].handler == store_level ||
718 job_items[i].handler == store_int32 ||
719 job_items[i].handler == store_migtype ||
720 job_items[i].handler == store_replace) {
721 def_ivalue = (uint32_t *)((char *)(job->jobdefs) + offset);
722 Dmsg5(400, "Job \"%s\", field \"%s\" def_ivalue=%d item %d offset=%u\n",
723 job->name(), job_items[i].name, *def_ivalue, i, offset);
724 ivalue = (uint32_t *)((char *)job + offset);
725 *ivalue = *def_ivalue;
726 set_bit(i, job->hdr.item_present);
728 * Handle 64 bit integer fields
730 } else if (job_items[i].handler == store_time ||
731 job_items[i].handler == store_size ||
732 job_items[i].handler == store_int64) {
733 def_lvalue = (int64_t *)((char *)(job->jobdefs) + offset);
734 Dmsg5(400, "Job \"%s\", field \"%s\" def_lvalue=%" lld " item %d offset=%u\n",
735 job->name(), job_items[i].name, *def_lvalue, i, offset);
736 lvalue = (int64_t *)((char *)job + offset);
737 *lvalue = *def_lvalue;
738 set_bit(i, job->hdr.item_present);
742 } else if (job_items[i].handler == store_bool) {
743 def_bvalue = (bool *)((char *)(job->jobdefs) + offset);
744 Dmsg5(400, "Job \"%s\", field \"%s\" def_bvalue=%d item %d offset=%u\n",
745 job->name(), job_items[i].name, *def_bvalue, i, offset);
746 bvalue = (bool *)((char *)job + offset);
747 *bvalue = *def_bvalue;
748 set_bit(i, job->hdr.item_present);
754 * Ensure that all required items are present
756 for (i=0; job_items[i].name; i++) {
757 if (job_items[i].flags & ITEM_REQUIRED) {
758 if (!bit_is_set(i, job->hdr.item_present)) {
759 Jmsg(NULL, M_ERROR_TERM, 0, _("\"%s\" directive in Job \"%s\" resource is required, but not found.\n"),
760 job_items[i].name, job->name());
764 /* If this triggers, take a look at lib/parse_conf.h */
765 if (i >= MAX_RES_ITEMS) {
766 Emsg0(M_ERROR_TERM, 0, _("Too many items in Job resource\n"));
769 if (!job->storage && !job->pool->storage) {
770 Jmsg(NULL, M_FATAL, 0, _("No storage specified in Job \"%s\" nor in Pool.\n"),
774 } /* End loop over Job res */
777 /* Loop over Consoles */
779 foreach_res(cons, R_CONSOLE) {
780 /* tls_require implies tls_enable */
781 if (cons->tls_require) {
783 cons->tls_enable = true;
785 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
791 need_tls = cons->tls_enable || cons->tls_authenticate;
793 if (!cons->tls_certfile && need_tls) {
794 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n"),
795 cons->name(), configfile);
799 if (!cons->tls_keyfile && need_tls) {
800 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Console \"%s\" in %s.\n"),
801 cons->name(), configfile);
805 if ((!cons->tls_ca_certfile && !cons->tls_ca_certdir)
806 && need_tls && cons->tls_verify_peer) {
807 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\" or \"TLS CA"
808 " Certificate Dir\" are defined for Console \"%s\" in %s."
809 " At least one CA certificate store is required"
810 " when using \"TLS Verify Peer\".\n"),
811 cons->name(), configfile);
814 /* If everything is well, attempt to initialize our per-resource TLS context */
815 if (OK && (need_tls || cons->tls_require)) {
816 /* Initialize TLS context:
817 * Args: CA certfile, CA certdir, Certfile, Keyfile,
818 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
819 cons->tls_ctx = new_tls_context(cons->tls_ca_certfile,
820 cons->tls_ca_certdir, cons->tls_certfile,
821 cons->tls_keyfile, NULL, NULL, cons->tls_dhfile, cons->tls_verify_peer);
823 if (!cons->tls_ctx) {
824 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for File daemon \"%s\" in %s.\n"),
825 cons->name(), configfile);
832 /* Loop over Clients */
834 foreach_res(client, R_CLIENT) {
835 /* tls_require implies tls_enable */
836 if (client->tls_require) {
838 client->tls_enable = true;
840 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
845 need_tls = client->tls_enable || client->tls_authenticate;
846 if ((!client->tls_ca_certfile && !client->tls_ca_certdir) && need_tls) {
847 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
848 " or \"TLS CA Certificate Dir\" are defined for File daemon \"%s\" in %s.\n"),
849 client->name(), configfile);
853 /* If everything is well, attempt to initialize our per-resource TLS context */
854 if (OK && (need_tls || client->tls_require)) {
855 /* Initialize TLS context:
856 * Args: CA certfile, CA certdir, Certfile, Keyfile,
857 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
858 client->tls_ctx = new_tls_context(client->tls_ca_certfile,
859 client->tls_ca_certdir, client->tls_certfile,
860 client->tls_keyfile, NULL, NULL, NULL,
863 if (!client->tls_ctx) {
864 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for File daemon \"%s\" in %s.\n"),
865 client->name(), configfile);
873 close_msg(NULL); /* close temp message handler */
874 init_msg(NULL, director->messages); /* open daemon message handler */
879 static bool check_catalog()
884 /* Loop over databases */
886 foreach_res(catalog, R_CATALOG) {
889 * Make sure we can open catalog, otherwise print a warning
890 * message because the server is probably not running.
892 db = db_init(NULL, catalog->db_driver, catalog->db_name, catalog->db_user,
893 catalog->db_password, catalog->db_address,
894 catalog->db_port, catalog->db_socket,
895 catalog->mult_db_connections);
896 if (!db || !db_open_database(NULL, db)) {
897 Pmsg2(000, _("Could not open Catalog \"%s\", database \"%s\".\n"),
898 catalog->name(), catalog->db_name);
899 Jmsg(NULL, M_FATAL, 0, _("Could not open Catalog \"%s\", database \"%s\".\n"),
900 catalog->name(), catalog->db_name);
902 Jmsg(NULL, M_FATAL, 0, _("%s"), db_strerror(db));
903 Pmsg1(000, "%s", db_strerror(db));
904 db_close_database(NULL, db);
910 /* Loop over all pools, defining/updating them in each database */
912 foreach_res(pool, R_POOL) {
914 * If the Pool has a catalog resource create the pool only
917 if (!pool->catalog || pool->catalog == catalog) {
918 create_pool(NULL, db, pool, POOL_OP_UPDATE); /* update request */
919 update_pool_recyclepool(NULL, db, pool);
924 foreach_res(store, R_STORAGE) {
927 if (store->media_type) {
928 bstrncpy(mr.MediaType, store->media_type, sizeof(mr.MediaType));
930 db_create_mediatype_record(NULL, db, &mr);
934 bstrncpy(sr.Name, store->name(), sizeof(sr.Name));
935 sr.AutoChanger = store->autochanger;
936 db_create_storage_record(NULL, db, &sr);
937 store->StorageId = sr.StorageId; /* set storage Id */
938 if (!sr.created) { /* if not created, update it */
939 db_update_storage_record(NULL, db, &sr);
942 /* tls_require implies tls_enable */
943 if (store->tls_require) {
945 store->tls_enable = true;
947 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
952 need_tls = store->tls_enable || store->tls_authenticate;
954 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && need_tls) {
955 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
956 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s.\n"),
957 store->name(), configfile);
961 /* If everything is well, attempt to initialize our per-resource TLS context */
962 if (OK && (need_tls || store->tls_require)) {
963 /* Initialize TLS context:
964 * Args: CA certfile, CA certdir, Certfile, Keyfile,
965 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
966 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
967 store->tls_ca_certdir, store->tls_certfile,
968 store->tls_keyfile, NULL, NULL, NULL, true);
970 if (!store->tls_ctx) {
971 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
972 store->name(), configfile);
978 /* Loop over all counters, defining them in each database */
979 /* Set default value in all counters */
981 foreach_res(counter, R_COUNTER) {
982 /* Write to catalog? */
983 if (!counter->created && counter->Catalog == catalog) {
985 bstrncpy(cr.Counter, counter->name(), sizeof(cr.Counter));
986 cr.MinValue = counter->MinValue;
987 cr.MaxValue = counter->MaxValue;
988 cr.CurrentValue = counter->MinValue;
989 if (counter->WrapCounter) {
990 bstrncpy(cr.WrapCounter, counter->WrapCounter->name(), sizeof(cr.WrapCounter));
992 cr.WrapCounter[0] = 0; /* empty string */
994 if (db_create_counter_record(NULL, db, &cr)) {
995 counter->CurrentValue = cr.CurrentValue;
996 counter->created = true;
997 Dmsg2(100, "Create counter %s val=%d\n", counter->name(), counter->CurrentValue);
1000 if (!counter->created) {
1001 counter->CurrentValue = counter->MinValue; /* default value */
1004 db_close_database(NULL, db);
1006 /* Set type in global for debugging */
1007 set_db_type(db_get_type());