Left: | ||
Right: |
OLD | NEW |
---|---|
(Empty) | |
1 #!/usr/bin/env python | |
2 # | |
3 # This file is part of the Adblock Plus infrastructure | |
4 # Copyright (C) 2018-present eyeo GmbH | |
5 # | |
6 # Adblock Plus is free software: you can redistribute it and/or modify | |
7 # it under the terms of the GNU General Public License version 3 as | |
8 # published by the Free Software Foundation. | |
9 # | |
10 # Adblock Plus is distributed in the hope that it will be useful, | |
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 # GNU General Public License for more details. | |
14 # | |
15 # You should have received a copy of the GNU General Public License | |
16 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
17 | |
18 import argparse | |
19 from filecmp import dircmp | |
20 import hashlib | |
21 import os | |
22 import sys | |
23 import shutil | |
24 import tarfile | |
25 import tempfile | |
26 import urllib | |
27 | |
28 | |
29 _doc = """This script MUST be renamed in the form of deploy_$WEBSITE, e.g. | |
mathias
2018/06/18 19:58:38
Why don't you use __doc__?
f.lopez
2018/06/18 22:47:43
Acknowledged.
| |
30 deploy_help.eyeo.com, --name must be provided in order to fetch the | |
31 files, expected files to be fetched are $NAME.tar.gz and $NAME.md5 in | |
32 order to compare the hashes. --source must be an URL, e.g. | |
33 https://helpcenter.eyeofiles.com""" | |
34 | |
35 | |
36 def download(url, temporary_directory): | |
37 file_name = url.split('/')[-1] | |
38 absolute_file_path = os.path.join(temporary_directory, file_name) | |
39 print 'Downloading: ' + file_name | |
40 urllib.urlretrieve(url, absolute_file_path) | |
41 return absolute_file_path | |
42 | |
43 | |
44 def calculate_md5(file): | |
45 with open(file) as f: | |
mathias
2018/06/18 19:58:39
You can `open(file) as handle` or something simila
f.lopez
2018/06/18 22:47:42
Acknowledged.
| |
46 data = f.read() | |
47 md5_result = hashlib.md5(data).hexdigest() | |
48 return md5_result.strip() | |
49 | |
50 | |
51 def read_md5(file): | |
52 with open(file) as f: | |
53 md5_result = f.readline() | |
54 return md5_result.strip() | |
55 | |
56 | |
57 def untar(tar_file, temporary_directory): | |
58 if tarfile.is_tarfile(tar_file): | |
59 with tarfile.open(tar_file, 'r:gz') as tar: | |
60 tar.extractall(temporary_directory) | |
61 | |
62 | |
63 def remove_tree(to_remove): | |
64 if os.path.exists(to_remove): | |
65 if os.path.isdir(to_remove): | |
66 shutil.rmtree(to_remove) | |
67 else: | |
68 os.remove(to_remove) | |
69 | |
70 | |
71 def deploy_files(directory_comparison): | |
72 for name in directory_comparison.diff_files: | |
73 copytree(directory_comparison.right, directory_comparison.left) | |
74 for name in directory_comparison.left_only: | |
75 remove_tree(os.path.join(directory_comparison.left, name)) | |
76 for name in directory_comparison.right_only: | |
77 copytree(directory_comparison.right, directory_comparison.left) | |
78 for subdirectory_comparison in directory_comparison.subdirs.values(): | |
79 deploy_files(subdirectory_comparison) | |
80 | |
81 | |
82 # shutil.copytree copies a tree but the destination directory MUST NOT exist | |
83 # this might break the site for the duration of the files being deployed | |
84 # for more info read: https://docs.python.org/2/library/shutil.html | |
85 def copytree(source, destination): | |
86 if not os.path.exists(destination): | |
87 os.makedirs(destination) | |
88 shutil.copystat(source, destination) | |
89 source_items = os.listdir(source) | |
90 for item in source_items: | |
91 source_path = os.path.join(source, item) | |
92 destination_path = os.path.join(destination, item) | |
93 if os.path.isdir(source_path): | |
94 copytree(source_path, destination_path) | |
95 else: | |
96 shutil.copy2(source_path, destination_path) | |
97 | |
98 | |
99 if __name__ == '__main__': | |
100 website = os.path.basename(__file__)[len("deploy_"):] | |
101 parser = argparse.ArgumentParser( | |
102 description="""Fetch a compressed archive in the form of $NAME.tar.gz | |
103 and deploy it to /var/www/{0} folder""".format(website), | |
104 epilog=_doc, | |
105 ) | |
106 parser.add_argument('--name', action='store', type=str, required=True, | |
107 help='Name of the tarball to deploy') | |
108 parser.add_argument('--source', action='store', type=str, required=True, | |
109 help='The source where files will be downloaded') | |
110 arguments = parser.parse_args() | |
111 name = arguments.name | |
112 source = arguments.source | |
113 url_file = '{0}/{1}.tar.gz'.format(source, name) | |
114 url_md5 = '{0}/{1}.md5'.format(source, name) | |
115 temporary_directory = tempfile.mkdtemp() | |
116 try: | |
117 downloaded_file = download(url_file, temporary_directory) | |
118 downloaded_md5 = download(url_md5, temporary_directory) | |
119 if calculate_md5(downloaded_file) == read_md5(downloaded_md5): | |
120 untar(downloaded_file, temporary_directory) | |
121 name_directory = os.path.join(temporary_directory, name) | |
mathias
2018/06/18 19:58:38
This name is a bit irritating (and was a bit irrit
f.lopez
2018/06/18 22:47:42
Acknowledged.
| |
122 destination = os.path.join('/var/www/', website) | |
123 directory_comparison = dircmp(destination, name_directory) | |
124 print 'Deploying files' | |
125 deploy_files(directory_comparison) | |
126 else: | |
127 sys.exit("Hashes don't match") | |
mathias
2018/06/18 19:58:39
Sorry for not noticing this earlier, but this erro
f.lopez
2018/06/18 22:47:43
Acknowledged.
| |
128 except Exception as error: | |
129 sys.exit(error) | |
130 finally: | |
131 shutil.rmtree(temporary_directory) | |
OLD | NEW |