X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fstored.c;h=71d635ed755490950af44a604aebf644e448d287;hb=36b40d5c7f3ff90565ab73ac75f0dc4f6660ff37;hp=ab44f067fe094e84b7adaa5df27c3ffae2ea5c3f;hpb=095ae896b3fa96e6c8db2105519552b785e6b005;p=bacula%2Fbacula diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index ab44f067fe..71d635ed75 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2007 Free Software Foundation Europe e.V. + Copyright (C) 2000-2008 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Bacula® is a registered trademark of John Walker. + Bacula® is a registered trademark of Kern Sibbald. The licensor of Bacula is the Free Software Foundation Europe (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. @@ -43,7 +43,7 @@ #include "stored.h" /* Imported functions */ - +extern bool parse_sd_config(CONFIG *config, const char *configfile, int exit_code); /* Forward referenced functions */ void terminate_stored(int sig); @@ -73,6 +73,7 @@ bool init_done = false; static bool foreground = 0; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static workq_t dird_workq; /* queue for processing connections */ +static CONFIG *config; static void usage() @@ -82,7 +83,8 @@ PROG_COPYRIGHT "\nVersion: %s (%s)\n\n" "Usage: stored [options] [-c config_file] [config_file]\n" " -c use as configuration file\n" -" -dnn set debug level to nn\n" +" -d set debug level to \n" +" -dt print timestamp in debug output\n" " -f run in foreground (for debugging)\n" " -g set groupid to group\n" " -p proceed despite I/O errors\n" @@ -142,9 +144,13 @@ int main (int argc, char *argv[]) break; case 'd': /* debug level */ - debug_level = atoi(optarg); - if (debug_level <= 0) { - debug_level = 1; + if (*optarg == 't') { + dbg_timestamp = true; + } else { + debug_level = atoi(optarg); + if (debug_level <= 0) { + debug_level = 1; + } } break; @@ -204,7 +210,8 @@ int main (int argc, char *argv[]) configfile = bstrdup(CONFIG_FILE); } - parse_config(configfile); + config = new_config_parser(); + parse_sd_config(config, configfile, M_ERROR_TERM); if (init_crypto() != 0) { Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n")); @@ -253,7 +260,8 @@ int main (int argc, char *argv[]) */ create_volume_list(); /* do before device_init */ if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) { - Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), strerror(errno)); + berrno be; + Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), be.bstrerror()); } start_watchdog(); /* start watchdog thread */ @@ -281,6 +289,7 @@ uint32_t newVolSessionId() static int check_resources() { bool OK = true; + bool tls_needed; me = (STORES *)GetNextRes(R_STORAGE, NULL); @@ -335,19 +344,21 @@ static int check_resources() } } - if (!store->tls_certfile && store->tls_enable) { + tls_needed = store->tls_enable || store->tls_authenticate; + + if (!store->tls_certfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Storage \"%s\" in %s.\n"), store->hdr.name, configfile); OK = false; } - if (!store->tls_keyfile && store->tls_enable) { + if (!store->tls_keyfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Storage \"%s\" in %s.\n"), store->hdr.name, configfile); OK = false; } - if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && store->tls_enable && store->tls_verify_peer) { + if ((!store->tls_ca_certfile && !store->tls_ca_certdir) && tls_needed && store->tls_verify_peer) { Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\"" " or \"TLS CA Certificate Dir\" are defined for Storage \"%s\" in %s." " At least one CA certificate store is required" @@ -357,7 +368,7 @@ static int check_resources() } /* If everything is well, attempt to initialize our per-resource TLS context */ - if (OK && (store->tls_enable || store->tls_require)) { + if (OK && (tls_needed || store->tls_require)) { /* Initialize TLS context: * Args: CA certfile, CA certdir, Certfile, Keyfile, * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */ @@ -380,19 +391,21 @@ static int check_resources() director->tls_enable = true; } - if (!director->tls_certfile && director->tls_enable) { + tls_needed = director->tls_enable || director->tls_authenticate; + + if (!director->tls_certfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"), director->hdr.name, configfile); OK = false; } - if (!director->tls_keyfile && director->tls_enable) { + if (!director->tls_keyfile && tls_needed) { Jmsg(NULL, M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"), director->hdr.name, configfile); OK = false; } - if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && director->tls_enable && director->tls_verify_peer) { + if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && tls_needed && director->tls_verify_peer) { Jmsg(NULL, M_FATAL, 0, _("Neither \"TLS CA Certificate\"" " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s." " At least one CA certificate store is required" @@ -402,7 +415,7 @@ static int check_resources() } /* If everything is well, attempt to initialize our per-resource TLS context */ - if (OK && (director->tls_enable || director->tls_require)) { + if (OK && (tls_needed || director->tls_require)) { /* Initialize TLS context: * Args: CA certfile, CA certdir, Certfile, Keyfile, * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */ @@ -434,6 +447,7 @@ static int check_resources() static void cleanup_old_files() { POOLMEM *cleanup = get_pool_memory(PM_MESSAGE); + POOLMEM *results = get_pool_memory(PM_MESSAGE); int len = strlen(me->working_directory); #if defined(HAVE_WIN32) pm_strcpy(cleanup, "del /q "); @@ -446,8 +460,9 @@ static void cleanup_old_files() } pm_strcat(cleanup, my_name); pm_strcat(cleanup, "*.spool"); - run_program(cleanup, 0, NULL); + run_program(cleanup, 0, results); free_pool_memory(cleanup); + free_pool_memory(results); } @@ -467,11 +482,12 @@ void *device_initialization(void *arg) pthread_detach(pthread_self()); jcr = new_jcr(sizeof(JCR), stored_free_jcr); - jcr->JobType = JT_SYSTEM; + jcr->set_JobType(JT_SYSTEM); /* Initialize FD start condition variable */ int errstat = pthread_cond_init(&jcr->job_start_wait, NULL); if (errstat != 0) { - Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat)); + berrno be; + Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), be.bstrerror(errstat)); } foreach_res(device, R_DEVICE) { @@ -483,7 +499,7 @@ void *device_initialization(void *arg) continue; } - jcr->dcr = dcr = new_dcr(jcr, dev); + jcr->dcr = dcr = new_dcr(jcr, NULL, dev); if (dev->is_autochanger()) { /* If autochanger set slot in dev sturcture */ get_autochanger_loaded_slot(dcr); @@ -503,6 +519,7 @@ void *device_initialization(void *arg) switch (read_dev_volume_label(dcr)) { case VOL_OK: memcpy(&dev->VolCatInfo, &dcr->VolCatInfo, sizeof(dev->VolCatInfo)); + volume_unused(dcr); /* mark volume "released" */ break; default: Jmsg1(NULL, M_WARNING, 0, _("Could not mount device %s\n"), dev->print_name()); @@ -534,9 +551,11 @@ void terminate_stored(int sig) JCR *jcr; if (in_here) { /* prevent loops */ + bmicrosleep(2, 0); /* yield */ exit(1); } in_here = true; + debug_level = 0; /* turn off any debug */ stop_watchdog(); if (sig == SIGTERM) { /* normal shutdown request? */ @@ -555,7 +574,7 @@ void terminate_stored(int sig) set_jcr_job_status(jcr, JS_Canceled); fd = jcr->file_bsock; if (fd) { - fd->m_timed_out = true; + fd->set_timed_out(); Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId); pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL); /* ***FIXME*** wiffle through all dcrs */ @@ -580,6 +599,8 @@ void terminate_stored(int sig) Dmsg1(200, "In terminate_stored() sig=%d\n", sig); + free_volume_list(); + foreach_res(device, R_DEVICE) { Dmsg1(10, "Term device %s\n", device->device_name); if (device->dev) { @@ -595,15 +616,18 @@ void terminate_stored(int sig) free(configfile); configfile = NULL; } - free_config_resources(); + if (config) { + config->free_resources(); + free(config); + config = NULL; + } if (debug_level > 10) { print_memory_pool_stats(); } - term_reservations_lock(); term_msg(); cleanup_crypto(); - free_volume_list(); + term_reservations_lock(); close_memory_pool(); sm_dump(false); /* dump orphaned buffers */