From ff29029b1a6e55fdbd8cf8393c84e6610841a9bd Mon Sep 17 00:00:00 2001 From: DistroBaker Date: Tue, 19 Jan 2021 12:57:39 +0000 Subject: [PATCH] Merged update from upstream sources This is an automated DistroBaker update from upstream sources. If you do not know what this is about or would like to opt out, contact the OSCI team. Source: https://src.fedoraproject.org/rpms/upower.git#793a5d858a0655c85ac61fd4444e2a769c288331 --- upower-no-usb-dep.patch | 574 ++++++++++++++++++++++++++++++++++++++++ upower.spec | 15 +- 2 files changed, 587 insertions(+), 2 deletions(-) create mode 100644 upower-no-usb-dep.patch diff --git a/upower-no-usb-dep.patch b/upower-no-usb-dep.patch new file mode 100644 index 0000000..548f2a0 --- /dev/null +++ b/upower-no-usb-dep.patch @@ -0,0 +1,574 @@ +From 4227d0c439aa8f812c702f7f169be545d3a139e1 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Tue, 19 Jan 2021 13:28:48 +0100 +Subject: [PATCH 1/2] linux: Remove support for CSR devices + +Those devices date back from the mid-2000s. If they still work, and +somebody is still interested in having them export their battery status, +we would recommend moving this information to the appropriate kernel +drivers. +--- + rules/95-upower-csr.rules | 21 --- + rules/Makefile.am | 1 - + src/linux/Makefile.am | 2 - + src/linux/up-backend.c | 8 - + src/linux/up-device-csr.c | 344 -------------------------------------- + src/linux/up-device-csr.h | 56 ------- + 6 files changed, 432 deletions(-) + delete mode 100644 rules/95-upower-csr.rules + delete mode 100644 src/linux/up-device-csr.c + delete mode 100644 src/linux/up-device-csr.h + +diff --git a/rules/95-upower-csr.rules b/rules/95-upower-csr.rules +deleted file mode 100644 +index 7c5f560..0000000 +--- a/rules/95-upower-csr.rules ++++ /dev/null +@@ -1,21 +0,0 @@ +-############################################################################################################## +-# Logitech Mice with CSR battery readouts +-# +-# These are properties defining the behavior: +-# UPOWER_CSR_DUAL (Dual Receiver) +-# +-SUBSYSTEM!="usb", GOTO="up_csr_end" +- +-ATTR{idVendor}=="046d", ENV{UPOWER_VENDOR}="Logitech, Inc." +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c501", ENV{UPOWER_PRODUCT}="Mouse Receiver", ENV{UPOWER_BATTERY_TYPE}="mouse" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c502", ENV{UPOWER_PRODUCT}="Dual Receiver", ENV{UPOWER_BATTERY_TYPE}="mouse", ENV{UPOWER_CSR_DUAL}="1" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c504", ENV{UPOWER_PRODUCT}="Freedom Optical", ENV{UPOWER_BATTERY_TYPE}="mouse", ENV{UPOWER_CSR_DUAL}="1" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c505", ENV{UPOWER_PRODUCT}="Elite Duo", ENV{UPOWER_BATTERY_TYPE}="keyboard" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c506", ENV{UPOWER_PRODUCT}="MX700 Optical Mouse", ENV{UPOWER_BATTERY_TYPE}="mouse" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c508", ENV{UPOWER_PRODUCT}="Optical TrackMan", ENV{UPOWER_BATTERY_TYPE}="mouse" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c50e", ENV{UPOWER_PRODUCT}="MX1000 Laser Mouse", ENV{UPOWER_BATTERY_TYPE}="mouse" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c510", ENV{UPOWER_PRODUCT}="Click! Mouse", ENV{UPOWER_BATTERY_TYPE}="mouse" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c512", ENV{UPOWER_PRODUCT}="Keyboard+Mouse Receiver", ENV{UPOWER_BATTERY_TYPE}="keyboard" +-ATTR{idVendor}=="046d", ATTR{idProduct}=="c702", ENV{UPOWER_PRODUCT}="Presenter", ENV{UPOWER_BATTERY_TYPE}="mouse" +- +-LABEL="up_csr_end" +diff --git a/rules/Makefile.am b/rules/Makefile.am +index 5262d9e..1d71d24 100644 +--- a/rules/Makefile.am ++++ b/rules/Makefile.am +@@ -3,7 +3,6 @@ + udevrules_DATA = \ + 95-upower-wup.rules \ + 95-upower-hid.rules \ +- 95-upower-csr.rules \ + 95-upower-hidpp.rules + + EXTRA_DIST = \ +diff --git a/src/linux/Makefile.am b/src/linux/Makefile.am +index aec0b31..82f60fd 100644 +--- a/src/linux/Makefile.am ++++ b/src/linux/Makefile.am +@@ -29,8 +29,6 @@ endif + libupshared_la_SOURCES = \ + up-device-supply.c \ + up-device-supply.h \ +- up-device-csr.c \ +- up-device-csr.h \ + up-device-unifying.c \ + up-device-unifying.h \ + up-device-hid.c \ +diff --git a/src/linux/up-backend.c b/src/linux/up-backend.c +index 04e6f2f..e17a946 100644 +--- a/src/linux/up-backend.c ++++ b/src/linux/up-backend.c +@@ -38,7 +38,6 @@ + #include "sysfs-utils.h" + + #include "up-device-supply.h" +-#include "up-device-csr.h" + #include "up-device-unifying.h" + #include "up-device-wup.h" + #include "up-device-hid.h" +@@ -147,13 +146,6 @@ up_backend_device_new (UpBackend *backend, GUdevDevice *native) + g_object_unref (device); + #endif /* HAVE_IDEVICE */ + +- /* see if this is a CSR mouse or keyboard */ +- device = UP_DEVICE (up_device_csr_new ()); +- ret = up_device_coldplug (device, backend->priv->daemon, G_OBJECT (native)); +- if (ret) +- goto out; +- g_object_unref (device); +- + /* try to detect a HID UPS */ + device = UP_DEVICE (up_device_hid_new ()); + ret = up_device_coldplug (device, backend->priv->daemon, G_OBJECT (native)); +diff --git a/src/linux/up-device-csr.c b/src/linux/up-device-csr.c +deleted file mode 100644 +index 63442d8..0000000 +--- a/src/linux/up-device-csr.c ++++ /dev/null +@@ -1,344 +0,0 @@ +-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- +- * +- * Copyright (C) 2005-2010 Richard Hughes +- * Copyright (C) 2004 Sergey V. Udaltsov +- * +- * This program is free software; you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation; either version 2 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +- * +- */ +- +-#ifdef HAVE_CONFIG_H +-# include "config.h" +-#endif +- +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include "sysfs-utils.h" +-#include "up-types.h" +-#include "up-device-csr.h" +- +-#define UP_DEVICE_CSR_REFRESH_TIMEOUT 30L +- +-/* Internal CSR registers */ +-#define CSR_P6 0 +-#define CSR_P0 1 +-#define CSR_P4 2 +-#define CSR_P5 3 +-#define CSR_P8 4 +-#define CSR_P9 5 +-#define CSR_PB0 6 +-#define CSR_PB1 7 +- +-struct UpDeviceCsrPrivate +-{ +- gboolean is_dual; +- guint bus_num; +- guint dev_num; +- gint raw_value; +- libusb_context *ctx; +- libusb_device *device; +-}; +- +-G_DEFINE_TYPE_WITH_PRIVATE (UpDeviceCsr, up_device_csr, UP_TYPE_DEVICE) +- +-static gboolean up_device_csr_refresh (UpDevice *device); +- +-/** +- * up_device_csr_poll_cb: +- **/ +-static gboolean +-up_device_csr_poll_cb (UpDeviceCsr *csr) +-{ +- UpDevice *device = UP_DEVICE (csr); +- +- g_debug ("Polling: %s", up_device_get_object_path (device)); +- up_device_csr_refresh (device); +- +- /* always continue polling */ +- return TRUE; +-} +- +-/** +- * up_device_csr_find_device: +- **/ +-static libusb_device * +-up_device_csr_find_device (UpDeviceCsr *csr) +-{ +- libusb_device *curr_device = NULL; +- libusb_device **devices = NULL; +- guint8 bus_num; +- guint8 dev_num; +- guint i; +- ssize_t cnt; +- +- g_debug ("Looking for: [%03d][%03d]", csr->priv->bus_num, csr->priv->dev_num); +- +- /* try to find the right device */ +- cnt = libusb_get_device_list (csr->priv->ctx, &devices); +- if (cnt < 0) { +-/* need to depend on > libusb1-1.0.9 for libusb_strerror() +- g_warning ("failed to get device list: %s", libusb_strerror (cnt)); +- */ +- g_warning ("failed to get device list: %d", (int)cnt); +- goto out; +- } +- if (devices == NULL) { +- g_warning ("failed to get device list"); +- goto out; +- } +- for (i=0; devices[i] != NULL; i++) { +- +- bus_num = libusb_get_bus_number (devices[i]); +- dev_num = libusb_get_device_address (devices[i]); +- if (bus_num == csr->priv->bus_num && +- dev_num == csr->priv->dev_num) { +- curr_device = libusb_ref_device (devices[i]); +- break; +- } +- } +- +- libusb_free_device_list (devices, TRUE); +-out: +- return curr_device; +-} +- +-/** +- * up_device_csr_coldplug: +- * +- * Return %TRUE on success, %FALSE if we failed to get data and should be removed +- **/ +-static gboolean +-up_device_csr_coldplug (UpDevice *device) +-{ +- UpDeviceCsr *csr = UP_DEVICE_CSR (device); +- GUdevDevice *native; +- gboolean ret = FALSE; +- const gchar *type; +- const gchar *native_path; +- const gchar *vendor; +- const gchar *product; +- +- /* get the type */ +- native = G_UDEV_DEVICE (up_device_get_native (device)); +- type = g_udev_device_get_property (native, "UPOWER_BATTERY_TYPE"); +- if (type == NULL) +- goto out; +- +- /* which one? */ +- if (g_strcmp0 (type, "mouse") == 0) +- g_object_set (device, "type", UP_DEVICE_KIND_MOUSE, NULL); +- else if (g_strcmp0 (type, "keyboard") == 0) +- g_object_set (device, "type", UP_DEVICE_KIND_KEYBOARD, NULL); +- else { +- g_debug ("not a recognised csr device"); +- goto out; +- } +- +- /* get what USB device we are */ +- native_path = g_udev_device_get_sysfs_path (native); +- csr->priv->bus_num = sysfs_get_int (native_path, "busnum"); +- csr->priv->dev_num = sysfs_get_int (native_path, "devnum"); +- +- /* get correct bus numbers? */ +- if (csr->priv->bus_num == 0 || csr->priv->dev_num == 0) { +- g_warning ("unable to get bus or device numbers"); +- goto out; +- } +- +- /* try to get the usb device */ +- csr->priv->device = up_device_csr_find_device (csr); +- if (csr->priv->device == NULL) { +- g_debug ("failed to get device %p", csr); +- goto out; +- } +- +- /* get optional quirk parameters */ +- ret = g_udev_device_has_property (native, "UPOWER_CSR_DUAL"); +- if (ret) +- csr->priv->is_dual = g_udev_device_get_property_as_boolean (native, "UPOWER_CSR_DUAL"); +- g_debug ("is_dual=%i", csr->priv->is_dual); +- +- /* prefer UPOWER names */ +- vendor = g_udev_device_get_property (native, "UPOWER_VENDOR"); +- if (vendor == NULL) +- vendor = g_udev_device_get_property (native, "ID_VENDOR"); +- product = g_udev_device_get_property (native, "UPOWER_PRODUCT"); +- if (product == NULL) +- product = g_udev_device_get_property (native, "ID_PRODUCT"); +- +- /* hardcode some values */ +- g_object_set (device, +- "vendor", vendor, +- "model", product, +- "power-supply", FALSE, +- "is-present", TRUE, +- "is-rechargeable", TRUE, +- "state", UP_DEVICE_STATE_DISCHARGING, +- "has-history", TRUE, +- NULL); +- +- /* coldplug */ +- ret = up_device_csr_refresh (device); +- if (!ret) +- goto out; +- +- /* set up a poll */ +- up_daemon_start_poll (G_OBJECT (device), (GSourceFunc) up_device_csr_poll_cb); +-out: +- return ret; +-} +- +-/** +- * up_device_csr_refresh: +- * +- * Return %TRUE on success, %FALSE if we failed to refresh or no data +- **/ +-static gboolean +-up_device_csr_refresh (UpDevice *device) +-{ +- gboolean ret = FALSE; +- UpDeviceCsr *csr = UP_DEVICE_CSR (device); +- libusb_device_handle *handle = NULL; +- guint8 buf[80]; +- guint addr; +- gdouble percentage; +- gint retval; +- +- /* ensure we still have a device */ +- if (csr->priv->device == NULL) { +- g_warning ("no device!"); +- goto out; +- } +- +- /* open USB device */ +- retval = libusb_open (csr->priv->device, &handle); +- if (retval < 0) { +- g_warning ("could not open device: %i", retval); +- goto out; +- } +- +- /* For dual receivers C502, C504 and C505, the mouse is the +- * second device and uses an addr of 1 in the value and index +- * fields' high byte */ +- addr = csr->priv->is_dual ? 1<<8 : 0; +- +- /* get the charge */ +- retval = libusb_control_transfer (handle, 0xc0, 0x09, 0x03|addr, 0x00|addr, +- buf, 8, UP_DEVICE_CSR_REFRESH_TIMEOUT); +- if (retval < 0) { +- g_warning ("failed to write to device: %i", retval); +- goto out; +- } +- +- /* ensure we wrote 8 bytes */ +- if (retval != 8) { +- g_warning ("failed to write to device, wrote %i bytes", retval); +- goto out; +- } +- +- /* is a C504 receiver busy? */ +- if (buf[CSR_P0] == 0x3b && buf[CSR_P4] == 0) { +- g_warning ("receiver busy"); +- goto out; +- } +- +- /* get battery status */ +- csr->priv->raw_value = buf[CSR_P5] & 0x07; +- g_debug ("charge level: %d", csr->priv->raw_value); +- if (csr->priv->raw_value != 0) { +- percentage = (100.0 / 7.0) * csr->priv->raw_value; +- g_object_set (device, "percentage", percentage, NULL); +- g_debug ("percentage=%f", percentage); +- } +- +- /* reset time */ +- g_object_set (device, "update-time", (guint64) g_get_real_time () / G_USEC_PER_SEC, NULL); +- +- /* success */ +- ret = TRUE; +-out: +- if (handle != NULL) +- libusb_close (handle); +- return ret; +-} +- +-/** +- * up_device_csr_init: +- **/ +-static void +-up_device_csr_init (UpDeviceCsr *csr) +-{ +- gint retval; +- csr->priv = up_device_csr_get_instance_private (csr); +- +- csr->priv->raw_value = -1; +- retval = libusb_init (&csr->priv->ctx); +- if (retval < 0) +- g_warning ("could not initialize libusb: %i", retval); +-} +- +-/** +- * up_device_csr_finalize: +- **/ +-static void +-up_device_csr_finalize (GObject *object) +-{ +- UpDeviceCsr *csr; +- +- g_return_if_fail (object != NULL); +- g_return_if_fail (UP_IS_DEVICE_CSR (object)); +- +- csr = UP_DEVICE_CSR (object); +- g_return_if_fail (csr->priv != NULL); +- +- if (csr->priv->ctx != NULL) +- libusb_exit (csr->priv->ctx); +- up_daemon_stop_poll (object); +- +- G_OBJECT_CLASS (up_device_csr_parent_class)->finalize (object); +-} +- +-/** +- * up_device_csr_class_init: +- **/ +-static void +-up_device_csr_class_init (UpDeviceCsrClass *klass) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (klass); +- UpDeviceClass *device_class = UP_DEVICE_CLASS (klass); +- +- object_class->finalize = up_device_csr_finalize; +- device_class->coldplug = up_device_csr_coldplug; +- device_class->refresh = up_device_csr_refresh; +-} +- +-/** +- * up_device_csr_new: +- **/ +-UpDeviceCsr * +-up_device_csr_new (void) +-{ +- return g_object_new (UP_TYPE_DEVICE_CSR, NULL); +-} +- +diff --git a/src/linux/up-device-csr.h b/src/linux/up-device-csr.h +deleted file mode 100644 +index 65e7f35..0000000 +--- a/src/linux/up-device-csr.h ++++ /dev/null +@@ -1,56 +0,0 @@ +-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- +- * +- * Copyright (C) 2008 David Zeuthen +- * Copyright (C) 2008 Richard Hughes +- * +- * This program is free software; you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation; either version 2 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +- * +- */ +- +-#ifndef __UP_DEVICE_CSR_H__ +-#define __UP_DEVICE_CSR_H__ +- +-#include +-#include "up-device.h" +- +-G_BEGIN_DECLS +- +-#define UP_TYPE_DEVICE_CSR (up_device_csr_get_type ()) +-#define UP_DEVICE_CSR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UP_TYPE_DEVICE_CSR, UpDeviceCsr)) +-#define UP_DEVICE_CSR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), UP_TYPE_DEVICE_CSR, UpDeviceCsrClass)) +-#define UP_IS_DEVICE_CSR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UP_TYPE_DEVICE_CSR)) +-#define UP_IS_DEVICE_CSR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UP_TYPE_DEVICE_CSR)) +-#define UP_DEVICE_CSR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UP_TYPE_DEVICE_CSR, UpDeviceCsrClass)) +- +-typedef struct UpDeviceCsrPrivate UpDeviceCsrPrivate; +- +-typedef struct +-{ +- UpDevice parent; +- UpDeviceCsrPrivate *priv; +-} UpDeviceCsr; +- +-typedef struct +-{ +- UpDeviceClass parent_class; +-} UpDeviceCsrClass; +- +-GType up_device_csr_get_type (void); +-UpDeviceCsr *up_device_csr_new (void); +- +-G_END_DECLS +- +-#endif /* __UP_DEVICE_CSR_H__ */ +- +-- +2.29.2 + + +From 64582256a8c75127c3de23f5542c8467e2e9484a Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Tue, 19 Jan 2021 13:31:25 +0100 +Subject: [PATCH 2/2] build: Remove libusb dependency in Linux + +As the last user, the CSR support code, was removed. +--- + configure.ac | 1 - + src/Makefile.am | 2 -- + src/linux/Makefile.am | 1 - + 3 files changed, 4 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 5f08d91..9db579f 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -199,7 +199,6 @@ AC_SUBST(BACKEND, "$with_backend") + have_idevice=no + if test x$with_backend = xlinux; then + PKG_CHECK_MODULES(GUDEV, [gudev-1.0 >= 147]) +- PKG_CHECK_MODULES(USB, [libusb-1.0 >= 1.0.0]) + AC_ARG_WITH(idevice, AS_HELP_STRING([--without-idevice],[Build without libimobiledevice]), + with_idevice=$withval,with_idevice=yes) + LIBPLIST_DEP=libplist +diff --git a/src/Makefile.am b/src/Makefile.am +index 3400139..81f5566 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -69,7 +69,6 @@ upowerd_CPPFLAGS = \ + + upowerd_LDADD = \ + -lm \ +- $(USB_LIBS) \ + $(GIO_LIBS) \ + $(GIO_UNIX_LIBS) \ + $(UPOWER_LIBS) +@@ -94,7 +93,6 @@ endif + if BACKEND_TYPE_LINUX + upowerd_LDADD += \ + linux/libupshared.la \ +- $(USB_LIBS) \ + $(GUDEV_LIBS) \ + $(IDEVICE_LIBS) \ + $(NULL) +diff --git a/src/linux/Makefile.am b/src/linux/Makefile.am +index 82f60fd..5f3475d 100644 +--- a/src/linux/Makefile.am ++++ b/src/linux/Makefile.am +@@ -7,7 +7,6 @@ AM_CPPFLAGS = \ + -DG_LOG_DOMAIN=\"UPower-Linux\" \ + -DPACKAGE_SYSCONF_DIR=\""$(sysconfdir)"\" \ + -I$(top_srcdir)/libupower-glib \ +- $(USB_CFLAGS) \ + $(GIO_CFLAGS) \ + $(GIO_UNIX_CFLAGS) \ + $(GUDEV_CFLAGS) \ +-- +2.29.2 + diff --git a/upower.spec b/upower.spec index f33f2f7..e53ce3d 100644 --- a/upower.spec +++ b/upower.spec @@ -2,23 +2,26 @@ Summary: Power Management Service Name: upower Version: 0.99.11 -Release: 6%{?dist} +Release: 8%{?dist} License: GPLv2+ URL: http://upower.freedesktop.org/ Source0: https://gitlab.freedesktop.org/upower/upower/uploads/%{commit}/%{name}-%{version}.tar.xz Patch0: 0001-linux-Add-support-for-iPhone-XR-XS-models.patch Patch1: 0001-build-Use-a-newer-libplist-if-available.patch +Patch2: upower-no-usb-dep.patch +BuildRequires: make BuildRequires: sqlite-devel BuildRequires: git BuildRequires: libtool BuildRequires: gettext BuildRequires: libgudev1-devel %ifnarch s390 s390x -BuildRequires: libusbx-devel +%if ! 0%{?rhel} BuildRequires: libimobiledevice-devel %endif +%endif BuildRequires: glib2-devel >= 2.6.0 BuildRequires: gobject-introspection-devel BuildRequires: gtk-doc @@ -124,6 +127,14 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/*.la %{_datadir}/gtk-doc/html/UPower/* %changelog +* Tue Jan 19 2021 Bastien Nocera - 0.99.11-8 ++ upower-0.99.11-8 +- Remove USB dependency + +* Tue Nov 24 2020 Bastien Nocera - 0.99.11-7 ++ upower-0.99.11-7 +- Disable libimobiledevice integration on RHEL + * Wed Jul 29 2020 Fedora Release Engineering - 0.99.11-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild