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()
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 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());
474 if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) {
475 switch (read_dev_volume_label(dcr)) {
477 memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
480 Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name());
493 /* Clean up and then exit */
494 void terminate_stored(int sig)
496 static bool in_here = false;
500 if (in_here) { /* prevent loops */
505 if (sig == SIGTERM) { /* normal shutdown request? */
507 * This is a normal shutdown request. We wiffle through
508 * all open jobs canceling them and trying to wake
509 * them up so that they will report back the correct
514 if (jcr->JobId == 0) {
516 continue; /* ignore console */
518 set_jcr_job_status(jcr, JS_Canceled);
519 fd = jcr->file_bsock;
521 fd->timed_out = true;
522 Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
523 pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
524 /* ***FIXME*** wiffle through all dcrs */
525 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->dev_blocked) {
526 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
527 pthread_cond_broadcast(&wait_device_release);
529 bmicrosleep(0, 50000);
533 bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */
536 write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
537 delete_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
539 Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
541 foreach_res(device, R_DEVICE) {
542 Dmsg1(10, "Term device %s\n", device->device_name);
544 free_volume(device->dev);
545 term_dev(device->dev);
547 Dmsg1(10, "No dev structure %s\n", device->device_name);
555 free_config_resources();
557 if (debug_level > 10) {
558 print_memory_pool_stats();
566 sm_dump(false); /* dump orphaned buffers */