Statistics
| Branch: | Tag: | Revision:

root / image_creator / rsync.py @ e6f134b3

History | View | Annotate | Download (2.6 kB)

1
# Copyright 2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
11
#   2. Redistributions in binary form must reproduce the above
12
#      copyright notice, this list of conditions and the following
13
#      disclaimer in the documentation and/or other materials
14
#      provided with the distribution.
15
#
16
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
# POSSIBILITY OF SUCH DAMAGE.
28
#
29
# The views and conclusions contained in the software and
30
# documentation are those of the authors and should not be
31
# interpreted as representing official policies, either expressed
32
# or implied, of GRNET S.A.
33

    
34
import subprocess
35

    
36

    
37
class Rsync:
38
    def __init__(self, src, dest, exclude=[]):
39
        self.src = src
40
        self.dest = dest
41
        self.exclude = exclude
42
        self.options = ['-v']
43

    
44
    def archive(self):
45
        self.options.append('-a')
46
        return self
47

    
48
    def run(self, out, msg):
49
        cmd = []
50
        cmd.append('rsync')
51
        cmd.extend(self.options)
52
        for i in self.exclude:
53
            cmd.extend(['--exclude', i])
54

    
55
        dry_run = subprocess.Popen(cmd + ['-n', self.src, self.dest],
56
                                   shell=False, stdout=subprocess.PIPE,
57
                                   bufsize=0)
58
        total = 0
59
        for line in iter(dry_run.stdout.readline, b''):
60
            total += 1
61

    
62
        progress = out.Progress(total, msg)
63
        run = subprocess.Popen(cmd + [self.src, self.dest], shell=False,
64
                               stdout=subprocess.PIPE, bufsize=0)
65
        for line in iter(run.stdout.readline, b''):
66
            progress.next()
67

    
68
        progress.success('done')
69

    
70
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :