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