bin/pvl.backup-rsync
changeset 62 86ba7b12a7c9
parent 43 2911d4dd5a47
child 67 91153d8b499c
equal deleted inserted replaced
61:4fdf70cbc9b0 62:86ba7b12a7c9
     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