bin/pvl.backup-snapshot
author Tero Marttila <tero.marttila@aalto.fi>
Mon, 28 Jul 2014 13:14:53 +0300
changeset 80 b332d99f988e
parent 65 462cecaa70d0
permissions -rwxr-xr-x
update for pvl.args; fixing -c/command and --config option dupliates
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/python
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Manage rsync --link-dest based snapshots.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
    rsync's from <src> to <dst>/snapshots/YYYY-MM-DD-HH-MM-SS using --link-dest <dst>/current.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
    Updates symlink <dst>/current -> <dst>/snapshots/...
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
    Then archives <dst>/current to <dst>/<period>/<date> using --link-dest.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
"""
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
80
b332d99f988e update for pvl.args; fixing -c/command and --config option dupliates
Tero Marttila <tero.marttila@aalto.fi>
parents: 65
diff changeset
    13
import pvl.args
30
29b60df79122 version: 0.2.3; move version to pvl.backup.__version__; add --version opt
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    14
from pvl.backup import __version__
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
    15
from pvl.backup import rsync, invoke
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    17
import optparse, ConfigParser
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
import os, os.path, stat
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
    19
import shutil, glob
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
import datetime
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
import logging
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
62
86ba7b12a7c9 bin: fix logging progname prefix
Tero Marttila <terom@paivola.fi>
parents: 59
diff changeset
    23
log = logging.getLogger('main')
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
36
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
    25
# command-line options, global state
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
options = None
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    28
def parse_options (argv, defaults) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
        Parse command-line arguments.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    parser = optparse.OptionParser(
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
            prog        = argv[0],
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
    35
            usage       = '%prog: [options] [ --config <path> | --target <path> [ --source <src> ] [ --interval <name> ] ]',
30
29b60df79122 version: 0.2.3; move version to pvl.backup.__version__; add --version opt
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
    36
            version     = __version__,
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
            # module docstring
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
            # XXX: breaks multi-line descriptions..
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
            description = __doc__,
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    )
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
80
b332d99f988e update for pvl.args; fixing -c/command and --config option dupliates
Tero Marttila <tero.marttila@aalto.fi>
parents: 65
diff changeset
    43
    parser.add_option_group(pvl.args.parser(parser, config=False))
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    45
    # rsync
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    46
    rsync = optparse.OptionGroup(parser, "rsync Options")
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    47
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    48
    rsync.add_option('--exclude-from',       metavar='FILE',
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    49
        help="Read exclude rules from given file")
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    50
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    51
    rsync.add_option('--include-from',       metavar='FILE',
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    52
        help="Read include rules from given file")
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    53
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    54
    parser.add_option_group(rsync)
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    55
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    56
    # global
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
    parser.add_option('--clean-intervals',  action='store_true',
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
        help="Clean out old interval links")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
    parser.add_option('--clean-snapshots',  action='store_true',
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
        help="Clean out unused snapshots (those not linked to)")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    parser.add_option('--clean',             action='store_true',
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        help="Clean out both intervals and snapshots")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
    66
    parser.add_option('-n', '--noop',       action='store_true',
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        help="Don't actually clean anything")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    69
    #
80
b332d99f988e update for pvl.args; fixing -c/command and --config option dupliates
Tero Marttila <tero.marttila@aalto.fi>
parents: 65
diff changeset
    70
    parser.add_option('-c', '--config',    metavar='FILE/DIR', action='append',    # multi
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
    71
        help="Load configuration file(s)")
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    72
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
    73
    parser.add_option('-r', '--run',        metavar='NAME',
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
    74
        help="Run given set of targets, per config [run/...]")
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
    75
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    76
    #
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
    77
    parser.add_option('-T', '--target',    metavar='PATH',
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
    78
        help="Target path")
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    79
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
    80
    parser.add_option('-s', '--source',     metavar='RSYNC-PATH', dest='target_source', default=False,
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
    81
        help="Run target backup from source in rsync-syntax")
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    82
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    83
    parser.add_option('--interval',         metavar='NAME', action='append', dest='target_intervals',
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
    84
        help="Run target with given given interval(s)")
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    85
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    86
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    # defaults
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    parser.set_defaults(
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
    89
        config              = [],
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
    90
        target_intervals    = [],
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    91
    )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    92
    parser.set_defaults(**defaults)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
    # parse
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    options, args = parser.parse_args(argv[1:])
80
b332d99f988e update for pvl.args; fixing -c/command and --config option dupliates
Tero Marttila <tero.marttila@aalto.fi>
parents: 65
diff changeset
    96
    
b332d99f988e update for pvl.args; fixing -c/command and --config option dupliates
Tero Marttila <tero.marttila@aalto.fi>
parents: 65
diff changeset
    97
    # general logging/etc
b332d99f988e update for pvl.args; fixing -c/command and --config option dupliates
Tero Marttila <tero.marttila@aalto.fi>
parents: 65
diff changeset
    98
    pvl.args.apply(options)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
    if options.clean :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        options.clean_intervals = options.clean_snapshots = options.clean
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   103
    if options.include_from :
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   104
        options.rsync_options['include-from'] = options.include_from
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   105
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   106
    if options.exclude_from :
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   107
        options.rsync_options['exclude-from'] = options.exclude_from
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   108
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
    return options, args
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
21
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   111
## Configuration
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   112
class ConfigError (Exception) :
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   113
    pass
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   114
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   115
def process_config_name (name) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
    """
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   117
        Process config file name into python version
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   120
    return name.replace('-', '_')
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   122
def parse_config (path, defaults) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   123
    """
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   124
        Parse given config file, returning updated set of configs based on given defaults.
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   125
    """
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   127
    log.debug("loading config: %s", path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   129
    config = dict(defaults)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   130
    config_file = ConfigParser.RawConfigParser()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   131
    config_file.read([path])
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   133
    # handle each section
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   134
    for section in config_file.sections() :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   135
        # mangle
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   136
        section_name = process_config_name(section)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   137
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   138
        log.debug("section: %s", section_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   139
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   140
        # subsections
36
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   141
        if ':' in section_name :
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   142
            # legacy!
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   143
            section_path = section_name.split(':')
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   144
        else :
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   145
            # new! shiny!
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   146
            section_path = section_name.split('/')
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   147
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   148
        # lookup section dict from config
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   149
        lookup = config
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   150
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   151
        # XXX: sections are not in order, so we can't rely on the parent section being created before we handle the sub-section
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   152
        for name in section_path :
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   153
            # possibly create
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   154
            if name not in lookup :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   155
                lookup[name] = {}
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   156
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   157
            lookup = lookup[name]
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   158
 
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   159
        # found dict for this section
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   160
        config_section = lookup
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   161
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   162
        # values
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   163
        for name, value in config_file.items(section) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   164
            # mangle
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   165
            name = process_config_name(name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   166
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   167
            log.debug("section: %s: %s = %s", '/'.join(section_path), name, value)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   168
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   169
            config_section[name] = value
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   170
    
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   171
    log.debug("config: %s", config)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   172
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   173
    return config
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   174
21
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   175
def config_bool (name, value, strict=True) :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   176
    if value.lower() in ('yes', 'true', '1', 'on') :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   177
        return True
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   178
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   179
    elif value.lower() in ('no', 'false', '0', 'off') :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   180
        return False
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
21
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   182
    elif strict :
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   183
        raise ConfigError("Unrecognized boolean value: {name} = {value}".format(name=name, value=value))
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   184
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
    else :
21
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   186
        # allow non-boolean values
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   187
        return value
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
37
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   189
def config_int (name, value, default=False) :
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   190
    if not value and default is not False:
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   191
        # returning default value if one is given
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   192
        return default
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   193
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   194
    try :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   195
        return int(value)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   197
    except ValueError, e:
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   198
        raise ConfigError("Invalid integer value: {name} = {value}".format(name=name, value=value))
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   200
def config_list (name, value) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   201
    return value.split()
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
def walk_symlinks (tree, ignore=False) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
        Walk through all symlinks in given dir, yielding:
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
            (dirpath, name, target)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
        Passes through errors from os.listdir/os.lstat.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
    for name in os.listdir(tree) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
        if ignore and name in ignore :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
            log.debug("%s: ignore: %s", tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
            continue
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        path = os.path.join(tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
        # stat symlink itself
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
        st = os.lstat(path)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
        if stat.S_ISDIR(st.st_mode) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
            # recurse
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
            log.debug("%s: tree: %s", tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
            for item in walk_symlinks(path) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
                yield item
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
        elif stat.S_ISLNK(st.st_mode) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
            # found
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
            target = os.readlink(path)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
            log.debug("%s: link: %s -> %s", tree, name, target)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   235
            yield tree, name, target
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
        else :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
            log.debug("%s: skip: %s", tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   241
class Interval (object) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
    """
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   243
        An interval definition.
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   246
    @classmethod
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   247
    def from_config (cls, options, name,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   248
        format,
37
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   249
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   250
        # deprecated
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   251
        keep    = None,
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   252
    ) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   253
        if not format :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   254
            # magic to use snapshot name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   255
            _format = None
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   256
        else :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   257
            _format = format
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   259
        return cls(name, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   260
            format  = _format, 
37
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   261
            keep    = config_int('keep', keep, default=None),
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   262
        )
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
16
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   264
    @classmethod
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   265
    def from_target_config (cls, name, base, arg) :
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   266
        if isinstance(arg, dict) :
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   267
            # full instance
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   268
            return cls(name,
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   269
                format  = arg.get('format', base.format if base else None),
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   270
                keep    = arg.get('keep', base.keep if base else None),
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   271
            )
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   272
        else :
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   273
            # partial instance with keep
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   274
            return cls(name,
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   275
                format  = base.format,
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   276
                keep    = config_int('keep', arg) if arg else base.keep,
16
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   277
            )
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   278
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   279
    def __init__ (self, name, format, keep) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   280
        self.name = name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   281
        self.format = format
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   282
        self.keep = keep
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   283
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   284
    def __str__ (self) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   285
        return self.name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   286
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   287
class SnapshotError (Exception) :
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   288
    """
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   289
        An error handling Target.snapshot()
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   290
    """
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   291
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   292
    pass
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   293
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   294
class Target (object) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   295
    """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   296
        A target run, i.e. a rsync-snapshot destination dir
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   297
            
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   298
        [target:...]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   299
    """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   300
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   301
    @classmethod
35
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   302
    def config_intervals (cls, name, intervals) :
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   303
        for interval, arg in intervals.iteritems() :
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   304
            # lookup base from options.intervals
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   305
            try :
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   306
                base = options.intervals[process_config_name(interval)]
35
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   307
            except KeyError:
36
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   308
                raise ConfigError("Unknown interval for [target/{target}]: {interval}".format(target=name, interval=interval))
35
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   309
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   310
            # parse
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   311
            yield Interval.from_target_config(interval, base, arg)
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   312
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   313
    # type() mapping for lvm_options
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   314
    LVM_OPTIONS = dict(
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   315
        wait    = float,
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   316
        size    = str,
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   317
    )
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   318
35
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   319
    @classmethod
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   320
    def from_config (cls, options, name,
53
f17c2733417a pvl.backup-snapshot: fix --target
Tero Marttila <terom@paivola.fi>
parents: 45
diff changeset
   321
        path            = None,
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   322
        source          = None,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   323
        enable          = 'no',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   324
        exclude_from    = None,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   325
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   326
        # subsections
16
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   327
        intervals       = None,
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   328
        rsync_options   = None,
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   329
        lvm_options     = {},
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   330
    ) :
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   331
        if not source and source is not False :
36
6070507e09ce change rsync-snapshot.conf to use [foo/bar] syntax, because
Tero Marttila <terom@paivola.fi>
parents: 35
diff changeset
   332
            raise ConfigError("Missing required option: source for [target/{name}]".format(name=name))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   333
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   334
        # process lvm opts by LVM_OPTIONS types
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   335
        lvm_options = dict((opt, cls.LVM_OPTIONS[opt](value)) for opt, value in lvm_options.iteritems())
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   336
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   337
        # parse source -> rsync.RSyncServer
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   338
        source_path = source
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   339
        source = rsync.parse_source(source, lvm_opts=lvm_options)
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   340
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   341
        log.debug("parse source: %r -> %s", source_path, source)
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   342
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   343
        # global defaults
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   344
        _rsync_options = dict(options.rsync_options)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   345
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   346
        if rsync_options :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   347
            # override
21
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   348
            _rsync_options.update([
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   349
                # parse
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   350
                (option, config_bool(option, value, strict=False)) for option, value in rsync_options.iteritems()
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   351
            ])
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   352
37
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   353
        if not intervals :
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   354
            raise ConfigError("Missing required [target/{name}/intervals]".format(name=name))
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   355
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   356
        # lookup intervals
35
b6c0bdd6d8d4 rsync-snapshot: better ConfigError for referencing invalid [interval:..] from [target:...:intervals]; tidy up INFO output a little
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   357
        _intervals = list(cls.config_intervals(name, intervals))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   358
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   359
        return cls(name, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   360
            path            = path if path else name,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   361
            source          = source,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   362
            enable          = config_bool('enable', enable),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   363
            intervals       = _intervals,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   364
            rsync_options   = _rsync_options,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   365
            exclude_from    = exclude_from,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   366
        )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   367
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   368
    def __init__ (self, name,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   369
        path,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   370
        source, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   371
        enable          = False, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   372
        intervals       = [],
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   373
        rsync_options   = {},
59
b9c014c353a3 pvl.backup-snapshot: fix --link-dest for initial backup run
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
   374
b9c014c353a3 pvl.backup-snapshot: fix --link-dest for initial backup run
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
   375
        # XXX: not implemented?
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   376
        exclude_from    = None
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   377
    ) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   378
        self.name = name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   379
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   380
        self.path = path
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   381
        self.source = source
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   382
        self.enable = enable
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   383
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   384
        self.intervals = intervals
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   385
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   386
        self.rsync_options = rsync_options
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   387
        self.exclude_from = exclude_from
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   388
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   389
        # this snapshot?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   390
        self.snapshots_dir = os.path.join(self.path, 'snapshots')
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   391
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   392
        # 'current' symlink
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   393
        self.current_path = os.path.join(self.path, 'current')
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   394
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   395
    def prepare (self, options) :
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   396
        """
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   397
            Prepare dir for usage
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   398
        """
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   399
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   400
        if not os.path.exists(self.path) :
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   401
            raise Exception("Missing target dir: {path}".format(path=self.path))
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   402
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   403
        if not os.path.exists(self.snapshots_dir) :
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   404
            log.warn("Creating snapshots dir: %s", self.snapshots_dir)
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   405
            os.mkdir(self.snapshots_dir)
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   406
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   407
    def snapshot (self, options, now) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   408
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   409
            Perform the rsync from our source to self.snapshot_dir.
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   410
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   411
            Raises rsync.RsyncError or SnapshotError.
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   412
        """
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   413
       
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   414
        # new snapshot
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   415
        snapshot_name = now.strftime(options.snapshot_format)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   416
        snapshot_path = os.path.join(self.snapshots_dir, snapshot_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   417
        temp_path = os.path.join(self.snapshots_dir, 'tmp')
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   418
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   419
        if os.path.exists(temp_path) :
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   420
            raise SnapshotError("Old temp snapshot dir remains, please clean up: {path}".format(path=temp_path))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   421
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   422
        # link-dest from current?
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   423
        if os.path.exists(self.current_path) :
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   424
            # real path to target
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   425
            target = os.readlink(self.current_path)
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   426
            target_path = os.path.join(os.path.dirname(self.current_path), target)
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   427
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   428
            log.debug("%s: link-dest: %s", self, target_path)
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   429
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   430
            # use as link-dest base; hardlinks unchanged files; target directory must be empty
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   431
            link_dest = target_path
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   432
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   433
        else :
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   434
            link_dest = None
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   435
        
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   436
        # log
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   437
        log.info("%s: %s -> %s <- %s", self, self.source, snapshot_path, link_dest)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   438
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   439
        # build rsync options
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   440
        opts = dict(self.rsync_options)
59
b9c014c353a3 pvl.backup-snapshot: fix --link-dest for initial backup run
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
   441
        
b9c014c353a3 pvl.backup-snapshot: fix --link-dest for initial backup run
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
   442
        if link_dest :
b9c014c353a3 pvl.backup-snapshot: fix --link-dest for initial backup run
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
   443
            # rsync links absolute paths..
b9c014c353a3 pvl.backup-snapshot: fix --link-dest for initial backup run
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
   444
            opts['link-dest'] = os.path.abspath(link_dest)
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   445
        
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   446
        # to tempdir
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   447
        log.debug("rsync %s -> %s", self.source, temp_path)
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 41
diff changeset
   448
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   449
        try :
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   450
            # run the rsync.RSyncServer; None as a placeholder will get replaced with the actual source
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   451
            self.source.execute(invoke.optargs(**opts), srcdst=(None, temp_path))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   452
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   453
        except rsync.RsyncError as ex :
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   454
            # XXX:  leaves temp_path in place, which must be removed or cleaned up..
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   455
            #       maybe use {snapshot_name}.tmp instead?
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   456
            log.warn("%s: rsync failed:", self, exc_info=ex)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   457
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   458
            # run() handles this
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   459
            raise
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   460
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   461
        else :
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   462
            # move in to final name
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   463
            log.debug("rename %s -> %s", temp_path, snapshot_path)
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   464
            os.rename(temp_path, snapshot_path)
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   465
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   466
            return snapshot_name
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   467
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   468
    def interval (self, options, interval, now, snapshot_name) :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   469
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   470
            Update given <interval>/... links for this target, using the given new snapshot
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   471
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   472
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   473
        dir_path = os.path.join(self.path, interval.name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   474
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   475
        if not os.path.exists(dir_path) :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   476
            log.warn("%s/%s: Creating interval dir: %s", self, interval, dir_path)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   477
            os.mkdir(dir_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   478
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   479
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   480
        # name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   481
        if interval.format is None :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   482
            # per-snapshot
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   483
            name = snapshot_name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   484
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   485
            log.debug("%s: using snapshot_name: %s", interval, name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   486
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   487
        else :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   488
            # by date
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   489
            name = now.strftime(interval.format)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   490
            
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   491
            log.debug("%s: using interval.format: %s -> %s", interval, interval.format, name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   492
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   493
        # path
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   494
        path_name = os.path.join(interval.name, name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   495
        path = os.path.join(self.path, path_name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   496
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   497
        log.debug("%s: processing %s", interval, path_name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   498
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   499
        # already there?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   500
        if os.path.exists(path) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   501
            target = os.readlink(path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   502
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   503
            log.debug("%s: Keeping existing: %s -> %s", interval, name, target)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   504
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   505
        else :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   506
            # update
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   507
            target = os.path.join('..', 'snapshots', snapshot_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   508
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   509
            log.info("%s/%s: %s -> %s", self, interval, name, target)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   510
            log.debug("%s -> %s", path, target)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   511
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   512
            os.symlink(target, path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   513
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   514
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   515
    def clean_interval (self, options, interval) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   516
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   517
            Clean out given <interval>/... dir for this target.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   518
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   519
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   520
        # path
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   521
        dir_path = os.path.join(self.path, interval.name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   522
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   523
        if not os.path.exists(dir_path) :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   524
            log.warn("%s/%s: Skipping, no interval dir: %s", self, interval, dir_path)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   525
            return
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   526
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   527
        # configured
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   528
        keep = interval.keep
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   529
37
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   530
        if not keep :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   531
            log.info("%s/%s: Zero keep given, not cleaning up anything", self, interval)
37
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   532
            return
9103a9456087 rsync-snapshot: fail nicer-ly if no intervals are given; deprecate default keep intervals, just don't cleanup old snapshots if no keep is given
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   533
31
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   534
        # items to clean?
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   535
        items = os.listdir(dir_path)
31
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   536
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   537
        # sort newest -> oldest
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   538
        items.sort(reverse=True)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   539
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   540
        log.debug("%s/%s: Have %d / %d items", self, interval, len(items), keep)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   541
        log.debug("%s: items: %s", interval, ' '.join(items))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   542
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   543
        if len(items) > keep :
31
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   544
            # select oldest ones
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   545
            clean = items[keep:]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   546
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   547
            log.debug("%s/%s: cleaning out: %s", self, interval, ' '.join(clean))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   548
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   549
            for item in clean :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   550
                path = os.path.join(dir_path, item)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   551
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   552
                log.info("%s/%s: %s", self, interval, path)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   553
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   554
                if not options.noop :
31
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   555
                    log.debug("rmtree: %s", path)
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   556
                    os.unlink(path)
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   557
                else :
e946c741c500 rsync-snapshot: fix clean_interval to actually clean up the oldest snapshots, not the newest ones..
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   558
                    log.debug("dryrun: %s", path)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   559
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   560
    def clean_snapshots (self, options) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   561
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   562
            Clean out all snapshots for this target not linked to from within our root.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   563
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   564
            Fails without doing anything if unable to read the destination dir.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   565
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   566
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   567
        # real path to snapshots
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   568
        snapshots_path = os.path.realpath(os.path.abspath(self.snapshots_dir))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   569
        log.debug("real snapshots_path: %s", snapshots_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   570
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   571
        # set of found targets
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   572
        found = set()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   573
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   574
        # walk all symlinks
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   575
        for dirpath, name, target in walk_symlinks(self.path, ignore=set(['snapshots'])) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   576
            # target dir
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   577
            target_path = os.path.realpath(os.path.join(dirpath, target))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   578
            target_dir = os.path.dirname(target_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   579
            target_name = os.path.basename(target_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   580
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   581
            if target_dir == snapshots_path :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   582
                log.debug("%s: found: %s -> %s", dirpath, name, target_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   583
                found.add(target_name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   584
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   585
            else :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   586
                log.debug("%s: ignore: %s -> %s", dirpath, name, target_path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   587
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   588
        # discover all snapshots
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   589
        snapshots = set(os.listdir(snapshots_path))
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   590
63
4293baf688b1 pvl.backup-snapshot: do not clean out tmp snapshot..? Fixup special-case name
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   591
        # XXX: and ignore special names?
4293baf688b1 pvl.backup-snapshot: do not clean out tmp snapshot..? Fixup special-case name
Tero Marttila <terom@paivola.fi>
parents: 62
diff changeset
   592
        snapshots = snapshots - set(['tmp'])
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   593
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   594
        ## compare
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   595
        used = snapshots & found
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   596
        unused = snapshots - found
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   597
        broken = found - snapshots
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   598
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   599
        log.debug("%s: found used=%d, unused=%d, broken=%d snapshot symlinks", self, len(used), len(unused), len(broken))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   600
        log.debug("used=%s, unused=%s", used, unused)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   601
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   602
        if broken :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   603
            log.warn("%s: Found broken symlinks to snapshots: %s", self, ' '.join(broken))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   604
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   605
        if unused :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   606
            log.debug("%s: Cleaning out %d unused snapshots:", self, len(unused))
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   607
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   608
            for name in unused :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   609
                path = os.path.join(snapshots_path, name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   610
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   611
                log.info("%s: %s", self, name)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   612
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   613
                if not options.noop :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   614
                    log.debug("rmtree: %s", path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   615
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   616
                    # nuke
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   617
                    shutil.rmtree(path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   618
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   619
                else :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   620
                    log.debug("dry-run: %s", path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   621
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   622
    def run_snapshot (self, options, now) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   623
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   624
            Run snapshot + update current.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   625
        """
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   626
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   627
        # initial rsync
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   628
        # may fail with RsyncError
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   629
        snapshot_name = self.snapshot(options, now)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   630
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   631
        # update current
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   632
        log.debug("Updating current -> %s", snapshot_name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   633
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   634
        if os.path.islink(self.current_path) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   635
            # replace
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   636
            os.unlink(self.current_path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   637
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   638
        os.symlink(os.path.join('snapshots', snapshot_name), self.current_path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   639
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   640
        return snapshot_name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   641
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   642
    def run_intervals (self, options, now, snapshot_name) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   643
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   644
            Run our intervals.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   645
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   646
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   647
        if not self.intervals :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   648
            log.warn("No intervals given")
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   649
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   650
        else :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   651
            # maintain intervals
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   652
            log.debug("Updating %d intervals...", len(self.intervals))
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   653
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   654
            for interval in self.intervals :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   655
                log.debug("%s", interval)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   656
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   657
                # update
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   658
                self.interval(options, interval, now, snapshot_name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   659
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   660
    def run (self, options) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   661
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   662
            Execute
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   663
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   664
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   665
        # prep
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   666
        self.prepare(options)
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   667
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   668
        # clean intervals?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   669
        if options.clean_intervals:
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   670
            for interval in self.intervals :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   671
                log.debug("%s: cleaning interval: %s", self, interval)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   672
                self.clean_interval(options, interval)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   673
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   674
        # clean snapshots?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   675
        if options.clean_snapshots :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   676
            log.debug("%s: cleaning snapshots...", self)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   677
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   678
            self.clean_snapshots(options)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   679
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   680
        # snapshot from source?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   681
        if self.source :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   682
            # timestamp for run
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   683
            now = datetime.datetime.now()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   684
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   685
            log.debug("%s: started snapshot run at: %s", self, now)
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   686
            
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   687
            try :
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   688
                # snapshot + current
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   689
                snapshot_name = self.run_snapshot(options, now)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   690
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   691
            except rsync.RsyncError as ex :
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   692
                # failed, don't update run intervals or such
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   693
                log.error("%s: snapshot rsync failed: %s", self, ex)
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   694
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   695
                return 1
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   696
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   697
            except SnapshotError as ex :
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   698
                # misc. failure
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   699
                log.error("%s: %s", self, ex)
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   700
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   701
                return 2
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   702
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   703
            # intervals?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   704
            self.run_intervals(options, now, snapshot_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   705
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   706
        # ok
65
462cecaa70d0 pvl.backup-snapshot: handle target snapshot/rsync errors
Tero Marttila <terom@paivola.fi>
parents: 63
diff changeset
   707
        return 0
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   708
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   709
    def __str__ (self) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   710
        return self.name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   711
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   712
def _parse_run_targets (options, config, run) :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   713
    """
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   714
        Parse given run section from config into a series of target names to run.
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   715
    """
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   716
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   717
    for target, enable in config['run'][process_config_name(options.run)].iteritems() :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   718
        # enabled?
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   719
        enable = config_bool('enable', enable)
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   720
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   721
        if not enable :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   722
            continue
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   723
        
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   724
        # check
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   725
        if target not in options.targets :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   726
            raise ConfigError("Unknown [target/{target}] in [run/{run}]".format(target=target, run=run))
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   727
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   728
        yield target
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   729
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   730
def load_configs (configs, confglob='*.conf') :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   731
    """
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   732
        Load configuration files from given list of config paths; supports loading a conf.d
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   733
    """
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   734
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   735
    for path in configs :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   736
        log.debug("%s", path)
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   737
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   738
        if os.path.isdir(path) :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   739
            # glob dir: $path/$glob
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   740
            for globpath in glob.glob(os.path.join(path, confglob)) :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   741
                if os.path.exists(globpath) :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   742
                    yield globpath
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   743
                else :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   744
                    raise Exception("Globbed file does not exist: {0}".format(globpath))
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   745
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   746
        elif os.path.isfile(path) :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   747
            # normal file
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   748
            yield path
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   749
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   750
        elif os.path.exists(path) :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   751
            raise Exception("Unrecognized config file type: {0}".format(path))
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   752
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   753
        else :
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   754
            raise Exception("Given config file does not exist: {0}".format(path))
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   755
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   756
def run (options, run_targets) :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   757
    # default config
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   758
    config = dict(
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   759
        rsync_options   = {},
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   760
        intervals       = {},
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   761
        targets         = {},
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   762
    )
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   763
    
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   764
    # config?
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   765
    for path in load_configs(options.config) :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   766
        # load
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   767
        try :
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   768
            config = parse_config(path, config)
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   769
        except ConfigError as e:
55
95c86df4807a pvl.backup-snapshot: support loading *.conf from --config pvl-backup.d/
Tero Marttila <terom@paivola.fi>
parents: 53
diff changeset
   770
            log.error("Configuration error: %s: %s", path, e)
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   771
            return 2
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   772
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   773
    # targets to run
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   774
    options.targets = {}
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   775
 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   776
    # manual?
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   777
    if options.target :
53
f17c2733417a pvl.backup-snapshot: fix --target
Tero Marttila <terom@paivola.fi>
parents: 45
diff changeset
   778
        options.targets['console'] = Target.from_config(options, 'console',
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   779
            path        = options.target,
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   780
            source      = options.target_source,
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   781
            intervals   = dict((name, None) for name in options.target_intervals),
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   782
        )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   783
  
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   784
    # intervals
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   785
    for name in config['intervals'] :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   786
        interval_config = config['intervals'][name]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   787
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   788
        # parse
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   789
        interval = Interval.from_config(options, name, **interval_config)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   790
        
21
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   791
        log.debug("config interval: %s", name)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   792
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   793
        # store
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   794
        options.intervals[name] = interval
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   795
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   796
    # rsync options
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   797
    for option in config['rsync_options'] :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   798
        value = config['rsync_options'][option]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   799
21
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   800
        # parse, allowing non-boolean values as well...
de69e9ba8f22 rsync-snapshot: fix [rsync-options] handling for non-flag options
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   801
        value = config_bool(option, value, strict=False)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   802
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   803
        log.debug("rsync option: %s=%s", option, value)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   804
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   805
        # store
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   806
        options.rsync_options[option] = value
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   807
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   808
    # target definitions
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   809
    for name in config['targets'] :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   810
        target_config = config['targets'][name]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   811
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   812
        # parse
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   813
        target = Target.from_config(options, name, **target_config)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   814
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   815
        log.debug("config target: %s", name)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   816
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   817
        options.targets[name] = target
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   818
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   819
    # what targets?
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   820
    if run_targets :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   821
        # keep as-is
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   822
        log.debug("Running given targets: %s", run_targets)
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   823
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   824
    if options.run :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   825
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   826
        # given [run/...] definition..
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   827
        run_targets = list(_parse_run_targets(options, config, options.run))
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   828
        
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   829
        log.debug("Running %d given [run/%s] targets: %s", len(run_targets), options.run, run_targets)
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   830
    
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   831
    # run
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   832
    if run_targets :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   833
        log.debug("Running %d given targets...", len(run_targets))
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   834
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   835
        # run given ones
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   836
        for name in run_targets :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   837
            try :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   838
                # get
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   839
                target = options.targets[name]
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   840
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   841
            except KeyError:
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   842
                log.error("Unknown target given: %s", name)
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   843
                log.info("Defined targets: %s", ' '.join(options.targets))
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   844
                return 2
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   845
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   846
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   847
            # run
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   848
            log.info("%s", name)
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   849
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   850
            target.run(options)
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   851
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   852
    else :
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   853
        # all targets
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   854
        log.debug("Running all %d targets...", len(options.targets))
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   855
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   856
        # targets
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   857
        for name, target in options.targets.iteritems() :
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 55
diff changeset
   858
            log.info("%s", name)
38
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   859
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   860
            # run
24cdf1372cab rsync-snapshot: implement [run] blocks to select which targets to --run
Tero Marttila <terom@paivola.fi>
parents: 37
diff changeset
   861
            target.run(options)
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   862
22
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   863
    # ok
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   864
    return 0
a2bc5cc9de4d 0.2.1: slightly improved error handling
Tero Marttila <terom@paivola.fi>
parents: 21
diff changeset
   865
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   866
def config_defaults () :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   867
    return dict(
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   868
        # snapshots/ naming
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   869
        snapshot_format = '%Y%m%d-%H%M%S',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   870
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   871
        # rsync options, in invoke.optargs format
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   872
        rsync_options = {
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   873
            'archive':          True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   874
            'hard-links':       True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   875
            'one-file-system':  True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   876
            'numeric-ids':      True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   877
            'delete':           True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   878
        },
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   879
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   880
        # defined intervals
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   881
        intervals       = dict((i.name, i) for i in [
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   882
            Interval('recent',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   883
                format  = None,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   884
                keep    = 4,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   885
            ),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   886
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   887
            Interval('day',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   888
                format  = '%Y-%m-%d',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   889
                keep    = 7,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   890
            ),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   891
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   892
            Interval('week',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   893
                format  = '%Y-%W',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   894
                keep    = 4,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   895
            ),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   896
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   897
            Interval('month',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   898
                format  = '%Y-%m',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   899
                keep    = 4,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   900
            ),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   901
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   902
            Interval('year',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   903
                format  = '%Y',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   904
                keep    = 1,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   905
            )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   906
        ]),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   907
    )
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   908
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   909
def main (argv) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   910
    global options
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   911
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   912
    # option defaults
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   913
    defaults = config_defaults()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   914
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   915
    # global options + args
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   916
    options, args = parse_options(argv, defaults)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   917
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   918
    # args: filter targets
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   919
    # XXX: fix name mangling
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   920
    targets = [target.replace('-', '_') for target in args]
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   921
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   922
    try :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   923
        # handle it
17
b88653920e7a fix up --destination/--source to --target/--source to run manually; specify list of targets to run as args
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   924
        return run(options, targets)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   925
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   926
    except Exception, e:
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   927
        log.error("Internal error:", exc_info=e)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   928
        return 3
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   929
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   930
    # ok
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   931
    return 0
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   932
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   933
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   934
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   935
if __name__ == '__main__' :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   936
    import sys
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   937
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   938
    sys.exit(main(sys.argv))
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   939