diff --git a/contrib/add_capsule_header.py b/contrib/firmware_packager/add_capsule_header.py similarity index 100% rename from contrib/add_capsule_header.py rename to contrib/firmware_packager/add_capsule_header.py diff --git a/contrib/firmware_packager/install_dell_bios_exe.py b/contrib/firmware_packager/install_dell_bios_exe.py new file mode 100755 index 000000000..c3adca5af --- /dev/null +++ b/contrib/firmware_packager/install_dell_bios_exe.py @@ -0,0 +1,95 @@ +#!/usr/bin/python3 +# +# Copyright (C) 2019 Mario Limonciello +# +# SPDX-License-Identifier: LGPL-2.1+ + +import dbus +import os.path +import sys +import tempfile +import gi +gi.require_version('Fwupd', '2.0') +from gi.repository import Fwupd #pylint: disable=wrong-import-position +from simple_client import install, check_exists +from add_capsule_header import add_header +from firmware_packager import make_firmware_metainfo, create_firmware_cab + +class Variables: + def __init__(self, device_guid, version): + self.device_guid = device_guid + self.developer_name = "Dell Inc" + self.firmware_name = "New firmware" + self.firmware_summary = "Unknown" + self.firmware_description = "Unknown" + self.firmware_homepage = "https://support.dell.com" + self.contact_info = "Unknown" + self.release_version = version + self.release_description = "Unknown" + +def parse_args(): + """Parse arguments for this client""" + import argparse + parser = argparse.ArgumentParser(description="Interact with fwupd daemon") + parser.add_argument('exe', nargs='?', help='exe file') + parser.add_argument('deviceid', nargs='?', + help='DeviceID to operate on(optional)') + args = parser.parse_args() + return args + +def generate_cab(infile, directory, guid, version): + output = os.path.join(directory, "firmware.bin") + ret = add_header(infile, output, guid) + if ret: + sys.exit(ret) + variables = Variables(guid, version) + make_firmware_metainfo(variables, directory) + create_firmware_cab(variables, directory) + cab = os.path.join(directory, "firmware.cab") + print("Generated CAB file %s" % cab) + return cab + +def find_uefi_device(client, deviceid): + devices = client.get_devices() + for item in devices: + #match the device we were given + if deviceid: + if item.get_id() != deviceid: + continue + # internal + if not item.has_flag(1 << 0): + continue + # needs reboot + if not item.has_flag(1 << 8): + continue + # return the first hit for UEFI plugin + if item.get_plugin() == 'uefi': + print("Installing to %s" % item.get_name()) + return item.get_guid_default(),item.get_id(),item.get_version() + print("Couldn't find any UEFI devices") + sys.exit(1) + +def prompt_reboot(): + print("An update requires a reboot to complete") + while True: + res = input("Restart now? (Y/N) ") + if res.lower() == 'n': + print("Reboot your machine manually to finish the update.") + break + if res.lower() != 'y': + continue + #reboot using logind + obj = dbus.SystemBus().get_object('org.freedesktop.login1', + '/org/freedesktop/login1') + obj.Reboot(True, dbus_interface='org.freedesktop.login1.Manager') + +if __name__ == '__main__': + ARGS = parse_args() + CLIENT = Fwupd.Client() + CLIENT.connect() + check_exists(ARGS.exe) + directory = tempfile.mkdtemp() + guid, deviceid, version=find_uefi_device(CLIENT, ARGS.deviceid) + cab = generate_cab(ARGS.exe, directory, guid, version) + install(CLIENT, cab, deviceid, True, True) + prompt_reboot() \ No newline at end of file diff --git a/contrib/firmware_packager/meson.build b/contrib/firmware_packager/meson.build index 610ff3e4d..d9d4c1446 100644 --- a/contrib/firmware_packager/meson.build +++ b/contrib/firmware_packager/meson.build @@ -1,4 +1,10 @@ if get_option('firmware-packager') install_data('firmware_packager.py', install_dir : 'share/fwupd') + install_data('simple_client.py', + install_dir : 'share/fwupd') + install_data('add_capsule_header.py', + install_dir : 'share/fwupd') + install_data('install_dell_bios_exe.py', + install_dir : 'share/fwupd') endif diff --git a/contrib/simple_client.py b/contrib/firmware_packager/simple_client.py similarity index 100% rename from contrib/simple_client.py rename to contrib/firmware_packager/simple_client.py diff --git a/contrib/fwupd.spec.in b/contrib/fwupd.spec.in index 2a4af0ff0..b030c01e9 100644 --- a/contrib/fwupd.spec.in +++ b/contrib/fwupd.spec.in @@ -283,6 +283,9 @@ rm ${RPM_BUILD_ROOT}%{_sbindir}/flashrom %{_datadir}/metainfo/org.freedesktop.fwupd.metainfo.xml %{_datadir}/icons/hicolor/scalable/apps/org.freedesktop.fwupd.svg %{_datadir}/fwupd/firmware_packager.py +%{_datadir}/fwupd/simple_client.py +%{_datadir}/fwupd/add_capsule_header.py +%{_datadir}/fwupd/install_dell_bios_exe.py %{_unitdir}/fwupd-offline-update.service %{_unitdir}/fwupd.service %{_unitdir}/fwupd-refresh.service