X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fdird.c;h=df6f418fe89c35604a1f2a3e7c6c16c8dd5dc3c1;hb=42d33c4f5f114e192ca987c68bb7c3a2c072b968;hp=bccd480be136f8ee857d1a28fcbac718befbe500;hpb=8b04726b7e73e294a39f818d9d2867b5718c8522;p=bacula%2Fbacula diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index bccd480be1..df6f418fe8 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.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. @@ -37,6 +37,19 @@ #include "bacula.h" #include "dird.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 */ + /* Forward referenced subroutines */ void terminate_dird(int sig); static bool check_resources(); @@ -46,7 +59,7 @@ static void dir_sql_query(JCR *jcr, const char *cmd); /* Exported subroutines */ extern "C" void reload_config(int sig); extern void invalidate_schedules(); - +extern bool parse_dir_config(CONFIG *config, const char *configfile, int exit_code); /* Imported subroutines */ JCR *wait_for_next_job(char *runjob); @@ -58,12 +71,14 @@ void term_job_server(); void store_jobtype(LEX *lc, RES_ITEM *item, int index, int pass); void store_level(LEX *lc, RES_ITEM *item, int index, int pass); void store_replace(LEX *lc, RES_ITEM *item, int index, int pass); +void store_migtype(LEX *lc, RES_ITEM *item, int index, int pass); void init_device_resources(); static char *runjob = NULL; static int background = 1; static void init_reload(void); - +static CONFIG *config; + /* Globals Exported */ DIRRES *director; /* Director resource */ int FDConnectTimeout; @@ -72,14 +87,10 @@ char *configfile = NULL; void *start_heap; /* Globals Imported */ -extern int r_first, r_last; /* first and last resources */ -extern RES_TABLE resources[]; -extern RES **res_head; extern RES_ITEM job_items[]; - #if defined(_MSC_VER) extern "C" { // work around visual compiler mangling variables - extern URES res_all; + extern URES res_all; } #else extern URES res_all; @@ -128,6 +139,9 @@ int main (int argc, char *argv[]) bool test_config = 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, ""); @@ -140,6 +154,8 @@ int main (int argc, char *argv[]) init_reload(); daemon_start_time = time(NULL); + console_command = run_console_command; + while ((ch = getopt(argc, argv, "c:d:fg:r:stu:v?")) != -1) { switch (ch) { case 'c': /* specify config file */ @@ -223,7 +239,8 @@ int main (int argc, char *argv[]) configfile = bstrdup(CONFIG_FILE); } - parse_config(configfile); + config = new_config_parser(); + parse_dir_config(config, configfile, M_ERROR_TERM); if (init_crypto() != 0) { Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n")); @@ -244,6 +261,8 @@ int main (int argc, char *argv[]) read_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs)); } + load_dir_plugins(director->plugin_directory); + drop(uid, gid); /* reduce privileges if requested */ if (!check_catalog()) { @@ -263,15 +282,23 @@ int main (int argc, char *argv[]) FDConnectTimeout = (int)director->FDConnectTimeout; SDConnectTimeout = (int)director->SDConnectTimeout; - #if !defined(HAVE_WIN32) signal(SIGHUP, reload_config); #endif init_console_msg(working_directory); - init_python_interpreter(director->name(), director->scripts_directory, - "DirStartUp"); +#ifdef HAVE_PYTHON + python_args.progname = director->name(); + python_args.scriptdir = director->scripts_directory; + python_args.modulename = "DirStartUp"; + python_args.configfile = configfile; + python_args.workingdir = director->working_directory; + python_args.job_getattr = job_getattr; + python_args.job_setattr = job_setattr; + + init_python_interpreter(&python_args); +#endif /* HAVE_PYTHON */ set_thread_concurrency(director->MaxConcurrentJobs * 2 + 4 /* UA */ + 4 /* sched+watchdog+jobsvr+misc */); @@ -285,6 +312,8 @@ int main (int argc, char *argv[]) init_job_server(director->MaxConcurrentJobs); + dbg_jcr_add_hook(_dbg_print_db); /* used to debug B_DB connexion after fatal signal */ + // init_device_resources(); Dmsg0(200, "wait for next job\n"); @@ -328,8 +357,10 @@ void terminate_dird(int sig) exit(1); } already_here = true; + debug_level = 0; /* turn off debug */ stop_watchdog(); generate_daemon_event(NULL, "Exit"); + unload_plugins(); write_state_file(director->working_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs)); delete_pid_file(director->pid_directory, "bacula-dir", get_first_port_host_order(director->DIRaddrs)); term_scheduler(); @@ -343,7 +374,11 @@ void terminate_dird(int sig) if (debug_level > 5) { print_memory_pool_stats(); } - free_config_resources(); + if (config) { + config->free_resources(); + free(config); + config = NULL; + } term_ua_server(); term_msg(); /* terminate message handler */ cleanup_crypto(); @@ -469,10 +504,10 @@ void reload_config(int sig) } Dmsg1(100, "Reload_config njobs=%d\n", njobs); - reload_table[table].res_table = save_config_resources(); + reload_table[table].res_table = config->save_resources(); Dmsg1(100, "Saved old config in table %d\n", table); - ok = parse_config(configfile, 0, M_ERROR); /* no exit on error */ + ok = parse_dir_config(config, configfile, M_ERROR); Dmsg0(100, "Reloaded config file\n"); if (!ok || !check_resources() || !check_catalog()) { @@ -484,7 +519,7 @@ void reload_config(int sig) Jmsg(NULL, M_ERROR, 0, _("Please correct configuration file: %s\n"), configfile); Jmsg(NULL, M_ERROR, 0, _("Resetting previous configuration.\n")); } - reload_table[rtable].res_table = save_config_resources(); + reload_table[rtable].res_table = config->save_resources(); /* Now restore old resoure values */ int num = r_last - r_first + 1; RES **res_tab = reload_table[table].res_table; @@ -498,7 +533,7 @@ void reload_config(int sig) * Hook all active jobs so that they release this table */ foreach_jcr(jcr) { - if (jcr->JobType != JT_SYSTEM) { + if (jcr->get_JobType() != JT_SYSTEM) { reload_table[table].job_count++; job_end_push(jcr, reload_job_end_cb, (void *)((long int)table)); njobs++; @@ -649,7 +684,7 @@ static bool check_resources() /* Transfer default items from JobDefs Resource */ for (i=0; job_items[i].name; i++) { char **def_svalue, **svalue; /* string value */ - int *def_ivalue, *ivalue; /* integer value */ + uint32_t *def_ivalue, *ivalue; /* integer value */ bool *def_bvalue, *bvalue; /* bool value */ int64_t *def_lvalue, *lvalue; /* 64 bit values */ uint32_t offset; @@ -703,15 +738,16 @@ static bool check_resources() * Note, our store_bit does not handle bitmaped fields */ } else if (job_items[i].handler == store_bit || - job_items[i].handler == store_pint || + job_items[i].handler == store_pint32 || job_items[i].handler == store_jobtype || job_items[i].handler == store_level || - job_items[i].handler == store_pint || + job_items[i].handler == store_int32 || + job_items[i].handler == store_migtype || job_items[i].handler == store_replace) { - def_ivalue = (int *)((char *)(job->jobdefs) + offset); + def_ivalue = (uint32_t *)((char *)(job->jobdefs) + offset); Dmsg5(400, "Job \"%s\", field \"%s\" def_ivalue=%d item %d offset=%u\n", job->name(), job_items[i].name, *def_ivalue, i, offset); - ivalue = (int *)((char *)job + offset); + ivalue = (uint32_t *)((char *)job + offset); *ivalue = *def_ivalue; set_bit(i, job->hdr.item_present); /* @@ -879,7 +915,7 @@ static bool check_catalog() * Make sure we can open catalog, otherwise print a warning * message because the server is probably not running. */ - db = db_init_database(NULL, catalog->db_name, catalog->db_user, + db = db_init(NULL, catalog->db_driver, catalog->db_name, catalog->db_user, catalog->db_password, catalog->db_address, catalog->db_port, catalog->db_socket, catalog->mult_db_connections); @@ -900,12 +936,14 @@ static bool check_catalog() /* Loop over all pools, defining/updating them in each database */ POOL *pool; foreach_res(pool, R_POOL) { - create_pool(NULL, db, pool, POOL_OP_UPDATE); /* update request */ - } - - /* Loop over all pools for updating RecyclePool */ - foreach_res(pool, R_POOL) { - update_pool_recyclepool(NULL, db, pool); + /* + * If the Pool has a catalog resource create the pool only + * in that catalog. + */ + if (!pool->catalog || pool->catalog == catalog) { + create_pool(NULL, db, pool, POOL_OP_UPDATE); /* update request */ + update_pool_recyclepool(NULL, db, pool); + } } STORE *store; @@ -924,6 +962,7 @@ static bool check_catalog() db_create_storage_record(NULL, db, &sr); store->StorageId = sr.StorageId; /* set storage Id */ if (!sr.created) { /* if not created, update it */ + sr.AutoChanger = store->autochanger; db_update_storage_record(NULL, db, &sr); }