In order to print the list of all snapshots created so far, use
- dss --list
+ dss --ls
Yes, it's really that easy. Of course, dss supports many more
features and config options such as taking snapshots from remote
clean:
rm -f *.o dss dss.1 dss.1.html Makefile.deps *.ppm *.png *~ cmdline.c cmdline.h index.html
-index.html: dss.1.html index.html.in INSTALL README
+index.html: dss.1.html index.html.in INSTALL README NEWS
sed -e '/@README@/,$$d' index.html.in > $@
grutatxt -nb < README >> $@
- sed -e '1,/@README@/d' -e '/@INSTALL@/,$$d' index.html.in >> $@
+ sed -e '1,/@README@/d' -e '/@NEWS@/,$$d' index.html.in >> $@
+ grutatxt -nb < NEWS >> $@
+ sed -e '1,/@NEWS@/d' -e '/@INSTALL@/,$$d' index.html.in >> $@
grutatxt -nb < INSTALL >> $@
sed -e '1,/@INSTALL@/d' -e '/@MAN_PAGE@/,$$d' index.html.in >> $@
sed -e '1,/Return to Main Contents/d' -e '/Index/,$$d' dss.1.html >> $@
--- /dev/null
+0.1.4 (2010-11-08)
+~~~~~~~~~~~~~~~~~~
+This version of dss contains some new features, many improvements of
+existing features and several bug fixes.
+
+Support for resuming snapshot creation after restart has been added
+and snapshot removal is deferred until at least one current snapshot
+exists. The internal handling of the various hooks has been simplified
+and many error messages have been clarified. On SIGHUP, dss now writes
+its configuration and internal state to the log file.
+
+0.1.3 (2009-06-06)
+~~~~~~~~~~~~~~~~~~
+You can now specify pre-rm/post-rm-hooks that are executed whenever
+a snapshot is deleted. This release adds better compatibility with
+rsync 3.0, and avoids busy loops when automatically restarting the
+rsync process.
+
+0.1.2 (2009-03-05)
+~~~~~~~~~~~~~~~~~~
+This release includes the reason why a snapshot gets removed in the
+log message. It will never remove the snapshot that is currently
+being created. It will really pass the full path to the last complete
+snapshot in the post_create_hook.
+
+0.1.1 (2008-11-13)
+~~~~~~~~~~~~~~~~~~
+This release prevents busy loops on rsync exit code 13. It ignores
+any snapshot directory with creation time > completion time. It
+opens /dev/null for reading and writing when executing rsync. It shows
+human readable snapshot creation duration when listing snapshots. It
+restarts the rsync process if it returned with exit code 13.
+
+0.1.0 (2008-10-10)
+~~~~~~~~~~~~~~~~~~
+Initial public release.
/*
- * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * 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.
*/
/*
- * 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;
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
#~~~~~~~~~~~~~~~~~~~~~~~~~~
"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.
"
/*
- * Copyright (C) 2006-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * Copyright (C) 2003-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2003-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * Copyright (C) 2006-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * Copyright (C) 2006-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
<hr>
[<a href="#readme">README</a>]
+ [<a href="#news">NEWS</a>]
[<a href="#download">Download</a>]
[<a href="#install">INSTALL</a>]
[<a href="#license">License</a>]
<hr>
+ <center>
+ <h2>
+ <a name="news">NEWS</a>
+ </h2>
+ </center>
+
+ @NEWS@
+
+ <hr>
<center>
<h2>
<a href="http://git.tuebingen.mpg.de/cgi-bin/gitweb.cgi?p=dss.git;a=snapshot;h=HEAD;sf=tgz">tarball</a>
- of the current tree. If you prefer to download the tarball of
+ of the current master branch. If you prefer to download the tarball of
the latest release, select the corresponding <em>snapshot</em>
link on the
<p> André Noll, <a
href="mailto:maan@systemlinux.org">maan@systemlinux.org</a>
- </p> Comments and bug reports are welcome Please provide
+ </p> Comments and bug reports are welcome. Please provide
enough info such as the version of dss you are using and
relevant parts of the logs. Including the string [dss] in
the subject line is also a good idea.
/*
- * Copyright (C) 1997-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * Copyright (C) 2004-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2004-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * Copyright (C) 2007-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * 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.
*/
/*
- * 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.
*/
+
/** The possible states for snapshot creation/removal. */
-enum hook_status {
- /** We are ready to take the next snapshot. */
- HS_READY,
- /** The pre-create/pre-remove hook has been started. */
- HS_PRE_RUNNING,
- /** The pre-create/pre-remove hook exited successfully. */
- HS_PRE_SUCCESS,
- /** The rsync/rm process is running. */
- HS_RUNNING,
- /** The rsync/rm process exited successfully. */
- HS_SUCCESS,
- /** The rsync/rm process needs to be restarted. */
- HS_NEEDS_RESTART,
- /** The post-create/post-remove hook has been started. */
- HS_POST_RUNNING,
-};
+#define HOOK_STATUS_ARRAY \
+ HSA_ITEM(HS_READY, "ready for action"), \
+ HSA_ITEM(HS_PRE_RUNNING, "pre-hook running"), \
+ HSA_ITEM(HS_PRE_SUCCESS, "pre-hook completed successfully"), \
+ HSA_ITEM(HS_RUNNING, "in progress"), \
+ HSA_ITEM(HS_SUCCESS, "process terminated successfully"), \
+ HSA_ITEM(HS_NEEDS_RESTART, "restart needed"), \
+ HSA_ITEM(HS_POST_RUNNING, "post-hook running"), \
+
+
+#define HSA_ITEM(x, y) x
+enum hook_status {HOOK_STATUS_ARRAY};
+#undef HSA_ITEM
+#define HSA_ITEM(x, y) [x] = y
+
/**
* The status of a snapshot.
/*
- * Copyright (C) 2004-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2004-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/*
- * Copyright (C) 2005-2009 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2010 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/