X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fdird.c;h=2f2092df402779f226bd43051d1820bbf2419850;hb=2af18872b7aec25d0ab4bc9342e0287bdace2151;hp=4cb1b27cb5e22870e8045350e76a2a1976c673ad;hpb=8f35fc1ad87cd8d230d2bdaf8c161a2842ba33a4;p=bacula%2Fbacula diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index 4cb1b27cb5..2f2092df40 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -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); @@ -64,7 +77,7 @@ void init_device_resources(); static char *runjob = NULL; static int background = 1; static void init_reload(void); -static PARSER *parser; +static CONFIG *config; /* Globals Exported */ DIRRES *director; /* Director resource */ @@ -74,15 +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[]; -extern int res_all_size; - #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; @@ -131,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, ""); @@ -228,10 +239,8 @@ int main (int argc, char *argv[]) configfile = bstrdup(CONFIG_FILE); } - parser = new_parser(); - parser->init(configfile, NULL, M_ERROR_TERM, (void *)&res_all, res_all_size, - r_first, r_last, resources, res_head); - parser->parse_config(); + 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")); @@ -273,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 */); @@ -295,6 +312,8 @@ int main (int argc, char *argv[]) init_job_server(director->MaxConcurrentJobs); + dbg_add_hook(_db_print_dbg); /* used to debug B_DB connexion after fatal signal */ + // init_device_resources(); Dmsg0(200, "wait for next job\n"); @@ -338,6 +357,7 @@ 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(); @@ -354,8 +374,11 @@ void terminate_dird(int sig) if (debug_level > 5) { print_memory_pool_stats(); } - free_config_resources(); - free(parser); + if (config) { + config->free_resources(); + free(config); + config = NULL; + } term_ua_server(); term_msg(); /* terminate message handler */ cleanup_crypto(); @@ -481,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()) { @@ -496,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; @@ -510,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++; @@ -661,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; @@ -715,16 +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); /* @@ -939,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); }