interface: allow overriding speed/cap/if_index for named interfaces
[metze/samba/wip.git] / bootstrap / template.py
1 #!/usr/bin/env python3
2
3 # Copyright (C) Catalyst.Net Ltd 2019
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 """
19 Manage dependencies and bootstrap environments for Samba.
20
21 CLI script to render bootstrap.sh/Dockerfile/Vagrantfile.
22
23 Author: Joe Guo <joeg@catalyst.net.nz>
24 """
25
26 import io
27 import os
28 import hashlib
29 import logging
30 import argparse
31 from config import DISTS, VAGRANTFILE, OUT
32
33 HERE = os.path.abspath(os.path.dirname(__file__))
34 SHA1SUM_FILE_PATH = os.path.join(HERE, 'sha1sum.txt')
35 README_FILE_PATH = os.path.join(HERE, 'READMD.md')
36
37 logging.basicConfig(level='INFO')
38 log = logging.getLogger(__file__)
39
40
41 def get_files(path):
42     """Get all files recursively in path as a list"""
43     filepaths = []
44     for root, dirnames, filenames in os.walk(path):
45         for filename in filenames:
46             filepath = os.path.join(root, filename)
47             filepaths.append(filepath)
48     return filepaths
49
50
51 def get_sha1sum(debug=False):
52     """Get sha1sum for dists + .gitlab-ci.yml"""
53     filepaths = get_files(HERE)
54     m = hashlib.sha1()
55     i = 0
56     for filepath in sorted(list(filepaths)):
57         _filepath = os.path.relpath(filepath)
58         i += 1
59         if filepath == SHA1SUM_FILE_PATH:
60             d = "skip                                    "
61             if debug:
62                 print("%s: %s: %s" % (i, d, _filepath))
63             continue
64         if filepath == README_FILE_PATH:
65             d = "skip                                    "
66             if debug:
67                 print("%s: %s: %s" % (i, d, _filepath))
68             continue
69         if filepath.endswith('.pyc'):
70             d = "skip                                    "
71             if debug:
72                 print("%s: %s: %s" % (i, d, _filepath))
73             continue
74         with io.open(filepath, mode='rb') as _file:
75             _bytes = _file.read()
76
77             m1 = hashlib.sha1()
78             m1.update(_bytes)
79             d = m1.hexdigest()
80             if debug:
81                 print("%s: %s: %s" % (i, d, _filepath))
82
83             m.update(_bytes)
84     return m.hexdigest()
85
86
87 def render(dists):
88     """Render files for all dists"""
89     for dist, config in dists.items():
90         home = config['home']
91         os.makedirs(home, exist_ok=True)
92         for key in ['bootstrap.sh', 'locale.sh', 'packages.yml', 'Dockerfile']:
93             path = os.path.join(home, key)
94             log.info('%s: render "%s" to %s', dist, key, path)
95             with io.open(path, mode='wt', encoding='utf8') as fp:
96                 fp.write(config[key])
97             if path.endswith('.sh'):
98                 os.chmod(path, 0o755)
99
100     key = 'Vagrantfile'
101     path = os.path.join(OUT, key)
102     log.info('%s: render "%s" to %s', dist, key, path)
103     with io.open(path, mode='wt', encoding='utf8') as fp:
104         fp.write(VAGRANTFILE)
105
106     # always calc sha1sum after render
107     sha1sum = get_sha1sum()
108     log.info('write sha1sum to %s: %s', SHA1SUM_FILE_PATH, sha1sum)
109     with io.open(SHA1SUM_FILE_PATH, mode='wt', encoding='utf8') as fp:
110         fp.write(sha1sum + "\n")
111
112
113 def main():
114     parser = argparse.ArgumentParser(
115         formatter_class=argparse.ArgumentDefaultsHelpFormatter,
116         description=('Render templates with samba dependencies '
117                      'to bootstrap multiple distributions.'))
118
119     parser.add_argument(
120         '-r', '--render', action='store_true', help='Render templates')
121
122     parser.add_argument(
123         '-s', '--sha1sum', action='store_true', help='Print sha1sum')
124     parser.add_argument(
125         '-d', '--debug', action='store_true', help='Debug sha1sum')
126
127     args = parser.parse_args()
128     need_help = True
129
130     if args.render:
131         render(DISTS)
132         need_help = False
133     if args.sha1sum:
134         # we will use the output to check sha1sum in ci
135         print(get_sha1sum(args.debug))
136         need_help = False
137     if need_help:
138         parser.print_help()
139
140
141 if __name__ == '__main__':
142     main()