feat(anaconda): integrate anaconda installer with openbox and add licensing documentation

Add Anaconda installer integration to FWS live environment:

- Implement Anaconda launcher in .xinitrc with comprehensive error logging and debugging support
- Add anaconda and anaconda-widgets packages to baseline and releng ISO configs
- Fix anaconda-widgets PKGBUILD: replace gladeui with glib2-devel, disable Glade module
- Update anaconda PKGBUILD with improved dependencies and build configuration
- Add python-blivet PKGBUILD with detailed dependency documentation

Enhance documentation and branding:

- Expand AUTHORS.rst to clarify FWS vs archiso authorship and licensing
- Update CONTRIBUTING.rst with inbound=outbound licensing policy and DCO requirements
- Extend README.md with comprehensive legal basis table and licensing checklist
- Remove Arch Linux references from MOTD and update to FWS GitHub project page
- Fix fastfetch.sh to avoid read-only variable conflict in zsh
- Add xterm to packages for installer debugging

All changes maintain GPL-3.0-or-later compliance and improve GPL offer transparency.
This commit is contained in:
2026-06-17 15:45:15 +02:00
parent 43c1053bd7
commit 92bae9e4a6
11 changed files with 203 additions and 34 deletions
+16 -1
View File
@@ -1,7 +1,22 @@
=============== =======
Authors
=======
FWS
===
FWS is a fork of archiso. The FWS-specific work (build chain, installer
integration, package recipes under ``pkgbuilds/``) is © the FWS contributors,
distributed under ``GPL-3.0-or-later`` (see ``COPYRIGHT.md``).
* FWS contributors <suzuku295@gmail.com>
Archiso Authors Archiso Authors
=============== ===============
The build system (``mkarchiso``, profiles, man pages) derives from archiso and
retains the authorship of its original contributors:
* 2hexed <2hexed@protonmail.com> * 2hexed <2hexed@protonmail.com>
* Aaron Griffin <aaron@archlinux.org> * Aaron Griffin <aaron@archlinux.org>
* Adam Purkrt <adam@purkrt.net> * Adam Purkrt <adam@purkrt.net>
+23 -2
View File
@@ -2,8 +2,29 @@
Contributing Contributing
============ ============
These are the contribution guidelines for archiso. These are the contribution guidelines for **FWS**. FWS is a fork of `archiso
All contributions fall under the terms of the GPL-3.0-or-later (see `LICENSE <LICENSE>`_). <https://gitlab.archlinux.org/archlinux/archiso>`_; the build-system parts
derived from archiso retain their original history and authorship (see
`AUTHORS.rst <AUTHORS.rst>`_).
Licensing of contributions (inbound = outbound)
===============================================
All contributions are accepted under the **same license as the project**,
``GPL-3.0-or-later`` (see `LICENSE <LICENSE>`_). By submitting a contribution you
agree that it is licensed under ``GPL-3.0-or-later`` and that you have the right
to submit it under that license.
Sign off every commit to certify the `Developer Certificate of Origin 1.1
<https://developercertificate.org/>`_:
.. code:: bash
git commit --signoff # adds a "Signed-off-by: Name <email>" trailer
For the full licensing, third-party and trademark picture, see `LICENSING.md
<LICENSING.md>`_, `THIRD-PARTY-LICENSES.md <THIRD-PARTY-LICENSES.md>`_ and
`TRADEMARKS.md <TRADEMARKS.md>`_.
Editorconfig Editorconfig
============ ============
+17 -2
View File
@@ -278,6 +278,21 @@ cat ~/.local/share/hyprland/hyprland.log
FWS est un fork de **[archiso](https://gitlab.archlinux.org/archlinux/archiso)** (Arch Linux), redistribué sous les termes de la **GPL-3.0-or-later**. FWS est un fork de **[archiso](https://gitlab.archlinux.org/archlinux/archiso)** (Arch Linux), redistribué sous les termes de la **GPL-3.0-or-later**.
Voir [LICENSE](LICENSE) pour le texte complet, et [AUTHORS.rst](AUTHORS.rst) pour la liste des auteurs originaux d'archiso.
Les modifications spécifiques à FWS (scripts `build.sh`, `setup-aur.sh`, overlay `configs/baseline/`, intégration de l'installateur + Xorg autostart, chaîne de build WSL) sont également distribuées sous GPL-3.0-or-later. Les modifications spécifiques à FWS (scripts `build.sh`, `setup-aur.sh`, overlay `configs/baseline/`, intégration de l'installateur + Xorg autostart, chaîne de build WSL) sont également distribuées sous GPL-3.0-or-later.
### Base légale complète
| Document | Objet |
|---|---|
| [LICENSE](LICENSE) | Texte intégral GPL-3.0-or-later |
| [COPYRIGHT.md](COPYRIGHT.md) | Droits d'auteur du dépôt & périmètre |
| [LICENSING.md](LICENSING.md) | Politique de licences, **offre écrite GPL (sources)**, checklist release |
| [THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md) | Inventaire des logiciels tiers (Anaconda, deps…) & **analyse de compatibilité** |
| [TRADEMARKS.md](TRADEMARKS.md) | Marques & **non-affiliation** (Arch, Red Hat, Fedora, Anaconda, Windows…) |
| [NOTICE](NOTICE) | Attributions Apache/MIT/BSD |
| [AUTHORS.rst](AUTHORS.rst) | Auteurs FWS + auteurs originaux d'archiso |
| [CONTRIBUTING.rst](CONTRIBUTING.rst) | Contribuer (inbound = outbound, DCO) |
> ✅ **Déjà réglé** : offre écrite GPL (URL dépôt + contact), `os-release` FWS (le live ne s'annonce plus « Arch Linux », via hook pacman) et `motd` (plus de lien `archlinux.org`).
>
> ⚠️ **Reste avant diffusion publique** (détail dans [LICENSING.md](LICENSING.md) §6) : **rendre le dépôt public** (sinon l'offre GPL n'est pas opposable), retirer le branding Red Hat/Fedora de l'UI Anaconda lors de la migration, et **trancher sur `python-iso639`** (AGPL-3.0-only). **Ces documents ne sont pas un avis juridique.**
+46 -4
View File
@@ -6,8 +6,50 @@ fi
xsetroot -solid "#1a1a2e" xsetroot -solid "#1a1a2e"
# TODO (chantier C) : lancer l'installateur graphique Anaconda dans cette session. # Openbox en arrière-plan : gestionnaire de fenêtres pour l'installateur.
# Calamares a été retiré (commit 05ae9c3) et son remplacement Anaconda n'est pas openbox &
# encore câblé. En attendant, on lance Openbox au premier plan : le serveur X a _OB_PID=$!
# ainsi un client (sinon startx rendrait la main et X se fermerait aussitôt).
# Chantier C : lance l'installateur Anaconda en mode live s'il est présent.
# « liveinst » re-exécute anaconda (ici on est déjà root → pas de pkexec/polkit).
#
# DEBUG (premier run réel) : on CAPTURE stdout+stderr — un plantage d'import
# précoce de Python n'apparaît QUE là, pas dans /tmp/anaconda.log — et, si
# liveinst quitte en erreur, on regroupe tous les logs Anaconda et on les AFFICHE
# (zenity) au lieu de laisser startx rendre la main → .zprofile relancerait X en
# boucle (symptôme « fond bleu qui clignote/reboote »). On NE rend jamais la main
# à startx : on reste sur Openbox pour lire les logs / rebooter proprement.
if command -v liveinst >/dev/null 2>&1; then
LIVEINST_LOG=/tmp/fws-liveinst.log
liveinst >"$LIVEINST_LOG" 2>&1
rc=$?
# ATTENTION : liveinst NE propage PAS le code de sortie d'anaconda — il
# enchaîne son propre nettoyage et sort souvent 0 même quand anaconda a
# planté. On ne se fie donc PAS à $rc : en phase debug on regroupe TOUS les
# logs et on les affiche systématiquement (zenity). Le traceback Python d'un
# crash d'import précoce n'est QUE dans $LIVEINST_LOG (stderr capturé).
DBG=/tmp/fws-debug.txt
{
echo "===== liveinst sorti (code $rc) — logs Anaconda ====="
echo
echo "########## sortie liveinst (stdout+stderr) ##########"
cat "$LIVEINST_LOG" 2>/dev/null
for f in /tmp/anaconda.log /tmp/syslog /tmp/program.log \
/tmp/storage.log /tmp/dbus.log /tmp/packaging.log /tmp/X.log; do
echo
echo "########## $f ##########"
tail -n 200 "$f" 2>/dev/null || echo "(absent)"
done
} >"$DBG" 2>&1
if command -v zenity >/dev/null 2>&1; then
zenity --text-info --title="FWS — logs Anaconda (sortie $rc)" \
--filename="$DBG" --width=1100 --height=720 2>/dev/null &
fi
wait "$_OB_PID"
else
echo "[FWS] Anaconda absent de l'ISO — à builder (setup-aur.sh) + ajouter à packages.x86_64." >&2
exec openbox exec openbox
fi
+7
View File
@@ -93,6 +93,8 @@ xorg-xrandr
xorg-xsetroot xorg-xsetroot
openbox openbox
ttf-dejavu ttf-dejavu
# Terminal X : debug de l'installateur + entrée « Terminals » du menu Openbox.
xterm
# --- Agents VM (pratique pour tester l'ISO) --- # --- Agents VM (pratique pour tester l'ISO) ---
qemu-guest-agent qemu-guest-agent
@@ -101,3 +103,8 @@ open-vm-tools
# --- FWS (fws-local) --- # --- FWS (fws-local) ---
winboat-bin winboat-bin
# --- Installateur Anaconda (fws-local) ---
# 'anaconda' tire automatiquement anaconda-widgets + toutes ses dépendances
# (python-blivet, pykickstart, libreport, gtk3, NetworkManager…).
anaconda
+4 -7
View File
@@ -1,11 +1,8 @@
To install FWS follow the installation guide: Welcome to FWS live media.
https://wiki.archlinux.org/title/Installation_guide
To install FWS, see the project page:
https://github.com/You-re-like-Windows-a-bitch/fws
For Wi-Fi, authenticate to the wireless network using the iwctl utility. For Wi-Fi, authenticate to the wireless network using the iwctl utility.
For mobile broadband (WWAN) modems, connect with the mmcli utility. For mobile broadband (WWAN) modems, connect with the mmcli utility.
Ethernet, WLAN and WWAN interfaces using DHCP should work automatically. Ethernet, WLAN and WWAN interfaces using DHCP should work automatically.
After connecting to the internet, the installation guide can be accessed
via the convenience script Installation_guide.
                                          
@@ -1,5 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
status=$? # NB : ce fichier est SOURCÉ par le shell de login (zsh sur le live), pas exécuté
if [ "${status}" -eq 0 ]; then # → le shebang est ignoré. En zsh « status » est une variable spéciale EN LECTURE
# SEULE (alias de $?) : s'y affecter casse (« read-only variable: status »).
# On utilise donc un autre nom.
_fastfetch_rc=$?
if [ "${_fastfetch_rc}" -eq 0 ]; then
fastfetch fastfetch
fi fi
+5
View File
@@ -100,3 +100,8 @@ open-vm-tools
# --- FWS (fws-local) --- # --- FWS (fws-local) ---
winboat-bin winboat-bin
# --- Installateur Anaconda (fws-local) ---
# 'anaconda' tire automatiquement anaconda-widgets + toutes ses dépendances
# (python-blivet, pykickstart, libreport, gtk3, NetworkManager…).
anaconda
+9 -2
View File
@@ -13,18 +13,25 @@ arch=('x86_64')
url="https://github.com/rhinstaller/anaconda" url="https://github.com/rhinstaller/anaconda"
license=('GPL-2.0-or-later') license=('GPL-2.0-or-later')
depends=('gtk3' 'glib2' 'pango' 'gdk-pixbuf2' 'python-gobject') depends=('gtk3' 'glib2' 'pango' 'gdk-pixbuf2' 'python-gobject')
# NB : pas de 'glade' — on désactive le module Glade (catalogue pour le designer,
# inutile au runtime). Sur Arch le paquet s'appelle 'glade' (pas 'gladeui').
# glib2-devel : fournit gdbus-codegen / glib-mkenums / glib-genmarshal (outils
# de codegen GLib, scindés de glib2 sur Arch). Indispensable au build des widgets.
makedepends=('autoconf' 'automake' 'libtool' 'gettext' 'intltool' makedepends=('autoconf' 'automake' 'libtool' 'gettext' 'intltool'
'gobject-introspection' 'gtk-doc' 'gladeui' 'python') 'gobject-introspection' 'gtk-doc' 'glib2-devel' 'python')
source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz") source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz")
sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed') sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed')
_srcdir="anaconda-anaconda-$pkgver" _srcdir="anaconda-anaconda-$pkgver"
build() { build() {
cd "$srcdir/$_srcdir/widgets" cd "$srcdir/$_srcdir/widgets"
# Glade désactivé : le flag doit être posé À LA FOIS pour autoreconf (variable
# d'env lue par m4 dans configure.ac) ET pour configure (--disable-glade).
export ANACONDA_DISABLE_GLADE=yes
# autogen.sh : autoreconf -vfi + copie /usr/share/gettext/gettext.h dans src/. # autogen.sh : autoreconf -vfi + copie /usr/share/gettext/gettext.h dans src/.
./autogen.sh ./autogen.sh
./configure --prefix=/usr --libdir=/usr/lib \ ./configure --prefix=/usr --libdir=/usr/lib \
--disable-static --disable-gtk-doc --enable-introspection --disable-static --disable-gtk-doc --disable-glade --enable-introspection
make make
} }
+31 -6
View File
@@ -25,7 +25,7 @@
# ============================================================================ # ============================================================================
pkgname=anaconda pkgname=anaconda
pkgver=45.8 pkgver=45.8
pkgrel=1 pkgrel=2
pkgdesc="The Anaconda installer (porté sur Arch pour FWS, payload liveimg)" pkgdesc="The Anaconda installer (porté sur Arch pour FWS, payload liveimg)"
arch=('x86_64') arch=('x86_64')
url="https://github.com/rhinstaller/anaconda" url="https://github.com/rhinstaller/anaconda"
@@ -47,10 +47,11 @@ depends=(
'networkmanager' 'kbd' 'chrony' 'systemd' 'dbus' 'openssh' 'grub' 'networkmanager' 'kbd' 'chrony' 'systemd' 'dbus' 'openssh' 'grub'
'libpwquality' 'python-systemd' 'python-xkbregistry' 'cracklib' 'libpwquality' 'python-systemd' 'python-xkbregistry' 'cracklib'
) )
# NB : pas de 'glade' — module Glade désactivé au build (cf. build()).
makedepends=( makedepends=(
'autoconf' 'automake' 'libtool' 'gettext' 'intltool' 'gtk-doc' 'autoconf' 'automake' 'libtool' 'gettext' 'intltool' 'gtk-doc'
'gobject-introspection' 'gladeui' 'python' 'gdk-pixbuf2' 'libxml2' 'gobject-introspection' 'python' 'gdk-pixbuf2' 'libxml2'
'desktop-file-utils' 'glib2' 'libarchive' 'rpm-tools' 'desktop-file-utils' 'glib2-devel' 'libarchive' 'rpm-tools'
) )
source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz") source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz")
sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed') sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed')
@@ -58,11 +59,14 @@ _srcdir="anaconda-anaconda-$pkgver"
build() { build() {
cd "$srcdir/$_srcdir" cd "$srcdir/$_srcdir"
# Glade désactivé (catalogue designer, inutile au runtime) → pas de dép glade.
# La variable d'env doit être posée AVANT autogen.sh (lue par m4 à l'autoreconf)
# EN PLUS du flag --disable-glade au configure.
export ANACONDA_DISABLE_GLADE=yes
# autogen.sh : autoreconf -vfi racine + (cd widgets && ./autogen.sh). # autogen.sh : autoreconf -vfi racine + (cd widgets && ./autogen.sh).
./autogen.sh ./autogen.sh
# --disable-glade : pas de catalogue Glade (outil de design, inutile au run).
# ANACONDA_RELEASE=1 : release réelle, pas la date de création du tarball. # ANACONDA_RELEASE=1 : release réelle, pas la date de création du tarball.
ANACONDA_DISABLE_GLADE=yes ./configure \ ./configure \
--prefix=/usr --libdir=/usr/lib --sysconfdir=/etc \ --prefix=/usr --libdir=/usr/lib --sysconfdir=/etc \
--disable-glade --disable-gtk-doc ANACONDA_RELEASE=1 --disable-glade --disable-gtk-doc ANACONDA_RELEASE=1
make make
@@ -78,9 +82,30 @@ package() {
"$pkgdir/usr/share/anaconda/post-scripts" "$pkgdir/usr/share/anaconda/post-scripts"
# Fichiers widgets : fournis par le paquet anaconda-widgets → on les retire # Fichiers widgets : fournis par le paquet anaconda-widgets → on les retire
# ici (le build principal recompile widgets/ via AC_CONFIG_SUBDIRS). # ici (le build principal recompile widgets/ via AC_CONFIG_SUBDIRS) pour
# éviter le conflit de fichiers à l'install. On enlève TOUT l'empreinte
# widgets : lib, typelib, pkgconfig, headers, .gir, doc, override gi.
rm -f "$pkgdir"/usr/lib/libAnacondaWidgets.so* rm -f "$pkgdir"/usr/lib/libAnacondaWidgets.so*
rm -f "$pkgdir"/usr/lib/girepository-*/AnacondaWidgets*.typelib rm -f "$pkgdir"/usr/lib/girepository-*/AnacondaWidgets*.typelib
rm -f "$pkgdir"/usr/lib/pkgconfig/AnacondaWidgets.pc rm -f "$pkgdir"/usr/lib/pkgconfig/AnacondaWidgets.pc
rm -rf "$pkgdir"/usr/include/AnacondaWidgets
rm -f "$pkgdir"/usr/share/gir-1.0/AnacondaWidgets*.gir
rm -rf "$pkgdir"/usr/share/gtk-doc/html/AnacondaWidgets
rm -f "$pkgdir"/usr/lib/python*/site-packages/gi/overrides/AnacondaWidgets* rm -f "$pkgdir"/usr/lib/python*/site-packages/gi/overrides/AnacondaWidgets*
# interactive-defaults.ks : FWS le fournit via l'overlay airootfs
# (configs/*/airootfs/usr/share/anaconda/) avec le payload liveimg. mkarchiso
# copie l'overlay AVANT pacstrap → si le paquet livrait aussi ce fichier, pacman
# planterait (« exists in filesystem »). On retire donc la version amont : le
# fichier de l'overlay reste la seule à ce chemin, et anaconda le lit au runtime.
rm -f "$pkgdir"/usr/share/anaconda/interactive-defaults.ks
# usr-merge Arch : /usr/sbin est un LIEN → /usr/bin. Anaconda installe dans
# /usr/sbin (vrai dossier sur Fedora) → conflit avec le paquet 'filesystem'.
# On rapatrie le contenu dans /usr/bin et on supprime le dossier sbin.
if [ -d "$pkgdir/usr/sbin" ] && [ ! -L "$pkgdir/usr/sbin" ]; then
install -d "$pkgdir/usr/bin"
cp -aT "$pkgdir/usr/sbin" "$pkgdir/usr/bin"
rm -rf "$pkgdir/usr/sbin"
fi
} }
+38 -7
View File
@@ -2,23 +2,52 @@
# Dépendance de l'installateur Anaconda (rhinstaller) — couche d'abstraction # Dépendance de l'installateur Anaconda (rhinstaller) — couche d'abstraction
# de gestion du stockage (partitions, LVM, LUKS, RAID). # de gestion du stockage (partitions, LVM, LUKS, RAID).
# #
# VENDORISÉ depuis l'AUR (python-blivet) avec UNE seule modification FWS : # VENDORISÉ depuis l'AUR (python-blivet) avec DEUX modifications FWS :
# retrait de 'libselinux' des depends. Arch n'est pas SELinux et blivet importe #
# selinux en try/except (blivet/util.py + flags.py → HAVE_SELINUX/self.selinux # 1. Retrait de 'libselinux' des depends. Arch n'est pas SELinux et blivet
# = False si absent), donc il fonctionne sans. Ça évite de tirer toute la pile # importe selinux en try/except (blivet/util.py + flags.py →
# SELinux (libselinux/libsepol) de l'AUR juste pour une fonctionnalité inutile # HAVE_SELINUX/self.selinux = False si absent), donc il fonctionne sans.
# sur FWS. Tout le reste est identique à l'amont. # Ça évite de tirer toute la pile SELinux (libselinux/libsepol) de l'AUR
# juste pour une fonctionnalité inutile sur FWS.
#
# 2. depends COMPLÉTÉS. L'AUR ne déclare QUE 'libblockdev' → sur une vraie ISO
# blivet crashe à l'import. Il lui faut en plus :
# - python-libblockdev : l'OVERRIDE GObject-introspection
# (gi/overrides/BlockDev.py) qui définit les helpers (plugin_specs_from_names)
# ET les alias d'enum (DMTech.MAP, LoopTech, MDTech…) qu'utilise blivet.
# SANS lui : « AttributeError: 'gi.repository.BlockDev' object has no
# attribute 'plugin_specs_from_names' » puis « DMTech has no attribute MAP ».
# C'est LA pièce maîtresse (les symboles n'existent QUE dans cet override,
# pas dans le typelib ni l'amont libblockdev).
# - les 11 sous-paquets plugins libblockdev-* (sur Arch ils sont SÉPARÉS du
# cœur 'libblockdev') : sinon « failed to load module lvm: libbd_lvm.so.3 ».
# - libbytesize : fournit le module Python 'bytesize' (blivet/size.py).
# - python-dasbus : importé en dur (blivet/util.py).
#
# Tout le reste (code source) est identique à l'amont.
_py='python' _py='python'
_pkg="blivet" _pkg="blivet"
pkgname="python-${_pkg}" pkgname="python-${_pkg}"
pkgver=3.13.2 pkgver=3.13.2
_tag="${_pkg}-${pkgver}" _tag="${_pkg}-${pkgver}"
pkgrel=1 pkgrel=4
pkgdesc="A DBus service and python module for management of the system storage configuration (dépendance Anaconda)" pkgdesc="A DBus service and python module for management of the system storage configuration (dépendance Anaconda)"
arch=('any') arch=('any')
license=('LGPL-2.1-only') license=('LGPL-2.1-only')
depends=( depends=(
'libblockdev' 'libblockdev'
# Override GI (gi/overrides/BlockDev.py) : helpers + alias d'enum exigés par
# blivet. ABSENT du paquet 'libblockdev' → paquet séparé. Pièce maîtresse.
"${_py}-libblockdev"
# Plugins libblockdev : sous-paquets SÉPARÉS sur Arch (le cœur 'libblockdev'
# ne fournit PAS les libbd_*.so.3). blivet les charge à l'import via
# try_reinit() ; sans eux : « failed to load module lvm: libbd_lvm.so.3 ».
'libblockdev-lvm' 'libblockdev-btrfs' 'libblockdev-swap' 'libblockdev-loop'
'libblockdev-crypto' 'libblockdev-mpath' 'libblockdev-dm' 'libblockdev-mdraid'
'libblockdev-part' 'libblockdev-fs' 'libblockdev-nvme'
# libbytesize fournit le module Python 'bytesize' (blivet/size.py:
# « from bytesize import bytesize ») — sinon ModuleNotFoundError.
'libbytesize'
'lsof' 'lsof'
'multipath-tools' 'multipath-tools'
'parted' 'parted'
@@ -27,6 +56,8 @@ depends=(
"${_py}-pyparted" "${_py}-pyparted"
"${_py}-pyudev" "${_py}-pyudev"
"${_py}-gobject" "${_py}-gobject"
# blivet importe dasbus en dur (blivet/util.py: from dasbus.connection ...).
"${_py}-dasbus"
'systemd-libs' 'systemd-libs'
'util-linux' 'util-linux'
) )