Add dss.png to .gitignore.
[dss.git] / dss.ggo
diff --git a/dss.ggo b/dss.ggo
index 6e222d27727a8e201e825e234213426662a8cb64..12871eaa9eabd78bb8006f2ca2b636b2c486dd92 100644 (file)
--- a/dss.ggo
+++ b/dss.ggo
@@ -1,6 +1,9 @@
+# Copyright (C) 2008-2010 Andre Noll <maan@tuebingen.mpg.de>
 #
+# Licensed under the GPL v2. For licencing details see COPYING.
+
 package "dss"
-version "0.0.3"
+version "0.1.7"
 purpose "the dyadic snapshot scheduler
 
 dss creates hardlink-based snapshots of a given directory on a remote
@@ -35,14 +38,12 @@ option "daemon" d
 #~~~~~~~~~~~~~~~~
 "Run as background daemon"
 flag off
-dependon="logfile"
 details="
-       Note that dss refuses to start in daemon mode if no logfile
-       was specified. This option is mostly useful in conjuction
-       with the -R option described below.
+       This option is mostly useful in conjunction with the -R option
+       described below.
 
-       Note that it is not possible to change whether dss runs as
-       background daemon by sending SIGHUP.
+       Note that it is not possible to change whether dss runs as background
+       daemon by sending SIGHUP.
 "
 
 option "dry-run" D
@@ -74,17 +75,27 @@ option "logfile" -
 "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.
+default="/dev/null"
+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.
+
+       The default value means that nothing will be logged in daemon mode
+       unless this option is given.
 "
 
+##################
+section "Commands"
+##################
+
 defgroup "command"
 #=================
 groupdesc="
        dss supports a couple of commands each of which corresponds
        to a different command line option. Exactly one of these
        options must be given.
+
 "
 required
 
@@ -99,13 +110,20 @@ details="
 
 groupoption "prune" P
 #~~~~~~~~~~~~~~~~~~~~
-"Remove a redundant snapshot"
+"Remove redundant and outdated snapshots"
 group="command"
 details="
-       A snapshot is considered redundant if it ether belongs to
-       an interval greater than the maximum number of intervals,
-       or if it belongs to an interval that already contains more
-       than the desired number of snapshots.
+       A snapshot is considered outdated if its interval number
+       is greater or equal than the specified number of unit
+       intervals. See the \"Intervals\" section below for the precise
+       definition of these terms.
+
+       A snapshot is said to be redundant if it belongs to an
+       interval that already contains more than the desired number
+       of snapshots.
+
+       The prune command gets rid of both outdated and redundant
+       snapshots.
 "
 
 groupoption "ls" L
@@ -124,7 +142,28 @@ groupoption "run" R
 group="command"
 details="
        This is the main mode of operation. Snapshots will be created
-       as needed and pruned automatically.
+       in an endless loop as needed and pruned automatically. The loop
+       only terminates on fatal errors or if a terminating signal was
+       received. See also the --exit-hook option.
+"
+
+groupoption "kill" K
+#~~~~~~~~~~~~~~~~~~~
+"Kill a running dss process"
+group="command"
+details="
+       This sends SIGTERM to the dss process that corresponds to the
+       given config file. If --dry-run is given, the PID of the dss
+       process is written to stdout, but no signal is sent.
+"
+
+groupoption "reload" -
+#~~~~~~~~~~~~~~~~~~~~~
+"force a running dss process to reload its config file"
+group="command"
+details="
+       This differs from --kill only in that SIGHUP rather than SIGTERM
+       is sent to the dss process.
 "
 
 ###############################
@@ -177,6 +216,21 @@ details="
        dss.
 "
 
+option "no-resume" -
+#~~~~~~~~~~~~~~~~~~~
+"Do not try to resume from previous runs"
+flag off
+details = "
+       Starting from version 0.1.4, dss tries to resume from a
+       previously cancelled dss instance by default. It does so by
+       looking at the status of the most recently created snapshot. If
+       this snapshot status is incomplete, its directory is reused
+       as the destination directory for a subsequent rsync run.
+
+       The --no-resume option deactivates this feature so that a new
+       directory is always used as the rsync destination directory.
+"
+
 option "rsync-option" O
 #~~~~~~~~~~~~~~~~~~~~~~
 "Further rsync options"
