Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
d3cceaffd5
|
+5
-1
@@ -1,4 +1,8 @@
|
|||||||
out/
|
out/
|
||||||
local-repo/
|
local-repo/
|
||||||
configs/baseline/airootfs/etc/systemd/system/multi-user.target.wants/
|
configs/baseline/airootfs/etc/systemd/system/multi-user.target.wants/
|
||||||
configs/releng/airootfs/etc/systemd/system/multi-user.target.wants/
|
configs/releng/airootfs/etc/systemd/system/multi-user.target.wants/
|
||||||
|
configs/baseline/airootfs/usr/lib/
|
||||||
|
configs/baseline/airootfs/usr/bin/
|
||||||
|
configs/baseline/airootfs/usr/include/
|
||||||
|
configs/baseline/airootfs/usr/share/calamares/branding/default/
|
||||||
|
|||||||
+1
-16
@@ -1,22 +1,7 @@
|
|||||||
=======
|
===============
|
||||||
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>
|
||||||
|
|||||||
+2
-23
@@ -2,29 +2,8 @@
|
|||||||
Contributing
|
Contributing
|
||||||
============
|
============
|
||||||
|
|
||||||
These are the contribution guidelines for **FWS**. FWS is a fork of `archiso
|
These are the contribution guidelines for archiso.
|
||||||
<https://gitlab.archlinux.org/archlinux/archiso>`_; the build-system parts
|
All contributions fall under the terms of the GPL-3.0-or-later (see `LICENSE <LICENSE>`_).
|
||||||
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
|
||||||
============
|
============
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
# Droits d'auteur — FWS
|
|
||||||
|
|
||||||
`SPDX-License-Identifier: GPL-3.0-or-later`
|
|
||||||
|
|
||||||
FWS est une distribution Linux live/installable dérivée d'**Arch Linux**, dont le
|
|
||||||
système de construction est un fork d'**archiso**. Ce fichier identifie les
|
|
||||||
titulaires de droits sur le code **du dépôt** ; les logiciels **embarqués**
|
|
||||||
(Anaconda, paquets Python, paquets Arch de l'ISO…) restent la propriété de leurs
|
|
||||||
auteurs respectifs — voir [THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md).
|
|
||||||
|
|
||||||
## Code du dépôt (système de build FWS)
|
|
||||||
|
|
||||||
```
|
|
||||||
Copyright (C) 2026 Contributeurs FWS (« FWS contributors »)
|
|
||||||
Copyright (C) Arch Linux / Archiso Authors — voir AUTHORS.rst
|
|
||||||
```
|
|
||||||
|
|
||||||
Sont couverts par les droits FWS, sous **GPL-3.0-or-later** :
|
|
||||||
|
|
||||||
- les scripts de construction (`build.sh`, `build-offi.sh`, `setup-aur.sh`,
|
|
||||||
`scripts/`) ;
|
|
||||||
- les profils et overlays `configs/baseline/` et `configs/releng/` modifiés
|
|
||||||
par FWS ;
|
|
||||||
- les recettes de paquets `pkgbuilds/*/PKGBUILD` rédigées ou adaptées par FWS ;
|
|
||||||
- la documentation FWS (`README.md`, `environnement.md`, `docs/`).
|
|
||||||
|
|
||||||
Sont des œuvres d'**archiso** (Arch Linux), conservées sous **GPL-3.0-or-later** :
|
|
||||||
|
|
||||||
- `fws/mkarchiso`, `Makefile`, `man/`, `CHANGELOG.rst` et la structure de
|
|
||||||
profil héritée. Les auteurs originaux sont listés dans [AUTHORS.rst](AUTHORS.rst).
|
|
||||||
|
|
||||||
## Titulaire / entité
|
|
||||||
|
|
||||||
Le titulaire collectif est désigné ici par « Contributeurs FWS ». Si le projet
|
|
||||||
adopte une personne morale (association, société) ou un mainteneur nommé comme
|
|
||||||
titulaire de référence, remplacer « Contributeurs FWS » par cette entité dans
|
|
||||||
ce fichier et dans les en-têtes SPDX.
|
|
||||||
|
|
||||||
## Marques
|
|
||||||
|
|
||||||
Les noms et logos cités (Arch Linux, Red Hat, Fedora, Anaconda, Windows…) sont
|
|
||||||
des marques de leurs détenteurs respectifs. Voir [TRADEMARKS.md](TRADEMARKS.md).
|
|
||||||
|
|
||||||
## Résumé des licences
|
|
||||||
|
|
||||||
| Élément | Licence |
|
|
||||||
|---|---|
|
|
||||||
| Code du dépôt FWS (build, configs, PKGBUILDs, docs) | `GPL-3.0-or-later` |
|
|
||||||
| Texte de licence intégral | [LICENSE](LICENSE) |
|
|
||||||
| Logiciels tiers embarqués | licences propres — [THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md) |
|
|
||||||
| Attributions Apache/MIT/BSD | [NOTICE](NOTICE) |
|
|
||||||
| Politique de licences & obtention des sources | [LICENSING.md](LICENSING.md) |
|
|
||||||
| Marques & non-affiliation | [TRADEMARKS.md](TRADEMARKS.md) |
|
|
||||||
|
|
||||||
> **Avertissement.** Ces documents constituent une base de conformité FOSS
|
|
||||||
> sérieuse et de bonne foi, mais ne sont pas un avis juridique. Avant toute
|
|
||||||
> diffusion publique large ou commerciale, faites-les valider par un conseil
|
|
||||||
> spécialisé en propriété intellectuelle / open source — en particulier les
|
|
||||||
> points signalés ⚠ dans [THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md).
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
# Politique de licences & obtention des sources — FWS
|
|
||||||
|
|
||||||
`SPDX-License-Identifier: GPL-3.0-or-later`
|
|
||||||
|
|
||||||
## 1. Licence du projet
|
|
||||||
|
|
||||||
Le code du dépôt FWS (système de build, profils, overlays, PKGBUILD et docs
|
|
||||||
rédigés par FWS) est distribué sous **GNU General Public License v3.0 ou
|
|
||||||
ultérieure** (`GPL-3.0-or-later`). Cette licence est **héritée d'archiso**, dont
|
|
||||||
FWS est un fork : une œuvre dérivée d'archiso (GPL-3.0-or-later) ne peut être
|
|
||||||
redistribuée que sous GPL-3.0-or-later.
|
|
||||||
|
|
||||||
Texte intégral : [LICENSE](LICENSE).
|
|
||||||
|
|
||||||
Périmètre exact (couvert / hérité) : voir [COPYRIGHT.md](COPYRIGHT.md).
|
|
||||||
Logiciels embarqués (licences distinctes) : voir
|
|
||||||
[THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md).
|
|
||||||
|
|
||||||
## 2. En-têtes SPDX (recommandation)
|
|
||||||
|
|
||||||
Pour une traçabilité « béton », ajouter en tête de chaque fichier source rédigé
|
|
||||||
par FWS :
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
# SPDX-FileCopyrightText: 2026 Contributeurs FWS
|
|
||||||
```
|
|
||||||
|
|
||||||
(Les fichiers hérités d'archiso conservent leurs en-têtes d'origine.)
|
|
||||||
|
|
||||||
## 3. Obligation de fourniture des sources (GPL/LGPL)
|
|
||||||
|
|
||||||
FWS distribue des **binaires** couverts par la GPL/LGPL/AGPL : l'ISO
|
|
||||||
(`out/FWS-*.iso`) et les paquets (`local-repo/*.pkg.tar.zst`). La GPL impose de
|
|
||||||
fournir la **source correspondante** de ces binaires.
|
|
||||||
|
|
||||||
Pour FWS, la source correspondante est :
|
|
||||||
|
|
||||||
1. **le présent dépôt** (système de build, profils, recettes `pkgbuilds/`), et
|
|
||||||
2. **les tarballs amont** référencés par `source=()` dans chaque PKGBUILD
|
|
||||||
(téléchargés à l'identique depuis les URL listées dans
|
|
||||||
[THIRD-PARTY-LICENSES.md](THIRD-PARTY-LICENSES.md)), et
|
|
||||||
3. pour les paquets Arch agrégés dans l'ISO, **les sources publiées par Arch
|
|
||||||
Linux** pour chaque paquet (`pkgctl`/dépôts amont Arch).
|
|
||||||
|
|
||||||
### Offre écrite (GPLv3 §6 / GPLv2 §3b)
|
|
||||||
|
|
||||||
> Pour tout binaire couvert par la GPL/LGPL distribué dans une image ou un paquet
|
|
||||||
> FWS, le projet FWS s'engage à fournir, sur demande et pour une durée d'au moins
|
|
||||||
> trois (3) ans, la source correspondante complète sous une forme lisible par
|
|
||||||
> machine, soit via le dépôt public du projet, soit sur un support physique au
|
|
||||||
> coût de distribution.
|
|
||||||
>
|
|
||||||
> - **Dépôt public (source) :** https://github.com/You-re-like-Windows-a-bitch/fws
|
|
||||||
> - **Contact :** suzuku295@gmail.com
|
|
||||||
>
|
|
||||||
> *« FWS offers, for any GPL/LGPL-covered binary it distributes, to provide the
|
|
||||||
> complete corresponding source code, for at least three years, via the project
|
|
||||||
> repository (https://github.com/You-re-like-Windows-a-bitch/fws) or on physical
|
|
||||||
> media at cost. Contact: suzuku295@gmail.com. »*
|
|
||||||
|
|
||||||
> **Condition d'effectivité :** l'offre n'est réellement opposable que si le dépôt
|
|
||||||
> ci-dessus est **publiquement accessible** et contient `pkgbuilds/` (recettes +
|
|
||||||
> URL `source=()`). Tant que le dépôt reste privé, publier au minimum les sources
|
|
||||||
> correspondantes des binaires diffusés.
|
|
||||||
|
|
||||||
## 4. Reproductibilité
|
|
||||||
|
|
||||||
Le build honore `SOURCE_DATE_EPOCH` (cf. `profiledef.sh`, horodatages d'ISO et
|
|
||||||
de label) pour des reconstructions déterministes — utile pour prouver la
|
|
||||||
correspondance source/binaire.
|
|
||||||
|
|
||||||
## 5. Contributions
|
|
||||||
|
|
||||||
Les contributions entrantes sont acceptées sous la **même** licence que le
|
|
||||||
projet (« inbound = outbound », `GPL-3.0-or-later`), avec attestation d'origine
|
|
||||||
**DCO**. Voir [CONTRIBUTING.rst](CONTRIBUTING.rst).
|
|
||||||
|
|
||||||
## 6. Liste de contrôle conformité (avant release publique)
|
|
||||||
|
|
||||||
- [x] `LICENSE` (GPL-3.0-or-later) présent à la racine
|
|
||||||
- [x] `COPYRIGHT.md`, `NOTICE`, `THIRD-PARTY-LICENSES.md`, `TRADEMARKS.md` rédigés
|
|
||||||
- [x] Offre écrite §3 complétée avec URL (dépôt) + contact e-mail
|
|
||||||
- [x] `os-release` FWS livré — hook `zz-fws-os-release.hook` (le live ne s'annonce
|
|
||||||
plus « Arch Linux ») ; `motd` ne renvoie plus vers `archlinux.org`
|
|
||||||
- [ ] **Dépôt rendu publiquement accessible** (sinon l'offre écrite n'est pas
|
|
||||||
opposable) — action hors-code
|
|
||||||
- [ ] Branding Red Hat/Fedora retiré de l'UI Anaconda ; installateur marqué
|
|
||||||
« modifié » — à faire pendant la migration (config `product.d`)
|
|
||||||
- [ ] Décision tranchée sur `python-iso639` (AGPL-3.0-only) : garder ou remplacer
|
|
||||||
- [ ] Revue par un conseil FOSS (recommandé avant diffusion commerciale)
|
|
||||||
|
|
||||||
> Les étiquettes `license=` des PKGBUILD **présents dans `pkgbuilds/`** sont déjà
|
|
||||||
> en SPDX exact. Les libellés imprécis relevés (`satyr` → `GPL`, `python-pid` →
|
|
||||||
> `Apache`…) concernent des paquets de `local-repo/` **sans PKGBUILD dans ce
|
|
||||||
> dépôt** (construits depuis l'AUR) : à corriger à la source AUR, pas ici.
|
|
||||||
|
|
||||||
> **Ceci n'est pas un avis juridique.** Base de conformité de bonne foi au
|
|
||||||
> 2026-06-17.
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
FWS — Avis d'attribution / Attribution NOTICE
|
|
||||||
=============================================
|
|
||||||
|
|
||||||
FWS (« FWS contributors »), 2026.
|
|
||||||
Distribution Linux dérivée d'Arch Linux ; système de build dérivé d'archiso.
|
|
||||||
|
|
||||||
Ce fichier regroupe les attributions exigées par les licences permissives
|
|
||||||
(Apache-2.0, MIT, BSD) des composants redistribués par FWS. Il complète :
|
|
||||||
- LICENSE — GPL-3.0-or-later (projet)
|
|
||||||
- COPYRIGHT.md — droits d'auteur du dépôt
|
|
||||||
- THIRD-PARTY-LICENSES.md — inventaire complet & compatibilité
|
|
||||||
- TRADEMARKS.md — marques & non-affiliation
|
|
||||||
|
|
||||||
L'absence d'un composant ici ne vaut pas absence d'obligation : voir
|
|
||||||
THIRD-PARTY-LICENSES.md pour l'inventaire exhaustif et les avis GPL/LGPL/AGPL
|
|
||||||
(préservés dans /usr/share/licenses/<paquet>/ sur le système).
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
Base du dépôt
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
archiso — Copyright (C) Arch Linux / Archiso Authors (voir AUTHORS.rst)
|
|
||||||
GPL-3.0-or-later — https://gitlab.archlinux.org/archlinux/archiso
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
Composants sous Apache-2.0
|
|
||||||
(Apache-2.0 §4 : conservation des avis de droit d'auteur et de licence ;
|
|
||||||
ce NOTICE accompagne les œuvres redistribuées.)
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
requests-file (python-requests-file) — Copyright (C) David Shea
|
|
||||||
https://github.com/dashea/requests-file
|
|
||||||
requests-ftp (python-requests-ftp) — Copyright (C) Cory Benfield
|
|
||||||
https://github.com/Lukasa/requests-ftp
|
|
||||||
pid (python-pid) — Copyright (C) trbs and contributors
|
|
||||||
https://github.com/trbs/pid
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
Composants sous MIT
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
python-xkbregistry — Copyright (C) Stephen Early
|
|
||||||
https://github.com/sde1000/python-xkbregistry
|
|
||||||
WinBoat (winboat-bin) — Copyright (C) WinBoat authors (TibixDev)
|
|
||||||
https://www.winboat.app
|
|
||||||
langtable (python-langtable, partie MIT) — Copyright (C) Mike FABIAN
|
|
||||||
https://github.com/mike-fabian/langtable
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
Composants sous licence permissive de type BSD / custom
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
xmlrpc-c (libxmlrpc) — Copyright (C) les auteurs de xmlrpc-c
|
|
||||||
Licence permissive de type BSD (« custom ») — voir le source amont
|
|
||||||
https://xmlrpc-c.sourceforge.net/
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
Marques
|
|
||||||
-----------------------------------------------------------------------
|
|
||||||
Arch Linux, Red Hat, Fedora, Anaconda, Windows, Microsoft, GNOME, KDE,
|
|
||||||
Plasma, Xfce, Hyprland, GTK, Linux et WinBoat sont des marques de leurs
|
|
||||||
détenteurs respectifs. FWS n'est affilié à aucun d'eux. Voir TRADEMARKS.md.
|
|
||||||
@@ -1,276 +1,85 @@
|
|||||||
# FWS
|
# FWS
|
||||||
|
|
||||||
**FWS** est une distribution Linux live/installable basée sur **Arch Linux**, livrée sous forme d'ISO bootable BIOS/UEFI. L'installateur graphique est **en cours de migration de Calamares vers Anaconda** (Calamares retiré au commit 05ae9c3, intégration d'Anaconda en cours — voir le chantier dédié).
|
**FWS** est une distribution Linux live/installable basée sur **Arch Linux**, livrée sous forme d'ISO bootable BIOS/UEFI avec l'installeur graphique **Calamares** lancé automatiquement au démarrage.
|
||||||
|
|
||||||
Le projet est conçu pour être **construit depuis Windows via WSL** (les scripts détectent Git Bash et basculent automatiquement dans WSL), mais fonctionne aussi directement depuis une **Arch Linux native** ou depuis **toute distribution non-Arch (Fedora, Ubuntu…) via une bascule automatique dans un conteneur Arch podman**.
|
Le projet est construit avec une chaîne `mkarchiso` adaptée pour fonctionner **depuis Windows via WSL** (Git Bash → WSL Arch), sans nécessiter de machine Linux dédiée.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Aperçu
|
## Aperçu
|
||||||
|
|
||||||
- **Base** : Arch Linux (rolling release)
|
- **Base** : Arch Linux (rolling release)
|
||||||
- **Installateur** : en migration Calamares → Anaconda (Calamares retiré, Anaconda en préparation ; payload `liveimg` pour installer FWS et non Fedora)
|
- **Installeur** : Calamares (compilé depuis l'AUR, servi via un repo local pacman)
|
||||||
- **Affichage live** : Xorg + Openbox (session graphique conservée pour l'installateur)
|
- **Affichage live** : Xorg + Openbox, lancement automatique de Calamares
|
||||||
- **Bureaux installables** : XFCE, KDE Plasma, GNOME, Hyprland (choix à l'installation)
|
|
||||||
- **Boot** : BIOS (syslinux) + UEFI (systemd-boot)
|
- **Boot** : BIOS (syslinux) + UEFI (systemd-boot)
|
||||||
- **Compression** : squashfs (xz)
|
- **Compression** : squashfs (xz)
|
||||||
|
- **Build** : Windows + WSL (Arch) ou directement depuis Arch
|
||||||
|
|
||||||
---
|
## Prérequis
|
||||||
|
|
||||||
## Environnement requis — INSTALLATION ULTRA PRÉCISE
|
### Côté Windows
|
||||||
|
- Windows 10/11
|
||||||
|
- WSL 2 avec une distribution **Arch Linux** installée (`Arch`, `ArchLinux`, `ArchWSL`…)
|
||||||
|
- Git Bash (pour exécuter les scripts depuis Windows)
|
||||||
|
|
||||||
### Côté Windows (machine hôte)
|
### Côté Arch (WSL ou natif)
|
||||||
|
Les scripts installent automatiquement les paquets nécessaires (`archiso`, `base-devel`, `git`, `reflector`, `dos2unix`).
|
||||||
| Composant | Version / état requis | Commande de vérif |
|
|
||||||
|---|---|---|
|
|
||||||
| Windows | 10 (22H2+) ou 11 | `winver` |
|
|
||||||
| WSL | **WSL 2** (pas WSL 1) | `wsl --status` |
|
|
||||||
| Virtualisation CPU | Activée dans le BIOS (VT-x / AMD-V) | Gestionnaire des tâches → Performance → CPU → "Virtualisation : Activé" |
|
|
||||||
| Git for Windows | ≥ 2.40 (fournit Git Bash) | `git --version` |
|
|
||||||
| Espace disque libre | ≥ 25 GB sur la partition WSL | — |
|
|
||||||
| RAM | ≥ 8 GB (16 GB recommandés) | — |
|
|
||||||
|
|
||||||
#### 1. Activer WSL 2
|
|
||||||
|
|
||||||
Dans **PowerShell administrateur** :
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
wsl --install --no-distribution
|
|
||||||
wsl --set-default-version 2
|
|
||||||
wsl --update
|
|
||||||
```
|
|
||||||
|
|
||||||
Puis **redémarrer Windows**.
|
|
||||||
|
|
||||||
#### 2. Installer Arch Linux dans WSL
|
|
||||||
|
|
||||||
Arch n'est pas dans le store Microsoft. Installer **ArchWSL** :
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# Télécharger la dernière release
|
|
||||||
Invoke-WebRequest -Uri "https://github.com/yuk7/ArchWSL/releases/latest/download/Arch.zip" -OutFile "$env:TEMP\Arch.zip"
|
|
||||||
Expand-Archive "$env:TEMP\Arch.zip" -DestinationPath "$env:LOCALAPPDATA\ArchWSL"
|
|
||||||
& "$env:LOCALAPPDATA\ArchWSL\Arch.exe"
|
|
||||||
```
|
|
||||||
|
|
||||||
Au premier lancement, la distribution s'enregistre sous le nom **`Arch`** (ce nom est attendu par les scripts — il est paramétrable via `ARCH_WSL_DISTRO` si besoin).
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
wsl -l -v
|
|
||||||
# Doit afficher :
|
|
||||||
# NAME STATE VERSION
|
|
||||||
# * Arch Stopped 2
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 3. Installer Git for Windows
|
|
||||||
|
|
||||||
Télécharger depuis https://git-scm.com/download/win et installer avec les options par défaut. **Git Bash** est inclus.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Côté WSL Arch (préparation système)
|
|
||||||
|
|
||||||
Le **premier lancement** de la WSL ouvre une session root. Effectuer une seule fois :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Initialiser le keyring (sinon pacman refuse tout install signé)
|
|
||||||
pacman-key --init
|
|
||||||
pacman-key --populate archlinux
|
|
||||||
|
|
||||||
# 2. Mettre à jour le keyring AVANT toute autre opération
|
|
||||||
# (les WSL fraîches ont un keyring périmé)
|
|
||||||
pacman -Sy --noconfirm archlinux-keyring
|
|
||||||
|
|
||||||
# 3. Mise à jour complète du système
|
|
||||||
pacman -Syu --noconfirm
|
|
||||||
|
|
||||||
# 4. Vérifier que /tmp est bien un tmpfs (sinon mkarchiso lent)
|
|
||||||
mount | grep '/tmp'
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Note** : le script `setup-aur.sh` désactive automatiquement le sandbox landlock de pacman ≥ 7 (incompatible avec le kernel WSL) en ajoutant `DisableSandbox` dans `/etc/pacman.conf`. Tu n'as rien à faire.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Côté Arch Linux native (alternative)
|
|
||||||
|
|
||||||
Si tu build depuis une vraie Arch (pas WSL) :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo pacman -Syu
|
|
||||||
sudo pacman -S --needed base-devel git archiso reflector dos2unix
|
|
||||||
```
|
|
||||||
|
|
||||||
Les scripts détectent l'absence de WSL et s'exécutent en local. Il faut être **root** ou avoir `sudo` configuré.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Côté Fedora / Linux non-Arch (conteneur podman)
|
|
||||||
|
|
||||||
Sur une distribution **qui n'est pas Arch** (Fedora, Ubuntu, Debian…), les scripts
|
|
||||||
détectent l'hôte non-Arch et **se relancent automatiquement dans un conteneur Arch**
|
|
||||||
via podman. Tu n'as qu'à installer podman, puis lancer les scripts normalement.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Fedora
|
|
||||||
sudo dnf install -y podman
|
|
||||||
# Debian / Ubuntu
|
|
||||||
sudo apt install -y podman
|
|
||||||
|
|
||||||
# Puis, à la racine du repo, exactement comme sur Arch :
|
|
||||||
./setup-aur.sh
|
|
||||||
./build.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
Détails utiles :
|
|
||||||
|
|
||||||
- **podman rootful obligatoire** : les scripts préfixent `sudo podman` (rootless ne
|
|
||||||
gère pas les mounts/chroot de `mkarchiso`). `sudo` peut demander ton mot de passe.
|
|
||||||
- L'image utilisée est `docker.io/library/archlinux:latest`, pull explicite à chaque
|
|
||||||
run (le tag `latest` n'est pas re-résolu sinon).
|
|
||||||
- Le dépôt est monté **au même chemin absolu** dans le conteneur : l'ISO (`out/`) et
|
|
||||||
`local-repo/` reviennent directement sur l'hôte (re-`chown` automatique vers toi).
|
|
||||||
- Le cache pacman est conservé entre les runs dans le volume `fws-pacman-cache`.
|
|
||||||
- SELinux enforcing (Fedora) est géré par `--privileged` — rien à configurer.
|
|
||||||
|
|
||||||
> Pour forcer l'exécution **locale** (si tu es déjà sur Arch et que pacman est là),
|
|
||||||
> la bascule ne se déclenche pas : la détection exige `pacman` **et** un
|
|
||||||
> `ID`/`ID_LIKE` « arch » dans `/etc/os-release`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Démarrage rapide
|
## Démarrage rapide
|
||||||
|
|
||||||
Depuis **Git Bash sur Windows** (à la racine du repo) :
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Étape 1 : compilation des paquets AUR (winboat) + deps locales
|
# 1. Préparation : compile Calamares depuis l'AUR, crée le repo local,
|
||||||
# → crée local-repo/ avec les .pkg.tar.zst
|
# patche pacman.conf et configure les services systemd (Xorg + autostart).
|
||||||
# (Calamares retiré ; l'installateur Anaconda est un chantier en cours)
|
./setup-calamares.sh
|
||||||
./setup-aur.sh
|
|
||||||
|
|
||||||
# Étape 2 : build de l'ISO via mkarchiso
|
# 2. Build de l'ISO via mkarchiso (fusionne configs/releng + configs/baseline)
|
||||||
# → fusionne configs/releng + configs/baseline
|
|
||||||
# → injecte le repo local dans pacman.conf
|
|
||||||
# → sort l'ISO dans ./out/
|
|
||||||
./build.sh
|
./build.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
L'ISO finale est générée dans `./out/FWS-YYYY.MM.DD-x86_64.iso`.
|
L'ISO finale est générée dans `./out/`.
|
||||||
|
|
||||||
---
|
Les deux scripts détectent automatiquement s'ils sont lancés depuis **Git Bash** (et basculent dans WSL en root) ou directement depuis **WSL/Arch**.
|
||||||
|
|
||||||
## Ce que fait `setup-aur.sh` (étape par étape)
|
|
||||||
|
|
||||||
1. **Détection environnement** : si lancé depuis Git Bash, bascule dans `wsl.exe -d Arch -u root`.
|
|
||||||
2. **Patch pacman** : désactive landlock sur WSL (`DisableSandbox`).
|
|
||||||
3. **Refresh keyring** : `pacman-key --init && --populate archlinux`, mise à jour `archlinux-keyring`.
|
|
||||||
4. **`pacman -Syu`** complet (obligatoire — sinon `makepkg` plante sur les "conflicting files" lors des splits de paquets type `gcc-libs`).
|
|
||||||
5. **Install des outils de build** : `base-devel git`.
|
|
||||||
6. **Création d'un utilisateur `fwsbuild`** non-root avec `sudo` NOPASSWD (makepkg refuse de tourner en root).
|
|
||||||
7. **Clone + build AUR** : `winboat-bin` via `makepkg -s --noconfirm`, plus les PKGBUILD locaux de `pkgbuilds/` (deps Anaconda). Calamares n'est plus compilé.
|
|
||||||
8. **Création du repo local** : `repo-add local-repo/fws-local.db.tar.gz`.
|
|
||||||
9. **Cleanup** : suppression de l'utilisateur `fwsbuild`.
|
|
||||||
|
|
||||||
**Durée** : quelques minutes (winboat-bin + deps locales ; Calamares et ses ~12 dépendances Qt6 ne sont plus compilés).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Ce que fait `build.sh` (étape par étape)
|
|
||||||
|
|
||||||
1. **Détection environnement** : Git Bash → bascule dans WSL ; sinon exécution locale.
|
|
||||||
2. **Update miroirs** : `reflector --latest 10 --sort rate`.
|
|
||||||
3. **Install `archiso`**.
|
|
||||||
4. **Fusion configs** : `cp -ar configs/releng/* /tmp/fws-build/releng/` puis overlay `configs/baseline/*` par-dessus (baseline prioritaire).
|
|
||||||
5. **Activation NetworkManager** sur le live (symlink réel `multi-user.target.wants/`).
|
|
||||||
6. **Injection du repo local** : ajoute `[fws-local]` (`SigLevel = Optional TrustAll`) en tête de `pacman.conf`.
|
|
||||||
7. **`dos2unix`** sur l'arborescence (au cas où tu as édité depuis Windows).
|
|
||||||
8. **`mkarchiso -v -w /tmp/fws-build/work -o out/ /tmp/fws-build/releng`**.
|
|
||||||
9. **Cleanup** du workdir.
|
|
||||||
|
|
||||||
**Durée** : 5–15 minutes selon la machine et le cache pacman.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Test rapide en QEMU
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./scripts/run_archiso.sh -i out/FWS-*.iso # BIOS
|
|
||||||
./scripts/run_archiso.sh -u -i out/FWS-*.iso # UEFI
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Structure du projet
|
## Structure du projet
|
||||||
|
|
||||||
| Chemin | Rôle |
|
| Chemin | Rôle |
|
||||||
|---|---|
|
|--------|------|
|
||||||
| `setup-aur.sh` | Build des paquets AUR (winboat) + PKGBUILD locaux, crée `local-repo/` |
|
| `setup-calamares.sh` | Préparation one-shot : build Calamares (AUR), repo local, services systemd, autostart Xorg + Calamares |
|
||||||
| `build.sh` | Build de l'ISO via `mkarchiso` |
|
| `build.sh` | Build de l'ISO via `mkarchiso` (utilisable depuis Git Bash ou WSL) |
|
||||||
| `configs/releng/` | Profil principal (base ArchISO releng) |
|
| `configs/releng/` | Profil principal (base ArchISO releng) |
|
||||||
| `configs/baseline/` | Overlay FWS (surcharge le profil releng) — **prioritaire** sur releng |
|
| `configs/baseline/` | Overlay FWS appliqué par-dessus `releng` (prioritaire) |
|
||||||
| `local-repo/` | Repo pacman local (généré par `setup-aur.sh`) |
|
| `local-repo/` | Repo pacman local généré (Calamares + dépendances AUR) |
|
||||||
| `out/` | ISOs générées |
|
| `out/` | ISOs générées |
|
||||||
| `fws/mkarchiso` | Binaire `mkarchiso` embarqué (fork) |
|
| `fws/mkarchiso` | Binaire `mkarchiso` embarqué (fork) |
|
||||||
| `scripts/run_archiso.sh` | Lanceur QEMU |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Séquence de boot de l'ISO
|
## Séquence de boot de l'ISO
|
||||||
|
|
||||||
1. Démarrage de l'ISO FWS (BIOS ou UEFI)
|
1. Démarrage de l'ISO FWS (BIOS ou UEFI)
|
||||||
2. `systemd` → autologin root sur `tty1`
|
2. `systemd` → autologin root sur `tty1`
|
||||||
3. `.zprofile` → `startx`
|
3. `xorg-start.service` → `Xorg :0`
|
||||||
4. `.xinitrc` → Openbox (session graphique du live)
|
4. `calamares.service` → `DISPLAY=:0 calamares`
|
||||||
5. **[Chantier C]** lancement de l'installateur Anaconda — pas encore câblé (Calamares retiré au commit 05ae9c3)
|
5. **Fallback** : si les services échouent, `.zprofile` relance Xorg + Openbox + Calamares manuellement
|
||||||
|
|
||||||
---
|
## Test rapide en QEMU
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./scripts/run_archiso.sh -i out/fws-*.iso # BIOS
|
||||||
|
./scripts/run_archiso.sh -u -i out/fws-*.iso # UEFI
|
||||||
|
```
|
||||||
|
|
||||||
## Personnalisation
|
## Personnalisation
|
||||||
|
|
||||||
- **Paquets du live** : `configs/releng/packages.x86_64`
|
- **Paquets** : éditer `configs/releng/packages.x86_64`
|
||||||
- **Paquets baseline** : `configs/baseline/packages.x86_64`
|
- **Overlay rootfs** : déposer les fichiers dans `configs/releng/airootfs/` ou `configs/baseline/airootfs/`
|
||||||
- **Overlay rootfs** : `configs/releng/airootfs/` ou `configs/baseline/airootfs/`
|
- **Modules / séquence Calamares** : `configs/baseline/airootfs/etc/calamares/`
|
||||||
- **Kickstart de l'installateur** : `configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks` (payload liveimg + %post)
|
- **Branding ISO** : `configs/releng/profiledef.sh` (`iso_name`, `iso_label`, `iso_publisher`…)
|
||||||
- **Branding ISO** : `configs/releng/profiledef.sh` (`iso_name`, `iso_label`, `iso_publisher`)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Dépannage
|
## Dépannage
|
||||||
|
|
||||||
| Symptôme | Cause / fix |
|
- **`pacman.conf introuvable`** : vérifier que `configs/releng/pacman.conf` existe.
|
||||||
|---|---|
|
- **Calamares ne démarre pas dans l'ISO** : se logger en tty (autologin root) et lancer `journalctl -u xorg-start -u calamares`.
|
||||||
| `Aucune distribution WSL Arch joignable` | Aucune distro Arch n'est installée/joignable. Les scripts auto-détectent désormais toute distro dont le nom contient « arch » (via `wsl -l -q`) ; installe ArchWSL (nom `Arch`) ou `wsl --install -d archlinux`, ou force `ARCH_WSL_DISTRO=NomDeMaDistro`. |
|
- **Erreurs de retours à la ligne** : `build.sh` lance `dos2unix` sur l'arborescence ; si vous éditez des fichiers depuis Windows, ce n'est pas un problème.
|
||||||
| `WSL introuvable` | WSL n'est pas installé. PowerShell admin : `wsl --install`, puis installe une distro Arch. |
|
- **`mkarchiso` échoue sur un paquet AUR** : relancer `./setup-calamares.sh` pour reconstruire le repo local.
|
||||||
| `pacman: signature unknown trust` | Keyring périmé → `pacman -Sy --noconfirm archlinux-keyring` puis relancer. |
|
|
||||||
| `makepkg: conflicting files` | `pacman -Syu` incomplet avant le build. Relancer `setup-aur.sh`. |
|
|
||||||
| `mkarchiso` plante sur `[fws-local]` | Le repo local n'a pas été généré. Relancer `setup-aur.sh`. |
|
|
||||||
| Écran noir après login Hyprland | Tu testes dans VirtualBox → pas d'accélération GPU. Utiliser QEMU/KVM avec `virtio-gpu` ou bare-metal. |
|
|
||||||
| Retours à la ligne CRLF | `build.sh` lance `dos2unix` automatiquement, mais si tu modifies pendant le build, relancer. |
|
|
||||||
|
|
||||||
### Logs utiles
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Pendant le build
|
|
||||||
tail -f /tmp/fws-build/work/iso/arch/pkglist.x86_64.txt
|
|
||||||
|
|
||||||
# Dans l'ISO (autologin tty1)
|
|
||||||
journalctl -b
|
|
||||||
|
|
||||||
# Hyprland post-install
|
|
||||||
cat ~/.local/share/hyprland/hyprland.log
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Variables d'environnement supportées
|
|
||||||
|
|
||||||
| Variable | Effet | Défaut |
|
|
||||||
|---|---|---|
|
|
||||||
| `ARCH_WSL_DISTRO` | Nom de la distro WSL Arch | `Arch` |
|
|
||||||
| `MSYS_NO_PATHCONV` | Désactive la conversion auto des chemins Git Bash | `1` (forcé dans les scripts) |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -278,21 +87,6 @@ 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**.
|
||||||
|
|
||||||
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.
|
Voir [LICENSE](LICENSE) pour le texte complet, et [AUTHORS.rst](AUTHORS.rst) pour la liste des auteurs originaux d'archiso.
|
||||||
|
|
||||||
### Base légale complète
|
Les modifications spécifiques à FWS (scripts `build.sh`, `setup-calamares.sh`, overlay `configs/baseline/`, intégration Calamares + Xorg autostart, chaîne de build WSL) sont également distribuées sous GPL-3.0-or-later.
|
||||||
|
|
||||||
| 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.**
|
|
||||||
|
|||||||
@@ -1,147 +0,0 @@
|
|||||||
# Logiciels tiers & licences — FWS
|
|
||||||
|
|
||||||
Ce document est l'**inventaire de conformité** (« bill of materials ») des
|
|
||||||
logiciels tiers que FWS reconditionne, embarque ou redistribue. Il sert à
|
|
||||||
satisfaire les obligations d'**attribution** et de **préservation des avis de
|
|
||||||
licence** des licences GPL, LGPL, AGPL, Apache, MIT et BSD.
|
|
||||||
|
|
||||||
Trois familles de tiers :
|
|
||||||
|
|
||||||
1. **La base du dépôt** : FWS est un fork d'**archiso**.
|
|
||||||
2. **Les paquets construits/redistribués par FWS** (`pkgbuilds/` + `local-repo/`),
|
|
||||||
notamment l'installateur **Anaconda** et ses dépendances Python.
|
|
||||||
3. **L'ensemble des paquets Arch Linux** agrégés dans l'ISO live (chacun sous sa
|
|
||||||
propre licence ; l'avis de licence de chaque paquet est présent dans
|
|
||||||
`/usr/share/licenses/<paquet>/` sur le système installé/live).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. Base du dépôt
|
|
||||||
|
|
||||||
| Composant | Rôle | SPDX | Détenteur | Source amont |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| **archiso** | système de build (mkarchiso, profils, man, Makefile) | `GPL-3.0-or-later` | Arch Linux / Archiso Authors | https://gitlab.archlinux.org/archlinux/archiso |
|
|
||||||
|
|
||||||
Auteurs originaux : voir [AUTHORS.rst](AUTHORS.rst).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Paquets construits / redistribués par FWS
|
|
||||||
|
|
||||||
Sources des recettes : `pkgbuilds/*/PKGBUILD`. Binaires : `local-repo/*.pkg.tar.zst`.
|
|
||||||
La **source correspondante** (au sens GPL/LGPL) de chacun est le tarball amont
|
|
||||||
référencé par `source=()` dans le PKGBUILD, plus le PKGBUILD lui-même.
|
|
||||||
|
|
||||||
| Paquet | Version | SPDX | Détenteur principal | Source amont |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| anaconda | 45.8 | `GPL-2.0-or-later` | Red Hat, Inc. & contributeurs Anaconda | https://github.com/rhinstaller/anaconda |
|
|
||||||
| anaconda-widgets | 45.8 | `GPL-2.0-or-later` | Red Hat, Inc. | https://github.com/rhinstaller/anaconda |
|
|
||||||
| pykickstart | 3.74 | `GPL-2.0-or-later` | Red Hat, Inc. | https://github.com/pykickstart/pykickstart |
|
|
||||||
| python-blivet | 3.13.2 | `LGPL-2.1-only` | Red Hat, Inc. | https://github.com/storaged-project/blivet |
|
|
||||||
| python-meh | 0.43 | `GPL-2.0-or-later` | Red Hat, Inc. | https://github.com/rhinstaller/python-meh |
|
|
||||||
| python-productmd | 1.50 | `LGPL-2.1-or-later` | Red Hat, Inc. / release-engineering | https://github.com/release-engineering/productmd |
|
|
||||||
| python-simpleline | 1.8 | `LGPL-3.0-or-later` | Red Hat, Inc. | https://github.com/rhinstaller/python-simpleline |
|
|
||||||
| python-requests-file | 2.1.0 | `Apache-2.0` | David Shea | https://github.com/dashea/requests-file |
|
|
||||||
| python-requests-ftp | 0.3.1 | `Apache-2.0` | Cory Benfield | https://github.com/Lukasa/requests-ftp |
|
|
||||||
| python-pid | 3.0.4 | `Apache-2.0` | trbs | https://github.com/trbs/pid |
|
|
||||||
| python-iso639 | 0.4.5 | **`AGPL-3.0-only`** ⚠ | Mikael Karlsson (noumar) | https://github.com/noumar/iso639 |
|
|
||||||
| python-langtable | 0.0.51 | `GPL-3.0-or-later AND MIT` | Mike FABIAN | https://github.com/mike-fabian/langtable |
|
|
||||||
| python-xkbregistry | 1.5 | `MIT` | Stephen Early | https://github.com/sde1000/python-xkbregistry |
|
|
||||||
| libreport | 2.17.15 | **`GPL-2.0-only`** ⚠ | Red Hat, Inc. (projet ABRT) | https://github.com/abrt/libreport |
|
|
||||||
| satyr | 0.43 | `GPL-2.0-or-later` | Red Hat, Inc. (projet ABRT) | https://github.com/abrt/satyr |
|
|
||||||
| libxmlrpc (xmlrpc-c) | 1.64.03 | `custom` (BSD-style permissive) | Auteurs xmlrpc-c | https://xmlrpc-c.sourceforge.net/ |
|
|
||||||
| winboat-bin | 0.9.0 | `MIT` | Auteurs WinBoat (TibixDev) | https://www.winboat.app |
|
|
||||||
|
|
||||||
> Les versions et identifiants SPDX ci-dessus proviennent des champs `license=`
|
|
||||||
> des PKGBUILD et des `.PKGINFO` des paquets de `local-repo/`. Quand le `.PKGINFO`
|
|
||||||
> portait une étiquette ancienne et imprécise (`GPL`, `Apache`), l'identifiant
|
|
||||||
> SPDX retenu est celui du dépôt amont (p. ex. `satyr` → `GPL-2.0-or-later`).
|
|
||||||
> **À corriger dans les PKGBUILD** pour des étiquettes SPDX exactes.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Paquets Arch Linux de l'ISO
|
|
||||||
|
|
||||||
L'ISO live agrège tout l'ensemble de paquets listé dans
|
|
||||||
`configs/releng/packages.x86_64` et `configs/baseline/packages.x86_64` (noyau
|
|
||||||
Linux, Xorg, Openbox, environnements de bureau, utilitaires…). Chaque paquet
|
|
||||||
conserve sa licence d'origine ; l'avis correspondant est fourni dans
|
|
||||||
`/usr/share/licenses/<paquet>/` sur le système. FWS ne revendique aucun droit
|
|
||||||
sur ces paquets.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. Analyse de compatibilité des licences
|
|
||||||
|
|
||||||
**Licence effective du dépôt FWS : `GPL-3.0-or-later`** (imposée par la dérivation
|
|
||||||
d'archiso, lui-même GPL-3.0-or-later).
|
|
||||||
|
|
||||||
### 4.1 Principe d'agrégation (le cas général)
|
|
||||||
|
|
||||||
L'ISO et le dépôt de paquets sont des **agrégations** de programmes indépendants
|
|
||||||
(« mere aggregation », GPLv3 §5 / GPLv2 §2). Chaque paquet est distribué comme
|
|
||||||
une unité séparée (binaire `.pkg.tar.zst` distinct, processus distinct,
|
|
||||||
bibliothèque partagée distincte) et **conserve sa propre licence**. C'est
|
|
||||||
exactement le modèle juridique sous lequel Arch Linux, Debian et Fedora
|
|
||||||
distribuent des milliers de paquets de licences hétérogènes sur un même média.
|
|
||||||
À ce niveau, la compatibilité copyleft **n'est pas requise** : il n'y a pas
|
|
||||||
d'« œuvre combinée » unique.
|
|
||||||
|
|
||||||
### 4.2 Compatibilité au sein du runtime Anaconda
|
|
||||||
|
|
||||||
Anaconda charge plusieurs modules dans **un même processus Python** au moment de
|
|
||||||
l'exécution. Les licences en présence et leur compatibilité montante vers GPLv3 :
|
|
||||||
|
|
||||||
| Licence du composant | Compatible GPLv3 ? | Note |
|
|
||||||
|---|---|---|
|
|
||||||
| `GPL-2.0-or-later` (anaconda, meh, pykickstart, satyr…) | ✅ | la clause « or later » autorise l'usage en GPLv3 |
|
|
||||||
| `LGPL-2.1-only` (blivet) | ✅ | LGPL-2.1 §3 autorise la relicence en GPL ; usage dynamique |
|
|
||||||
| `LGPL-2.1-or-later` (productmd) | ✅ | montée vers (L)GPLv3 |
|
|
||||||
| `LGPL-3.0-or-later` (simpleline) | ✅ | sous-ensemble de GPLv3 |
|
|
||||||
| `Apache-2.0` (requests-file, requests-ftp, pid) | ✅ | compatible GPLv3 (sens unique) ; voir [NOTICE](NOTICE) |
|
|
||||||
| `MIT` (xkbregistry, winboat) | ✅ | permissive |
|
|
||||||
| `MIT`/`BSD-style` (langtable, libxmlrpc) | ✅ | permissive |
|
|
||||||
|
|
||||||
### 4.3 ⚠ Deux points à surveiller (signalés en bonne foi)
|
|
||||||
|
|
||||||
1. **`python-iso639` est `AGPL-3.0-only`.** L'AGPL est compatible avec GPLv3 via
|
|
||||||
la clause de compatibilité réciproque (GPLv3 §13 / AGPLv3 §13) : on peut
|
|
||||||
combiner du code AGPLv3 et GPLv3. La **clause réseau** de l'AGPL (mise à
|
|
||||||
disposition de la source aux utilisateurs distants d'un service réseau) est
|
|
||||||
en pratique **inerte** pour un installateur hors-ligne. **Cependant**, l'AGPL
|
|
||||||
est la licence la plus contaminante et beaucoup d'organisations l'interdisent
|
|
||||||
par politique interne. **Recommandation béton :** si l'AGPL n'est pas
|
|
||||||
souhaitée, remplacer `noumar/iso639` par une bibliothèque ISO-639 non-AGPL
|
|
||||||
(p. ex. `pycountry` — BSD, ou les données `iso-codes`), ce qui élimine le
|
|
||||||
sujet.
|
|
||||||
|
|
||||||
2. **`libreport` est `GPL-2.0-only`** (sans « or later »). GPL-2.0-**only** n'est
|
|
||||||
**pas** compatible en montée avec GPLv3/AGPLv3. Tant que `libreport` reste un
|
|
||||||
paquet **séparé** (bibliothèque partagée distincte, appelée via `python-meh`
|
|
||||||
qui importe `report`), on demeure dans le régime d'agrégation §4.1 — et c'est
|
|
||||||
la configuration que **Fedora elle-même distribue**. Le risque n'apparaîtrait
|
|
||||||
que si l'on **liait statiquement** `libreport` (GPLv2-only) avec un composant
|
|
||||||
AGPLv3-only/GPLv3-only dans un **seul binaire** : à éviter. En l'état (paquets
|
|
||||||
séparés), pas de conflit.
|
|
||||||
|
|
||||||
### 4.4 Verdict
|
|
||||||
|
|
||||||
En l'état (paquets séparés, agrégation sur ISO, modules Python chargés au
|
|
||||||
runtime), **la configuration est cohérente et alignée sur la pratique des
|
|
||||||
distributions majeures**. Les deux points ⚠ ci-dessus méritent une décision
|
|
||||||
explicite (garder / remplacer l'AGPL) et une revue par un juriste FOSS avant
|
|
||||||
diffusion commerciale.
|
|
||||||
|
|
||||||
> **Ceci n'est pas un avis juridique.** Analyse de bonne foi fondée sur les
|
|
||||||
> métadonnées de licence du dépôt à la date du 2026-06-17.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. Préservation des avis
|
|
||||||
|
|
||||||
- Les textes de licence amont présents dans les sources sont conservés lors du
|
|
||||||
`package()` (pacman installe `LICENSE`/`COPYING` dans
|
|
||||||
`/usr/share/licenses/<paquet>/`).
|
|
||||||
- Les attributions requises par Apache-2.0 / MIT / BSD figurent dans [NOTICE](NOTICE).
|
|
||||||
- Aucun avis de droit d'auteur amont ne doit être retiré des sources ou binaires
|
|
||||||
redistribués.
|
|
||||||
-133
@@ -1,133 +0,0 @@
|
|||||||
# Marques & non-affiliation — FWS
|
|
||||||
|
|
||||||
FWS redistribue et modifie des logiciels portant des **marques** de tiers. Les
|
|
||||||
licences libres (GPL, LGPL, Apache…) accordent des droits sur le **code**, mais
|
|
||||||
**jamais** sur les **marques, noms et logos**. Ce document liste les marques
|
|
||||||
concernées et les déclarations de non-affiliation. Il vaut engagement du projet
|
|
||||||
à les respecter.
|
|
||||||
|
|
||||||
## Marque du projet
|
|
||||||
|
|
||||||
- **FWS** est le nom (marque non déposée) du présent projet, utilisé par les
|
|
||||||
Contributeurs FWS. Toute reprise du nom/logo FWS pour désigner une version
|
|
||||||
modifiée non officielle doit éviter de laisser croire à un aval du projet FWS.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Arch Linux
|
|
||||||
|
|
||||||
> **Arch Linux™** est une marque du projet Arch Linux. FWS est une distribution
|
|
||||||
> **dérivée indépendante**, *basée sur* Arch Linux. FWS **n'est ni affilié, ni
|
|
||||||
> sponsorisé, ni approuvé** par le projet Arch Linux. *« Arch Linux is a
|
|
||||||
> trademark of the Arch Linux project. FWS is an independent derivative and is
|
|
||||||
> not affiliated with, sponsored by, or endorsed by Arch Linux. »*
|
|
||||||
|
|
||||||
Engagements FWS :
|
|
||||||
|
|
||||||
- ne pas présenter FWS **comme étant** Arch Linux ;
|
|
||||||
- ne pas utiliser le **logo Arch Linux** comme logo de FWS ;
|
|
||||||
- usage **nominatif** uniquement (« basé sur Arch Linux », « compatible
|
|
||||||
paquets Arch ») ;
|
|
||||||
- respecter les recommandations Arch pour les dérivés
|
|
||||||
(https://wiki.archlinux.org/title/DeveloperWiki:TrademarkPolicy).
|
|
||||||
|
|
||||||
### ✅ Remédiation appliquée (le live ne s'annonce plus comme « Arch Linux »)
|
|
||||||
|
|
||||||
Le système live héritait de l'`os-release` du paquet `filesystem` d'Arch et
|
|
||||||
**s'annonçait comme « Arch Linux »** ; le `motd` renvoyait vers
|
|
||||||
`wiki.archlinux.org`. Corrigé :
|
|
||||||
|
|
||||||
- **`os-release` FWS** : fourni dans
|
|
||||||
`configs/releng/airootfs/usr/local/share/fws/os-release` et appliqué sur
|
|
||||||
`/usr/lib/os-release` par un **hook pacman PostTransaction**
|
|
||||||
(`configs/releng/airootfs/etc/pacman.d/hooks/zz-fws-os-release.hook`). On ne
|
|
||||||
peut pas poser le fichier directement dans l'overlay : `filesystem` possède ce
|
|
||||||
chemin et `mkarchiso` copie l'overlay **avant** pacstrap → conflit pacman
|
|
||||||
« exists in filesystem ». Le hook s'exécute après l'installation des paquets,
|
|
||||||
donc sans conflit, et est retiré du système final par
|
|
||||||
`zzzz99-remove-custom-hooks-from-airootfs.hook`.
|
|
||||||
- **`motd`** : ne référence plus `archlinux.org` ; pointe vers le dépôt FWS.
|
|
||||||
|
|
||||||
> Note technique : `ID=fws` + `ID_LIKE=arch` préserve la détection « famille
|
|
||||||
> Arch » des outils tiers (et satisfait les checks `^ID(_LIKE)?=.*arch` de
|
|
||||||
> `build.sh`/`setup-aur.sh`, qui portent de toute façon sur l'hôte de build).
|
|
||||||
> Si la migration Anaconda révèle un composant testant `ID=arch` en dur, basculer
|
|
||||||
> transitoirement le hook sur `ID=arch` tout en gardant `NAME`/`PRETTY_NAME` FWS.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Red Hat & Fedora
|
|
||||||
|
|
||||||
> **Red Hat®** et **Fedora®** sont des marques déposées de **Red Hat, Inc.**
|
|
||||||
> L'installateur **Anaconda** est développé par Red Hat. FWS distribue une
|
|
||||||
> **version MODIFIÉE** d'Anaconda (portée sur Arch, payload `liveimg`), **non
|
|
||||||
> officielle**, **non fournie ni approuvée** par Red Hat ou le projet Fedora.
|
|
||||||
> *« This product includes a modified version of Anaconda. Red Hat and Fedora
|
|
||||||
> are trademarks of Red Hat, Inc. This is an unofficial build, not provided or
|
|
||||||
> endorsed by Red Hat or the Fedora Project. »*
|
|
||||||
|
|
||||||
Engagements FWS :
|
|
||||||
|
|
||||||
- ne pas utiliser les marques Red Hat / Fedora pour suggérer un aval ;
|
|
||||||
- **marquer clairement Anaconda comme modifié** (la GPL exige d'identifier les
|
|
||||||
versions modifiées ; la politique de marque Red Hat exige de ne pas faire
|
|
||||||
passer une version modifiée pour officielle) ;
|
|
||||||
- **recommandation béton :** retirer tout **logo / nom de produit Red Hat ou
|
|
||||||
Fedora** de l'interface de l'installateur si présent, et y afficher
|
|
||||||
« Installateur FWS (basé sur Anaconda) ». La configuration produit d'Anaconda
|
|
||||||
se règle via `product.d` / les données de branding — à auditer pendant la
|
|
||||||
migration.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Anaconda — désambiguïsation
|
|
||||||
|
|
||||||
> Le nom **« Anaconda »** désigne ici **l'installateur de Red Hat/Fedora**
|
|
||||||
> (https://github.com/rhinstaller/anaconda). Il **n'a aucun rapport** avec
|
|
||||||
> **Anaconda®**, marque déposée d'**Anaconda, Inc.** (la distribution Python /
|
|
||||||
> data-science). FWS n'utilise ni ne distribue le produit d'Anaconda, Inc.
|
|
||||||
|
|
||||||
À mentionner dans la doc utilisateur pour éviter toute confusion.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Windows & Microsoft
|
|
||||||
|
|
||||||
> **Windows®** et **Microsoft®** sont des marques de **Microsoft Corporation**.
|
|
||||||
> FWS embarque **WinBoat** (MIT), qui permet d'exécuter des applications Windows
|
|
||||||
> sous Linux. FWS et WinBoat **ne sont ni affiliés, ni approuvés** par Microsoft.
|
|
||||||
> Exécuter des applications Windows requiert vos **propres licences Windows
|
|
||||||
> valides** ; FWS ne fournit aucun logiciel ni licence Microsoft.
|
|
||||||
|
|
||||||
Le nom du projet et son slogan font un usage **parodique / nominatif** du terme
|
|
||||||
« Windows » et n'impliquent aucun lien avec Microsoft.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Autres marques (usage nominatif)
|
|
||||||
|
|
||||||
Les noms suivants désignent des projets/options proposés à l'installation ou
|
|
||||||
utilisés comme composants, et sont des marques de leurs détenteurs, employées
|
|
||||||
de façon **purement descriptive** :
|
|
||||||
|
|
||||||
- **GNOME®** — The GNOME Foundation
|
|
||||||
- **KDE®**, **Plasma** — KDE e.V.
|
|
||||||
- **Xfce** — projet Xfce
|
|
||||||
- **Hyprland** — projet Hyprland
|
|
||||||
- **GTK** — The GNOME Foundation
|
|
||||||
- **Linux®** — marque déposée de Linus Torvalds
|
|
||||||
- **WinBoat** — projet WinBoat
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Principe général
|
|
||||||
|
|
||||||
L'emploi de ces marques dans FWS relève de l'**usage nominatif loyal** (décrire
|
|
||||||
l'origine, la compatibilité ou les composants), **sans** suggérer parrainage ou
|
|
||||||
affiliation. Aucune licence sur ces marques n'est accordée ni reçue. Pour toute
|
|
||||||
utilisation commerciale du nom/logo d'un tiers au-delà de l'usage nominatif,
|
|
||||||
obtenir l'autorisation du détenteur.
|
|
||||||
|
|
||||||
> **Ceci n'est pas un avis juridique.** Faites valider la stratégie de marque
|
|
||||||
> (notamment le nom du projet et le rebranding d'Anaconda) par un conseil avant
|
|
||||||
> diffusion publique large.
|
|
||||||
-322
@@ -1,322 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# ============================================================
|
|
||||||
# FWS — Build OFFICIEL versionné de l'ISO (archiso)
|
|
||||||
#
|
|
||||||
# Identique à build.sh dans sa structure, mais :
|
|
||||||
# - lit la version dans le fichier VERSION (format Major.Minor.Build)
|
|
||||||
# - nomme l'ISO FWS-vMAJOR-MINOR-BUILD-DATE-x86_64.iso
|
|
||||||
# - range l'ISO dans out/vMAJOR/vMAJOR.MINOR/
|
|
||||||
#
|
|
||||||
# Fonctionne sur :
|
|
||||||
# - Windows 10 / 11 (Git Bash → bascule auto dans WSL Arch)
|
|
||||||
# - Arch Linux natif (exécution directe)
|
|
||||||
# - WSL Arch lancé directement (exécution directe)
|
|
||||||
#
|
|
||||||
# Nom de la distro WSL : "Arch" par défaut, ou $ARCH_WSL_DISTRO,
|
|
||||||
# ou auto-détecté parmi les noms courants.
|
|
||||||
# ============================================================
|
|
||||||
|
|
||||||
set -e
|
|
||||||
trap 'rc=$?; echo -e "\e[31mÉchec (build-offi.sh) ligne $LINENO, code $rc.\e[0m" >&2; exit $rc' ERR
|
|
||||||
|
|
||||||
DISTRO_NAME="${ARCH_WSL_DISTRO:-Arch}"
|
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# Bascule Git Bash (Windows 10/11) → WSL si besoin
|
|
||||||
# ============================================================
|
|
||||||
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || -n "$WINDIR" ]]; then
|
|
||||||
echo -e "\e[36mGit Bash détecté — bascule dans WSL ($DISTRO_NAME)...\e[0m"
|
|
||||||
export MSYS_NO_PATHCONV=1
|
|
||||||
export MSYS2_ARG_CONV_EXCL="*"
|
|
||||||
|
|
||||||
# WSL doit être présent (sinon message clair plutôt que command not found).
|
|
||||||
command -v wsl.exe >/dev/null 2>&1 || {
|
|
||||||
echo -e "\e[31mWSL introuvable. Installe WSL2 puis une distro Arch :\e[0m" >&2
|
|
||||||
echo " 1) PowerShell admin : wsl --install" >&2
|
|
||||||
echo " 2) Installe Arch (ArchWSL, ou 'wsl --install -d archlinux') puis relance." >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Choix de la distro Arch : override $ARCH_WSL_DISTRO, sinon nom exact,
|
|
||||||
# sinon 1re distro « arch » réellement joignable. On énumère via
|
|
||||||
# `wsl -l -q` (sortie UTF-16LE → on retire NUL/CR) au lieu d'une liste
|
|
||||||
# figée, mais on garde la sonde « echo ok » (une distro listée peut
|
|
||||||
# être en cours d'install / cassée).
|
|
||||||
pick_arch_distro() {
|
|
||||||
wsl.exe -d "$DISTRO_NAME" -u root -- echo ok >/dev/null 2>&1 && return 0
|
|
||||||
local d distros=()
|
|
||||||
mapfile -t distros < <(wsl.exe -l -q 2>/dev/null | tr -d '\0\r' | sed 's/[[:space:]]*$//;/^$/d')
|
|
||||||
for d in "${distros[@]}"; do
|
|
||||||
[[ "$d" == "$DISTRO_NAME" ]] || continue
|
|
||||||
wsl.exe -d "$d" -u root -- echo ok >/dev/null 2>&1 && { DISTRO_NAME="$d"; return 0; }
|
|
||||||
done
|
|
||||||
for d in "${distros[@]}"; do
|
|
||||||
[[ "$d" =~ [Aa][Rr][Cc][Hh] ]] || continue
|
|
||||||
wsl.exe -d "$d" -u root -- echo ok >/dev/null 2>&1 && { DISTRO_NAME="$d"; return 0; }
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if ! pick_arch_distro; then
|
|
||||||
echo -e "\e[31mAucune distribution WSL Arch joignable.\e[0m" >&2
|
|
||||||
echo "Distros WSL installées :" >&2
|
|
||||||
wsl.exe -l -v 2>/dev/null | tr -d '\0' >&2 || true
|
|
||||||
echo "" >&2
|
|
||||||
echo "Installe Arch dans WSL puis relance :" >&2
|
|
||||||
echo " - ArchWSL (yuk7) — s'enregistre sous 'Arch' : https://github.com/yuk7/ArchWSL/releases/latest" >&2
|
|
||||||
echo " - ou image officielle : wsl --install -d archlinux (nom 'archlinux')" >&2
|
|
||||||
echo "Distro sous un autre nom ? export ARCH_WSL_DISTRO=<nom> (cf. 'wsl -l -v' ci-dessus)." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo -e "\e[36m==> Distro WSL : $DISTRO_NAME\e[0m"
|
|
||||||
|
|
||||||
# Traduit le dossier du script en chemin WSL.
|
|
||||||
SCRIPT_DIR_WIN="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
|
|
||||||
SCRIPT_PATH_WSL=$(MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- \
|
|
||||||
wslpath "$(echo "$SCRIPT_DIR_WIN" | sed 's|/|\\\\|g')/build-offi.sh" \
|
|
||||||
2>/dev/null | tr -d '\r\n')
|
|
||||||
[ -n "$SCRIPT_PATH_WSL" ] || {
|
|
||||||
echo -e "\e[31mTraduction du chemin vers WSL échouée (wslpath). Vérifie ARCH_WSL_DISTRO ($DISTRO_NAME).\e[0m" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
wsl.exe -d "$DISTRO_NAME" -u root -- test -f "$SCRIPT_PATH_WSL" || {
|
|
||||||
echo -e "\e[31mScript introuvable dans WSL : $SCRIPT_PATH_WSL\e[0m" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Relance ce même script dans WSL, en root, depuis son vrai chemin
|
|
||||||
# (BASH_SOURCE → WORK_DIR correct). Les fins de ligne sont garanties LF
|
|
||||||
# par .gitattributes (*.sh text eol=lf) ; le profil copié est en plus
|
|
||||||
# passé à dos2unix plus loin.
|
|
||||||
echo "==> Script à exécuter dans WSL : $SCRIPT_PATH_WSL"
|
|
||||||
MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- bash "$SCRIPT_PATH_WSL"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# Bascule conteneur : hôte non-Arch (Fedora, Ubuntu, …) →
|
|
||||||
# build dans un conteneur Arch via podman.
|
|
||||||
#
|
|
||||||
# mkarchiso exige pacman + des mounts/chroot/loop privilégiés que
|
|
||||||
# seul un environnement Arch fournit. Sur un hôte non-Arch on relance
|
|
||||||
# CE script à l'identique dans docker.io/library/archlinux:latest, le
|
|
||||||
# dépôt monté au MÊME chemin absolu (→ WORK_DIR et out/ inchangés).
|
|
||||||
# podman ROOTFUL + --privileged obligatoire : rootless ne gère pas les
|
|
||||||
# mounts/chroot de mkarchiso (et --privileged relâche aussi SELinux,
|
|
||||||
# enforcing sur Fedora, sur le bind-mount sans avoir besoin de :Z).
|
|
||||||
# ============================================================
|
|
||||||
host_is_arch() {
|
|
||||||
# Fedora empaquette aussi « pacman » → sa seule présence ne suffit pas ;
|
|
||||||
# on exige en plus un ID/ID_LIKE « arch » dans /etc/os-release.
|
|
||||||
command -v pacman >/dev/null 2>&1 \
|
|
||||||
&& grep -qiE '^ID(_LIKE)?=.*arch' /etc/os-release 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ -z "$FWS_IN_CONTAINER" ] && ! host_is_arch; then
|
|
||||||
echo -e "\e[36mHôte non-Arch détecté — build officiel dans un conteneur Arch (podman)...\e[0m"
|
|
||||||
|
|
||||||
command -v podman >/dev/null 2>&1 || {
|
|
||||||
echo -e "\e[31mpodman introuvable.\e[0m" >&2
|
|
||||||
echo " Fedora : sudo dnf install -y podman" >&2
|
|
||||||
echo " Debian/Ubuntu : sudo apt install -y podman" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Rootful : préfixe sudo si on n'est pas déjà root.
|
|
||||||
SUDO=(); [ "$EUID" -eq 0 ] || SUDO=(sudo)
|
|
||||||
# -it seulement si on est dans un terminal (sinon podman casse en CI).
|
|
||||||
TTY=(); [ -t 0 ] && TTY=(-it)
|
|
||||||
|
|
||||||
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
SELF="$(basename "${BASH_SOURCE[0]}")"
|
|
||||||
IMAGE="docker.io/library/archlinux:latest"
|
|
||||||
|
|
||||||
# pull explicite : « run » ne re-résout jamais le tag « latest » une fois
|
|
||||||
# l'image en cache → sans ça on build indéfiniment sur une image qui
|
|
||||||
# vieillit (puis partial upgrades pacman). Le -Syu côté conteneur (plus
|
|
||||||
# bas) complète la parade.
|
|
||||||
echo "==> Pull de l'image $IMAGE..."
|
|
||||||
"${SUDO[@]}" podman pull "$IMAGE"
|
|
||||||
|
|
||||||
echo "==> Relance dans le conteneur ($SELF)..."
|
|
||||||
"${SUDO[@]}" podman run --rm "${TTY[@]}" --privileged \
|
|
||||||
-e FWS_IN_CONTAINER=1 \
|
|
||||||
-v "$REPO_DIR":"$REPO_DIR" \
|
|
||||||
-v fws-pacman-cache:/var/cache/pacman/pkg \
|
|
||||||
-w "$REPO_DIR" \
|
|
||||||
"$IMAGE" \
|
|
||||||
bash "$REPO_DIR/$SELF"
|
|
||||||
|
|
||||||
# podman rootful → les fichiers produits (out/) appartiennent à root.
|
|
||||||
# On les rend au propriétaire du dépôt pour confort côté hôte.
|
|
||||||
OWNER="$(stat -c '%u:%g' "$REPO_DIR" 2>/dev/null || true)"
|
|
||||||
if [ -n "$OWNER" ]; then
|
|
||||||
for d in out local-repo; do
|
|
||||||
[ -e "$REPO_DIR/$d" ] && "${SUDO[@]}" chown -R "$OWNER" "$REPO_DIR/$d" 2>/dev/null || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# Exécution native (Arch Linux bare-metal, WSL, OU conteneur Arch)
|
|
||||||
# ============================================================
|
|
||||||
command -v pacman >/dev/null \
|
|
||||||
|| { echo -e "\e[31mpacman introuvable — lance ce script depuis Arch / WSL.\e[0m"; exit 1; }
|
|
||||||
|
|
||||||
# mkarchiso exige root. Sur Arch natif on s'élève (sudo de préférence,
|
|
||||||
# sinon su) ; depuis la bascule Git Bash on est déjà root (-u root).
|
|
||||||
# $0 est cité pour gérer les chemins à espaces (ex. "1. FWS").
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
|
||||||
if command -v sudo >/dev/null 2>&1; then
|
|
||||||
exec sudo bash "$0" "$@"
|
|
||||||
else
|
|
||||||
exec su -c "bash \"$0\"" root
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if grep -qi 'microsoft\|wsl' /proc/version 2>/dev/null; then
|
|
||||||
echo -e "\e[36mBuild officiel dans WSL ($DISTRO_NAME) en tant que root...\e[0m"
|
|
||||||
IS_WSL=1
|
|
||||||
else
|
|
||||||
echo -e "\e[36mBuild officiel sur Arch Linux natif en tant que root...\e[0m"
|
|
||||||
IS_WSL=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Le dossier de travail = dossier qui contient ce script (gère les
|
|
||||||
# espaces du chemin, ex. "1. FWS").
|
|
||||||
WORK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
echo "==> Dossier de travail : $WORK_DIR"
|
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# Lecture et validation de la version (fichier VERSION)
|
|
||||||
# ============================================================
|
|
||||||
VERSION_FILE="$WORK_DIR/VERSION"
|
|
||||||
[ -f "$VERSION_FILE" ] \
|
|
||||||
|| { echo -e "\e[31mFichier VERSION introuvable : $VERSION_FILE\e[0m"; exit 1; }
|
|
||||||
|
|
||||||
# Trim espaces / tabulations / CR / LF
|
|
||||||
VERSION="$(tr -d ' \t\r\n' < "$VERSION_FILE")"
|
|
||||||
|
|
||||||
if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
||||||
echo -e "\e[31mVERSION invalide : '$VERSION' (attendu Major.Minor.Build, ex. 1.2.3)\e[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS='.' read -r MAJOR MINOR BUILD <<< "$VERSION"
|
|
||||||
BUILD_DATE="$(date +%Y.%m.%d)"
|
|
||||||
ISO_VERSION="v${MAJOR}-${MINOR}-${BUILD}-${BUILD_DATE}"
|
|
||||||
OUT_DIR="$WORK_DIR/out/v${MAJOR}/v${MAJOR}.${MINOR}"
|
|
||||||
ISO_FILE="$OUT_DIR/FWS-${ISO_VERSION}-x86_64.iso"
|
|
||||||
|
|
||||||
echo "==> Version officielle : ${MAJOR}.${MINOR}.${BUILD}"
|
|
||||||
echo "==> Dossier de sortie : $OUT_DIR"
|
|
||||||
echo "==> ISO finale : FWS-${ISO_VERSION}-x86_64.iso"
|
|
||||||
|
|
||||||
# pacman ≥ 7 sandboxe les ops FS via landlock, non supporté par le kernel
|
|
||||||
# WSL ni (selon le noyau) par le conteneur → désactivation. Idempotent,
|
|
||||||
# sans effet sur Arch natif.
|
|
||||||
if { [ "$IS_WSL" -eq 1 ] || [ -n "$FWS_IN_CONTAINER" ]; } \
|
|
||||||
&& ! grep -qE '^[[:space:]]*DisableSandbox' /etc/pacman.conf; then
|
|
||||||
sed -i '/^\[options\]/a DisableSandbox' /etc/pacman.conf
|
|
||||||
echo "==> WSL/conteneur détecté → DisableSandbox ajouté à /etc/pacman.conf"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "==> Mise à jour des miroirs et installation de archiso..."
|
|
||||||
pacman -Sy --noconfirm reflector || true
|
|
||||||
reflector --verbose --latest 10 --sort rate --save /etc/pacman.d/mirrorlist || true
|
|
||||||
if [ -n "$FWS_IN_CONTAINER" ]; then
|
|
||||||
# Image de base qui vieillit → upgrade complet AVANT d'ajouter archiso,
|
|
||||||
# sinon partial upgrade (archiso tire des deps plus récentes que la base).
|
|
||||||
pacman -Syu --noconfirm archiso
|
|
||||||
else
|
|
||||||
pacman -Sy --noconfirm archiso
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "==> Préparation de l'environnement de build..."
|
|
||||||
rm -rf /tmp/fws-build
|
|
||||||
mkdir -p /tmp/fws-build/releng
|
|
||||||
|
|
||||||
# Copie configs/releng/ en base
|
|
||||||
if [ -d "$WORK_DIR/configs/releng" ]; then
|
|
||||||
cp -ar "$WORK_DIR/configs/releng/"* /tmp/fws-build/releng/
|
|
||||||
echo "==> configs/releng/ copié"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Fusionne configs/baseline/ par dessus (priorité aux fichiers baseline)
|
|
||||||
if [ -d "$WORK_DIR/configs/baseline" ]; then
|
|
||||||
cp -ar "$WORK_DIR/configs/baseline/"* /tmp/fws-build/releng/
|
|
||||||
echo "==> configs/baseline/ fusionné (prioritaire)"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── Injection de la version dans profiledef.sh (copie temporaire) ──
|
|
||||||
# mkarchiso nomme l'ISO ${iso_name}-${iso_version}-${arch}.iso.
|
|
||||||
# On force iso_version pour obtenir vMAJOR-MINOR-BUILD-DATE.
|
|
||||||
if [ -f /tmp/fws-build/releng/profiledef.sh ]; then
|
|
||||||
sed -i "s|^iso_version=.*|iso_version=\"${ISO_VERSION}\"|" \
|
|
||||||
/tmp/fws-build/releng/profiledef.sh
|
|
||||||
echo "==> iso_version forcé à '${ISO_VERSION}' dans profiledef.sh"
|
|
||||||
else
|
|
||||||
echo -e "\e[31mprofiledef.sh introuvable dans le profil de build.\e[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "==> Activation de NetworkManager.service sur le live (symlink réel)..."
|
|
||||||
mkdir -p /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants
|
|
||||||
ln -sf /usr/lib/systemd/system/NetworkManager.service \
|
|
||||||
/tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
|
|
||||||
|
|
||||||
echo "==> Vérification des services systemd..."
|
|
||||||
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/ 2>/dev/null || echo " (aucun service)"
|
|
||||||
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/ 2>/dev/null || echo " (aucun symlink)"
|
|
||||||
|
|
||||||
# Copie le repo local (winboat-bin + deps Anaconda packagées)
|
|
||||||
if ls "$WORK_DIR/local-repo/"*.pkg.tar.zst &>/dev/null 2>&1; then
|
|
||||||
echo "==> Copie du repo local fws-local..."
|
|
||||||
mkdir -p /tmp/fws-build/local-repo
|
|
||||||
cp -a "$WORK_DIR/local-repo/"* /tmp/fws-build/local-repo/
|
|
||||||
|
|
||||||
echo "==> Injection [fws-local] dans pacman.conf..."
|
|
||||||
sed -i '/^\[fws-local\]/,/^$/d' /tmp/fws-build/releng/pacman.conf
|
|
||||||
PACMAN_TMP=$(mktemp)
|
|
||||||
printf '[fws-local]\nSigLevel = Optional TrustAll\nServer = file:///tmp/fws-build/local-repo\n\n' \
|
|
||||||
> "$PACMAN_TMP"
|
|
||||||
cat /tmp/fws-build/releng/pacman.conf >> "$PACMAN_TMP"
|
|
||||||
mv "$PACMAN_TMP" /tmp/fws-build/releng/pacman.conf
|
|
||||||
|
|
||||||
echo "==> Vérification pacman.conf :"
|
|
||||||
head -5 /tmp/fws-build/releng/pacman.conf
|
|
||||||
else
|
|
||||||
echo "==> Aucun repo local détecté."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "==> Correction des retours à la ligne Windows (dos2unix)..."
|
|
||||||
pacman -S --needed --noconfirm dos2unix
|
|
||||||
find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
|
|
||||||
|
|
||||||
echo "==> Lancement de mkarchiso..."
|
|
||||||
mkdir -p "$OUT_DIR"
|
|
||||||
# mkarchiso supprime l'ISO cible avant de la réécrire : si elle est VERROUILLÉE
|
|
||||||
# par Windows (VM ouverte dessus, ISO montée), ce rm casse tout le build à la
|
|
||||||
# fin. Parade : staging neuf puis déplacement ; si la cible (cette même
|
|
||||||
# version) est verrouillée, on bascule sur un nom horodaté. On ne touche
|
|
||||||
# jamais aux ISO des autres versions.
|
|
||||||
STAGE="$OUT_DIR/.staging-$$"
|
|
||||||
rm -rf "$STAGE"; mkdir -p "$STAGE"
|
|
||||||
mkarchiso -v -w /tmp/fws-build/work -o "$STAGE" /tmp/fws-build/releng
|
|
||||||
|
|
||||||
NEW_ISO="$(ls -1 "$STAGE/"*.iso 2>/dev/null | head -1)"
|
|
||||||
[ -n "$NEW_ISO" ] || { echo -e "\e[31mAucune ISO produite par mkarchiso.\e[0m" >&2; exit 1; }
|
|
||||||
if { chmod -f 666 "$ISO_FILE" 2>/dev/null; rm -f "$ISO_FILE" 2>/dev/null; } && mv -f "$NEW_ISO" "$ISO_FILE" 2>/dev/null; then
|
|
||||||
FINAL="$ISO_FILE"
|
|
||||||
else
|
|
||||||
FINAL="${ISO_FILE%.iso}-$(date +%H%M%S).iso"
|
|
||||||
echo -e "\e[33m[!] '$ISO_FILE' est verrouillée (une VM l'utilise ?). Écriture sous un nom unique.\e[0m" >&2
|
|
||||||
mv -f "$NEW_ISO" "$FINAL"
|
|
||||||
fi
|
|
||||||
rm -rf "$STAGE" 2>/dev/null || true
|
|
||||||
|
|
||||||
echo "==> Nettoyage..."
|
|
||||||
rm -rf /tmp/fws-build/work
|
|
||||||
|
|
||||||
echo "==> Build officiel terminé ! ISO : $FINAL"
|
|
||||||
echo -e "\e[32mScript de build officiel (v${MAJOR}.${MINOR}.${BUILD}) terminé avec succès.\e[0m"
|
|
||||||
@@ -1,224 +1,54 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ============================================================
|
|
||||||
# FWS — Build de l'ISO via mkarchiso (archiso)
|
export MSYS_NO_PATHCONV=1
|
||||||
#
|
|
||||||
# Fonctionne sur :
|
|
||||||
# - Windows 10 / 11 (Git Bash → bascule auto dans WSL Arch)
|
|
||||||
# - Arch Linux natif (exécution directe)
|
|
||||||
# - WSL Arch lancé directement (exécution directe)
|
|
||||||
#
|
|
||||||
# Nom de la distro WSL : "Arch" par défaut, ou $ARCH_WSL_DISTRO,
|
|
||||||
# ou auto-détecté parmi les noms courants.
|
|
||||||
# ============================================================
|
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
trap 'rc=$?; echo -e "\e[31mÉchec (build.sh) ligne $LINENO, code $rc.\e[0m" >&2; exit $rc' ERR
|
trap 'echo -e "\e[31mErreur lors de l execution (build.sh).\e[0m"; exit 1' ERR
|
||||||
|
|
||||||
DISTRO_NAME="${ARCH_WSL_DISTRO:-Arch}"
|
DISTRO_NAME="Arch"
|
||||||
|
|
||||||
# ============================================================
|
if [ -n "$WSL_DISTRO_NAME" ]; then
|
||||||
# Bascule Git Bash (Windows 10/11) → WSL si besoin
|
echo -e "\e[36mBuild exécuté depuis WSL ($WSL_DISTRO_NAME) en tant que root...\e[0m"
|
||||||
# ============================================================
|
IN_WSL=1
|
||||||
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" || -n "$WINDIR" ]]; then
|
|
||||||
echo -e "\e[36mGit Bash détecté — bascule dans WSL ($DISTRO_NAME)...\e[0m"
|
|
||||||
export MSYS_NO_PATHCONV=1
|
|
||||||
export MSYS2_ARG_CONV_EXCL="*"
|
|
||||||
|
|
||||||
# WSL doit être présent (sinon message clair plutôt que command not found).
|
|
||||||
command -v wsl.exe >/dev/null 2>&1 || {
|
|
||||||
echo -e "\e[31mWSL introuvable. Installe WSL2 puis une distro Arch :\e[0m" >&2
|
|
||||||
echo " 1) PowerShell admin : wsl --install" >&2
|
|
||||||
echo " 2) Installe Arch (ArchWSL, ou 'wsl --install -d archlinux') puis relance." >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Choix de la distro Arch : override $ARCH_WSL_DISTRO, sinon nom exact,
|
|
||||||
# sinon 1re distro « arch » réellement joignable. On énumère via
|
|
||||||
# `wsl -l -q` (sortie UTF-16LE → on retire NUL/CR) au lieu d'une liste
|
|
||||||
# figée, mais on garde la sonde « echo ok » (une distro listée peut
|
|
||||||
# être en cours d'install / cassée).
|
|
||||||
pick_arch_distro() {
|
|
||||||
wsl.exe -d "$DISTRO_NAME" -u root -- echo ok >/dev/null 2>&1 && return 0
|
|
||||||
local d distros=()
|
|
||||||
mapfile -t distros < <(wsl.exe -l -q 2>/dev/null | tr -d '\0\r' | sed 's/[[:space:]]*$//;/^$/d')
|
|
||||||
for d in "${distros[@]}"; do
|
|
||||||
[[ "$d" == "$DISTRO_NAME" ]] || continue
|
|
||||||
wsl.exe -d "$d" -u root -- echo ok >/dev/null 2>&1 && { DISTRO_NAME="$d"; return 0; }
|
|
||||||
done
|
|
||||||
for d in "${distros[@]}"; do
|
|
||||||
[[ "$d" =~ [Aa][Rr][Cc][Hh] ]] || continue
|
|
||||||
wsl.exe -d "$d" -u root -- echo ok >/dev/null 2>&1 && { DISTRO_NAME="$d"; return 0; }
|
|
||||||
done
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
if ! pick_arch_distro; then
|
|
||||||
echo -e "\e[31mAucune distribution WSL Arch joignable.\e[0m" >&2
|
|
||||||
echo "Distros WSL installées :" >&2
|
|
||||||
wsl.exe -l -v 2>/dev/null | tr -d '\0' >&2 || true
|
|
||||||
echo "" >&2
|
|
||||||
echo "Installe Arch dans WSL puis relance :" >&2
|
|
||||||
echo " - ArchWSL (yuk7) — s'enregistre sous 'Arch' : https://github.com/yuk7/ArchWSL/releases/latest" >&2
|
|
||||||
echo " - ou image officielle : wsl --install -d archlinux (nom 'archlinux')" >&2
|
|
||||||
echo "Distro sous un autre nom ? export ARCH_WSL_DISTRO=<nom> (cf. 'wsl -l -v' ci-dessus)." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo -e "\e[36m==> Distro WSL : $DISTRO_NAME\e[0m"
|
|
||||||
|
|
||||||
# Traduit le dossier du script en chemin WSL.
|
|
||||||
SCRIPT_DIR_WIN="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
|
|
||||||
SCRIPT_PATH_WSL=$(MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- \
|
|
||||||
wslpath "$(echo "$SCRIPT_DIR_WIN" | sed 's|/|\\\\|g')/build.sh" \
|
|
||||||
2>/dev/null | tr -d '\r\n')
|
|
||||||
[ -n "$SCRIPT_PATH_WSL" ] || {
|
|
||||||
echo -e "\e[31mTraduction du chemin vers WSL échouée (wslpath). Vérifie ARCH_WSL_DISTRO ($DISTRO_NAME).\e[0m" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
wsl.exe -d "$DISTRO_NAME" -u root -- test -f "$SCRIPT_PATH_WSL" || {
|
|
||||||
echo -e "\e[31mScript introuvable dans WSL : $SCRIPT_PATH_WSL\e[0m" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Relance ce même script dans WSL, en root, depuis son vrai chemin
|
|
||||||
# (BASH_SOURCE → WORK_DIR correct). Les fins de ligne sont garanties LF
|
|
||||||
# par .gitattributes (*.sh text eol=lf) ; le profil copié est en plus
|
|
||||||
# passé à dos2unix plus loin.
|
|
||||||
echo "==> Script à exécuter dans WSL : $SCRIPT_PATH_WSL"
|
|
||||||
MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- bash "$SCRIPT_PATH_WSL"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# Bascule conteneur : hôte non-Arch (Fedora, Ubuntu, …) →
|
|
||||||
# build dans un conteneur Arch via podman.
|
|
||||||
#
|
|
||||||
# mkarchiso exige pacman + des mounts/chroot/loop privilégiés que
|
|
||||||
# seul un environnement Arch fournit. Sur un hôte non-Arch on relance
|
|
||||||
# CE script à l'identique dans docker.io/library/archlinux:latest, le
|
|
||||||
# dépôt monté au MÊME chemin absolu (→ WORK_DIR et out/ inchangés).
|
|
||||||
# podman ROOTFUL + --privileged obligatoire : rootless ne gère pas les
|
|
||||||
# mounts/chroot de mkarchiso (et --privileged relâche aussi SELinux,
|
|
||||||
# enforcing sur Fedora, sur le bind-mount sans avoir besoin de :Z).
|
|
||||||
# ============================================================
|
|
||||||
host_is_arch() {
|
|
||||||
# Fedora empaquette aussi « pacman » → sa seule présence ne suffit pas ;
|
|
||||||
# on exige en plus un ID/ID_LIKE « arch » dans /etc/os-release.
|
|
||||||
command -v pacman >/dev/null 2>&1 \
|
|
||||||
&& grep -qiE '^ID(_LIKE)?=.*arch' /etc/os-release 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ -z "$FWS_IN_CONTAINER" ] && ! host_is_arch; then
|
|
||||||
echo -e "\e[36mHôte non-Arch détecté — build dans un conteneur Arch (podman)...\e[0m"
|
|
||||||
|
|
||||||
command -v podman >/dev/null 2>&1 || {
|
|
||||||
echo -e "\e[31mpodman introuvable.\e[0m" >&2
|
|
||||||
echo " Fedora : sudo dnf install -y podman" >&2
|
|
||||||
echo " Debian/Ubuntu : sudo apt install -y podman" >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Rootful : préfixe sudo si on n'est pas déjà root.
|
|
||||||
SUDO=(); [ "$EUID" -eq 0 ] || SUDO=(sudo)
|
|
||||||
# -it seulement si on est dans un terminal (sinon podman casse en CI).
|
|
||||||
TTY=(); [ -t 0 ] && TTY=(-it)
|
|
||||||
|
|
||||||
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
SELF="$(basename "${BASH_SOURCE[0]}")"
|
|
||||||
IMAGE="docker.io/library/archlinux:latest"
|
|
||||||
|
|
||||||
# pull explicite : « run » ne re-résout jamais le tag « latest » une fois
|
|
||||||
# l'image en cache → sans ça on build indéfiniment sur une image qui
|
|
||||||
# vieillit (puis partial upgrades pacman). Le -Syu côté conteneur (plus
|
|
||||||
# bas) complète la parade.
|
|
||||||
echo "==> Pull de l'image $IMAGE..."
|
|
||||||
"${SUDO[@]}" podman pull "$IMAGE"
|
|
||||||
|
|
||||||
echo "==> Relance dans le conteneur ($SELF)..."
|
|
||||||
"${SUDO[@]}" podman run --rm "${TTY[@]}" --privileged \
|
|
||||||
-e FWS_IN_CONTAINER=1 \
|
|
||||||
-v "$REPO_DIR":"$REPO_DIR" \
|
|
||||||
-v fws-pacman-cache:/var/cache/pacman/pkg \
|
|
||||||
-w "$REPO_DIR" \
|
|
||||||
"$IMAGE" \
|
|
||||||
bash "$REPO_DIR/$SELF"
|
|
||||||
|
|
||||||
# podman rootful → les fichiers produits (out/) appartiennent à root.
|
|
||||||
# On les rend au propriétaire du dépôt pour confort côté hôte.
|
|
||||||
OWNER="$(stat -c '%u:%g' "$REPO_DIR" 2>/dev/null || true)"
|
|
||||||
if [ -n "$OWNER" ]; then
|
|
||||||
for d in out local-repo; do
|
|
||||||
[ -e "$REPO_DIR/$d" ] && "${SUDO[@]}" chown -R "$OWNER" "$REPO_DIR/$d" 2>/dev/null || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# Exécution native (Arch Linux bare-metal, WSL, OU conteneur Arch)
|
|
||||||
# ============================================================
|
|
||||||
command -v pacman >/dev/null \
|
|
||||||
|| { echo -e "\e[31mpacman introuvable — lance ce script depuis Arch / WSL.\e[0m"; exit 1; }
|
|
||||||
|
|
||||||
# mkarchiso exige root. Sur Arch natif on s'élève (sudo de préférence,
|
|
||||||
# sinon su) ; depuis la bascule Git Bash on est déjà root (-u root).
|
|
||||||
# $0 est cité pour gérer les chemins à espaces (ex. "1. FWS").
|
|
||||||
if [ "$EUID" -ne 0 ]; then
|
|
||||||
if command -v sudo >/dev/null 2>&1; then
|
|
||||||
exec sudo bash "$0" "$@"
|
|
||||||
else
|
|
||||||
exec su -c "bash \"$0\"" root
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if grep -qi 'microsoft\|wsl' /proc/version 2>/dev/null; then
|
|
||||||
echo -e "\e[36mBuild exécuté dans WSL ($DISTRO_NAME) en tant que root...\e[0m"
|
|
||||||
IS_WSL=1
|
|
||||||
else
|
else
|
||||||
echo -e "\e[36mBuild exécuté sur Arch Linux natif en tant que root...\e[0m"
|
echo -e "\e[36mLancement du processus de build dans WSL ($DISTRO_NAME) en tant que root...\e[0m"
|
||||||
IS_WSL=0
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Le dossier de travail = dossier qui contient ce script (gère les
|
if [ -z "$IN_WSL" ]; then
|
||||||
# espaces du chemin, ex. "1. FWS").
|
# ── Depuis Git Bash ──────────────────────────────────────
|
||||||
WORK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR_WIN="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
|
||||||
echo "==> Dossier de travail : $WORK_DIR"
|
WORK_DIR_WSL=$(MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- \
|
||||||
|
wslpath "$(echo "$SCRIPT_DIR_WIN" | sed 's|/|\\\\|g')" 2>/dev/null | tr -d '\r\n')
|
||||||
|
|
||||||
# pacman ≥ 7 sandboxe les ops FS via landlock, non supporté par le kernel
|
echo "==> Dossier de travail WSL : $WORK_DIR_WSL"
|
||||||
# WSL ni (selon le noyau) par le conteneur → désactivation. Idempotent,
|
|
||||||
# sans effet sur Arch natif.
|
MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- bash << EOF
|
||||||
if { [ "$IS_WSL" -eq 1 ] || [ -n "$FWS_IN_CONTAINER" ]; } \
|
set -e
|
||||||
&& ! grep -qE '^[[:space:]]*DisableSandbox' /etc/pacman.conf; then
|
WORK_DIR="${WORK_DIR_WSL}"
|
||||||
sed -i '/^\[options\]/a DisableSandbox' /etc/pacman.conf
|
echo "==> Dossier de travail : \$WORK_DIR"
|
||||||
echo "==> WSL/conteneur détecté → DisableSandbox ajouté à /etc/pacman.conf"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "==> Mise à jour des miroirs et installation de archiso..."
|
echo "==> Mise à jour des miroirs et installation de archiso..."
|
||||||
pacman -Sy --noconfirm reflector || true
|
pacman -Sy --noconfirm reflector || true
|
||||||
reflector --verbose --latest 10 --sort rate --save /etc/pacman.d/mirrorlist || true
|
reflector --verbose --latest 10 --sort rate --save /etc/pacman.d/mirrorlist || true
|
||||||
if [ -n "$FWS_IN_CONTAINER" ]; then
|
pacman -Sy --noconfirm archiso
|
||||||
# Image de base qui vieillit → upgrade complet AVANT d'ajouter archiso,
|
|
||||||
# sinon partial upgrade (archiso tire des deps plus récentes que la base).
|
|
||||||
pacman -Syu --noconfirm archiso
|
|
||||||
else
|
|
||||||
pacman -Sy --noconfirm archiso
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "==> Préparation de l'environnement de build..."
|
echo "==> Préparation de l'environnement de build..."
|
||||||
rm -rf /tmp/fws-build
|
rm -rf /tmp/fws-build
|
||||||
mkdir -p /tmp/fws-build/releng
|
mkdir -p /tmp/fws-build/releng
|
||||||
|
|
||||||
# Copie configs/releng/ en base
|
# Copie configs/releng/ en base
|
||||||
if [ -d "$WORK_DIR/configs/releng" ]; then
|
if [ -d "\$WORK_DIR/configs/releng" ]; then
|
||||||
cp -ar "$WORK_DIR/configs/releng/"* /tmp/fws-build/releng/
|
cp -ar "\$WORK_DIR/configs/releng/"* /tmp/fws-build/releng/
|
||||||
echo "==> configs/releng/ copié"
|
echo "==> configs/releng/ copié"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Fusionne configs/baseline/ par dessus (priorité aux fichiers baseline)
|
# Fusionne configs/baseline/ par dessus (priorité aux fichiers baseline)
|
||||||
if [ -d "$WORK_DIR/configs/baseline" ]; then
|
if [ -d "\$WORK_DIR/configs/baseline" ]; then
|
||||||
cp -ar "$WORK_DIR/configs/baseline/"* /tmp/fws-build/releng/
|
cp -ar "\$WORK_DIR/configs/baseline/"* /tmp/fws-build/releng/
|
||||||
echo "==> configs/baseline/ fusionné (prioritaire)"
|
echo "==> configs/baseline/ fusionné (prioritaire)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "==> Activation de NetworkManager.service sur le live (symlink réel)..."
|
echo "==> Activation de NetworkManager.service sur le live (symlink réel WSL)..."
|
||||||
mkdir -p /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants
|
mkdir -p /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants
|
||||||
ln -sf /usr/lib/systemd/system/NetworkManager.service \
|
ln -sf /usr/lib/systemd/system/NetworkManager.service \
|
||||||
/tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
|
/tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
|
||||||
@@ -227,19 +57,19 @@ echo "==> Vérification des services systemd..."
|
|||||||
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/ 2>/dev/null || echo " (aucun service)"
|
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/ 2>/dev/null || echo " (aucun service)"
|
||||||
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/ 2>/dev/null || echo " (aucun symlink)"
|
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/ 2>/dev/null || echo " (aucun symlink)"
|
||||||
|
|
||||||
# Copie le repo local (winboat-bin + deps Anaconda packagées)
|
# Copie le repo local (calamares + winboat-bin)
|
||||||
if ls "$WORK_DIR/local-repo/"*.pkg.tar.zst &>/dev/null 2>&1; then
|
if ls "\$WORK_DIR/local-repo/"*.pkg.tar.zst &>/dev/null 2>&1; then
|
||||||
echo "==> Copie du repo local fws-local..."
|
echo "==> Copie du repo local Calamares..."
|
||||||
mkdir -p /tmp/fws-build/local-repo
|
mkdir -p /tmp/fws-build/local-repo
|
||||||
cp -a "$WORK_DIR/local-repo/"* /tmp/fws-build/local-repo/
|
cp -a "\$WORK_DIR/local-repo/"* /tmp/fws-build/local-repo/
|
||||||
|
|
||||||
echo "==> Injection [fws-local] dans pacman.conf..."
|
echo "==> Injection [fws-local] dans pacman.conf..."
|
||||||
sed -i '/^\[fws-local\]/,/^$/d' /tmp/fws-build/releng/pacman.conf
|
sed -i '/^\[fws-local\]/,/^$/d' /tmp/fws-build/releng/pacman.conf
|
||||||
PACMAN_TMP=$(mktemp)
|
PACMAN_TMP=\$(mktemp)
|
||||||
printf '[fws-local]\nSigLevel = Optional TrustAll\nServer = file:///tmp/fws-build/local-repo\n\n' \
|
printf '[fws-local]\nSigLevel = Optional TrustAll\nServer = file:///tmp/fws-build/local-repo\n\n' \
|
||||||
> "$PACMAN_TMP"
|
> "\$PACMAN_TMP"
|
||||||
cat /tmp/fws-build/releng/pacman.conf >> "$PACMAN_TMP"
|
cat /tmp/fws-build/releng/pacman.conf >> "\$PACMAN_TMP"
|
||||||
mv "$PACMAN_TMP" /tmp/fws-build/releng/pacman.conf
|
mv "\$PACMAN_TMP" /tmp/fws-build/releng/pacman.conf
|
||||||
|
|
||||||
echo "==> Vérification pacman.conf :"
|
echo "==> Vérification pacman.conf :"
|
||||||
head -5 /tmp/fws-build/releng/pacman.conf
|
head -5 /tmp/fws-build/releng/pacman.conf
|
||||||
@@ -252,31 +82,99 @@ pacman -S --needed --noconfirm dos2unix
|
|||||||
find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
|
find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
|
||||||
|
|
||||||
echo "==> Lancement de mkarchiso..."
|
echo "==> Lancement de mkarchiso..."
|
||||||
mkdir -p "$WORK_DIR/out"
|
# Simulation Try/Catch en Bash pour l'écriture du fichier ISO
|
||||||
# mkarchiso fait un « rm » interne de l'ISO cible avant de la (ré)écrire ; si
|
TARGET_OUT="\$WORK_DIR/out"
|
||||||
# une ISO du même nom est VERROUILLÉE par Windows (VM encore ouverte dessus,
|
mkdir -p "\$TARGET_OUT" 2>/dev/null || true
|
||||||
# ISO montée, antivirus), ce rm échoue et tout le build casse à la toute fin.
|
|
||||||
# Parade : mkarchiso écrit dans un dossier de staging neuf, puis on déplace
|
|
||||||
# l'ISO. Si la cible est verrouillée, on bascule sur un nom horodaté → le
|
|
||||||
# build réussit quand même au lieu de tout perdre.
|
|
||||||
STAGE="$WORK_DIR/out/.staging-$$"
|
|
||||||
rm -rf "$STAGE"; mkdir -p "$STAGE"
|
|
||||||
mkarchiso -v -w /tmp/fws-build/work -o "$STAGE" /tmp/fws-build/releng
|
|
||||||
|
|
||||||
NEW_ISO="$(ls -1 "$STAGE/"*.iso 2>/dev/null | head -1)"
|
if [ -w "\$TARGET_OUT" ]; then
|
||||||
[ -n "$NEW_ISO" ] || { echo -e "\e[31mAucune ISO produite par mkarchiso.\e[0m" >&2; exit 1; }
|
mkarchiso -v -w /tmp/fws-build/work -o "\$TARGET_OUT" /tmp/fws-build/releng
|
||||||
DEST="$WORK_DIR/out/$(basename "$NEW_ISO")"
|
echo "==> Build terminé ! ISO dans \$TARGET_OUT"
|
||||||
if { chmod -f 666 "$DEST" 2>/dev/null; rm -f "$DEST" 2>/dev/null; } && mv -f "$NEW_ISO" "$DEST" 2>/dev/null; then
|
|
||||||
FINAL="$DEST"
|
|
||||||
else
|
else
|
||||||
FINAL="$WORK_DIR/out/$(basename "${NEW_ISO%.iso}")-$(date +%H%M%S).iso"
|
echo -e "\e[33m[Attention] Impossible d'écrire dans \$TARGET_OUT. Utilisation d'un dossier temporaire de secours...\e[0m"
|
||||||
echo -e "\e[33m[!] '$DEST' est verrouillée (une VM l'utilise ?). Écriture sous un nom unique.\e[0m" >&2
|
BACKUP_OUT="/tmp/fws-out-backup"
|
||||||
mv -f "$NEW_ISO" "$FINAL"
|
mkdir -p "\$BACKUP_OUT"
|
||||||
|
mkarchiso -v -w /tmp/fws-build/work -o "\$BACKUP_OUT" /tmp/fws-build/releng
|
||||||
|
echo -e "\e[32m==> Build terminé ! ISO sauvegardée en sécurité dans : \$BACKUP_OUT\e[0m"
|
||||||
fi
|
fi
|
||||||
rm -rf "$STAGE" 2>/dev/null || true
|
|
||||||
|
|
||||||
echo "==> Nettoyage..."
|
echo "==> Nettoyage..."
|
||||||
rm -rf /tmp/fws-build/work
|
rm -rf /tmp/fws-build/work
|
||||||
|
EOF
|
||||||
|
|
||||||
echo "==> Build terminé ! ISO : $FINAL"
|
else
|
||||||
echo -e "\e[32mScript de build terminé avec succès.\e[0m"
|
# ── Déjà dans WSL ────────────────────────────────────────
|
||||||
|
WORK_DIR="$PWD"
|
||||||
|
echo "==> Dossier de travail : $WORK_DIR"
|
||||||
|
|
||||||
|
echo "==> Mise à jour et installation de archiso..."
|
||||||
|
pacman -Sy --noconfirm reflector || true
|
||||||
|
reflector --verbose --latest 10 --sort rate --save /etc/pacman.d/mirrorlist || true
|
||||||
|
pacman -Sy --noconfirm archiso
|
||||||
|
|
||||||
|
echo "==> Préparation de l'environnement de build..."
|
||||||
|
rm -rf /tmp/fws-build
|
||||||
|
mkdir -p /tmp/fws-build/releng
|
||||||
|
|
||||||
|
if [ -d "$WORK_DIR/configs/releng" ]; then
|
||||||
|
cp -ar "$WORK_DIR/configs/releng/"* /tmp/fws-build/releng/
|
||||||
|
echo "==> configs/releng/ copié"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "$WORK_DIR/configs/baseline" ]; then
|
||||||
|
cp -ar "$WORK_DIR/configs/baseline/"* /tmp/fws-build/releng/
|
||||||
|
echo "==> configs/baseline/ fusionné (prioritaire)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> Activation de NetworkManager.service sur le live (symlink réel)..."
|
||||||
|
mkdir -p /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants
|
||||||
|
ln -sf /usr/lib/systemd/system/NetworkManager.service \
|
||||||
|
/tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/NetworkManager.service
|
||||||
|
|
||||||
|
echo "==> Vérification des services systemd..."
|
||||||
|
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/ 2>/dev/null || echo " (aucun service)"
|
||||||
|
ls /tmp/fws-build/releng/airootfs/etc/systemd/system/multi-user.target.wants/ 2>/dev/null || echo " (aucun symlink)"
|
||||||
|
|
||||||
|
if ls "$WORK_DIR/local-repo/"*.pkg.tar.zst &>/dev/null 2>&1; then
|
||||||
|
echo "==> Copie du repo local Calamares..."
|
||||||
|
mkdir -p /tmp/fws-build/local-repo
|
||||||
|
cp -a "$WORK_DIR/local-repo/"* /tmp/fws-build/local-repo/
|
||||||
|
|
||||||
|
echo "==> Injection [fws-local] dans pacman.conf..."
|
||||||
|
sed -i '/^\[fws-local\]/,/^$/d' /tmp/fws-build/releng/pacman.conf
|
||||||
|
PACMAN_TMP=$(mktemp)
|
||||||
|
printf '[fws-local]\nSigLevel = Optional TrustAll\nServer = file:///tmp/fws-build/local-repo\n\n' \
|
||||||
|
> "$PACMAN_TMP"
|
||||||
|
cat /tmp/fws-build/releng/pacman.conf >> "$PACMAN_TMP"
|
||||||
|
mv "$PACMAN_TMP" /tmp/fws-build/releng/pacman.conf
|
||||||
|
|
||||||
|
echo "==> Vérification pacman.conf :"
|
||||||
|
head -5 /tmp/fws-build/releng/pacman.conf
|
||||||
|
else
|
||||||
|
echo "==> Aucun repo local détecté."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> Correction des retours à la ligne Windows (dos2unix)..."
|
||||||
|
pacman -S --needed --noconfirm dos2unix
|
||||||
|
find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
|
||||||
|
|
||||||
|
echo "==> Lancement de mkarchiso..."
|
||||||
|
# Simulation Try/Catch en Bash pour l'écriture du fichier ISO
|
||||||
|
TARGET_OUT="$WORK_DIR/out"
|
||||||
|
mkdir -p "$TARGET_OUT" 2>/dev/null || true
|
||||||
|
|
||||||
|
if [ -w "$TARGET_OUT" ]; then
|
||||||
|
mkarchiso -v -w /tmp/fws-build/work -o "$TARGET_OUT" /tmp/fws-build/releng
|
||||||
|
echo "==> Build terminé ! ISO dans $TARGET_OUT"
|
||||||
|
else
|
||||||
|
echo -e "\e[33m[Attention] Impossible d'écrire dans $TARGET_OUT. Utilisation d'un dossier temporaire de secours...\e[0m"
|
||||||
|
BACKUP_OUT="/tmp/fws-out-backup"
|
||||||
|
mkdir -p "$BACKUP_OUT"
|
||||||
|
mkarchiso -v -w /tmp/fws-build/work -o "$BACKUP_OUT" /tmp/fws-build/releng
|
||||||
|
echo -e "\e[32m==> Build terminé ! ISO sauvegardée en sécurité dans : $BACKUP_OUT\e[0m"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> Nettoyage..."
|
||||||
|
rm -rf /tmp/fws-build/work
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "\e[32mScript de build terminé avec succès.\e[0m"
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — branding.desc
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
componentName: fws
|
||||||
|
|
||||||
|
strings:
|
||||||
|
productName: "FWS"
|
||||||
|
shortProductName: "FWS"
|
||||||
|
version: "1.0"
|
||||||
|
shortVersion: "1.0"
|
||||||
|
versionedName: "FWS 1.0"
|
||||||
|
shortVersionedName: "FWS 1.0"
|
||||||
|
bootloaderEntryName: "FWS"
|
||||||
|
productUrl: ""
|
||||||
|
supportUrl: ""
|
||||||
|
releaseNotesUrl: ""
|
||||||
|
donateUrl: ""
|
||||||
|
|
||||||
|
images:
|
||||||
|
productLogo: "logo.png"
|
||||||
|
productIcon: "logo.png"
|
||||||
|
productWelcome: "logo.png"
|
||||||
|
|
||||||
|
slideshow: "slideshow.qml"
|
||||||
|
slideshowAPI: 2
|
||||||
|
|
||||||
|
style:
|
||||||
|
# Couleurs de la sidebar
|
||||||
|
sidebarBackground: "#1a1a2e"
|
||||||
|
sidebarText: "#e0e0e0"
|
||||||
|
sidebarTextHighlight: "#00d4ff"
|
||||||
|
sidebarSelect: "#16213e"
|
||||||
|
|
||||||
|
# Couleurs générales
|
||||||
|
backgroundColor: "#0f3460"
|
||||||
|
highlightedTextColor: "#ffffff"
|
||||||
|
genericTextColor: "#e0e0e0"
|
||||||
|
errorTextColor: "#ff6b6b"
|
||||||
|
warningTextColor: "#ffa500"
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,138 @@
|
|||||||
|
/* ============================================================
|
||||||
|
FWS Linux — slideshow.qml
|
||||||
|
Affiché pendant l'installation
|
||||||
|
============================================================ */
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
import calamares.slideshow 1.0
|
||||||
|
|
||||||
|
Presentation {
|
||||||
|
id: presentation
|
||||||
|
|
||||||
|
function nextSlide() {
|
||||||
|
if (presentation.currentSlide < slides.count - 1)
|
||||||
|
presentation.currentSlide++
|
||||||
|
else
|
||||||
|
presentation.currentSlide = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: timer
|
||||||
|
interval: 4000
|
||||||
|
repeat: true
|
||||||
|
running: true
|
||||||
|
onTriggered: nextSlide()
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#1a1a2e"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "🚀 Bienvenue sur FWS Linux"
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Un système rapide, léger et puissant."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#16213e"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "⚡ Basé sur Arch Linux"
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Accès à l'AUR et aux derniers paquets."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#0f3460"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "🛡️ Sécurité & Stabilité"
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "FWS est conçu pour être robuste et fiable."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#1a1a2e"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "✅ Installation en cours..."
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Merci de patienter, FWS s'installe sur votre machine."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
efiBootLoader: "grub"
|
||||||
|
|
||||||
|
kernel: "/vmlinuz-linux"
|
||||||
|
img: "/initramfs-linux.img"
|
||||||
|
fallback: "/initramfs-linux-fallback.img"
|
||||||
|
timeout: "5"
|
||||||
|
|
||||||
|
grubInstall: "grub-install"
|
||||||
|
grubMkconfig: "grub-mkconfig"
|
||||||
|
grubCfg: "/boot/grub/grub.cfg"
|
||||||
|
grubProbe: "grub-probe"
|
||||||
|
efiBootMgr: "efibootmgr"
|
||||||
|
|
||||||
|
efiDirectory: "/boot/efi"
|
||||||
|
efiBootloaderId: "FWS"
|
||||||
|
|
||||||
|
installEFIFallback: true
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
restartNowEnabled: true
|
||||||
|
restartNowChecked: false
|
||||||
|
restartNowCommand: "systemctl -i reboot"
|
||||||
|
|
||||||
|
notifyOnFinished: true
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
mountOptions:
|
||||||
|
default: defaults,noatime
|
||||||
|
btrfs: defaults,noatime,compress=zstd,space_cache=v2
|
||||||
|
|
||||||
|
ssdExtraMountOptions:
|
||||||
|
ext4: discard
|
||||||
|
jfs: discard
|
||||||
|
xfs: discard
|
||||||
|
swap: discard
|
||||||
|
btrfs: discard=async
|
||||||
|
|
||||||
|
crypttabOptions: luks,keyscript=/bin/cat
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
overwrite: true
|
||||||
|
|
||||||
|
kernel_params:
|
||||||
|
- "quiet"
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
GRUB_TIMEOUT: 5
|
||||||
|
GRUB_DEFAULT: "saved"
|
||||||
|
GRUB_DISABLE_SUBMENU: true
|
||||||
|
GRUB_TERMINAL_OUTPUT: "console"
|
||||||
|
GRUB_DISABLE_RECOVERY: true
|
||||||
|
GRUB_DISTRIBUTOR: "FWS"
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
location: EtcFile
|
||||||
|
writeHostsFile: true
|
||||||
|
setSystemdHostname: EtcFile
|
||||||
|
|
||||||
|
template: "fws-${first}"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
# Hooks par défaut Arch + support clavier/LUKS avant block/filesystems.
|
||||||
|
modules: []
|
||||||
|
binaries: []
|
||||||
|
files: []
|
||||||
|
|
||||||
|
hooks:
|
||||||
|
- base
|
||||||
|
- udev
|
||||||
|
- autodetect
|
||||||
|
- microcode
|
||||||
|
- modconf
|
||||||
|
- kms
|
||||||
|
- keyboard
|
||||||
|
- keymap
|
||||||
|
- consolefont
|
||||||
|
- block
|
||||||
|
- filesystems
|
||||||
|
- fsck
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
xOrgConfFileName: "00-keyboard.conf"
|
||||||
|
convertedKeymapPath: "/usr/share/X11/xkb/symbols/pc"
|
||||||
|
keyboardLayout: "fr"
|
||||||
|
keyboardVariant: ""
|
||||||
|
keyboardModel: "pc105"
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
region: "Europe"
|
||||||
|
zone: "Paris"
|
||||||
|
localeGenPath: "/etc/locale.gen"
|
||||||
|
geoipStyle: "json"
|
||||||
|
geoipUrl: "https://geoip.kde.org/v1/calamares"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
---
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
systemd: true
|
||||||
|
dbus: true
|
||||||
|
dbus-symlink: true
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
extraMounts:
|
||||||
|
- device: proc
|
||||||
|
fs: proc
|
||||||
|
mountPoint: /proc
|
||||||
|
- device: sys
|
||||||
|
fs: sysfs
|
||||||
|
mountPoint: /sys
|
||||||
|
- device: /dev
|
||||||
|
mountPoint: /dev
|
||||||
|
options: [bind]
|
||||||
|
- device: /dev/pts
|
||||||
|
fs: devpts
|
||||||
|
mountPoint: /dev/pts
|
||||||
|
- device: tmpfs
|
||||||
|
fs: tmpfs
|
||||||
|
mountPoint: /run
|
||||||
|
- device: /run/udev
|
||||||
|
mountPoint: /run/udev
|
||||||
|
options: [bind]
|
||||||
|
|
||||||
|
extraMountsEfi:
|
||||||
|
- device: efivarfs
|
||||||
|
fs: efivarfs
|
||||||
|
mountPoint: /sys/firmware/efi/efivars
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
---
|
||||||
|
# Copie /etc/NetworkManager du live vers le système cible (NM gérera le réseau).
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
# Étape post-unpackfs : on retire les paquets qui ne servent que dans
|
||||||
|
# l'ISO live (installeur + outils archiso). Les paquets utiles sont déjà
|
||||||
|
# présents sur le système cible parce qu'unpackfs a copié tout le live.
|
||||||
|
|
||||||
|
backend: pacman
|
||||||
|
update_db: false
|
||||||
|
update_system: false
|
||||||
|
|
||||||
|
operations:
|
||||||
|
- remove:
|
||||||
|
- calamares
|
||||||
|
- kpmcore
|
||||||
|
- archinstall
|
||||||
|
- livecd-sounds
|
||||||
|
- mkinitcpio-archiso
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
efiSystemPartition: "/boot/efi"
|
||||||
|
efiSystemPartitionSize: 300M
|
||||||
|
efiSystemPartitionName: EFI
|
||||||
|
|
||||||
|
userSwapChoices:
|
||||||
|
- none
|
||||||
|
- small
|
||||||
|
- suspend
|
||||||
|
- file
|
||||||
|
|
||||||
|
drawNestedPartitions: true
|
||||||
|
alwaysShowPartitionLabels: true
|
||||||
|
|
||||||
|
initialPartitioningChoice: replace
|
||||||
|
initialSwapChoice: small
|
||||||
|
|
||||||
|
defaultFileSystemType: "ext4"
|
||||||
|
availableFileSystemTypes: ["ext4", "btrfs", "xfs", "f2fs"]
|
||||||
|
|
||||||
|
enableLuksAutomatedPartitioning: true
|
||||||
|
allowManualPartitioning: true
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
services:
|
||||||
|
- name: NetworkManager
|
||||||
|
mandatory: true
|
||||||
|
|
||||||
|
- name: systemd-resolved
|
||||||
|
mandatory: true
|
||||||
|
|
||||||
|
- name: systemd-timesyncd
|
||||||
|
mandatory: true
|
||||||
|
|
||||||
|
- name: sshd
|
||||||
|
mandatory: false
|
||||||
|
|
||||||
|
targets: []
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
# Copie le squashfs du live vers le disque cible.
|
||||||
|
# Le chemin /run/archiso/bootmnt/<install_dir>/<arch>/airootfs.sfs
|
||||||
|
# doit correspondre à `install_dir` dans configs/releng/profiledef.sh ("fws").
|
||||||
|
|
||||||
|
unpack:
|
||||||
|
- source: "/run/archiso/bootmnt/fws/x86_64/airootfs.sfs"
|
||||||
|
sourcefs: "squashfs"
|
||||||
|
destination: ""
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
defaultGroups:
|
||||||
|
- wheel
|
||||||
|
- audio
|
||||||
|
- video
|
||||||
|
- network
|
||||||
|
- storage
|
||||||
|
- power
|
||||||
|
- lp
|
||||||
|
- scanner
|
||||||
|
|
||||||
|
autologinGroup: autologin
|
||||||
|
sudoersGroup: wheel
|
||||||
|
setRootPassword: true
|
||||||
|
doAutologin: false
|
||||||
|
userShell: /bin/bash
|
||||||
|
|
||||||
|
passwordRequirements:
|
||||||
|
minLength: 6
|
||||||
|
maxLength: -1
|
||||||
|
nonempty: true
|
||||||
|
|
||||||
|
allowWeakPasswords: false
|
||||||
|
allowWeakPasswordsDefault: false
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
showSupportUrl: true
|
||||||
|
showKnownIssuesUrl: true
|
||||||
|
showReleaseNotesUrl: false
|
||||||
|
showDonateUrl: false
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
requiredStorage: 8.0
|
||||||
|
requiredRam: 1.5
|
||||||
|
internetCheckUrl: "https://archlinux.org"
|
||||||
|
check:
|
||||||
|
- storage
|
||||||
|
- ram
|
||||||
|
- power
|
||||||
|
- root
|
||||||
|
- screen
|
||||||
|
required:
|
||||||
|
- storage
|
||||||
|
- ram
|
||||||
|
- root
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
# ============================================================
|
||||||
|
# FWS — Calamares settings
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
modules-search: [ local, /usr/lib/calamares/modules ]
|
||||||
|
|
||||||
|
sequence:
|
||||||
|
- show:
|
||||||
|
- welcome
|
||||||
|
- locale
|
||||||
|
- keyboard
|
||||||
|
- partition
|
||||||
|
- users
|
||||||
|
- summary
|
||||||
|
- exec:
|
||||||
|
- partition
|
||||||
|
- mount
|
||||||
|
- unpackfs
|
||||||
|
- machineid
|
||||||
|
- fstab
|
||||||
|
- locale
|
||||||
|
- keyboard
|
||||||
|
- localecfg
|
||||||
|
- users
|
||||||
|
- hostname
|
||||||
|
- hwclock
|
||||||
|
- networkcfg
|
||||||
|
- initcpiocfg
|
||||||
|
- initcpio
|
||||||
|
- grubcfg
|
||||||
|
- bootloader
|
||||||
|
- packages
|
||||||
|
- services-systemd
|
||||||
|
- umount
|
||||||
|
- show:
|
||||||
|
- finished
|
||||||
|
|
||||||
|
branding: fws
|
||||||
|
|
||||||
|
prompt-install: true
|
||||||
|
dont-chroot: false
|
||||||
|
oem-setup: false
|
||||||
|
disable-cancel: false
|
||||||
|
disable-cancel-during-exec: false
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# FWS — force le plugin LVM de libblockdev en mode CLI (libbd_lvm.so) au lieu
|
|
||||||
# du mode DBus (libbd_lvm-dbus.so).
|
|
||||||
#
|
|
||||||
# POURQUOI : libblockdev 3.x sur Arch charge par défaut la variante LVM qui
|
|
||||||
# pilote le démon « lvmdbusd » (service DBus com.redhat.lvmdbus1). Or Arch ne
|
|
||||||
# package PAS lvmdbusd (lvm2 ne livre ni le binaire ni le .service DBus). Quand
|
|
||||||
# Anaconda/blivet peuple l'arbre des périphériques, blivet appelle
|
|
||||||
# blockdev.lvm.lvs() → la variante DBus tente d'activer com.redhat.lvmdbus1 →
|
|
||||||
# GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: name is not activatable
|
|
||||||
# ce qui FAIT PLANTER Anaconda au démarrage.
|
|
||||||
#
|
|
||||||
# La variante CLI (libbd_lvm.so) parle directement aux binaires LVM (lvs, vgs…)
|
|
||||||
# sans démon → fonctionne sans lvmdbusd. Ce fichier conf.d (numéro élevé → lu
|
|
||||||
# après 00-default.cfg) force ce choix de façon fiable.
|
|
||||||
[lvm]
|
|
||||||
sonames=libbd_lvm.so.3
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# FWS — locales à générer dans l'ISO (par locale-gen, via le hook pacman
|
|
||||||
# etc/pacman.d/hooks/zzz-fws-locale-gen.hook au moment du pacstrap).
|
|
||||||
#
|
|
||||||
# en_US.UTF-8 est REQUIS par Anaconda : ses modules DBus font
|
|
||||||
# locale.setlocale(LC_ALL, "en_US.UTF-8") (DEFAULT_LANG)
|
|
||||||
# au démarrage → sans cette locale générée : « locale.Error: unsupported
|
|
||||||
# locale setting » et le module Boss sort en status 1 (installateur planté).
|
|
||||||
# C.UTF-8 (la locale par défaut du live, cf. locale.conf) est intégrée à la
|
|
||||||
# glibc et n'a pas besoin d'être générée.
|
|
||||||
en_US.UTF-8 UTF-8
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# FWS — expose la base squashfs du live à /run/rootfsbase.
|
|
||||||
#
|
|
||||||
# POURQUOI : avec --liveinst, Anaconda utilise le payload « LiveOS » qui RECOPIE
|
|
||||||
# le système live en cours sur le disque. Sa tâche DetectLiveOSImageTask cherche
|
|
||||||
# l'image de base à /dev/mapper/live-base, /dev/mapper/live-osimg-min ou
|
|
||||||
# /run/rootfsbase (conventions dracut-live de Fedora). archiso n'en crée AUCUNE
|
|
||||||
# → « SourceSetupError: No Live OS image found! » et l'installateur plante.
|
|
||||||
#
|
|
||||||
# archiso a pourtant la squashfs (montée en lecture seule sur /run/archiso/
|
|
||||||
# airootfs). On la remonte ici en loop sur /run/rootfsbase pour qu'Anaconda la
|
|
||||||
# détecte : findmnt -o SOURCE /run/rootfsbase → /dev/loopN, qu'Anaconda monte
|
|
||||||
# puis recopie sur la cible (= installe FWS). Le %post du kickstart fait ensuite
|
|
||||||
# mkinitcpio + grub-install (bootloader --disabled côté Anaconda).
|
|
||||||
[Unit]
|
|
||||||
Description=FWS — base squashfs sur /run/rootfsbase (payload LiveOS Anaconda)
|
|
||||||
DefaultDependencies=no
|
|
||||||
After=local-fs.target
|
|
||||||
ConditionPathExists=/run/archiso/bootmnt/fws/x86_64/airootfs.sfs
|
|
||||||
ConditionPathIsMountPoint=!/run/rootfsbase
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
RemainAfterExit=yes
|
|
||||||
ExecStart=/usr/bin/mkdir -p /run/rootfsbase
|
|
||||||
ExecStart=/usr/bin/mount -o loop,ro /run/archiso/bootmnt/fws/x86_64/airootfs.sfs /run/rootfsbase
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -1,126 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Lancé par startx (cf. /root/.zprofile), uniquement dans le live FWS.
|
# Lancé par startx (cf. /root/.zprofile)
|
||||||
if [ ! -d /run/archiso ]; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
xsetroot -solid "#1a1a2e"
|
xsetroot -solid "#1a1a2e"
|
||||||
|
|
||||||
# Openbox en arrière-plan : gestionnaire de fenêtres pour l'installateur.
|
|
||||||
openbox &
|
openbox &
|
||||||
_OB_PID=$!
|
sleep 1
|
||||||
|
exec calamares
|
||||||
# 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
|
|
||||||
# Chantier D : RÉCAPITULATIF matériel AVANT de lancer l'installateur.
|
|
||||||
# fws-hw-detect est la MÊME source de vérité que le %post du kickstart
|
|
||||||
# (mode --env) → ce que cet écran annonce = ce que l'install appliquera
|
|
||||||
# (drivers GPU, guest tools de l'hyperviseur, effacement des disques…).
|
|
||||||
# « Éteindre » est le seul moyen propre d'annuler : on ne rend jamais la
|
|
||||||
# main à startx (cf. plus bas), et liveinst n'a pas encore touché au disque.
|
|
||||||
# Tout est best-effort : sans script ou sans zenity, on installe comme avant.
|
|
||||||
if command -v fws-hw-detect >/dev/null 2>&1; then
|
|
||||||
fws-hw-detect --text >/tmp/fws-hw-summary.txt 2>/dev/null || true
|
|
||||||
if command -v zenity >/dev/null 2>&1 && [ -s /tmp/fws-hw-summary.txt ]; then
|
|
||||||
if ! zenity --text-info --title="FWS — Récapitulatif avant installation" \
|
|
||||||
--filename=/tmp/fws-hw-summary.txt \
|
|
||||||
--ok-label="Lancer l'installateur" --cancel-label="Éteindre" \
|
|
||||||
--width=800 --height=700 2>/dev/null; then
|
|
||||||
systemctl poweroff
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
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é).
|
|
||||||
# Log du %post chrooté (grub-install / mkinitcpio) = CE qui rend le disque
|
|
||||||
# bootable. Le kickstart en copie une version dans le LIVE
|
|
||||||
# (/tmp/fws-post-chroot.log, via un %post --nochroot final, cible encore
|
|
||||||
# montée → fiable). SECOURS si absent : on réactive le LVM (pvscan/vgscan
|
|
||||||
# rescannent les PV qu'Anaconda a désactivés) et on remonte le disque pour
|
|
||||||
# le lire.
|
|
||||||
if [ ! -s /tmp/fws-post-chroot.log ]; then
|
|
||||||
pvscan --cache >/dev/null 2>&1 || true
|
|
||||||
vgscan --mknodes >/dev/null 2>&1 || true
|
|
||||||
vgchange -ay >/dev/null 2>&1 || true
|
|
||||||
udevadm settle --timeout=10 >/dev/null 2>&1 || true
|
|
||||||
mkdir -p /run/fws-installed
|
|
||||||
for _dev in /dev/mapper/*-root /dev/mapper/* /dev/sd*[0-9] /dev/vd*[0-9] /dev/nvme*n*p*; do
|
|
||||||
[ -b "$_dev" ] || continue
|
|
||||||
mount -o ro "$_dev" /run/fws-installed 2>/dev/null || continue
|
|
||||||
if [ -f /run/fws-installed/var/log/fws-post.log ]; then
|
|
||||||
cp -f /run/fws-installed/var/log/fws-post.log /tmp/fws-post-chroot.log 2>/dev/null
|
|
||||||
umount /run/fws-installed 2>/dev/null || true
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
umount /run/fws-installed 2>/dev/null || true
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
DBG=/tmp/fws-debug.txt
|
|
||||||
{
|
|
||||||
echo "===== liveinst sorti (code $rc) — logs Anaconda ====="
|
|
||||||
echo
|
|
||||||
echo "########## sortie liveinst (stdout+stderr) ##########"
|
|
||||||
cat "$LIVEINST_LOG" 2>/dev/null
|
|
||||||
echo
|
|
||||||
echo "########## %post chrooté = grub-install / mkinitcpio ##########"
|
|
||||||
echo "########## >>> C'EST CE BLOC QUI DIT SI LE DISQUE VA BOOTER <<< ##########"
|
|
||||||
cat /tmp/fws-post-chroot.log 2>/dev/null || echo "(log introuvable)"
|
|
||||||
echo
|
|
||||||
echo "########## %post --nochroot (/tmp/fws-post-nochroot.log) ##########"
|
|
||||||
cat /tmp/fws-post-nochroot.log 2>/dev/null || echo "(absent)"
|
|
||||||
echo
|
|
||||||
echo "########## Récapitulatif matériel montré avant l'install ##########"
|
|
||||||
cat /tmp/fws-hw-summary.txt 2>/dev/null || echo "(absent)"
|
|
||||||
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
|
|
||||||
|
|
||||||
# Succès d'install = les DEUX étapes qui rendent le disque bootable ont
|
|
||||||
# réussi dans le %post : mkinitcpio (« Initcpio image generation successful »)
|
|
||||||
# ET grub-install (« Installation finished. No error reported. »). Si oui →
|
|
||||||
# on montre un écran de RÉUSSITE et on éteint (l'utilisateur retire l'ISO puis
|
|
||||||
# rallume sur FWS). Sinon → on affiche tous les logs de debug (comportement
|
|
||||||
# debug). Les lignes cosmétiques (load_policy, warnings GTK…) n'influent PAS
|
|
||||||
# sur cette détection : on ne regarde que le log du %post.
|
|
||||||
if grep -q 'Initcpio image generation successful' /tmp/fws-post-chroot.log 2>/dev/null \
|
|
||||||
&& grep -q 'Installation finished. No error reported.' /tmp/fws-post-chroot.log 2>/dev/null; then
|
|
||||||
if command -v zenity >/dev/null 2>&1; then
|
|
||||||
zenity --info --width=480 --title="FWS — installation réussie ✅" \
|
|
||||||
--text="<b>FWS est installé sur le disque.</b>\n\n1. Clique OK pour <b>éteindre</b> la machine.\n2. <b>Retire l'ISO</b> (lecteur CD/DVD).\n3. Rallume → FWS démarre." \
|
|
||||||
2>/dev/null
|
|
||||||
fi
|
|
||||||
systemctl poweroff
|
|
||||||
else
|
|
||||||
# Échec (ou install non terminée) : on montre les logs pour diagnostiquer.
|
|
||||||
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"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "[FWS] Anaconda absent de l'ISO — à builder (setup-aur.sh) + ajouter à packages.x86_64." >&2
|
|
||||||
exec openbox
|
|
||||||
fi
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
# fix for screen readers
|
|
||||||
if grep -Fqa 'accessibility=' /proc/cmdline &> /dev/null; then
|
|
||||||
setopt SINGLE_LINE_ZLE
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Provisionnement automatique archiso (param noyau script=) : LIVE uniquement.
|
|
||||||
# Sur le système installé /run/archiso n'existe pas, donc ce bloc ne s'exécute
|
|
||||||
# jamais hors du live — c'est la barrière qui empêche l'auto-script sur la cible.
|
|
||||||
if [[ -d /run/archiso ]]; then
|
|
||||||
~/.automated_script.sh
|
|
||||||
fi
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Démarrage automatique de Xorg uniquement dans le live FWS.
|
# Démarrage automatique de Xorg + Calamares sur tty1 (autologin root).
|
||||||
# Sur le système installé, /run/archiso n'existe pas, donc rien ne se lance.
|
# La session X exécute /root/.xinitrc qui lance Openbox + Calamares.
|
||||||
if [[ -d /run/archiso && "$(tty)" == "/dev/tty1" && -z "$DISPLAY" ]]; then
|
if [[ "$(tty)" == "/dev/tty1" && -z "$DISPLAY" ]]; then
|
||||||
exec startx -- vt1
|
exec startx -- vt1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# ============================================================================
|
|
||||||
# FWS — script de customisation de l'airootfs.
|
|
||||||
# Exécuté par mkarchiso DANS le chroot airootfs, APRÈS le pacstrap
|
|
||||||
# (cf. fws/mkarchiso _make_customize_airootfs), puis supprimé : il n'apparaît
|
|
||||||
# donc PAS dans l'ISO finale. C'est le seul endroit fiable pour lancer des
|
|
||||||
# commandes dans l'image (les hooks pacman ne tournent pas sous pacstrap).
|
|
||||||
# ============================================================================
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Génère les locales déclarées dans /etc/locale.gen. en_US.UTF-8 est REQUIS par
|
|
||||||
# Anaconda (ses modules DBus font setlocale(LC_ALL, "en_US.UTF-8") au démarrage,
|
|
||||||
# sinon « locale.Error: unsupported locale setting » → le module Boss plante).
|
|
||||||
# ~3 Mo générés, vs 222 Mo pour le paquet glibc-locales complet.
|
|
||||||
locale-gen
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
grub-editenv
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
grub-install
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
grub-mkconfig
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
grub-mkpasswd-pbkdf2
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
grub-set-default
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# FWS — stub no-op de load_policy.
|
|
||||||
#
|
|
||||||
# À sa fermeture, le module Runtime d'Anaconda appelle /usr/sbin/load_policy
|
|
||||||
# pour recharger la politique SELinux. Arch N'EST PAS SELinux → le vrai binaire
|
|
||||||
# n'existe pas → « AnacondaError: ... '/usr/sbin/load_policy' » dans un atexit
|
|
||||||
# callback (« Exception ignored »). C'est cosmétique (exit 0 quand même), mais
|
|
||||||
# ça affiche un traceback rouge. Ce stub renvoie 0 → plus aucune erreur.
|
|
||||||
# (/usr/sbin est un lien vers /usr/bin sur Arch usr-merge → ce fichier répond
|
|
||||||
# aussi pour /usr/sbin/load_policy.)
|
|
||||||
exit 0
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# FWS — stub no-op de setstatus.
|
|
||||||
#
|
|
||||||
# Le script Fedora « liveinst » appelle « setstatus » (ligne ~154) pour publier
|
|
||||||
# un statut SELinux/systemd. Cet outil n'existe pas sur Arch →
|
|
||||||
# « /usr/bin/liveinst: line 154: setstatus: command not found » (cosmétique,
|
|
||||||
# liveinst continue). Ce stub renvoie 0 → l'avertissement disparaît.
|
|
||||||
exit 0
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# ============================================================================
|
|
||||||
# fws-hw-detect — détection matériel FWS (hyperviseur + GPU).
|
|
||||||
#
|
|
||||||
# SOURCE UNIQUE de vérité, consommée par DEUX endroits :
|
|
||||||
# • l'écran « Récapitulatif avant installation » du live (--text, affiché
|
|
||||||
# par /root/.xinitrc via zenity juste avant de lancer liveinst) ;
|
|
||||||
# • le %post chrooté du kickstart Anaconda (--env), qui APPLIQUE :
|
|
||||||
# activation des guest tools du bon hyperviseur, purge des autres,
|
|
||||||
# installation des drivers GPU.
|
|
||||||
# → ce que l'écran ANNONCE = ce que l'install FERA (aucune divergence
|
|
||||||
# possible, la détection vit ici et nulle part ailleurs).
|
|
||||||
#
|
|
||||||
# Fonctionne dans le LIVE comme dans le CHROOT d'Anaconda : celui-ci
|
|
||||||
# bind-monte /sys et /proc du live → même matériel visible. Le script est
|
|
||||||
# livré par l'airootfs (/usr/local/bin) → recopié dans la cible par le
|
|
||||||
# payload liveimg → présent dans le chroot du %post. Aucune dépendance
|
|
||||||
# dure : lspci (pciutils) et ip (iproute2) ne servent qu'aux libellés
|
|
||||||
# humains de --text, avec repli si absents.
|
|
||||||
#
|
|
||||||
# Usage : fws-hw-detect --env lignes FWS_*='…' à eval par le kickstart
|
|
||||||
# fws-hw-detect --text récapitulatif humain en français (zenity)
|
|
||||||
# ============================================================================
|
|
||||||
set -u
|
|
||||||
MODE="${1:---text}"
|
|
||||||
|
|
||||||
# --- Hyperviseur --------------------------------------------------------------
|
|
||||||
# systemd-detect-virt lit CPUID/DMI → OK en chroot, sans systemd actif.
|
|
||||||
# ATTENTION : hors VM il AFFICHE « none » ET sort en code ≠ 0 → surtout pas de
|
|
||||||
# « || echo none » DANS le $() (on récolterait « none » en double).
|
|
||||||
VIRT="$(systemd-detect-virt 2>/dev/null | head -n1)"
|
|
||||||
[ -n "$VIRT" ] || VIRT=none
|
|
||||||
|
|
||||||
# Les guest tools des 3 hyperviseurs sont DÉJÀ dans l'image live
|
|
||||||
# (packages.x86_64 : open-vm-tools, virtualbox-guest-utils-nox,
|
|
||||||
# qemu-guest-agent) → activer un service marche HORS LIGNE ; on retire ceux
|
|
||||||
# des autres hyperviseurs (inutiles sur cette machine).
|
|
||||||
VIRT_SVC="" VIRT_RM="" VIRT_LABEL=""
|
|
||||||
case "$VIRT" in
|
|
||||||
vmware)
|
|
||||||
VIRT_LABEL="VMware"
|
|
||||||
VIRT_SVC="vmtoolsd.service vmware-vmblock-fuse.service"
|
|
||||||
VIRT_RM="virtualbox-guest-utils-nox qemu-guest-agent" ;;
|
|
||||||
oracle) # = VirtualBox (nom renvoyé par systemd-detect-virt)
|
|
||||||
VIRT_LABEL="VirtualBox"
|
|
||||||
VIRT_SVC="vboxservice.service"
|
|
||||||
VIRT_RM="open-vm-tools qemu-guest-agent" ;;
|
|
||||||
kvm|qemu)
|
|
||||||
VIRT_LABEL="QEMU/KVM"
|
|
||||||
VIRT_SVC="qemu-guest-agent.service"
|
|
||||||
VIRT_RM="open-vm-tools virtualbox-guest-utils-nox" ;;
|
|
||||||
none)
|
|
||||||
VIRT_LABEL="aucune (machine physique)"
|
|
||||||
VIRT_RM="open-vm-tools virtualbox-guest-utils-nox qemu-guest-agent" ;;
|
|
||||||
*) # Hyperviseur non géré (hyper-v…) : aucun de nos guest tools ne sert.
|
|
||||||
VIRT_LABEL="$VIRT (intégration non gérée)"
|
|
||||||
VIRT_RM="open-vm-tools virtualbox-guest-utils-nox qemu-guest-agent" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# --- GPU ----------------------------------------------------------------------
|
|
||||||
# Classe PCI 0x03xxxx = contrôleur d'affichage ; lecture DIRECTE de /sys, pas
|
|
||||||
# besoin de lspci. Vendors : 0x10de NVIDIA, 0x1002 AMD, 0x8086 Intel,
|
|
||||||
# 0x15ad VMware (le VMSVGA de VirtualBox porte AUSSI 0x15ad → couvert).
|
|
||||||
# QEMU virtio-gpu/QXL et VBoxVGA : modesetting + mesa (déjà tirés par
|
|
||||||
# xorg-server dans l'image) suffisent → rien à installer.
|
|
||||||
DRV_PKGS="" GPU_TEXT=""
|
|
||||||
for _dev in /sys/bus/pci/devices/*; do
|
|
||||||
case "$(cat "$_dev/class" 2>/dev/null)" in 0x03*) ;; *) continue ;; esac
|
|
||||||
_vendor="$(cat "$_dev/vendor" 2>/dev/null)"
|
|
||||||
_pkgs=""
|
|
||||||
case "$_vendor" in
|
|
||||||
# NVIDIA : le module des dépôts est bâti pour le NOYAU des dépôts →
|
|
||||||
# « linux » DOIT partir dans la même transaction pacman (le noyau
|
|
||||||
# installé est celui du live, plus vieux), sinon module ≠ noyau au
|
|
||||||
# 1er boot. Les chemins /boot/* sont stables → grub.cfg reste bon.
|
|
||||||
0x10de) _pkgs="linux nvidia nvidia-utils" ;;
|
|
||||||
0x1002) _pkgs="mesa vulkan-radeon xf86-video-amdgpu" ;;
|
|
||||||
0x8086) _pkgs="mesa vulkan-intel" ;;
|
|
||||||
0x15ad) _pkgs="mesa xf86-video-vmware" ;;
|
|
||||||
esac
|
|
||||||
# Libellé humain : lspci si dispo, sinon adresse PCI + vendor brut.
|
|
||||||
_name=""
|
|
||||||
if command -v lspci >/dev/null 2>&1; then
|
|
||||||
_name="$(lspci -s "${_dev##*/}" 2>/dev/null | head -n1 \
|
|
||||||
| cut -d: -f3- | sed 's/^ //')"
|
|
||||||
fi
|
|
||||||
[ -n "$_name" ] || _name="GPU PCI ${_dev##*/} (vendor $_vendor)"
|
|
||||||
if [ -n "$_pkgs" ]; then
|
|
||||||
GPU_TEXT="${GPU_TEXT} • ${_name}\n → paquets : ${_pkgs}\n"
|
|
||||||
DRV_PKGS="$DRV_PKGS $_pkgs"
|
|
||||||
else
|
|
||||||
GPU_TEXT="${GPU_TEXT} • ${_name}\n → rien à installer (modesetting + mesa, déjà dans l'image)\n"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
# Dédoublonnage (machine multi-GPU : « mesa » listé 2× ferait échouer pacman
|
|
||||||
# sur « duplicate target »).
|
|
||||||
if [ -n "$DRV_PKGS" ]; then
|
|
||||||
DRV_PKGS="$(printf '%s\n' $DRV_PKGS | sort -u | tr '\n' ' ')"
|
|
||||||
DRV_PKGS="${DRV_PKGS% }"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Mode machine : sortie shell pour le kickstart ----------------------------
|
|
||||||
if [ "$MODE" = "--env" ]; then
|
|
||||||
printf "FWS_VIRT='%s'\n" "$VIRT"
|
|
||||||
printf "FWS_VIRT_SVC='%s'\n" "$VIRT_SVC"
|
|
||||||
printf "FWS_VIRT_RM='%s'\n" "$VIRT_RM"
|
|
||||||
printf "FWS_DRV_PKGS='%s'\n" "$DRV_PKGS"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Mode humain : récapitulatif --text (zenity, avant liveinst) ---------------
|
|
||||||
CPU="$(awk -F': +' '/^model name/{print $2; exit}' /proc/cpuinfo)"
|
|
||||||
[ -n "$CPU" ] || CPU="inconnu"
|
|
||||||
case "$(awk -F': +' '/^vendor_id/{print $2; exit}' /proc/cpuinfo)" in
|
|
||||||
GenuineIntel) UCODE="intel-ucode" ;;
|
|
||||||
AuthenticAMD) UCODE="amd-ucode" ;;
|
|
||||||
*) UCODE="" ;;
|
|
||||||
esac
|
|
||||||
RAM="$(awk '/^MemTotal/{printf "%.1f Gio", $2/1048576}' /proc/meminfo)"
|
|
||||||
if [ -d /sys/firmware/efi ]; then
|
|
||||||
BOOT="UEFI — GRUB x86_64-efi + entrée de secours EFI/BOOT/BOOTX64.EFI"
|
|
||||||
else
|
|
||||||
BOOT="BIOS hérité — GRUB i386-pc, table de partitions MBR forcée"
|
|
||||||
fi
|
|
||||||
if command -v ip >/dev/null 2>&1 && ip route get 1.1.1.1 >/dev/null 2>&1; then
|
|
||||||
NET="disponible ✔"
|
|
||||||
else
|
|
||||||
NET="INDISPONIBLE ✖ — drivers GPU et bureau ne s'installeront PAS (rattrapable au 1er boot)"
|
|
||||||
fi
|
|
||||||
# Type « disk » uniquement (exclut lecteur ISO sr0/loop). La clé USB du live,
|
|
||||||
# elle, EST un disque → il est juste qu'elle apparaisse sous l'avertissement
|
|
||||||
# d'effacement (clearpart --all du kickstart efface bien TOUS les disques).
|
|
||||||
DISKS="$(lsblk -dno NAME,SIZE,MODEL,TYPE 2>/dev/null \
|
|
||||||
| awk '$NF=="disk"{NF--; print " • " $0}')"
|
|
||||||
[ -n "$DISKS" ] || DISKS=" (aucun disque détecté)"
|
|
||||||
[ -n "$GPU_TEXT" ] || GPU_TEXT=" (aucune carte graphique détectée)\n"
|
|
||||||
|
|
||||||
printf '%b' \
|
|
||||||
"══════════════════════════════════════════════════════════
|
|
||||||
FWS — RÉCAPITULATIF AVANT INSTALLATION
|
|
||||||
══════════════════════════════════════════════════════════
|
|
||||||
|
|
||||||
MACHINE
|
|
||||||
• Démarrage : ${BOOT}
|
|
||||||
• Virtualisation : ${VIRT_LABEL}
|
|
||||||
• Processeur : ${CPU}"
|
|
||||||
[ -n "$UCODE" ] && printf '%b' "
|
|
||||||
• Microcode : ${UCODE} — déjà intégré à l'image, rien à faire"
|
|
||||||
printf '%b' "
|
|
||||||
• Mémoire : ${RAM}
|
|
||||||
• Réseau : ${NET}
|
|
||||||
|
|
||||||
DISQUES DÉTECTÉS
|
|
||||||
⚠ Par défaut, TOUS les disques ci-dessous seront ENTIÈREMENT
|
|
||||||
EFFACÉS (partitionnement automatique). Le partitionnement
|
|
||||||
manuel reste possible dans l'installateur.
|
|
||||||
${DISKS}
|
|
||||||
|
|
||||||
CARTES GRAPHIQUES → drivers installés AUTOMATIQUEMENT en fin d'install
|
|
||||||
${GPU_TEXT}
|
|
||||||
INTÉGRATION HYPERVISEUR (automatique, fonctionne hors ligne)
|
|
||||||
• Services activés : ${VIRT_SVC:-aucun}
|
|
||||||
• Guest tools retirés (inutiles) : ${VIRT_RM:-aucun}
|
|
||||||
|
|
||||||
DÉROULEMENT DE L'INSTALLATION
|
|
||||||
1. Réglages dans Anaconda : langue, clavier, fuseau, disque, utilisateur
|
|
||||||
2. Copie du système live FWS sur le disque (payload liveimg)
|
|
||||||
3. Noyau + initramfs régénérés (mkinitcpio), GRUB installé
|
|
||||||
4. Drivers GPU + intégration hyperviseur appliqués (voir ci-dessus)
|
|
||||||
5. Bureau choisi installé (réseau requis)
|
|
||||||
|
|
||||||
« Lancer l'installateur » pour continuer — « Éteindre » pour annuler.
|
|
||||||
"
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
# FWS — paquets de l'ISO live
|
# FWS — paquets de l'ISO live
|
||||||
# Objectif : système live bootable + installateur Anaconda
|
# Objectif : système live bootable + installeur Calamares
|
||||||
# (migration depuis Calamares) + jeu minimal d'outils de rescue.
|
# fonctionnel + jeu minimal d'outils de rescue.
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
# --- Base système ---
|
# --- Base système ---
|
||||||
@@ -26,7 +26,6 @@ memtest86+
|
|||||||
memtest86+-efi
|
memtest86+-efi
|
||||||
|
|
||||||
# --- Filesystems ---
|
# --- Filesystems ---
|
||||||
squashfs-tools
|
|
||||||
btrfs-progs
|
btrfs-progs
|
||||||
e2fsprogs
|
e2fsprogs
|
||||||
exfatprogs
|
exfatprogs
|
||||||
@@ -61,7 +60,6 @@ wget
|
|||||||
zsh
|
zsh
|
||||||
grml-zsh-config
|
grml-zsh-config
|
||||||
bash
|
bash
|
||||||
zenity
|
|
||||||
nano
|
nano
|
||||||
vim
|
vim
|
||||||
less
|
less
|
||||||
@@ -86,15 +84,21 @@ htop
|
|||||||
alsa-utils
|
alsa-utils
|
||||||
sof-firmware
|
sof-firmware
|
||||||
|
|
||||||
# --- Xorg + Openbox (session graphique de l'installateur) ---
|
# --- Xorg + Openbox (pour Calamares) ---
|
||||||
xorg-server
|
xorg-server
|
||||||
xorg-xinit
|
xorg-xinit
|
||||||
xorg-xrandr
|
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
|
# --- Calamares (fournis par fws-local) ---
|
||||||
|
calamares
|
||||||
|
kpmcore
|
||||||
|
qt5-base
|
||||||
|
qt5-svg
|
||||||
|
qt5-webengine
|
||||||
|
qt6-base
|
||||||
|
|
||||||
# --- Agents VM (pratique pour tester l'ISO) ---
|
# --- Agents VM (pratique pour tester l'ISO) ---
|
||||||
qemu-guest-agent
|
qemu-guest-agent
|
||||||
@@ -103,17 +107,3 @@ 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
|
|
||||||
# Module 'cgi' (retiré de Python 3.13, PEP 594) requis par python-requests-ftp
|
|
||||||
# que pyanaconda/core/util.py importe en dur. python-legacy-cgi le réintroduit.
|
|
||||||
python-legacy-cgi
|
|
||||||
# Module 'crypt'/'crypt_r' (retiré de Python 3.13, PEP 594) requis par
|
|
||||||
# pyanaconda/core/users.py (hash des mots de passe). Paquet maison (fws-local).
|
|
||||||
python-crypt_r
|
|
||||||
# Namespace GI 'OSTree-1.0' : pyanaconda/rescue.py importe le payload rpm_ostree
|
|
||||||
# (inconditionnellement, même si FWS utilise liveimg) → fourni par 'ostree'.
|
|
||||||
ostree
|
|
||||||
|
|||||||
@@ -14,17 +14,6 @@ pacman_conf="pacman.conf"
|
|||||||
airootfs_image_type="squashfs"
|
airootfs_image_type="squashfs"
|
||||||
airootfs_image_tool_options=('-comp' 'xz' '-Xbcj' 'x86' '-b' '1M' '-Xdict-size' '1M')
|
airootfs_image_tool_options=('-comp' 'xz' '-Xbcj' 'x86' '-b' '1M' '-Xdict-size' '1M')
|
||||||
bootstrap_tarball_compression=(xz -9e)
|
bootstrap_tarball_compression=(xz -9e)
|
||||||
# NB : ce profiledef.sh ÉCRASE celui de configs/releng/ lors de la fusion du
|
|
||||||
# build (baseline prioritaire). Il doit donc être un SUR-ENSEMBLE des
|
|
||||||
# permissions de releng, sinon les helpers live perdent leur bit exécutable
|
|
||||||
# (ils sont versionnés en 0644) et /root/.gnupg perd son 0700 (gpg refuse).
|
|
||||||
file_permissions=(
|
file_permissions=(
|
||||||
["/etc/shadow"]="0:0:400"
|
["/etc/shadow"]="0:0:400"
|
||||||
["/root"]="0:0:750"
|
|
||||||
["/root/.automated_script.sh"]="0:0:755"
|
|
||||||
["/root/.gnupg"]="0:0:700"
|
|
||||||
["/usr/local/bin/choose-mirror"]="0:0:755"
|
|
||||||
["/usr/local/bin/fws-hw-detect"]="0:0:755"
|
|
||||||
["/usr/local/bin/Installation_guide"]="0:0:755"
|
|
||||||
["/usr/local/bin/livecd-sound"]="0:0:755"
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — branding.desc
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
componentName: fws
|
||||||
|
|
||||||
|
strings:
|
||||||
|
productName: "FWS Linux"
|
||||||
|
shortProductName: "FWS"
|
||||||
|
version: "1.0"
|
||||||
|
shortVersion: "1.0"
|
||||||
|
versionedName: "FWS Linux 1.0"
|
||||||
|
shortVersionedName: "FWS 1.0"
|
||||||
|
bootloaderEntryName: "FWS Linux"
|
||||||
|
productUrl: "https://fws-linux.org"
|
||||||
|
supportUrl: "https://fws-linux.org/support"
|
||||||
|
releaseNotesUrl: "https://fws-linux.org/release-notes"
|
||||||
|
donateUrl: "https://fws-linux.org/donate"
|
||||||
|
|
||||||
|
images:
|
||||||
|
productLogo: "logo.png"
|
||||||
|
productIcon: "logo.png"
|
||||||
|
productWelcome: "logo.png"
|
||||||
|
|
||||||
|
slideshow: "slideshow.qml"
|
||||||
|
slideshowAPI: 2
|
||||||
|
|
||||||
|
style:
|
||||||
|
# Couleurs de la sidebar
|
||||||
|
sidebarBackground: "#1a1a2e"
|
||||||
|
sidebarText: "#e0e0e0"
|
||||||
|
sidebarTextHighlight: "#00d4ff"
|
||||||
|
sidebarSelect: "#16213e"
|
||||||
|
|
||||||
|
# Couleurs générales
|
||||||
|
backgroundColor: "#0f3460"
|
||||||
|
highlightedTextColor: "#ffffff"
|
||||||
|
genericTextColor: "#e0e0e0"
|
||||||
|
errorTextColor: "#ff6b6b"
|
||||||
|
warningTextColor: "#ffa500"
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,138 @@
|
|||||||
|
/* ============================================================
|
||||||
|
FWS Linux — slideshow.qml
|
||||||
|
Affiché pendant l'installation
|
||||||
|
============================================================ */
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
import calamares.slideshow 1.0
|
||||||
|
|
||||||
|
Presentation {
|
||||||
|
id: presentation
|
||||||
|
|
||||||
|
function nextSlide() {
|
||||||
|
if (presentation.currentSlide < slides.count - 1)
|
||||||
|
presentation.currentSlide++
|
||||||
|
else
|
||||||
|
presentation.currentSlide = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: timer
|
||||||
|
interval: 4000
|
||||||
|
repeat: true
|
||||||
|
running: true
|
||||||
|
onTriggered: nextSlide()
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#1a1a2e"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "🚀 Bienvenue sur FWS Linux"
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Un système rapide, léger et puissant."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#16213e"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "⚡ Basé sur Arch Linux"
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Accès à l'AUR et aux derniers paquets."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#0f3460"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "🛡️ Sécurité & Stabilité"
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "FWS est conçu pour être robuste et fiable."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Slide {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: parent
|
||||||
|
color: "#1a1a2e"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 20
|
||||||
|
|
||||||
|
Text {
|
||||||
|
text: "✅ Installation en cours..."
|
||||||
|
color: "#00d4ff"
|
||||||
|
font.pixelSize: 32
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
Text {
|
||||||
|
text: "Merci de patienter, FWS s'installe sur votre machine."
|
||||||
|
color: "#e0e0e0"
|
||||||
|
font.pixelSize: 18
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/bootloader.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Bootloader à utiliser
|
||||||
|
# Options: grub, systemd-boot, refind
|
||||||
|
efiBootLoader: "grub"
|
||||||
|
|
||||||
|
# Paramètres GRUB
|
||||||
|
grubInstall: "grub-install"
|
||||||
|
grubMkconfig: "grub-mkconfig"
|
||||||
|
grubCfg: "/boot/grub/grub.cfg"
|
||||||
|
|
||||||
|
# Chemin EFI
|
||||||
|
efiDirectory: "/boot/efi"
|
||||||
|
|
||||||
|
# ID pour l'entrée EFI
|
||||||
|
efiBootEntryName: "FWS Linux"
|
||||||
|
|
||||||
|
# Menu GRUB
|
||||||
|
grubTimeout: 5
|
||||||
|
grubQuiet: false
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/finished.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Redémarrer automatiquement après l'installation
|
||||||
|
restartNowEnabled: true
|
||||||
|
restartNowChecked: false
|
||||||
|
restartNowCommand: "systemctl reboot"
|
||||||
|
|
||||||
|
# Message de fin affiché à l'utilisateur
|
||||||
|
notifyOnFinished: true
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/grubcfg.conf
|
||||||
|
# Paramètres passés à grub-mkconfig
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Nom de l'entrée dans le menu GRUB
|
||||||
|
defaultEntry: "FWS Linux"
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
GRUB_ENABLE_CRYPTODISK: true
|
||||||
|
|
||||||
|
# Paramètres kernel supplémentaires
|
||||||
|
kernel_params: ""
|
||||||
|
|
||||||
|
# Désactiver l'écran splash (mettre false pour debug)
|
||||||
|
splash: true
|
||||||
|
|
||||||
|
# Thème GRUB (laisse vide pour le thème par défaut)
|
||||||
|
theme: ""
|
||||||
|
|
||||||
|
# Timeout du menu GRUB (en secondes)
|
||||||
|
timeout: 5
|
||||||
|
|
||||||
|
# Activer les entrées des autres OS détectés (os-prober)
|
||||||
|
enable_osprober: true
|
||||||
|
|
||||||
|
# Écrire /etc/default/grub
|
||||||
|
writeEtcDefaultGrub: true
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/initcpiocfg.conf
|
||||||
|
# Configure /etc/mkinitcpio.conf sur le système cible
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Modules à inclure dans le initramfs
|
||||||
|
modules: []
|
||||||
|
|
||||||
|
# Binaires supplémentaires
|
||||||
|
binaries: []
|
||||||
|
|
||||||
|
# Fichiers supplémentaires
|
||||||
|
files: []
|
||||||
|
|
||||||
|
# Hooks — ordre important !
|
||||||
|
hooks:
|
||||||
|
- base
|
||||||
|
- udev
|
||||||
|
- autodetect
|
||||||
|
- modconf
|
||||||
|
- block
|
||||||
|
- filesystems
|
||||||
|
- keyboard
|
||||||
|
- fsck
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/keyboard.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Disposition clavier par défaut
|
||||||
|
xorgConfigFileName: "/etc/X11/xorg.conf.d/00-keyboard.conf"
|
||||||
|
|
||||||
|
# Clavier par défaut
|
||||||
|
keyboardLayout: "fr"
|
||||||
|
keyboardVariant: ""
|
||||||
|
keyboardModel: "pc105"
|
||||||
|
|
||||||
|
# Permettre à l'utilisateur de choisir son clavier
|
||||||
|
guiTimezone: true
|
||||||
|
|
||||||
|
# Conversions vc (console virtuelle) → X11
|
||||||
|
convertedKeymapPath: "/lib/kbd/keymaps/xkb"
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/locale.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Région/timezone par défaut
|
||||||
|
region: "Europe"
|
||||||
|
zone: "Paris"
|
||||||
|
|
||||||
|
# Langue par défaut
|
||||||
|
locale: "fr_FR.UTF-8"
|
||||||
|
|
||||||
|
# Format des nombres, dates, monnaie
|
||||||
|
# Laisse vide pour utiliser la même valeur que locale
|
||||||
|
localeGenPath: "/etc/locale.gen"
|
||||||
|
|
||||||
|
# Timezone GeoIP (détection auto basée sur l'IP)
|
||||||
|
geoipStyle: "json"
|
||||||
|
geoipUrl: "https://geoip.kde.org/v1/calamares"
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/packages.conf
|
||||||
|
# Paquets installés via pacman pendant l'installation
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Gestionnaire de paquets
|
||||||
|
backend: pacman
|
||||||
|
|
||||||
|
# Ne pas mettre à jour la base de données pacman (déjà dans le live)
|
||||||
|
update_db: false
|
||||||
|
|
||||||
|
operations:
|
||||||
|
- install:
|
||||||
|
# Base système
|
||||||
|
- base
|
||||||
|
- base-devel
|
||||||
|
- linux
|
||||||
|
- linux-headers
|
||||||
|
- linux-firmware
|
||||||
|
|
||||||
|
# Bootloader
|
||||||
|
- grub
|
||||||
|
- efibootmgr
|
||||||
|
- os-prober
|
||||||
|
- mkinitcpio-openswap
|
||||||
|
|
||||||
|
# Réseau
|
||||||
|
- networkmanager
|
||||||
|
- network-manager-applet
|
||||||
|
- wpa_supplicant
|
||||||
|
- dhcpcd
|
||||||
|
|
||||||
|
# Outils essentiels
|
||||||
|
- sudo
|
||||||
|
- nano
|
||||||
|
- vim
|
||||||
|
- git
|
||||||
|
- curl
|
||||||
|
- wget
|
||||||
|
- htop
|
||||||
|
- bash-completion
|
||||||
|
|
||||||
|
# Locale & timezone
|
||||||
|
- tzdata
|
||||||
|
|
||||||
|
# Optionnel — retire ce qui ne correspond pas à FWS
|
||||||
|
- pipewire
|
||||||
|
- pipewire-pulse
|
||||||
|
- wireplumber
|
||||||
|
|
||||||
|
# Paquets à retirer du système live (pas nécessaires après install)
|
||||||
|
- remove:
|
||||||
|
- calamares
|
||||||
|
- calamares-config
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/partition.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Backend de partitionnement
|
||||||
|
backend: kpmcore
|
||||||
|
|
||||||
|
# Autoriser le partitionnement manuel
|
||||||
|
allowManualPartitioning: true
|
||||||
|
|
||||||
|
# Schéma de partition par défaut (pour install automatique)
|
||||||
|
# Options: mbr, gpt
|
||||||
|
defaultPartitionTableType: gpt
|
||||||
|
|
||||||
|
# Swap
|
||||||
|
# Options: none, small, suspend, file
|
||||||
|
defaultSwapType: small
|
||||||
|
|
||||||
|
# Taille minimale des partitions en MiB
|
||||||
|
defaultFileSystemType: "ext4"
|
||||||
|
|
||||||
|
# Partitions EFI (pour UEFI)
|
||||||
|
efiSystemPartition: "/boot/efi"
|
||||||
|
efiSystemPartitionSize: 300
|
||||||
|
|
||||||
|
# Point de montage racine
|
||||||
|
requiredStorage: 20.0
|
||||||
|
|
||||||
|
# Systèmes de fichiers proposés à l'utilisateur
|
||||||
|
availableFileSystemTypes: ["ext4", "btrfs", "xfs", "f2fs"]
|
||||||
|
|
||||||
|
# Chiffrement
|
||||||
|
# Activer le chiffrement LUKS
|
||||||
|
allowZfs: true
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/services-systemd.conf
|
||||||
|
# Services systemd activés sur le système installé
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
services:
|
||||||
|
# Réseau
|
||||||
|
- name: NetworkManager
|
||||||
|
mandatory: true
|
||||||
|
|
||||||
|
# DHCP
|
||||||
|
- name: dhcpcd
|
||||||
|
mandatory: false
|
||||||
|
|
||||||
|
# Heure synchronisée
|
||||||
|
- name: systemd-timesyncd
|
||||||
|
mandatory: true
|
||||||
|
|
||||||
|
# Ajoute ici tes services FWS supplémentaires
|
||||||
|
# - name: mon-service-fws
|
||||||
|
# mandatory: false
|
||||||
|
|
||||||
|
targets: []
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/unpackfs.conf
|
||||||
|
# Copie le système live vers le disque cible
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
unpack:
|
||||||
|
# Source : le squashfs de l'ISO FWS
|
||||||
|
# Adapte "FWS" selon la valeur de iso_name dans profiledef.sh
|
||||||
|
- source: /run/archiso/bootmnt/FWS/x86_64/airootfs.sfs
|
||||||
|
sourcefs: squashfs
|
||||||
|
destination: ""
|
||||||
|
|
||||||
|
# Alternative si tu utilises erofs au lieu de squashfs :
|
||||||
|
# - source: /run/archiso/bootmnt/FWS/x86_64/airootfs.erofs
|
||||||
|
# sourcefs: erofs
|
||||||
|
# destination: ""
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/users.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Nom d'hôte par défaut
|
||||||
|
defaultGroups:
|
||||||
|
- users
|
||||||
|
- lp
|
||||||
|
- video
|
||||||
|
- network
|
||||||
|
- storage
|
||||||
|
- wheel
|
||||||
|
- audio
|
||||||
|
- optical
|
||||||
|
- scanner
|
||||||
|
- power
|
||||||
|
|
||||||
|
# Autoriser le login automatique
|
||||||
|
autologinGroup: autologin
|
||||||
|
|
||||||
|
# Sudoers — donne les droits sudo au groupe wheel
|
||||||
|
sudoersGroup: wheel
|
||||||
|
|
||||||
|
# Shell par défaut pour les nouveaux utilisateurs
|
||||||
|
userShell: /bin/bash
|
||||||
|
|
||||||
|
# Hostname par défaut
|
||||||
|
hostname:
|
||||||
|
location: EtcFile
|
||||||
|
template: "fws-${first}"
|
||||||
|
|
||||||
|
# Règles pour les mots de passe
|
||||||
|
passwordRequirements:
|
||||||
|
minLength: 6
|
||||||
|
maxLength: -1
|
||||||
|
nonempty: true
|
||||||
|
|
||||||
|
# Permet de définir le même mot de passe pour root et user
|
||||||
|
allowWeakPasswords: false
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — modules/welcome.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Afficher les conditions requises avant l'installation
|
||||||
|
showSupportUrl: true
|
||||||
|
showKnownIssuesUrl: true
|
||||||
|
showReleaseNotesUrl: false
|
||||||
|
showDonateUrl: false
|
||||||
|
|
||||||
|
# Vérifications système requises
|
||||||
|
requirements:
|
||||||
|
# Espace disque minimum en MiB
|
||||||
|
requiredStorage: 20.0
|
||||||
|
|
||||||
|
# RAM minimum en MiB
|
||||||
|
requiredRam: 2.0
|
||||||
|
|
||||||
|
# Vérifier la connexion internet (optionnel)
|
||||||
|
checkInternet: false
|
||||||
|
|
||||||
|
# Vérifier si on tourne en live (pas déjà installé)
|
||||||
|
checkForRoot: true
|
||||||
|
|
||||||
|
# Vérifier l'alimentation (AC power)
|
||||||
|
checkPower: true
|
||||||
|
|
||||||
|
# Ne bloque pas l'install si pas connecté
|
||||||
|
internetCheckUrl: "https://cloudflare.com"
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# ============================================================
|
||||||
|
# FWS Linux — Calamares settings.conf
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
modules-search: [ local, /usr/lib/calamares/modules ]
|
||||||
|
|
||||||
|
sequence:
|
||||||
|
- show:
|
||||||
|
- welcome
|
||||||
|
- locale
|
||||||
|
- keyboard
|
||||||
|
- partition
|
||||||
|
- users
|
||||||
|
- summary
|
||||||
|
|
||||||
|
- exec:
|
||||||
|
- partition
|
||||||
|
- mount
|
||||||
|
- luksbootkeyfile
|
||||||
|
- luksopenswaphookcfg
|
||||||
|
- unpackfs
|
||||||
|
- machineid
|
||||||
|
- fstab
|
||||||
|
- locale
|
||||||
|
- keyboard
|
||||||
|
- localecfg
|
||||||
|
- users
|
||||||
|
- networkcfg
|
||||||
|
- hwclock
|
||||||
|
- services-systemd
|
||||||
|
- packages
|
||||||
|
- initcpiocfg
|
||||||
|
- initcpio
|
||||||
|
- grubcfg
|
||||||
|
- bootloader
|
||||||
|
- umount
|
||||||
|
|
||||||
|
- show:
|
||||||
|
- finished
|
||||||
|
|
||||||
|
branding: fws
|
||||||
|
|
||||||
|
# Demande confirmation avant d'installer
|
||||||
|
prompt-install: true
|
||||||
|
|
||||||
|
# Ne pas chroot (laisser à false pour une install normale)
|
||||||
|
dont-chroot: false
|
||||||
|
|
||||||
|
# Désactive les vérifications réseau au démarrage
|
||||||
|
disable-cancel: false
|
||||||
|
disable-cancel-during-exec: true
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
Welcome to [38;2;23;147;209mFWS[0m live media.
|
To install [38;2;23;147;209mFWS[0m follow the installation guide:
|
||||||
|
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 [35miwctl[0m utility.
|
For Wi-Fi, authenticate to the wireless network using the [35miwctl[0m utility.
|
||||||
For mobile broadband (WWAN) modems, connect with the [35mmmcli[0m utility.
|
For mobile broadband (WWAN) modems, connect with the [35mmmcli[0m 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 [35mInstallation_guide[0m.
|
||||||
|
|
||||||
|
[41m [41m [41m [40m [44m [40m [41m [46m [45m [41m [46m [43m [41m [44m [45m [40m [44m [40m [41m [44m [41m [41m [46m [42m [41m [44m [43m [41m [45m [40m [40m [44m [40m [41m [44m [42m [41m [46m [44m [41m [46m [47m [0m
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
# remove from airootfs!
|
|
||||||
# Branding FWS : le paquet « filesystem » d'Arch installe /usr/lib/os-release
|
|
||||||
# avec NAME="Arch Linux". On le remplace par la version FWS APRÈS l'installation
|
|
||||||
# des paquets (PostTransaction), donc sans conflit pacman « exists in filesystem »
|
|
||||||
# (poser le fichier dans l'overlay déclencherait ce conflit, cf. ordre overlay→
|
|
||||||
# pacstrap dans mkarchiso). /etc/os-release reste un lien vers ce fichier.
|
|
||||||
# Ce hook ne sert qu'au build : zzzz99-remove-custom-hooks le retire du système.
|
|
||||||
|
|
||||||
[Trigger]
|
|
||||||
Operation = Install
|
|
||||||
Operation = Upgrade
|
|
||||||
Type = Package
|
|
||||||
Target = filesystem
|
|
||||||
|
|
||||||
[Action]
|
|
||||||
Description = Applying FWS branding to /usr/lib/os-release...
|
|
||||||
When = PostTransaction
|
|
||||||
Depends = filesystem
|
|
||||||
Depends = coreutils
|
|
||||||
Exec = /usr/bin/install -Dm0644 /usr/local/share/fws/os-release /usr/lib/os-release
|
|
||||||
@@ -1,9 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# NB : ce fichier est SOURCÉ par le shell de login (zsh sur le live), pas exécuté
|
status=$?
|
||||||
# → le shebang est ignoré. En zsh « status » est une variable spéciale EN LECTURE
|
if [ "${status}" -eq 0 ]; then
|
||||||
# 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
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Calamares Installer
|
||||||
|
After=display-manager.service
|
||||||
|
Requires=display-manager.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/bin/calamares
|
||||||
|
Restart=on-failure
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=graphical.target
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# FWS Linux — fws-installer
|
||||||
|
# Script de lancement de Calamares
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Vérifie que Calamares est installé
|
||||||
|
if ! command -v calamares &>/dev/null; then
|
||||||
|
echo "ERREUR : calamares n'est pas installé."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Vérifie qu'on tourne bien en live
|
||||||
|
if [ ! -d /run/archiso ]; then
|
||||||
|
echo "ATTENTION : Ce script doit être lancé depuis le live FWS."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Lance Calamares avec les droits root
|
||||||
|
# -D6 active les logs de debug (retirer en production)
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
if command -v sudo >/dev/null 2>&1; then
|
||||||
|
exec sudo -E calamares "$@"
|
||||||
|
elif command -v pkexec >/dev/null 2>&1; then
|
||||||
|
exec pkexec calamares "$@"
|
||||||
|
else
|
||||||
|
echo "ERREUR : Impossible de lancer Calamares en tant que root (sudo/pkexec non trouvés)."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exec calamares "$@"
|
||||||
|
fi
|
||||||
Executable → Regular
Executable → Regular
Executable → Regular
@@ -1,11 +0,0 @@
|
|||||||
NAME="FWS"
|
|
||||||
PRETTY_NAME="FWS Linux"
|
|
||||||
ID=fws
|
|
||||||
ID_LIKE=arch
|
|
||||||
BUILD_ID=rolling
|
|
||||||
VERSION_ID="1.0.0"
|
|
||||||
ANSI_COLOR="38;2;23;147;209"
|
|
||||||
HOME_URL="https://github.com/You-re-like-Windows-a-bitch/fws"
|
|
||||||
SUPPORT_URL="https://github.com/You-re-like-Windows-a-bitch/fws/issues"
|
|
||||||
BUG_REPORT_URL="https://github.com/You-re-like-Windows-a-bitch/fws/issues"
|
|
||||||
LOGO=fws
|
|
||||||
@@ -1,284 +0,0 @@
|
|||||||
# ============================================================================
|
|
||||||
# FWS — interactive-defaults.ks
|
|
||||||
#
|
|
||||||
# Kickstart de base, lu AUTOMATIQUEMENT par Anaconda quand l'install est
|
|
||||||
# lancée en mode interactif (chemin fixe codé en dur dans Anaconda :
|
|
||||||
# /usr/share/anaconda/interactive-defaults.ks). Aucun inst.ks= n'est requis.
|
|
||||||
#
|
|
||||||
# RÔLE : empêcher Anaconda d'installer Fedora.
|
|
||||||
# ----------------------------------------------------------------------------
|
|
||||||
# Sans payload défini, Anaconda utilise DNF → des RPM depuis les dépôts
|
|
||||||
# Fedora = il installe Fedora. Anaconda n'a AUCUN backend pacman. La seule
|
|
||||||
# façon de poser FWS/Arch est le payload « liveimg » : il recopie une image
|
|
||||||
# de système de fichiers (ici le squashfs du live = FWS) sur le disque, puis
|
|
||||||
# on finalise nous-mêmes (grub, mkinitcpio, bureau) en %post. C'est le modèle
|
|
||||||
# « Sabayon » : le système installé EST une copie du live.
|
|
||||||
#
|
|
||||||
# L'utilisateur garde la main dans le GUI sur tout ce qui N'EST PAS fixé ici :
|
|
||||||
# partitionnement, fuseau, clavier, langue, création d'utilisateur, mot de
|
|
||||||
# passe root, etc.
|
|
||||||
# ============================================================================
|
|
||||||
|
|
||||||
# --- Source d'installation : l'image du live (FWS), surtout pas Fedora -------
|
|
||||||
# Squashfs archiso sur le média booté :
|
|
||||||
# /run/archiso/bootmnt/<install_dir>/<arch>/airootfs.sfs
|
|
||||||
# install_dir=fws, arch=x86_64, airootfs_image_type=squashfs (cf. profiledef.sh).
|
|
||||||
# Anaconda loop-monte ce .sfs et rsync son contenu vers la cible.
|
|
||||||
#
|
|
||||||
# ⚠ À VALIDER sur ISO réelle : certaines versions d'Anaconda attendent une
|
|
||||||
# structure « LiveOS/rootfs.img » à l'intérieur du squashfs (format Fedora
|
|
||||||
# Live) et non un squashfs « plat » comme celui d'archiso. Si l'install
|
|
||||||
# échoue à monter la source, basculer sur un tarball de rootfs dédié :
|
|
||||||
# liveimg --url=file:///run/archiso/bootmnt/fws/x86_64/fws-rootfs.tar.gz
|
|
||||||
# (un build-rootfs.sh produirait alors ce tar via pacstrap).
|
|
||||||
liveimg --url=file:///run/archiso/bootmnt/fws/x86_64/airootfs.sfs
|
|
||||||
|
|
||||||
# --- Disque : repartir d'un disque PROPRE, même s'il a déjà servi ------------
|
|
||||||
# Sans ça, une réinstallation sur un disque déjà partitionné (typiquement une
|
|
||||||
# install FWS précédente : partitions + VG LVM « anaconda_archiso ») pose deux
|
|
||||||
# problèmes : le partitionnement auto n'a plus d'espace libre, et blivet
|
|
||||||
# rescanne/auto-active un LVM existant au boot du live → l'installateur se
|
|
||||||
# comporte mal voire plante au 2e passage (alors qu'un disque vierge passe).
|
|
||||||
# zerombr : réinitialise toute table de partitions invalide
|
|
||||||
# (répond « oui » au lieu de bloquer sur un disque
|
|
||||||
# non reconnu).
|
|
||||||
# clearpart --all : supprime TOUTES les partitions de TOUS les disques.
|
|
||||||
# --initlabel : réécrit une étiquette de disque neuve.
|
|
||||||
# --disklabel=msdos : force une table MBR (et non GPT). CRUCIAL en BIOS :
|
|
||||||
# en BIOS+GPT, GRUB i386-pc exige une partition « BIOS
|
|
||||||
# Boot » (~1 Mo, type EF02) pour embarquer core.img,
|
|
||||||
# qu'Anaconda NE crée PAS avec « bootloader --disabled
|
|
||||||
# » → « this GPT partition label contains no BIOS Boot
|
|
||||||
# Partition; embedding won't be possible » →
|
|
||||||
# grub-install échoue. En MBR, core.img se loge dans
|
|
||||||
# l'espace post-MBR, aucune partition dédiée requise.
|
|
||||||
# ⚠ Ce choix vise le BIOS (cas VMware actuel). Pour l'UEFI il faudra du GPT
|
|
||||||
# (+ ESP) — à rendre dépendant du firmware (%pre) le jour où on cible l'UEFI.
|
|
||||||
# L'utilisateur garde la main dans le GUI (il peut repasser en manuel), mais le
|
|
||||||
# DÉFAUT est désormais un disque net → réinstall fiable à chaque fois.
|
|
||||||
# ⚠ VM mono-disque : « --all » efface le seul disque, c'est voulu. Sur une
|
|
||||||
# machine multi-disques il faudrait cibler avec « --drives=sda ».
|
|
||||||
zerombr
|
|
||||||
clearpart --all --initlabel --disklabel=msdos
|
|
||||||
|
|
||||||
# --- Bootloader : géré à la main en %post ------------------------------------
|
|
||||||
# Anaconda lancerait « grub2-install » / « grub2-mkconfig » (binaires Fedora,
|
|
||||||
# préfixe grub2-) qui n'existent pas dans un rootfs Arch (lequel fournit
|
|
||||||
# grub-install / grub-mkconfig). On désactive donc l'étape native d'Anaconda.
|
|
||||||
# L'ESP (UEFI) ou la partition bios_boot (BIOS/GPT) reste créée par le
|
|
||||||
# partitionnement (auto ou manuel) car la plateforme l'impose.
|
|
||||||
bootloader --disabled
|
|
||||||
|
|
||||||
# Pas de section %packages : le payload liveimg n'installe aucun paquet
|
|
||||||
# (il copie une image). Toute installation de paquets se fait en %post.
|
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# %post --nochroot — s'exécute dans le LIVE, la cible montée sous /mnt/sysroot
|
|
||||||
# But : déposer dans la cible ce dont le %post chrooté aura besoin (DNS pour
|
|
||||||
# pacman, choix de bureau écrit par l'addon de sélection).
|
|
||||||
# ============================================================================
|
|
||||||
%post --nochroot --log=/tmp/fws-post-nochroot.log
|
|
||||||
set -x
|
|
||||||
|
|
||||||
# Selon la version d'Anaconda la cible est sous /mnt/sysroot (récent) ou
|
|
||||||
# /mnt/sysimage (ancien).
|
|
||||||
SYSROOT=/mnt/sysroot
|
|
||||||
[ -d "$SYSROOT" ] || SYSROOT=/mnt/sysimage
|
|
||||||
|
|
||||||
# DNS pour que « pacman -S <bureau> » fonctionne dans le chroot.
|
|
||||||
cp -f /etc/resolv.conf "$SYSROOT/etc/resolv.conf" 2>/dev/null || true
|
|
||||||
|
|
||||||
# Choix du bureau (écrit par l'addon « Choix du bureau », à venir ; valeur lue
|
|
||||||
# par le %post chrooté ci-dessous). « cli » par défaut si absent.
|
|
||||||
if [ -f /tmp/fws-desktop ]; then
|
|
||||||
cp -f /tmp/fws-desktop "$SYSROOT/tmp/fws-desktop" 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- Noyau : archiso RETIRE /boot/vmlinuz-linux du squashfs ------------------
|
|
||||||
# mkarchiso boote le noyau depuis l'ISO et l'EXCLUT de l'airootfs squashfs (gain
|
|
||||||
# de place). Conséquence : le payload LiveOS recopie un rootfs SANS noyau →
|
|
||||||
# « mkinitcpio: /boot/vmlinuz-linux must be readable » puis aucun OS à booter
|
|
||||||
# (« Operating System not found »). On récupère donc le noyau depuis le média
|
|
||||||
# booté (/run/archiso/bootmnt/<install_dir>/boot/<arch>/vmlinuz-linux) et on le
|
|
||||||
# dépose dans la cible. Les modules (/usr/lib/modules) sont, eux, dans le
|
|
||||||
# squashfs → déjà recopiés. Avec le noyau présent, le %post chrooté peut bâtir
|
|
||||||
# l'initramfs (mkinitcpio) et GRUB trouve de quoi booter.
|
|
||||||
SRC_KERN="$(find /run/archiso/bootmnt -name 'vmlinuz-linux' 2>/dev/null | head -1)"
|
|
||||||
if [ -n "$SRC_KERN" ]; then
|
|
||||||
cp -f "$SRC_KERN" "$SYSROOT/boot/vmlinuz-linux"
|
|
||||||
else
|
|
||||||
echo "[FWS] AVERTISSEMENT : noyau vmlinuz-linux introuvable sur le média"
|
|
||||||
fi
|
|
||||||
%end
|
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# %post (chroot) — DANS le rootfs FWS recopié. pacman, grub-install,
|
|
||||||
# mkinitcpio existent ici : ce sont les outils Arch de l'image copiée.
|
|
||||||
# Log persistant : /var/log/fws-post.log sur le système installé.
|
|
||||||
# ============================================================================
|
|
||||||
%post --log=/var/log/fws-post.log
|
|
||||||
set -x
|
|
||||||
|
|
||||||
# --- 1) Purge des résidus « live » (modèle Sabayon = live copié tel quel) ----
|
|
||||||
# Ce qui est propre au live casserait ou pollue le système installé.
|
|
||||||
rm -f /etc/mkinitcpio.conf.d/archiso.conf
|
|
||||||
rm -f /etc/systemd/system/getty@tty1.service.d/autologin.conf
|
|
||||||
for svc in choose-mirror.service pacman-init.service \
|
|
||||||
livecd-talk.service livecd-alsa-unmuter.service \
|
|
||||||
etc-pacman.d-gnupg.mount; do
|
|
||||||
rm -f "/etc/systemd/system/$svc"
|
|
||||||
rm -f /etc/systemd/system/*.target.wants/"$svc"
|
|
||||||
done
|
|
||||||
# cloud-init (présent dans l'airootfs archiso) : inutile sur un poste installé.
|
|
||||||
rm -f /etc/systemd/system/cloud-init.target.wants/* 2>/dev/null || true
|
|
||||||
# Hooks initramfs archiso, s'ils ont été recopiés en tant que paquet.
|
|
||||||
if pacman -Q mkinitcpio-archiso &>/dev/null; then
|
|
||||||
pacman -Rns --noconfirm mkinitcpio-archiso || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- 2) initramfs propre (preset Arch standard, sans archiso) ----------------
|
|
||||||
# Le live fournit un preset 'archiso' (/etc/mkinitcpio.d/linux.preset qui pointe
|
|
||||||
# vers conf.d/archiso.conf + hooks archiso) → inadapté à un disque normal. On
|
|
||||||
# pose un preset Arch standard (config par défaut /etc/mkinitcpio.conf).
|
|
||||||
cat > /etc/mkinitcpio.d/linux.preset <<'PRESET'
|
|
||||||
ALL_kver="/boot/vmlinuz-linux"
|
|
||||||
PRESETS=('default' 'fallback')
|
|
||||||
default_image="/boot/initramfs-linux.img"
|
|
||||||
fallback_image="/boot/initramfs-linux-fallback.img"
|
|
||||||
fallback_options="-S autodetect"
|
|
||||||
PRESET
|
|
||||||
# Le partitionnement auto d'Anaconda met « / » sur LVM (/dev/mapper/...-root).
|
|
||||||
# Sans le hook 'lvm2' dans l'initramfs, le VG n'est pas activé au boot → la
|
|
||||||
# racine est introuvable → kernel panic. On l'insère avant 'filesystems' s'il
|
|
||||||
# manque (inoffensif si la racine n'est finalement pas sur LVM).
|
|
||||||
if ! grep -qE '^HOOKS=.*\blvm2\b' /etc/mkinitcpio.conf; then
|
|
||||||
sed -i -E 's/^(HOOKS=\(.*)\bfilesystems\b/\1lvm2 filesystems/' /etc/mkinitcpio.conf
|
|
||||||
fi
|
|
||||||
mkinitcpio -P || echo "[FWS] AVERTISSEMENT : mkinitcpio a échoué"
|
|
||||||
|
|
||||||
# --- 3) GRUB installé à la main (cf. bootloader --disabled) ------------------
|
|
||||||
install_grub() {
|
|
||||||
if [ -d /sys/firmware/efi ]; then
|
|
||||||
# UEFI. efibootmgr crée l'entrée NVRAM « FWS », mais il peut MANQUER de
|
|
||||||
# l'airootfs et son install dépend du réseau → on ne BLOQUE pas dessus.
|
|
||||||
pacman -Q efibootmgr &>/dev/null || pacman -Sy --noconfirm efibootmgr || true
|
|
||||||
# (a) Entrée NVRAM dédiée (best effort, si efibootmgr dispo) :
|
|
||||||
grub-install --target=x86_64-efi --efi-directory=/boot/efi \
|
|
||||||
--bootloader-id=FWS --recheck || true
|
|
||||||
# (b) Chemin de SECOURS EFI/BOOT/BOOTX64.EFI (--removable) : boote SANS
|
|
||||||
# aucune entrée NVRAM. INDISPENSABLE en VM / sans réseau / firmware
|
|
||||||
# qui « oublie » l'entrée — c'est lui qui garantit le 1er boot UEFI.
|
|
||||||
grub-install --target=x86_64-efi --efi-directory=/boot/efi \
|
|
||||||
--bootloader-id=FWS --removable --recheck
|
|
||||||
else
|
|
||||||
# BIOS : installer GRUB dans le MBR du DISQUE physique (PAS une partition)
|
|
||||||
# portant « / », même quand « / » est sur du LVM (chaîne
|
|
||||||
# LV → PV partition → disque). « lsblk -s » descend vers le physique ; on
|
|
||||||
# prend la ligne de type « disk ». ATTENTION : « lsblk -s » dessine un
|
|
||||||
# ARBRE → les caractères de branche (└─) se collent au chemin (on
|
|
||||||
# obtenait disk='-/dev/sda' → « grub-install: cannot find a GRUB drive
|
|
||||||
# for `-/dev/sda' »). On EXTRAIT donc le chemin propre avec grep.
|
|
||||||
local rootsrc disk
|
|
||||||
rootsrc="$(findmnt -no SOURCE / 2>/dev/null)"
|
|
||||||
disk="$(lsblk -spno NAME,TYPE "$rootsrc" 2>/dev/null \
|
|
||||||
| awk '$2=="disk"{print $1; exit}' | grep -oE '/dev/[a-z0-9]+')"
|
|
||||||
[ -n "$disk" ] || { echo "[FWS] Disque BIOS introuvable pour '$rootsrc'"; return 1; }
|
|
||||||
grub-install --target=i386-pc --recheck "$disk"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
if install_grub; then
|
|
||||||
grub-mkconfig -o /boot/grub/grub.cfg || echo "[FWS] grub-mkconfig a échoué"
|
|
||||||
else
|
|
||||||
echo "[FWS] AVERTISSEMENT : grub-install a échoué — bootloader à refaire à la main"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- 4) Drivers matériels : détection + activation/installation AUTO ----------
|
|
||||||
# Toute la DÉTECTION vit dans /usr/local/bin/fws-hw-detect : livré par
|
|
||||||
# l'airootfs → recopié dans la cible par le payload liveimg → présent dans ce
|
|
||||||
# chroot. C'est la MÊME source de vérité que l'écran « Récapitulatif avant
|
|
||||||
# installation » du live (.xinitrc, mode --text) : ce qui a été ANNONCÉ à
|
|
||||||
# l'utilisateur = ce qu'on APPLIQUE ici. La détection marche en chroot car
|
|
||||||
# Anaconda bind-monte le /sys et le /proc du LIVE (le code plus haut s'appuie
|
|
||||||
# déjà dessus : /sys/firmware/efi, findmnt) → on voit le VRAI matériel.
|
|
||||||
# Variables produites par --env :
|
|
||||||
# FWS_VIRT hyperviseur (vmware/oracle/kvm/qemu/none…)
|
|
||||||
# FWS_VIRT_SVC services invité à activer (paquets DÉJÀ dans l'image → OK
|
|
||||||
# hors ligne ; c'était le chaînon manquant, rien n'activait
|
|
||||||
# vmtoolsd & co sur le système installé)
|
|
||||||
# FWS_VIRT_RM guest tools des AUTRES hyperviseurs, à purger
|
|
||||||
# FWS_DRV_PKGS paquets GPU à installer, dédoublonnés. NVIDIA embarque
|
|
||||||
# « linux » dans la même transaction : le module des dépôts
|
|
||||||
# est bâti pour le noyau des dépôts, pas celui du live ; les
|
|
||||||
# chemins /boot/* étant stables, le grub.cfg de l'étape 3
|
|
||||||
# reste valable (le hook pacman de nvidia relance mkinitcpio).
|
|
||||||
# NB : microcode CPU (amd-ucode/intel-ucode) et linux-firmware sont DÉJÀ dans
|
|
||||||
# l'image → recopiés, et grub-mkconfig (étape 3) a généré les initrd qui vont
|
|
||||||
# bien. Rien à faire pour eux.
|
|
||||||
if [ -x /usr/local/bin/fws-hw-detect ]; then
|
|
||||||
eval "$(/usr/local/bin/fws-hw-detect --env)"
|
|
||||||
# (a) Hyperviseur : activer le bon service invité, purger les autres.
|
|
||||||
[ -n "$FWS_VIRT_SVC" ] && { systemctl enable $FWS_VIRT_SVC || true; }
|
|
||||||
[ -n "$FWS_VIRT_RM" ] && { pacman -Rns --noconfirm $FWS_VIRT_RM || true; }
|
|
||||||
# (b) GPU : install réseau, NON bloquante (même philosophie que le
|
|
||||||
# bureau). --needed : ne réinstalle pas ce que l'image a déjà (mesa…).
|
|
||||||
if [ -n "$FWS_DRV_PKGS" ]; then
|
|
||||||
pacman-key --init &>/dev/null || true
|
|
||||||
pacman-key --populate archlinux &>/dev/null || true
|
|
||||||
if ! pacman -Sy --noconfirm --needed $FWS_DRV_PKGS; then
|
|
||||||
echo "[FWS] Drivers non installés ($FWS_DRV_PKGS) — réseau ? À refaire au 1er boot."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "[FWS] fws-hw-detect introuvable — drivers/guest tools NON configurés."
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- 5) Bureau choisi : pacman -S du DE (non bloquant si pas de réseau) -------
|
|
||||||
DESK="cli"
|
|
||||||
[ -f /tmp/fws-desktop ] && DESK="$(tr -d '[:space:]' < /tmp/fws-desktop)"
|
|
||||||
DM=""
|
|
||||||
case "$DESK" in
|
|
||||||
kde) PKGS="plasma-meta sddm konsole dolphin"; DM="sddm" ;;
|
|
||||||
gnome) PKGS="gnome gdm"; DM="gdm" ;;
|
|
||||||
xfce) PKGS="xfce4 xfce4-goodies lightdm lightdm-gtk-greeter"; DM="lightdm" ;;
|
|
||||||
hyprland) PKGS="hyprland kitty wofi waybar sddm"; DM="sddm" ;;
|
|
||||||
cli|*) PKGS="" ;;
|
|
||||||
esac
|
|
||||||
if [ -n "$PKGS" ]; then
|
|
||||||
pacman-key --init &>/dev/null || true
|
|
||||||
pacman-key --populate archlinux &>/dev/null || true
|
|
||||||
if pacman -Sy --noconfirm $PKGS; then
|
|
||||||
[ -n "$DM" ] && systemctl enable "$DM" || true
|
|
||||||
systemctl set-default graphical.target || true
|
|
||||||
else
|
|
||||||
echo "[FWS] Bureau '$DESK' non installé (réseau ?) — à refaire après le 1er boot."
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- 6) Sécurité : verrouiller root s'il est resté SANS mot de passe ----------
|
|
||||||
# L'airootfs live a souvent un root sans mot de passe ; si l'utilisateur n'en a
|
|
||||||
# pas défini dans le GUI, on verrouille plutôt que de laisser le compte ouvert.
|
|
||||||
if passwd -S root 2>/dev/null | grep -qE '\bNP\b'; then
|
|
||||||
passwd -l root || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# --- 7) Le resolv.conf du live ne doit pas rester figé -----------------------
|
|
||||||
# NetworkManager (activé sur le système installé) régénère /etc/resolv.conf.
|
|
||||||
rm -f /tmp/fws-desktop /etc/resolv.conf 2>/dev/null || true
|
|
||||||
%end
|
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
|
||||||
# %post --nochroot (FINAL) — exfiltre le log du %post chrooté vers le LIVE.
|
|
||||||
# À ce stade la cible est ENCORE montée sous /mnt/sysroot (l'unmount n'a pas
|
|
||||||
# encore eu lieu). On copie /var/log/fws-post.log (résultat de grub-install /
|
|
||||||
# mkinitcpio) vers le live /tmp pour que le harnais de debug (.xinitrc)
|
|
||||||
# l'affiche SANS avoir à remonter le disque démonté — c'est ce log qui dit si
|
|
||||||
# le disque va booter.
|
|
||||||
# ============================================================================
|
|
||||||
%post --nochroot
|
|
||||||
SYSROOT=/mnt/sysroot
|
|
||||||
[ -d "$SYSROOT" ] || SYSROOT=/mnt/sysimage
|
|
||||||
cp -f "$SYSROOT/var/log/fws-post.log" /tmp/fws-post-chroot.log 2>/dev/null || true
|
|
||||||
%end
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Version=1.0
|
||||||
|
Type=Application
|
||||||
|
Name=Installer FWS Linux
|
||||||
|
Name[fr]=Installer FWS Linux
|
||||||
|
Comment=Installe FWS Linux sur votre machine
|
||||||
|
Comment[fr]=Installe FWS Linux sur votre machine
|
||||||
|
Exec=fws-installer
|
||||||
|
Icon=/etc/calamares/branding/fws/logo.png
|
||||||
|
Terminal=false
|
||||||
|
Categories=System;
|
||||||
|
Keywords=install;installer;fws;calamares;
|
||||||
|
StartupNotify=true
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
# FWS — paquets de l'ISO live
|
# FWS — paquets de l'ISO live
|
||||||
# Objectif : système live bootable + installateur Anaconda
|
# Objectif : système live bootable + installeur Calamares
|
||||||
# (migration depuis Calamares) + jeu minimal d'outils de rescue.
|
# fonctionnel + jeu minimal d'outils de rescue.
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
# --- Base système ---
|
# --- Base système ---
|
||||||
@@ -26,7 +26,6 @@ memtest86+
|
|||||||
memtest86+-efi
|
memtest86+-efi
|
||||||
|
|
||||||
# --- Filesystems ---
|
# --- Filesystems ---
|
||||||
squashfs-tools
|
|
||||||
btrfs-progs
|
btrfs-progs
|
||||||
e2fsprogs
|
e2fsprogs
|
||||||
exfatprogs
|
exfatprogs
|
||||||
@@ -85,7 +84,7 @@ htop
|
|||||||
alsa-utils
|
alsa-utils
|
||||||
sof-firmware
|
sof-firmware
|
||||||
|
|
||||||
# --- Xorg + Openbox (session graphique de l'installateur) ---
|
# --- Xorg + Openbox (pour Calamares) ---
|
||||||
xorg-server
|
xorg-server
|
||||||
xorg-xinit
|
xorg-xinit
|
||||||
xorg-xrandr
|
xorg-xrandr
|
||||||
@@ -93,6 +92,14 @@ xorg-xsetroot
|
|||||||
openbox
|
openbox
|
||||||
ttf-dejavu
|
ttf-dejavu
|
||||||
|
|
||||||
|
# --- Calamares (fournis par fws-local) ---
|
||||||
|
calamares
|
||||||
|
kpmcore
|
||||||
|
qt5-base
|
||||||
|
qt5-svg
|
||||||
|
qt5-webengine
|
||||||
|
qt6-base
|
||||||
|
|
||||||
# --- Agents VM (pratique pour tester l'ISO) ---
|
# --- Agents VM (pratique pour tester l'ISO) ---
|
||||||
qemu-guest-agent
|
qemu-guest-agent
|
||||||
virtualbox-guest-utils-nox
|
virtualbox-guest-utils-nox
|
||||||
@@ -100,17 +107,3 @@ 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
|
|
||||||
# Module 'cgi' (retiré de Python 3.13, PEP 594) requis par python-requests-ftp
|
|
||||||
# que pyanaconda/core/util.py importe en dur. python-legacy-cgi le réintroduit.
|
|
||||||
python-legacy-cgi
|
|
||||||
# Module 'crypt'/'crypt_r' (retiré de Python 3.13, PEP 594) requis par
|
|
||||||
# pyanaconda/core/users.py (hash des mots de passe). Paquet maison (fws-local).
|
|
||||||
python-crypt_r
|
|
||||||
# Namespace GI 'OSTree-1.0' : pyanaconda/rescue.py importe le payload rpm_ostree
|
|
||||||
# (inconditionnellement, même si FWS utilise liveimg) → fourni par 'ostree'.
|
|
||||||
ostree
|
|
||||||
|
|||||||
@@ -22,6 +22,4 @@ file_permissions=(
|
|||||||
["/usr/local/bin/choose-mirror"]="0:0:755"
|
["/usr/local/bin/choose-mirror"]="0:0:755"
|
||||||
["/usr/local/bin/Installation_guide"]="0:0:755"
|
["/usr/local/bin/Installation_guide"]="0:0:755"
|
||||||
["/usr/local/bin/livecd-sound"]="0:0:755"
|
["/usr/local/bin/livecd-sound"]="0:0:755"
|
||||||
["/usr/bin/load_policy"]="0:0:755"
|
|
||||||
["/usr/bin/setstatus"]="0:0:755"
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,380 +0,0 @@
|
|||||||
# Environnement de référence — machine hôte qui build FWS
|
|
||||||
|
|
||||||
Ce document décrit **l'environnement exact** sur lequel le build FWS fonctionne de bout en bout. Si le build échoue chez toi, **compare ligne par ligne** avec cette config et aligne ce qui diffère.
|
|
||||||
|
|
||||||
> ⚠️ Ce n'est pas une simple recommandation : chaque ligne ci-dessous a été vérifiée comme nécessaire (ou suffisante) à un build réussi. Une seule différence peut tout casser (keyring, kernel WSL, sandbox pacman, ligne d'encodage…).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. Matériel (host Windows)
|
|
||||||
|
|
||||||
| Composant | Valeur de référence | Minimum acceptable | Pourquoi |
|
|
||||||
|---|---|---|---|
|
|
||||||
| CPU | AMD Ryzen 9 9950X3D (16 cores / 32 threads) | x86_64 avec **VT-x ou AMD-V activé dans le BIOS** | WSL 2 = Hyper-V → la virtualisation **doit** être activée dans le firmware |
|
|
||||||
| RAM | 64 GB (61.67 GB utilisable) | 8 GB | `mkarchiso` charge l'image squashfs en RAM ; `makepkg` des paquets AUR compile en parallèle |
|
|
||||||
| Disque libre sur `C:` | ≥ 130 GB libres | 25 GB libres | WSL grossit dynamiquement ; squashfs intermédiaire peut atteindre 10 GB |
|
|
||||||
| Architecture | x86_64 | x86_64 | ArchWSL n'existe pas en ARM |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. OS hôte
|
|
||||||
|
|
||||||
| Composant | Valeur exacte référence | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| OS | **Microsoft Windows 11 Professionnel** | Édition Pro/Entreprise/Éducation recommandée (Hyper-V natif) |
|
|
||||||
| Version | **10.0.26200** (build 26200) | Windows 11 24H2 ou plus récent |
|
|
||||||
| Architecture | 64 bits | — |
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
powershell.exe -Command "(Get-CimInstance Win32_OperatingSystem).Caption + ' build ' + (Get-CimInstance Win32_OperatingSystem).BuildNumber"
|
|
||||||
```
|
|
||||||
|
|
||||||
Doit retourner : `Microsoft Windows 11 ... build 26200` (ou supérieur).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. Git for Windows + Git Bash
|
|
||||||
|
|
||||||
| Composant | Valeur de référence |
|
|
||||||
|---|---|
|
|
||||||
| Git | **2.53.0.windows.2** |
|
|
||||||
| Bash (Git Bash) | **GNU bash 5.2.37(1)-release (x86_64-pc-msys)** |
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git --version
|
|
||||||
bash --version | head -1
|
|
||||||
```
|
|
||||||
|
|
||||||
> Git Bash < 2.40 a un quoting cassé sur `wsl.exe` — les scripts plantent silencieusement. Mets à jour si tu es en dessous.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. WSL (Windows Subsystem for Linux)
|
|
||||||
|
|
||||||
| Composant | Valeur de référence |
|
|
||||||
|---|---|
|
|
||||||
| Version WSL | **WSL 2** (WSL 1 = pas supporté) |
|
|
||||||
| Distribution par défaut | **Arch** |
|
|
||||||
| Version de la distro | **2** |
|
|
||||||
| `.wslconfig` (côté Windows, `C:\Users\<toi>\.wslconfig`) | **Absent** (réglages par défaut suffisent) |
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe --status
|
|
||||||
wsl.exe -l -v
|
|
||||||
```
|
|
||||||
|
|
||||||
Doit afficher exactement :
|
|
||||||
|
|
||||||
```
|
|
||||||
NAME STATE VERSION
|
|
||||||
* Arch Stopped 2
|
|
||||||
```
|
|
||||||
|
|
||||||
⚠️ **Le nom doit être exactement `Arch`** (sinon exporter `ARCH_WSL_DISTRO=NomChezToi` avant de lancer les scripts).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. WSL Arch — kernel et système
|
|
||||||
|
|
||||||
| Composant | Valeur de référence | Vérif |
|
|
||||||
|---|---|---|
|
|
||||||
| Kernel WSL | **6.6.114.1-microsoft-standard-WSL2** | `wsl.exe -d Arch -- uname -r` |
|
|
||||||
| Hostname (par défaut) | murasaki (peu importe le tien) | — |
|
|
||||||
| Distribution | **Arch Linux rolling** | `cat /etc/os-release` |
|
|
||||||
| Build ID | `20250302.0.316047` (ou plus récent) | — |
|
|
||||||
|
|
||||||
Mettre à jour le kernel WSL si nécessaire (PowerShell admin) :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
powershell.exe -Command "Start-Process powershell -Verb RunAs -ArgumentList 'wsl --update'"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. WSL Arch — `/etc/wsl.conf`
|
|
||||||
|
|
||||||
Fichier **obligatoire** : `/etc/wsl.conf` dans la distro Arch.
|
|
||||||
|
|
||||||
```ini
|
|
||||||
[boot]
|
|
||||||
systemd=true
|
|
||||||
```
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- cat //etc/wsl.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
> Sans `systemd=true`, l'activation de `NetworkManager.service` dans le live ne sera pas testable, et `pacman-key --populate` peut bloquer.
|
|
||||||
|
|
||||||
Après modification :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe --shutdown
|
|
||||||
```
|
|
||||||
|
|
||||||
(redémarrage complet de la WSL pour appliquer `wsl.conf`).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. WSL Arch — pacman
|
|
||||||
|
|
||||||
| Composant | Valeur de référence |
|
|
||||||
|---|---|
|
|
||||||
| pacman | **v7.1.0** |
|
|
||||||
| libalpm | **v16.0.1** |
|
|
||||||
| `/etc/pacman.conf` → `DisableSandbox` | **Présent et décommenté** |
|
|
||||||
|
|
||||||
`/etc/pacman.conf` doit contenir, dans la section `[options]` :
|
|
||||||
|
|
||||||
```ini
|
|
||||||
DisableSandbox
|
|
||||||
```
|
|
||||||
|
|
||||||
> pacman ≥ 7 utilise **landlock** pour sandboxer les opérations FS. **Le kernel WSL ne supporte pas landlock** → tout install bloque. `setup-aur.sh` l'ajoute automatiquement la première fois.
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- grep -E "^DisableSandbox" //etc/pacman.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
Doit retourner : `DisableSandbox` (sans `#`).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. WSL Arch — paquets requis
|
|
||||||
|
|
||||||
Versions de référence (peuvent évoluer, l'important est que ces paquets soient installés et à jour) :
|
|
||||||
|
|
||||||
| Paquet | Version réf | Rôle |
|
|
||||||
|---|---|---|
|
|
||||||
| `archiso` | **88-1** | `mkarchiso` (build de l'ISO) |
|
|
||||||
| `base-devel` | **1-2** | `makepkg`, gcc, make, fakeroot |
|
|
||||||
| `git` | **2.54.0-1** | clone des paquets AUR |
|
|
||||||
| `reflector` | **2023-5** | mise à jour des miroirs |
|
|
||||||
| `dos2unix` | **7.5.5-1** | fix des CRLF Windows |
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- pacman -Q archiso base-devel git reflector dos2unix
|
|
||||||
```
|
|
||||||
|
|
||||||
Tout doit retourner une version (pas `not found`). Si manquant :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- pacman -Sy --noconfirm archiso base-devel git reflector dos2unix
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. WSL Arch — keyring pacman
|
|
||||||
|
|
||||||
État requis :
|
|
||||||
|
|
||||||
- `pacman-key --init` exécuté au moins une fois (crée `/etc/pacman.d/gnupg/`)
|
|
||||||
- `pacman-key --populate archlinux` exécuté au moins une fois
|
|
||||||
- `archlinux-keyring` à jour
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- ls //etc/pacman.d/gnupg/
|
|
||||||
wsl.exe -d Arch -u root -- pacman -Q archlinux-keyring
|
|
||||||
```
|
|
||||||
|
|
||||||
Le dossier `gnupg/` doit exister et contenir `pubring.gpg`, `trustdb.gpg`, etc.
|
|
||||||
|
|
||||||
Si jamais initialisé :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- bash -c "pacman-key --init && pacman-key --populate archlinux && pacman -Sy --noconfirm archlinux-keyring && pacman -Syu --noconfirm"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 10. WSL Arch — espace disque
|
|
||||||
|
|
||||||
Mesuré sur la machine de référence :
|
|
||||||
|
|
||||||
```
|
|
||||||
Filesystem Size Used Avail Use% Mounted on
|
|
||||||
tmpfs 16G 0 16G 0% /tmp
|
|
||||||
/dev/sdd 1007G 4.3G 952G 1% /
|
|
||||||
```
|
|
||||||
|
|
||||||
Vérifier :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- df -h //tmp /
|
|
||||||
```
|
|
||||||
|
|
||||||
| Point de montage | Minimum |
|
|
||||||
|---|---|
|
|
||||||
| `/tmp` (tmpfs) | ≥ 4 GB libres |
|
|
||||||
| `/` (rootfs WSL) | ≥ 20 GB libres |
|
|
||||||
|
|
||||||
> Si `/tmp` n'est pas un `tmpfs`, mkarchiso sera **5-10× plus lent**. Sur WSL avec systemd, c'est tmpfs par défaut.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 11. Variables d'environnement (Git Bash)
|
|
||||||
|
|
||||||
Aucune variable n'est requise **pour que ça marche**, mais les scripts en utilisent en interne :
|
|
||||||
|
|
||||||
| Variable | Valeur | Quand |
|
|
||||||
|---|---|---|
|
|
||||||
| `MSYS_NO_PATHCONV=1` | forcée par `build.sh` et `setup-aur.sh` | empêche Git Bash de convertir `/tmp/...` en chemins Windows |
|
|
||||||
| `MSYS2_ARG_CONV_EXCL=*` | forcée par `setup-aur.sh` | empêche la conversion d'arguments passés à `wsl.exe` |
|
|
||||||
| `ARCH_WSL_DISTRO` | optionnel, défaut = `Arch` | nom de la distro WSL si tu as renommé |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 12. Permissions & emplacement du repo
|
|
||||||
|
|
||||||
| Critère | Référence |
|
|
||||||
|---|---|
|
|
||||||
| Chemin du repo (host) | `C:\Users\<user>\Documents\1. FWS\FWS\` |
|
|
||||||
| Chemin équivalent WSL | `/mnt/c/Users/<user>/Documents/1. FWS/FWS/` |
|
|
||||||
| Espaces dans le chemin | **OK** (les scripts gèrent `"1. FWS"`) |
|
|
||||||
| Caractères accentués dans le chemin | **À éviter** (mkarchiso plante) |
|
|
||||||
| Antivirus / Defender exclusion sur le dossier | **Recommandé** (gros gain de perf sur `cp -ar`) |
|
|
||||||
|
|
||||||
Ajouter une exclusion Defender (PowerShell admin) :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
powershell.exe -Command "Start-Process powershell -Verb RunAs -ArgumentList 'Add-MpPreference -ExclusionPath \"C:\Users\$env:USERNAME\Documents\1. FWS\"'"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 13. Réseau
|
|
||||||
|
|
||||||
| Critère | État requis |
|
|
||||||
|---|---|
|
|
||||||
| Accès internet depuis WSL | obligatoire (pacman, AUR, reflector) |
|
|
||||||
| Proxy d'entreprise | configurer dans `/etc/wgetrc` + `/etc/pacman.d/mirrorlist` |
|
|
||||||
| `mirrorlist` à jour | `reflector --latest 10 --sort rate` (fait par `setup-aur.sh`) |
|
|
||||||
|
|
||||||
Tester depuis WSL :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wsl.exe -d Arch -u root -- bash -c "curl -sI https://archlinux.org/ | head -1"
|
|
||||||
```
|
|
||||||
|
|
||||||
Doit retourner : `HTTP/2 200`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 14. Procédure de remise à zéro complète
|
|
||||||
|
|
||||||
Si rien ne fonctionne, **réinitialise la WSL Arch** depuis Git Bash :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Sauvegarde le repo FWS d'abord (il est sur C:, donc safe)
|
|
||||||
wsl.exe --shutdown
|
|
||||||
wsl.exe --unregister Arch
|
|
||||||
|
|
||||||
# Réinstalle ArchWSL
|
|
||||||
curl.exe -L -o "$TEMP/Arch.zip" "https://github.com/yuk7/ArchWSL/releases/latest/download/Arch.zip"
|
|
||||||
powershell.exe -Command "Expand-Archive -Force '$env:TEMP\Arch.zip' '$env:LOCALAPPDATA\ArchWSL'"
|
|
||||||
"$LOCALAPPDATA/ArchWSL/Arch.exe" # ferme la fenêtre dès qu'elle s'ouvre
|
|
||||||
|
|
||||||
# Configure wsl.conf
|
|
||||||
wsl.exe -d Arch -u root -- bash -c 'printf "[boot]\nsystemd=true\n" > /etc/wsl.conf'
|
|
||||||
wsl.exe --shutdown
|
|
||||||
|
|
||||||
# Init complète
|
|
||||||
wsl.exe -d Arch -u root -- bash -c "pacman-key --init && pacman-key --populate archlinux && pacman -Sy --noconfirm archlinux-keyring && pacman -Syu --noconfirm && pacman -S --noconfirm --needed archiso base-devel git reflector dos2unix"
|
|
||||||
|
|
||||||
# Relance le build
|
|
||||||
cd "/c/Users/$USER/Documents/1. FWS/FWS"
|
|
||||||
./setup-aur.sh
|
|
||||||
./build.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 15. Checklist rapide de diagnostic
|
|
||||||
|
|
||||||
À copier-coller dans Git Bash pour comparer ta machine avec la référence :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
echo "=== Host ===" && powershell.exe -Command "(Get-CimInstance Win32_OperatingSystem).Caption + ' build ' + (Get-CimInstance Win32_OperatingSystem).BuildNumber"
|
|
||||||
echo "=== Git ===" && git --version
|
|
||||||
echo "=== Bash ===" && bash --version | head -1
|
|
||||||
echo "=== WSL ===" && wsl.exe -l -v
|
|
||||||
echo "=== Kernel ===" && wsl.exe -d Arch -u root -- uname -r 2>&1 | tr -d '\0'
|
|
||||||
echo "=== pacman ===" && wsl.exe -d Arch -u root -- bash -c "pacman --version | head -2" 2>&1 | tr -d '\0'
|
|
||||||
echo "=== Sandbox ===" && wsl.exe -d Arch -u root -- grep "^DisableSandbox" //etc/pacman.conf 2>&1 | tr -d '\0'
|
|
||||||
echo "=== Paquets ===" && wsl.exe -d Arch -u root -- pacman -Q archiso base-devel git reflector dos2unix 2>&1 | tr -d '\0'
|
|
||||||
echo "=== wsl.conf ===" && wsl.exe -d Arch -u root -- cat //etc/wsl.conf 2>&1 | tr -d '\0'
|
|
||||||
echo "=== Disque WSL ===" && wsl.exe -d Arch -u root -- df -h / //tmp 2>&1 | tr -d '\0'
|
|
||||||
```
|
|
||||||
|
|
||||||
Compare la sortie avec les valeurs de référence des sections 2 à 10 ci-dessus.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 16. Configuration de référence en une page (résumé)
|
|
||||||
|
|
||||||
```
|
|
||||||
Host : Windows 11 Pro build 26200, x86_64, VT/AMD-V activé
|
|
||||||
CPU : x86_64 (Ryzen 9 9950X3D testé)
|
|
||||||
RAM : 64 GB (8 GB min)
|
|
||||||
Disque libre: ≥ 130 GB sur C:
|
|
||||||
Git : 2.53.0.windows.2
|
|
||||||
Bash : 5.2.37(1)-release msys
|
|
||||||
WSL : version 2, distro "Arch", version 2
|
|
||||||
Kernel WSL : 6.6.114.1-microsoft-standard-WSL2
|
|
||||||
.wslconfig : absent
|
|
||||||
wsl.conf : [boot]\nsystemd=true
|
|
||||||
pacman : v7.1.0 / libalpm v16.0.1
|
|
||||||
pacman.conf : DisableSandbox actif
|
|
||||||
Keyring : initialisé + populé + archlinux-keyring à jour
|
|
||||||
Paquets : archiso 88-1, base-devel 1-2, git 2.54.0-1,
|
|
||||||
reflector 2023-5, dos2unix 7.5.5-1
|
|
||||||
Repo path : C:\Users\<user>\Documents\1. FWS\FWS\
|
|
||||||
(pas d'accents, espaces OK)
|
|
||||||
Defender : exclusion sur le dossier du repo
|
|
||||||
Réseau : accès archlinux.org (HTTP/2 200), pas de proxy bloquant
|
|
||||||
```
|
|
||||||
|
|
||||||
Si **tout** ce qui précède est aligné, `./setup-aur.sh && ./build.sh` doit produire `out/FWS-*.iso` en 25-55 min au total.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 17. Build depuis Fedora / Linux non-Arch (bascule conteneur podman)
|
|
||||||
|
|
||||||
Les trois scripts (`setup-aur.sh`, `build.sh`, `build-offi.sh`) détectent un hôte
|
|
||||||
**non-Arch** et se relancent automatiquement à l'identique dans un conteneur Arch
|
|
||||||
podman. Aucune Arch native ni WSL n'est nécessaire — il suffit d'installer podman.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo dnf install -y podman # Fedora
|
|
||||||
sudo apt install -y podman # Debian / Ubuntu
|
|
||||||
./setup-aur.sh && ./build.sh # exactement comme sur Arch
|
|
||||||
```
|
|
||||||
|
|
||||||
### Design (points à NE PAS « simplifier »)
|
|
||||||
|
|
||||||
| Choix | Pourquoi |
|
|
||||||
|---|---|
|
|
||||||
| **Détection hôte Arch** = `command -v pacman` **ET** `grep -qiE '^ID(_LIKE)?=.*arch' /etc/os-release` | Fedora empaquette aussi `pacman` → sa seule présence ne suffit pas à conclure « hôte Arch ». |
|
|
||||||
| **podman rootful** (`sudo podman`) | mkarchiso exige des mounts/chroot/loop privilégiés ; podman rootless ne les gère pas. |
|
|
||||||
| **`--privileged`** | Donne les capabilities mkarchiso **et** relâche SELinux (enforcing sur Fedora) sur le bind-mount, sans avoir besoin de `:Z` (qui relabellerait le dépôt). |
|
|
||||||
| **`pull` explicite** avant `run` | `run` ne re-résout jamais le tag `latest` une fois l'image en cache → sinon on build sur une image qui vieillit. |
|
|
||||||
| **`pacman -Syu archiso`** (pas `-Sy`) quand `FWS_IN_CONTAINER=1` | Évite le partial upgrade : sur une image de base vieillissante, `-Sy archiso` tire des deps plus récentes que la base installée. |
|
|
||||||
| **`FWS_IN_CONTAINER=1`** | Garde anti-récursion **et** active `DisableSandbox` (landlock) comme le chemin WSL. |
|
|
||||||
| **Dépôt monté au MÊME chemin absolu** + volume `fws-pacman-cache` | `WORK_DIR`, `out/` et `local-repo/` restent identiques côté hôte ; le cache pacman persiste entre les runs. Les artefacts (root, podman rootful) sont re-`chown` vers le propriétaire du dépôt en fin de run. |
|
|
||||||
|
|
||||||
> Validé par revue adversariale sur Fedora 43 (podman 5.8.2, SELinux enforcing).
|
|
||||||
> Image : `docker.io/library/archlinux:latest`.
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# Widgets GTK3 de l'installateur Anaconda (rhinstaller). Lib C + introspection
|
|
||||||
# GObject (AnacondaWidgets-1.0.typelib) + overrides gi. Le sous-dossier widgets/
|
|
||||||
# du source anaconda est un projet autotools AUTONOME (son propre configure.ac,
|
|
||||||
# AC_INIT([AnacondaWidgets],[3.4])) → on le construit seul depuis le tarball
|
|
||||||
# anaconda-45.8. Paquet versionné sur la release anaconda (comme le sous-paquet
|
|
||||||
# Fedora anaconda-widgets).
|
|
||||||
pkgname=anaconda-widgets
|
|
||||||
pkgver=45.8
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="GTK3 UI widgets for the Anaconda installer (introspection inclus)"
|
|
||||||
arch=('x86_64')
|
|
||||||
url="https://github.com/rhinstaller/anaconda"
|
|
||||||
license=('GPL-2.0-or-later')
|
|
||||||
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'
|
|
||||||
'gobject-introspection' 'gtk-doc' 'glib2-devel' 'python')
|
|
||||||
source=("anaconda-$pkgver.tar.gz::https://github.com/rhinstaller/anaconda/archive/refs/tags/anaconda-$pkgver.tar.gz")
|
|
||||||
sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed')
|
|
||||||
_srcdir="anaconda-anaconda-$pkgver"
|
|
||||||
|
|
||||||
build() {
|
|
||||||
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
|
|
||||||
./configure --prefix=/usr --libdir=/usr/lib \
|
|
||||||
--disable-static --disable-gtk-doc --disable-glade --enable-introspection
|
|
||||||
make
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$srcdir/$_srcdir/widgets"
|
|
||||||
make DESTDIR="$pkgdir" install
|
|
||||||
find "$pkgdir" -name '*.la' -delete
|
|
||||||
# NB : on inclut aussi les fichiers -devel (.so/.h/.pc + catalogue glade) ;
|
|
||||||
# inoffensif sur l'ISO et évite de manquer un fichier runtime. Le paquet
|
|
||||||
# « anaconda » retirera ces mêmes fichiers de son propre pkgdir.
|
|
||||||
}
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# ============================================================================
|
|
||||||
# anaconda — l'installateur Fedora (rhinstaller) PORTÉ sur Arch pour FWS.
|
|
||||||
# Build autotools : ./autogen.sh && ./configure && make && make install
|
|
||||||
# (le source compile aussi widgets/ via AC_CONFIG_SUBDIRS → on retire ces
|
|
||||||
# fichiers en package(), ils sont fournis par le paquet anaconda-widgets).
|
|
||||||
#
|
|
||||||
# ⚠️ SCAFFOLD À ITÉRER : ce PKGBUILD est un point de départ fidèle au spec
|
|
||||||
# amont, mais Anaconda est profondément couplé à Fedora. Il faudra très
|
|
||||||
# probablement itérer sur Arch RÉEL (via ./setup-aur.sh) pour :
|
|
||||||
# - des BuildRequires manquants au configure,
|
|
||||||
# - des chemins/macros Fedora (systemd-rpm-macros, find_lang…),
|
|
||||||
# - la compat Python 3.14 d'Arch (Anaconda vise le Python de Fedora).
|
|
||||||
#
|
|
||||||
# DÉVIATIONS FWS vs Requires du spec (justifiées) :
|
|
||||||
# - RETIRÉS car payload liveimg (jamais le payload DNF) : python3-libdnf5,
|
|
||||||
# python3-rpm. → cf. verdict « drop DNF » (libdnf5 importé seulement dans
|
|
||||||
# dnf_manager.py, chemin non pris avec liveimg).
|
|
||||||
# - RETIRÉ libselinux : Arch n'est pas SELinux (blivet/anaconda gèrent son
|
|
||||||
# absence). - RETIRÉS Fedora-only / N/A archiso : subscription-manager,
|
|
||||||
# s390utils-*, crypto-policies(-scripts), glibc-langpack-*, dracut-network,
|
|
||||||
# teamd/NetworkManager-team, flatpak(-libs). - grub2-common → grub (Arch).
|
|
||||||
# - RISQUE connu : python3-crypt-r (module `crypt` retiré de Python ≥ 3.13)
|
|
||||||
# n'a peut-être pas d'équivalent Arch → à packager si l'import casse.
|
|
||||||
# ============================================================================
|
|
||||||
pkgname=anaconda
|
|
||||||
pkgver=45.8
|
|
||||||
pkgrel=2
|
|
||||||
pkgdesc="The Anaconda installer (porté sur Arch pour FWS, payload liveimg)"
|
|
||||||
arch=('x86_64')
|
|
||||||
url="https://github.com/rhinstaller/anaconda"
|
|
||||||
license=('GPL-2.0-or-later')
|
|
||||||
depends=(
|
|
||||||
# — interface & widgets —
|
|
||||||
'anaconda-widgets' 'gtk3' 'python-gobject' 'gsettings-desktop-schemas'
|
|
||||||
'adwaita-icon-theme' 'librsvg' 'nm-connection-editor'
|
|
||||||
# — cœur Python Anaconda —
|
|
||||||
'python' 'python-meh' 'python-simpleline' 'pykickstart' 'python-dasbus'
|
|
||||||
'python-productmd' 'python-pid' 'python-langtable' 'python-iso639'
|
|
||||||
'python-requests' 'python-requests-file' 'python-requests-ftp'
|
|
||||||
# — stockage —
|
|
||||||
'python-blivet' 'libblockdev' 'python-pyparted' 'parted' 'util-linux'
|
|
||||||
'lvm2' 'cryptsetup' 'mdadm' 'dosfstools' 'e2fsprogs' 'xfsprogs' 'btrfs-progs'
|
|
||||||
# — rapport de crash (python-meh importe `report` en dur) —
|
|
||||||
'libreport'
|
|
||||||
# — système / réseau / boot —
|
|
||||||
'networkmanager' 'kbd' 'chrony' 'systemd' 'dbus' 'openssh' 'grub'
|
|
||||||
'libpwquality' 'python-systemd' 'python-xkbregistry' 'cracklib'
|
|
||||||
)
|
|
||||||
# NB : pas de 'glade' — module Glade désactivé au build (cf. build()).
|
|
||||||
makedepends=(
|
|
||||||
'autoconf' 'automake' 'libtool' 'gettext' 'intltool' 'gtk-doc'
|
|
||||||
'gobject-introspection' 'python' 'gdk-pixbuf2' 'libxml2'
|
|
||||||
'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")
|
|
||||||
sha256sums=('5ef1464bff7f28a4a09a821cbb0121f09ef504ec169288d742373f86807ec4ed')
|
|
||||||
_srcdir="anaconda-anaconda-$pkgver"
|
|
||||||
|
|
||||||
build() {
|
|
||||||
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
|
|
||||||
# ANACONDA_RELEASE=1 : release réelle, pas la date de création du tarball.
|
|
||||||
./configure \
|
|
||||||
--prefix=/usr --libdir=/usr/lib --sysconfdir=/etc \
|
|
||||||
--disable-glade --disable-gtk-doc ANACONDA_RELEASE=1
|
|
||||||
make
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$srcdir/$_srcdir"
|
|
||||||
make DESTDIR="$pkgdir" install
|
|
||||||
find "$pkgdir" -name '*.la' -delete
|
|
||||||
|
|
||||||
# Répertoires attendus par Anaconda (créés vides par le spec).
|
|
||||||
install -d "$pkgdir/usr/share/anaconda/addons" \
|
|
||||||
"$pkgdir/usr/share/anaconda/post-scripts"
|
|
||||||
|
|
||||||
# Fichiers widgets : fournis par le paquet anaconda-widgets → on les retire
|
|
||||||
# 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/girepository-*/AnacondaWidgets*.typelib
|
|
||||||
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*
|
|
||||||
|
|
||||||
# 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
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# Dépendance de l'installateur Anaconda (rhinstaller) — parseur du langage
|
|
||||||
# Kickstart (Anaconda l'exige >= 3.73 ; absent des dépôts Arch et de l'AUR).
|
|
||||||
# Pur Python (setuptools, install_requires=['requests']) : on installe
|
|
||||||
# l'arborescence du module à la main pour éviter d'exiger python-build/installer.
|
|
||||||
pkgname=pykickstart
|
|
||||||
pkgver=3.74
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="Library for manipulating kickstart files (dépendance Anaconda)"
|
|
||||||
arch=('any')
|
|
||||||
url="https://github.com/pykickstart/pykickstart"
|
|
||||||
license=('GPL-2.0-or-later')
|
|
||||||
depends=('python' 'python-requests')
|
|
||||||
_tag="r$pkgver"
|
|
||||||
source=("$pkgname-$pkgver.tar.gz::https://github.com/pykickstart/pykickstart/archive/refs/tags/$_tag.tar.gz")
|
|
||||||
sha256sums=('05b19c5af3453f90464428c418b0c79bbe0a87718d1db1812f9006ba151e5c63')
|
|
||||||
_srcdir="pykickstart-$_tag"
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$srcdir/$_srcdir"
|
|
||||||
local sitedir
|
|
||||||
sitedir=$(python -c 'import site; print(site.getsitepackages()[0])')
|
|
||||||
install -d "$pkgdir$sitedir"
|
|
||||||
cp -a pykickstart "$pkgdir$sitedir/pykickstart"
|
|
||||||
# -d : grave le chemin d'exécution réel dans les .pyc (pas le $pkgdir de build).
|
|
||||||
python -m compileall -q -d "$sitedir/pykickstart" "$pkgdir$sitedir/pykickstart" || true
|
|
||||||
install -Dm644 COPYING "$pkgdir/usr/share/licenses/$pkgname/COPYING"
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# Dépendance de l'installateur Anaconda (rhinstaller) — couche d'abstraction
|
|
||||||
# de gestion du stockage (partitions, LVM, LUKS, RAID).
|
|
||||||
#
|
|
||||||
# VENDORISÉ depuis l'AUR (python-blivet) avec DEUX modifications FWS :
|
|
||||||
#
|
|
||||||
# 1. 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 = False si absent), donc il fonctionne sans.
|
|
||||||
# Ç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'
|
|
||||||
_pkg="blivet"
|
|
||||||
pkgname="python-${_pkg}"
|
|
||||||
pkgver=3.13.2
|
|
||||||
_tag="${_pkg}-${pkgver}"
|
|
||||||
pkgrel=4
|
|
||||||
pkgdesc="A DBus service and python module for management of the system storage configuration (dépendance Anaconda)"
|
|
||||||
arch=('any')
|
|
||||||
license=('LGPL-2.1-only')
|
|
||||||
depends=(
|
|
||||||
'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'
|
|
||||||
'multipath-tools'
|
|
||||||
'parted'
|
|
||||||
"${_py}"
|
|
||||||
"${_py}-six"
|
|
||||||
"${_py}-pyparted"
|
|
||||||
"${_py}-pyudev"
|
|
||||||
"${_py}-gobject"
|
|
||||||
# blivet importe dasbus en dur (blivet/util.py: from dasbus.connection ...).
|
|
||||||
"${_py}-dasbus"
|
|
||||||
'systemd-libs'
|
|
||||||
'util-linux'
|
|
||||||
)
|
|
||||||
makedepends=("${_py}-setuptools")
|
|
||||||
url='https://github.com/storaged-project/blivet'
|
|
||||||
source=("${pkgname}-${pkgver}.tar.gz::https://github.com/storaged-project/${_pkg}/archive/${_pkg}-${pkgver}.tar.gz")
|
|
||||||
sha512sums=('6142ee7e25416c13d751bffab22ba287895e256611254fb87652f1005d6303df50cb116683552bbbad28b818a515e6a20f7073d313e024996a99b449c29132bf')
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "${srcdir}/${_pkg}-${_tag}"
|
|
||||||
"${_py}" setup.py install --root="${pkgdir}" --optimize=1
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# ============================================================================
|
|
||||||
# python-crypt_r — réintroduit le module `crypt` (et son alias moderne
|
|
||||||
# `crypt_r`) retiré de Python 3.13 (PEP 594). Arch est en Python 3.14.
|
|
||||||
#
|
|
||||||
# POURQUOI (dépendance Anaconda) : pyanaconda/core/users.py fait
|
|
||||||
# import crypt_r (ligne 41) → sinon fallback :
|
|
||||||
# import crypt as crypt_r (ligne 44)
|
|
||||||
# Les DEUX échouent sur Python ≥ 3.13 → « ModuleNotFoundError: crypt_r »
|
|
||||||
# puis « crypt » → Anaconda plante au chargement (hash des mots de passe
|
|
||||||
# root/utilisateur à l'install). Ce paquet PyPI (maintenu par fedora-python,
|
|
||||||
# les mêmes que legacy-cgi) fournit les modules `crypt_r` ET `crypt` via une
|
|
||||||
# extension C qui enrobe crypt_r(3) de libxcrypt.
|
|
||||||
#
|
|
||||||
# Paquet absent d'Arch officiel ET de l'AUR → packagé maison pour FWS.
|
|
||||||
# ============================================================================
|
|
||||||
pkgname=python-crypt_r
|
|
||||||
_pyname=crypt_r
|
|
||||||
pkgver=3.13.1
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="The crypt module removed from Python 3.13 (PEP 594), as crypt_r + crypt (dépendance Anaconda)"
|
|
||||||
arch=('x86_64')
|
|
||||||
url="https://github.com/fedora-python/crypt_r"
|
|
||||||
license=('PSF-2.0')
|
|
||||||
depends=('python' 'libxcrypt')
|
|
||||||
makedepends=('python-setuptools' 'python-build' 'python-installer' 'python-wheel')
|
|
||||||
source=("$pkgname-$pkgver.tar.gz::https://files.pythonhosted.org/packages/source/c/${_pyname}/${_pyname}-${pkgver}.tar.gz")
|
|
||||||
sha256sums=('5bd46ad51f5b7fe5f0ecf49d8ba2cafd6fbd43aa3bb5efbcaa6b44df6340c1a6')
|
|
||||||
|
|
||||||
build() {
|
|
||||||
cd "$srcdir/${_pyname}-${pkgver}"
|
|
||||||
python -m build --wheel --no-isolation
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$srcdir/${_pyname}-${pkgver}"
|
|
||||||
python -m installer --destdir="$pkgdir" dist/*.whl
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# ============================================================================
|
|
||||||
# python-iso639 — bibliothèque ISO 639 (langues) pour Anaconda.
|
|
||||||
#
|
|
||||||
# ⚠️ IL Y A PLUSIEURS PROJETS PyPI HOMONYMES « iso639 » avec des API
|
|
||||||
# INCOMPATIBLES. Anaconda (pyanaconda/localization.py) utilise les
|
|
||||||
# FONCTIONS DE MODULE :
|
|
||||||
# iso639.find(iso639_2=...) et iso639.to_name(...)
|
|
||||||
# → c'est le projet PyPI « iso639 » (SANS tiret), version 0.1.4, MIT.
|
|
||||||
#
|
|
||||||
# Le paquet AUR « python-iso639 » fournit un AUTRE projet (API
|
|
||||||
# Iso639/languages, PAS de find()) → « AttributeError: module 'iso639'
|
|
||||||
# has no attribute 'find' » et le module DBus Localization d'Anaconda
|
|
||||||
# sort en status 1. On le RETIRE donc de setup-aur.sh AUR_PACKAGES et on
|
|
||||||
# le remplace par CE paquet local (même nom → satisfait la dép anaconda).
|
|
||||||
# Idem « iso-639 » (avec tiret, noumar) : API languages.get(), pas find().
|
|
||||||
# ============================================================================
|
|
||||||
pkgname=python-iso639
|
|
||||||
pkgver=0.1.4
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="ISO 639 library with find()/to_name() module API (dépendance Anaconda Localization)"
|
|
||||||
arch=('any')
|
|
||||||
url="https://pypi.org/project/iso639/"
|
|
||||||
license=('MIT')
|
|
||||||
depends=('python')
|
|
||||||
makedepends=('python-build' 'python-installer' 'python-wheel' 'python-setuptools')
|
|
||||||
source=("$pkgname-$pkgver.tar.gz::https://files.pythonhosted.org/packages/source/i/iso639/iso639-$pkgver.tar.gz")
|
|
||||||
sha256sums=('88b70cf6c64ee9c2c2972292818c8beb32db9ea6f4de1f8471a9b081a3d92e98')
|
|
||||||
|
|
||||||
build() {
|
|
||||||
cd "$srcdir/iso639-$pkgver"
|
|
||||||
python -m build --wheel --no-isolation
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$srcdir/iso639-$pkgver"
|
|
||||||
python -m installer --destdir="$pkgdir" dist/*.whl
|
|
||||||
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# ============================================================================
|
|
||||||
# python-langtable — tables de langues/locales/claviers (dépendance Anaconda).
|
|
||||||
#
|
|
||||||
# ⚠️ L'AUR python-langtable est figé à 0.0.51, TROP VIEUX pour Anaconda 45.8 :
|
|
||||||
# le spoke d'accueil GUI fait localization.get_common_languages() →
|
|
||||||
# langtable.list_common_languages(), fonction ajoutée seulement en
|
|
||||||
# langtable 0.0.71 (« derived from gnome-control-center »). Avec 0.0.51 :
|
|
||||||
# « AttributeError: module 'langtable' has no attribute
|
|
||||||
# 'list_common_languages' » → le GUI plante au démarrage.
|
|
||||||
#
|
|
||||||
# On package donc 0.0.71 en LOCAL (même nom → satisfait la dép anaconda) et
|
|
||||||
# on RETIRE python-langtable de setup-aur.sh AUR_PACKAGES.
|
|
||||||
# ============================================================================
|
|
||||||
pkgname=python-langtable
|
|
||||||
_pyname=langtable
|
|
||||||
pkgver=0.0.71
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="Guessing reasonable defaults for locale/keyboard/territory/language (dépendance Anaconda)"
|
|
||||||
arch=('any')
|
|
||||||
url="https://github.com/mike-fabian/langtable"
|
|
||||||
license=('GPL-3.0-or-later' 'MIT')
|
|
||||||
depends=('python' 'python-setuptools' 'gzip')
|
|
||||||
makedepends=('python-build' 'python-installer' 'python-wheel' 'python-setuptools')
|
|
||||||
source=("$pkgname-$pkgver.tar.gz::https://files.pythonhosted.org/packages/source/l/langtable/langtable-$pkgver.tar.gz")
|
|
||||||
sha256sums=('f9d39c06d5182ea14eb4576bf1da8875af1d44efb166e55d6865b3b59b8ac617')
|
|
||||||
|
|
||||||
build() {
|
|
||||||
cd "$srcdir/langtable-$pkgver"
|
|
||||||
python -m build --wheel --no-isolation
|
|
||||||
}
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$srcdir/langtable-$pkgver"
|
|
||||||
python -m installer --destdir="$pkgdir" dist/*.whl
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Maintainer: FWS
|
|
||||||
# Dépendance de l'installateur Anaconda (rhinstaller) — gestion d'exceptions.
|
|
||||||
# setup.py amont = distutils + `setup.py install` : tous deux supprimés
|
|
||||||
# (Python 3.12+, setuptools 80+). Le paquet étant du pur Python, on installe
|
|
||||||
# l'arborescence à la main plutôt que de patcher la chaîne distutils.
|
|
||||||
pkgname=python-meh
|
|
||||||
pkgver=0.43
|
|
||||||
pkgrel=1
|
|
||||||
pkgdesc="Python exception handling library (dépendance Anaconda)"
|
|
||||||
arch=('any')
|
|
||||||
url="https://github.com/rhinstaller/python-meh"
|
|
||||||
license=('GPL-2.0-or-later')
|
|
||||||
depends=('python' 'python-gobject' 'python-dbus' 'libreport')
|
|
||||||
_tag="r$pkgver-1"
|
|
||||||
source=("$pkgname-$pkgver.tar.gz::https://github.com/rhinstaller/python-meh/archive/refs/tags/$_tag.tar.gz")
|
|
||||||
sha256sums=('cd50301794ab68a064715f1ace960f6de07aea809aa85f73087d44573c98be52')
|
|
||||||
_srcdir="python-meh-$_tag"
|
|
||||||
|
|
||||||
package() {
|
|
||||||
cd "$srcdir/$_srcdir"
|
|
||||||
local sitedir
|
|
||||||
sitedir=$(python -c 'import site; print(site.getsitepackages()[0])')
|
|
||||||
install -d "$pkgdir$sitedir"
|
|
||||||
cp -a meh "$pkgdir$sitedir/meh"
|
|
||||||
# -d : grave le chemin d'exécution réel dans les .pyc (pas le $pkgdir de build).
|
|
||||||
python -m compileall -q -d "$sitedir/meh" "$pkgdir$sitedir/meh" || true
|
|
||||||
install -Dm644 ui/exception-dialog.glade -t "$pkgdir/usr/share/python-meh/"
|
|
||||||
install -Dm644 COPYING "$pkgdir/usr/share/licenses/$pkgname/COPYING"
|
|
||||||
}
|
|
||||||
@@ -1,898 +0,0 @@
|
|||||||
format = 2
|
|
||||||
pkgname = python-meh
|
|
||||||
pkgbase = python-meh
|
|
||||||
pkgver = 0.43-1
|
|
||||||
pkgarch = any
|
|
||||||
pkgbuild_sha256sum = 207bd70c0f151083b8194b40534aeed665c9af48e588230ad370757eb4368229
|
|
||||||
packager = Unknown Packager
|
|
||||||
builddate = 1781307281
|
|
||||||
builddir = /home/nocode/Files/FWS-ISO/pkgbuilds/python-meh
|
|
||||||
startdir = /home/nocode/Files/FWS-ISO/pkgbuilds/python-meh
|
|
||||||
buildtool = makepkg
|
|
||||||
buildtoolver = 7.1.0
|
|
||||||
buildenv = !distcc
|
|
||||||
buildenv = color
|
|
||||||
buildenv = !ccache
|
|
||||||
buildenv = check
|
|
||||||
buildenv = !sign
|
|
||||||
options = strip
|
|
||||||
options = docs
|
|
||||||
options = !libtool
|
|
||||||
options = !staticlibs
|
|
||||||
options = emptydirs
|
|
||||||
options = zipman
|
|
||||||
options = purge
|
|
||||||
options = debug
|
|
||||||
options = lto
|
|
||||||
installed = aardvark-dns-1.17.1-1-x86_64
|
|
||||||
installed = abseil-cpp-20260107.1-1-x86_64
|
|
||||||
installed = accountsservice-26.13.3-1-x86_64
|
|
||||||
installed = acl-2.3.2-2-x86_64
|
|
||||||
installed = adwaita-cursors-50.0-1-any
|
|
||||||
installed = adwaita-fonts-50.0-1-any
|
|
||||||
installed = adwaita-icon-theme-50.0-1-any
|
|
||||||
installed = adwaita-icon-theme-legacy-46.2-3-any
|
|
||||||
installed = alsa-card-profiles-1:1.6.6-1-x86_64
|
|
||||||
installed = alsa-lib-1.2.16-1-x86_64
|
|
||||||
installed = alsa-plugins-1:1.2.12-5-x86_64
|
|
||||||
installed = alsa-topology-conf-1.2.5.1-4-any
|
|
||||||
installed = alsa-ucm-conf-1.2.16-2-any
|
|
||||||
installed = aom-3.14.1-1-x86_64
|
|
||||||
installed = appstream-1.1.2-1-x86_64
|
|
||||||
installed = aquamarine-0.12.1-1-x86_64
|
|
||||||
installed = arch-install-scripts-31-1-any
|
|
||||||
installed = archiso-88-1-any
|
|
||||||
installed = archlinux-keyring-20260420-1-any
|
|
||||||
installed = argon2-20190702-6-x86_64
|
|
||||||
installed = at-spi2-core-2.60.4-1-x86_64
|
|
||||||
installed = atkmm-2.28.5-2-x86_64
|
|
||||||
installed = attr-2.5.2-2-x86_64
|
|
||||||
installed = audit-4.1.4-2-x86_64
|
|
||||||
installed = autoconf-2.73-1-any
|
|
||||||
installed = automake-1.18.1-1-any
|
|
||||||
installed = avahi-1:0.9rc4-1-x86_64
|
|
||||||
installed = base-3-3-any
|
|
||||||
installed = base-devel-1-2-any
|
|
||||||
installed = bash-5.3.15-1-x86_64
|
|
||||||
installed = bemoji-0.4.0-1-any
|
|
||||||
installed = binutils-2.46+r70+g155188ea10a7-1-x86_64
|
|
||||||
installed = bison-3.8.2-8-x86_64
|
|
||||||
installed = blas-3.12.1-2-x86_64
|
|
||||||
installed = bluez-libs-5.86-6-x86_64
|
|
||||||
installed = boost-libs-1.91.0-1-x86_64
|
|
||||||
installed = brightnessctl-0.5.1-3-x86_64
|
|
||||||
installed = brotli-1.2.0-1-x86_64
|
|
||||||
installed = bubblewrap-0.11.2-1-x86_64
|
|
||||||
installed = bzip2-1.0.8-6-x86_64
|
|
||||||
installed = c-ares-1.34.6-1-x86_64
|
|
||||||
installed = ca-certificates-20240618-1-any
|
|
||||||
installed = ca-certificates-mozilla-3.124-1-x86_64
|
|
||||||
installed = ca-certificates-utils-20240618-1-any
|
|
||||||
installed = cabextract-1.11-2-x86_64
|
|
||||||
installed = cairo-1.18.4-1-x86_64
|
|
||||||
installed = cairomm-1.14.6-1-x86_64
|
|
||||||
installed = cairomm-1.16-1.18.1-1-x86_64
|
|
||||||
installed = catatonit-0.2.1-2-x86_64
|
|
||||||
installed = cblas-3.12.1-2-x86_64
|
|
||||||
installed = cliphist-1:0.7.0-2-x86_64
|
|
||||||
installed = clucene-2.3.3.4-17-x86_64
|
|
||||||
installed = cmake-4.3.3-1-x86_64
|
|
||||||
installed = compiler-rt-22.1.6-1-x86_64
|
|
||||||
installed = composefs-1.0.8-1-x86_64
|
|
||||||
installed = conmon-1:2.2.1-1-x86_64
|
|
||||||
installed = containers-common-1:0.67.1-3-any
|
|
||||||
installed = coreutils-9.11-1-x86_64
|
|
||||||
installed = cpio-2.15-3-x86_64
|
|
||||||
installed = cppdap-1.58.0-3-x86_64
|
|
||||||
installed = cracklib-2.10.3-1-x86_64
|
|
||||||
installed = criu-4.2-3-x86_64
|
|
||||||
installed = crun-1.28-1-x86_64
|
|
||||||
installed = cryptsetup-2.8.6-1-x86_64
|
|
||||||
installed = curl-8.20.0-7-x86_64
|
|
||||||
installed = dav1d-1.5.3-1-x86_64
|
|
||||||
installed = db5.3-5.3.28-7-x86_64
|
|
||||||
installed = dbus-1.16.2-1-x86_64
|
|
||||||
installed = dbus-broker-37-3-x86_64
|
|
||||||
installed = dbus-broker-units-37-3-x86_64
|
|
||||||
installed = dbus-units-37-3-x86_64
|
|
||||||
installed = dconf-0.49.0-1-x86_64
|
|
||||||
installed = debugedit-5.3-1-x86_64
|
|
||||||
installed = default-cursors-3-1-any
|
|
||||||
installed = desktop-file-utils-0.28-1-x86_64
|
|
||||||
installed = device-mapper-2.03.41-1-x86_64
|
|
||||||
installed = diffutils-3.12-2-x86_64
|
|
||||||
installed = discord-1:1.0.142-1-x86_64
|
|
||||||
installed = dkms-3.4.1-1-any
|
|
||||||
installed = dos2unix-7.5.6-1-x86_64
|
|
||||||
installed = dosfstools-4.2-5-x86_64
|
|
||||||
installed = double-conversion-3.4.0-1-x86_64
|
|
||||||
installed = duktape-2.7.0-7-x86_64
|
|
||||||
installed = e2fsprogs-1.47.4-1-x86_64
|
|
||||||
installed = efibootmgr-18-4-x86_64
|
|
||||||
installed = efivar-39-2-x86_64
|
|
||||||
installed = egl-gbm-1.1.3-1-x86_64
|
|
||||||
installed = egl-wayland-4:1.1.21-1-x86_64
|
|
||||||
installed = egl-wayland2-1.0.1-1-x86_64
|
|
||||||
installed = egl-x11-1.0.5-1-x86_64
|
|
||||||
installed = eglexternalplatform-1.2.1-1-any
|
|
||||||
installed = electron41-41.7.2-1-x86_64
|
|
||||||
installed = elfutils-0.195-1-x86_64
|
|
||||||
installed = erofs-utils-1.9.1-1-x86_64
|
|
||||||
installed = exo-4.20.0-2-x86_64
|
|
||||||
installed = expat-2.8.1-1-x86_64
|
|
||||||
installed = extra-cmake-modules-6.26.0-1-any
|
|
||||||
installed = fakeroot-1:1.37.2-1-x86_64
|
|
||||||
installed = fcft-3.3.3-1-x86_64
|
|
||||||
installed = ffmpeg-2:8.1.1-2-x86_64
|
|
||||||
installed = fftw-3.3.11-1-x86_64
|
|
||||||
installed = file-5.48-1-x86_64
|
|
||||||
installed = filesystem-2025.10.12-1-any
|
|
||||||
installed = findutils-4.10.0-3-x86_64
|
|
||||||
installed = firefox-151.0.4-1-x86_64
|
|
||||||
installed = flac-1.5.0-1-x86_64
|
|
||||||
installed = flatpak-1:1.18.0-1-x86_64
|
|
||||||
installed = flex-2.6.4-6-x86_64
|
|
||||||
installed = fmt-12.1.0-2-x86_64
|
|
||||||
installed = fontconfig-2:2.18.1-1-x86_64
|
|
||||||
installed = freerdp-2:3.26.0-1-x86_64
|
|
||||||
installed = freetype2-2.14.3-1-x86_64
|
|
||||||
installed = fribidi-1.0.16-2-x86_64
|
|
||||||
installed = fuse-common-3.18.2-1-x86_64
|
|
||||||
installed = fuse2-2.9.9-5-x86_64
|
|
||||||
installed = fuse3-3.18.2-1-x86_64
|
|
||||||
installed = fuzzel-1.14.1-1-x86_64
|
|
||||||
installed = gawk-5.4.0-1-x86_64
|
|
||||||
installed = gc-8.2.12-1-x86_64
|
|
||||||
installed = gcc-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = gcr-3.41.2-2-x86_64
|
|
||||||
installed = gcr-4-4.4.0.1-1-x86_64
|
|
||||||
installed = gdb-17.2-1-x86_64
|
|
||||||
installed = gdb-common-17.2-1-x86_64
|
|
||||||
installed = gdbm-1.26-2-x86_64
|
|
||||||
installed = gdk-pixbuf2-2.44.6-2-x86_64
|
|
||||||
installed = gettext-1.0-2-x86_64
|
|
||||||
installed = giflib-6.1.3-1-x86_64
|
|
||||||
installed = git-2.54.0-1-x86_64
|
|
||||||
installed = glib-networking-1:2.80.1-1-x86_64
|
|
||||||
installed = glib2-2.88.1-1-x86_64
|
|
||||||
installed = glibc-2.43+r22+g8362e8ce10b2-2-x86_64
|
|
||||||
installed = glibmm-2.66.8-2-x86_64
|
|
||||||
installed = glibmm-2.68-2.88.0-2-x86_64
|
|
||||||
installed = glslang-1:1.4.350.0-1-x86_64
|
|
||||||
installed = glycin-2.1.1-1-x86_64
|
|
||||||
installed = gmp-6.3.0-3-x86_64
|
|
||||||
installed = gnome-themes-extra-1:3.28-1-any
|
|
||||||
installed = gnulib-l10n-20241231-1-any
|
|
||||||
installed = gnupg-2.4.9-1-x86_64
|
|
||||||
installed = gnutls-3.8.13-2-x86_64
|
|
||||||
installed = go-2:1.26.4-1-x86_64
|
|
||||||
installed = gobject-introspection-1.86.0-2-x86_64
|
|
||||||
installed = gobject-introspection-runtime-1.86.0-2-x86_64
|
|
||||||
installed = gparted-1.8.1-2-x86_64
|
|
||||||
installed = gperftools-2.18.1-1-x86_64
|
|
||||||
installed = gpgme-2.1.0-1-x86_64
|
|
||||||
installed = gpgmepp-2.1.0-1-x86_64
|
|
||||||
installed = gpm-1.20.7.r38.ge82d1a6-6-x86_64
|
|
||||||
installed = gpsd-3.27.5-1-x86_64
|
|
||||||
installed = gptfdisk-1.0.10-2-x86_64
|
|
||||||
installed = graphene-1.10.8-2-x86_64
|
|
||||||
installed = graphite-1:1.3.15-1-x86_64
|
|
||||||
installed = grep-3.12-2-x86_64
|
|
||||||
installed = grim-1.5.0-2-x86_64
|
|
||||||
installed = groff-1.24.1-1-x86_64
|
|
||||||
installed = grub-2:2.14-1-x86_64
|
|
||||||
installed = gsettings-desktop-schemas-50.1-1-any
|
|
||||||
installed = gsettings-system-schemas-50.1-1-any
|
|
||||||
installed = gsm-1.0.24-1-x86_64
|
|
||||||
installed = gssdp-1.6.5-1-x86_64
|
|
||||||
installed = gst-plugins-bad-libs-1.28.3-1-x86_64
|
|
||||||
installed = gst-plugins-base-libs-1.28.3-1-x86_64
|
|
||||||
installed = gstreamer-1.28.3-1-x86_64
|
|
||||||
installed = gtest-1.17.0-2-x86_64
|
|
||||||
installed = gtk-layer-shell-0.10.1-1-x86_64
|
|
||||||
installed = gtk-update-icon-cache-1:4.22.4-1-x86_64
|
|
||||||
installed = gtk3-1:3.24.52-1-x86_64
|
|
||||||
installed = gtk4-1:4.22.4-1-x86_64
|
|
||||||
installed = gtkmm-4.0-4.22.0-2-x86_64
|
|
||||||
installed = gtkmm3-3.24.11-1-x86_64
|
|
||||||
installed = guile-3.0.11-1-x86_64
|
|
||||||
installed = gupnp-1:1.6.10-1-x86_64
|
|
||||||
installed = gupnp-igd-1.6.0-2-x86_64
|
|
||||||
installed = gzip-1.14-2-x86_64
|
|
||||||
installed = harfbuzz-14.2.1-1-x86_64
|
|
||||||
installed = harfbuzz-icu-14.2.1-1-x86_64
|
|
||||||
installed = hicolor-icon-theme-0.18-1-any
|
|
||||||
installed = hidapi-0.15.0-1-x86_64
|
|
||||||
installed = highway-1.4.0-1-x86_64
|
|
||||||
installed = hunspell-1.7.3-1-x86_64
|
|
||||||
installed = hwdata-0.408-1-any
|
|
||||||
installed = hwloc-2.13.0-1-x86_64
|
|
||||||
installed = hyphen-2.8.9-1-x86_64
|
|
||||||
installed = hyprcursor-0.1.13-6-x86_64
|
|
||||||
installed = hyprgraphics-0.5.1-2-x86_64
|
|
||||||
installed = hypridle-0.1.7-9-x86_64
|
|
||||||
installed = hyprland-0.55.4-1-x86_64
|
|
||||||
installed = hyprland-guiutils-0.2.1-6-x86_64
|
|
||||||
installed = hyprland-qt-support-0.1.0-12-x86_64
|
|
||||||
installed = hyprlang-0.6.8-4-x86_64
|
|
||||||
installed = hyprlock-0.9.5-4-x86_64
|
|
||||||
installed = hyprpaper-0.8.4-2-x86_64
|
|
||||||
installed = hyprpicker-0.4.7-1-x86_64
|
|
||||||
installed = hyprpolkitagent-0.1.3-7-x86_64
|
|
||||||
installed = hyprshot-1.3.0-4-any
|
|
||||||
installed = hyprtoolkit-0.5.4-2-x86_64
|
|
||||||
installed = hyprutils-0.13.1-1-x86_64
|
|
||||||
installed = hyprwayland-scanner-0.4.6-1-x86_64
|
|
||||||
installed = hyprwire-0.3.1-2-x86_64
|
|
||||||
installed = iana-etc-20260530-1-any
|
|
||||||
installed = icu-78.3-1-x86_64
|
|
||||||
installed = imagemagick-7.1.2.25-1-x86_64
|
|
||||||
installed = iniparser-4.2.6-2-x86_64
|
|
||||||
installed = iproute2-7.0.0-1-x86_64
|
|
||||||
installed = iptables-1:1.8.13-1-x86_64
|
|
||||||
installed = iputils-20250605-1-x86_64
|
|
||||||
installed = iso-codes-4.20.1-1-any
|
|
||||||
installed = jack2-1.9.22-2-x86_64
|
|
||||||
installed = jansson-2.15.0-1-x86_64
|
|
||||||
installed = jbigkit-2.1-8-x86_64
|
|
||||||
installed = jq-1.8.1-3-x86_64
|
|
||||||
installed = json-c-0.18-2-x86_64
|
|
||||||
installed = json-glib-1.10.8-1-x86_64
|
|
||||||
installed = jsoncpp-1.9.6-3-x86_64
|
|
||||||
installed = kbd-2.10.0-1-x86_64
|
|
||||||
installed = kcoreaddons-6.26.0-1-x86_64
|
|
||||||
installed = keyutils-1.6.3-4-x86_64
|
|
||||||
installed = ki18n-6.26.0-1-x86_64
|
|
||||||
installed = kitty-0.47.1-1-x86_64
|
|
||||||
installed = kitty-shell-integration-0.47.1-1-x86_64
|
|
||||||
installed = kitty-terminfo-0.47.1-1-x86_64
|
|
||||||
installed = kmod-34.2-1-x86_64
|
|
||||||
installed = kpmcore-26.04.2-1-x86_64
|
|
||||||
installed = krb5-1.22.2-1-x86_64
|
|
||||||
installed = kwidgetsaddons-6.26.0-1-x86_64
|
|
||||||
installed = l-smash-2.14.5-4-x86_64
|
|
||||||
installed = lame-3.101.r6531-1-x86_64
|
|
||||||
installed = lapack-3.12.1-2-x86_64
|
|
||||||
installed = lcms2-2.19.1-1-x86_64
|
|
||||||
installed = leancrypto-1.7.2-1-x86_64
|
|
||||||
installed = lib32-alsa-lib-1.2.16-1-x86_64
|
|
||||||
installed = lib32-alsa-plugins-1.2.12-1-x86_64
|
|
||||||
installed = lib32-brotli-1.1.0-1-x86_64
|
|
||||||
installed = lib32-bzip2-1.0.8-4-x86_64
|
|
||||||
installed = lib32-curl-8.20.0-7-x86_64
|
|
||||||
installed = lib32-dbus-1.16.2-1-x86_64
|
|
||||||
installed = lib32-e2fsprogs-1.47.4-1-x86_64
|
|
||||||
installed = lib32-expat-2.8.1-1-x86_64
|
|
||||||
installed = lib32-fontconfig-2:2.18.1-1-x86_64
|
|
||||||
installed = lib32-freetype2-2.14.3-1-x86_64
|
|
||||||
installed = lib32-gcc-libs-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = lib32-glib2-2.88.1-1-x86_64
|
|
||||||
installed = lib32-glibc-2.43+r22+g8362e8ce10b2-2-x86_64
|
|
||||||
installed = lib32-gmp-6.3.0-2-x86_64
|
|
||||||
installed = lib32-gnutls-3.8.13-3-x86_64
|
|
||||||
installed = lib32-icu-78.3-1-x86_64
|
|
||||||
installed = lib32-json-c-0.18-2-x86_64
|
|
||||||
installed = lib32-keyutils-1.6.3-4-x86_64
|
|
||||||
installed = lib32-krb5-1.22.2-1-x86_64
|
|
||||||
installed = lib32-libdrm-2.4.134-1-x86_64
|
|
||||||
installed = lib32-libelf-0.195-1-x86_64
|
|
||||||
installed = lib32-libffi-3.5.2-1-x86_64
|
|
||||||
installed = lib32-libgcrypt-1.12.2-1-x86_64
|
|
||||||
installed = lib32-libglvnd-1.7.0-1-x86_64
|
|
||||||
installed = lib32-libgpg-error-1.61-1-x86_64
|
|
||||||
installed = lib32-libidn2-2.3.8-1-x86_64
|
|
||||||
installed = lib32-libldap-2.6.13-1-x86_64
|
|
||||||
installed = lib32-libnghttp2-1.69.0-1-x86_64
|
|
||||||
installed = lib32-libnghttp3-1.16.0-1-x86_64
|
|
||||||
installed = lib32-libngtcp2-1.23.0-1-x86_64
|
|
||||||
installed = lib32-libnm-1.56.1-1-x86_64
|
|
||||||
installed = lib32-libpciaccess-0.19-1-x86_64
|
|
||||||
installed = lib32-libpipewire-1:1.6.6-1-x86_64
|
|
||||||
installed = lib32-libpng-1.6.58-1-x86_64
|
|
||||||
installed = lib32-libpsl-0.21.5-1-x86_64
|
|
||||||
installed = lib32-libssh2-1.11.1-1-x86_64
|
|
||||||
installed = lib32-libtasn1-4.21.0-1-x86_64
|
|
||||||
installed = lib32-libunistring-1.4.2-1-x86_64
|
|
||||||
installed = lib32-libva-2.22.0-1-x86_64
|
|
||||||
installed = lib32-libx11-1.8.13-1-x86_64
|
|
||||||
installed = lib32-libxau-1.0.12-1-x86_64
|
|
||||||
installed = lib32-libxcb-1.17.0-1-x86_64
|
|
||||||
installed = lib32-libxcrypt-4.5.2-1-x86_64
|
|
||||||
installed = lib32-libxcrypt-compat-4.5.2-1-x86_64
|
|
||||||
installed = lib32-libxdmcp-1.1.5-1-x86_64
|
|
||||||
installed = lib32-libxext-1.3.7-1-x86_64
|
|
||||||
installed = lib32-libxfixes-6.0.1-2-x86_64
|
|
||||||
installed = lib32-libxinerama-1.1.6-1-x86_64
|
|
||||||
installed = lib32-libxml2-2.15.3-1-x86_64
|
|
||||||
installed = lib32-libxshmfence-1.3.3-1-x86_64
|
|
||||||
installed = lib32-libxss-1.2.5-1-x86_64
|
|
||||||
installed = lib32-libxxf86vm-1.1.5-2-x86_64
|
|
||||||
installed = lib32-llvm-libs-1:22.1.6-1-x86_64
|
|
||||||
installed = lib32-lm_sensors-1:3.6.2-2-x86_64
|
|
||||||
installed = lib32-mesa-1:26.1.2-1-x86_64
|
|
||||||
installed = lib32-ncurses-6.6-2-x86_64
|
|
||||||
installed = lib32-nettle-4.0-2-x86_64
|
|
||||||
installed = lib32-nspr-4.39-1-x86_64
|
|
||||||
installed = lib32-nss-3.124-1-x86_64
|
|
||||||
installed = lib32-nvidia-utils-610.43.02-1-x86_64
|
|
||||||
installed = lib32-openssl-1:3.6.3-1-x86_64
|
|
||||||
installed = lib32-p11-kit-0.26.2-1-x86_64
|
|
||||||
installed = lib32-pcre2-10.47-1-x86_64
|
|
||||||
installed = lib32-pipewire-1:1.6.6-1-x86_64
|
|
||||||
installed = lib32-spirv-tools-1:1.4.350.0-1-x86_64
|
|
||||||
installed = lib32-sqlite-3.53.2-1-x86_64
|
|
||||||
installed = lib32-systemd-260.2-1-x86_64
|
|
||||||
installed = lib32-util-linux-2.42.1-1-x86_64
|
|
||||||
installed = lib32-vulkan-icd-loader-1.4.350.0-1-x86_64
|
|
||||||
installed = lib32-wayland-1.25.0-1-x86_64
|
|
||||||
installed = lib32-xz-5.8.3-1-x86_64
|
|
||||||
installed = lib32-zlib-1.3.2-1-x86_64
|
|
||||||
installed = lib32-zstd-1.5.7-2-x86_64
|
|
||||||
installed = libabw-0.1.4-1-x86_64
|
|
||||||
installed = libadwaita-1:1.9.1-1-x86_64
|
|
||||||
installed = libaio-0.3.113-4-x86_64
|
|
||||||
installed = libappindicator-12.10.1-1-x86_64
|
|
||||||
installed = libarchive-3.8.7-1-x86_64
|
|
||||||
installed = libasan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libass-0.17.4-2-x86_64
|
|
||||||
installed = libassuan-3.0.0-1-x86_64
|
|
||||||
installed = libasyncns-1:0.8+r3+g68cd5af-3-x86_64
|
|
||||||
installed = libatomic-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libatomic_ops-7.8.2-2-x86_64
|
|
||||||
installed = libavc1394-0.5.4-7-x86_64
|
|
||||||
installed = libavif-1.4.2-1-x86_64
|
|
||||||
installed = libb2-0.98.1-3-x86_64
|
|
||||||
installed = libblake3-1.8.4-1-x86_64
|
|
||||||
installed = libbluray-1.4.1-1-x86_64
|
|
||||||
installed = libbpf-1.7.0-1-x86_64
|
|
||||||
installed = libbs2b-3.1.0-10-x86_64
|
|
||||||
installed = libbsd-0.12.2-2-x86_64
|
|
||||||
installed = libburn-1.5.8-1-x86_64
|
|
||||||
installed = libcanberra-1:0.30+r2+gc0620e4-6-x86_64
|
|
||||||
installed = libcap-2.78-1-x86_64
|
|
||||||
installed = libcap-ng-0.9.3-1-x86_64
|
|
||||||
installed = libcbor-0.14.0-1-x86_64
|
|
||||||
installed = libcdio-2.3.0-1-x86_64
|
|
||||||
installed = libcdio-paranoia-10.2+2.0.2-2-x86_64
|
|
||||||
installed = libcdr-0.1.9-1-x86_64
|
|
||||||
installed = libcloudproviders-0.4.0-1-x86_64
|
|
||||||
installed = libcmis-0.6.3-1-x86_64
|
|
||||||
installed = libcolord-1.4.8-1-x86_64
|
|
||||||
installed = libcups-2:2.4.19-1-x86_64
|
|
||||||
installed = libdaemon-0.14-6-x86_64
|
|
||||||
installed = libdatrie-0.2.14-1-x86_64
|
|
||||||
installed = libdbusmenu-glib-18.10.20180917-1-x86_64
|
|
||||||
installed = libdbusmenu-gtk3-18.10.20180917-1-x86_64
|
|
||||||
installed = libdecor-0.2.5-1-x86_64
|
|
||||||
installed = libdeflate-1.25-1-x86_64
|
|
||||||
installed = libdisplay-info-0.3.0-1-x86_64
|
|
||||||
installed = libdovi-3.3.2-1-x86_64
|
|
||||||
installed = libdrm-2.4.134-1-x86_64
|
|
||||||
installed = libdvdnav-7.0.0-1-x86_64
|
|
||||||
installed = libdvdread-7.0.1-1-x86_64
|
|
||||||
installed = libe-book-0.1.3-20-x86_64
|
|
||||||
installed = libebur128-1.2.6-2-x86_64
|
|
||||||
installed = libedit-20260512_3.1-1-x86_64
|
|
||||||
installed = libei-1.6.0-1-x86_64
|
|
||||||
installed = libelf-0.195-1-x86_64
|
|
||||||
installed = libepoxy-1.5.10-3-x86_64
|
|
||||||
installed = libepubgen-0.1.1-6-x86_64
|
|
||||||
installed = libetonyek-0.1.13-2-x86_64
|
|
||||||
installed = libevdev-1.13.6-1-x86_64
|
|
||||||
installed = libevent-2.1.12-5-x86_64
|
|
||||||
installed = libexif-0.6.26-1-x86_64
|
|
||||||
installed = libexttextcat-3.4.8-1-x86_64
|
|
||||||
installed = libfdk-aac-2.0.3-2-x86_64
|
|
||||||
installed = libffi-3.5.2-1-x86_64
|
|
||||||
installed = libfido2-1.17.0-1-x86_64
|
|
||||||
installed = libfontenc-1.1.9-1-x86_64
|
|
||||||
installed = libfreeaptx-0.2.2-1-x86_64
|
|
||||||
installed = libfreehand-0.1.3-1-x86_64
|
|
||||||
installed = libfyaml-0.9.6-2-x86_64
|
|
||||||
installed = libgcc-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libgcrypt-1.12.2-1-x86_64
|
|
||||||
installed = libgfortran-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libgirepository-1.86.0-2-x86_64
|
|
||||||
installed = libgit2-1:1.9.4-1-x86_64
|
|
||||||
installed = libglvnd-1.7.0-3-x86_64
|
|
||||||
installed = libgomp-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libgpg-error-1.61-1-x86_64
|
|
||||||
installed = libgtop-2.41.3-2-x86_64
|
|
||||||
installed = libgudev-238-3-x86_64
|
|
||||||
installed = libice-1.1.2-1-x86_64
|
|
||||||
installed = libidn2-2.3.8-1-x86_64
|
|
||||||
installed = libiec61883-1.2.0-9-x86_64
|
|
||||||
installed = libimobiledevice-1.4.0-2-x86_64
|
|
||||||
installed = libimobiledevice-glue-1.3.2-1-x86_64
|
|
||||||
installed = libinih-62-2-x86_64
|
|
||||||
installed = libinput-1.31.3-1-x86_64
|
|
||||||
installed = libisl-0.27-1-x86_64
|
|
||||||
installed = libisoburn-1.5.8.2-1-x86_64
|
|
||||||
installed = libisofs-1.5.8.2-1-x86_64
|
|
||||||
installed = libixion-0.20.0-7-x86_64
|
|
||||||
installed = libjpeg-turbo-3.1.4.1-1-x86_64
|
|
||||||
installed = libjxl-0.11.2-2-x86_64
|
|
||||||
installed = libksba-1.8.0-1-x86_64
|
|
||||||
installed = liblangtag-0.6.8-1-x86_64
|
|
||||||
installed = liblc3-1.1.3-2-x86_64
|
|
||||||
installed = libldac-2.0.2.3-3-x86_64
|
|
||||||
installed = libldap-2.6.13-1-x86_64
|
|
||||||
installed = liblqr-0.4.3-1-x86_64
|
|
||||||
installed = liblsan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libmakepkg-dropins-20-1-any
|
|
||||||
installed = libmalcontent-0.14.0-4-x86_64
|
|
||||||
installed = libmd-1.2.0-1-x86_64
|
|
||||||
installed = libmm-glib-1.24.2-1-x86_64
|
|
||||||
installed = libmnl-1.0.5-2-x86_64
|
|
||||||
installed = libmodplug-0.8.9.0-7-x86_64
|
|
||||||
installed = libmpc-1.4.1-1-x86_64
|
|
||||||
installed = libmpdclient-2.23-1-x86_64
|
|
||||||
installed = libmspub-0.1.5-1-x86_64
|
|
||||||
installed = libmwaw-0.3.22-4-x86_64
|
|
||||||
installed = libmysofa-1.3.4-1-x86_64
|
|
||||||
installed = libndp-1.9-1-x86_64
|
|
||||||
installed = libnet-2:1.3-2-x86_64
|
|
||||||
installed = libnetfilter_conntrack-1.1.1-1-x86_64
|
|
||||||
installed = libnewt-0.52.25-2-x86_64
|
|
||||||
installed = libnfnetlink-1.0.2-2-x86_64
|
|
||||||
installed = libnftnl-1.3.1-1-x86_64
|
|
||||||
installed = libnghttp2-1.69.0-1-x86_64
|
|
||||||
installed = libnghttp3-1.16.0-1-x86_64
|
|
||||||
installed = libngtcp2-1.23.0-1-x86_64
|
|
||||||
installed = libnice-0.1.23-1-x86_64
|
|
||||||
installed = libnl-3.12.0-1-x86_64
|
|
||||||
installed = libnm-1.56.1-1-x86_64
|
|
||||||
installed = libnma-1.10.6-3-x86_64
|
|
||||||
installed = libnma-common-1.10.6-3-x86_64
|
|
||||||
installed = libnotify-0.8.8-1-x86_64
|
|
||||||
installed = libnsl-2.0.1-2-x86_64
|
|
||||||
installed = libnumbertext-1.0.11-3-x86_64
|
|
||||||
installed = libobjc-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libodfgen-0.1.8-5-x86_64
|
|
||||||
installed = libogg-1.3.6-1-x86_64
|
|
||||||
installed = libopenmpt-0.8.7-1-x86_64
|
|
||||||
installed = libopenrazer-0.4.0-1-x86_64
|
|
||||||
installed = liborcus-0.21.0-6-x86_64
|
|
||||||
installed = libp11-kit-0.26.2-1-x86_64
|
|
||||||
installed = libpagemaker-0.0.4-5-x86_64
|
|
||||||
installed = libpcap-1.10.6-1-x86_64
|
|
||||||
installed = libpciaccess-0.19-1-x86_64
|
|
||||||
installed = libpgm-5.3.128-4-x86_64
|
|
||||||
installed = libpipewire-1:1.6.6-1-x86_64
|
|
||||||
installed = libplacebo-7.360.1-2-x86_64
|
|
||||||
installed = libplist-2.7.0-3-x86_64
|
|
||||||
installed = libpng-1.6.58-1-x86_64
|
|
||||||
installed = libproxy-0.5.12-1-x86_64
|
|
||||||
installed = libpsl-0.21.5-2-x86_64
|
|
||||||
installed = libpulse-17.0+r98+gb096704c0-1-x86_64
|
|
||||||
installed = libpwquality-1.4.5-7-x86_64
|
|
||||||
installed = libquadmath-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libqxp-0.0.3-1-x86_64
|
|
||||||
installed = libraqm-0.10.5-1-x86_64
|
|
||||||
installed = libraw1394-2.1.2-4-x86_64
|
|
||||||
installed = libreoffice-fresh-26.2.4-1-x86_64
|
|
||||||
installed = librevenge-0.0.5-4-x86_64
|
|
||||||
installed = librsvg-2:2.62.3-1-x86_64
|
|
||||||
installed = librsync-1:2.3.4-2-x86_64
|
|
||||||
installed = libsamplerate-0.2.2-3-x86_64
|
|
||||||
installed = libsasl-2.1.28-5-x86_64
|
|
||||||
installed = libseccomp-2.6.0-1-x86_64
|
|
||||||
installed = libsecret-0.21.7-1-x86_64
|
|
||||||
installed = libsigc++-2.12.2-1-x86_64
|
|
||||||
installed = libsigc++-3.0-3.8.1-1-x86_64
|
|
||||||
installed = libsixel-1.10.5-1-x86_64
|
|
||||||
installed = libsm-1.2.6-1-x86_64
|
|
||||||
installed = libsndfile-1.2.2-4-x86_64
|
|
||||||
installed = libsodium-1.0.22-1-x86_64
|
|
||||||
installed = libsoup3-3.6.6-2-x86_64
|
|
||||||
installed = libsoxr-0.1.3-4-x86_64
|
|
||||||
installed = libssh-0.12.0-1-x86_64
|
|
||||||
installed = libssh2-1.11.1-1-x86_64
|
|
||||||
installed = libstaroffice-0.0.7-5-x86_64
|
|
||||||
installed = libstdc++-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libstemmer-3.1.1-1-x86_64
|
|
||||||
installed = libsysprof-capture-50.0-2-x86_64
|
|
||||||
installed = libtasn1-4.21.0-1-x86_64
|
|
||||||
installed = libtatsu-1.0.5-1-x86_64
|
|
||||||
installed = libteam-1.32-3-x86_64
|
|
||||||
installed = libthai-0.1.30-1-x86_64
|
|
||||||
installed = libtheora-1.2.0-1-x86_64
|
|
||||||
installed = libtiff-4.7.1-2-x86_64
|
|
||||||
installed = libtirpc-1.3.7-1-x86_64
|
|
||||||
installed = libtommath-1.3.0-2-x86_64
|
|
||||||
installed = libtool-2.6.1-1-x86_64
|
|
||||||
installed = libtsan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libubsan-16.1.1+r12+g301eb08fa2c5-1-x86_64
|
|
||||||
installed = libunibreak-7.0-1-x86_64
|
|
||||||
installed = libunistring-1.4.2-1-x86_64
|
|
||||||
installed = libunwind-1.8.2-1-x86_64
|
|
||||||
installed = liburing-2.14-1-x86_64
|
|
||||||
installed = libusb-1.0.30-1-x86_64
|
|
||||||
installed = libusbmuxd-2.1.1-2-x86_64
|
|
||||||
installed = libutf8proc-2.11.3-1-x86_64
|
|
||||||
installed = libuv-1.52.1-1-x86_64
|
|
||||||
installed = libva-2.23.0-1-x86_64
|
|
||||||
installed = libva-nvidia-driver-0.0.17-1-x86_64
|
|
||||||
installed = libvdpau-1.5-4-x86_64
|
|
||||||
installed = libverto-0.3.2-6-x86_64
|
|
||||||
installed = libvisio-0.1.11-1-x86_64
|
|
||||||
installed = libvorbis-1.3.7-4-x86_64
|
|
||||||
installed = libvpl-2.16.0-2-x86_64
|
|
||||||
installed = libvpx-1.16.0-3-x86_64
|
|
||||||
installed = libwacom-2.19.0-1-x86_64
|
|
||||||
installed = libwebp-1.6.0-2-x86_64
|
|
||||||
installed = libwireplumber-0.5.14-1-x86_64
|
|
||||||
installed = libwpd-0.10.3-6-x86_64
|
|
||||||
installed = libwps-0.4.14-4-x86_64
|
|
||||||
installed = libx11-1.8.13-1-x86_64
|
|
||||||
installed = libxau-1.0.12-1-x86_64
|
|
||||||
installed = libxcb-1.17.0-1-x86_64
|
|
||||||
installed = libxcomposite-0.4.7-1-x86_64
|
|
||||||
installed = libxcrypt-4.5.2-1-x86_64
|
|
||||||
installed = libxcrypt-compat-4.5.2-1-x86_64
|
|
||||||
installed = libxcursor-1.2.3-1-x86_64
|
|
||||||
installed = libxcvt-0.1.3-1-x86_64
|
|
||||||
installed = libxdamage-1.1.7-1-x86_64
|
|
||||||
installed = libxdmcp-1.1.5-2-x86_64
|
|
||||||
installed = libxext-1.3.7-1-x86_64
|
|
||||||
installed = libxfce4ui-4.20.2-1-x86_64
|
|
||||||
installed = libxfce4util-4.20.1-1-x86_64
|
|
||||||
installed = libxfixes-6.0.2-1-x86_64
|
|
||||||
installed = libxfont2-2.0.7-1-x86_64
|
|
||||||
installed = libxft-2.3.9-1-x86_64
|
|
||||||
installed = libxi-1.8.3-1-x86_64
|
|
||||||
installed = libxinerama-1.1.6-1-x86_64
|
|
||||||
installed = libxkbcommon-1.13.2-1-x86_64
|
|
||||||
installed = libxkbcommon-x11-1.13.2-1-x86_64
|
|
||||||
installed = libxkbfile-1.2.0-1-x86_64
|
|
||||||
installed = libxml2-2.15.3-1-x86_64
|
|
||||||
installed = libxml2-legacy-2.13.9-2-x86_64
|
|
||||||
installed = libxmlb-0.3.27-1-x86_64
|
|
||||||
installed = libxmp-4.7.0-1-x86_64
|
|
||||||
installed = libxmu-1.3.1-1-x86_64
|
|
||||||
installed = libxpresent-1.0.2-1-x86_64
|
|
||||||
installed = libxrandr-1.5.5-1-x86_64
|
|
||||||
installed = libxrender-0.9.12-1-x86_64
|
|
||||||
installed = libxshmfence-1.3.3-1-x86_64
|
|
||||||
installed = libxslt-1.1.45-2-x86_64
|
|
||||||
installed = libxss-1.2.5-1-x86_64
|
|
||||||
installed = libxt-1.3.1-1-x86_64
|
|
||||||
installed = libxtst-1.2.5-1-x86_64
|
|
||||||
installed = libxv-1.0.13-1-x86_64
|
|
||||||
installed = libxxf86vm-1.1.7-1-x86_64
|
|
||||||
installed = libyaml-0.2.5-3-x86_64
|
|
||||||
installed = libyuv-r2426+464c51a03-1-x86_64
|
|
||||||
installed = libzip-1.11.4-1-x86_64
|
|
||||||
installed = libzmf-0.0.2-20-x86_64
|
|
||||||
installed = licenses-20240728-1-any
|
|
||||||
installed = lilv-0.26.4-1-x86_64
|
|
||||||
installed = linux-7.0.11.arch1-1-x86_64
|
|
||||||
installed = linux-api-headers-7.0-1-x86_64
|
|
||||||
installed = linux-firmware-20260519-1-any
|
|
||||||
installed = linux-firmware-amdgpu-20260519-1-any
|
|
||||||
installed = linux-firmware-atheros-20260519-1-any
|
|
||||||
installed = linux-firmware-broadcom-20260519-1-any
|
|
||||||
installed = linux-firmware-cirrus-20260519-1-any
|
|
||||||
installed = linux-firmware-intel-20260519-1-any
|
|
||||||
installed = linux-firmware-mediatek-20260519-1-any
|
|
||||||
installed = linux-firmware-nvidia-20260519-1-any
|
|
||||||
installed = linux-firmware-other-20260519-1-any
|
|
||||||
installed = linux-firmware-radeon-20260519-1-any
|
|
||||||
installed = linux-firmware-realtek-20260519-1-any
|
|
||||||
installed = linux-firmware-whence-20260519-1-any
|
|
||||||
installed = linux-headers-7.0.11.arch1-1-x86_64
|
|
||||||
installed = lld-22.1.6-1-x86_64
|
|
||||||
installed = llhttp-9.3.1-1-x86_64
|
|
||||||
installed = llvm-libs-22.1.6-1-x86_64
|
|
||||||
installed = lm_sensors-1:3.6.2-1-x86_64
|
|
||||||
installed = lmdb-0.9.35-1-x86_64
|
|
||||||
installed = lpsolve-5.5.2.14-1-x86_64
|
|
||||||
installed = lsb-release-2.0.r55.a25a4fc-1-any
|
|
||||||
installed = lsof-4.99.6-1-x86_64
|
|
||||||
installed = lua-5.5.0-2-x86_64
|
|
||||||
installed = lua54-5.4.8-6-x86_64
|
|
||||||
installed = luajit-2.1.1780076327+b925b3e-1-x86_64
|
|
||||||
installed = lug-helper-1:4.13-1-any
|
|
||||||
installed = lv2-1.18.10-2-x86_64
|
|
||||||
installed = lz4-1:1.10.0-2-x86_64
|
|
||||||
installed = lzo-2.10-5-x86_64
|
|
||||||
installed = m4-1.4.21-2-x86_64
|
|
||||||
installed = mailcap-2.1.54-2-any
|
|
||||||
installed = make-4.4.1-3-x86_64
|
|
||||||
installed = mako-1.11.0-1-x86_64
|
|
||||||
installed = md4c-0.5.3-1-x86_64
|
|
||||||
installed = mesa-1:26.1.2-1-x86_64
|
|
||||||
installed = meson-1.11.1-3-any
|
|
||||||
installed = mingw-w64-binutils-2.46.0-1-x86_64
|
|
||||||
installed = mingw-w64-crt-14.0.0-1-any
|
|
||||||
installed = mingw-w64-gcc-16.1.0-1-x86_64
|
|
||||||
installed = mingw-w64-headers-14.0.0-1-any
|
|
||||||
installed = mingw-w64-winpthreads-14.0.0-1-any
|
|
||||||
installed = minizip-1:1.3.2-3-x86_64
|
|
||||||
installed = mkinitcpio-41-4-any
|
|
||||||
installed = mkinitcpio-busybox-1.36.1-1-x86_64
|
|
||||||
installed = mobile-broadband-provider-info-20251101-1-any
|
|
||||||
installed = mpdecimal-4.0.1-3-x86_64
|
|
||||||
installed = mpfr-4.2.2-1-x86_64
|
|
||||||
installed = mpg123-1.33.5-1-x86_64
|
|
||||||
installed = mpv-1:0.41.0-3-x86_64
|
|
||||||
installed = mpvpaper-1.8-1-x86_64
|
|
||||||
installed = mtdev-1.1.7-1-x86_64
|
|
||||||
installed = mtools-1:4.0.49-1-x86_64
|
|
||||||
installed = mujs-1.3.9-1-x86_64
|
|
||||||
installed = muparser-2.3.5-2-x86_64
|
|
||||||
installed = nano-9.0-1-x86_64
|
|
||||||
installed = ncurses-6.6-2-x86_64
|
|
||||||
installed = neon-0.37.1-1-x86_64
|
|
||||||
installed = netavark-1.17.2-2-x86_64
|
|
||||||
installed = nettle-4.0-1-x86_64
|
|
||||||
installed = network-manager-applet-1.36.0-2-x86_64
|
|
||||||
installed = networkmanager-1.56.1-1-x86_64
|
|
||||||
installed = nftables-1:1.1.6-3-x86_64
|
|
||||||
installed = ninja-1.13.2-3-x86_64
|
|
||||||
installed = nm-connection-editor-1.36.0-2-x86_64
|
|
||||||
installed = noto-fonts-1:2026.06.01-1-any
|
|
||||||
installed = noto-fonts-cjk-20240730-1-any
|
|
||||||
installed = noto-fonts-emoji-1:2.051-1-any
|
|
||||||
installed = noto-fonts-extra-1:2026.06.01-1-any
|
|
||||||
installed = npth-1.8-1-x86_64
|
|
||||||
installed = nspr-4.39-1-x86_64
|
|
||||||
installed = nss-3.124-1-x86_64
|
|
||||||
installed = nvidia-open-610.43.02-2-x86_64
|
|
||||||
installed = nvidia-utils-610.43.02-2-x86_64
|
|
||||||
installed = ocl-icd-2.3.4-1-x86_64
|
|
||||||
installed = onetbb-2023.0.0-1-x86_64
|
|
||||||
installed = oniguruma-6.9.10-1-x86_64
|
|
||||||
installed = openal-1.25.2-1-x86_64
|
|
||||||
installed = opencore-amr-0.1.6-2-x86_64
|
|
||||||
installed = openjpeg2-2.5.4-1-x86_64
|
|
||||||
installed = openrazer-daemon-3.12.2-2-any
|
|
||||||
installed = openrazer-driver-dkms-3.12.2-2-any
|
|
||||||
installed = openssh-10.3p1-1-x86_64
|
|
||||||
installed = openssl-3.6.3-1-x86_64
|
|
||||||
installed = opus-1.6.1-1-x86_64
|
|
||||||
installed = opusfile-0.12-4-x86_64
|
|
||||||
installed = orc-0.4.42-1-x86_64
|
|
||||||
installed = os-prober-1.84-1-x86_64
|
|
||||||
installed = ostree-2025.7-3-x86_64
|
|
||||||
installed = p11-kit-0.26.2-1-x86_64
|
|
||||||
installed = pacman-7.1.0.r9.g54d9411-2-x86_64
|
|
||||||
installed = pacman-mirrorlist-20260610-1-any
|
|
||||||
installed = pahole-1:1.31-2-x86_64
|
|
||||||
installed = pam-1.7.2-2-x86_64
|
|
||||||
installed = pambase-20250719-1-any
|
|
||||||
installed = pango-1:1.57.1-1-x86_64
|
|
||||||
installed = pangomm-2.46.4-3-x86_64
|
|
||||||
installed = pangomm-2.48-2.56.1-2-x86_64
|
|
||||||
installed = papirus-icon-theme-20250501-1-any
|
|
||||||
installed = parted-3.7-1-x86_64
|
|
||||||
installed = paru-2.1.0-2-x86_64
|
|
||||||
installed = paru-debug-2.1.0-2-x86_64
|
|
||||||
installed = passt-2026_05_26.038c51e-1-x86_64
|
|
||||||
installed = patch-2.8-1-x86_64
|
|
||||||
installed = pavucontrol-1:6.2-1-x86_64
|
|
||||||
installed = pciutils-3.15.0-1-x86_64
|
|
||||||
installed = pcre-8.45-4-x86_64
|
|
||||||
installed = pcre2-10.47-1-x86_64
|
|
||||||
installed = pcsclite-2.5.1-1-x86_64
|
|
||||||
installed = perl-5.42.2-1-x86_64
|
|
||||||
installed = perl-error-0.17030-3-any
|
|
||||||
installed = perl-mailtools-2.22-3-any
|
|
||||||
installed = perl-timedate-2.35-1-any
|
|
||||||
installed = pinentry-1.3.2-2-x86_64
|
|
||||||
installed = pipewire-1:1.6.6-1-x86_64
|
|
||||||
installed = pipewire-audio-1:1.6.6-1-x86_64
|
|
||||||
installed = pipewire-pulse-1:1.6.6-1-x86_64
|
|
||||||
installed = pixman-0.46.4-1-x86_64
|
|
||||||
installed = pkgconf-2.5.1-1-x86_64
|
|
||||||
installed = playerctl-2.4.1-5-x86_64
|
|
||||||
installed = podman-5.8.3-1-x86_64
|
|
||||||
installed = podman-compose-1.6.0-1-any
|
|
||||||
installed = podman-desktop-1.27.2-2-x86_64
|
|
||||||
installed = polkit-127-3-x86_64
|
|
||||||
installed = polkit-qt6-0.201.1-1-x86_64
|
|
||||||
installed = poppler-26.05.0-1-x86_64
|
|
||||||
installed = popt-1.19-2-x86_64
|
|
||||||
installed = portaudio-1:19.7.0-4-x86_64
|
|
||||||
installed = portmidi-1:2.0.8-1-x86_64
|
|
||||||
installed = pps-tools-1.0.3-2-x86_64
|
|
||||||
installed = procps-ng-4.0.6-1-x86_64
|
|
||||||
installed = protobuf-35.0-1-x86_64
|
|
||||||
installed = protobuf-c-1.5.2-10-x86_64
|
|
||||||
installed = psmisc-23.7-2-x86_64
|
|
||||||
installed = pugixml-1.15-3-x86_64
|
|
||||||
installed = python-3.14.5-1-x86_64
|
|
||||||
installed = python-attrs-26.1.0-1-any
|
|
||||||
installed = python-autocommand-2.2.2-9-any
|
|
||||||
installed = python-cffi-2.0.0-2-x86_64
|
|
||||||
installed = python-click-8.3.3-1-any
|
|
||||||
installed = python-cryptography-48.0.1-1-x86_64
|
|
||||||
installed = python-daemonize-2.5.0-10-any
|
|
||||||
installed = python-dbus-1.4.0-2-x86_64
|
|
||||||
installed = python-dotenv-1.2.2-1-any
|
|
||||||
installed = python-filelock-3.29.0-1-any
|
|
||||||
installed = python-gobject-3.56.3-1-x86_64
|
|
||||||
installed = python-jaraco.collections-5.1.0-3-any
|
|
||||||
installed = python-jaraco.context-6.1.2-1-any
|
|
||||||
installed = python-jaraco.functools-4.1.0-3-any
|
|
||||||
installed = python-jaraco.text-4.0.0-4-any
|
|
||||||
installed = python-mako-1.3.11-1-any
|
|
||||||
installed = python-markdown-3.10.2-1-any
|
|
||||||
installed = python-markupsafe-3.0.3-1-x86_64
|
|
||||||
installed = python-more-itertools-11.1.0-1-any
|
|
||||||
installed = python-numpy-2.4.6-1-x86_64
|
|
||||||
installed = python-openrazer-3.12.2-2-any
|
|
||||||
installed = python-packaging-26.2-1-any
|
|
||||||
installed = python-pip-26.1.2-1-any
|
|
||||||
installed = python-pkg_resources-81.0.0-1-any
|
|
||||||
installed = python-platformdirs-4.10.0-1-any
|
|
||||||
installed = python-protobuf-35.0-1-x86_64
|
|
||||||
installed = python-pycparser-3.00-1-any
|
|
||||||
installed = python-pygame-2.6.1-5-x86_64
|
|
||||||
installed = python-pyudev-0.24.4-1-any
|
|
||||||
installed = python-setproctitle-1.3.7-2-x86_64
|
|
||||||
installed = python-setuptools-1:82.0.1-1-any
|
|
||||||
installed = python-tqdm-4.68.1-1-any
|
|
||||||
installed = python-typing_extensions-4.15.0-3-any
|
|
||||||
installed = python-wheel-0.47.0-1-any
|
|
||||||
installed = python-yaml-6.0.3-2-x86_64
|
|
||||||
installed = qt5-base-5.15.19+kde+r96-1-x86_64
|
|
||||||
installed = qt5-declarative-5.15.19+kde+r23-1-x86_64
|
|
||||||
installed = qt5-graphicaleffects-5.15.19-1-x86_64
|
|
||||||
installed = qt5-quickcontrols2-5.15.19+kde+r5-1-x86_64
|
|
||||||
installed = qt5-svg-5.15.19+kde+r5-1-x86_64
|
|
||||||
installed = qt5-translations-5.15.19-1-any
|
|
||||||
installed = qt5-wayland-5.15.19+kde+r55-1-x86_64
|
|
||||||
installed = qt6-5compat-6.11.1-1-x86_64
|
|
||||||
installed = qt6-base-6.11.1-1-x86_64
|
|
||||||
installed = qt6-declarative-6.11.1-3-x86_64
|
|
||||||
installed = qt6-shadertools-6.11.1-1-x86_64
|
|
||||||
installed = qt6-svg-6.11.1-1-x86_64
|
|
||||||
installed = qt6-tools-6.11.1-1-x86_64
|
|
||||||
installed = qt6-translations-6.11.1-1-any
|
|
||||||
installed = qt6-wayland-6.11.1-1-x86_64
|
|
||||||
installed = raptor-2.0.16-9-x86_64
|
|
||||||
installed = rasqal-1:0.9.33-9-x86_64
|
|
||||||
installed = rav1e-0.8.1-2-x86_64
|
|
||||||
installed = razergenie-1.3.0-1-x86_64
|
|
||||||
installed = re2-2:2025.11.05-4-x86_64
|
|
||||||
installed = readline-8.3.003-1-x86_64
|
|
||||||
installed = redland-1:1.0.17-10-x86_64
|
|
||||||
installed = reflector-2023-5-any
|
|
||||||
installed = resvg-0.47.0-2-x86_64
|
|
||||||
installed = rhash-1.4.6-1-x86_64
|
|
||||||
installed = rsync-3.4.4-1-x86_64
|
|
||||||
installed = rtkit-0.14-1-x86_64
|
|
||||||
installed = rubberband-4.0.0-2-x86_64
|
|
||||||
installed = rustup-1.29.0-2-x86_64
|
|
||||||
installed = sbc-2.2-1-x86_64
|
|
||||||
installed = scdoc-1.11.4-1-x86_64
|
|
||||||
installed = sdbus-cpp-2.3.1-1-x86_64
|
|
||||||
installed = sddm-0.21.0-7-x86_64
|
|
||||||
installed = sddm-catppuccin-git-r42.10831de-1-any
|
|
||||||
installed = sdl2-compat-2.32.70-1-x86_64
|
|
||||||
installed = sdl2_image-2.8.12-1-x86_64
|
|
||||||
installed = sdl2_mixer-2.8.2-1-x86_64
|
|
||||||
installed = sdl2_ttf-2.24.0-2-x86_64
|
|
||||||
installed = sdl3-3.4.10-1-x86_64
|
|
||||||
installed = sdl3_ttf-3.2.2-3-x86_64
|
|
||||||
installed = seatd-0.9.3-1-x86_64
|
|
||||||
installed = sed-4.10-1-x86_64
|
|
||||||
installed = serd-0.32.10-1-x86_64
|
|
||||||
installed = shaderc-2026.2-1-x86_64
|
|
||||||
installed = shadow-4.18.0-1-x86_64
|
|
||||||
installed = shared-mime-info-2.4-3-x86_64
|
|
||||||
installed = slang-2.3.3-4-x86_64
|
|
||||||
installed = slurp-1.5.0-2-x86_64
|
|
||||||
installed = smartmontools-7.5-1-x86_64
|
|
||||||
installed = snappy-1.2.2-3-x86_64
|
|
||||||
installed = sndio-1.10.0-1-x86_64
|
|
||||||
installed = sord-0.16.22-1-x86_64
|
|
||||||
installed = sound-theme-freedesktop-0.8-6-any
|
|
||||||
installed = source-highlight-3.1.9-18-x86_64
|
|
||||||
installed = spandsp-0.0.6-7-x86_64
|
|
||||||
installed = spdlog-1.17.0-2-x86_64
|
|
||||||
installed = speex-1.2.1-2-x86_64
|
|
||||||
installed = speexdsp-1.2.1-2-x86_64
|
|
||||||
installed = spirv-tools-1:1.4.350.0-1-x86_64
|
|
||||||
installed = sqlite-3.53.2-1-x86_64
|
|
||||||
installed = squashfs-tools-4.7.5-1-x86_64
|
|
||||||
installed = sratom-0.6.22-1-x86_64
|
|
||||||
installed = srt-1.5.5-1-x86_64
|
|
||||||
installed = startup-notification-0.12-9-x86_64
|
|
||||||
installed = steam-1.0.0.85-7-x86_64
|
|
||||||
installed = steam-devices-1.0.0.85-7-x86_64
|
|
||||||
installed = sudo-1.9.17.p2-2-x86_64
|
|
||||||
installed = svt-av1-4.1.0-1-x86_64
|
|
||||||
installed = systemd-260.2-2-x86_64
|
|
||||||
installed = systemd-libs-260.2-2-x86_64
|
|
||||||
installed = systemd-sysvcompat-260.2-2-x86_64
|
|
||||||
installed = tar-1.35-2-x86_64
|
|
||||||
installed = tcl-8.6.16-1-x86_64
|
|
||||||
installed = tdb-1.4.15-1-x86_64
|
|
||||||
installed = texinfo-7.3-1-x86_64
|
|
||||||
installed = thunar-4.20.8-3-x86_64
|
|
||||||
installed = tinysparql-3.11.1-1-x86_64
|
|
||||||
installed = tk-8.6.16-1-x86_64
|
|
||||||
installed = tomlplusplus-3.4.0-2-x86_64
|
|
||||||
installed = tpm2-tss-4.1.3-1-x86_64
|
|
||||||
installed = tslib-1.24-1-x86_64
|
|
||||||
installed = ttf-jetbrains-mono-nerd-3.4.0-2-any
|
|
||||||
installed = tzdata-2026b-1-x86_64
|
|
||||||
installed = uchardet-0.0.8-4-x86_64
|
|
||||||
installed = uefitool-debug-1:0.28.0-3-x86_64
|
|
||||||
installed = unzip-6.0-23-x86_64
|
|
||||||
installed = upower-1.91.2-1-x86_64
|
|
||||||
installed = usbutils-019-1-x86_64
|
|
||||||
installed = util-linux-2.42.1-1-x86_64
|
|
||||||
installed = util-linux-libs-2.42.1-1-x86_64
|
|
||||||
installed = v4l-utils-1.32.0-2-x86_64
|
|
||||||
installed = vapoursynth-76-1-x86_64
|
|
||||||
installed = vid.stab-1.1.1-2-x86_64
|
|
||||||
installed = vim-9.2.0623-1-x86_64
|
|
||||||
installed = vim-runtime-9.2.0623-1-x86_64
|
|
||||||
installed = vmaf-3.1.0-1-x86_64
|
|
||||||
installed = vmware-keymaps-1.0-3-any
|
|
||||||
installed = vmware-workstation-26H1-3-x86_64
|
|
||||||
installed = vscodium-bin-1.121.03429-1-x86_64
|
|
||||||
installed = vulkan-icd-loader-1.4.350.0-1-x86_64
|
|
||||||
installed = vulkan-tools-1.4.350.0-1-x86_64
|
|
||||||
installed = waybar-0.15.0-2-x86_64
|
|
||||||
installed = wayland-1.25.0-1-x86_64
|
|
||||||
installed = wayland-protocols-1.49-1-any
|
|
||||||
installed = webrtc-audio-processing-1-1.3-5-x86_64
|
|
||||||
installed = which-2.25-1-x86_64
|
|
||||||
installed = winboat-bin-0.9.0-1-x86_64
|
|
||||||
installed = wine-staging-11.10-1-x86_64
|
|
||||||
installed = wireplumber-0.5.14-1-x86_64
|
|
||||||
installed = wl-clipboard-1:2.3.0-1-x86_64
|
|
||||||
installed = wlogout-1.2.2-0-x86_64
|
|
||||||
installed = woff2-font-awesome-7.2.0-1-any
|
|
||||||
installed = wpa_supplicant-2:2.11-5-x86_64
|
|
||||||
installed = x264-3:0.165.r3222.b35605a-2-x86_64
|
|
||||||
installed = x265-4.1-1-x86_64
|
|
||||||
installed = xautomation-1.09-6-x86_64
|
|
||||||
installed = xcb-proto-1.17.0-4-any
|
|
||||||
installed = xcb-util-0.4.1-2-x86_64
|
|
||||||
installed = xcb-util-cursor-0.1.6-1-x86_64
|
|
||||||
installed = xcb-util-errors-1.0.1-2-x86_64
|
|
||||||
installed = xcb-util-image-0.4.1-3-x86_64
|
|
||||||
installed = xcb-util-keysyms-0.4.1-5-x86_64
|
|
||||||
installed = xcb-util-renderutil-0.3.10-2-x86_64
|
|
||||||
installed = xcb-util-wm-0.4.2-2-x86_64
|
|
||||||
installed = xdg-dbus-proxy-0.1.7-1-x86_64
|
|
||||||
installed = xdg-desktop-portal-1.22.0-1-x86_64
|
|
||||||
installed = xdg-desktop-portal-gtk-1.15.3-1-x86_64
|
|
||||||
installed = xdg-desktop-portal-hyprland-1.3.12-2-x86_64
|
|
||||||
installed = xdg-user-dirs-0.20-1-x86_64
|
|
||||||
installed = xdg-utils-1.2.1-2-any
|
|
||||||
installed = xf86-input-libinput-1.5.0-1-x86_64
|
|
||||||
installed = xfconf-4.20.0-2-x86_64
|
|
||||||
installed = xkeyboard-config-2.47-1-any
|
|
||||||
installed = xmlsec-1.3.11-1-x86_64
|
|
||||||
installed = xorg-fonts-encodings-1.1.0-2-any
|
|
||||||
installed = xorg-server-21.1.23-1-x86_64
|
|
||||||
installed = xorg-server-common-21.1.23-1-x86_64
|
|
||||||
installed = xorg-setxkbmap-1.3.5-1-x86_64
|
|
||||||
installed = xorg-xauth-1.1.5-1-x86_64
|
|
||||||
installed = xorg-xkbcomp-1.5.0-1-x86_64
|
|
||||||
installed = xorg-xprop-1.2.8-1-x86_64
|
|
||||||
installed = xorg-xrandr-1.5.4-1-x86_64
|
|
||||||
installed = xorg-xwayland-24.1.12-1-x86_64
|
|
||||||
installed = xorgproto-2025.1-1-any
|
|
||||||
installed = xvidcore-1.3.7-3-x86_64
|
|
||||||
installed = xxhash-0.8.3-1-x86_64
|
|
||||||
installed = xz-5.8.3-1-x86_64
|
|
||||||
installed = yaml-cpp-0.9.0-1-x86_64
|
|
||||||
installed = yay-12.6.0-1-x86_64
|
|
||||||
installed = yay-debug-12.6.0-1-x86_64
|
|
||||||
installed = zenity-4.2.2-1-x86_64
|
|
||||||
installed = zeromq-4.3.5-3-x86_64
|
|
||||||
installed = zimg-3.0.6-1-x86_64
|
|
||||||
installed = zint-2.16.0-2-x86_64
|
|
||||||
installed = zix-0.8.0-1-x86_64
|
|
||||||
installed = zlib-1:1.3.2-3-x86_64
|
|
||||||
installed = zlib-ng-2.3.3-1-x86_64
|
|
||||||
installed = zstd-1.5.7-3-x86_64
|
|
||||||
installed = zxing-cpp-3.0.2-1-x86_64
|
|
||||||
Binary file not shown.
@@ -1,16 +0,0 @@
|
|||||||
# Generated by makepkg 7.1.0
|
|
||||||
# using fakeroot version 1.37.2
|
|
||||||
pkgname = python-meh
|
|
||||||
pkgbase = python-meh
|
|
||||||
xdata = pkgtype=pkg
|
|
||||||
pkgver = 0.43-1
|
|
||||||
pkgdesc = Python exception handling library (dépendance Anaconda)
|
|
||||||
url = https://github.com/rhinstaller/python-meh
|
|
||||||
builddate = 1781307281
|
|
||||||
packager = Unknown Packager
|
|
||||||
size = 170289
|
|
||||||
arch = any
|
|
||||||
license = GPL-2.0-or-later
|
|
||||||
depend = python
|
|
||||||
depend = python-gobject
|
|
||||||
depend = python-dbus
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
#
|
|
||||||
# __init__.py - Basic stuff for exception handling
|
|
||||||
#
|
|
||||||
# Copyright (C) 2009 Red Hat, Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# Author(s): Chris Lumens <clumens@redhat.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
from collections import namedtuple
|
|
||||||
|
|
||||||
# These constants represent the return values of buttons on the initial
|
|
||||||
# exception handling dialog - the dialog that first pops up when an
|
|
||||||
# exception is hit.
|
|
||||||
MAIN_RESPONSE_DEBUG = 0
|
|
||||||
MAIN_RESPONSE_SAVE = 1
|
|
||||||
MAIN_RESPONSE_QUIT = 2
|
|
||||||
MAIN_RESPONSE_SHELL = 3
|
|
||||||
MAIN_RESPONSE_NONE = 4
|
|
||||||
|
|
||||||
class ConfigError(Exception):
|
|
||||||
"""Exception class for the configuration related errors."""
|
|
||||||
|
|
||||||
pass
|
|
||||||
|
|
||||||
class Config(object):
|
|
||||||
"""Hold configuration info useful throughout the exception handling
|
|
||||||
classes. This prevents having to pass a bunch of arguments to a
|
|
||||||
bunch of different functions. A Config instance must be created
|
|
||||||
before creating an ExceptionHandler instance.
|
|
||||||
"""
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
"""Create a new Config instance. Arguments may be passed in to
|
|
||||||
set any of the configuration values. Unknown arguments will
|
|
||||||
be ignored. Instance attributes:
|
|
||||||
|
|
||||||
attrSkipList -- A list of strings. When handling a traceback,
|
|
||||||
any attributes found with the same name as an
|
|
||||||
element of this list will not be written to
|
|
||||||
the dump. This is to prevent writing potentially
|
|
||||||
sensitive information like passwords. The names
|
|
||||||
must be given without the leading name of the
|
|
||||||
object passed to handler.install(). For instance,
|
|
||||||
if handler.install() gets an Anaconda instance
|
|
||||||
with the name "anaconda" and you want to skip
|
|
||||||
anaconda.id.rootPassword, "id.rootPassword" should
|
|
||||||
be listed in attrSkipList.
|
|
||||||
fileList -- A list of files to find on the system and add
|
|
||||||
to the traceback dump.
|
|
||||||
localSkipList -- A list of strings. When handling a traceback,
|
|
||||||
any local variables found with their name containing
|
|
||||||
an element of this list will not be written to
|
|
||||||
the dump. This is subtely different from
|
|
||||||
attrSkipList.
|
|
||||||
callbackDict -- A dictionary having item names as keys and pairs
|
|
||||||
(function, attchmnt_only) as values.
|
|
||||||
@see register_callback
|
|
||||||
programName -- The name of the erroring program.
|
|
||||||
programVersion -- The version number of the erroring program.
|
|
||||||
Both programName and programVersion are used
|
|
||||||
throughout the exception handler, so must be
|
|
||||||
set.
|
|
||||||
programArch -- The architecture of the erroring program.
|
|
||||||
"""
|
|
||||||
self.attrSkipList = []
|
|
||||||
self.fileList = []
|
|
||||||
self.localSkipList = []
|
|
||||||
self.callbackDict = dict()
|
|
||||||
self.programName = None
|
|
||||||
self.programVersion = None
|
|
||||||
self.programArch = None
|
|
||||||
|
|
||||||
# Override the defaults set above with whatever's passed in as an
|
|
||||||
# argument. Unknown arguments get thrown away.
|
|
||||||
for (key, val) in kwargs.items():
|
|
||||||
if key in self.__dict__:
|
|
||||||
self.__dict__[key] = val
|
|
||||||
|
|
||||||
# Make sure required things are set.
|
|
||||||
if not self.programName:
|
|
||||||
raise ValueError("programName must be set.")
|
|
||||||
|
|
||||||
if not self.programVersion:
|
|
||||||
raise ValueError("programVersion must be set.")
|
|
||||||
|
|
||||||
def register_callback(self, item_name, callback, attchmnt_only=False,
|
|
||||||
override=False):
|
|
||||||
"""
|
|
||||||
Register new callback that will be called when data about the
|
|
||||||
crash is collected. The returned value will be included as the
|
|
||||||
'item_name' item.
|
|
||||||
|
|
||||||
:param item_name: name of the item storing the value returned by the
|
|
||||||
'callback' function
|
|
||||||
:type item_name: string
|
|
||||||
:param callback: a function to be called
|
|
||||||
:type callback: a function of type: () -> string
|
|
||||||
:param attchmnt_only: whether the returned valued should be included only
|
|
||||||
as an attachment or also in the main '*-tb' file
|
|
||||||
(defaults to False)
|
|
||||||
:type attchmnt_only: bool
|
|
||||||
:param override: whether to override the previously registered callback
|
|
||||||
with the same item name or not (may raise exception)
|
|
||||||
:type override: bool
|
|
||||||
|
|
||||||
:raise ConfigError: if callback with the 'item_name' has already been
|
|
||||||
registered and 'override' is not set to True
|
|
||||||
:return: None
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
if item_name not in self.callbackDict or override:
|
|
||||||
self.callbackDict[item_name] = (callback, attchmnt_only)
|
|
||||||
else:
|
|
||||||
msg = "Callback with name '%s' already registered" % item_name
|
|
||||||
raise ConfigError(msg)
|
|
||||||
|
|
||||||
# type, value and stack are items provided by Python for the exception handler
|
|
||||||
ExceptionInfo = namedtuple("ExceptionInfo", ["type", "value", "stack"])
|
|
||||||
|
|
||||||
# ExceptionInfo instance plus the object that should be dumped
|
|
||||||
DumpInfo = namedtuple("DumpInfo", ["exc_info", "object"])
|
|
||||||
|
|
||||||
# information about a package (as provided e.g. by rpm)
|
|
||||||
PackageInfo = namedtuple("PackageInfo", ["name", "version", "release", "epoch",
|
|
||||||
"arch"])
|
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -1,551 +0,0 @@
|
|||||||
#
|
|
||||||
# dump.py - general exception formatting and saving
|
|
||||||
#
|
|
||||||
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009 Red Hat, Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
#
|
|
||||||
# Author(s): Matt Wilson <msw@redhat.com>
|
|
||||||
# Erik Troan <ewt@redhat.com>
|
|
||||||
# Chris Lumens <clumens@redhat.com>
|
|
||||||
#
|
|
||||||
# pylint: disable=bare-except,broad-except
|
|
||||||
|
|
||||||
import copy
|
|
||||||
import inspect
|
|
||||||
import os
|
|
||||||
import traceback
|
|
||||||
import sys
|
|
||||||
import codecs
|
|
||||||
import six
|
|
||||||
from meh import PackageInfo
|
|
||||||
from meh.safe_string import SafeStr
|
|
||||||
|
|
||||||
# Python 2/3 compatibilty
|
|
||||||
try:
|
|
||||||
longtype = long # pylint: disable=undefined-variable
|
|
||||||
except NameError:
|
|
||||||
longtype = int
|
|
||||||
|
|
||||||
try:
|
|
||||||
unitype = unicode # pylint: disable=undefined-variable
|
|
||||||
except NameError:
|
|
||||||
unitype = str
|
|
||||||
|
|
||||||
class ExceptionDump(object):
|
|
||||||
"""This class represents a traceback and contains several useful methods
|
|
||||||
for manipulating a traceback. In general, clients should not have to
|
|
||||||
use this class. It is mainly for internal use.
|
|
||||||
"""
|
|
||||||
def __init__(self, exc_info, config_obj):
|
|
||||||
"""Create a new ExceptionDump instance. Instance attributes:
|
|
||||||
|
|
||||||
:param exc_info: info about the exception provided by Python
|
|
||||||
:type exc_info: an instance of the meh.ExceptionInfo class
|
|
||||||
:param config_obj: configuration for python-meh
|
|
||||||
:type config_obj: an instance of the meh.Config class
|
|
||||||
"""
|
|
||||||
|
|
||||||
if inspect.istraceback(exc_info.stack):
|
|
||||||
self.stack = inspect.getinnerframes(exc_info.stack)
|
|
||||||
else:
|
|
||||||
self.stack = exc_info.stack
|
|
||||||
|
|
||||||
self.conf = config_obj
|
|
||||||
self.type = exc_info.type
|
|
||||||
self.value = exc_info.value
|
|
||||||
|
|
||||||
self._dumpHash = {}
|
|
||||||
|
|
||||||
@property
|
|
||||||
def desc(self):
|
|
||||||
# The description is a single line of text that should be used anywhere
|
|
||||||
# the bug needs to quickly be summarized. The most obvious example of
|
|
||||||
# this is when saving to bugzilla. We can populate the UI with this
|
|
||||||
# string so the user doesn't need to come up with one.
|
|
||||||
if self.type and self.value:
|
|
||||||
return traceback.format_exception_only(self.type, self.value)[0].strip()
|
|
||||||
else:
|
|
||||||
return ""
|
|
||||||
|
|
||||||
def _get_environment_info(self):
|
|
||||||
"""
|
|
||||||
Returns dictionary containing these items for a bugreport header
|
|
||||||
|
|
||||||
architecture
|
|
||||||
cmdline
|
|
||||||
component
|
|
||||||
executable
|
|
||||||
kernel
|
|
||||||
package
|
|
||||||
release
|
|
||||||
other involved packages
|
|
||||||
|
|
||||||
:rtype: dict (string -> string)
|
|
||||||
"""
|
|
||||||
|
|
||||||
RELEASE_NAME_FILE = "/etc/system-release"
|
|
||||||
|
|
||||||
class RPMinfoError(Exception):
|
|
||||||
"""Exception for errors in rpm queries"""
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_python_opts():
|
|
||||||
"""
|
|
||||||
Returns python's command line options
|
|
||||||
|
|
||||||
:return: list of python's command line options
|
|
||||||
:rtype: list
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
flags_to_opts = {
|
|
||||||
"debug": "-d",
|
|
||||||
"py3k_warning": "-3",
|
|
||||||
"division_new": "-Qnew",
|
|
||||||
"division_warning": "-Q",
|
|
||||||
"inspect": "-i",
|
|
||||||
"interactive": "-i",
|
|
||||||
"optimize": "-O",
|
|
||||||
"dont_write_bytecode": "-B",
|
|
||||||
"no_user_site": "-s",
|
|
||||||
"no_site": "-S",
|
|
||||||
"ignore_environment": "-E",
|
|
||||||
"tabcheck": "-t",
|
|
||||||
"verbose": "-v",
|
|
||||||
"unicode": "-u",
|
|
||||||
"bytes_warning": "-b",
|
|
||||||
"quiet": "-q",
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = set()
|
|
||||||
for flag in flags_to_opts.keys():
|
|
||||||
if getattr(sys.flags, flag, None):
|
|
||||||
ret.add(flags_to_opts[flag])
|
|
||||||
ret = list(ret)
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def get_package_and_component(file_=sys.argv[0]):
|
|
||||||
"""
|
|
||||||
Returns package and component names for file (by default for script itself).
|
|
||||||
|
|
||||||
:param file_: filename
|
|
||||||
:type file_: string
|
|
||||||
:return: tuple containing package info and component name for the file
|
|
||||||
:rtype: (PackageInfo, str)
|
|
||||||
:raise RPMinfoError: if package and component for the file cannot be found
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
import rpm
|
|
||||||
ts = rpm.TransactionSet()
|
|
||||||
mi = ts.dbMatch("basenames", file_)
|
|
||||||
try:
|
|
||||||
header = next(mi)
|
|
||||||
except StopIteration:
|
|
||||||
raise RPMinfoError("Cannot get package and component for file "+
|
|
||||||
"{0}".format(file_))
|
|
||||||
pkg_info = PackageInfo(header["name"].decode("utf-8"), header["version"].decode("utf-8"),
|
|
||||||
header["release"].decode("utf-8"),
|
|
||||||
u"%d" % header["epoch"] if header["epoch"] else u"0",
|
|
||||||
header["arch"].decode("utf-8"))
|
|
||||||
|
|
||||||
# cuts the name from the NVR format: foo-blah-2.8.8-2.fc17.src.rpm
|
|
||||||
srpm_name = header["sourcerpm"].decode("utf-8")
|
|
||||||
name_end = len(srpm_name)
|
|
||||||
try:
|
|
||||||
name_end = srpm_name.rindex('-')
|
|
||||||
name_end = srpm_name[:name_end].rindex('-')
|
|
||||||
except ValueError:
|
|
||||||
# expected exception
|
|
||||||
pass
|
|
||||||
|
|
||||||
component = srpm_name[:name_end]
|
|
||||||
|
|
||||||
return (pkg_info, component)
|
|
||||||
|
|
||||||
def get_release_version():
|
|
||||||
"""Returns release version (according to RELEASE_NAME_FILE)"""
|
|
||||||
try:
|
|
||||||
with open(RELEASE_NAME_FILE, "r") as file_:
|
|
||||||
return file_.readline().rstrip()
|
|
||||||
except IOError:
|
|
||||||
return "Cannot get release name."
|
|
||||||
|
|
||||||
def get_other_packages(self):
|
|
||||||
"""
|
|
||||||
Returns a set of additional packages whose files appear in
|
|
||||||
traceback.
|
|
||||||
|
|
||||||
:rtype: set
|
|
||||||
|
|
||||||
"""
|
|
||||||
packages = set()
|
|
||||||
if not self.stack:
|
|
||||||
return packages
|
|
||||||
|
|
||||||
for (_frame, fn, _lineno, _func, _ctx, _idx) in self.stack:
|
|
||||||
try:
|
|
||||||
pkg_info = get_package_and_component(fn)[0]
|
|
||||||
package = "{0.name}-{0.version}-{0.release}.{0.arch}".format(
|
|
||||||
pkg_info)
|
|
||||||
packages.add(package)
|
|
||||||
except RPMinfoError:
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
pkg_info = get_package_and_component()[0]
|
|
||||||
package = "{0.name}-{0.version}-{0.release}.{0.arch}".format(
|
|
||||||
pkg_info)
|
|
||||||
packages.discard(package)
|
|
||||||
except RPMinfoError:
|
|
||||||
pass
|
|
||||||
return packages
|
|
||||||
|
|
||||||
def get_environment_variables():
|
|
||||||
"""
|
|
||||||
Returns a list of strings containing defined environment
|
|
||||||
variables and their values in the following format:
|
|
||||||
|
|
||||||
VARIABLE=VALUE
|
|
||||||
|
|
||||||
:rtype: list
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
ret = list()
|
|
||||||
for (key, value) in os.environ.items():
|
|
||||||
ret.append("{0}={1}".format(key, value))
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
#--begining of the method _get_environment_info--
|
|
||||||
try:
|
|
||||||
pkg_info, component = get_package_and_component()
|
|
||||||
except RPMinfoError:
|
|
||||||
pkg_info = None
|
|
||||||
component = None
|
|
||||||
|
|
||||||
other_packages = ", ".join(get_other_packages(self))
|
|
||||||
|
|
||||||
ret = dict()
|
|
||||||
ret["architecture"] = os.uname()[4]
|
|
||||||
ret["cmdline"] = "{0} {1} {2}".format(sys.executable,
|
|
||||||
" ".join(get_python_opts()),
|
|
||||||
" ".join(sys.argv))
|
|
||||||
if component:
|
|
||||||
ret["component"] = component
|
|
||||||
ret["executable"] = sys.argv[0]
|
|
||||||
ret["kernel"] = os.uname()[2]
|
|
||||||
if pkg_info:
|
|
||||||
ret["pkg_info"] = pkg_info
|
|
||||||
ret["release"] = get_release_version()
|
|
||||||
if other_packages:
|
|
||||||
ret["other involved packages"] = other_packages
|
|
||||||
ret["environ"] = "\n".join(get_environment_variables())
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
@property
|
|
||||||
def environment_info(self):
|
|
||||||
return self._get_environment_info()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
lst = self._format_stack()
|
|
||||||
|
|
||||||
lst.insert(0, "%s %s exception report\n" % (self.conf.programName, self.conf.programVersion))
|
|
||||||
lst.insert(1, "Traceback (most recent call last):\n")
|
|
||||||
|
|
||||||
if self.type is not None and self.value is not None:
|
|
||||||
lst.extend(traceback.format_exception_only(self.type, self.value))
|
|
||||||
|
|
||||||
return "".join(lst)
|
|
||||||
|
|
||||||
def _format_stack(self):
|
|
||||||
if not self.stack:
|
|
||||||
return []
|
|
||||||
|
|
||||||
frames = []
|
|
||||||
for (_frame, fn, lineno, func, ctx, _idx) in self.stack:
|
|
||||||
if isinstance(ctx, list):
|
|
||||||
code = "".join(ctx)
|
|
||||||
else:
|
|
||||||
code = ctx
|
|
||||||
|
|
||||||
frames.append((fn, lineno, func, code))
|
|
||||||
|
|
||||||
return traceback.format_list(frames)
|
|
||||||
|
|
||||||
# Create a string representation of a class. This method will recursively
|
|
||||||
# handle all attributes of the base given class.
|
|
||||||
def _dumpClass(self, instance, level=0, parentkey="", skipList=None):
|
|
||||||
# This is horribly cheesy, and bound to require maintainence in the
|
|
||||||
# future. The problem is that anything subclassed from object fails
|
|
||||||
# the types.InstanceType test we used to have which means those
|
|
||||||
# objects never get dumped. However, most everything basic in
|
|
||||||
# python is derived from object so we can't just check for the super
|
|
||||||
# class. Any instances of the following types will just be printed
|
|
||||||
# out, and everything else will be assumed to be something that
|
|
||||||
# needs to be recursed on.
|
|
||||||
def __isSimpleType(instance):
|
|
||||||
return isinstance(instance, bool) or \
|
|
||||||
isinstance(instance, complex) or \
|
|
||||||
isinstance(instance, float) or \
|
|
||||||
isinstance(instance, int) or \
|
|
||||||
isinstance(instance, longtype) or \
|
|
||||||
isinstance(instance, type(None)) or \
|
|
||||||
isinstance(instance, bytes) or \
|
|
||||||
isinstance(instance, str) or \
|
|
||||||
isinstance(instance, unitype) or \
|
|
||||||
not hasattr(instance, "__class__") or \
|
|
||||||
not hasattr(instance, "__dict__")
|
|
||||||
|
|
||||||
ret = SafeStr()
|
|
||||||
|
|
||||||
if not skipList:
|
|
||||||
skipList = []
|
|
||||||
|
|
||||||
# protect from loops
|
|
||||||
try:
|
|
||||||
# Store the id(), not the instance name to protect against
|
|
||||||
# instances that cannot be hashed.
|
|
||||||
if not id(instance) in self._dumpHash:
|
|
||||||
self._dumpHash[id(instance)] = None
|
|
||||||
else:
|
|
||||||
ret += "Already dumped (%s instance)\n" % instance.__class__.__name__
|
|
||||||
return ret
|
|
||||||
except TypeError:
|
|
||||||
ret += "Cannot dump object\n"
|
|
||||||
return ret
|
|
||||||
|
|
||||||
if ("__str__" in instance.__class__.__dict__ or
|
|
||||||
"__repr__" in instance.__class__.__dict__):
|
|
||||||
try:
|
|
||||||
ret += "%s\n" % (instance,)
|
|
||||||
except:
|
|
||||||
ret += "\n"
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
ret += "%s instance, containing members:\n" %\
|
|
||||||
(instance.__class__.__name__)
|
|
||||||
pad = ' ' * ((level) * 2)
|
|
||||||
|
|
||||||
for key, value in instance.__dict__.items():
|
|
||||||
if key.startswith("_%s__" % instance.__class__.__name__):
|
|
||||||
continue
|
|
||||||
|
|
||||||
if parentkey != "":
|
|
||||||
curkey = parentkey + "." + key
|
|
||||||
else:
|
|
||||||
curkey = key
|
|
||||||
|
|
||||||
# Don't dump objects that are in our skip list, though ones that are
|
|
||||||
# None are probably okay.
|
|
||||||
if eval("instance.%s is not None" % key) and \
|
|
||||||
eval("id(instance.%s)" % key) in skipList:
|
|
||||||
ret += "%s%s: Skipped\n" % (pad, curkey)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if isinstance(value, list):
|
|
||||||
ret += "%s%s: [" % (pad, curkey)
|
|
||||||
first = 1
|
|
||||||
for item in value:
|
|
||||||
if not first:
|
|
||||||
ret += ", "
|
|
||||||
else:
|
|
||||||
first = 0
|
|
||||||
|
|
||||||
if __isSimpleType(item):
|
|
||||||
ret += "%s" % (item,)
|
|
||||||
else:
|
|
||||||
ret += self._dumpClass(item, level + 1, skipList=skipList)
|
|
||||||
ret += "]\n"
|
|
||||||
elif isinstance(value, dict):
|
|
||||||
# append things one after another so that e.g. binary data is
|
|
||||||
# replaced by hexa values separately
|
|
||||||
ret += pad
|
|
||||||
ret += curkey
|
|
||||||
ret += ": {"
|
|
||||||
first = 1
|
|
||||||
for k, v in value.items():
|
|
||||||
if not first:
|
|
||||||
ret += ", "
|
|
||||||
else:
|
|
||||||
first = 0
|
|
||||||
if isinstance(k, str) or isinstance(k, unitype):
|
|
||||||
ret += "'"
|
|
||||||
ret += k
|
|
||||||
ret += "': "
|
|
||||||
else:
|
|
||||||
ret += "%s: " % (k,)
|
|
||||||
|
|
||||||
if __isSimpleType(v):
|
|
||||||
ret += "%s" % (v,)
|
|
||||||
else:
|
|
||||||
ret += self._dumpClass(v, level + 1, parentkey = curkey, skipList=skipList)
|
|
||||||
ret += "}\n"
|
|
||||||
elif __isSimpleType(value):
|
|
||||||
ret += "%s%s: " % (pad, curkey)
|
|
||||||
ret += value
|
|
||||||
ret += "\n"
|
|
||||||
else:
|
|
||||||
ret += "%s%s: " % (pad, curkey)
|
|
||||||
ret += self._dumpClass(value, level + 1, parentkey=curkey, skipList=skipList)
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def dump(self, obj):
|
|
||||||
"""Dump the local variables and all attributes of a given object.
|
|
||||||
The lists of files and attrs to ignore are all taken from a
|
|
||||||
Config object instance provided when the ExceptionDump class was
|
|
||||||
created.
|
|
||||||
|
|
||||||
obj -- Any Python object. This object will have all its attributes
|
|
||||||
written out, except for those mentioned in the attrSkipList.
|
|
||||||
"""
|
|
||||||
idSkipList = []
|
|
||||||
ret = SafeStr()
|
|
||||||
|
|
||||||
# We need to augment the environment eval() will run in with the
|
|
||||||
# bindings that were local when the traceback happened so that the
|
|
||||||
# idSkipList can be populated. However since we're not allowed to
|
|
||||||
# modify the results of locals(), we'll have to make a copy first.
|
|
||||||
localVars = copy.copy(locals())
|
|
||||||
if self.stack:
|
|
||||||
localVars.update(self.stack[-1][0].f_locals)
|
|
||||||
|
|
||||||
# Catch attributes that do not exist at the time we do the exception dump
|
|
||||||
# and ignore them.
|
|
||||||
for k in self.conf.attrSkipList:
|
|
||||||
try:
|
|
||||||
eval("idSkipList.append(id(obj.%s))" % k, None, localVars)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Write local variables to the given file descriptor, ignoring any of
|
|
||||||
# the local skips.
|
|
||||||
if self.stack:
|
|
||||||
frame = self.stack[-1][0]
|
|
||||||
ret += "\nLocal variables in innermost frame:\n"
|
|
||||||
try:
|
|
||||||
for (key, value) in frame.f_locals.items():
|
|
||||||
lowered_key = key.lower()
|
|
||||||
if any(item.lower() in lowered_key
|
|
||||||
for item in self.conf.localSkipList):
|
|
||||||
continue
|
|
||||||
|
|
||||||
ret += "%s: %s\n" % (key, value)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# And now dump the object's attributes.
|
|
||||||
try:
|
|
||||||
ret += "\n\n"
|
|
||||||
ret += self._dumpClass(obj, skipList=idSkipList)
|
|
||||||
except:
|
|
||||||
ret += "\nException occurred during state dump:\n"
|
|
||||||
ret += traceback.format_exc(None)
|
|
||||||
|
|
||||||
# Filter out item names and callbacks that should appear
|
|
||||||
# only as attachments
|
|
||||||
items_callbacks = ((name, cb) for (name, (cb, attchmnt_only))
|
|
||||||
in self.conf.callbackDict.items()
|
|
||||||
if not attchmnt_only)
|
|
||||||
|
|
||||||
# And now add data returned by the registered callbacks
|
|
||||||
ret += "\nRegistered callbacks:\n"
|
|
||||||
for (item_name, callback) in items_callbacks:
|
|
||||||
try:
|
|
||||||
callback_ret = callback()
|
|
||||||
if callback_ret:
|
|
||||||
ret += "%s:\n%s\n" % (item_name, callback_ret)
|
|
||||||
except Exception as exc:
|
|
||||||
ret += "%s: Caused error: %s\n" % (item_name, exc)
|
|
||||||
|
|
||||||
# And finally, write a bunch of files into the dump too.
|
|
||||||
for fname in self.conf.fileList:
|
|
||||||
try:
|
|
||||||
if six.PY2:
|
|
||||||
with codecs.open(fname, "r", "utf-8", "ignore") as fobj:
|
|
||||||
ret += "\n\n%s:\n" % (fname,)
|
|
||||||
for line in fobj:
|
|
||||||
ret += line.encode("utf-8")
|
|
||||||
else:
|
|
||||||
with open(fname, "rt", encoding="utf-8") as fobj:
|
|
||||||
ret += "\n\n%s:\n" % (fname,)
|
|
||||||
for line in fobj:
|
|
||||||
ret += line
|
|
||||||
except IOError:
|
|
||||||
pass
|
|
||||||
except:
|
|
||||||
ret += "\nException occurred during %s file copy:\n" % (fname,)
|
|
||||||
ret += traceback.format_exc(None)
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
@property
|
|
||||||
def hash(self):
|
|
||||||
"""Create a hash for this traceback object. This is most suitable for
|
|
||||||
searching bug filing systems for duplicates. The hash is composed
|
|
||||||
of the basename of each file in the stack, the method names, and
|
|
||||||
the bit of code. Line numbers and the actual exception message
|
|
||||||
itself are left out.
|
|
||||||
"""
|
|
||||||
import hashlib
|
|
||||||
s = ""
|
|
||||||
|
|
||||||
if self.stack:
|
|
||||||
for (file, _lineno, func, text) in [f[1:5] for f in self.stack]:
|
|
||||||
if isinstance(text, list):
|
|
||||||
text = "".join(text)
|
|
||||||
s += "%s %s %s\n" % (os.path.basename(file), func, text)
|
|
||||||
else:
|
|
||||||
s = "%s %s" % (self.type, self.value)
|
|
||||||
|
|
||||||
return hashlib.sha256(s.encode("utf-8")).hexdigest()
|
|
||||||
|
|
||||||
def traceback_and_object_dump(self, obj):
|
|
||||||
"""
|
|
||||||
Return the traceback and a text representation of an object.
|
|
||||||
|
|
||||||
:param obj: Any Python object. This object will have all its attributes
|
|
||||||
written out, except for those mentioned in the attrSkipList.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
ret = SafeStr(str(self))
|
|
||||||
ret += self.dump(obj)
|
|
||||||
|
|
||||||
return ret
|
|
||||||
|
|
||||||
class ReverseExceptionDump(ExceptionDump):
|
|
||||||
"""This class provides an alternate representation of an exception. In
|
|
||||||
this representation, the traceback is printed with the most recent call
|
|
||||||
at the top of the stack, and the most generic call at the bottom. Note
|
|
||||||
that this order does not affect the hash at all.
|
|
||||||
"""
|
|
||||||
def __str__(self):
|
|
||||||
lst = self._format_stack()
|
|
||||||
lst.reverse()
|
|
||||||
|
|
||||||
lst.insert(0, "%s %s exception report\n" % (self.conf.programName, self.conf.programVersion))
|
|
||||||
lst.insert(1, "Traceback (most recent call first):\n")
|
|
||||||
|
|
||||||
if self.type is not None and self.value is not None:
|
|
||||||
lst.extend(traceback.format_exception_only(self.type, self.value))
|
|
||||||
|
|
||||||
return "".join(lst)
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user