scripts/pvlbackup-rsync-snapshot
author Tero Marttila <terom@paivola.fi>
Thu, 16 Feb 2012 10:14:39 +0200
changeset 19 59a38533f13b
parent 17 b88653920e7a
child 21 de69e9ba8f22
permissions -rwxr-xr-x
setup.py: v0.2 + scripts + author
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
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
from pvl.backup import rsync
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    15
import optparse, ConfigParser
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
import os, os.path, stat
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
import shutil
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
import datetime
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
import logging
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
log = logging.getLogger()
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
# command-line options
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
options = None
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    26
def parse_options (argv, defaults) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        Parse command-line arguments.
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
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    parser = optparse.OptionParser(
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
            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
    33
            usage       = '%prog: [options] [ --config <path> | --target <path> [ --source <src> ] [ --interval <name> ] ]',
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            # module docstring
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
            # XXX: breaks multi-line descriptions..
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
            description = __doc__,
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    )
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    # logging
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    general = optparse.OptionGroup(parser, "General Options")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
    general.add_option('-q', '--quiet',      dest='loglevel', action='store_const', const=logging.WARNING, help="Less output")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    general.add_option('-v', '--verbose',    dest='loglevel', action='store_const', const=logging.INFO,  help="More output")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
    general.add_option('-D', '--debug',      dest='loglevel', action='store_const', const=logging.DEBUG, help="Even more output")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
    parser.add_option_group(general)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    49
    # rsync
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    50
    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
    51
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    52
    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
    53
        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
    54
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    55
    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
    56
        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
    57
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    58
    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
    59
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    60
    # global
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
    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
    62
        help="Clean out old interval links")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    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
    65
        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
    66
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
    parser.add_option('--clean',             action='store_true',
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        help="Clean out both intervals and snapshots")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
    parser.add_option('-n', '--dry-run',    action='store_true',
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
        help="Don't actually clean anything")
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    73
    #
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    74
    parser.add_option('-c', '--config',     metavar='FILE',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    75
        help="Load configuration file")
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    76
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    77
    #
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
    78
    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
    79
        help="Target path")
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    80
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
    81
    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
    82
        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
    83
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    84
    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
    85
        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
    86
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    87
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    # defaults
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
    parser.set_defaults(
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
        loglevel            = logging.WARNING,
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
    91
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
    92
        target_intervals    = [],
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    93
    )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    94
    parser.set_defaults(**defaults)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    96
    
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
    # parse
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    options, args = parser.parse_args(argv[1:])
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
    # configure
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
    logging.basicConfig(
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        format  = '%(processName)s: %(name)s: %(levelname)s %(funcName)s : %(message)s',
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        level   = options.loglevel,
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
    )
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
    if options.clean :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        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
   108
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   109
    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
   110
        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
   111
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   112
    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
   113
        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
   114
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
    return options, args
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
def process_config_name (name) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
    """
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   119
        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
   120
    """
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
    return name.replace('-', '_')
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   124
def parse_config (path, defaults) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   125
    """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   126
        Parse given config file
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   127
    """
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
    log.debug("loading config: %s", path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   131
    config = dict(defaults)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   132
    config_file = ConfigParser.RawConfigParser()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   133
    config_file.read([path])
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   135
    # handle each section
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   136
    for section in config_file.sections() :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   137
        # mangle
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   138
        section_name = process_config_name(section)
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
        log.debug("section: %s", section_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   141
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   142
        # subsections
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   143
        section_path = section_name.split(':')
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   144
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   145
        # lookup dict
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   146
        lookup = config
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   147
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   148
        for name in section_path :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   149
            if name not in lookup :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   150
                lookup[name] = {}
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   151
            
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   152
            lookup = lookup[name]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   153
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   154
        # found dict for this section
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   155
        config_section = lookup
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   156
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   157
        # values
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   158
        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
   159
            # mangle
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   160
            name = process_config_name(name)
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
            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
   163
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   164
            config_section[name] = value
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   165
    
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   166
    log.debug("config: %s", config)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   167
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   168
    return config
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   169
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   170
def config_bool (name, value) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   171
    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
   172
        return True
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   173
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   174
    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
   175
        return False
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
    else :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   178
        raise ConfigError("Unrecognized boolean 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
   179
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   180
def config_int (name, value) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   181
    try :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   182
        return int(value)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   184
    except ValueError, e:
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   185
        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
   186
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   187
def config_list (name, value) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   188
    return value.split()
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
def walk_symlinks (tree, ignore=False) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        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
   193
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
            (dirpath, name, target)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
        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
   197
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
    for name in os.listdir(tree) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
        if ignore and name in ignore :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
            log.debug("%s: ignore: %s", tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
            continue
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
        path = os.path.join(tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
        
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
        # stat symlink itself
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
        st = os.lstat(path)
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
        if stat.S_ISDIR(st.st_mode) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
            # recurse
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
            log.debug("%s: tree: %s", tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
            for item in walk_symlinks(path) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
                yield item
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
        elif stat.S_ISLNK(st.st_mode) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
            # found
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
            target = os.readlink(path)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
            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
   221
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
            yield tree, name, target
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
        else :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
            log.debug("%s: skip: %s", tree, name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   228
class Interval (object) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
    """
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   230
        An interval definition.
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   233
    @classmethod
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   234
    def from_config (cls, options, name,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   235
        format,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   236
        keep,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   237
    ) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   238
        if not format :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   239
            # magic to use snapshot name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   240
            _format = None
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   241
        else :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   242
            _format = format
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   244
        return cls(name, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   245
            format  = _format, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   246
            keep    = config_int('keep', keep),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   247
        )
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
16
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   249
    @classmethod
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   250
    def from_target_config (cls, name, base, arg) :
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   251
        if isinstance(arg, dict) :
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   252
            # full instance
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   253
            return cls(name,
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   254
                format  = arg.get('format', base.format if base else None),
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   255
                keep    = arg.get('keep', base.keep if base else None),
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   256
            )
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   257
        else :
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   258
            # partial instance with keep
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   259
            return cls(name,
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   260
                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
   261
                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
   262
            )
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   263
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   264
    def __init__ (self, name, format, keep) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   265
        self.name = name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   266
        self.format = format
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   267
        self.keep = keep
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   268
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   269
    def __str__ (self) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   270
        return self.name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   271
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   272
class Target (object) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   273
    """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   274
        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
   275
            
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   276
        [target:...]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   277
    """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   278
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   279
    @classmethod
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   280
    def from_config (cls, options, name,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   281
        path            = False,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   282
        source          = None,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   283
        enable          = 'no',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   284
        exclude_from    = None,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   285
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   286
        # subsections
16
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   287
        intervals       = None,
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   288
        rsync_options   = None,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   289
    ) :
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
   290
        if not source and source is not False :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   291
            raise ConfigError("Missing required option: source for [target:{name}]".format(name=name))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   292
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   293
        # global defaults
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   294
        _rsync_options = dict(options.rsync_options)
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
        if rsync_options :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   297
            # override
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   298
            _rsync_options.update(rsync_options)
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
        # lookup intervals
16
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   301
        _intervals = [
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   302
            (
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   303
                # lookup base from options.intervals
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   304
                Interval.from_target_config(name, options.intervals.get(name), arg)
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   305
            ) for name, arg in intervals.iteritems()
d4b9954273a1 [target:$] intervals -> [target:$:intervals]
Tero Marttila <terom@paivola.fi>
parents: 15
diff changeset
   306
        ]
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   307
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   308
        return cls(name, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   309
            path            = path if path else name,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   310
            source          = source,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   311
            enable          = config_bool('enable', enable),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   312
            intervals       = _intervals,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   313
            rsync_options   = _rsync_options,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   314
            exclude_from    = exclude_from,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   315
        )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   316
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   317
    def __init__ (self, name,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   318
        path,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   319
        source, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   320
        enable          = False, 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   321
        intervals       = [],
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   322
        rsync_options   = {},
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   323
        exclude_from    = None
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   324
    ) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   325
        self.name = name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   326
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   327
        self.path = path
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   328
        self.source = source
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   329
        self.enable = enable
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   330
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   331
        self.intervals = intervals
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   332
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   333
        self.rsync_options = rsync_options
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   334
        self.exclude_from = exclude_from
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   335
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   336
        # this snapshot?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   337
        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
   338
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   339
        # 'current' symlink
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   340
        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
   341
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
   342
    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
   343
        """
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
   344
            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
   345
        """
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
   346
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
   347
        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
   348
            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
   349
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
   350
        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
   351
            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
   352
            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
   353
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   354
    def snapshot (self, options, now) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   355
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   356
            Perform the rsync from our source to self.snapshot_dir.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   357
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   358
            XXX: allocate snapshot_name here?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   359
        """
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
   360
       
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   361
        # new snapshot
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   362
        snapshot_name = now.strftime(options.snapshot_format)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   363
        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
   364
        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
   365
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   366
        if os.path.exists(temp_path) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   367
            raise Exception("Old temp snapshot dir remains, please clean up: {path}".format(path=temp_path))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   368
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   369
        log.info("Perform main snapshot: %s", snapshot_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   370
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   371
        # build rsync options
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   372
        opts = dict(self.rsync_options)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   373
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   374
        if os.path.exists(self.current_path) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   375
            # real path to target
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   376
            target = os.readlink(self.current_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   377
            target_path = os.path.join(os.path.dirname(self.current_path), target)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   378
            target_abs = os.path.abspath(target_path)
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
            log.info("Using current -> %s as base", target_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   381
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   382
            # use as link-dest base; hardlinks unchanged files; target directory must be empty
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   383
            # rsync links absolute paths..
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   384
            opts['link-dest'] = target_abs
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
        # go
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   387
        log.debug("rsync %s -> %s", self.source, temp_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   388
        rsync.rsync(self.source, temp_path, **opts)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   389
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   390
        # move in to final name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   391
        log.debug("rename %s -> %s", temp_path, snapshot_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   392
        os.rename(temp_path, snapshot_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   393
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   394
        return snapshot_name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   395
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   396
    def update_interval (self, options, interval, now, snapshot_name) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   397
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   398
            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
   399
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   400
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   401
        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
   402
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   403
        if not os.path.exists(dir_path) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   404
            log.warn("Creating interval dir: %s", dir_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   405
            os.mkdir(dir_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   406
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   407
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   408
        # name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   409
        if interval.format is None :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   410
            # per-snapshot
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   411
            name = snapshot_name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   412
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   413
            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
   414
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   415
        else :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   416
            # by date
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   417
            name = now.strftime(interval.format)
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
            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
   420
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   421
        # path
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   422
        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
   423
        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
   424
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   425
        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
   426
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   427
        # already there?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   428
        if os.path.exists(path) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   429
            target = os.readlink(path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   430
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   431
            log.info("%s: Found existing: %s -> %s", interval, name, target)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   432
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   433
        else :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   434
            # update
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   435
            target = os.path.join('..', 'snapshots', snapshot_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   436
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   437
            log.info("%s: Updating: %s -> %s", interval, name, target)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   438
            log.debug("%s -> %s", path, target)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   439
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   440
            os.symlink(target, path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   441
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   442
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   443
    def clean_interval (self, options, interval) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   444
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   445
            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
   446
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   447
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   448
        # path
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   449
        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
   450
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   451
        if not os.path.exists(dir_path) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   452
            log.warn("%s: Skipping, no interval dir: %s", interval, dir_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   453
            return
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   454
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   455
        # configured
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   456
        keep = interval.keep
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   457
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   458
        # clean?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   459
        items = os.listdir(dir_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   460
        items.sort()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   461
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   462
        log.info("%s: Have %d / %d items", interval, len(items), keep)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   463
        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
   464
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   465
        if len(items) > keep :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   466
            # clean out
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   467
            clean = items[keep:]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   468
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   469
            log.info("%s: Cleaning out %d items", interval, len(clean))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   470
            log.debug("%s: cleaning out: %s", interval, ' '.join(clean))
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
            for item in clean :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   473
                path = os.path.join(dir_path, item)
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
                log.info("%s: Clean: %s", interval, path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   476
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   477
                os.unlink(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
    def clean_snapshots (self, options) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   481
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   482
            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
   483
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   484
            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
   485
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   486
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   487
        # real path to snapshots
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   488
        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
   489
        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
   490
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   491
        # set of found targets
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   492
        found = set()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   493
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   494
        # walk all symlinks
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   495
        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
   496
            # target dir
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   497
            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
   498
            target_dir = os.path.dirname(target_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   499
            target_name = os.path.basename(target_path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   500
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   501
            if target_dir == snapshots_path :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   502
                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
   503
                found.add(target_name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   504
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   505
            else :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   506
                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
   507
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   508
        # discover all snapshots
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   509
        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
   510
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   511
        # clean out special names
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   512
        snapshots = snapshots - set(['new'])
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   513
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   514
        ## compare
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   515
        used = snapshots & found
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   516
        unused = snapshots - found
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   517
        broken = found - snapshots
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   518
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   519
        log.info("Found used=%d, unused=%d, broken=%d snapshot symlinks", len(used), len(unused), len(broken))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   520
        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
   521
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   522
        if broken :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   523
            log.warn("Found broken symlinks to snapshots: %s", ' '.join(broken))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   524
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   525
        if unused :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   526
            log.info("Clean out unused snapshots: %s", ' '.join(unused))
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   527
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   528
            for name in unused :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   529
                path = os.path.join(snapshots_path, name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   530
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   531
                log.info("Clean: %s", name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   532
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   533
                if not options.dry_run :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   534
                    log.debug("rmtree: %s", path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   535
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   536
                    # nuke
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   537
                    shutil.rmtree(path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   538
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   539
                else :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   540
                    log.debug("dry-run: %s", path)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   541
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   542
    def run_snapshot (self, options, now) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   543
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   544
            Run snapshot + update current.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   545
        """
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   546
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   547
        # initial rsync
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   548
        snapshot_name = self.snapshot(options, now)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   549
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   550
        # update current
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   551
        log.info("Updating current -> %s", snapshot_name)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   552
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   553
        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
   554
            # replace
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   555
            os.unlink(self.current_path)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   556
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   557
        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
   558
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   559
        return snapshot_name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   560
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   561
    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
   562
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   563
            Run our intervals.
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   564
        """
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
        if not self.intervals :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   567
            log.info("No intervals given; not running any")
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   568
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   569
        else :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   570
            # maintain intervals
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   571
            log.info("Updating %d intervals...", len(self.intervals))
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   572
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   573
            for interval in self.intervals :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   574
                log.debug("%s", interval)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   575
14
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   576
                log.info("Updating interval: %s", interval)
2a7b87dc6c45 rsync-snapshot: clean before update, fix link-dest with abspath, include/exclude
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   577
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   578
                # update
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   579
                self.update_interval(options, interval, now, snapshot_name)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   580
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   581
    def run (self, options) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   582
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   583
            Execute
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   584
        """
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   585
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
   586
        # 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
   587
        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
   588
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   589
        # clean intervals?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   590
        if options.clean_intervals:
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   591
            for interval in self.intervals :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   592
                log.info("Cleaning interval: %s...", interval)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   593
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   594
                self.clean_interval(options, interval)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   595
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   596
        # clean snapshots?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   597
        if options.clean_snapshots :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   598
            log.info("Cleaning snapshots...")
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   599
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   600
            self.clean_snapshots(options)
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
        # snapshot from source?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   603
        if self.source :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   604
            # timestamp for run
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   605
            now = datetime.datetime.now()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   606
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   607
            log.info("Started snapshot run at: %s", now)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   608
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   609
            # snapshot + current
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   610
            snapshot_name = self.run_snapshot(options, now)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   611
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   612
            # intervals?
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   613
            self.run_intervals(options, now, snapshot_name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   614
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   615
        # ok
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   616
        return 1
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   617
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   618
    def __str__ (self) :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   619
        return self.name
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   620
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
   621
def run (options, targets) :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   622
    # default config
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   623
    config = dict(
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   624
        rsync_options   = {},
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   625
        intervals       = {},
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   626
        targets         = {},
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   627
    )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   628
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   629
    if options.config :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   630
        # load
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   631
        config = parse_config(options.config, config)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   632
 
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   633
    # 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
   634
    if 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
   635
        config['targets'][options.target] = dict(
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
   636
            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
   637
            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
   638
            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
   639
        )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   640
  
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   641
    # intervals
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   642
    for name in config['intervals'] :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   643
        interval_config = config['intervals'][name]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   644
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   645
        # parse
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   646
        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
   647
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   648
        log.info("Interval: %s", name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   649
        
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   650
        # store
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   651
        options.intervals[name] = interval
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   652
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   653
    for option in config['rsync_options'] :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   654
        value = config['rsync_options'][option]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   655
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   656
        # parse
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   657
        value = config_bool(option, value)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   658
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   659
        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
   660
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   661
        # store
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   662
        options.rsync_options[option] = value
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   663
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
   664
    # all 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
   665
    if not 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
   666
        targets = list(config['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
   667
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
   668
    # 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
   669
    for name in targets :
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   670
        target_config = config['targets'][name]
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   671
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   672
        # parse
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   673
        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
   674
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   675
        log.info("Target: %s", name)
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   676
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   677
        # run
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   678
        target.run(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
def config_defaults () :
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   681
    return dict(
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   682
        # snapshots/ naming
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   683
        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
   684
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   685
        # rsync options, in invoke.optargs format
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   686
        rsync_options = {
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   687
            'archive':          True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   688
            'hard-links':       True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   689
            'one-file-system':  True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   690
            'numeric-ids':      True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   691
            'delete':           True,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   692
        },
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   693
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   694
        # defined intervals
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   695
        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
   696
            Interval('recent',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   697
                format  = None,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   698
                keep    = 4,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   699
            ),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   700
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   701
            Interval('day',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   702
                format  = '%Y-%m-%d',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   703
                keep    = 7,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   704
            ),
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
            Interval('week',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   707
                format  = '%Y-%W',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   708
                keep    = 4,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   709
            ),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   710
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   711
            Interval('month',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   712
                format  = '%Y-%m',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   713
                keep    = 4,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   714
            ),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   715
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   716
            Interval('year',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   717
                format  = '%Y',
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   718
                keep    = 1,
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   719
            )
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   720
        ]),
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   721
    )
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   722
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   723
def main (argv) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   724
    global options
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   725
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   726
    # option defaults
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   727
    defaults = config_defaults()
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   728
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   729
    # global options + args
15
61f6d0ca0432 rsync-snapshot: some kind of --config support
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   730
    options, args = parse_options(argv, defaults)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   731
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
   732
    # 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
   733
    # 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
   734
    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
   735
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   736
    try :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   737
        # 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
   738
        return run(options, targets)
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   739
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   740
    except Exception, e:
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   741
        log.error("Internal error:", exc_info=e)
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   742
        return 3
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   743
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   744
    # ok
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   745
    return 0
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   746
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   747
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   748
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   749
if __name__ == '__main__' :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   750
    import sys
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   751
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   752
    sys.exit(main(sys.argv))
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   753