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.
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()
293 me = (STORES *)GetNextRes(R_STORAGE, NULL);
295 Jmsg1(NULL, M_ERROR, 0, _("No Storage resource defined in %s. Cannot continue.\n"),
300 if (GetNextRes(R_STORAGE, (RES *)me) != NULL) {
301 Jmsg1(NULL, M_ERROR, 0, _("Only one Storage resource permitted in %s\n"),
305 if (GetNextRes(R_DIRECTOR, NULL) == NULL) {
306 Jmsg1(NULL, M_ERROR, 0, _("No Director resource defined in %s. Cannot continue.\n"),
310 if (GetNextRes(R_DEVICE, NULL) == NULL){
311 Jmsg1(NULL, M_ERROR, 0, _("No Device resource defined in %s. Cannot continue.\n"),
317 me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
319 Jmsg1(NULL, M_ERROR, 0, _("No Messages resource defined in %s. Cannot continue.\n"),
325 if (!me->working_directory) {
326 Jmsg1(NULL, M_ERROR, 0, _("No Working Directory defined in %s. Cannot continue.\n"),
333 foreach_res(store, R_STORAGE) {
334 /* tls_require implies tls_enable */
335 if (store->tls_require) {
337 store->tls_enable = true;
339 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
345 tls_needed = store->tls_enable || store->tls_authenticate;
347 if (!store->tls_certfile && tls_needed) {
348 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"),
349 store->hdr.name, configfile);
353 if (!store->tls_keyfile && tls_needed) {
354 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"),
355 store->hdr.name, configfile);
359 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && tls_needed && store->tls_verify_peer) {
360 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
361 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s."
362 " At least one CA certificate store is required"
363 " when using \"TLS Verify Peer\".\n"),
364 store->hdr.name, configfile);
368 /* If everything is well, attempt to initialize our per-resource TLS context */
369 if (OK && (tls_needed || store->tls_require)) {
370 /* Initialize TLS context:
371 * Args: CA certfile, CA certdir, Certfile, Keyfile,
372 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
373 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
374 store->tls_ca_certdir, store->tls_certfile,
375 store->tls_keyfile, NULL, NULL, store->tls_dhfile,
376 store->tls_verify_peer);
378 if (!store->tls_ctx) {
379 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
380 store->hdr.name, configfile);
386 foreach_res(director, R_DIRECTOR) {
387 /* tls_require implies tls_enable */
388 if (director->tls_require) {
389 director->tls_enable = true;
392 tls_needed = director->tls_enable || director->tls_authenticate;
394 if (!director->tls_certfile && tls_needed) {
395 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
396 director->hdr.name, configfile);
400 if (!director->tls_keyfile && tls_needed) {
401 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
402 director->hdr.name, configfile);
406 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && tls_needed && director->tls_verify_peer) {
407 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
408 " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s."
409 " At least one CA certificate store is required"
410 " when using \"TLS Verify Peer\".\n"),
411 director->hdr.name, configfile);
415 /* If everything is well, attempt to initialize our per-resource TLS context */
416 if (OK && (tls_needed || director->tls_require)) {
417 /* Initialize TLS context:
418 * Args: CA certfile, CA certdir, Certfile, Keyfile,
419 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
420 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
421 director->tls_ca_certdir, director->tls_certfile,
422 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
423 director->tls_verify_peer);
425 if (!director->tls_ctx) {
426 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
427 director->hdr.name, configfile);
433 OK = init_autochangers();
437 close_msg(NULL); /* close temp message handler */
438 init_msg(NULL, me->messages); /* open daemon message handler */
439 set_working_directory(me->working_directory);
445 static void cleanup_old_files()
447 POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
448 POOLMEM *results = get_pool_memory(PM_MESSAGE);
449 int len = strlen(me->working_directory);
450 #if defined(HAVE_WIN32)
451 pm_strcpy(cleanup, "del /q ");
453 pm_strcpy(cleanup, "/bin/rm -f ");
455 pm_strcat(cleanup, me->working_directory);
456 if (len > 0 && !IsPathSeparator(me->working_directory[len-1])) {
457 pm_strcat(cleanup, "/");
459 pm_strcat(cleanup, my_name);
460 pm_strcat(cleanup, "*.spool");
461 run_program(cleanup, 0, results);
462 free_pool_memory(cleanup);
463 free_pool_memory(results);
468 * Here we attempt to init and open each device. This is done
469 * once at startup in a separate thread.
472 void *device_initialization(void *arg)
481 pthread_detach(pthread_self());
482 jcr = new_jcr(sizeof(JCR), stored_free_jcr);
483 jcr->JobType = JT_SYSTEM;
484 /* Initialize FD start condition variable */
485 int errstat = pthread_cond_init(&jcr->job_start_wait, NULL);
488 Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat));
491 foreach_res(device, R_DEVICE) {
492 Dmsg1(90, "calling init_dev %s\n", device->device_name);
493 dev = init_dev(NULL, device);
494 Dmsg1(10, "SD init done %s\n", device->device_name);
496 Jmsg1(NULL, M_ERROR, 0, _("Could not initialize %s\n"), device->device_name);
500 jcr->dcr = dcr = new_dcr(jcr, NULL, dev);
501 if (dev->is_autochanger()) {
502 /* If autochanger set slot in dev sturcture */
503 get_autochanger_loaded_slot(dcr);
506 if (device->cap_bits & CAP_ALWAYSOPEN) {
507 Dmsg1(20, "calling first_open_device %s\n", dev->print_name());
508 if (!first_open_device(dcr)) {
509 Jmsg1(NULL, M_ERROR, 0, _("Could not open device %s\n"), dev->print_name());
510 Dmsg1(20, "Could not open device %s\n", dev->print_name());
516 if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) {
517 switch (read_dev_volume_label(dcr)) {
519 memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
520 volume_unused(dcr); /* mark volume "released" */
523 Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name());
532 Dmsg1(000, "free_dcr=%p\n", jcr->dcr);
544 /* Clean up and then exit */
545 void terminate_stored(int sig)
547 static bool in_here = false;
551 if (in_here) { /* prevent loops */
552 bmicrosleep(2, 0); /* yield */
556 debug_level = 0; /* turn off any debug */
559 if (sig == SIGTERM) { /* normal shutdown request? */
561 * This is a normal shutdown request. We wiffle through
562 * all open jobs canceling them and trying to wake
563 * them up so that they will report back the correct
568 if (jcr->JobId == 0) {
570 continue; /* ignore console */
572 set_jcr_job_status(jcr, JS_Canceled);
573 fd = jcr->file_bsock;
576 Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
577 pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
578 /* ***FIXME*** wiffle through all dcrs */
579 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->blocked()) {
580 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
581 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
582 pthread_cond_broadcast(&wait_device_release);
584 if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->blocked()) {
585 pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol);
586 pthread_cond_broadcast(&wait_device_release);
588 bmicrosleep(0, 50000);
592 bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */
595 write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
596 delete_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
598 Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
602 foreach_res(device, R_DEVICE) {
603 Dmsg1(10, "Term device %s\n", device->device_name);
605 device->dev->clear_volhdr();
609 Dmsg1(10, "No dev structure %s\n", device->device_name);
617 free_config_resources();
619 if (debug_level > 10) {
620 print_memory_pool_stats();
624 term_reservations_lock();
627 sm_dump(false); /* dump orphaned buffers */