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