X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Ffiled.c;h=79dd1928aad3b5c31e0018d9ffac80753e2219d9;hb=25f607f9bd00610e4cf7b72dd1808cbb23fc3632;hp=1d731da927e5937ed6dd2d4a28cfe526249b835d;hpb=21ad4ba4160bb72105d6c1e2011e2e31b61f20ad;p=bacula%2Fbacula diff --git a/bacula/src/filed/filed.c b/bacula/src/filed/filed.c index 1d731da927..79dd1928aa 100644 --- a/bacula/src/filed/filed.c +++ b/bacula/src/filed/filed.c @@ -1,12 +1,12 @@ /* 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. This program is Free Software; you can redistribute it and/or - modify it under the terms of version two of the GNU General Public + modify it under the terms of version three of the GNU Affero General Public License as published by the Free Software Foundation and included in the file LICENSE. @@ -15,12 +15,12 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License + You should have received a copy of the GNU Affero General Public License along with this program; if not, write to the Free Software 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. @@ -30,18 +30,29 @@ * * Kern Sibbald, March MM * - * Version $Id$ - * */ #include "bacula.h" #include "filed.h" +#ifdef HAVE_PYTHON + +#undef _POSIX_C_SOURCE +#include + +#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 void *handle_client_request(void *dir_sock); +extern bool parse_fd_config(CONFIG *config, const char *configfile, int exit_code); /* Forward referenced functions */ -void terminate_filed(int sig); static bool check_resources(); /* Exported variables */ @@ -49,32 +60,34 @@ CLIENT *me; /* my resource */ bool no_signals = false; void *start_heap; - #define CONFIG_FILE "bacula-fd.conf" /* default config file */ char *configfile = NULL; static bool foreground = false; static workq_t dir_workq; /* queue of work from Director */ static pthread_t server_tid; - +static CONFIG *config; static void usage() { - Pmsg3(-1, _( + fprintf(stderr, _( PROG_COPYRIGHT "\nVersion: %s (%s)\n\n" "Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" " -c use as configuration file\n" " -d set debug level to \n" -" -dt print timestamp in debug output\n" +" -dt print a timestamp in debug output\n" " -f run in foreground (for debugging)\n" " -g groupid\n" +" -k keep readall capabilities\n" +" -m print kaboom output (for debugging)\n" " -s no signals (for debugging)\n" " -t test configuration file and exit\n" " -u userid\n" " -v verbose user messages\n" " -? print this message.\n" "\n"), 2000, VERSION, BDATE); + exit(1); } @@ -92,8 +105,12 @@ int main (int argc, char *argv[]) { int ch; bool test_config = false; + bool keep_readall_caps = false; 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, ""); @@ -105,7 +122,7 @@ int main (int argc, char *argv[]) init_msg(NULL, NULL); daemon_start_time = time(NULL); - while ((ch = getopt(argc, argv, "c:d:fg:stu:v?")) != -1) { + while ((ch = getopt(argc, argv, "c:d:fg:kmstu:v?")) != -1) { switch (ch) { case 'c': /* configuration file */ if (configfile != NULL) { @@ -133,6 +150,14 @@ int main (int argc, char *argv[]) gid = optarg; break; + case 'k': + keep_readall_caps = true; + break; + + case 'm': /* print kaboom output */ + prt_kaboom = true; + break; + case 's': no_signals = true; break; @@ -169,6 +194,10 @@ int main (int argc, char *argv[]) usage(); } + if (!uid && keep_readall_caps) { + Emsg0(M_ERROR_TERM, 0, _("-k option has no meaning without -u option.\n")); + } + server_tid = pthread_self(); if (!no_signals) { init_signals(terminate_filed); @@ -181,7 +210,8 @@ int main (int argc, char *argv[]) configfile = bstrdup(CONFIG_FILE); } - parse_config(configfile); + config = new_config_parser(); + parse_fd_config(config, configfile, M_ERROR_TERM); if (init_crypto() != 0) { Emsg0(M_ERROR, 0, _("Cryptography library initialization failed.\n")); @@ -204,21 +234,34 @@ int main (int argc, char *argv[]) init_stack_dump(); /* set new pid */ } + set_thread_concurrency(me->MaxConcurrentJobs + 10); + lmgr_init_thread(); /* initialize the lockmanager stack */ + /* Maximum 1 daemon at a time */ - create_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); - read_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); + create_pid_file(me->pid_directory, "bacula-fd", + get_first_port_host_order(me->FDaddrs)); + read_state_file(me->working_directory, "bacula-fd", + get_first_port_host_order(me->FDaddrs)); load_fd_plugins(me->plugin_directory); - drop(uid, gid); + drop(uid, gid, keep_readall_caps); #ifdef BOMB me += 1000000; #endif - init_python_interpreter(me->hdr.name, me->scripts_directory, "FDStartUp"); +#ifdef HAVE_PYTHON + python_args.progname = me->hdr.name; + python_args.scriptdir = me->scripts_directory; + python_args.modulename = "FDStartUp"; + python_args.configfile = configfile; + python_args.workingdir = me->working_directory; + python_args.job_getattr = job_getattr; + python_args.job_setattr = job_setattr; - set_thread_concurrency(10); + init_python_interpreter(&python_args); +#endif /* HAVE_PYTHON */ if (!no_signals) { start_watchdog(); /* start watchdog thread */ @@ -262,10 +305,15 @@ void terminate_filed(int sig) if (debug_level > 0) { print_memory_pool_stats(); } + if (config) { + config->free_resources(); + free(config); + config = NULL; + } term_msg(); - free_config_resources(); cleanup_crypto(); close_memory_pool(); /* release free memory in pool */ + lmgr_cleanup_main(); sm_dump(false); /* dump orphaned buffers */ exit(sig); }