@@ -184,15 +238,33 @@ string typestr="option"
 optional
 multiple
 details="
-       These option may be given multiple times. The arguments passed
-       to that option are passed verbatim to the rsync command.
+       This option may be given multiple times. The given argument is
+       passed verbatim to the rsync command. Note that in order to use
+       rsync options that require an argument, you have to specify the
+       option and its argument as separate --rsync-options, like this:
+
+               --rsync-option --exclude --rsync-option /proc
 "
 
-option "exclude-patterns" e
-#~~~~~~~~~~~~~~~~~~~~~~~~~~
-"Rsync exclude patterns"
-string typestr="path"
+option "max-rsync-errors" -
+"Terminate after this many rsync failures"
+int typestr="count"
+default="10"
 optional
+details="
+       Only relevant when operating in --run mode (see above). If
+       the rsync process exits with a fatal error, dss restarts
+       the command in the hope that the problem is transient
+       and subsequent rsync runs succeed. After the given number
+       of consecutive rsync error exits, however, dss gives up,
+       executes the exit hook and terminates. Set this to zero if
+       dss should exit immediately on the first rsync error.
+
+       The only non-fatal error is when rsync exits with code 24. This
+       indicates a partial transfer due to vanished source files
+       and happens frequently when snapshotting a directory which
+       is concurrently being modified.
+"
 
 ###################
 section "Intervals"
@@ -205,21 +277,21 @@ int typestr="days"
 default="4"
 optional
 details="
-       dss snapshot aging is implemented in terms of intervals. There
-       are two command line options related to intervals: the
-       duration u of a \"unit\" interval and the number n of those
-       unit intervals.
-
-       dss removes any snapshots older than n times u and tries to
-       keep 2^(k-1) snapshots in interval k, where the interval number
-       k counts from zero, zero being the most recent unit interval.
-
-       In other words, the oldest snapshot will at most be u * n days
-       (= 20 days if default values are used) old.  Moreover, there
-       are at most 2^n - 1 snapshots in total (i. e. 31 by default).
-       Observe that you have to create at least 2 ^ (n - 1) snapshots
-       each interval for this to work out because that is the number
-       of snapshots in interval zero.
+       Snapshot aging is implemented in terms of intervals. There are two
+       command line options related to intervals: the duration u of a unit
+       interval and the number of unit intervals, denoted n below.
+
+       dss removes snapshots older than n times u and tries to keep 2^(n -
+       k - 1) snapshots in interval k, where the interval number k counts
+       from zero to n - 1, with zero being the most recent unit interval.
+
+       Hence the oldest snapshot will at most be u * n days old (4 days *
+       5 intervals = 20 days, if default values are used). Moreover, there
+       are at most 2^n - 1 snapshots in total (2^5 - 1 = 31 by default). Note
+       that for this to work out your system must be fast enough to create at
+       least 2^(n - 1) snapshots per unit interval (16 snapshots in 4 days =
+       one snapshot in 6 hours), because this is the number of snapshots in
+       interval zero.
 "
 
 option "num-intervals" n
@@ -228,6 +300,10 @@ option "num-intervals" n
 int typestr="num"
 default="5"
 optional
+details="
+       Note that increasing this number by one doubles the total number of
+       snapshots. See the documentation of --unit-interval above.
+"
 
 ###############
 section "Hooks"
@@ -237,6 +313,7 @@ option "pre-create-hook" r
 #~~~~~~~~~~~~~~~~~~~~~~~~~~
 "Executed before snapshot creation"
 string typestr="command"
+default = "true"
 optional
 details="
        Execute this command before trying to create a new snapshot.
@@ -255,16 +332,69 @@ option "post-create-hook" o
 #~~~~~~~~~~~~~~~~~~~~~~~~~~
 "Executed after snapshot creation"
 string typestr="command"
+default = "true"
 optional
 details="
        Execute this after a snapshot has successfully been
-       created. The full path of the newly created snapshot is passed
-       to the hook as the first argument.  The return value of that
-       hook is ignored.
+       created. The full path of the newly created snapshot is
+       passed to the hook as the first argument.  The exit code of
+       this hook is ignored.
 
        For instance this hook can be used to count the number of
        files per user and/or the disk usage patterns in order to
