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-2005 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 int 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-2005 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"), VERSION, BDATE);
82 /*********************************************************************
84 * Main Bacula Unix Storage Daemon
87 int main (int argc, char *argv[])
90 int no_signals = FALSE;
91 int test_config = FALSE;
96 setlocale(LC_ALL, "");
97 bindtextdomain("bacula", LOCALEDIR);
101 my_name_is(argc, argv, "bacula-sd");
102 init_msg(NULL, NULL);
103 daemon_start_time = time(NULL);
106 if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
107 Emsg2(M_ABORT, 0, _("Tape block size (%d) not multiple of system size (%d)\n"),
108 TAPE_BSIZE, B_DEV_BSIZE);
110 if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) {
111 Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE);
114 while ((ch = getopt(argc, argv, "c:d:fg:pstu:v?")) != -1) {
116 case 'c': /* configuration file */
117 if (configfile != NULL) {
120 configfile = bstrdup(optarg);
123 case 'd': /* debug level */
124 debug_level = atoi(optarg);
125 if (debug_level <= 0) {
130 case 'f': /* run in foreground */
134 case 'g': /* set group id */
138 case 'p': /* proceed in spite of I/O errors */
142 case 's': /* no signals */
150 case 'u': /* set uid */
154 case 'v': /* verbose */
168 if (configfile != NULL) {
171 configfile = bstrdup(*argv);
179 init_signals(terminate_stored);
182 if (configfile == NULL) {
183 configfile = bstrdup(CONFIG_FILE);
186 parse_config(configfile);
188 if (init_crypto() != 0) {
189 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
192 if (!check_resources()) {
193 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
200 my_name_is(0, (char **)NULL, me->hdr.name); /* Set our real name */
203 daemon_start(); /* become daemon */
204 init_stack_dump(); /* pick up new pid */
207 create_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
208 read_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
215 /* Ensure that Volume Session Time and Id are both
216 * set and are both non-zero.
218 VolSessionTime = (uint32_t)daemon_start_time;
219 if (VolSessionTime == 0) { /* paranoid */
220 Jmsg0(NULL, M_ABORT, 0, _("Volume Session Time is ZERO!\n"));
223 init_python_interpreter(me->hdr.name, me->scripts_directory, "SDStartUp");
225 /* Make sure on Solaris we can run concurrent, watch dog + servers + misc */
226 set_thread_concurrency(me->max_concurrent_jobs * 2 + 4);
229 * Start the device allocation thread
231 create_volume_list(); /* do before device_init */
232 if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) {
233 Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), strerror(errno));
236 start_watchdog(); /* start watchdog thread */
237 init_jcr_subsystem(); /* start JCR watchdogs etc. */
239 /* Single server used for Director and File daemon */
240 bnet_thread_server(me->sdaddrs, me->max_concurrent_jobs * 2 + 1,
241 &dird_workq, handle_connection_request);
242 exit(1); /* to keep compiler quiet */
245 /* Return a new Session Id */
246 uint32_t newVolSessionId()
257 /* Check Configuration file for necessary info */
258 static int check_resources()
263 me = (STORES *)GetNextRes(R_STORAGE, NULL);
265 Jmsg1(NULL, M_ERROR, 0, _("No Storage resource defined in %s. Cannot continue.\n"),
270 if (GetNextRes(R_STORAGE, (RES *)me) != NULL) {
271 Jmsg1(NULL, M_ERROR, 0, _("Only one Storage resource permitted in %s\n"),
275 if (GetNextRes(R_DIRECTOR, NULL) == NULL) {
276 Jmsg1(NULL, M_ERROR, 0, _("No Director resource defined in %s. Cannot continue.\n"),
280 if (GetNextRes(R_DEVICE, NULL) == NULL){
281 Jmsg1(NULL, M_ERROR, 0, _("No Device resource defined in %s. Cannot continue.\n"),
287 me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
289 Jmsg1(NULL, M_ERROR, 0, _("No Messages resource defined in %s. Cannot continue.\n"),
295 if (!me->working_directory) {
296 Jmsg1(NULL, M_ERROR, 0, _("No Working Directory defined in %s. Cannot continue.\n"),
303 foreach_res(store, R_STORAGE) {
304 /* tls_require implies tls_enable */
305 if (store->tls_require) {
307 store->tls_enable = true;
309 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
315 if (!store->tls_certfile && store->tls_enable) {
316 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"),
317 store->hdr.name, configfile);
321 if (!store->tls_keyfile && store->tls_enable) {
322 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"),
323 store->hdr.name, configfile);
327 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && store->tls_enable && store->tls_verify_peer) {
328 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
329 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s."
330 " At least one CA certificate store is required"
331 " when using \"TLS Verify Peer\".\n"),
332 store->hdr.name, configfile);
336 /* If everything is well, attempt to initialize our per-resource TLS context */
337 if (OK && (store->tls_enable || store->tls_require)) {
338 /* Initialize TLS context:
339 * Args: CA certfile, CA certdir, Certfile, Keyfile,
340 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
341 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
342 store->tls_ca_certdir, store->tls_certfile,
343 store->tls_keyfile, NULL, NULL, store->tls_dhfile,
344 store->tls_verify_peer);
346 if (!store->tls_ctx) {
347 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
348 store->hdr.name, configfile);
354 foreach_res(director, R_DIRECTOR) {
355 /* tls_require implies tls_enable */
356 if (director->tls_require) {
357 director->tls_enable = true;
360 if (!director->tls_certfile && director->tls_enable) {
361 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
362 director->hdr.name, configfile);
366 if (!director->tls_keyfile && director->tls_enable) {
367 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
368 director->hdr.name, configfile);
372 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && director->tls_enable && director->tls_verify_peer) {
373 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
374 " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s."
375 " At least one CA certificate store is required"
376 " when using \"TLS Verify Peer\".\n"),
377 director->hdr.name, configfile);
381 /* If everything is well, attempt to initialize our per-resource TLS context */
382 if (OK && (director->tls_enable || director->tls_require)) {
383 /* Initialize TLS context:
384 * Args: CA certfile, CA certdir, Certfile, Keyfile,
385 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
386 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
387 director->tls_ca_certdir, director->tls_certfile,
388 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
389 director->tls_verify_peer);
391 if (!director->tls_ctx) {
392 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
393 director->hdr.name, configfile);
399 OK = init_autochangers();
403 close_msg(NULL); /* close temp message handler */
404 init_msg(NULL, me->messages); /* open daemon message handler */
405 set_working_directory(me->working_directory);
411 static void cleanup_old_files()
413 POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
414 int len = strlen(me->working_directory);
415 pm_strcpy(cleanup, "/bin/rm -f ");
416 pm_strcat(cleanup, me->working_directory);
417 if (len > 0 && me->working_directory[len-1] != '/') {
418 pm_strcat(cleanup, "/");
420 pm_strcat(cleanup, my_name);
421 pm_strcat(cleanup, "*.spool");
422 run_program(cleanup, 0, NULL);
423 free_pool_memory(cleanup);
428 * Here we attempt to init and open each device. This is done
429 * once at startup in a separate thread.
432 void *device_initialization(void *arg)
441 pthread_detach(pthread_self());
442 jcr = new_jcr(sizeof(JCR), stored_free_jcr);
443 jcr->JobType = JT_SYSTEM;
444 /* Initialize FD start condition variable */
445 int errstat = pthread_cond_init(&jcr->job_start_wait, NULL);
447 Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat));
450 foreach_res(device, R_DEVICE) {
451 Dmsg1(90, "calling init_dev %s\n", device->device_name);
452 device->dev = dev = init_dev(NULL, device);
453 Dmsg1(10, "SD init done %s\n", device->device_name);
455 Jmsg1(NULL, M_ERROR, 0, _("Could not initialize %s\n"), device->device_name);
459 jcr->dcr = dcr = new_dcr(jcr, dev);
460 if (dev->is_autochanger()) {
461 /* If autochanger set slot in dev sturcture */
462 get_autochanger_loaded_slot(dcr);
465 if (device->cap_bits & CAP_ALWAYSOPEN) {
466 Dmsg1(20, "calling first_open_device %s\n", dev->print_name());
467 if (!first_open_device(dcr)) {
468 Jmsg1(NULL, M_ERROR, 0, _("Could not open device %s\n"), dev->print_name());
469 Dmsg1(20, "Could not open device %s\n", dev->print_name());
475 if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) {
476 switch (read_dev_volume_label(dcr)) {
478 memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
481 Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name());
495 /* Clean up and then exit */
496 void terminate_stored(int sig)
498 static bool in_here = false;
502 if (in_here) { /* prevent loops */
507 if (sig == SIGTERM) { /* normal shutdown request? */
509 * This is a normal shutdown request. We wiffle through
510 * all open jobs canceling them and trying to wake
511 * them up so that they will report back the correct
516 if (jcr->JobId == 0) {
518 continue; /* ignore console */
520 set_jcr_job_status(jcr, JS_Canceled);
521 fd = jcr->file_bsock;
523 fd->timed_out = true;
524 Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
525 pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
526 /* ***FIXME*** wiffle through all dcrs */
527 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->dev_blocked) {
528 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
529 pthread_cond_broadcast(&wait_device_release);
531 if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->dev_blocked) {
532 pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol);
533 pthread_cond_broadcast(&wait_device_release);
535 bmicrosleep(0, 50000);
539 bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */
542 write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
543 delete_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
545 Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
547 foreach_res(device, R_DEVICE) {
548 Dmsg1(10, "Term device %s\n", device->device_name);
550 free_volume(device->dev);
551 term_dev(device->dev);
553 Dmsg1(10, "No dev structure %s\n", device->device_name);
561 free_config_resources();
563 if (debug_level > 10) {
564 print_memory_pool_stats();
572 sm_dump(false); /* dump orphaned buffers */