pvl/backup/rsync.py
author Tero Marttila <terom@paivola.fi>
Sat, 16 Feb 2013 21:42:10 +0200
changeset 70 3b1290aeed12
parent 67 91153d8b499c
permissions -rw-r--r--
pvl.backup-rsync: implement --sudo
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
RSYNC = '/usr/bin/rsync'
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    18
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    19
def rsync (source, dest, **opts) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    20
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    21
        Run rsync.
64
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    22
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    23
        Raises RsyncError if rsync fails.
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    24
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    25
        XXX: never used anywhere?
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    26
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    27
64
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    28
    try :
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    29
        invoke.command(RSYNC, source, dest, **opts)
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    30
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    31
    except invoke.InvokeError as ex :
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    32
        raise RsyncError(ex)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
class RSyncCommandFormatError (Exception) :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    """
64
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    36
        Improper rsync command/source.
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    """
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
    pass
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
64
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    41
class RsyncError (Exception) :
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    42
    """
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    43
        Rsync command invocation failed.
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    44
    """
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    45
    
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    46
    pass
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    47
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    48
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    49
class RSyncServer (object) :
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    50
    """
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    51
        rsync server-mode execution.
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    52
    """
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    54
    def _execute (self, options, srcdst, path, sudo=False) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
            Underlying rsync just reads from filesystem.
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    57
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    58
                options     - list of rsync options
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    59
                srcdst      - the (source, dest) pair with None placeholder, as returned by parse_command
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    60
                path        - the real path to replace None with
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    61
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    62
                sudo        - execute rsync using sudo
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        """
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    64
    
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    65
        # one of this will be None
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    66
        src, dst = srcdst
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    67
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    68
        # replace None -> path
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    69
        src = src or path
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    70
        dst = dst or path
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    71
67
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
    72
        log.info("rsync %s %s %s", ' '.join(options), src, dst)
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    73
64
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    74
        try :
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    75
            # invoke directly; no option-handling, nor stdin/out redirection
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    76
            invoke.invoke(RSYNC, options + [ src, dst ], data=False, sudo=sudo)
64
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    77
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    78
        except invoke.InvokeError as ex :
0de61433a42f pvl.backup.rsync: raise RsyncError if rsync fails
Tero Marttila <terom@paivola.fi>
parents: 57
diff changeset
    79
            raise RsyncError(ex)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    81
class RSyncFSServer (RSyncServer) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
        Normal filesystem backup.
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
    def __init__ (self, path) :
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
    87
        RSyncServer.__init__(self)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
        self.path = path
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    91
    def execute (self, options, srcdst, **opts) :
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    92
        """
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    93
                options     - list of rsync options
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    94
                srcdst      - the (source, dest) pair with None placeholder, as returned by parse_command
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    95
        """
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
    96
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
    97
        return self._execute(options, srcdst, self.path, **opts)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
    99
    def __str__ (self) :
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   100
        return self.path
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   101
    
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   102
class RSyncRemoteServer (RSyncServer) :
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   103
    """
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   104
        Remote filesystem backup.
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   105
    """
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   106
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   107
    def __init__ (self, host, path) :
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   108
        """
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   109
            host        - remote SSH host
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   110
            path        - remote path
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   111
        """
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   112
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   113
        RSyncServer.__init__(self)
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   114
    
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   115
        # glue
50
d23cba8064fe pvl.backup.rsync: fix typo
Tero Marttila <terom@paivola.fi>
parents: 49
diff changeset
   116
        self.path = host + ':' + path
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   117
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   118
    def execute (self, options, srcdst, **opts) :
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   119
        """
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   120
                options     - list of rsync options
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   121
                srcdst      - the (source, dest) pair with None placeholder, as returned by parse_command
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   122
        """
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   123
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   124
        return self._execute(options, srcdst, self.path, **opts)
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   125
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   126
    def __str__ (self) :
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   127
        return self.path
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   128
 
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   129
class RSyncLVMServer (RSyncServer) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
        Backup LVM LV by snapshotting + mounting it.
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
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   134
    def __init__ (self, vg, lv, sudo=None, **opts) :
42
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   135
        """
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   136
            **opts      - options for LVM.snapshot
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   137
        """
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   138
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   139
        RSyncServer.__init__(self)
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   140
        
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   141
        # lvm
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   142
        self.lvm = LVM(vg, sudo=sudo)
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   143
        self.volume = self.lvm.volume(lv)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   145
        self.sudo = sudo
42
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   146
        self.snapshot_opts = opts
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
 
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   148
    def execute (self, options, srcdst, sudo=False, **opts) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
        """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
            Snapshot, mount, execute
