2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2007 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.
29 * Second generation Storage daemon.
33 * It accepts a number of simple commands from the File daemon
34 * and acts on them. When a request to append data is made,
35 * it opens a data channel and accepts data from the
45 /* Imported functions */
48 /* Forward referenced functions */
49 void terminate_stored(int sig);
50 static int check_resources();
51 static void cleanup_old_files();
53 extern "C" void *device_initialization(void *arg);
55 #define CONFIG_FILE "bacula-sd.conf" /* Default config file */
57 /* Global variables exported */
58 char OK_msg[] = "3000 OK\n";
59 char TERM_msg[] = "3999 Terminate\n";
60 STORES *me = NULL; /* our Global resource */
61 bool forge_on = false; /* proceed inspite of I/O errors */
62 pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER;
63 pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER;
67 static uint32_t VolSessionId = 0;
68 uint32_t VolSessionTime;
69 char *configfile = NULL;
70 bool init_done = false;
72 /* Global static variables */
73 static bool foreground = 0;
74 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
75 static workq_t dird_workq; /* queue for processing connections */
82 "\nVersion: %s (%s)\n\n"
83 "Usage: stored [options] [-c config_file] [config_file]\n"
84 " -c <file> use <file> as configuration file\n"
85 " -d <nn> set debug level to <nn>\n"
86 " -dt print timestamp in debug output\n"
87 " -f run in foreground (for debugging)\n"
88 " -g <group> set groupid to group\n"
89 " -p proceed despite I/O errors\n"
90 " -s no signals (for debugging)\n"
91 " -t test - read config and exit\n"
92 " -u <user> userid to <user>\n"
93 " -v verbose user messages\n"
94 " -? print this message.\n"
95 "\n"), 2000, VERSION, BDATE);
99 /*********************************************************************
101 * Main Bacula Unix Storage Daemon
104 #if defined(HAVE_WIN32)
105 #define main BaculaMain
108 int main (int argc, char *argv[])
111 bool no_signals = false;
112 bool test_config = false;
117 start_heap = sbrk(0);
118 setlocale(LC_ALL, "");
119 bindtextdomain("bacula", LOCALEDIR);
120 textdomain("bacula");
123 my_name_is(argc, argv, "bacula-sd");
124 init_msg(NULL, NULL);
125 daemon_start_time = time(NULL);
128 if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
129 Emsg2(M_ABORT, 0, _("Tape block size (%d) not multiple of system size (%d)\n"),
130 TAPE_BSIZE, B_DEV_BSIZE);
132 if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) {
133 Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE);
136 while ((ch = getopt(argc, argv, "c:d:fg:pstu:v?")) != -1) {
138 case 'c': /* configuration file */
139 if (configfile != NULL) {
142 configfile = bstrdup(optarg);
145 case 'd': /* debug level */
146 if (*optarg == 't') {
147 dbg_timestamp = true;
149 debug_level = atoi(optarg);
150 if (debug_level <= 0) {
156 case 'f': /* run in foreground */
160 case 'g': /* set group id */
164 case 'p': /* proceed in spite of I/O errors */
168 case 's': /* no signals */
176 case 'u': /* set uid */
180 case 'v': /* verbose */
194 if (configfile != NULL) {
197 configfile = bstrdup(*argv);
205 init_signals(terminate_stored);
208 if (configfile == NULL) {
209 configfile = bstrdup(CONFIG_FILE);
212 parse_config(configfile);
214 if (init_crypto() != 0) {
215 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
218 if (!check_resources()) {
219 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
222 init_reservations_lock();
228 my_name_is(0, (char **)NULL, me->hdr.name); /* Set our real name */
231 daemon_start(); /* become daemon */
232 init_stack_dump(); /* pick up new pid */
235 create_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
236 read_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
243 /* Ensure that Volume Session Time and Id are both
244 * set and are both non-zero.
246 VolSessionTime = (uint32_t)daemon_start_time;
247 if (VolSessionTime == 0) { /* paranoid */
248 Jmsg0(NULL, M_ABORT, 0, _("Volume Session Time is ZERO!\n"));
251 init_python_interpreter(me->hdr.name, me->scripts_directory, "SDStartUp");
253 /* Make sure on Solaris we can run concurrent, watch dog + servers + misc */
254 set_thread_concurrency(me->max_concurrent_jobs * 2 + 4);
257 * Start the device allocation thread
259 create_volume_list(); /* do before device_init */
260 if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) {
262 Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), be.bstrerror());
265 start_watchdog(); /* start watchdog thread */
266 init_jcr_subsystem(); /* start JCR watchdogs etc. */
268 /* Single server used for Director and File daemon */
269 bnet_thread_server(me->sdaddrs, me->max_concurrent_jobs * 2 + 1,
270 &dird_workq, handle_connection_request);
271 exit(1); /* to keep compiler quiet */
274 /* Return a new Session Id */
275 uint32_t newVolSessionId()
286 /* Check Configuration file for necessary info */
287 static int check_resources()
292 me = (STORES *)GetNextRes(R_STORAGE, NULL);
294 Jmsg1(NULL, M_ERROR, 0, _("No Storage resource defined in %s. Cannot continue.\n"),
299 if (GetNextRes(R_STORAGE, (RES *)me) != NULL) {
300 Jmsg1(NULL, M_ERROR, 0, _("Only one Storage resource permitted in %s\n"),
304 if (GetNextRes(R_DIRECTOR, NULL) == NULL) {
305 Jmsg1(NULL, M_ERROR, 0, _("No Director resource defined in %s. Cannot continue.\n"),
309 if (GetNextRes(R_DEVICE, NULL) == NULL){
310 Jmsg1(NULL, M_ERROR, 0, _("No Device resource defined in %s. Cannot continue.\n"),
316 me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
318 Jmsg1(NULL, M_ERROR, 0, _("No Messages resource defined in %s. Cannot continue.\n"),
324 if (!me->working_directory) {
325 Jmsg1(NULL, M_ERROR, 0, _("No Working Directory defined in %s. Cannot continue.\n"),
332 foreach_res(store, R_STORAGE) {
333 /* tls_require implies tls_enable */
334 if (store->tls_require) {
336 store->tls_enable = true;
338 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
344 if (!store->tls_certfile && store->tls_enable) {
345 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"),
346 store->hdr.name, configfile);
350 if (!store->tls_keyfile && store->tls_enable) {
351 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"),
352 store->hdr.name, configfile);
356 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && store->tls_enable && store->tls_verify_peer) {
357 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
358 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s."
359 " At least one CA certificate store is required"
360 " when using \"TLS Verify Peer\".\n"),
361 store->hdr.name, configfile);
365 /* If everything is well, attempt to initialize our per-resource TLS context */
366 if (OK && (store->tls_enable || store->tls_require)) {
367 /* Initialize TLS context:
368 * Args: CA certfile, CA certdir, Certfile, Keyfile,
369 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
370 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
371 store->tls_ca_certdir, store->tls_certfile,
372 store->tls_keyfile, NULL, NULL, store->tls_dhfile,
373 store->tls_verify_peer);
375 if (!store->tls_ctx) {
376 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
377 store->hdr.name, configfile);
383 foreach_res(director, R_DIRECTOR) {
384 /* tls_require implies tls_enable */
385 if (director->tls_require) {
386 director->tls_enable = true;
389 if (!director->tls_certfile && director->tls_enable) {
390 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
391 director->hdr.name, configfile);
395 if (!director->tls_keyfile && director->tls_enable) {
396 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
397 director->hdr.name, configfile);
401 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && director->tls_enable && director->tls_verify_peer) {
402 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
403 " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s."
404 " At least one CA certificate store is required"
405 " when using \"TLS Verify Peer\".\n"),
406 director->hdr.name, configfile);
410 /* If everything is well, attempt to initialize our per-resource TLS context */
411 if (OK && (director->tls_enable || director->tls_require)) {
412 /* Initialize TLS context:
413 * Args: CA certfile, CA certdir, Certfile, Keyfile,
414 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
415 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
416 director->tls_ca_certdir, director->tls_certfile,
417 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
418 director->tls_verify_peer);
420 if (!director->tls_ctx) {
421 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
422 director->hdr.name, configfile);
428 OK = init_autochangers();
432 close_msg(NULL); /* close temp message handler */
433 init_msg(NULL, me->messages); /* open daemon message handler */
434 set_working_directory(me->working_directory);
440 static void cleanup_old_files()
442 POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
443 int len = strlen(me->working_directory);
444 #if defined(HAVE_WIN32)
445 pm_strcpy(cleanup, "del /q ");
447 pm_strcpy(cleanup, "/bin/rm -f ");
449 pm_strcat(cleanup, me->working_directory);
450 if (len > 0 && !IsPathSeparator(me->working_directory[len-1])) {
451 pm_strcat(cleanup, "/");
453 pm_strcat(cleanup, my_name);
454 pm_strcat(cleanup, "*.spool");
455 run_program(cleanup, 0, NULL);
456 free_pool_memory(cleanup);
461 * Here we attempt to init and open each device. This is done
462 * once at startup in a separate thread.
465 void *device_initialization(void *arg)
474 pthread_detach(pthread_self());
475 jcr = new_jcr(sizeof(JCR), stored_free_jcr);
476 jcr->JobType = JT_SYSTEM;
477 /* Initialize FD start condition variable */
478 int errstat = pthread_cond_init(&jcr->job_start_wait, NULL);
481 Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat));
484 foreach_res(device, R_DEVICE) {
485 Dmsg1(90, "calling init_dev %s\n", device->device_name);
486 dev = init_dev(NULL, device);
487 Dmsg1(10, "SD init done %s\n", device->device_name);
489 Jmsg1(NULL, M_ERROR, 0, _("Could not initialize %s\n"), device->device_name);
493 jcr->dcr = dcr = new_dcr(jcr, NULL, dev);
494 if (dev->is_autochanger()) {
495 /* If autochanger set slot in dev sturcture */
496 get_autochanger_loaded_slot(dcr);
499 if (device->cap_bits & CAP_ALWAYSOPEN) {
500 Dmsg1(20, "calling first_open_device %s\n", dev->print_name());
501 if (!first_open_device(dcr)) {
502 Jmsg1(NULL, M_ERROR, 0, _("Could not open device %s\n"), dev->print_name());
503 Dmsg1(20, "Could not open device %s\n", dev->print_name());
509 if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) {
510 switch (read_dev_volume_label(dcr)) {
512 memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
515 Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name());
524 Dmsg1(000, "free_dcr=%p\n", jcr->dcr);
536 /* Clean up and then exit */
537 void terminate_stored(int sig)
539 static bool in_here = false;
543 if (in_here) { /* prevent loops */
544 bmicrosleep(2, 0); /* yield */
550 if (sig == SIGTERM) { /* normal shutdown request? */
552 * This is a normal shutdown request. We wiffle through
553 * all open jobs canceling them and trying to wake
554 * them up so that they will report back the correct
559 if (jcr->JobId == 0) {
561 continue; /* ignore console */
563 set_jcr_job_status(jcr, JS_Canceled);
564 fd = jcr->file_bsock;
567 Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
568 pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
569 /* ***FIXME*** wiffle through all dcrs */
570 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->blocked()) {
571 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
572 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
573 pthread_cond_broadcast(&wait_device_release);
575 if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->blocked()) {
576 pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol);
577 pthread_cond_broadcast(&wait_device_release);
579 bmicrosleep(0, 50000);
583 bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */
586 write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
587 delete_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
589 Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
591 foreach_res(device, R_DEVICE) {
592 Dmsg1(10, "Term device %s\n", device->device_name);
594 device->dev->clear_volhdr();
598 Dmsg1(10, "No dev structure %s\n", device->device_name);
606 free_config_resources();
608 if (debug_level > 10) {
609 print_memory_pool_stats();
614 term_reservations_lock();
617 sm_dump(false); /* dump orphaned buffers */