2 * Second generation Storage daemon.
4 * It accepts a number of simple commands from the File daemon
5 * and acts on them. When a request to append data is made,
6 * it opens a data channel and accepts data from the
13 Copyright (C) 2000-2006 Kern Sibbald
15 This program is free software; you can redistribute it and/or
16 modify it under the terms of the GNU General Public License
17 version 2 as amended with additional clauses defined in the
18 file LICENSE in the main source directory.
20 This program is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 the file LICENSE for additional details.
30 /* Imported functions */
33 /* Forward referenced functions */
34 void terminate_stored(int sig);
35 static int check_resources();
36 static void cleanup_old_files();
38 extern "C" void *device_initialization(void *arg);
40 #define CONFIG_FILE "bacula-sd.conf" /* Default config file */
42 /* Global variables exported */
43 char OK_msg[] = "3000 OK\n";
44 char TERM_msg[] = "3999 Terminate\n";
45 STORES *me = NULL; /* our Global resource */
46 bool forge_on = false; /* proceed inspite of I/O errors */
47 pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER;
48 pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER;
51 static uint32_t VolSessionId = 0;
52 uint32_t VolSessionTime;
53 char *configfile = NULL;
54 bool init_done = false;
56 /* Global static variables */
57 static bool foreground = 0;
58 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
59 static workq_t dird_workq; /* queue for processing connections */
65 "Copyright (C) 2000-%s Kern Sibbald.\n"
66 "\nVersion: %s (%s)\n\n"
67 "Usage: stored [options] [-c config_file] [config_file]\n"
68 " -c <file> use <file> as configuration file\n"
69 " -dnn set debug level to nn\n"
70 " -f run in foreground (for debugging)\n"
71 " -g <group> set groupid to group\n"
72 " -p proceed despite I/O errors\n"
73 " -s no signals (for debugging)\n"
74 " -t test - read config and exit\n"
75 " -u <user> userid to <user>\n"
76 " -v verbose user messages\n"
77 " -? print this message.\n"
78 "\n"), BYEAR, VERSION, BDATE);
82 /*********************************************************************
84 * Main Bacula Unix Storage Daemon
87 #if defined(HAVE_WIN32)
88 #define main BaculaMain
91 int main (int argc, char *argv[])
94 bool no_signals = false;
95 bool test_config = false;
100 setlocale(LC_ALL, "");
101 bindtextdomain("bacula", LOCALEDIR);
102 textdomain("bacula");
105 my_name_is(argc, argv, "bacula-sd");
106 init_msg(NULL, NULL);
107 daemon_start_time = time(NULL);
110 if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
111 Emsg2(M_ABORT, 0, _("Tape block size (%d) not multiple of system size (%d)\n"),
112 TAPE_BSIZE, B_DEV_BSIZE);
114 if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) {
115 Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE);
118 while ((ch = getopt(argc, argv, "c:d:fg:pstu:v?")) != -1) {
120 case 'c': /* configuration file */
121 if (configfile != NULL) {
124 configfile = bstrdup(optarg);
127 case 'd': /* debug level */
128 debug_level = atoi(optarg);
129 if (debug_level <= 0) {
134 case 'f': /* run in foreground */
138 case 'g': /* set group id */
142 case 'p': /* proceed in spite of I/O errors */
146 case 's': /* no signals */
154 case 'u': /* set uid */
158 case 'v': /* verbose */
172 if (configfile != NULL) {
175 configfile = bstrdup(*argv);
183 init_signals(terminate_stored);
186 if (configfile == NULL) {
187 configfile = bstrdup(CONFIG_FILE);
190 parse_config(configfile);
192 if (init_crypto() != 0) {
193 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
196 if (!check_resources()) {
197 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
200 init_reservations_lock();
206 my_name_is(0, (char **)NULL, me->hdr.name); /* Set our real name */
209 daemon_start(); /* become daemon */
210 init_stack_dump(); /* pick up new pid */
213 create_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
214 read_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
221 /* Ensure that Volume Session Time and Id are both
222 * set and are both non-zero.
224 VolSessionTime = (uint32_t)daemon_start_time;
225 if (VolSessionTime == 0) { /* paranoid */
226 Jmsg0(NULL, M_ABORT, 0, _("Volume Session Time is ZERO!\n"));
229 init_python_interpreter(me->hdr.name, me->scripts_directory, "SDStartUp");
231 /* Make sure on Solaris we can run concurrent, watch dog + servers + misc */
232 set_thread_concurrency(me->max_concurrent_jobs * 2 + 4);
235 * Start the device allocation thread
237 create_volume_list(); /* do before device_init */
238 if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) {
239 Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), strerror(errno));
242 start_watchdog(); /* start watchdog thread */
243 init_jcr_subsystem(); /* start JCR watchdogs etc. */
245 /* Single server used for Director and File daemon */
246 bnet_thread_server(me->sdaddrs, me->max_concurrent_jobs * 2 + 1,
247 &dird_workq, handle_connection_request);
248 exit(1); /* to keep compiler quiet */
251 /* Return a new Session Id */
252 uint32_t newVolSessionId()
263 /* Check Configuration file for necessary info */
264 static int check_resources()
269 me = (STORES *)GetNextRes(R_STORAGE, NULL);
271 Jmsg1(NULL, M_ERROR, 0, _("No Storage resource defined in %s. Cannot continue.\n"),
276 if (GetNextRes(R_STORAGE, (RES *)me) != NULL) {
277 Jmsg1(NULL, M_ERROR, 0, _("Only one Storage resource permitted in %s\n"),
281 if (GetNextRes(R_DIRECTOR, NULL) == NULL) {
282 Jmsg1(NULL, M_ERROR, 0, _("No Director resource defined in %s. Cannot continue.\n"),
286 if (GetNextRes(R_DEVICE, NULL) == NULL){
287 Jmsg1(NULL, M_ERROR, 0, _("No Device resource defined in %s. Cannot continue.\n"),
293 me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
295 Jmsg1(NULL, M_ERROR, 0, _("No Messages resource defined in %s. Cannot continue.\n"),
301 if (!me->working_directory) {
302 Jmsg1(NULL, M_ERROR, 0, _("No Working Directory defined in %s. Cannot continue.\n"),
309 foreach_res(store, R_STORAGE) {
310 /* tls_require implies tls_enable */
311 if (store->tls_require) {
313 store->tls_enable = true;
315 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
321 if (!store->tls_certfile && store->tls_enable) {
322 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"),
323 store->hdr.name, configfile);
327 if (!store->tls_keyfile && store->tls_enable) {
328 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"),
329 store->hdr.name, configfile);
333 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && store->tls_enable && store->tls_verify_peer) {
334 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
335 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s."
336 " At least one CA certificate store is required"
337 " when using \"TLS Verify Peer\".\n"),
338 store->hdr.name, configfile);
342 /* If everything is well, attempt to initialize our per-resource TLS context */
343 if (OK && (store->tls_enable || store->tls_require)) {
344 /* Initialize TLS context:
345 * Args: CA certfile, CA certdir, Certfile, Keyfile,
346 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
347 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
348 store->tls_ca_certdir, store->tls_certfile,
349 store->tls_keyfile, NULL, NULL, store->tls_dhfile,
350 store->tls_verify_peer);
352 if (!store->tls_ctx) {
353 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
354 store->hdr.name, configfile);
360 foreach_res(director, R_DIRECTOR) {
361 /* tls_require implies tls_enable */
362 if (director->tls_require) {
363 director->tls_enable = true;
366 if (!director->tls_certfile && director->tls_enable) {
367 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
368 director->hdr.name, configfile);
372 if (!director->tls_keyfile && director->tls_enable) {
373 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
374 director->hdr.name, configfile);
378 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && director->tls_enable && director->tls_verify_peer) {
379 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
380 " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s."
381 " At least one CA certificate store is required"
382 " when using \"TLS Verify Peer\".\n"),
383 director->hdr.name, configfile);
387 /* If everything is well, attempt to initialize our per-resource TLS context */
388 if (OK && (director->tls_enable || director->tls_require)) {
389 /* Initialize TLS context:
390 * Args: CA certfile, CA certdir, Certfile, Keyfile,
391 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
392 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
393 director->tls_ca_certdir, director->tls_certfile,
394 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
395 director->tls_verify_peer);
397 if (!director->tls_ctx) {
398 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
399 director->hdr.name, configfile);
405 OK = init_autochangers();
409 close_msg(NULL); /* close temp message handler */
410 init_msg(NULL, me->messages); /* open daemon message handler */
411 set_working_directory(me->working_directory);
417 static void cleanup_old_files()
419 POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
420 int len = strlen(me->working_directory);
421 pm_strcpy(cleanup, "/bin/rm -f ");
422 pm_strcat(cleanup, me->working_directory);
423 if (len > 0 && me->working_directory[len-1] != '/') {
424 pm_strcat(cleanup, "/");
426 pm_strcat(cleanup, my_name);
427 pm_strcat(cleanup, "*.spool");
428 run_program(cleanup, 0, NULL);
429 free_pool_memory(cleanup);
434 * Here we attempt to init and open each device. This is done
435 * once at startup in a separate thread.
438 void *device_initialization(void *arg)
447 pthread_detach(pthread_self());
448 jcr = new_jcr(sizeof(JCR), stored_free_jcr);
449 jcr->JobType = JT_SYSTEM;
450 /* Initialize FD start condition variable */
451 int errstat = pthread_cond_init(&jcr->job_start_wait, NULL);
453 Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat));
456 foreach_res(device, R_DEVICE) {
457 Dmsg1(90, "calling init_dev %s\n", device->device_name);
458 dev = init_dev(NULL, device);
459 Dmsg1(10, "SD init done %s\n", device->device_name);
461 Jmsg1(NULL, M_ERROR, 0, _("Could not initialize %s\n"), device->device_name);
465 jcr->dcr = dcr = new_dcr(jcr, dev);
466 if (dev->is_autochanger()) {
467 /* If autochanger set slot in dev sturcture */
468 get_autochanger_loaded_slot(dcr);
471 if (device->cap_bits & CAP_ALWAYSOPEN) {
472 Dmsg1(20, "calling first_open_device %s\n", dev->print_name());
473 if (!first_open_device(dcr)) {
474 Jmsg1(NULL, M_ERROR, 0, _("Could not open device %s\n"), dev->print_name());
475 Dmsg1(20, "Could not open device %s\n", dev->print_name());
481 if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) {
482 switch (read_dev_volume_label(dcr)) {
484 memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
487 Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name());
501 /* Clean up and then exit */
502 void terminate_stored(int sig)
504 static bool in_here = false;
508 if (in_here) { /* prevent loops */
513 if (sig == SIGTERM) { /* normal shutdown request? */
515 * This is a normal shutdown request. We wiffle through
516 * all open jobs canceling them and trying to wake
517 * them up so that they will report back the correct
522 if (jcr->JobId == 0) {
524 continue; /* ignore console */
526 set_jcr_job_status(jcr, JS_Canceled);
527 fd = jcr->file_bsock;
529 fd->timed_out = true;
530 Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
531 pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
532 /* ***FIXME*** wiffle through all dcrs */
533 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->dev_blocked) {
534 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
535 pthread_cond_broadcast(&wait_device_release);
537 if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->dev_blocked) {
538 pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol);
539 pthread_cond_broadcast(&wait_device_release);
541 bmicrosleep(0, 50000);
545 bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */
548 write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
549 delete_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
551 Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
553 foreach_res(device, R_DEVICE) {
554 Dmsg1(10, "Term device %s\n", device->device_name);
556 free_volume(device->dev);
560 Dmsg1(10, "No dev structure %s\n", device->device_name);
568 free_config_resources();
570 if (debug_level > 10) {
571 print_memory_pool_stats();
573 term_reservations_lock();
580 sm_dump(false); /* dump orphaned buffers */