diff --git a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks index d2abb84..91a1e5e 100644 --- a/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks +++ b/configs/releng/airootfs/usr/share/anaconda/interactive-defaults.ks @@ -89,17 +89,15 @@ SYSROOT=/mnt/sysroot # DNS pour que « pacman -S » fonctionne dans le chroot. cp -f /etc/resolv.conf "$SYSROOT/etc/resolv.conf" 2>/dev/null || true -# --- Hostname : reprendre celui saisi dans Anaconda, sinon « fws » ----------- -# BUG observé : Anaconda écrit un /etc/hostname VIDE dans la cible (le hostname -# du spoke Réseau n'est pas capté). On reprend donc le hostname COURANT du LIVE -# (Anaconda l'applique au live quand on le saisit dans le spoke) s'il diffère du -# défaut archiso, sinon on pose un défaut propre « fws » — jamais de hostname -# vide. (Ce %post tourne APRÈS l'écriture d'Anaconda → on écrase son fichier -# vide.) -HN="$(cat /proc/sys/kernel/hostname 2>/dev/null)" -case "$HN" in - ""|archlinux|localhost|localhost.localdomain) HN="fws" ;; -esac +# --- Hostname : valeur saisie dans le champ « Nom de machine » du spoke User -- +# Anaconda ne capte PAS le hostname du spoke Réseau (→ /etc/hostname vide). On a +# donc ajouté un champ Hostname au spoke Utilisateur (cf. patch du paquet +# anaconda) : user.py écrit la valeur dans /tmp/fws-hostname (live). On la +# nettoie (caractères de hostname valides) et on l'écrit dans la cible ; défaut +# « fws » si vide/absent → plus jamais de hostname vide ni « archiso ». +HN="" +[ -f /tmp/fws-hostname ] && HN="$(tr -cd 'a-zA-Z0-9._-' < /tmp/fws-hostname)" +[ -n "$HN" ] || HN="fws" echo "$HN" > "$SYSROOT/etc/hostname" # Choix du bureau (écrit par l'addon « Choix du bureau », à venir ; valeur lue @@ -207,44 +205,6 @@ else echo "[FWS] AVERTISSEMENT : grub-install a échoué — bootloader à refaire à la main" fi -# --- 3bis) Clavier : corriger le keymap selon le TERRITOIRE de la locale ------ -# BUG observé : Anaconda dérive le clavier de la LANGUE en IGNORANT le territoire -# → fr_CH (Suisse) donne « fr » (France) au lieu du clavier SUISSE. On corrige : -# si un keymap console spécifique au territoire existe (fr_CH, de_CH…), on -# l'impose dans /etc/vconsole.conf, et on règle aussi le clavier X11 (pour un -# bureau installé ensuite) via langtable. Locale lue dans /etc/locale.conf, à -# défaut dans /root/anaconda-ks.cfg (« lang … »). -fix_keyboard() { - local langv loc lng terr font xk xl xv - langv="$(. /etc/locale.conf 2>/dev/null; printf '%s' "${LANG:-}")" - [ -n "$langv" ] || langv="$(sed -n 's/^lang[[:space:]]\+//p' /root/anaconda-ks.cfg 2>/dev/null | head -1)" - loc="${langv%%.*}" # fr_CH.UTF-8 → fr_CH - lng="${loc%%_*}" # fr - terr="${loc#*_}"; [ "$terr" = "$loc" ] && terr="" # CH - [ -n "$terr" ] || return 0 - find /usr/share/kbd/keymaps -name "${lng}_${terr}.map.gz" 2>/dev/null | grep -q . || return 0 - # vconsole (console TTY) : keymap du territoire (ex. fr_CH). On préserve FONT. - font="$(grep '^FONT=' /etc/vconsole.conf 2>/dev/null)" - { echo "KEYMAP=${lng}_${terr}"; [ -n "$font" ] && echo "$font"; } > /etc/vconsole.conf - # X11 (bureau) : layout/variant via langtable (ex. fr_CH → 'ch(fr)' → ch/fr). - xk="$(python3 -c "import langtable; k=langtable.list_keyboards(languageId='$lng', territoryId='$terr'); print(k[0] if k else '')" 2>/dev/null)" - case "$xk" in - *'('*')') xl="${xk%%(*}"; xv="${xk#*(}"; xv="${xv%)}" ;; - ?*) xl="$xk"; xv="" ;; - *) return 0 ;; - esac - mkdir -p /etc/X11/xorg.conf.d - cat > /etc/X11/xorg.conf.d/00-keyboard.conf < ch(fr))/' \ + pyanaconda/modules/localization/localization.py + # Garde-fou : casse le build si le motif amont a changé (le patch silencieux). + grep -q 'locale = self.language # FWS' \ + pyanaconda/modules/localization/localization.py + + # ── FWS : champ « Nom de machine » dans le spoke Utilisateur ─────────────── + # Anaconda ne propage PAS le hostname (le champ du spoke Réseau est perdu chez + # nous → /etc/hostname vide). On ajoute donc un champ Hostname à l'onglet de + # création de compte (ligne 2 de la grille, libre) ; user.py écrit la valeur + # dans /tmp/fws-hostname, que le %post du kickstart applique à /etc/hostname. + python3 - <<'PYEOF' +import glob + +# 1) user.glade : insérer label + entry "Host name" APRÈS le bloc username_entry. +glades = [p for p in glob.glob("pyanaconda/**/user.glade", recursive=True) + if 'username_entry' in open(p, encoding='utf-8').read()] +assert glades, "FWS: user.glade introuvable" +g = glades[0] +s = open(g, encoding='utf-8').read() +assert 'id="hostname_entry"' not in s, "FWS: glade déjà patché" +i = s.index('id="username_entry"') +k = s.index('', i) # fin du packing de username_entry +j = s.index('', k) + len('') # fin du EXTERNE (pas l'accessible) +block = ''' + + + True + False + 10 + _Host name + True + hostname_entry + 1 + + + + + + 0 + 2 + + + + + True + True + 50 + + + Host Name + + + + + 1 + 2 + + ''' +open(g, 'w', encoding='utf-8').write(s[:j] + block + s[j:]) + +# 2) user.py (GUI) : récupérer le widget + écrire /tmp/fws-hostname dans apply(). +pys = glob.glob("pyanaconda/ui/gui/spokes/user.py") +assert pys, "FWS: user.py introuvable" +p = pys[0] +s = open(p, encoding='utf-8').read() +anchor = 'self._username_entry = self.builder.get_object("username_entry")' +assert anchor in s, "FWS: ancre username_entry absente" +s = s.replace(anchor, + anchor + '\n self._hostname_entry = self.builder.get_object("hostname_entry")', + 1) +ap = 'set_user_list(self._users_module, self._user_list, remove_unset=True)' +assert ap in s, "FWS: ancre apply() absente" +s = s.replace(ap, ap + ''' + + # FWS : mémorise le nom de machine saisi (cible pas encore montée) pour + # le %post du kickstart, qui l'écrira dans /etc/hostname. + try: + _hn = self._hostname_entry.get_text().strip() + except Exception: + _hn = "" + try: + with open("/tmp/fws-hostname", "w") as _f: + _f.write(_hn) + except OSError: + pass''', 1) +open(p, 'w', encoding='utf-8').write(s) +print("FWS: champ Hostname ajouté au spoke Utilisateur (glade + user.py)") +PYEOF +} + build() { cd "$srcdir/$_srcdir" # Glade désactivé (catalogue designer, inutile au runtime) → pas de dép glade. diff --git a/setup-aur.sh b/setup-aur.sh index ce9ca00..c73e05a 100755 --- a/setup-aur.sh +++ b/setup-aur.sh @@ -114,7 +114,10 @@ if [ -z "$FWS_IN_CONTAINER" ] && ! host_is_arch; then "${SUDO[@]}" podman pull "$IMAGE" info "Relance dans le conteneur (setup-aur.sh)…" - "${SUDO[@]}" podman run --rm "${TTY[@]}" --privileged \ + # --network=host : le bridge podman ne route plus vers l'extérieur sur + # certains réseaux (firewalld/NAT, → « Resolving timed out »). On partage la + # pile réseau de l'hôte (internet + DNS OK) pour les pacman/makepkg/AUR. + "${SUDO[@]}" podman run --rm "${TTY[@]}" --network=host --privileged \ -e FWS_IN_CONTAINER=1 \ -v "$REPO_DIR":"$REPO_DIR" \ -v fws-pacman-cache:/var/cache/pacman/pkg \