]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/stored/stored.c
update version
[bacula/bacula] / bacula / src / stored / stored.c
index 36ae297f397233add3cce53abebfeda2adcb3a6c..8f19c7834fbd19d698e4d34bf4efd9ac7b368365 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2010 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.
  * it opens a data channel and accepts data from the
  * File daemon.
  *
- *   Version $Id$
- *
  */
 
 #include "bacula.h"
 #include "stored.h"
 
-/* Imported functions */
+/* TODO: fix problem with bls, bextract
+ * that use findlib and already declare
+ * filed plugins 
+ */
+#include "sd_plugins.h"         
+
+#ifdef HAVE_PYTHON
+
+#undef _POSIX_C_SOURCE
+#include <Python.h>
 
+#include "lib/pythonlib.h"
+
+/* Imported Functions */
+extern PyObject *job_getattr(PyObject *self, char *attrname);
+extern int job_setattr(PyObject *self, char *attrname, PyObject *value);
+
+#endif /* HAVE_PYTHON */
+
+/* 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 +90,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()
@@ -86,6 +104,7 @@ PROG_COPYRIGHT
 "        -dt         print timestamp in debug output\n"
 "        -f          run in foreground (for debugging)\n"
 "        -g <group>  set groupid to group\n"
+"        -m          print kaboom output (for debugging)\n"
 "        -p          proceed despite I/O errors\n"
 "        -s          no signals (for debugging)\n"
 "        -t          test - read config and exit\n"
@@ -93,6 +112,7 @@ PROG_COPYRIGHT
 "        -v          verbose user messages\n"
 "        -?          print this message.\n"
 "\n"), 2000, VERSION, BDATE);
+
    exit(1);
 }
 
@@ -113,6 +133,9 @@ int main (int argc, char *argv[])
    pthread_t thid;
    char *uid = NULL;
    char *gid = NULL;
+#ifdef HAVE_PYTHON
+   init_python_interpreter_args python_args;
+#endif /* HAVE_PYTHON */
 
    start_heap = sbrk(0);
    setlocale(LC_ALL, "");
@@ -133,7 +156,7 @@ int main (int argc, char *argv[])
       Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE);
    }
 
-   while ((ch = getopt(argc, argv, "c:d:fg:pstu:v?")) != -1) {
+   while ((ch = getopt(argc, argv, "c:d:fg:mpstu:v?")) != -1) {
       switch (ch) {
       case 'c':                    /* configuration file */
          if (configfile != NULL) {
@@ -161,6 +184,10 @@ int main (int argc, char *argv[])
          gid = optarg;
          break;
 
+      case 'm':                    /* print kaboom output */
+         prt_kaboom = true;
+         break;
+
       case 'p':                    /* proceed in spite of I/O errors */
          forge_on = true;
          break;
@@ -209,7 +236,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"));
@@ -232,10 +260,18 @@ int main (int argc, char *argv[])
       init_stack_dump();              /* pick up new pid */
    }
 
-   create_pid_file(me->pid_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
-   read_state_file(me->working_directory, "bacula-sd", get_first_port_host_order(me->sdaddrs));
+   create_pid_file(me->pid_directory, "bacula-sd",
+                   get_first_port_host_order(me->sdaddrs));
+   read_state_file(me->working_directory, "bacula-sd", 
+                   get_first_port_host_order(me->sdaddrs));
+
+   /* Make sure on Solaris we can run concurrent, watch dog + servers + misc */
+   set_thread_concurrency(me->max_concurrent_jobs * 2 + 4);
+   lmgr_init_thread(); /* initialize the lockmanager stack */
 
-   drop(uid, gid);
+   load_sd_plugins(me->plugin_directory);
+
+   drop(uid, gid, false);
 
    cleanup_old_files();
 
@@ -248,15 +284,22 @@ int main (int argc, char *argv[])
       Jmsg0(NULL, M_ABORT, 0, _("Volume Session Time is ZERO!\n"));
    }
 
-   init_python_interpreter(me->hdr.name, me->scripts_directory, "SDStartUp");
+#ifdef HAVE_PYTHON
+   python_args.progname = me->hdr.name;
+   python_args.scriptdir = me->scripts_directory;
+   python_args.modulename = "SDStartUp";
+   python_args.configfile = configfile;
+   python_args.workingdir = me->working_directory;
+   python_args.job_getattr = job_getattr;
+   python_args.job_setattr = job_setattr;
 
-   /* Make sure on Solaris we can run concurrent, watch dog + servers + misc */
-   set_thread_concurrency(me->max_concurrent_jobs * 2 + 4);
+   init_python_interpreter(&python_args);
+#endif /* HAVE_PYTHON */
 
     /*
      * Start the device allocation thread
      */
-   create_volume_list();              /* do before device_init */
+   create_volume_lists();             /* do before device_init */
    if (pthread_create(&thid, NULL, device_initialization, NULL) != 0) {
       berrno be;
       Emsg1(M_ABORT, 0, _("Unable to create thread. ERR=%s\n"), be.bstrerror());
@@ -480,7 +523,7 @@ 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) {
@@ -573,8 +616,8 @@ void terminate_stored(int sig)
          fd = jcr->file_bsock;
          if (fd) {
             fd->set_timed_out();
+            jcr->my_thread_send_signal(TIMEOUT_SIGNAL);
             Dmsg1(100, "term_stored killing JobId=%d\n", jcr->JobId);
-            pthread_kill(jcr->my_thread_id, TIMEOUT_SIGNAL);
             /* ***FIXME*** wiffle through all dcrs */
             if (jcr->dcr && jcr->dcr->dev && jcr->dcr->dev->blocked()) {
                pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol);
@@ -597,7 +640,8 @@ void terminate_stored(int sig)
 
    Dmsg1(200, "In terminate_stored() sig=%d\n", sig);
 
-   free_volume_list();
+   unload_plugins();
+   free_volume_lists();
 
    foreach_res(device, R_DEVICE) {
       Dmsg1(10, "Term device %s\n", device->device_name);
@@ -614,7 +658,11 @@ 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();
@@ -623,6 +671,7 @@ void terminate_stored(int sig)
    cleanup_crypto();
    term_reservations_lock();
    close_memory_pool();
+   lmgr_cleanup_main();
 
    sm_dump(false);                    /* dump orphaned buffers */
    exit(sig);