fwupd/contrib/ci/generate_debian.py
Norbert Kamiński 60e84c617f contrib/qubes: Add Qubes wrapper source and create packages
This patch is adding the fwupd wrapper for Qubes.
The wrapper provides fwupd functionalities for Qubes R4.1.
It creates three packages (two RPMs and one Debian package):
fwupd-qubes-dom0 (RPM)
fwupd-qubes-vm (RPM)
fwupd-qubes-vm-whonix (deb)
More information about the wrapper could be found in the
contrib/qubes/README.md

Signed-off-by: Norbert Kamiński <norbert.kaminski@3mdeb.com>
2021-02-26 06:40:21 +00:00

169 lines
5.7 KiB
Python
Executable File

#!/usr/bin/python3
#
# Copyright (C) 2017 Dell, Inc.
#
# SPDX-License-Identifier: LGPL-2.1+
#
import os
import sys
import xml.etree.ElementTree as etree
def parse_control_dependencies(requested_type):
TARGET = os.getenv('OS')
QUBES = os.getenv('QUBES')
deps = []
dep = ''
if TARGET == '':
print("Missing OS environment variable")
sys.exit(1)
OS = TARGET
SUBOS = ''
if TARGET:
split = TARGET.split('-')
if len(split) >= 2:
OS = split[0]
SUBOS = split[1]
else:
import lsb_release
OS = lsb_release.get_distro_information()['ID'].lower()
import platform
SUBOS = platform.machine()
tree = etree.parse(os.path.join(os.path.dirname(sys.argv[0]), "dependencies.xml"))
root = tree.getroot()
for child in root:
if not "type" in child.attrib or not "id" in child.attrib:
continue
for distro in child:
if not "id" in distro.attrib:
continue
if distro.attrib["id"] != OS:
continue
control = distro.find("control")
if control is None:
continue
packages = distro.findall("package")
for package in packages:
if SUBOS:
if not 'variant' in package.attrib:
continue
if package.attrib['variant'] != SUBOS:
continue
if package.text:
dep = package.text
else:
dep = child.attrib["id"]
if child.attrib["type"] == requested_type and dep:
version = control.find('version')
if version is not None:
dep = "%s %s" % (dep, version.text)
inclusions = control.findall('inclusive')
if inclusions:
for i in range(0, len(inclusions)):
prefix = ''
suffix = ' '
if i == 0:
prefix = " ["
if i == len(inclusions) - 1:
suffix = "]"
dep = "%s%s%s%s" % (dep, prefix, inclusions[i].text, suffix)
exclusions = control.findall('exclusive')
if exclusions:
for i in range(0, len(exclusions)):
prefix = '!'
suffix = ' '
if i == 0:
prefix = " [!"
if i == len(exclusions) - 1:
suffix = "]"
dep = "%s%s%s%s" % (dep, prefix, exclusions[i].text, suffix)
deps.append(dep)
return deps, QUBES
def update_debian_control(target):
control_in = os.path.join(target, 'control.in')
control_out = os.path.join(target, 'control')
if not os.path.exists(control_in):
print("Missing file %s" % control_in)
sys.exit(1)
with open(control_in, 'r') as rfd:
lines = rfd.readlines()
deps, QUBES = parse_control_dependencies("build")
deps.sort()
if QUBES:
lines += '\n'
control_qubes_in = os.path.join(target, 'control.qubes.in')
with open(control_qubes_in, 'r') as rfd:
lines += rfd.readlines()
with open(control_out, 'w') as wfd:
for line in lines:
if line.startswith("Build-Depends: %%%DYNAMIC%%%"):
wfd.write("Build-Depends:\n")
for i in range(0, len(deps)):
wfd.write("\t%s,\n" % deps[i])
elif "fwupd-qubes-vm-whonix" in line and not QUBES:
break
else:
wfd.write(line)
def update_debian_copyright(directory):
copyright_in = os.path.join(directory, 'copyright.in')
copyright_out = os.path.join(directory, 'copyright')
if not os.path.exists(copyright_in):
print("Missing file %s" % copyright_in)
sys.exit(1)
# Assume all files are remaining LGPL-2.1+
copyrights = []
for root, dirs, files in os.walk('.'):
for file in files:
target = os.path.join(root, file)
# skip translations and license file
if target.startswith('./po/') or file == "COPYING":
continue
try:
with open(target, 'r') as rfd:
# read about the first few lines of the file only
lines = rfd.readlines(220)
except UnicodeDecodeError:
continue
except FileNotFoundError:
continue
for line in lines:
if 'Copyright (C) ' in line:
parts = line.split('Copyright (C)')[
1
].strip() # split out the copyright header
partition = parts.partition(' ')[2] # remove the year string
copyrights += ["%s" % partition]
copyrights = "\n\t ".join(sorted(set(copyrights)))
with open(copyright_in, 'r') as rfd:
lines = rfd.readlines()
with open(copyright_out, 'w') as wfd:
for line in lines:
if line.startswith("%%%DYNAMIC%%%"):
wfd.write("Files: *\n")
wfd.write("Copyright: %s\n" % copyrights)
wfd.write("License: LGPL-2.1+\n")
wfd.write("\n")
else:
wfd.write(line)
directory = os.path.join(os.getcwd(), 'debian')
update_debian_control(directory)
update_debian_copyright(directory)