rsync-lvm-server.py
author Tero Marttila <terom@paivola.fi>
Tue, 14 Feb 2012 14:00:49 +0200
changeset 0 d5fd342015d3
child 1 9211cb493130
permissions -rwxr-xr-x
initial rsync-lvm-server script
0
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/python
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
import subprocess
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
import os, os.path
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import contextlib
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
import logging
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
logging.basicConfig(
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
    format  = '%(processName)s: %(name)s: %(levelname)s %(funcName)s : %(message)s',
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
    level   = logging.DEBUG,
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
log = logging.getLogger()
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
LVM                 = '/sbin/lvm'
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
LVM_VG              = 'asdf'
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
LVM_SNAPSHOT_SIZE   = '5G'
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
def lvm_name (vg, lv) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
        LVM vg/lv name.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    return '{vg}/{lv}'.format(vg=vg, lv=lv)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
def lvm_path (vg, lv) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
        Map LVM VG+LV to /dev path.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    return '/dev/{vg}/{lv}'.format(vg=vg, lv=lv)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
def lvm_invoke (cmd, args) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        Invoke LVM command directly.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        Doesn't give any data on stdin, and keeps process stderr.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
        Returns stdout.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    log.debug("cmd={cmd}, args={args}".format(cmd=cmd, args=args))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
    p = subprocess.Popen([LVM, cmd] + args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
    # get output
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    stdout, stderr = p.communicate(input=None)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    if p.returncode :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        raise Exception("LVM ({cmd}) failed: {returncode}".format(cmd=cmd, returncode=p.returncode))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    return stdout
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
def lvm (cmd, *args, **opts) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
        Invoke simple LVM command with options/arguments, and no output.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
    log.debug("cmd={cmd}, opts={opts}, args={args}".format(cmd=cmd, args=args, opts=opts))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
    # process
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
    opts = [('--{opt}'.format(opt=opt), value if value != True else None) for opt, value in opts.iteritems() if value]
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
    # flatten
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
    opts = [str(opt_part) for opt_parts in opts for opt_part in opt_parts if opt_part]
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
    args = [str(arg) for arg in args if arg]
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
    # invoke
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    lvm_invoke(cmd, opts + args)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
def lvm_snapshot_create (vg, lv, size=LVM_SNAPSHOT_SIZE) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
        Create a new LVM snapshot of the given LV.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
        Returns a (snapshot_name, dev_path) tuple.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    # path to device
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
    lv_name = lvm_name(vg, lv)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
    lv_path = lvm_path(vg, lv)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    # snapshot name
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
    snap_lv = '{lv}-backup'.format(lv=lv)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    snap_name = lvm_name(vg, snap_lv)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    snap_path = lvm_path(vg, snap_lv)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    # verify LV exists
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
    lvm('lvs', lv_name)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
    
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    if not os.path.exists(lv_path) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        raise Exception("lvm_snapshot: source LV does not exist: {path}".format(path=lv_path))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
    if os.path.exists(snap_path) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        raise Exception("lvm_snapshot: target LV snapshot already exists: {path}".format(path=snap_path))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
    # create
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
    lvm('lvcreate', lv_name, snapshot=True, name=snap_lv, size=size)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
    # verify
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
    if not os.path.exists(snap_path) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
        raise Exception("lvm_snapshot: target LV snapshot did not appear: {path}".format(path=snap_path))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
    # yay
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
    return snap_name, snap_path
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
def lvm_snapshot_remove (name) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        Remove given snapshot volume.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
    # XXX: can't deactivate snapshot volume
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
    #lvm('lvchange', name, available='n')
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
    # XXX: risky!
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
    lvm('lvremove', '-f', name)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
@contextlib.contextmanager
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
def lvm_snapshot (*args, **kwargs) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        A Context Manager for handling an LVM snapshot.
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
        with lvm_snapshot(vg, lv) as (snapshot_name, snapshot_path) : ...
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
    """
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
    log.debug("creating snapshot: {0}".format(args))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
    name, path = lvm_snapshot_create(*args, **kwargs)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
    log.debug("got name={0}, path={1}".format(name, path))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
    yield name, path
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
    log.debug("cleanup: {0}".format(name))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
    lvm_snapshot_remove(name)
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
def main (argv) :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
    # XXX: get LV from rsync command
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
    lvm_vg='asdf'
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
    backup_lv='test'
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
    # snapshot
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
    log.info("Open snapshot...")
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
    with lvm_snapshot(lvm_vg, backup_lv) as (snapshot_name, snapshot_path):
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
        log.info("Snapshot opened: {name}".format(name=snapshot_name))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        # ...
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
        log.info("Done, cleaning up")
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
    return 1
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
if __name__ == '__main__' :
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
    import sys
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
    sys.exit(main(sys.argv))
d5fd342015d3 initial rsync-lvm-server script
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156