Statistics
| Branch: | Tag: | Revision:

root / image_creator / rsync.py @ e6f134b3

History | View | Annotate | Download (2.6 kB)

1 74149d07 Nikos Skalkotos
# Copyright 2012 GRNET S.A. All rights reserved.
2 74149d07 Nikos Skalkotos
#
3 74149d07 Nikos Skalkotos
# Redistribution and use in source and binary forms, with or
4 74149d07 Nikos Skalkotos
# without modification, are permitted provided that the following
5 74149d07 Nikos Skalkotos
# conditions are met:
6 74149d07 Nikos Skalkotos
#
7 74149d07 Nikos Skalkotos
#   1. Redistributions of source code must retain the above
8 74149d07 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
9 74149d07 Nikos Skalkotos
#      disclaimer.
10 74149d07 Nikos Skalkotos
#
11 74149d07 Nikos Skalkotos
#   2. Redistributions in binary form must reproduce the above
12 74149d07 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
13 74149d07 Nikos Skalkotos
#      disclaimer in the documentation and/or other materials
14 74149d07 Nikos Skalkotos
#      provided with the distribution.
15 74149d07 Nikos Skalkotos
#
16 74149d07 Nikos Skalkotos
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 74149d07 Nikos Skalkotos
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 74149d07 Nikos Skalkotos
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 74149d07 Nikos Skalkotos
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 74149d07 Nikos Skalkotos
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 74149d07 Nikos Skalkotos
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 74149d07 Nikos Skalkotos
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 74149d07 Nikos Skalkotos
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 74149d07 Nikos Skalkotos
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 74149d07 Nikos Skalkotos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 74149d07 Nikos Skalkotos
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 74149d07 Nikos Skalkotos
# POSSIBILITY OF SUCH DAMAGE.
28 74149d07 Nikos Skalkotos
#
29 74149d07 Nikos Skalkotos
# The views and conclusions contained in the software and
30 74149d07 Nikos Skalkotos
# documentation are those of the authors and should not be
31 74149d07 Nikos Skalkotos
# interpreted as representing official policies, either expressed
32 74149d07 Nikos Skalkotos
# or implied, of GRNET S.A.
33 74149d07 Nikos Skalkotos
34 74149d07 Nikos Skalkotos
import subprocess
35 74149d07 Nikos Skalkotos
36 74149d07 Nikos Skalkotos
37 74149d07 Nikos Skalkotos
class Rsync:
38 74149d07 Nikos Skalkotos
    def __init__(self, src, dest, exclude=[]):
39 74149d07 Nikos Skalkotos
        self.src = src
40 74149d07 Nikos Skalkotos
        self.dest = dest
41 74149d07 Nikos Skalkotos
        self.exclude = exclude
42 74149d07 Nikos Skalkotos
        self.options = ['-v']
43 74149d07 Nikos Skalkotos
44 74149d07 Nikos Skalkotos
    def archive(self):
45 74149d07 Nikos Skalkotos
        self.options.append('-a')
46 74149d07 Nikos Skalkotos
        return self
47 74149d07 Nikos Skalkotos
48 74149d07 Nikos Skalkotos
    def run(self, out, msg):
49 74149d07 Nikos Skalkotos
        cmd = []
50 74149d07 Nikos Skalkotos
        cmd.append('rsync')
51 74149d07 Nikos Skalkotos
        cmd.extend(self.options)
52 74149d07 Nikos Skalkotos
        for i in self.exclude:
53 74149d07 Nikos Skalkotos
            cmd.extend(['--exclude', i])
54 74149d07 Nikos Skalkotos
55 74149d07 Nikos Skalkotos
        dry_run = subprocess.Popen(cmd + ['-n', self.src, self.dest],
56 74149d07 Nikos Skalkotos
                                   shell=False, stdout=subprocess.PIPE,
57 74149d07 Nikos Skalkotos
                                   bufsize=0)
58 74149d07 Nikos Skalkotos
        total = 0
59 74149d07 Nikos Skalkotos
        for line in iter(dry_run.stdout.readline, b''):
60 74149d07 Nikos Skalkotos
            total += 1
61 74149d07 Nikos Skalkotos
62 74149d07 Nikos Skalkotos
        progress = out.Progress(total, msg)
63 74149d07 Nikos Skalkotos
        run = subprocess.Popen(cmd + [self.src, self.dest], shell=False,
64 74149d07 Nikos Skalkotos
                               stdout=subprocess.PIPE, bufsize=0)
65 74149d07 Nikos Skalkotos
        for line in iter(run.stdout.readline, b''):
66 74149d07 Nikos Skalkotos
            progress.next()
67 74149d07 Nikos Skalkotos
68 74149d07 Nikos Skalkotos
        progress.success('done')
69 74149d07 Nikos Skalkotos
70 74149d07 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :