pvl/backup/rsync.py
author Tero Marttila <terom@paivola.fi>
Fri, 02 Mar 2012 16:46:38 +0200
changeset 34 8c23dc925ed7
parent 33 2de09042414f
child 42 43e27a3e9efe
permissions -rw-r--r--
rsync-wrapper: default to logging.INFO; cleanup pvl.backup.rsync info output
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    rsync handling.
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Apologies for the 'RSync' nomenclature
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
"""
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
from pvl.backup.lvm import LVM, LVMVolume, LVMSnapshot
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
from pvl.backup.mount import mount
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
     9
from pvl.backup import invoke
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
import os.path
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import logging
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
log = logging.getLogger('pvl.backup.rsync')
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    17
# Path to rsync binary
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    18
RSYNC = '/usr/bin/rsync'
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    19
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    20
def rsync (source, dest, **opts) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    21
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    22
        Run rsync.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    23
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    24
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    25
    invoke.command(RSYNC, source, dest, **opts)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
class RSyncCommandFormatError (Exception) :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        Improper rsync command
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    pass
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    34
class RSyncServer (object) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    35
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    36
        rsync server-mode execution.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    37
    """
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    def _execute (self, options, path) :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
            Underlying rsync just reads from filesystem.
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        """
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    43
        
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    44
        # invoke directly, no option-handling, nor stdin/out redirection
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    45
        invoke.invoke(RSYNC, options + ['.', path], data=False)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    47
class RSyncFSServer (RSyncServer) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        Normal filesystem backup.
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    def __init__ (self, path) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    53
        RSyncServer.__init__(self)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        self.path = path
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
    def execute (self, options) :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
        return self._execute(options, self.path)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    60
class RSyncLVMServer (RSyncServer) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        Backup LVM LV by snapshotting + mounting it.
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    def __init__ (self, volume) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    66
        RSyncServer.__init__(self)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        self.volume = volume
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
 
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
    def execute (self, options) :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
        """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
            Snapshot, mount, execute
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        # backup target from LVM command
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
        lvm = self.volume.lvm
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        volume = self.volume
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
        # snapshot
34
8c23dc925ed7 rsync-wrapper: default to logging.INFO; cleanup pvl.backup.rsync info output
Tero Marttila <terom@paivola.fi>
parents: 33
diff changeset
    80
        log.info("Open snapshot: %s", volume)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
        # XXX: generate snapshot nametag to be unique?
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        with lvm.snapshot(volume, tag='backup') as snapshot:
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
            # mount
33
2de09042414f mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
    85
            log.info("Mounting snapshot: %s", snapshot)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
33
2de09042414f mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
    87
            with mount(snapshot.dev_path, name_hint=('lvm_' + snapshot.name + '_'), readonly=True) as mountpoint:
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
                # rsync!
34
8c23dc925ed7 rsync-wrapper: default to logging.INFO; cleanup pvl.backup.rsync info output
Tero Marttila <terom@paivola.fi>
parents: 33
diff changeset
    89
                log.info("Running rsync: %s", mountpoint)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
9
c4c858043729 fix rsync args ordering + path trailing slash
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    91
                # with trailing slash
c4c858043729 fix rsync args ordering + path trailing slash
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    92
                return self._execute(options, mountpoint.path + '/')
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
            # cleanup
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        # cleanup
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
 
28
82bcde9e21c4 rsync: pass command as list, moving the shlex.split to main; support `rsync -e "rsync-wrapper -C --"` style execution with the rsync command given as arguments
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
    97
def parse_command (command_parts, restrict_server=True, restrict_readonly=True) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
        Parse given rsync server command into bits. 
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
28
82bcde9e21c4 rsync: pass command as list, moving the shlex.split to main; support `rsync -e "rsync-wrapper -C --"` style execution with the rsync command given as arguments
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   101
            command_parts       - the command-list sent by rsync
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
            restrict_server     - restrict to server-mode
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
            restrict_readonly   - restrict to read/send-mode
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
        
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
        Returns:
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
            (cmd, options, source, dest)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
    cmd = None
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
    options = []
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
    source = None
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
    dest = None
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
    # parse
28
82bcde9e21c4 rsync: pass command as list, moving the shlex.split to main; support `rsync -e "rsync-wrapper -C --"` style execution with the rsync command given as arguments
Tero Marttila <terom@paivola.fi>
parents: 24
diff changeset
   116
    for part in command_parts :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        if cmd is None :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
            cmd = part
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        elif part.startswith('-') :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
            options.append(part)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        elif source is None :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
            source = part
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
        elif dest is None :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
            dest = part
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
    # options
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
    have_server = ('--server' in options)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
    have_sender = ('--sender' in options)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
    # verify
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
    if not have_server :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
        raise RSyncCommandFormatError("Missing --server")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
    if restrict_readonly and not have_sender :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
        raise RSyncCommandFormatError("Missing --sender for readonly")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
    # parse path
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
    if have_sender :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
        # read
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
        # XXX: which way does the dot go?
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
        if source != '.' :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
            raise RSyncCommandFormatError("Invalid dest for sender")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
        
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
        path = dest
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
    else :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
        # write
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
        if source != '.' :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
            raise RSyncCommandFormatError("Invalid source for reciever")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
        path = dest
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
6
302f45534b73 distutils
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   156
    if not path :
302f45534b73 distutils
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   157
        raise RSyncCommandFormatError("Missing path")
302f45534b73 distutils
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   158
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
    # ok
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
    return cmd, options, source, dest
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
      
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
def parse_source (path, restrict_path=False) :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
        Figure out source to rsync from, based on pseudo-path given in rsync command.
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
    # normalize
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
    path = os.path.normpath(path)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
    # verify path
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
    if restrict_path :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
        if not path.startswith(restrict_path) :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
            raise RSyncCommandFormatError("Restricted path ({restrict})".format(restrict=restrict_path))
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
    if path.startswith('/') :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
        # direct filesystem path
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
        # XXX: how to handle=
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
        log.info("filesystem: %s", path)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   181
        return RSyncFSServer(path)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
    elif path.startswith('lvm:') :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
        # LVM LV
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
        try :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
            lvm, vg, lv = path.split(':')
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
        except ValueError, e:
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
            raise RSyncCommandFormatError("Invalid lvm pseudo-path: {error}".format(error=e))
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
        
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
        # XXX: validate
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
        log.info("LVM: %s/%s", vg, lv)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
        # open
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
        lvm = LVM(vg)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
        volume = lvm.volume(lv)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   199
        return RSyncLVMServer(volume)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
       
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
    else :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
        # invalid
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
        raise RSyncCommandFormatError("Unrecognized backup path")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204