X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=server-src%2Famflush.c;h=4d28e44755118821311cffa1a934d9a8234fa689;hb=c21061ed466e7ee71cb21dd35010e33f6cf76424;hp=4515e67298480a93325060f7dfb1795e7145f86d;hpb=e442edb4d5816c4ad107ad9e71164f845eba70ad;p=debian%2Famanda diff --git a/server-src/amflush.c b/server-src/amflush.c index 4515e67..4d28e44 100644 --- a/server-src/amflush.c +++ b/server-src/amflush.c @@ -30,14 +30,14 @@ */ #include "amanda.h" +#include "match.h" +#include "find.h" #include "conffile.h" #include "diskfile.h" #include "tapefile.h" #include "logfile.h" #include "clock.h" -#include "version.h" #include "holding.h" -#include "driverio.h" #include "server_util.h" #include "timestamp.h" @@ -79,7 +79,6 @@ main( pid_t driver_pid, reporter_pid; amwait_t exitcode; int opt; - dumpfile_t file; GSList *holding_list=NULL, *holding_file; int driver_pipe[2]; char date_string[100]; @@ -91,8 +90,10 @@ main( char *tpchanger; char *qdisk, *qhname; GSList *datestamp_list = NULL; - config_overwrites_t *cfg_ovr; + config_overrides_t *cfg_ovr; char **config_options; + find_result_t *holding_files; + disklist_t holding_disklist = { NULL, NULL }; /* * Configure program for internationalization: @@ -113,14 +114,14 @@ main( dbopen(DBG_SUBDIR_SERVER); - erroutput_type = ERR_INTERACTIVE; + add_amanda_log_handler(amanda_log_stderr); foreground = 0; batch = 0; redirect = 1; /* process arguments */ - cfg_ovr = new_config_overwrites(argc/2); + cfg_ovr = new_config_overrides(argc/2); while((opt = getopt(argc, argv, "bfso:D:")) != EOF) { switch(opt) { case 'b': batch = 1; @@ -129,7 +130,7 @@ main( break; case 's': redirect = 0; break; - case 'o': add_config_overwrite_opt(cfg_ovr, optarg); + case 'o': add_config_override_opt(cfg_ovr, optarg); break; case 'D': if (datearg == NULL) datearg = alloc(21*SIZEOF(char *)); @@ -150,28 +151,41 @@ main( } if(argc < 1) { - error(_("Usage: amflush%s [-b] [-f] [-s] [-D date]* [host [disk]* ]* [-o configoption]*"), versionsuffix()); + error(_("Usage: amflush [-b] [-f] [-s] [-D date]* [-o configoption]* [host [disk]* ]*")); /*NOTREACHED*/ } - config_init(CONFIG_INIT_EXPLICIT_NAME | CONFIG_INIT_FATAL, + set_config_overrides(cfg_ovr); + config_init(CONFIG_INIT_EXPLICIT_NAME, argv[0]); - apply_config_overwrites(cfg_ovr); - check_running_as(RUNNING_AS_DUMPUSER); - - dbrename(config_name, DBG_SUBDIR_SERVER); conf_diskfile = config_dir_relative(getconf_str(CNF_DISKFILE)); - if (read_diskfile(conf_diskfile, &diskq) < 0) { - error(_("could not read disklist file \"%s\""), conf_diskfile); - /*NOTREACHED*/ + read_diskfile(conf_diskfile, &diskq); + amfree(conf_diskfile); + + if (config_errors(NULL) >= CFGERR_WARNINGS) { + config_print_errors(); + if (config_errors(NULL) >= CFGERR_ERRORS) { + g_critical(_("errors processing config file")); + } } + + check_running_as(RUNNING_AS_DUMPUSER); + + dbrename(get_config_name(), DBG_SUBDIR_SERVER); + + /* load DLEs from the holding disk, in case there's anything to flush there */ + search_holding_disk(&holding_files, &holding_disklist); + /* note that the dumps are added to the global disklist, so we need not + * consult holding_files or holding_disklist after this. The holding-only + * dumps will be filtered properly by match_disklist, setting the dp->todo + * flag appropriately. */ + errstr = match_disklist(&diskq, argc-1, argv+1); if (errstr) { g_printf(_("%s"),errstr); amfree(errstr); } - amfree(conf_diskfile); conf_tapelist = config_dir_relative(getconf_str(CNF_TAPELIST)); if(read_tapelist(conf_tapelist)) { @@ -193,17 +207,17 @@ main( conf_logdir = config_dir_relative(getconf_str(CNF_LOGDIR)); conf_logfile = vstralloc(conf_logdir, "/log", NULL); if (access(conf_logfile, F_OK) == 0) { - error(_("%s exists: amdump or amflush is already running, or you must run amcleanup"), conf_logfile); + run_amcleanup(get_config_name()); + } + if (access(conf_logfile, F_OK) == 0) { + char *process_name = get_master_process(conf_logfile); + error(_("%s exists: %s is already running, or you must run amcleanup"), conf_logfile, process_name); /*NOTREACHED*/ } - amfree(conf_logfile); - driver_program = vstralloc(amlibexecdir, "/", "driver", versionsuffix(), - NULL); - reporter_program = vstralloc(sbindir, "/", "amreport", versionsuffix(), - NULL); - logroll_program = vstralloc(amlibexecdir, "/", "amlogroll", versionsuffix(), - NULL); + driver_program = vstralloc(amlibexecdir, "/", "driver", NULL); + reporter_program = vstralloc(sbindir, "/", "amreport", NULL); + logroll_program = vstralloc(amlibexecdir, "/", "amlogroll", NULL); tapedev = getconf_str(CNF_TAPEDEV); tpchanger = getconf_str(CNF_TPCHANGER); @@ -255,6 +269,13 @@ main( exit(1); } + if (access(conf_logfile, F_OK) == 0) { + char *process_name = get_master_process(conf_logfile); + error(_("%s exists: someone started %s"), conf_logfile, process_name); + /*NOTREACHED*/ + } + log_add(L_INFO, "%s pid %ld", get_pname(), (long)getpid()); + if(!batch) confirm(datestamp_list); for(dp = diskq.head; dp != NULL; dp = dp->next) { @@ -275,8 +296,8 @@ main( if(!foreground) detach(); - erroutput_type = (ERR_AMANDALOG|ERR_INTERACTIVE); - set_logerror(logerror); + add_amanda_log_handler(amanda_log_stderr); + add_amanda_log_handler(amanda_log_trace_log); today = time(NULL); tm = localtime(&today); if (tm) { @@ -305,7 +326,7 @@ main( close(driver_pipe[1]); config_options = get_config_options(3); config_options[0] = "driver"; - config_options[1] = config_name; + config_options[1] = get_config_name(); config_options[2] = "nodump"; safe_fd(-1, 0); execve(driver_program, config_options, safe_env()); @@ -324,20 +345,24 @@ main( g_fprintf(driver_stream, "DATE %s\n", amflush_timestamp); for(holding_file=holding_list; holding_file != NULL; holding_file = holding_file->next) { + dumpfile_t file; holding_file_get_dumpfile((char *)holding_file->data, &file); if (holding_file_size((char *)holding_file->data, 1) <= 0) { + g_debug("%s is empty - ignoring", (char *)holding_file->data); log_add(L_INFO, "%s: removing file with no data.", (char *)holding_file->data); holding_file_unlink((char *)holding_file->data); + dumpfile_free_data(&file); continue; } + /* search_holding_disk should have already ensured that every + * holding dumpfile has an entry in the dynamic disklist */ dp = lookup_disk(file.name, file.disk); - if (!dp) { - error("dp == NULL"); - /*NOTREACHED*/ - } + assert(dp != NULL); + + /* but match_disklist may have indicated we should not flush it */ if (dp->todo == 0) continue; qdisk = quote_string(file.disk); @@ -349,6 +374,8 @@ main( file.datestamp, file.dumplevel, qhname); + + g_debug("flushing '%s'", (char *)holding_file->data); g_fprintf(driver_stream, "FLUSH %s %s %s %d %s\n", file.name, @@ -358,6 +385,7 @@ main( qhname); amfree(qdisk); amfree(qhname); + dumpfile_free_data(&file); } g_fprintf(stderr, "ENDFLUSH\n"); fflush(stderr); g_fprintf(driver_stream, "ENDFLUSH\n"); fflush(driver_stream); @@ -441,9 +469,10 @@ main( /* * This is the child process. */ - config_options = get_config_options(2); + config_options = get_config_options(3); config_options[0] = "amreport"; - config_options[1] = config_name; + config_options[1] = get_config_name(); + config_options[2] = "--from-amdump"; safe_fd(-1, 0); execve(reporter_program, config_options, safe_env()); error(_("cannot exec %s: %s"), reporter_program, strerror(errno)); @@ -465,13 +494,15 @@ main( } } + log_add(L_INFO, "pid-done %ld", (long)getpid()); + /* * Call amlogroll to rename the log file to its datestamped version. * Since we exec at this point, our exit code will be that of amlogroll. */ config_options = get_config_options(2); config_options[0] = "amlogroll"; - config_options[1] = config_name; + config_options[1] = get_config_name(); safe_fd(-1, 0); execve(logroll_program, config_options, safe_env()); error(_("cannot exec %s: %s"), logroll_program, strerror(errno)); @@ -486,7 +517,7 @@ get_letter_from_user(void) int r, ch; fflush(stdout); fflush(stderr); - while((ch = getchar()) != EOF && ch != '\n' && isspace(ch)) { + while((ch = getchar()) != EOF && ch != '\n' && g_ascii_isspace(ch)) { (void)ch; /* Quite lint */ } if(ch == '\n') { @@ -556,14 +587,14 @@ pick_datestamp(void) a = answer; while ((ch = *a++) != '\0') { - if (!isspace(ch)) + if (!g_ascii_isspace(ch)) break; } /* rewrite the selected list into r_datestamp_list, then copy it over * to datestamp_list */ do { - if (isspace(ch) || ch == ',') { + if (g_ascii_isspace(ch) || ch == ',') { continue; } chupper = (char)toupper(ch); @@ -638,6 +669,7 @@ confirm(GSList *datestamp_list) } g_printf(_("Ok, quitting. Run amflush again when you are ready.\n")); + log_add(L_INFO, "pid-done %ld", (long)getpid()); exit(1); }