/*
- * Copyright (C) 2008-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2008-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
DEFINE_DSS_ERRLIST;
+static const char const *hook_status_description[] = {HOOK_STATUS_ARRAY};
+/* may be called with ds == NULL. */
+static int disk_space_low(struct disk_space *ds)
+{
+ struct disk_space ds_struct;
+
+ if (!ds) {
+ int ret = get_disk_space(".", &ds_struct);
+ if (ret < 0)
+ return ret;
+ ds = &ds_struct;
+ }
+ if (conf.min_free_mb_arg)
+ if (ds->free_mb < conf.min_free_mb_arg)
+ return 1;
+ if (conf.min_free_percent_arg)
+ if (ds->percent_free < conf.min_free_percent_arg)
+ return 1;
+ if (conf.min_free_percent_inodes_arg)
+ if (ds->percent_free_inodes < conf.min_free_percent_inodes_arg)
+ return 1;
+ return 0;
+}
+
+static void dump_dss_config(const char *msg)
+{
+ const char dash[] = "-----------------------------";
+ int ret;
+ FILE *log = logfile? logfile : stderr;
+ struct disk_space ds;
+ int64_t now = get_current_time();
+
+ if (conf.loglevel_arg > INFO)
+ return;
+
+ fprintf(log, "%s <%s config> %s\n", dash, msg, dash);
+ fprintf(log, "\n*** disk space ***\n\n");
+ ret = get_disk_space(".", &ds);
+ if (ret >= 0) {
+ DSS_INFO_LOG("disk space low: %s\n", disk_space_low(&ds)?
+ "yes" : "no");
+ log_disk_space(&ds);
+ } else
+ DSS_ERROR_LOG("can not get free disk space: %s\n",
+ dss_strerror(-ret));
+
+ /* we continue on errors from get_disk_space */
+
+ fprintf(log, "\n*** command line and config file options ***\n\n");
+ cmdline_parser_dump(log, &conf);
+ fprintf(log, "\n*** internal state ***\n\n");
+ fprintf(log,
+ "pid: %d\n"
+ "logile: %s\n"
+ "snapshot_currently_being_removed: %s\n"
+ "path_to_last_complete_snapshot: %s\n"
+ "reference_snapshot: %s\n"
+ "snapshot_creation_status: %s\n"
+ "snapshot_removal_status: %s\n"
+ ,
+ (int) getpid(),
+ logfile? conf.logfile_arg : "stderr",
+ snapshot_currently_being_removed?
+ snapshot_currently_being_removed->name : "(none)",
+ path_to_last_complete_snapshot?
+ path_to_last_complete_snapshot : "(none)",
+ name_of_reference_snapshot?
+ name_of_reference_snapshot : "(none)",
+ hook_status_description[snapshot_creation_status],
+ hook_status_description[snapshot_removal_status]
+ );
+ if (create_pid != 0)
+ fprintf(log,
+ "create_pid: %" PRId32 "\n"
+ "create process is %sstopped\n"
+ ,
+ create_pid,
+ create_process_stopped? "" : "not "
+ );
+ if (remove_pid != 0)
+ fprintf(log, "remove_pid: %" PRId32 "\n", remove_pid);
+ if (next_snapshot_time != 0)
+ fprintf(log, "next snapshot due in %" PRId64 " seconds\n",
+ next_snapshot_time - now);
+ if (current_snapshot_creation_time != 0)
+ fprintf(log, "current_snapshot_creation_time: %"
+ PRId64 " (%" PRId64 " seconds ago)\n",
+ current_snapshot_creation_time,
+ now - current_snapshot_creation_time
+ );
+ if (next_removal_check.tv_sec != 0) {
+ fprintf(log, "next removal check: %llu (%llu seconds ago)\n",
+ (long long unsigned)next_removal_check.tv_sec,
+ now - (long long unsigned)next_removal_check.tv_sec
+ );
+
+ }
+ fprintf(log, "%s </%s config> %s\n", dash, msg, dash);
+}
/* a litte cpp magic helps to DRY */
#define COMMANDS \
va_end(argp);
}
-static int disk_space_low(void)
-{
- struct disk_space ds;
- int ret = get_disk_space(".", &ds);
-
- if (ret < 0)
- return ret;
- if (conf.min_free_mb_arg)
- if (ds.free_mb < conf.min_free_mb_arg)
- return 1;
- if (conf.min_free_percent_arg)
- if (ds.percent_free < conf.min_free_percent_arg)
- return 1;
- if (conf.min_free_percent_inodes_arg)
- if (ds.percent_free_inodes < conf.min_free_percent_inodes_arg)
- return 1;
- return 0;
-}
-
static void dss_get_snapshot_list(struct snapshot_list *sl)
{
get_snapshot_list(sl, conf.unit_interval_arg, conf.num_intervals_arg);
const char *why;
int low_disk_space;
- ret = disk_space_low();
+ ret = disk_space_low(NULL);
if (ret < 0)
return ret;
low_disk_space = ret;
conf.logfile_given = 1;
}
}
- if (conf.logfile_given) {
+ if (conf.logfile_given && conf.run_given && conf.daemon_given) {
logfile = open_log(conf.logfile_arg);
log_welcome(conf.loglevel_arg);
}
return dss_chdir(conf.dest_dir_arg);
}
-static void dump_dss_config(const char *msg)
-{
- if (conf.loglevel_arg > INFO)
- return;
- DSS_INFO_LOG("%s\n", msg);
- cmdline_parser_dump(logfile? logfile : stderr, &conf);
-}
-
static int handle_sighup(void)
{
int ret;
DSS_NOTICE_LOG("SIGHUP, re-reading config\n");
- dump_dss_config("current config");
+ dump_dss_config("old");
ret = parse_config_file(1);
if (ret < 0)
return ret;
- dump_dss_config("new config");
+ dump_dss_config("reloaded");
invalidate_next_snapshot_time();
return change_to_dest_dir();
}
}
if (conf.daemon_given)
daemon_init();
- dump_dss_config("dss configuration");
ret = change_to_dest_dir();
if (ret < 0)
goto out;
+ dump_dss_config("startup");
ret = setup_signal_handling();
if (ret < 0)
goto out;
-# Copyright (C) 2008-2009 Andre Noll <maan@systemlinux.org>
+# Copyright (C) 2008-2010 Andre Noll <maan@systemlinux.org>
#
# Licensed under the GPL v2. For licencing details see COPYING.
package "dss"
-version "0.1.3"
+version "0.1.4"
purpose "the dyadic snapshot scheduler
dss creates hardlink-based snapshots of a given directory on a remote
"Logfile for the dss daemon process"
string typestr="filename"
optional
- details="
- This option is mostly useful for the run command if --daemon
- is also given.
+ details = "
+ This option is only honored if both --run and --daemon are
+ given. Otherwise it is silently ignored and log output is
+ written to stderr.
"
##################
#~~~~~~~~~~~~~~~~~~~~~~~~~~
"Executed before snapshot creation"
string typestr="command"
-default = "/bin/true"
+default = "true"
optional
details="
Execute this command before trying to create a new snapshot.
#~~~~~~~~~~~~~~~~~~~~~~~~~~
"Executed after snapshot creation"
string typestr="command"
-default = "/bin/true"
+default = "true"
optional
details="
Execute this after a snapshot has successfully been
#~~~~~~~~~~~~~~~~~~~~~~~~~~
"Executed before snapshot removal"
string typestr="command"
-default = "/bin/true"
+default = "true"
optional
details="
Execute this command before removing a snapshot. The full
#~~~~~~~~~~~~~~~~~~~~~~~~~~
"Executed after snapshot removal"
string typestr="command"
-default = "/bin/true"
+default = "true"
optional
details="
Execute this after a snapshot has successfully been removed. As
#~~~~~~~~~~~~~~~~~~~
"Executed if run command exits"
string typestr="command"
-default = "/bin/true"
+default = "true"
optional
details="
This hook is only used if the --run command was given which
Note that not every file system supports the concept of inodes.
Moreover it is not possible to reliably detect whether this is
the case. Therefore this feature is disabled by default. It's
- safe to enable it for ext3 file systems on linux though.
+ safe to enable it for ext2/ext3/ext4 file systems on linux
+ though.
A value of zero (the default) deactivates this check.
"