*/
#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"
+#include "getopt.h"
+
+static struct option long_options[] = {
+ {"version" , 0, NULL, 1},
+ {NULL, 0, NULL, 0}
+};
static char *conf_logdir;
FILE *driver_stream;
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:
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);
- while((opt = getopt(argc, argv, "bfso:D:")) != EOF) {
+ cfg_ovr = new_config_overrides(argc/2);
+ while((opt = getopt_long(argc, argv, "bfso:D:", long_options, NULL)) != EOF) {
switch(opt) {
+ case 1 : printf("amflush-%s\n", VERSION);
+ return(0);
+ break;
+
case 'b': batch = 1;
break;
case 'f': foreground = 1;
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 *));
}
if(argc < 1) {
- error(_("Usage: amflush%s [-b] [-f] [-s] [-D date]* <confdir> [host [disk]* ]* [-o configoption]*"), versionsuffix());
+ error(_("Usage: amflush [-b] [-f] [-s] [-D date]* [-o configoption]* <confdir> [host [disk]* ]*"));
/*NOTREACHED*/
}
+ set_config_overrides(cfg_ovr);
config_init(CONFIG_INIT_EXPLICIT_NAME,
argv[0]);
- apply_config_overwrites(cfg_ovr);
conf_diskfile = config_dir_relative(getconf_str(CNF_DISKFILE));
read_diskfile(conf_diskfile, &diskq);
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);
error(_("%s exists: %s is already running, or you must run amcleanup"), conf_logfile, process_name);
/*NOTREACHED*/
}
- amfree(conf_logfile);
- log_add(L_INFO, "%s pid %ld", get_pname(), (long)getpid());
- 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);
stralloc((char *)datestamp->data),
g_compare_strings);
}
- g_slist_free_full(all_datestamps);
+ slist_free_full(all_datestamps, g_free);
}
else {
/* otherwise, in batch mode, use all datestamps */
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) {
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) {
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);
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);
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,
}
}
- g_slist_free_full(datestamp_list);
+ slist_free_full(datestamp_list, g_free);
datestamp_list = NULL;
- g_slist_free_full(holding_list);
+ slist_free_full(holding_list, g_free);
holding_list = NULL;
if(redirect) { /* rename errfile */
/*
* This is the child process.
*/
- config_options = get_config_options(2);
+ config_options = get_config_options(3);
config_options[0] = "amreport";
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));
}
chupper = (char)toupper(ch);
if (chupper < 'A' || chupper > max_char) {
- g_slist_free_full(r_datestamp_list);
+ slist_free_full(r_datestamp_list, g_free);
r_datestamp_list = NULL;
break;
}
stralloc(datestamps[chupper - 'A']));
} while ((ch = *a++) != '\0');
if (r_datestamp_list && ch == '\0') {
- g_slist_free_full(datestamp_list);
+ slist_free_full(datestamp_list, g_free);
datestamp_list = r_datestamp_list;
break;
}
}
g_printf(_("Ok, quitting. Run amflush again when you are ready.\n"));
+ log_add(L_INFO, "pid-done %ld", (long)getpid());
exit(1);
}
fflush(stdout); fflush(stderr);
errfile = vstralloc(conf_logdir, "/amflush", NULL);
- if((fderr = open(errfile, O_WRONLY| O_CREAT | O_TRUNC, 0600)) == -1) {
+ if((fderr = open(errfile, O_WRONLY| O_APPEND | O_CREAT | O_TRUNC, 0600)) == -1) {
error(_("could not open %s: %s"), errfile, strerror(errno));
/*NOTREACHED*/
}