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 Kern Sibbald.
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 /* TODO: fix problem with bls, bextract
46 * that use findlib and already declare
49 #include "sd_plugins.h"
53 #undef _POSIX_C_SOURCE
56 #include "lib/pythonlib.h"
58 /* Imported Functions */
59 extern PyObject *job_getattr(PyObject *self, char *attrname);
60 extern int job_setattr(PyObject *self, char *attrname, PyObject *value);
62 #endif /* HAVE_PYTHON */
64 /* Imported functions */
65 extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code);
67 /* Forward referenced functions */
68 void terminate_stored(int sig);
69 static int check_resources();
70 static void cleanup_old_files();
72 extern "C" void *device_initialization(void *arg);
74 #define CONFIG_FILE "bacula-sd.conf" /* Default config file */
76 /* Global variables exported */
77 char OK_msg[] = "3000 OK\n";
78 char TERM_msg[] = "3999 Terminate\n";
79 STORES *me = NULL; /* our Global resource */
80 bool forge_on = false; /* proceed inspite of I/O errors */
81 pthread_mutex_t device_release_mutex = PTHREAD_MUTEX_INITIALIZER;
82 pthread_cond_t wait_device_release = PTHREAD_COND_INITIALIZER;
86 static uint32_t VolSessionId = 0;
87 uint32_t VolSessionTime;
88 char *configfile = NULL;
89 bool init_done = false;
91 /* Global static variables */
92 static bool foreground = 0;
93 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
94 static workq_t dird_workq; /* queue for processing connections */
95 static CONFIG *config;
102 "\nVersion: %s (%s)\n\n"
103 "Usage: stored [options] [-c config_file] [config_file]\n"
104 " -c <file> use <file> as configuration file\n"
105 " -d <nn> set debug level to <nn>\n"
106 " -dt print timestamp in debug output\n"
107 " -f run in foreground (for debugging)\n"
108 " -g <group> set groupid to group\n"
109 " -p proceed despite I/O errors\n"
110 " -s no signals (for debugging)\n"
111 " -t test - read config and exit\n"
112 " -u <user> userid to <user>\n"
113 " -v verbose user messages\n"
114 " -? print this message.\n"
115 "\n"), 2000, VERSION, BDATE);
119 /*********************************************************************
121 * Main Bacula Unix Storage Daemon
124 #if defined(HAVE_WIN32)
125 #define main BaculaMain
128 int main (int argc, char *argv[])
131 bool no_signals = false;
132 bool test_config = false;
137 init_python_interpreter_args python_args;
138 #endif /* HAVE_PYTHON */
140 start_heap = sbrk(0);
141 setlocale(LC_ALL, "");
142 bindtextdomain("bacula", LOCALEDIR);
143 textdomain("bacula");
146 my_name_is(argc, argv, "bacula-sd");
147 init_msg(NULL, NULL);
148 daemon_start_time = time(NULL);
151 if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) {
152 Emsg2(M_ABORT, 0, _("Tape block size (%d) not multiple of system size (%d)\n"),
153 TAPE_BSIZE, B_DEV_BSIZE);
155 if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) {
156 Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE);
159 while ((ch = getopt(argc, argv, "c:d:fg:pstu:v?")) != -1) {
161 case 'c': /* configuration file */
162 if (configfile != NULL) {
165 configfile = bstrdup(optarg);
168 case 'd': /* debug level */
169 if (*optarg == 't') {
170 dbg_timestamp = true;
172 debug_level = atoi(optarg);
173 if (debug_level <= 0) {
179 case 'f': /* run in foreground */
183 case 'g': /* set group id */
187 case 'p': /* proceed in spite of I/O errors */
191 case 's': /* no signals */
199 case 'u': /* set uid */
203 case 'v': /* verbose */
217 if (configfile != NULL) {
220 configfile = bstrdup(*argv);
228 init_signals(terminate_stored);
231 if (configfile == NULL) {
232 configfile = bstrdup(CONFIG_FILE);
235 config = new_config_parser();
236 parse_sd_config(config, configfile, M_ERROR_TERM);
238 if (init_crypto() != 0) {
239 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n"));
242 if (!check_resources()) {
243 Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Please correct configuration file: %s\n"), configfile);
246 init_reservations_lock();
252 my_name_is(0, (char **)NULL, me->hdr.name); /* Set our real name */
255 daemon_start(); /* become daemon */
256 init_stack_dump(); /* pick up new pid */
259 create_pid_file(me->pid_directory, "bacula-sd",
260 get_first_port_host_order(me->sdaddrs));
261 read_state_file(me->working_directory, "bacula-sd",
262 get_first_port_host_order(me->sdaddrs));
264 /* Make sure on Solaris we can run concurrent, watch dog + servers + misc */
265 set_thread_concurrency(me->max_concurrent_jobs * 2 + 4);
266 lmgr_init_thread(); /* initialize the lockmanager stack */
268 load_sd_plugins(me->plugin_directory);
270 drop(uid, gid, false);
275 /* Ensure that Volume Session Time and Id are both
276 * set and are both non-zero.
278 VolSessionTime = (uint32_t)daemon_start_time;
279 if (VolSessionTime == 0) { /* paranoid */
280 Jmsg0(NULL, M_ABORT, 0, _("Volume Session Time is ZERO!\n"));
284 python_args.progname = me->hdr.name;
285 python_args.scriptdir = me->scripts_directory;
286 python_args.modulename = "SDStartUp";
287 python_args.configfile = configfile;
288 python_args.workingdir = me->working_directory;
289 python_args.job_getattr = job_getattr;
290 python_args.job_setattr = job_setattr;
292 init_python_interpreter(&python_args);
293 #endif /* HAVE_PYTHON */
296 * Start the device allocation thread
298 create_volume_lists(); /* do before device_init */
299 if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) {
301 Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), be.bstrerror());
304 start_watchdog(); /* start watchdog thread */
305 init_jcr_subsystem(); /* start JCR watchdogs etc. */
307 /* Single server used for Director and File daemon */
308 bnet_thread_server(me->sdaddrs, me->max_concurrent_jobs * 2 + 1,
309 &dird_workq, handle_connection_request);
310 exit(1); /* to keep compiler quiet */
313 /* Return a new Session Id */
314 uint32_t newVolSessionId()
325 /* Check Configuration file for necessary info */
326 static int check_resources()
332 me = (STORES *)GetNextRes(R_STORAGE, NULL);
334 Jmsg1(NULL, M_ERROR, 0, _("No Storage resource defined in %s. Cannot continue.\n"),
339 if (GetNextRes(R_STORAGE, (RES *)me) != NULL) {
340 Jmsg1(NULL, M_ERROR, 0, _("Only one Storage resource permitted in %s\n"),
344 if (GetNextRes(R_DIRECTOR, NULL) == NULL) {
345 Jmsg1(NULL, M_ERROR, 0, _("No Director resource defined in %s. Cannot continue.\n"),
349 if (GetNextRes(R_DEVICE, NULL) == NULL){
350 Jmsg1(NULL, M_ERROR, 0, _("No Device resource defined in %s. Cannot continue.\n"),
356 me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
358 Jmsg1(NULL, M_ERROR, 0, _("No Messages resource defined in %s. Cannot continue.\n"),
364 if (!me->working_directory) {
365 Jmsg1(NULL, M_ERROR, 0, _("No Working Directory defined in %s. Cannot continue.\n"),
372 foreach_res(store, R_STORAGE) {
373 /* tls_require implies tls_enable */
374 if (store->tls_require) {
376 store->tls_enable = true;
378 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
384 tls_needed = store->tls_enable || store->tls_authenticate;
386 if (!store->tls_certfile && tls_needed) {
387 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"),
388 store->hdr.name, configfile);
392 if (!store->tls_keyfile && tls_needed) {
393 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"),
394 store->hdr.name, configfile);
398 if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && tls_needed && store->tls_verify_peer) {
399 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
400 " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s."
401 " At least one CA certificate store is required"
402 " when using \"TLS Verify Peer\".\n"),
403 store->hdr.name, configfile);
407 /* If everything is well, attempt to initialize our per-resource TLS context */
408 if (OK && (tls_needed || store->tls_require)) {
409 /* Initialize TLS context:
410 * Args: CA certfile, CA certdir, Certfile, Keyfile,
411 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
412 store->tls_ctx = new_tls_context(store->tls_ca_certfile,
413 store->tls_ca_certdir, store->tls_certfile,
414 store->tls_keyfile, NULL, NULL, store->tls_dhfile,
415 store->tls_verify_peer);
417 if (!store->tls_ctx) {
418 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Storage \"%s\" in %s.\n"),
419 store->hdr.name, configfile);
425 foreach_res(director, R_DIRECTOR) {
426 /* tls_require implies tls_enable */
427 if (director->tls_require) {
428 director->tls_enable = true;
431 tls_needed = director->tls_enable || director->tls_authenticate;
433 if (!director->tls_certfile && tls_needed) {
434 Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
435 director->hdr.name, configfile);
439 if (!director->tls_keyfile && tls_needed) {
440 Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
441 director->hdr.name, configfile);
445 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && tls_needed && director->tls_verify_peer) {
446 Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\""
447 " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s."
448 " At least one CA certificate store is required"
449 " when using \"TLS Verify Peer\".\n"),
450 director->hdr.name, configfile);
454 /* If everything is well, attempt to initialize our per-resource TLS context */
455 if (OK && (tls_needed || director->tls_require)) {
456 /* Initialize TLS context:
457 * Args: CA certfile, CA certdir, Certfile, Keyfile,
458 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
459 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
460 director->tls_ca_certdir, director->tls_certfile,
461 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
462 director->tls_verify_peer);
464 if (!director->tls_ctx) {
465 Jmsg(NULL, M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
466 director->hdr.name, configfile);
472 OK = init_autochangers();
476 close_msg(NULL); /* close temp message handler */
477 init_msg(NULL, me->messages); /* open daemon message handler */
478 set_working_directory(me->working_directory);
484 static void cleanup_old_files()
486 POOLMEM *cleanup = get_pool_memory(PM_MESSAGE);
487 POOLMEM *results = get_pool_memory(PM_MESSAGE);
488 int len = strlen(me->working_directory);
489 #if defined(HAVE_WIN32)
490 pm_strcpy(cleanup, "del /q ");
492 pm_strcpy(cleanup, "/bin/rm -f ");
494 pm_strcat(cleanup, me->working_directory);
495 if (len > 0 && !IsPathSeparator(me->working_directory[len-1])) {
496 pm_strcat(cleanup, "/");
498 pm_strcat(cleanup, my_name);
499 pm_strcat(cleanup, "*.spool");
500 run_program(cleanup, 0, results);
501 free_pool_memory(cleanup);
502 free_pool_memory(results);
507 * Here we attempt to init and open each device. This is done
508 * once at startup in a separate thread.
511 void *device_initialization(void *arg)
520 pthread_detach(pthread_self());
521 jcr = new_jcr(sizeof(JCR), stored_free_jcr);
522 jcr->set_JobType(JT_SYSTEM);
523 /* Initialize FD start condition variable */
524 int errstat = pthread_cond_init(&jcr->job_start_wait, NULL);
527 Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat));
530 foreach_res(device, R_DEVICE) {
531 Dmsg1(90, "calling init_dev %s\n", device->device_name);
532 dev = init_dev(NULL, device);
533 Dmsg1(10, "SD init done %s\n", device->device_name);
535 Jmsg1(NULL, M_ERROR, 0, _("Could not initialize %s\n"), device->device_name);
539 jcr->dcr = dcr = new_dcr(jcr, NULL, dev);
540 if (dev->is_autochanger()) {
541 /* If autochanger set slot in dev sturcture */
542 get_autochanger_loaded_slot(dcr);
545 if (device->cap_bits & CAP_ALWAYSOPEN) {
546 Dmsg1(20, "calling first_open_device %s\n", dev->print_name());
547 if (!first_open_device(dcr)) {
548 Jmsg1(NULL, M_ERROR, 0, _("Could not open device %s\n"), dev->print_name());
549 Dmsg1(20, "Could not open device %s\n", dev->print_name());
555 if (device->cap_bits & CAP_AUTOMOUNT && dev->is_open()) {
556 switch (read_dev_volume_label(dcr)) {
558 memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo));
559 volume_unused(dcr); /* mark volume "released" */
562 Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name());
571 Dmsg1(000, "free_dcr=%p\n", jcr->dcr);
583 /* Clean up and then exit */
584 void terminate_stored(int sig)
586 static bool in_here = false;
590 if (in_here) { /* prevent loops */
591 bmicrosleep(2, 0); /* yield */
595 debug_level = 0; /* turn off any debug */
598 if (sig == SIGTERM) { /* normal shutdown request? */
600 * This is a normal shutdown request. We wiffle through
601 * all open jobs canceling them and trying to wake
602 * them up so that they will report back the correct
607 if (jcr->JobId == 0) {
609 continue; /* ignore console */
611 set_jcr_job_status(jcr, JS_Canceled);
612 fd = jcr->file_bsock;
615 Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
616 pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
617 /* ***FIXME*** wiffle through all dcrs */
618 if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->blocked()) {
619 pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
620 Dmsg1(100, "JobId=%u broadcast wait_device_release\n", (uint32_t)jcr->JobId);
621 pthread_cond_broadcast(&wait_device_release);
623 if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->blocked()) {
624 pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol);
625 pthread_cond_broadcast(&wait_device_release);
627 bmicrosleep(0, 50000);
631 bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */
634 write_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
635 delete_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
637 Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
642 foreach_res(device, R_DEVICE) {
643 Dmsg1(10, "Term device %s\n", device->device_name);
645 device->dev->clear_volhdr();
649 Dmsg1(10, "No dev structure %s\n", device->device_name);
658 config->free_resources();
663 if (debug_level > 10) {
664 print_memory_pool_stats();
668 term_reservations_lock();
672 sm_dump(false); /* dump orphaned buffers */