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