equal
deleted
inserted
replaced
2 |
2 |
3 """ |
3 """ |
4 SSH authorized_keys command="..." wrapper for rsync. |
4 SSH authorized_keys command="..." wrapper for rsync. |
5 |
5 |
6 Testing goes something like: |
6 Testing goes something like: |
7 sudo PYTHONPATH=. ./bin/pvlbackup-rsync-wrapper --command 'rsync --server --sender -ax . lvm:asdf:test' -vD |
7 sudo PYTHONPATH=. ./bin/pvl.backup-rsync --command 'rsync --server --sender -ax . lvm:asdf:test' -vD |
8 |
8 |
9 sudo sh -c "PYTHONPATH=. rsync -e './bin/pvlbackup-rsync-wrapper --debug -C --' -ax testing:lvm:asdf:test test/tmp" |
9 sudo sh -c "PYTHONPATH=. rsync -e './bin/pvl.backup-rsync --debug -C --' -ax testing:lvm:asdf:test test/tmp" |
10 """ |
10 """ |
11 |
11 |
12 from pvl.backup import __version__ |
12 from pvl.backup import __version__ |
13 from pvl.backup.rsync import RSyncCommandFormatError |
13 from pvl.backup.rsync import RSyncCommandFormatError |
14 from pvl.backup.invoke import InvokeError |
14 from pvl.backup.invoke import InvokeError |
17 import optparse |
17 import optparse |
18 import shlex |
18 import shlex |
19 import os |
19 import os |
20 import logging |
20 import logging |
21 |
21 |
22 log = logging.getLogger() |
22 log = logging.getLogger('main') |
23 |
23 |
24 def parse_options (argv) : |
24 def parse_options (argv) : |
25 """ |
25 """ |
26 Parse command-line arguments. |
26 Parse command-line arguments. |
27 """ |
27 """ |
67 help="create snapshot with given LV size (used to store writes during backup)") |
67 help="create snapshot with given LV size (used to store writes during backup)") |
68 |
68 |
69 parser.add_option('--snapshot-wait', metavar='SECONDS', default=lvm.LVM_SNAPSHOT_WAIT, type='float', |
69 parser.add_option('--snapshot-wait', metavar='SECONDS', default=lvm.LVM_SNAPSHOT_WAIT, type='float', |
70 help="wait for snapshot to settle after unmounting") |
70 help="wait for snapshot to settle after unmounting") |
71 |
71 |
|
72 parser.add_option('--snapshot-retry', metavar='RETRY', default=lvm.LVM_SNAPSHOT_RETRY, type='int', |
|
73 help="retry snapshot removal by given iterations") |
|
74 |
72 # defaults |
75 # defaults |
73 parser.set_defaults( |
76 parser.set_defaults( |
74 debug_for = [], |
77 debug_for = [], |
75 loglevel = logging.INFO, |
78 loglevel = logging.INFO, |
76 ) |
79 ) |
78 # parse |
81 # parse |
79 options, args = parser.parse_args(argv[1:]) |
82 options, args = parser.parse_args(argv[1:]) |
80 |
83 |
81 # configure |
84 # configure |
82 logging.basicConfig( |
85 logging.basicConfig( |
83 format = '%(levelname)6s %(name)s : %(funcName)s : %(message)s', |
86 format = argv[0] + ': %(levelname)6s %(name)s : %(funcName)s : %(message)s', |
84 level = options.loglevel, |
87 level = options.loglevel, |
85 ) |
88 ) |
86 |
89 |
87 # enable debugging for specific targets |
90 # enable debugging for specific targets |
88 for target in options.debug_for : |
91 for target in options.debug_for : |
116 # parse source |
119 # parse source |
117 try : |
120 try : |
118 # parse the source path as given by the client, may be a real path or pseudo-path |
121 # parse the source path as given by the client, may be a real path or pseudo-path |
119 source = rsync.parse_source(path, |
122 source = rsync.parse_source(path, |
120 restrict_path = options.restrict_path, |
123 restrict_path = options.restrict_path, |
121 lvm_opts = dict(size = options.snapshot_size, wait = options.snapshot_wait), |
124 lvm_opts = dict(size=options.snapshot_size, wait=options.snapshot_wait, retry=options.snapshot_retry), |
122 ) |
125 ) |
123 |
126 |
124 except RSyncCommandFormatError, e: |
127 except RSyncCommandFormatError, e: |
125 log.error("invalid rsync source: %r: %s", path, e) |
128 log.error("invalid rsync source: %r: %s", path, e) |
126 return 2 |
129 return 2 |