In bundle_volume truncate img file after shrinking
[snf-image-creator] / image_creator / rsync.py
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 :