42
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   151
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   152
                options     - list of rsync options
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   153
                srcdst      - the (source, dest) pair with None placeholder, as returned by parse_command
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
        """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
        # backup target from LVM command
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
        lvm = self.volume.lvm
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
        volume = self.volume
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
        # snapshot
34
8c23dc925ed7 rsync-wrapper: default to logging.INFO; cleanup pvl.backup.rsync info output
Tero Marttila <terom@paivola.fi>
parents: 33
diff changeset
   161
        log.info("Open snapshot: %s", volume)
5
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
        # XXX: generate snapshot nametag to be unique?
42
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   164
        with lvm.snapshot(volume, tag='backup', **self.snapshot_opts) as snapshot:
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
            # mount
33
2de09042414f mount/rsync: use a tmpdir for mounting, not /mnt
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   166
            log.info("Mounting snapshot: %s", snapshot)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   168
            with mount(snapshot.dev_path, name_hint=('lvm_' + snapshot.name + '_'), readonly=True, sudo=sudo) as mountpoint:
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
                # rsync!
34
8c23dc925ed7 rsync-wrapper: default to logging.INFO; cleanup pvl.backup.rsync info output
Tero Marttila <terom@paivola.fi>
parents: 33
diff changeset
   170
                log.info("Running rsync: %s", mountpoint)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
9
c4c858043729 fix rsync args ordering + path trailing slash
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   172
                # with trailing slash
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   173
                return self._execute(options, srcdst, mountpoint.path + '/', sudo=sudo, **opts)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
            # cleanup
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
        # cleanup
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
 
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   178
    def __str__ (self) :
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   179
        return 'lvm:{volume}'.format(volume=self.volume)
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   180
 
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
   181
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
   182
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
        Parse given rsync server command into bits. 
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
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
   185
            command_parts       - the command-list sent by rsync
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
            restrict_server     - restrict to server-mode
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
            restrict_readonly   - restrict to read/send-mode
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
        
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   189
        In server mode, source will always be '.', and dest the source/dest.
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   190
        
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
        Returns:
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   193
            (cmd, options, path, (source, dest))
67
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   194
            
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   195
            options         -> list of -options
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   196
            path            -> real source path
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   197
            (source, dest)  -> combination of None for path, and the real source/dest
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   198
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
    """
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
    cmd = None
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
    options = []
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
    source = None
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
    dest = None
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
    # 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
   207
    for part in command_parts :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
        if cmd is None :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
            cmd = part
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
        elif part.startswith('-') :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
            options.append(part)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
        elif source is None :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
            source = part
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        elif dest is None :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
            dest = part
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
67
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   220
    log.debug("%s: %s", cmd, options)
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   221
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
    # options
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
    have_server = ('--server' in options)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
    have_sender = ('--sender' in options)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
    # verify
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   227
    if restrict_server and not have_server :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
        raise RSyncCommandFormatError("Missing --server")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
    if restrict_readonly and not have_sender :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
        raise RSyncCommandFormatError("Missing --sender for readonly")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   233
    if not source :
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   234
        raise RSyncCommandFormatError("Missing source path")
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   235
        
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   236
    if not dest:
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   237
        raise RSyncCommandFormatError("Missing dest path")
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   238
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   239
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   240
    # parse real source
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
    if have_sender :
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   242
        # read; first arg will always be .
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
        if source != '.' :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
            raise RSyncCommandFormatError("Invalid dest for sender")
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   245
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
        path = dest
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   247
        dest = None
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   248
        
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   249
        log.debug("using server/sender source path: %s", path)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   251
    elif have_server :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
        # write
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
        if source != '.' :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
            raise RSyncCommandFormatError("Invalid source for reciever")
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
        path = dest
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   257
        dest = None
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   258
        
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   259
        log.debug("using server dest path: %s", path)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   261
    else :
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   262
        # local src -> dst
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   263
        path = source
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   264
        source = None
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   265
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   266
        log.debug("using local src path: %s -> %s", path, dest)
6
302f45534b73 distutils
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   267
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
    # ok
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   269
    return cmd, options, path, (source, dest)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
      
67
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   271
def parse_source (path, restrict_paths=None, allow_remote=True, lvm_opts={}) :
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
    """
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
        Figure out source to rsync from, based on pseudo-path given in rsync command.
67
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   274
            
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   275
            restrict_paths  - raise RsyncCommandFormatError if source path is not under any of the given sources.
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   276
            allow_remote    - allow remote backups?
42
43e27a3e9efe pvlbackup-rsync-wrapper: add --snapshot-size / --snapshot-wait opts
Tero Marttila <terom@paivola.fi>
parents: 34
diff changeset
   277
            lvm_opts        - dict of **opts for RSyncLVMServer
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
    """
51
9525d3e150ec pvl.backup.rsync: preserve trailing / in source path
Tero Marttila <terom@paivola.fi>
parents: 50
diff changeset
   279
