fwupd/contrib/generate-emulation.py
2022-08-01 13:32:12 +01:00

137 lines
3.8 KiB
Python
Executable File

#!/usr/bin/python3
#
# Copyright (C) 2017 Richard Hughes <richard@hughsie.com>
#
# SPDX-License-Identifier: LGPL-2.1+
#
# pylint: disable=invalid-name,missing-docstring,consider-using-f-string
import json
import sys
from typing import Dict, List, Any
import gi
from gi.repository import GLib
gi.require_version("Fwupd", "2.0")
gi.require_version("Json", "1.0")
from gi.repository import Fwupd # pylint: disable=wrong-import-position
from gi.repository import Json # pylint: disable=wrong-import-position
def _minimize_json(json_str: str) -> str:
nodes = json.loads(json_str)
new_attrs: List[Dict[str, Any]] = []
new_devices: List[Dict[str, Any]] = []
new_bios_attrs: List[Dict[str, Any]] = []
try:
for attr in nodes["SecurityAttributes"]:
new_attr: Dict[str, Any] = {}
for key in attr:
if key in ["AppstreamId", "HsiResult", "Flags", "Plugin"]:
new_attr[key] = attr[key]
new_attrs.append(new_attr)
except KeyError:
pass
try:
for device in nodes["Devices"]:
new_device: Dict[str, Any] = {}
for key in device:
if key not in ["Created", "Modified", "Releases", "Plugin"]:
new_device[key] = device[key]
new_devices.append(new_device)
except KeyError:
pass
try:
for device in nodes["BiosAttributes"]:
new_attr: Dict[str, Any] = {}
for key in device:
if key not in ["Filename"]:
new_attr[key] = device[key]
new_bios_attrs.append(new_attr)
except KeyError:
pass
return json.dumps(
{
"SecurityAttributes": new_attrs,
"Devices": new_devices,
"BiosAttributes": new_bios_attrs,
},
indent=2,
separators=(",", " : "),
)
def _get_host_devices_and_attrs() -> str:
# connect to the running daemon
client = Fwupd.Client()
builder = Json.Builder()
builder.begin_object()
# add devices
try:
devices = client.get_devices()
except GLib.GError as e:
print("ignoring {}".format(e))
else:
builder.set_member_name("Devices")
builder.begin_array()
for device in devices:
builder.begin_object()
device.to_json_full(builder, Fwupd.DEVICE_FLAG_TRUSTED)
builder.end_object()
builder.end_array()
# add security attributes
try:
attrs = client.get_host_security_attrs()
except GLib.GError as e:
print("ignoring {}".format(e))
else:
builder.set_member_name("SecurityAttributes")
builder.begin_array()
for attr in attrs:
builder.begin_object()
attr.to_json(builder)
builder.end_object()
builder.end_array()
# add BIOS attributes
try:
attrs = client.get_bios_attrs()
except GLib.GError as e:
print("ignoring {}".format(e))
else:
builder.set_member_name("BiosAttributes")
builder.begin_array()
for attr in attrs:
builder.begin_object()
attr.to_json(builder)
builder.end_object()
builder.end_array()
# export to JSON
builder.end_object()
generator = Json.Generator()
generator.set_pretty(True)
generator.set_root(builder.get_root())
return generator.to_data()[0]
if len(sys.argv) < 2:
sys.stdout.write(_minimize_json(sys.stdin.read()))
else:
for fn in sys.argv[1:]:
try:
with open(fn, "rb") as f_in:
json_in = f_in.read().decode()
except FileNotFoundError:
json_in = _get_host_devices_and_attrs()
json_out = _minimize_json(json_in).encode()
with open(fn, "wb") as f_out:
f_out.write(json_out)