gnutls: allow gnutls_aead_cipher_encryptv2 with gcm before 3.6.15
[Samba.git] / bootstrap / config.py
blobb5d04d4e3712565e175059d6d435a0b7ea3d2cf0
1 #!/usr/bin/env python3
3 # Copyright (C) Catalyst.Net Ltd 2019
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.
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.
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/>.
18 """
19 Manage dependencies and bootstrap environments for Samba.
21 Config file for packages and templates.
23 Author: Joe Guo <joeg@catalyst.net.nz>
24 """
25 import os
26 from os.path import abspath, dirname, join
27 HERE = abspath(dirname(__file__))
28 # output dir for rendered files
29 OUT = join(HERE, 'generated-dists')
32 # pkgs with same name in all packaging systems
33 COMMON = [
34 'acl',
35 'attr',
36 'autoconf',
37 'binutils',
38 'bison',
39 'ccache',
40 'curl',
41 'chrpath',
42 'flex',
43 'gcc',
44 'gdb',
45 'git',
46 'gzip',
47 'hostname',
48 'htop',
49 'lcov',
50 'make',
51 'patch',
52 'perl',
53 'psmisc', # for pstree in test
54 'rng-tools',
55 'rsync',
56 'sed',
57 'sudo', # docker images has no sudo by default
58 'tar',
59 'tree',
60 'wget',
64 # define pkgs for all packaging systems in parallel
65 # make it easier to find missing ones
66 # use latest ubuntu and fedora as defaults
67 # deb, rpm, ...
68 PKGS = [
69 # NAME1-dev, NAME2-devel
70 ('lmdb-utils', 'lmdb'),
71 ('mingw-w64', 'mingw64-gcc'),
72 ('zlib1g-dev', 'zlib-devel'),
73 ('libbsd-dev', 'libbsd-devel'),
74 ('liburing-dev', 'liburing-devel'),
75 ('libarchive-dev', 'libarchive-devel'),
76 ('libblkid-dev', 'libblkid-devel'),
77 ('libcap-dev', 'libcap-devel'),
78 ('libacl1-dev', 'libacl-devel'),
79 ('libattr1-dev', 'libattr-devel'),
81 # libNAME1-dev, NAME2-devel
82 ('libpopt-dev', 'popt-devel'),
83 ('libreadline-dev', 'readline-devel'),
84 ('libjansson-dev', 'jansson-devel'),
85 ('liblmdb-dev', 'lmdb-devel'),
86 ('libncurses5-dev', 'ncurses-devel'),
87 # NOTE: Debian 7+ or Ubuntu 16.04+
88 ('libsystemd-dev', 'systemd-devel'),
89 ('libkrb5-dev', 'krb5-devel'),
90 ('libldap2-dev', 'openldap-devel'),
91 ('libcups2-dev', 'cups-devel'),
92 ('libpam0g-dev', 'pam-devel'),
93 ('libgpgme11-dev', 'gpgme-devel'),
94 # NOTE: Debian 8+ and Ubuntu 14.04+
95 ('libgnutls28-dev', 'gnutls-devel'),
96 ('libtasn1-bin', 'libtasn1-tools'),
97 ('libtasn1-dev', 'libtasn1-devel'),
98 ('', 'quota-devel'),
99 ('uuid-dev', 'libuuid-devel'),
100 ('libjs-jquery', ''),
101 ('libavahi-common-dev', 'avahi-devel'),
102 ('libdbus-1-dev', 'dbus-devel'),
103 ('libpcap-dev', 'libpcap-devel'),
104 ('libunwind-dev', 'libunwind-devel'), # for back trace
105 ('libglib2.0-dev', 'glib2-devel'),
106 ('libicu-dev', 'libicu-devel'),
107 ('heimdal-multidev', ''),
109 # NAME1, NAME2
110 # for debian, locales provide locale support with language packs
111 # ubuntu split language packs to language-pack-xx
112 # for centos, glibc-common provide locale support with language packs
113 # fedora split language packs to glibc-langpack-xx
114 ('locales', 'glibc-common'), # required for locale
115 ('language-pack-en', 'glibc-langpack-en'), # we need en_US.UTF-8
116 ('bind9utils', 'bind-utils'),
117 ('dnsutils', ''),
118 ('xsltproc', 'libxslt'),
119 ('krb5-user', ''),
120 ('krb5-config', ''),
121 ('krb5-kdc', 'krb5-server'),
122 ('apt-utils', 'yum-utils'),
123 ('pkg-config', 'pkgconfig'),
124 ('procps', 'procps-ng'), # required for the free cmd in tests
125 ('lsb-release', 'lsb-release'), # we need lsb_relase to show info
126 ('', 'rpcgen'), # required for test
127 # refer: https://fedoraproject.org/wiki/Changes/SunRPCRemoval
128 ('', 'libtirpc-devel'), # for <rpc/rpc.h> header on fedora
129 ('', 'rpcsvc-proto-devel'), # for <rpcsvc/rquota.h> header
130 ('mawk', 'gawk'),
132 ('python3', 'python3'),
133 ('python3-cryptography', 'python3-cryptography'), # for krb5 tests
134 ('python3-dev', 'python3-devel'),
135 ('python3-dbg', ''),
136 ('python3-iso8601', 'python3-iso8601'),
137 ('python3-gpg', 'python3-gpg'), # defaults to ubuntu/fedora latest
138 ('python3-markdown', 'python3-markdown'),
139 ('python3-matplotlib', ''),
140 ('python3-dnspython', 'python3-dns'),
141 ('python3-pexpect', ''), # for wintest only
142 ('python3-pyasn1', 'python3-pyasn1'), # for krb5 tests
143 ('python3-setproctitle', 'python3-setproctitle'),
145 ('', 'libsemanage-python'),
146 ('', 'policycoreutils-python'),
148 # perl
149 ('libparse-yapp-perl', 'perl-Parse-Yapp'),
150 ('libjson-perl', 'perl-JSON'),
151 ('', 'perl-JSON-Parse'),
152 ('perl-modules', ''),
153 ('', 'perl-FindBin'),
154 ('', 'perl-Archive-Tar'),
155 ('', 'perl-ExtUtils-MakeMaker'),
156 ('', 'perl-Test-Base'),
157 ('', 'perl-generators'),
158 ('', 'perl-interpreter'),
160 # fs
161 ('xfslibs-dev', 'xfsprogs-devel'), # for xfs quota support
162 ('', 'glusterfs-api-devel'),
163 ('glusterfs-common', 'glusterfs-devel'),
164 ('libcephfs-dev', 'libcephfs-devel'),
166 # spotlight
167 ('libtracker-sparql-2.0-dev', 'tracker-devel'),
169 # misc
170 # @ means group for rpm, use fedora as rpm default
171 ('build-essential', '@development-tools'),
172 ('debhelper', ''),
173 # rpm has no pkg for docbook-xml
174 ('docbook-xml', 'docbook-dtds'),
175 ('docbook-xsl', 'docbook-style-xsl'),
176 ('', 'keyutils-libs-devel'),
177 ('', 'which'),
181 DEB_PKGS = COMMON + [pkg for pkg, _ in PKGS if pkg]
182 RPM_PKGS = COMMON + [pkg for _, pkg in PKGS if pkg]
184 GENERATED_MARKER = r"""
186 # This file is generated by 'bootstrap/template.py --render'
187 # See also bootstrap/config.py
192 APT_BOOTSTRAP = r"""
193 #!/bin/bash
194 {GENERATED_MARKER}
195 set -xueo pipefail
197 export DEBIAN_FRONTEND=noninteractive
198 apt-get -y update
200 apt-get -y install \
201 {pkgs}
203 apt-get -y autoremove
204 apt-get -y autoclean
205 apt-get -y clean
209 YUM_BOOTSTRAP = r"""
210 #!/bin/bash
211 {GENERATED_MARKER}
212 set -xueo pipefail
214 yum update -y
215 yum install -y epel-release
216 yum install -y yum-plugin-copr
217 yum copr enable -y sergiomb/SambaAD
218 yum update -y
220 yum install -y \
221 {pkgs}
223 yum clean all
225 if [ ! -f /usr/bin/python3 ]; then
226 ln -sf /usr/bin/python3.6 /usr/bin/python3
230 CENTOS8_YUM_BOOTSTRAP = r"""
231 #!/bin/bash
232 {GENERATED_MARKER}
233 set -xueo pipefail
235 yum update -y
236 yum install -y dnf-plugins-core
237 yum install -y epel-release
239 yum -v repolist all
240 yum config-manager --set-enabled PowerTools -y || \
241 yum config-manager --set-enabled powertools -y
242 yum config-manager --set-enabled Devel -y || \
243 yum config-manager --set-enabled devel -y
244 yum update -y
246 yum install -y \
247 --setopt=install_weak_deps=False \
248 {pkgs}
250 yum clean all
253 DNF_BOOTSTRAP = r"""
254 #!/bin/bash
255 {GENERATED_MARKER}
256 set -xueo pipefail
258 dnf update -y
260 dnf install -y \
261 --setopt=install_weak_deps=False \
262 {pkgs}
264 dnf clean all
267 ZYPPER_BOOTSTRAP = r"""
268 #!/bin/bash
269 {GENERATED_MARKER}
270 set -xueo pipefail
272 zypper --non-interactive refresh
273 zypper --non-interactive update
274 zypper --non-interactive install \
275 --no-recommends \
276 system-user-nobody \
277 {pkgs}
279 zypper --non-interactive clean
281 if [ -f /usr/lib/mit/bin/krb5-config ]; then
282 ln -sf /usr/lib/mit/bin/krb5-config /usr/bin/krb5-config
286 # A generic shell script to setup locale
287 LOCALE_SETUP = r"""
288 #!/bin/bash
289 {GENERATED_MARKER}
290 set -xueo pipefail
292 # refer to /usr/share/i18n/locales
293 INPUTFILE=en_US
294 # refer to /usr/share/i18n/charmaps
295 CHARMAP=UTF-8
296 # locale to generate in /usr/lib/locale
297 # glibc/localedef will normalize UTF-8 to utf8, follow the naming style
298 LOCALE=$INPUTFILE.utf8
300 # if locale is already correct, exit
301 ( locale | grep LC_ALL | grep -i $LOCALE ) && exit 0
303 # if locale not available, generate locale into /usr/lib/locale
304 if ! ( locale --all-locales | grep -i $LOCALE )
305 then
306 # no-archive means create its own dir
307 localedef --inputfile $INPUTFILE --charmap $CHARMAP --no-archive $LOCALE
310 # update locale conf and global env file
311 # set both LC_ALL and LANG for safe
313 # update conf for Debian family
314 FILE=/etc/default/locale
315 if [ -f $FILE ]
316 then
317 echo LC_ALL="$LOCALE" > $FILE
318 echo LANG="$LOCALE" >> $FILE
321 # update conf for RedHat family
322 FILE=/etc/locale.conf
323 if [ -f $FILE ]
324 then
325 # LC_ALL is not valid in this file, set LANG only
326 echo LANG="$LOCALE" > $FILE
329 # update global env file
330 FILE=/etc/environment
331 if [ -f $FILE ]
332 then
333 # append LC_ALL if not exist
334 grep LC_ALL $FILE || echo LC_ALL="$LOCALE" >> $FILE
335 # append LANG if not exist
336 grep LANG $FILE || echo LANG="$LOCALE" >> $FILE
341 DOCKERFILE = r"""
342 {GENERATED_MARKER}
343 FROM {docker_image}
345 # pass in with --build-arg while build
346 ARG SHA1SUM
347 RUN [ -n $SHA1SUM ] && echo $SHA1SUM > /sha1sum.txt
349 ADD *.sh /tmp/
350 # need root permission, do it before USER samba
351 RUN /tmp/bootstrap.sh && /tmp/locale.sh
353 # if ld.gold exists, force link it to ld
354 RUN set -x; LD=$(which ld); LD_GOLD=$(which ld.gold); test -x $LD_GOLD && ln -sf $LD_GOLD $LD && test -x $LD && echo "$LD is now $LD_GOLD"
356 # make test can not work with root, so we have to create a new user
357 RUN useradd -m -U -s /bin/bash samba && \
358 mkdir -p /etc/sudoers.d && \
359 echo "samba ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/samba
361 USER samba
362 WORKDIR /home/samba
363 # samba tests rely on this
364 ENV USER=samba LC_ALL=en_US.utf8 LANG=en_US.utf8
367 # Vagrantfile snippet for each dist
368 VAGRANTFILE_SNIPPET = r"""
369 config.vm.define "{name}" do |v|
370 v.vm.box = "{vagrant_box}"
371 v.vm.hostname = "{name}"
372 v.vm.provision :shell, path: "{name}/bootstrap.sh"
373 v.vm.provision :shell, path: "{name}/locale.sh"
377 # global Vagrantfile with snippets for all dists
378 VAGRANTFILE_GLOBAL = r"""
379 {GENERATED_MARKER}
381 Vagrant.configure("2") do |config|
382 config.ssh.insert_key = false
384 {vagrantfile_snippets}
390 DEB_DISTS = {
391 'debian10': {
392 'docker_image': 'debian:10',
393 'vagrant_box': 'debian/buster64',
394 'replace': {
395 'language-pack-en': '', # included in locales
396 'liburing-dev': '', # not available
399 'ubuntu1604': {
400 'docker_image': 'ubuntu:16.04',
401 'vagrant_box': 'ubuntu/xenial64',
402 'replace': {
403 'python3-gpg': 'python3-gpgme',
404 'glusterfs-common': '',
405 'libcephfs-dev': '',
406 'liburing-dev': '', # not available
407 'libtracker-sparql-2.0-dev': '', # not available
410 'ubuntu1804': {
411 'docker_image': 'ubuntu:18.04',
412 'vagrant_box': 'ubuntu/bionic64',
413 'replace': {
414 'liburing-dev': '', # not available
417 'ubuntu2004': {
418 'docker_image': 'ubuntu:20.04',
419 'vagrant_box': 'ubuntu/focal64',
420 'replace': {
421 'liburing-dev': '', # not available
427 RPM_DISTS = {
428 'centos7': {
429 'docker_image': 'centos:7',
430 'vagrant_box': 'centos/7',
431 'bootstrap': YUM_BOOTSTRAP,
432 'replace': {
433 'lsb-release': 'redhat-lsb',
434 'python3': 'python36',
435 'python3-cryptography': 'python36-cryptography',
436 'python3-devel': 'python36-devel',
437 'python3-dns': 'python36-dns',
438 'python3-pyasn1': 'python36-pyasn1',
439 'python3-gpg': 'python36-gpg',
440 'python3-iso8601' : 'python36-iso8601',
441 'python3-markdown': 'python36-markdown',
442 # although python36-devel is available
443 # after epel-release installed
444 # however, all other python3 pkgs are still python36-ish
445 'python2-gpg': 'pygpgme',
446 'python3-gpg': '', # no python3-gpg yet
447 '@development-tools': '"@Development Tools"', # add quotes
448 'glibc-langpack-en': '', # included in glibc-common
449 'glibc-locale-source': '', # included in glibc-common
450 # update perl core modules on centos
451 # fix: Can't locate Archive/Tar.pm in @INC
452 'perl': 'perl-core',
453 'perl-FindBin': '',
454 'rpcsvc-proto-devel': '',
455 'glusterfs-api-devel': '',
456 'glusterfs-devel': '',
457 'libcephfs-devel': '',
458 'gnutls-devel': 'compat-gnutls34-devel',
459 'liburing-devel': '', # not available
460 'python3-setproctitle': 'python36-setproctitle',
461 'tracker-devel': '', # do not install
464 'centos8': {
465 'docker_image': 'centos:8',
466 'vagrant_box': 'centos/8',
467 'bootstrap': CENTOS8_YUM_BOOTSTRAP,
468 'replace': {
469 'lsb-release': 'redhat-lsb',
470 '@development-tools': '"@Development Tools"', # add quotes
471 'libsemanage-python': 'python3-libsemanage',
472 'lcov': '', # does not exist
473 'perl-JSON-Parse': '', # does not exist?
474 'perl-Test-Base': 'perl-Test-Simple',
475 'perl-FindBin': '',
476 'policycoreutils-python': 'python3-policycoreutils',
477 'liburing-devel': '', # not available yet, Add me back, once available!
480 'fedora33': {
481 'docker_image': 'fedora:33',
482 'vagrant_box': 'fedora/33-cloud-base',
483 'bootstrap': DNF_BOOTSTRAP,
484 'replace': {
485 'lsb-release': 'redhat-lsb',
486 'libsemanage-python': 'python3-libsemanage',
487 'policycoreutils-python': 'python3-policycoreutils',
490 'fedora34': {
491 'docker_image': 'fedora:34',
492 'vagrant_box': 'fedora/34-cloud-base',
493 'bootstrap': DNF_BOOTSTRAP,
494 'replace': {
495 'lsb-release': 'redhat-lsb',
496 'libsemanage-python': 'python3-libsemanage',
497 'policycoreutils-python': 'python3-policycoreutils',
498 'perl-FindBin': '',
499 'libtracker-sparql-2.0-dev': '', # only tracker 3.x is available
502 'opensuse151': {
503 'docker_image': 'opensuse/leap:15.1',
504 'vagrant_box': 'opensuse/openSUSE-15.1-x86_64',
505 'bootstrap': ZYPPER_BOOTSTRAP,
506 'replace': {
507 '@development-tools': '',
508 'dbus-devel': 'dbus-1-devel',
509 'docbook-style-xsl': 'docbook-xsl-stylesheets',
510 'glibc-common': 'glibc-locale',
511 'glibc-locale-source': 'glibc-i18ndata',
512 'glibc-langpack-en': '',
513 'jansson-devel': 'libjansson-devel',
514 'keyutils-libs-devel': 'keyutils-devel',
515 'krb5-workstation': 'krb5-client',
516 'libsemanage-python': 'python2-semanage',
517 'openldap-devel': 'openldap2-devel',
518 'perl-Archive-Tar': 'perl-Archive-Tar-Wrapper',
519 'perl-JSON-Parse': 'perl-JSON-XS',
520 'perl-generators': '',
521 'perl-interpreter': '',
522 'perl-FindBin': '',
523 'procps-ng': 'procps',
524 'python3-dns': 'python3-dnspython',
525 'python3-markdown': 'python3-Markdown',
526 'quota-devel': '',
527 'glusterfs-api-devel': '',
528 'libtasn1-tools': '', # asn1Parser is part of libtasn1
529 'mingw64-gcc': '', # doesn't exist
530 'liburing-devel': '', # not available
533 'opensuse152': {
534 'docker_image': 'opensuse/leap:15.2',
535 'vagrant_box': 'opensuse/openSUSE-15.2-x86_64',
536 'bootstrap': ZYPPER_BOOTSTRAP,
537 'replace': {
538 '@development-tools': '',
539 'dbus-devel': 'dbus-1-devel',
540 'docbook-style-xsl': 'docbook-xsl-stylesheets',
541 'glibc-common': 'glibc-locale',
542 'glibc-locale-source': 'glibc-i18ndata',
543 'glibc-langpack-en': '',
544 'jansson-devel': 'libjansson-devel',
545 'keyutils-libs-devel': 'keyutils-devel',
546 'krb5-workstation': 'krb5-client',
547 'libsemanage-python': 'python2-semanage',
548 'openldap-devel': 'openldap2-devel',
549 'perl-Archive-Tar': 'perl-Archive-Tar-Wrapper',
550 'perl-JSON-Parse': 'perl-JSON-XS',
551 'perl-generators': '',
552 'perl-interpreter': '',
553 'perl-FindBin': '',
554 'procps-ng': 'procps',
555 'python3-dns': 'python3-dnspython',
556 'python3-markdown': 'python3-Markdown',
557 'quota-devel': '',
558 'glusterfs-api-devel': '',
559 'libtasn1-tools': '', # asn1Parser is part of libtasn1
565 DEB_FAMILY = {
566 'name': 'deb',
567 'pkgs': DEB_PKGS,
568 'bootstrap': APT_BOOTSTRAP, # family default
569 'dists': DEB_DISTS,
573 RPM_FAMILY = {
574 'name': 'rpm',
575 'pkgs': RPM_PKGS,
576 'bootstrap': YUM_BOOTSTRAP, # family default
577 'dists': RPM_DISTS,
581 YML_HEADER = r"""
583 packages:
587 def expand_family_dists(family):
588 dists = {}
589 for name, config in family['dists'].items():
590 config = config.copy()
591 config['name'] = name
592 config['home'] = join(OUT, name)
593 config['family'] = family['name']
594 config['GENERATED_MARKER'] = GENERATED_MARKER
596 # replace dist specific pkgs
597 replace = config.get('replace', {})
598 pkgs = []
599 for pkg in family['pkgs']:
600 pkg = replace.get(pkg, pkg) # replace if exists or get self
601 if pkg:
602 pkgs.append(pkg)
603 pkgs.sort()
605 lines = [' - {}'.format(pkg) for pkg in pkgs]
606 config['packages.yml'] = YML_HEADER.lstrip() + os.linesep.join(lines)
608 sep = ' \\' + os.linesep + ' '
609 config['pkgs'] = sep.join(pkgs)
611 # get dist bootstrap template or fall back to family default
612 bootstrap_template = config.get('bootstrap', family['bootstrap'])
613 config['bootstrap.sh'] = bootstrap_template.format(**config).strip()
614 config['locale.sh'] = LOCALE_SETUP.format(**config).strip()
616 config['Dockerfile'] = DOCKERFILE.format(**config).strip()
617 # keep the indent, no strip
618 config['vagrantfile_snippet'] = VAGRANTFILE_SNIPPET.format(**config)
620 dists[name] = config
621 return dists
624 # expanded config for dists
625 DEB_DISTS_EXP = expand_family_dists(DEB_FAMILY)
626 RPM_DISTS_EXP = expand_family_dists(RPM_FAMILY)
628 # assemble all together
629 DISTS = {}
630 DISTS.update(DEB_DISTS_EXP)
631 DISTS.update(RPM_DISTS_EXP)
634 def render_vagrantfile(dists):
636 Render all snippets for each dist into global Vagrantfile.
638 Vagrant supports multiple vms in one Vagrantfile.
639 This make it easier to manage the fleet, e.g:
641 start all: vagrant up
642 start one: vagrant up ubuntu1804
644 All other commands apply to above syntax, e.g.: status, destroy, provision
646 # sort dists by name and put all vagrantfile snippets together
647 snippets = [
648 dists[dist]['vagrantfile_snippet']
649 for dist in sorted(dists.keys())]
651 return VAGRANTFILE_GLOBAL.format(
652 vagrantfile_snippets=''.join(snippets),
653 GENERATED_MARKER=GENERATED_MARKER
657 VAGRANTFILE = render_vagrantfile(DISTS)
660 # data we need to expose
661 __all__ = ['DISTS', 'VAGRANTFILE', 'OUT']