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 John Walker.
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();
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 int r_first, r_last; /* first and last resources */
78 extern RES_TABLE resources[];
79 extern RES **res_head;
80 extern RES_ITEM job_items[];
81 extern int res_all_size;
84 extern "C" { // work around visual compiler mangling variables
91 #define CONFIG_FILE "bacula-dir.conf" /* default configuration file */
97 "\nVersion: %s (%s)\n\n"
98 "Usage: dird [-f -s] [-c config_file] [-d debug_level] [config_file]\n"
99 " -c <file> set configuration file to file\n"
100 " -d <nn> set debug level to <nn>\n"
101 " -dt print timestamp in debug output\n"
102 " -f run in foreground (for debugging)\n"
104 " -r <job> run <job> now\n"
106 " -t test - read configuration and exit\n"
108 " -v verbose user messages\n"
109 " -? print this message.\n"
110 "\n"), 2000, VERSION, BDATE);
116 /*********************************************************************
118 * Main Bacula Server program
121 #if defined(HAVE_WIN32)
122 /* For Win32 main() is in src/win32 code ... */
123 #define main BaculaMain
126 int main (int argc, char *argv[])
130 bool no_signals = false;
131 bool test_config = false;
135 start_heap = sbrk(0);
136 setlocale(LC_ALL, "");
137 bindtextdomain("bacula", LOCALEDIR);
138 textdomain("bacula");
141 my_name_is(argc, argv, "bacula-dir");
142 init_msg(NULL, NULL); /* initialize message handler */
144 daemon_start_time = time(NULL);
146 console_command = run_console_command;
148 while ((ch = getopt(argc, argv, "c:d:fg:r:stu:v?")) != -1) {
150 case 'c': /* specify config file */
151 if (configfile != NULL) {
154 configfile = bstrdup(optarg);
157 case 'd': /* set debug level */
158 if (*optarg == 't') {
159 dbg_timestamp = true;
161 debug_level = atoi(optarg);
162 if (debug_level <= 0) {
166 Dmsg1(10, "Debug level = %d\n", debug_level);
169 case 'f': /* run in foreground */
173 case 'g': /* set group id */
177 case 'r': /* run job */
178 if (runjob != NULL) {
182 runjob = bstrdup(optarg);
186 case 's': /* turn off signals */
190 case 't': /* test config */
194 case 'u': /* set uid */
198 case 'v': /* verbose */
212 init_signals(terminate_dird);
216 if (configfile != NULL) {
219 configfile = bstrdup(*argv);
227 if (configfile == NULL) {
228 configfile = bstrdup(CONFIG_FILE);
231 config = new_config_parser();
232 config->init(configfile, NULL, M_ERROR_TERM, (void *)&res_all, res_all_size,
233 r_first, r_last, resources, res_head);
234 config->parse_config();
236 if (init_crypto() != 0) {
237 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
240 if (!check_resources()) {
241 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
244 if (!test_config) { /* we don't need to do this block in test mode */
247 init_stack_dump(); /* grab new pid */
250 /* Create pid must come after we are a daemon -- so we have our final pid */
251 create_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
252 read_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
255 load_dir_plugins(director->plugin_directory);
257 drop(uid, gid); /* reduce privileges if requested */
259 if (!check_catalog()) {
260 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
267 my_name_is(0, NULL, director->name()); /* set user defined name */
269 /* Plug database interface for library routines */
270 p_sql_query = (sql_query)dir_sql_query;
271 p_sql_escape = (sql_escape)db_escape_string;
273 FDConnectTimeout = (int)director->FDConnectTimeout;
274 SDConnectTimeout = (int)director->SDConnectTimeout;
277 #if !defined(HAVE_WIN32)
278 signal(SIGHUP, reload_config);
281 init_console_msg(working_directory);
283 init_python_interpreter(director->name(), director->scripts_directory,
286 set_thread_concurrency(director->MaxConcurrentJobs * 2 +
287 4 /* UA */ + 4 /* sched+watchdog+jobsvr+misc */);
289 Dmsg0(200, "Start UA server\n");
290 start_UA_server(director->DIRaddrs);
292 start_watchdog(); /* start network watchdog thread */
294 init_jcr_subsystem(); /* start JCR watchdogs etc. */
296 init_job_server(director->MaxConcurrentJobs);
298 // init_device_resources();
300 Dmsg0(200, "wait for next job\n");
301 /* Main loop -- call scheduler to get next job to run */
302 while ( (jcr = wait_for_next_job(runjob)) ) {
303 run_job(jcr); /* run job */
304 free_jcr(jcr); /* release jcr */
305 if (runjob) { /* command line, run a single job? */
306 break; /* yes, terminate */
316 * This allows the message handler to operate on the database
317 * by using a pointer to this function. The pointer is
318 * needed because the other daemons do not have access
319 * to the database. If the pointer is
320 * not defined (other daemons), then writing the database
323 static void dir_sql_query(JCR *jcr, const char *cmd)
325 if (!jcr || !jcr->db) {
328 db_sql_query(jcr->db, cmd, NULL, NULL);
331 /* Cleanup and then exit */
332 void terminate_dird(int sig)
334 static bool already_here = false;
336 if (already_here) { /* avoid recursive temination problems */
337 bmicrosleep(2, 0); /* yield */
341 debug_level = 0; /* turn off debug */
343 generate_daemon_event(NULL, "Exit");
345 write_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
346 delete_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs));
352 if (configfile != NULL) {
355 if (debug_level > 5) {
356 print_memory_pool_stats();
358 config->free_resources();
362 term_msg(); /* terminate message handler */
364 close_memory_pool(); /* release free memory in pool */
369 struct RELOAD_TABLE {
374 static const int max_reloads = 32;
375 static RELOAD_TABLE reload_table[max_reloads];
377 static void init_reload(void)
379 for (int i=0; i < max_reloads; i++) {
380 reload_table[i].job_count = 0;
381 reload_table[i].res_table = NULL;
385 static void free_saved_resources(int table)
387 int num = r_last - r_first + 1;
388 RES **res_tab = reload_table[table].res_table;
390 Dmsg1(100, "res_tab for table %d already released.\n", table);
393 Dmsg1(100, "Freeing resources for table %d\n", table);
394 for (int j=0; j<num; j++) {
395 free_resource(res_tab[j], r_first + j);
398 reload_table[table].job_count = 0;
399 reload_table[table].res_table = NULL;
403 * Called here at the end of every job that was
404 * hooked decrementing the active job_count. When
405 * it goes to zero, no one is using the associated
406 * resource table, so free it.
408 static void reload_job_end_cb(JCR *jcr, void *ctx)
410 int reload_id = (int)((long int)ctx);
411 Dmsg3(100, "reload job_end JobId=%d table=%d cnt=%d\n", jcr->JobId,
412 reload_id, reload_table[reload_id].job_count);
415 if (--reload_table[reload_id].job_count <= 0) {
416 free_saved_resources(reload_id);
422 static int find_free_reload_table_entry()
425 for (int i=0; i < max_reloads; i++) {
426 if (reload_table[i].res_table == NULL) {
435 * If we get here, we have received a SIGHUP, which means to
436 * reread our configuration file.
438 * The algorithm used is as follows: we count how many jobs are
439 * running and mark the running jobs to make a callback on
440 * exiting. The old config is saved with the reload table
441 * id in a reload table. The new config file is read. Now, as
442 * each job exits, it calls back to the reload_job_end_cb(), which
443 * decrements the count of open jobs for the given reload table.
444 * When the count goes to zero, we release those resources.
445 * This allows us to have pointers into the resource table (from
446 * jobs), and once they exit and all the pointers are released, we
447 * release the old table. Note, if no new jobs are running since the
448 * last reload, then the old resources will be immediately release.
449 * A console is considered a job because it may have pointers to
450 * resources, but a SYSTEM job is not since it *should* not have any
451 * permanent pointers to jobs.
454 void reload_config(int sig)
456 static bool already_here = false;
457 #if !defined(HAVE_WIN32)
461 int njobs = 0; /* number of running jobs */
466 abort(); /* Oops, recursion -> die */
470 #if !defined(HAVE_WIN32)
472 sigaddset(&set, SIGHUP);
473 sigprocmask(SIG_BLOCK, &set, NULL);
479 table = find_free_reload_table_entry();
481 Jmsg(NULL, M_ERROR, 0, _("Too many open reload requests. Request ignored.\n"));
485 Dmsg1(100, "Reload_config njobs=%d\n", njobs);
486 reload_table[table].res_table = config->save_resources();
487 Dmsg1(100, "Saved old config in table %d\n", table);
489 ok = parse_config(configfile, 0, M_ERROR); /* no exit on error */
491 Dmsg0(100, "Reloaded config file\n");
492 if (!ok || !check_resources() || !check_catalog()) {
493 rtable = find_free_reload_table_entry(); /* save new, bad table */
495 Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
496 Jmsg(NULL, M_ERROR_TERM, 0, _("Out of reload table entries. Giving up.\n"));
498 Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
499 Jmsg(NULL, M_ERROR, 0, _("Resetting previous configuration.\n"));
501 reload_table[rtable].res_table = config->save_resources();
502 /* Now restore old resoure values */
503 int num = r_last - r_first + 1;
504 RES **res_tab = reload_table[table].res_table;
505 for (int i=0; i<num; i++) {
506 res_head[i] = res_tab[i];
508 table = rtable; /* release new, bad, saved table below */
510 invalidate_schedules();
512 * Hook all active jobs so that they release this table
515 if (jcr->JobType != JT_SYSTEM) {
516 reload_table[table].job_count++;
517 job_end_push(jcr, reload_job_end_cb, (void *)((long int)table));
525 set_working_directory(director->working_directory);
526 FDConnectTimeout = director->FDConnectTimeout;
527 SDConnectTimeout = director->SDConnectTimeout;
528 Dmsg0(10, "Director's configuration file reread.\n");
530 /* Now release saved resources, if no jobs using the resources */
532 free_saved_resources(table);
538 #if !defined(HAVE_WIN32)
539 sigprocmask(SIG_UNBLOCK, &set, NULL);
540 signal(SIGHUP, reload_config);
542 already_here = false;
546 * Make a quick check to see that we have all the
549 * **** FIXME **** this routine could be a lot more
550 * intelligent and comprehensive.
552 static bool check_resources()
560 job = (JOB *)GetNextRes(R_JOB, NULL);
561 director = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
563 Jmsg(NULL, M_FATAL, 0, _("No Director resource defined in %s\n"
564 "Without that I don't know who I am :-(\n"), configfile);
567 set_working_directory(director->working_directory);
568 if (!director->messages) { /* If message resource not specified */
569 director->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
570 if (!director->messages) {
571 Jmsg(NULL, M_FATAL, 0, _("No Messages resource defined in %s\n"), configfile);
575 if (GetNextRes(R_DIRECTOR, (RES *)director) != NULL) {
576 Jmsg(NULL, M_FATAL, 0, _("Only one Director resource permitted in %s\n"),
580 /* tls_require implies tls_enable */
581 if (director->tls_require) {
583 director->tls_enable = true;
585 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
590 need_tls = director->tls_enable || director->tls_authenticate;
592 if (!director->tls_certfile && need_tls) {
593 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
594 director->name(), configfile);
598 if (!director->tls_keyfile && need_tls) {
599 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
600 director->name(), configfile);
604 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) &&
605 need_tls && director->tls_verify_peer) {
606 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\" or \"TLS CA"
607 " Certificate Dir\" are defined for Director \"%s\" in %s."
608 " At least one CA certificate store is required"
609 " when using \"TLS Verify Peer\".\n"),
610 director->name(), configfile);
614 /* If everything is well, attempt to initialize our per-resource TLS context */
615 if (OK && (need_tls || director->tls_require)) {
616 /* Initialize TLS context:
617 * Args: CA certfile, CA certdir, Certfile, Keyfile,
618 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
619 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
620 director->tls_ca_certdir, director->tls_certfile,
621 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
622 director->tls_verify_peer);
624 if (!director->tls_ctx) {
625 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
626 director->name(), configfile);
633 Jmsg(NULL, M_FATAL, 0, _("No Job records defined in %s\n"), configfile);
636 foreach_res(job, R_JOB) {
640 /* Handle Storage alists specifically */
641 JOB *jobdefs = job->jobdefs;
642 if (jobdefs->storage && !job->storage) {
644 job->storage = New(alist(10, not_owned_by_alist));
645 foreach_alist(st, jobdefs->storage) {
646 job->storage->append(st);
649 /* Handle RunScripts alists specifically */
650 if (jobdefs->RunScripts) {
653 if (!job->RunScripts) {
654 job->RunScripts = New(alist(10, not_owned_by_alist));
657 foreach_alist(rs, jobdefs->RunScripts) {
658 elt = copy_runscript(rs);
659 job->RunScripts->append(elt); /* we have to free it */
663 /* Transfer default items from JobDefs Resource */
664 for (i=0; job_items[i].name; i++) {
665 char **def_svalue, **svalue; /* string value */
666 int *def_ivalue, *ivalue; /* integer value */
667 bool *def_bvalue, *bvalue; /* bool value */
668 int64_t *def_lvalue, *lvalue; /* 64 bit values */
671 Dmsg4(1400, "Job \"%s\", field \"%s\" bit=%d def=%d\n",
672 job->name(), job_items[i].name,
673 bit_is_set(i, job->hdr.item_present),
674 bit_is_set(i, job->jobdefs->hdr.item_present));
676 if (!bit_is_set(i, job->hdr.item_present) &&
677 bit_is_set(i, job->jobdefs->hdr.item_present)) {
678 Dmsg2(400, "Job \"%s\", field \"%s\": getting default.\n",
679 job->name(), job_items[i].name);
680 offset = (char *)(job_items[i].value) - (char *)&res_all;
682 * Handle strings and directory strings
684 if (job_items[i].handler == store_str ||
685 job_items[i].handler == store_dir) {
686 def_svalue = (char **)((char *)(job->jobdefs) + offset);
687 Dmsg5(400, "Job \"%s\", field \"%s\" def_svalue=%s item %d offset=%u\n",
688 job->name(), job_items[i].name, *def_svalue, i, offset);
689 svalue = (char **)((char *)job + offset);
691 Pmsg1(000, _("Hey something is wrong. p=0x%lu\n"), *svalue);
693 *svalue = bstrdup(*def_svalue);
694 set_bit(i, job->hdr.item_present);
698 } else if (job_items[i].handler == store_res) {
699 def_svalue = (char **)((char *)(job->jobdefs) + offset);
700 Dmsg4(400, "Job \"%s\", field \"%s\" item %d offset=%u\n",
701 job->name(), job_items[i].name, i, offset);
702 svalue = (char **)((char *)job + offset);
704 Pmsg1(000, _("Hey something is wrong. p=0x%lu\n"), *svalue);
706 *svalue = *def_svalue;
707 set_bit(i, job->hdr.item_present);
709 * Handle alist resources
711 } else if (job_items[i].handler == store_alist_res) {
712 if (bit_is_set(i, job->jobdefs->hdr.item_present)) {
713 set_bit(i, job->hdr.item_present);
716 * Handle integer fields
717 * Note, our store_bit does not handle bitmaped fields
719 } else if (job_items[i].handler == store_bit ||
720 job_items[i].handler == store_pint ||
721 job_items[i].handler == store_jobtype ||
722 job_items[i].handler == store_level ||
723 job_items[i].handler == store_pint ||
724 job_items[i].handler == store_migtype ||
725 job_items[i].handler == store_replace) {
726 def_ivalue = (int *)((char *)(job->jobdefs) + offset);
727 Dmsg5(400, "Job \"%s\", field \"%s\" def_ivalue=%d item %d offset=%u\n",
728 job->name(), job_items[i].name, *def_ivalue, i, offset);
729 ivalue = (int *)((char *)job + offset);
730 *ivalue = *def_ivalue;
731 set_bit(i, job->hdr.item_present);
733 * Handle 64 bit integer fields
735 } else if (job_items[i].handler == store_time ||
736 job_items[i].handler == store_size ||
737 job_items[i].handler == store_int64) {
738 def_lvalue = (int64_t *)((char *)(job->jobdefs) + offset);
739 Dmsg5(400, "Job \"%s\", field \"%s\" def_lvalue=%" lld " item %d offset=%u\n",
740 job->name(), job_items[i].name, *def_lvalue, i, offset);
741 lvalue = (int64_t *)((char *)job + offset);
742 *lvalue = *def_lvalue;
743 set_bit(i, job->hdr.item_present);
747 } else if (job_items[i].handler == store_bool) {
748 def_bvalue = (bool *)((char *)(job->jobdefs) + offset);
749 Dmsg5(400, "Job \"%s\", field \"%s\" def_bvalue=%d item %d offset=%u\n",
750 job->name(), job_items[i].name, *def_bvalue, i, offset);
751 bvalue = (bool *)((char *)job + offset);
752 *bvalue = *def_bvalue;
753 set_bit(i, job->hdr.item_present);
759 * Ensure that all required items are present
761 for (i=0; job_items[i].name; i++) {
762 if (job_items[i].flags & ITEM_REQUIRED) {
763 if (!bit_is_set(i, job->hdr.item_present)) {
764 Jmsg(NULL, M_ERROR_TERM, 0, _("\"%s\" directive in Job \"%s\" resource is required, but not found.\n"),
765 job_items[i].name, job->name());
769 /* If this triggers, take a look at lib/parse_conf.h */
770 if (i >= MAX_RES_ITEMS) {
771 Emsg0(M_ERROR_TERM, 0, _("Too many items in Job resource\n"));
774 if (!job->storage && !job->pool->storage) {
775 Jmsg(NULL, M_FATAL, 0, _("No storage specified in Job \"%s\" nor in Pool.\n"),
779 } /* End loop over Job res */
782 /* Loop over Consoles */
784 foreach_res(cons, R_CONSOLE) {
785 /* tls_require implies tls_enable */
786 if (cons->tls_require) {
788 cons->tls_enable = true;
790 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
796 need_tls = cons->tls_enable || cons->tls_authenticate;
798 if (!cons->tls_certfile && need_tls) {
799 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Console \"%s\" in %s.\n"),
800 cons->name(), configfile);
804 if (!cons->tls_keyfile && need_tls) {
805 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Console \"%s\" in %s.\n"),
806 cons->name(), configfile);
810 if ((!cons->tls_ca_certfile && !cons->tls_ca_certdir)
811 && need_tls && cons->tls_verify_peer) {
812 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\" or \"TLS CA"
813 " Certificate Dir\" are defined for Console \"%s\" in %s."
814 " At least one CA certificate store is required"
815 " when using \"TLS Verify Peer\".\n"),
816 cons->name(), configfile);
819 /* If everything is well, attempt to initialize our per-resource TLS context */
820 if (OK && (need_tls || cons->tls_require)) {
821 /* Initialize TLS context:
822 * Args: CA certfile, CA certdir, Certfile, Keyfile,
823 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
824 cons->tls_ctx = new_tls_context(cons->tls_ca_certfile,
825 cons->tls_ca_certdir, cons->tls_certfile,
826 cons->tls_keyfile, NULL, NULL, cons->tls_dhfile, cons->tls_verify_peer);
828 if (!cons->tls_ctx) {
829 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for File daemon \"%s\" in %s.\n"),
830 cons->name(), configfile);
837 /* Loop over Clients */
839 foreach_res(client, R_CLIENT) {
840 /* tls_require implies tls_enable */
841 if (client->tls_require) {
843 client->tls_enable = true;
845 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
850 need_tls = client->tls_enable || client->tls_authenticate;
851 if ((!client->tls_ca_certfile && !client->tls_ca_certdir) && need_tls) {
852 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
853 " or \"TLS CA Certificate Dir\" are defined for File daemon \"%s\" in %s.\n"),
854 client->name(), configfile);
858 /* If everything is well, attempt to initialize our per-resource TLS context */
859 if (OK && (need_tls || client->tls_require)) {
860 /* Initialize TLS context:
861 * Args: CA certfile, CA certdir, Certfile, Keyfile,
862 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
863 client->tls_ctx = new_tls_context(client->tls_ca_certfile,
864 client->tls_ca_certdir, client->tls_certfile,
865 client->tls_keyfile, NULL, NULL, NULL,
868 if (!client->tls_ctx) {
869 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for File daemon \"%s\" in %s.\n"),
870 client->name(), configfile);
878 close_msg(NULL); /* close temp message handler */
879 init_msg(NULL, director->messages); /* open daemon message handler */
884 static bool check_catalog()
889 /* Loop over databases */
891 foreach_res(catalog, R_CATALOG) {
894 * Make sure we can open catalog, otherwise print a warning
895 * message because the server is probably not running.
897 db = db_init(NULL, catalog->db_driver, catalog->db_name, catalog->db_user,
898 catalog->db_password, catalog->db_address,
899 catalog->db_port, catalog->db_socket,
900 catalog->mult_db_connections);
901 if (!db || !db_open_database(NULL, db)) {
902 Pmsg2(000, _("Could not open Catalog \"%s\", database \"%s\".\n"),
903 catalog->name(), catalog->db_name);
904 Jmsg(NULL, M_FATAL, 0, _("Could not open Catalog \"%s\", database \"%s\".\n"),
905 catalog->name(), catalog->db_name);
907 Jmsg(NULL, M_FATAL, 0, _("%s"), db_strerror(db));
908 Pmsg1(000, "%s", db_strerror(db));
909 db_close_database(NULL, db);
915 /* Loop over all pools, defining/updating them in each database */
917 foreach_res(pool, R_POOL) {
919 * If the Pool has a catalog resource create the pool only
922 if (!pool->catalog || pool->catalog == catalog) {
923 create_pool(NULL, db, pool, POOL_OP_UPDATE); /* update request */
924 update_pool_recyclepool(NULL, db, pool);
929 foreach_res(store, R_STORAGE) {
932 if (store->media_type) {
933 bstrncpy(mr.MediaType, store->media_type, sizeof(mr.MediaType));
935 db_create_mediatype_record(NULL, db, &mr);
939 bstrncpy(sr.Name, store->name(), sizeof(sr.Name));
940 sr.AutoChanger = store->autochanger;
941 db_create_storage_record(NULL, db, &sr);
942 store->StorageId = sr.StorageId; /* set storage Id */
943 if (!sr.created) { /* if not created, update it */
944 db_update_storage_record(NULL, db, &sr);
947 /* tls_require implies tls_enable */
948 if (store->tls_require) {
950 store->tls_enable = true;
952 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
957 need_tls = store->tls_enable || store->tls_authenticate;
959 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && need_tls) {
960 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
961 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s.\n"),
962 store->name(), configfile);
966 /* If everything is well, attempt to initialize our per-resource TLS context */
967 if (OK && (need_tls || store->tls_require)) {
968 /* Initialize TLS context:
969 * Args: CA certfile, CA certdir, Certfile, Keyfile,
970 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
971 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
972 store->tls_ca_certdir, store->tls_certfile,
973 store->tls_keyfile, NULL, NULL, NULL, true);
975 if (!store->tls_ctx) {
976 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
977 store->name(), configfile);
983 /* Loop over all counters, defining them in each database */
984 /* Set default value in all counters */
986 foreach_res(counter, R_COUNTER) {
987 /* Write to catalog? */
988 if (!counter->created && counter->Catalog == catalog) {
990 bstrncpy(cr.Counter, counter->name(), sizeof(cr.Counter));
991 cr.MinValue = counter->MinValue;
992 cr.MaxValue = counter->MaxValue;
993 cr.CurrentValue = counter->MinValue;
994 if (counter->WrapCounter) {
995 bstrncpy(cr.WrapCounter, counter->WrapCounter->name(), sizeof(cr.WrapCounter));
997 cr.WrapCounter[0] = 0; /* empty string */
999 if (db_create_counter_record(NULL, db, &cr)) {
1000 counter->CurrentValue = cr.CurrentValue;
1001 counter->created = true;
1002 Dmsg2(100, "Create counter %s val=%d\n", counter->name(), counter->CurrentValue);
1005 if (!counter->created) {
1006 counter->CurrentValue = counter->MinValue; /* default value */
1009 db_close_database(NULL, db);
1011 /* Set type in global for debugging */
1012 set_db_type(db_get_type());