Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
d3cceaffd5
|
@@ -2,3 +2,7 @@ out/
|
||||
local-repo/
|
||||
configs/baseline/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
|
||||
===============
|
||||
|
||||
The build system (``mkarchiso``, profiles, man pages) derives from archiso and
|
||||
retains the authorship of its original contributors:
|
||||
|
||||
* 2hexed <2hexed@protonmail.com>
|
||||
* Aaron Griffin <aaron@archlinux.org>
|
||||
* Adam Purkrt <adam@purkrt.net>
|
||||
|
||||
+2
-23
@@ -2,29 +2,8 @@
|
||||
Contributing
|
||||
============
|
||||
|
||||
These are the contribution guidelines for **FWS**. FWS is a fork of `archiso
|
||||
<https://gitlab.archlinux.org/archlinux/archiso>`_; the build-system parts
|
||||
derived from archiso retain their original history and authorship (see
|
||||
`AUTHORS.rst <AUTHORS.rst>`_).
|
||||
|
||||
Licensing of contributions (inbound = outbound)
|
||||
===============================================
|
||||
|
||||
All contributions are accepted under the **same license as the project**,
|
||||
``GPL-3.0-or-later`` (see `LICENSE <LICENSE>`_). By submitting a contribution you
|
||||
agree that it is licensed under ``GPL-3.0-or-later`` and that you have the right
|
||||
to submit it under that license.
|
||||
|
||||
Sign off every commit to certify the `Developer Certificate of Origin 1.1
|
||||
<https://developercertificate.org/>`_:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
git commit --signoff # adds a "Signed-off-by: Name <email>" trailer
|
||||
|
||||
For the full licensing, third-party and trademark picture, see `LICENSING.md
|
||||
<LICENSING.md>`_, `THIRD-PARTY-LICENSES.md <THIRD-PARTY-LICENSES.md>`_ and
|
||||
`TRADEMARKS.md <TRADEMARKS.md>`_.
|
||||
These are the contribution guidelines for archiso.
|
||||
All contributions fall under the terms of the GPL-3.0-or-later (see `LICENSE <LICENSE>`_).
|
||||
|
||||
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** 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
|
||||
|
||||
- **Base** : Arch Linux (rolling release)
|
||||
- **Installateur** : en migration Calamares → Anaconda (Calamares retiré, Anaconda en préparation ; payload `liveimg` pour installer FWS et non Fedora)
|
||||
- **Affichage live** : Xorg + Openbox (session graphique conservée pour l'installateur)
|
||||
- **Bureaux installables** : XFCE, KDE Plasma, GNOME, Hyprland (choix à l'installation)
|
||||
- **Installeur** : Calamares (compilé depuis l'AUR, servi via un repo local pacman)
|
||||
- **Affichage live** : Xorg + Openbox, lancement automatique de Calamares
|
||||
- **Boot** : BIOS (syslinux) + UEFI (systemd-boot)
|
||||
- **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)
|
||||
|
||||
| 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`.
|
||||
|
||||
---
|
||||
### Côté Arch (WSL ou natif)
|
||||
Les scripts installent automatiquement les paquets nécessaires (`archiso`, `base-devel`, `git`, `reflector`, `dos2unix`).
|
||||
|
||||
## Démarrage rapide
|
||||
|
||||
Depuis **Git Bash sur Windows** (à la racine du repo) :
|
||||
|
||||
```bash
|
||||
# Étape 1 : compilation des paquets AUR (winboat) + deps locales
|
||||
# → crée local-repo/ avec les .pkg.tar.zst
|
||||
# (Calamares retiré ; l'installateur Anaconda est un chantier en cours)
|
||||
./setup-aur.sh
|
||||
# 1. Préparation : compile Calamares depuis l'AUR, crée le repo local,
|
||||
# patche pacman.conf et configure les services systemd (Xorg + autostart).
|
||||
./setup-calamares.sh
|
||||
|
||||
# Étape 2 : build de l'ISO via mkarchiso
|
||||
# → fusionne configs/releng + configs/baseline
|
||||
# → injecte le repo local dans pacman.conf
|
||||
# → sort l'ISO dans ./out/
|
||||
# 2. Build de l'ISO via mkarchiso (fusionne configs/releng + configs/baseline)
|
||||
./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/`.
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
```
|
||||
|
||||
---
|
||||
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**.
|
||||
|
||||
## Structure du projet
|
||||
|
||||
| Chemin | Rôle |
|
||||
|---|---|
|
||||
| `setup-aur.sh` | Build des paquets AUR (winboat) + PKGBUILD locaux, crée `local-repo/` |
|
||||
| `build.sh` | Build de l'ISO via `mkarchiso` |
|
||||
|--------|------|
|
||||
| `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` (utilisable depuis Git Bash ou WSL) |
|
||||
| `configs/releng/` | Profil principal (base ArchISO releng) |
|
||||
| `configs/baseline/` | Overlay FWS (surcharge le profil releng) — **prioritaire** sur releng |
|
||||
| `local-repo/` | Repo pacman local (généré par `setup-aur.sh`) |
|
||||
| `configs/baseline/` | Overlay FWS appliqué par-dessus `releng` (prioritaire) |
|
||||
| `local-repo/` | Repo pacman local généré (Calamares + dépendances AUR) |
|
||||
| `out/` | ISOs générées |
|
||||
| `fws/mkarchiso` | Binaire `mkarchiso` embarqué (fork) |
|
||||
| `scripts/run_archiso.sh` | Lanceur QEMU |
|
||||
|
||||
---
|
||||
|
||||
## Séquence de boot de l'ISO
|
||||
|
||||
1. Démarrage de l'ISO FWS (BIOS ou UEFI)
|
||||
2. `systemd` → autologin root sur `tty1`
|
||||
3. `.zprofile` → `startx`
|
||||
4. `.xinitrc` → Openbox (session graphique du live)
|
||||
5. **[Chantier C]** lancement de l'installateur Anaconda — pas encore câblé (Calamares retiré au commit 05ae9c3)
|
||||
3. `xorg-start.service` → `Xorg :0`
|
||||
4. `calamares.service` → `DISPLAY=:0 calamares`
|
||||
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
|
||||
|
||||
- **Paquets du live** : `configs/releng/packages.x86_64`
|
||||
- **Paquets baseline** : `configs/baseline/packages.x86_64`
|
||||
- **Overlay rootfs** : `configs/releng/airootfs/` ou `configs/baseline/airootfs/`
|
||||
- **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`)
|
||||
|
||||
---
|
||||
- **Paquets** : éditer `configs/releng/packages.x86_64`
|
||||
- **Overlay rootfs** : déposer les fichiers dans `configs/releng/airootfs/` ou `configs/baseline/airootfs/`
|
||||
- **Modules / séquence Calamares** : `configs/baseline/airootfs/etc/calamares/`
|
||||
- **Branding ISO** : `configs/releng/profiledef.sh` (`iso_name`, `iso_label`, `iso_publisher`…)
|
||||
|
||||
## Dépannage
|
||||
|
||||
| Symptôme | Cause / fix |
|
||||
|---|---|
|
||||
| `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`. |
|
||||
| `WSL introuvable` | WSL n'est pas installé. PowerShell admin : `wsl --install`, puis installe une distro Arch. |
|
||||
| `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) |
|
||||
- **`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`.
|
||||
- **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.
|
||||
- **`mkarchiso` échoue sur un paquet AUR** : relancer `./setup-calamares.sh` pour reconstruire le repo local.
|
||||
|
||||
---
|
||||
|
||||
@@ -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**.
|
||||
|
||||
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
|
||||
|
||||
| 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.**
|
||||
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.
|
||||
|
||||
@@ -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
|
||||
# ============================================================
|
||||
# FWS — Build de l'ISO via mkarchiso (archiso)
|
||||
#
|
||||
# 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.
|
||||
# ============================================================
|
||||
|
||||
export MSYS_NO_PATHCONV=1
|
||||
|
||||
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"
|
||||
|
||||
# ============================================================
|
||||
# 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.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
|
||||
if [ -n "$WSL_DISTRO_NAME" ]; then
|
||||
echo -e "\e[36mBuild exécuté depuis WSL ($WSL_DISTRO_NAME) en tant que root...\e[0m"
|
||||
IN_WSL=1
|
||||
else
|
||||
echo -e "\e[36mBuild exécuté sur Arch Linux natif en tant que root...\e[0m"
|
||||
IS_WSL=0
|
||||
echo -e "\e[36mLancement du processus de build dans WSL ($DISTRO_NAME) en tant que root...\e[0m"
|
||||
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"
|
||||
if [ -z "$IN_WSL" ]; then
|
||||
# ── Depuis Git Bash ──────────────────────────────────────
|
||||
SCRIPT_DIR_WIN="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -W)"
|
||||
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
|
||||
# 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 "==> Dossier de travail WSL : $WORK_DIR_WSL"
|
||||
|
||||
MSYS_NO_PATHCONV=1 wsl.exe -d "$DISTRO_NAME" -u root -- bash << EOF
|
||||
set -e
|
||||
WORK_DIR="${WORK_DIR_WSL}"
|
||||
echo "==> Dossier de travail : \$WORK_DIR"
|
||||
|
||||
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
|
||||
pacman -Sy --noconfirm archiso
|
||||
|
||||
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/
|
||||
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/
|
||||
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)..."
|
||||
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
|
||||
ln -sf /usr/lib/systemd/system/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/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..."
|
||||
# Copie le repo local (calamares + winboat-bin)
|
||||
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/
|
||||
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)
|
||||
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
|
||||
> "\$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
|
||||
@@ -252,31 +82,99 @@ pacman -S --needed --noconfirm dos2unix
|
||||
find /tmp/fws-build/releng -type f -exec dos2unix {} + 2>/dev/null
|
||||
|
||||
echo "==> Lancement de mkarchiso..."
|
||||
mkdir -p "$WORK_DIR/out"
|
||||
# mkarchiso fait un « rm » interne de l'ISO cible avant de la (ré)écrire ; si
|
||||
# une ISO du même nom est VERROUILLÉE par Windows (VM encore ouverte dessus,
|
||||
# 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
|
||||
# Simulation Try/Catch en Bash pour l'écriture du fichier ISO
|
||||
TARGET_OUT="\$WORK_DIR/out"
|
||||
mkdir -p "\$TARGET_OUT" 2>/dev/null || true
|
||||
|
||||
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; }
|
||||
DEST="$WORK_DIR/out/$(basename "$NEW_ISO")"
|
||||
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"
|
||||
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
|
||||
FINAL="$WORK_DIR/out/$(basename "${NEW_ISO%.iso}")-$(date +%H%M%S).iso"
|
||||
echo -e "\e[33m[!] '$DEST' est verrouillée (une VM l'utilise ?). Écriture sous un nom unique.\e[0m" >&2
|
||||
mv -f "$NEW_ISO" "$FINAL"
|
||||
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
|
||||
rm -rf "$STAGE" 2>/dev/null || true
|
||||
|
||||
echo "==> Nettoyage..."
|
||||
rm -rf /tmp/fws-build/work
|
||||
EOF
|
||||
|
||||
else
|
||||
# ── 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 "==> Build terminé ! ISO : $FINAL"
|
||||
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
|
||||
# Lancé par startx (cf. /root/.zprofile), uniquement dans le live FWS.
|
||||
if [ ! -d /run/archiso ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Lancé par startx (cf. /root/.zprofile)
|
||||
xsetroot -solid "#1a1a2e"
|
||||
|
||||
# Openbox en arrière-plan : gestionnaire de fenêtres pour l'installateur.
|
||||
openbox &
|
||||
_OB_PID=$!
|
||||
|
||||
# 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
|
||||
sleep 1
|
||||
exec calamares
|
||||
|
||||
@@ -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.
|
||||
# Sur le système installé, /run/archiso n'existe pas, donc rien ne se lance.
|
||||
if [[ -d /run/archiso && "$(tty)" == "/dev/tty1" && -z "$DISPLAY" ]]; then
|
||||
# Démarrage automatique de Xorg + Calamares sur tty1 (autologin root).
|
||||
# La session X exécute /root/.xinitrc qui lance Openbox + Calamares.
|
||||
if [[ "$(tty)" == "/dev/tty1" && -z "$DISPLAY" ]]; then
|
||||
exec startx -- vt1
|
||||
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
|
||||
# Objectif : système live bootable + installateur Anaconda
|
||||
# (migration depuis Calamares) + jeu minimal d'outils de rescue.
|
||||
# Objectif : système live bootable + installeur Calamares
|
||||
# fonctionnel + jeu minimal d'outils de rescue.
|
||||
# ============================================================
|
||||
|
||||
# --- Base système ---
|
||||
@@ -26,7 +26,6 @@ memtest86+
|
||||
memtest86+-efi
|
||||
|
||||
# --- Filesystems ---
|
||||
squashfs-tools
|
||||
btrfs-progs
|
||||
e2fsprogs
|
||||
exfatprogs
|
||||
@@ -61,7 +60,6 @@ wget
|
||||
zsh
|
||||
grml-zsh-config
|
||||
bash
|
||||
zenity
|
||||
nano
|
||||
vim
|
||||
less
|
||||
@@ -86,15 +84,21 @@ htop
|
||||
alsa-utils
|
||||
sof-firmware
|
||||
|
||||
# --- Xorg + Openbox (session graphique de l'installateur) ---
|
||||
# --- Xorg + Openbox (pour Calamares) ---
|
||||
xorg-server
|
||||
xorg-xinit
|
||||
xorg-xrandr
|
||||
xorg-xsetroot
|
||||
openbox
|
||||
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) ---
|
||||
qemu-guest-agent
|
||||
@@ -103,17 +107,3 @@ open-vm-tools
|
||||
|
||||
# --- FWS (fws-local) ---
|
||||
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_tool_options=('-comp' 'xz' '-Xbcj' 'x86' '-b' '1M' '-Xdict-size' '1M')
|
||||
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=(
|
||||
["/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 FWS, see the project page:
|
||||
https://github.com/You-re-like-Windows-a-bitch/fws
|
||||
To install [38;2;23;147;209mFWS[0m follow the installation guide:
|
||||
https://wiki.archlinux.org/title/Installation_guide
|
||||
|
||||
For Wi-Fi, authenticate to the wireless network using the [35miwctl[0m utility.
|
||||
For mobile broadband (WWAN) modems, connect with the [35mmmcli[0m utility.
|
||||
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
|
||||
# NB : ce fichier est SOURCÉ par le shell de login (zsh sur le live), pas exécuté
|
||||
# → le shebang est ignoré. En zsh « status » est une variable spéciale EN LECTURE
|
||||
# SEULE (alias de $?) : s'y affecter casse (« read-only variable: status »).
|
||||
# On utilise donc un autre nom.
|
||||
_fastfetch_rc=$?
|
||||
if [ "${_fastfetch_rc}" -eq 0 ]; then
|
||||
status=$?
|
||||
if [ "${status}" -eq 0 ]; then
|
||||
fastfetch
|
||||
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
|
||||
# Objectif : système live bootable + installateur Anaconda
|
||||
# (migration depuis Calamares) + jeu minimal d'outils de rescue.
|
||||
# Objectif : système live bootable + installeur Calamares
|
||||
# fonctionnel + jeu minimal d'outils de rescue.
|
||||
# ============================================================
|
||||
|
||||
# --- Base système ---
|
||||
@@ -26,7 +26,6 @@ memtest86+
|
||||
memtest86+-efi
|
||||
|
||||
# --- Filesystems ---
|
||||
squashfs-tools
|
||||
btrfs-progs
|
||||
e2fsprogs
|
||||
exfatprogs
|
||||
@@ -85,7 +84,7 @@ htop
|
||||
alsa-utils
|
||||
sof-firmware
|
||||
|
||||
# --- Xorg + Openbox (session graphique de l'installateur) ---
|
||||
# --- Xorg + Openbox (pour Calamares) ---
|
||||
xorg-server
|
||||
xorg-xinit
|
||||
xorg-xrandr
|
||||
@@ -93,6 +92,14 @@ xorg-xsetroot
|
||||
openbox
|
||||
ttf-dejavu
|
||||
|
||||
# --- Calamares (fournis par fws-local) ---
|
||||
calamares
|
||||
kpmcore
|
||||
qt5-base
|
||||
qt5-svg
|
||||
qt5-webengine
|
||||
qt6-base
|
||||
|
||||
# --- Agents VM (pratique pour tester l'ISO) ---
|
||||
qemu-guest-agent
|
||||
virtualbox-guest-utils-nox
|
||||
@@ -100,17 +107,3 @@ open-vm-tools
|
||||
|
||||
# --- FWS (fws-local) ---
|
||||
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/Installation_guide"]="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