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_tls() != 0) {
189 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("TLS 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 = (long)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()
261 AUTOCHANGER *changer;
264 me = (STORES *)GetNextRes(R_STORAGE, NULL);
266 Jmsg1(NULL, M_ERROR, 0, _("No Storage resource defined in %s. Cannot continue.\n"),
271 if (GetNextRes(R_STORAGE, (RES *)me) != NULL) {
272 Jmsg1(NULL, M_ERROR, 0, _("Only one Storage resource permitted in %s\n"),
276 if (GetNextRes(R_DIRECTOR, NULL) == NULL) {
277 Jmsg1(NULL, M_ERROR, 0, _("No Director resource defined in %s. Cannot continue.\n"),
281 if (GetNextRes(R_DEVICE, NULL) == NULL){
282 Jmsg1(NULL, M_ERROR, 0, _("No Device resource defined in %s. Cannot continue.\n"),
288 me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
290 Jmsg1(NULL, M_ERROR, 0, _("No Messages resource defined in %s. Cannot continue.\n"),
296 if (!me->working_directory) {
297 Jmsg1(NULL, M_ERROR, 0, _("No Working Directory defined in %s. Cannot continue.\n"),
304 foreach_res(store, R_STORAGE) {
305 /* tls_require implies tls_enable */
306 if (store->tls_require) {
308 store->tls_enable = true;
310 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
316 if (!store->tls_certfile && store->tls_enable) {
317 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"),
318 store->hdr.name, configfile);
322 if (!store->tls_keyfile && store->tls_enable) {
323 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"),
324 store->hdr.name, configfile);
328 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && store->tls_enable && store->tls_verify_peer) {
329 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
330 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s."
331 " At least one CA certificate store is required"
332 " when using \"TLS Verify Peer\".\n"),
333 store->hdr.name, configfile);
337 /* If everything is well, attempt to initialize our per-resource TLS context */
338 if (OK && (store->tls_enable || store->tls_require)) {
339 /* Initialize TLS context:
340 * Args: CA certfile, CA certdir, Certfile, Keyfile,
341 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
342 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
343 store->tls_ca_certdir, store->tls_certfile,
344 store->tls_keyfile, NULL, NULL, store->tls_dhfile,
345 store->tls_verify_peer);
347 if (!store->tls_ctx) {
348 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
349 store->hdr.name, configfile);
355 foreach_res(director, R_DIRECTOR) {
356 /* tls_require implies tls_enable */
357 if (director->tls_require) {
358 director->tls_enable = true;
361 if (!director->tls_certfile && director->tls_enable) {
362 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
363 director->hdr.name, configfile);
367 if (!director->tls_keyfile && director->tls_enable) {
368 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
369 director->hdr.name, configfile);
373 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && director->tls_enable && director->tls_verify_peer) {
374 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
375 " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s."
376 " At least one CA certificate store is required"
377 " when using \"TLS Verify Peer\".\n"),
378 director->hdr.name, configfile);
382 /* If everything is well, attempt to initialize our per-resource TLS context */
383 if (OK && (director->tls_enable || director->tls_require)) {
384 /* Initialize TLS context:
385 * Args: CA certfile, CA certdir, Certfile, Keyfile,
386 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
387 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
388 director->tls_ca_certdir, director->tls_certfile,
389 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
390 director->tls_verify_peer);
392 if (!director->tls_ctx) {
393 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
394 director->hdr.name, configfile);
400 /* Ensure that the media_type for each device is the same */
401 foreach_res(changer, R_AUTOCHANGER) {
403 char *media_type = NULL;
404 foreach_alist(device, changer->device) {
406 * If the device does not have a changer name or changer command
407 * defined, used the one from the Autochanger resource
409 if (!device->changer_name && changer->changer_name) {
410 device->changer_name = bstrdup(changer->changer_name);
412 if (!device->changer_command && changer->changer_command) {
413 device->changer_command = bstrdup(changer->changer_command);
415 if (!device->changer_name) {
416 Jmsg(NULL, M_ERROR, 0,
417 _("No Changer Name given for device %s. Cannot continue.\n"),
421 if (!device->changer_command) {
422 Jmsg(NULL, M_ERROR, 0,
423 _("No Changer Command given for device %s. Cannot continue.\n"),
428 if (media_type == NULL) {
429 media_type = device->media_type; /* get Media Type of first device */
432 /* Ensure that other devices Media Types are the same */
433 if (strcmp(media_type, device->media_type) != 0) {
434 Jmsg(NULL, M_ERROR, 0,
435 _("Media Type not the same for all devices in changer %s. Cannot continue.\n"),
444 close_msg(NULL); /* close temp message handler */
445 init_msg(NULL, me->messages); /* open daemon message handler */
446 set_working_directory(me->working_directory);
452 static void cleanup_old_files()
454 POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
455 int len = strlen(me->working_directory);
456 pm_strcpy(cleanup, "/bin/rm -f ");
457 pm_strcat(cleanup, me->working_directory);
458 if (len > 0 && me->working_directory[len-1] != '/') {
459 pm_strcat(cleanup, "/");
461 pm_strcat(cleanup, my_name);
462 pm_strcat(cleanup, "*.spool");
463 run_program(cleanup, 0, NULL);
464 free_pool_memory(cleanup);
469 * Here we attempt to init and open each device. This is done
470 * once at startup in a separate thread.
473 void *device_initialization(void *arg)
482 pthread_detach(pthread_self());
483 jcr = new_jcr(sizeof(JCR), stored_free_jcr);
484 jcr->JobType = JT_SYSTEM;
485 /* Initialize FD start condition variable */
486 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"), strerror(errstat));
491 foreach_res(device, R_DEVICE) {
492 Dmsg1(90, "calling init_dev %s\n", device->device_name);
493 device->dev = 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 dcr = new_dcr(jcr, 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());
520 if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) {
521 switch (read_dev_volume_label(dcr)) {
523 memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
526 Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name());
539 /* Clean up and then exit */
540 void terminate_stored(int sig)
542 static bool in_here = false;
546 if (in_here) { /* prevent loops */
551 if (sig == SIGTERM) { /* normal shutdown request? */
553 * This is a normal shutdown request. We wiffle through
554 * all open jobs canceling them and trying to wake
555 * them up so that they will report back the correct
560 if (jcr->JobId == 0) {
562 continue; /* ignore console */
564 set_jcr_job_status(jcr, JS_Canceled);
565 fd = jcr->file_bsock;
567 fd->timed_out = true;
568 Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
569 pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
570 /* ***FIXME*** wiffle through all dcrs */
571 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->dev_blocked) {
572 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
573 pthread_cond_broadcast(&wait_device_release);
575 bmicrosleep(0, 50000);
579 bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */
582 write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
583 delete_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
585 Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
587 foreach_res(device, R_DEVICE) {
588 Dmsg1(10, "Term device %s\n", device->device_name);
590 free_volume(device->dev);
591 term_dev(device->dev);
593 Dmsg1(10, "No dev structure %s\n", device->device_name);
601 free_config_resources();
603 if (debug_level > 10) {
604 print_memory_pool_stats();
612 sm_dump(false); /* dump orphaned buffers */