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 John Walker.
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.
31 * Kern Sibbald, March MM
40 /* Imported Functions */
41 extern void *handle_client_request(void *dir_sock);
43 /* Forward referenced functions */
44 void terminate_filed(int sig);
45 static bool check_resources();
47 /* Exported variables */
48 CLIENT *me; /* my resource */
49 bool no_signals = false;
53 #define CONFIG_FILE "bacula-fd.conf" /* default config file */
55 char *configfile = NULL;
56 static bool foreground = false;
57 static workq_t dir_workq; /* queue of work from Director */
58 static pthread_t server_tid;
65 "\nVersion: %s (%s)\n\n"
66 "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n"
67 " -c <file> use <file> as configuration file\n"
68 " -dnn set debug level to nn\n"
69 " -f run in foreground (for debugging)\n"
71 " -s no signals (for debugging)\n"
72 " -t test configuration file and exit\n"
74 " -v verbose user messages\n"
75 " -? print this message.\n"
76 "\n"), 2000, VERSION, BDATE);
81 /*********************************************************************
83 * Main Bacula Unix Client Program
86 #if defined(HAVE_WIN32)
87 #define main BaculaMain
90 int main (int argc, char *argv[])
93 bool test_config = false;
98 setlocale(LC_ALL, "");
99 bindtextdomain("bacula", LOCALEDIR);
100 textdomain("bacula");
103 my_name_is(argc, argv, "bacula-fd");
104 init_msg(NULL, NULL);
105 daemon_start_time = time(NULL);
107 while ((ch = getopt(argc, argv, "c:d:fg:stu:v?")) != -1) {
109 case 'c': /* configuration file */
110 if (configfile != NULL) {
113 configfile = bstrdup(optarg);
116 case 'd': /* debug level */
117 debug_level = atoi(optarg);
118 if (debug_level <= 0) {
123 case 'f': /* run in foreground */
127 case 'g': /* set group */
139 case 'u': /* set userid */
143 case 'v': /* verbose */
157 if (configfile != NULL)
159 configfile = bstrdup(*argv);
167 server_tid = pthread_self();
169 init_signals(terminate_filed);
171 /* This reduces the number of signals facilitating debugging */
172 watchdog_sleep_time = 120; /* long timeout for debugging */
175 if (configfile == NULL) {
176 configfile = bstrdup(CONFIG_FILE);
179 parse_config(configfile);
181 if (init_crypto() != 0) {
182 Emsg0(M_ERROR, 0, _("Cryptography library initialization failed.\n"));
186 if (!check_resources()) {
187 Emsg1(M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile);
191 set_working_directory(me->working_directory);
199 init_stack_dump(); /* set new pid */
202 /* Maximum 1 daemon at a time */
203 create_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
204 read_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
212 init_python_interpreter(me->hdr.name, me->scripts_directory, "FDStartUp");
214 set_thread_concurrency(10);
217 start_watchdog(); /* start watchdog thread */
218 init_jcr_subsystem(); /* start JCR watchdogs etc. */
220 server_tid = pthread_self();
222 /* Become server, and handle requests */
224 foreach_dlist(p, me->FDaddrs) {
225 Dmsg1(10, "filed: listening on port %d\n", p->get_port_host_order());
227 bnet_thread_server(me->FDaddrs, me->MaxConcurrentJobs, &dir_workq, handle_client_request);
230 exit(0); /* should never get here */
233 void terminate_filed(int sig)
235 static bool already_here = false;
238 bmicrosleep(2, 0); /* yield */
239 exit(1); /* prevent loops */
242 debug_level = 0; /* turn off debug */
245 bnet_stop_thread_server(server_tid);
246 generate_daemon_event(NULL, "Exit");
247 write_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
248 delete_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs));
250 if (configfile != NULL) {
254 if (debug_level > 0) {
255 print_memory_pool_stats();
258 free_config_resources();
260 close_memory_pool(); /* release free memory in pool */
261 sm_dump(false); /* dump orphaned buffers */
266 * Make a quick check to see that we have all the
269 static bool check_resources()
276 me = (CLIENT *)GetNextRes(R_CLIENT, NULL);
278 Emsg1(M_FATAL, 0, _("No File daemon resource defined in %s\n"
279 "Without that I don't know who I am :-(\n"), configfile);
282 if (GetNextRes(R_CLIENT, (RES *) me) != NULL) {
283 Emsg1(M_FATAL, 0, _("Only one Client resource permitted in %s\n"),
287 my_name_is(0, NULL, me->hdr.name);
289 me->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
291 Emsg1(M_FATAL, 0, _("No Messages resource defined in %s\n"), configfile);
295 /* tls_require implies tls_enable */
296 if (me->tls_require) {
298 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
301 me->tls_enable = true;
305 if ((!me->tls_ca_certfile && !me->tls_ca_certdir) && me->tls_enable) {
306 Emsg1(M_FATAL, 0, _("Neither \"TLS CA Certificate\""
307 " or \"TLS CA Certificate Dir\" are defined for File daemon in %s.\n"),
312 /* If everything is well, attempt to initialize our per-resource TLS context */
313 if (OK && (me->tls_enable || me->tls_require)) {
314 /* Initialize TLS context:
315 * Args: CA certfile, CA certdir, Certfile, Keyfile,
316 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
317 me->tls_ctx = new_tls_context(me->tls_ca_certfile,
318 me->tls_ca_certdir, me->tls_certfile, me->tls_keyfile,
319 NULL, NULL, NULL, true);
322 Emsg2(M_FATAL, 0, _("Failed to initialize TLS context for File daemon \"%s\" in %s.\n"),
323 me->hdr.name, configfile);
328 if (me->pki_encrypt || me->pki_sign) {
330 Jmsg(NULL, M_FATAL, 0, _("PKI encryption/signing enabled but not compiled into Bacula.\n"));
335 /* pki_encrypt implies pki_sign */
336 if (me->pki_encrypt) {
340 if ((me->pki_encrypt || me->pki_sign) && !me->pki_keypair_file) {
341 Emsg2(M_FATAL, 0, _("\"PKI Key Pair\" must be defined for File"
342 " daemon \"%s\" in %s if either \"PKI Sign\" or"
343 " \"PKI Encrypt\" are enabled.\n"), me->hdr.name, configfile);
347 /* If everything is well, attempt to initialize our public/private keys */
348 if (OK && (me->pki_encrypt || me->pki_sign)) {
350 /* Load our keypair */
351 me->pki_keypair = crypto_keypair_new();
352 if (!me->pki_keypair) {
353 Emsg0(M_FATAL, 0, _("Failed to allocate a new keypair object.\n"));
356 if (!crypto_keypair_load_cert(me->pki_keypair, me->pki_keypair_file)) {
357 Emsg2(M_FATAL, 0, _("Failed to load public certificate for File"
358 " daemon \"%s\" in %s.\n"), me->hdr.name, configfile);
362 if (!crypto_keypair_load_key(me->pki_keypair, me->pki_keypair_file, NULL, NULL)) {
363 Emsg2(M_FATAL, 0, _("Failed to load private key for File"
364 " daemon \"%s\" in %s.\n"), me->hdr.name, configfile);
370 * Trusted Signers. We're always trusted.
372 me->pki_signers = New(alist(10, not_owned_by_alist));
373 if (me->pki_keypair) {
374 me->pki_signers->append(crypto_keypair_dup(me->pki_keypair));
377 /* If additional signing public keys have been specified, load them up */
378 if (me->pki_signing_key_files) {
379 foreach_alist(filepath, me->pki_signing_key_files) {
380 X509_KEYPAIR *keypair;
382 keypair = crypto_keypair_new();
384 Emsg0(M_FATAL, 0, _("Failed to allocate a new keypair object.\n"));
387 if (crypto_keypair_load_cert(keypair, filepath)) {
388 me->pki_signers->append(keypair);
390 /* Attempt to load a private key, if available */
391 if (crypto_keypair_has_key(filepath)) {
392 if (!crypto_keypair_load_key(keypair, filepath, NULL, NULL)) {
393 Emsg3(M_FATAL, 0, _("Failed to load private key from file %s for File"
394 " daemon \"%s\" in %s.\n"), filepath, me->hdr.name, configfile);
400 Emsg3(M_FATAL, 0, _("Failed to load trusted signer certificate"
401 " from file %s for File daemon \"%s\" in %s.\n"), filepath, me->hdr.name, configfile);
409 * Crypto recipients. We're always included as a recipient.
410 * The symmetric session key will be encrypted for each of these readers.
412 me->pki_recipients = New(alist(10, not_owned_by_alist));
413 if (me->pki_keypair) {
414 me->pki_recipients->append(crypto_keypair_dup(me->pki_keypair));
418 /* If additional keys have been specified, load them up */
419 if (me->pki_master_key_files) {
420 foreach_alist(filepath, me->pki_master_key_files) {
421 X509_KEYPAIR *keypair;
423 keypair = crypto_keypair_new();
425 Emsg0(M_FATAL, 0, _("Failed to allocate a new keypair object.\n"));
428 if (crypto_keypair_load_cert(keypair, filepath)) {
429 me->pki_recipients->append(keypair);
431 Emsg3(M_FATAL, 0, _("Failed to load master key certificate"
432 " from file %s for File daemon \"%s\" in %s.\n"), filepath, me->hdr.name, configfile);
442 /* Verify that a director record exists */
444 director = (DIRRES *)GetNextRes(R_DIRECTOR, NULL);
447 Emsg1(M_FATAL, 0, _("No Director resource defined in %s\n"),
452 foreach_res(director, R_DIRECTOR) {
453 /* tls_require implies tls_enable */
454 if (director->tls_require) {
456 Jmsg(NULL, M_FATAL, 0, _("TLS required but not configured in Bacula.\n"));
460 director->tls_enable = true;
464 if (!director->tls_certfile && director->tls_enable) {
465 Emsg2(M_FATAL, 0, _("\"TLS Certificate\" file not defined for Director \"%s\" in %s.\n"),
466 director->hdr.name, configfile);
470 if (!director->tls_keyfile && director->tls_enable) {
471 Emsg2(M_FATAL, 0, _("\"TLS Key\" file not defined for Director \"%s\" in %s.\n"),
472 director->hdr.name, configfile);
476 if ((!director->tls_ca_certfile && !director->tls_ca_certdir) && director->tls_enable && director->tls_verify_peer) {
477 Emsg2(M_FATAL, 0, _("Neither \"TLS CA Certificate\""
478 " or \"TLS CA Certificate Dir\" are defined for Director \"%s\" in %s."
479 " At least one CA certificate store is required"
480 " when using \"TLS Verify Peer\".\n"),
481 director->hdr.name, configfile);
485 /* If everything is well, attempt to initialize our per-resource TLS context */
486 if (OK && (director->tls_enable || director->tls_require)) {
487 /* Initialize TLS context:
488 * Args: CA certfile, CA certdir, Certfile, Keyfile,
489 * Keyfile PEM Callback, Keyfile CB Userdata, DHfile, Verify Peer */
490 director->tls_ctx = new_tls_context(director->tls_ca_certfile,
491 director->tls_ca_certdir, director->tls_certfile,
492 director->tls_keyfile, NULL, NULL, director->tls_dhfile,
493 director->tls_verify_peer);
495 if (!director->tls_ctx) {
496 Emsg2(M_FATAL, 0, _("Failed to initialize TLS context for Director \"%s\" in %s.\n"),
497 director->hdr.name, configfile);
506 close_msg(NULL); /* close temp message handler */
507 init_msg(NULL, me->messages); /* open user specified message handler */