9525d3e150ec pvl.backup.rsync: preserve trailing / in source path
Tero Marttila <terom@paivola.fi>
parents: 50
diff changeset
   280
    endslash = path.endswith('/')
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
        
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
    # normalize
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
    path = os.path.normpath(path)
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   284
51
9525d3e150ec pvl.backup.rsync: preserve trailing / in source path
Tero Marttila <terom@paivola.fi>
parents: 50
diff changeset
   285
    if endslash and not path.endswith('/') :
9525d3e150ec pvl.backup.rsync: preserve trailing / in source path
Tero Marttila <terom@paivola.fi>
parents: 50
diff changeset
   286
        # add it back in
9525d3e150ec pvl.backup.rsync: preserve trailing / in source path
Tero Marttila <terom@paivola.fi>
parents: 50
diff changeset
   287
        # happens for 'foo:/' and such
9525d3e150ec pvl.backup.rsync: preserve trailing / in source path
Tero Marttila <terom@paivola.fi>
parents: 50
diff changeset
   288
        path += '/'
9525d3e150ec pvl.backup.rsync: preserve trailing / in source path
Tero Marttila <terom@paivola.fi>
parents: 50
diff changeset
   289
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
    # verify path
67
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   291
    if restrict_paths :
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   292
        for restrict_path in restrict_paths :
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   293
            if path.startswith(restrict_path) :
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   294
                # ok
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   295
                break
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   296
        else :
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   297
            # fail
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   298
            raise RSyncCommandFormatError("Restricted path".format())
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
    if path.startswith('/') :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
        # direct filesystem path
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 51
diff changeset
   302
        log.debug("filesystem: %s", path)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
12
fbfdde7326f4 rsync-snapshot: manage --link-dest'd interval snapshots
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   304
        return RSyncFSServer(path)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
    elif path.startswith('lvm:') :
49
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   307
        _, lvm = path.split(':', 1)
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   308
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
        # LVM LV
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
        try :
49
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   311
            if ':' in lvm :
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   312
                vg, lv = lvm.split(':', 1)
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   313
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   314
                log.warn("old lvm: syntax: lvm:%s; use: lvm:%s/%s", path, vg, lv)
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   315
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   316
            elif '/' in lvm:
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   317
                vg, lv = lvm.split('/', 1)
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   318
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   319
            else :
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   320
                raise RSyncCommandFormatError("Invalid lvm pseudo-path: {lvm}: unrecognized vg/lv separator".format(lvm=lvm))
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   322
        except ValueError, e:
49
0a329ac17083 pvl.backup.rsync: also accept lvm:vg/lv
Tero Marttila <terom@paivola.fi>
parents: 48
diff changeset
   323
            raise RSyncCommandFormatError("Invalid lvm pseudo-path: {lvm}: {error}".format(lvm=lvm, error=e))
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
        
43
2911d4dd5a47 pvl.backup-rsync: implement local rsync command execution, rename from pvlbackup-rsync-wrapper
Tero Marttila <terom@paivola.fi>
parents: 42
diff changeset
   325
        # XXX: validate?
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 51
diff changeset
   326
        log.debug("LVM: %s/%s", vg, lv)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
        # open
70
3b1290aeed12 pvl.backup-rsync: implement --sudo
Tero Marttila <terom@paivola.fi>
parents: 67
diff changeset
   329
        return RSyncLVMServer(vg, lv, **lvm_opts)
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   330
67
91153d8b499c tweak pvl.backup-rsync: multiple --restrict-paths, explicit --allow-remote, minor bugfixes
Tero Marttila <terom@paivola.fi>
parents: 64
diff changeset
   331
    elif ':' in path and allow_remote :
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   332
        host, path = path.split(':', 1)
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   333
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   334
        # remote host
57
52a4be76e85a pvl.backup-snapshot: cleanup log.info output
Tero Marttila <terom@paivola.fi>
parents: 51
diff changeset
   335
        log.debug("remote: %s:%s", host, path)
44
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   336
7069af6b7025 pvlbackup-rsync-snapshot: use pvl.backup.rsync.parse_source for sources, to support local LVM snapshots; also implement lvm-options section for target
Tero Marttila <terom@paivola.fi>
parents: 43
diff changeset
   337
        return RSyncRemoteServer(host, path)
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   338
       
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   339
    else :
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   340
        # invalid
48
c8aea2558f16 pvl.backup.rsync: be more lenient with remote path to accept 'host:lvm:...'
Tero Marttila <terom@paivola.fi>
parents: 44
diff changeset
   341
        raise RSyncCommandFormatError("Unrecognized backup path: {path}".format(path=path))
5
23371d26fdd0 split up into pvl.backup package
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   342