-       store them in a database for further treatment.
+       store them in a database for further analysis.
+"
+
+option "pre-remove-hook" -
+#~~~~~~~~~~~~~~~~~~~~~~~~~~
+"Executed before snapshot removal"
+string typestr="command"
+default = "true"
+optional
+details="
+       Execute this command before removing a snapshot. The full
+       path to the snapshot about to be deleted is passed to the
+       command as the first argument. If the command returns with
+       a non-zero exit status, no snapshot is being removed and the
+       operation is retried later.
+
+       For example, one might want to execute a script that checks
+       whether the snapshot to be deleted is currently used by
+       another process, e.g. by a tape-based backup system that runs
+       concurrently to dss.
+
+       Another possible application of this is to record disk-usage
+       patterns before and after snapshot removal.
+"
+
+option "post-remove-hook" -
+#~~~~~~~~~~~~~~~~~~~~~~~~~~
+"Executed after snapshot removal"
+string typestr="command"
+default = "true"
+optional
+details="
+       Execute this after a snapshot has successfully been removed. As
+       for the pre-remove hook, the full path of the removed snapshot
+       is passed to the hook as the first argument. The exit code
+       of this hook is ignored.
+"
+
+option "exit-hook" e
+#~~~~~~~~~~~~~~~~~~~
+"Executed if run command exits"
+string typestr="command"
+default = "true"
+optional
+details="
+       This hook is only used if the --run command was given which
+       instructs dss to run in an endless loop. The exit-hook gets
+       executed whenever this endless loop terminates. The reason
+       for terminating the loop is passed as the first argument.
+
+       One possible application for this hook is to send email to the
+       system administrator to let her know that no more snapshots
+       are going to be created.
 "
 
 ###############################
@@ -278,15 +408,15 @@ int typestr="megabytes"
 default="100"
 optional
 details="
-       If less than this many megabytes of space is available on
-       the file system containing the destination directory, \"dss
-       --run\" will suspend the currently running rsync process and will
-       start to remove snapshots, starting from the oldest snapshot,
-       until the free disk space exceeds this value.  See also the
-       --min_free_percent option.
+       If disk space on the file system containing the destination
+       directory gets low, \"dss --run\" will suspend the currently
+       running rsync process and will start to remove snapshots in
+       order to free disk space. This option specifies the minimal
+       amount of free disk space. If less than the given number of
+       megabytes is available, snapshots are being deleted. See also
+       the --min_free_percent and the min-free-percent-inodes options.
 
        A value of zero deactivates this check.
-
 "
 
 option "min-free-percent" p
@@ -296,7 +426,58 @@ int typestr="percent"
 default="2"
 optional
 details="
-       See --min-free-mb.  Note that it is not recommended to set both
+       See --min-free-mb. Note that it is not recommended to set both
        --min-free-mb and --min-free-percent to zero as this will
        cause your file system to fill up quickly.
 "
+option "min-free-percent-inodes" i
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+"Minimal percent of free inodes"
+int typestr="percent"
+default="0"
+optional
+details="
+       Specify the minimum amount of free inodes on the file system
+       containing the destination dir. If less than that many inodes
+       are free, snapshot removal kicks in just as in case of low
+       disk space.
+
+       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 ext2/ext3/ext4 file systems on linux
+       though.
+
+       A value of zero (the default) deactivates this check.
+"
+
+option "keep-redundant" k
+#~~~~~~~~~~~~~~~~~~~~~~~~
+"Prune by disk space only"
+flag off
+details="
+       By default, redundant and outdated snapshots are removed automatically
+       to keep the number of snapshots in harmony with the configured
+       policy. If this flag is given, dss removes such snapshots only if
+       disk space or number of free inodes becomes low.
+"
+
+option "min-complete" -
+#~~~~~~~~~~~~~~~~~~~~~~
+"Minimal number of complete snapshots to keep"
+int typestr = "num"
+default = "1"
+optional
+details = "
+       This option is only relevant if snapshots must be deleted
+       because disk space gets low.
+
+       dss refuses to remove old snapshots if there are fewer complete
+       snapshots left than the given number. The default value of one
+       guarantees that at least one complete snapshot is available
+       at all times.
+
+       If only <num> complete snapshot are left, and there is not
+       enough disk space available for another snapshot, the program
+       terminates with a \"No space left on device\" error.
+"