🔒 Repository is read-only – file editing is disabled.

PaganLinux/fix-calamares.sh main

265 linii Raw ← Powrót
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
#!/bin/bash
# =============================================================================
# fix-calamares.sh – przebudowuje TYLKO Calamaresa (bez pełnego build-pagan.sh)
# -----------------------------------------------------------------------------
# Po co: gdy Calamares jest zepsuty (np. linkuje Qt6 QML / zła wersja symboli),
# pełny `build-pagan.sh` odbudowuje przy okazji kilka pakietów i zjada zasoby.
# Ten skrypt korzysta z istniejącego rootfsu i odbudowuje WYŁĄCZNIE calamares
# (opcjonalnie kpmcore), a na końcu może przepakować samo ISO (bez przebudowy
# pakietów – to robi create_iso z buildera).
#
# Użycie:
#   sudo ./fix-calamares.sh                  # przebuduj calamares + przepakuj ISO
#   sudo ./fix-calamares.sh --no-respin      # tylko przebuduj (bez ISO)
#   sudo ./fix-calamares.sh --jobs 4         # limit równoległości (domyślnie auto: RAM/2)
#   sudo ./fix-calamares.sh --with-kpmcore   # dobuduj też kpmcore
#   sudo ./fix-calamares.sh --respin-only    # nic nie buduj, tylko przepakuj ISO
# =============================================================================
set -euo pipefail
cd "$(dirname "$0")"

RESPIN=1
RESPIN_ONLY=0
WITH_KPMCORE=0
JOBS="${PAGAN_JOBS:-}"
while [[ $# -gt 0 ]]; do
    case "$1" in
        --no-respin)    RESPIN=0; shift ;;
        --respin)       RESPIN=1; shift ;;
        --respin-only)  RESPIN_ONLY=1; RESPIN=1; shift ;;
        --with-kpmcore) WITH_KPMCORE=1; shift ;;
        --jobs)         JOBS="$2"; shift 2 ;;
        --jobs=*)       JOBS="${1#*=}"; shift ;;
        -h|--help)      awk 'NR>1 && /^#/ {print; next} NR>1 {exit}' "$0"; exit 0 ;;
        *) echo "Nieznany argument: $1" >&2; exit 2 ;;
    esac
done

if [[ ${EUID:-$(id -u)} -ne 0 ]]; then
    echo "❌ Uruchom jako root: sudo ./fix-calamares.sh" >&2
    exit 1
fi
[[ -n "$JOBS" ]] && export PAGAN_JOBS="$JOBS"
true

# ── Wczytaj funkcje buildera (main NIE wystartuje – plik jest source'owany) ──
set --
source ./build-pagan.sh
trap - EXIT   # bez podsumowania buildera

[[ -d "$PAGAN_ROOT/usr/lib" ]] || { echo "❌ Brak rootfs w $PAGAN_ROOT – zrób najpierw pełny build." >&2; exit 1; }

echo "═══ NAPRAWA CALAMARES ═══"
echo "  Rootfs:  $PAGAN_ROOT"
echo "  Zadania: ${PAGAN_JOBS:-auto} (rdzeni: $(nproc 2>/dev/null || echo '?'))"
echo "  Respin ISO: $([[ $RESPIN -eq 1 ]] && echo tak || echo nie)"

# ── Środowisko identyczne jak w install_calamares ──
export PATH="$TOOLS_DIR/bin:$PATH"
export PKG_CONFIG_PATH="$PAGAN_ROOT/usr/lib/pkgconfig:$PAGAN_ROOT/usr/share/pkgconfig"
export CMAKE_PREFIX_PATH="$PAGAN_ROOT/usr:/usr"
if [[ -f "$PAGAN_ROOT/usr/share/ECM/cmake/ECMConfig.cmake" ]]; then
    export ECM_DIR="$PAGAN_ROOT/usr/share/ECM/cmake"
fi
export LD_LIBRARY_PATH="$PAGAN_ROOT/usr/lib:/usr/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export XDG_DATA_DIRS="$PAGAN_ROOT/usr/share${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}"

# ── Limit równoległości (wrapper ninja w $TOOLS_DIR/bin) ──
_install_ninja_wrapper

# ── Naprawa absolutnej ścieżki DT_NEEDED w polkitd ──
# Starsze buildy linkowały bez SONAME i wpisywały /mnt/pagan/usr/lib/libduktape.so.
# W zainstalowanym systemie kończy się to kodem 127. Naprawiamy zależności przed
# Calamaresem, żeby także fix-calamares sam wystarczał do przygotowania ISO.
if [[ -x "$PAGAN_ROOT/usr/lib/polkit-1/polkitd" ]] && \
   readelf -d "$PAGAN_ROOT/usr/lib/polkit-1/polkitd" 2>/dev/null | grep -q '/mnt/pagan/'; then
    echo "  Naprawiam polkitd: usuwam absolutną zależność do /mnt/pagan..."
    sed -i -E '/^(duktape-2\.7\.0|polkit-127)$/d' "$RESUME_FILE" 2>/dev/null || true
    build_lfs_pkg "duktape" "2.7.0" \
        "https://duktape.org/duktape-2.7.0.tar.xz" "SKIP" \
        "cd src && gcc -O2 -fPIC -shared -Wl,-soname,libduktape.so -o libduktape.so duktape.c && install -m 755 libduktape.so \$PAGAN_ROOT/usr/lib/libduktape.so && install -m 644 duktape.h \$PAGAN_ROOT/usr/include/duktape.h && install -m 644 duk_config.h \$PAGAN_ROOT/usr/include/duk_config.h"
    build_lfs_pkg "polkit" "127" \
        "https://github.com/polkit-org/polkit/archive/127/polkit-127.tar.gz" "SKIP" \
        "( export LIBRARY_PATH=\"\$PAGAN_ROOT/usr/lib\"; meson setup build --prefix=/usr -Dintrospection=false && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install )"
fi

# ── Usuń zaległy Qt6 QML/Quick i stare KF6-QML (mieszanie wersji = symbol lookup error) ──
_purge_stale_qt
# ── Napraw stale configi Qt6 CMake (po rollbacku paga wskazują usuniętą wersję) ──
_fix_stale_qt_cmake

# ── Konfiguracja (settings.conf z modules-search + moduły) i branding ──
_write_calamares_config
_write_calamares_branding

# ── Ikona instalatora na pulpicie XFCE (live = autologin root) + ustawienia
# xfdesktop (style ikon, tapeta). Idempotentne; bez tego respin ISO nie odświeży
# pulpitu.
if [[ "${PAGAN_DE:-xfce}" == "xfce" ]]; then
    _setup_xfce_live_desktop
fi

# ── Release notes (pagan-news / pagan-update + wpisy changelogu) ──
_write_pagan_news

# ── Grupy systemowe: napraw wcięcia + dołóż grupy dla Calamaresa ──
_ensure_system_groups

# ── Polkit: dopełnij pliki usługi (bez polkitd KPMcore nie widzi dysków) ──
_ensure_polkit_units

# ── D-Bus: jednostki bez cyklu zależności (inaczej dbus.service jest pomijany
# przez systemd → brak polkitd/NetworkManager/lightdm). ──
_ensure_dbus_units

# ── D-Bus: polityka systemd (org.freedesktop.systemd1.conf). Bez niej PID1 nie
# zajmie nazwy org.freedesktop.systemd1 → systemctl/aktywacja usług/logind
# padają. To ta sama usterka, której objawem jest „Got disconnect on API bus”. ──
_ensure_systemd_dbus_policy

# ── WiFi: wpa_supplicant w /usr/sbin + aktywacja D-Bus dla NetworkManagera. ──
_ensure_wifi_supplicant

# ── Netinstall: backend `pag` w module packages Calamaresa. ──
_install_pag_package_backend

# ── Udev: baza hwdb (bez niej generator imds zgłasza błąd przy starcie). ──
_ensure_hwdb

# ── Strefy czasowe: bez skompilowanych danych moduł locale Calamaresa pada z
# „Bad path: …/zoneinfo/Europe/Warsaw” (kiedyś tzdata było tylko kopiowane). ──
_install_tzdata

# ── GRUB/initramfs: aliasy initramfs-<wersja>.img + /etc/default/grub. Bez nich
# grub-mkconfig nie wstawi linii `initrd` → zainstalowany system nie wstanie. ──
_ensure_grub_boot_artifacts

# ── Wtyczki: udostępnij <libdir>/qt6/plugins w katalogu runtime Qt ──
# (backend KPMcore + wtyczki KF6); bez tego qFatal „Failed to initialize KPMcore backend”.
_sync_qt_plugin_dirs
if _kpmcore_backend_ok; then
    echo "  ✓ backend KPMcore dostępny dla Qt ($(_qt_runtime_plugin_dir))"
else
    echo "  ⚠ backend KPMcore nadal niewidoczny – sprawdź instalację kpmcore" >&2
fi

if [[ $RESPIN_ONLY -eq 0 ]]; then
    # Wymuś przebudowę calamaresa mimo wpisu w resume.
    sed -i '/^calamares-3\.3\.14$/d' "$RESUME_FILE" 2>/dev/null || true

    # Martwe libpwquality (brak libcrack) → usuń, inaczej moduł „users” się go
    # podlinkuje i nie załaduje przy starcie („Module users loading FAILED”).
    _purge_broken_pwquality

    # os-prober – moduł partition woła go bezwarunkowo (inaczej „os-prober cannot start.”).
    if ! ( set +e; install_os_prober ); then
        echo "  ⚠ os-prober: budowa nieudana – Calamares zaloguje 'os-prober cannot start.'" >&2
    fi

    # KPMcore tylko jeśli brakuje albo wyraźnie zażądano.
    if [[ $WITH_KPMCORE -eq 1 || ! -e "$PAGAN_ROOT/usr/lib/cmake/KPMcore/KPMcoreConfig.cmake" ]]; then
        echo "  Buduję kpmcore-26.04.3..."
        build_lfs_pkg "kpmcore" "26.04.3" \
            "https://download.kde.org/stable/release-service/26.04.3/src/kpmcore-26.04.3.tar.xz" \
            "SKIP" \
            "cmake -B build -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -G Ninja && DESTDIR=\$PAGAN_ROOT ninja -C build install"
    fi

    # ── KF6: napraw configi eksportujące QML (stare, z pełnego KF6) ──
    # Budujemy minimalny KF6 bez QML; build_lfs_pkg pominie już zbudowane.
    KFURL="https://download.kde.org/stable/frameworks/6.28.0"; KFVER="6.28.0"
    _KFCFG="cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_TESTING=OFF -DKDE_INSTALL_USE_QT_SYS_PATHS=ON -DKDE_INSTALL_QTMETATYPESDIR=metatypes -DBUILD_PYTHON_BINDINGS=OFF"
    for _pp in "kcoreaddons:KF6CoreAddons" "kconfig:KF6Config" "ki18n:KF6I18n" "kwidgetsaddons:KF6WidgetsAddons"; do
        _cm="${_pp##*:}"; _tp="$PAGAN_ROOT/usr/lib/cmake/$_cm/${_cm}Targets.cmake"
        [[ -f "$_tp" ]] || continue
        if grep -q "Qml" "$_tp" 2>/dev/null; then
            echo "  KF6 $_cm: stary config z QML – wymuszam przebudowę ${_pp%%:*}"
            sed -i "/^${_pp%%:*}-6\.28\.0$/d" "$RESUME_FILE" 2>/dev/null || true
        fi
    done
    # KConfig/KI18n są wymagane przez Calamares (KPMcoreHelper) – przebuduj na
    # pewno bez QML (nawet jeśli detekcja nic nie znalazła, np. config już usunięty).
    sed -i -E '/^(kconfig|ki18n)-6\.28\.0$/d' "$RESUME_FILE" 2>/dev/null || true
    build_lfs_pkg "extra-cmake-modules" "$KFVER" "$KFURL/extra-cmake-modules-$KFVER.tar.xz" "SKIP" \
        "$_KFCFG && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install"
    build_lfs_pkg "kcoreaddons" "$KFVER" "$KFURL/kcoreaddons-$KFVER.tar.xz" "SKIP" \
        "$_KFCFG -DKCOREADDONS_USE_QML=OFF && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install"
    build_lfs_pkg "kconfig" "$KFVER" "$KFURL/kconfig-$KFVER.tar.xz" "SKIP" \
        "$_KFCFG -DKCONFIG_USE_QML=OFF && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install"
    build_lfs_pkg "ki18n" "$KFVER" "$KFURL/ki18n-$KFVER.tar.xz" "SKIP" \
        "$_KFCFG -DBUILD_WITH_QML=OFF && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install"
    build_lfs_pkg "kwidgetsaddons" "$KFVER" "$KFURL/kwidgetsaddons-$KFVER.tar.xz" "SKIP" \
        "$_KFCFG -DBUILD_DESIGNERPLUGIN=OFF && ninja -C build && DESTDIR=\$PAGAN_ROOT ninja -C build install"

    # Calamares bez QML, ale Z modułami Pythonowymi (mount/unpackfs/fstab/
    # bootloader/services-systemd/…) – bez nich settings.conf nie odpali
    # („Initialization Failed”), a system nie wstanie po instalacji.
    echo "  Buduję calamares-3.3.14 (WITH_QML=OFF, WITH_PYTHON=ON)..."
    build_lfs_pkg "calamares" "3.3.14" \
        "https://github.com/calamares/calamares/releases/download/v3.3.14/calamares-3.3.14.tar.gz" \
        "SKIP" \
        "cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DWITH_QT6=ON -DWITH_QML=OFF -DWITH_PYTHON=ON -DWITH_PYBIND11=ON -DCMAKE_DISABLE_FIND_PACKAGE_LibPWQuality=TRUE -DPython_EXECUTABLE=\$PAGAN_ROOT/usr/bin/python3 -DPython_ROOT_DIR=\$PAGAN_ROOT/usr -DBUILD_SCHEMA_TESTING=OFF -DBUILD_TESTING=OFF -DBUILD_CRASH_REPORTING=OFF && DESTDIR=\$PAGAN_ROOT ninja -C build install"

    # ── Weryfikacja ──
    echo ""
    echo "── Weryfikacja ──"
    if [[ -x "$PAGAN_ROOT/usr/bin/calamares" ]]; then
        echo "  ✓ /usr/bin/calamares obecny"
    else
        echo "  ✗ Brak /usr/bin/calamares" >&2
        exit 1
    fi
    if objdump -p "$PAGAN_ROOT/usr/lib/libcalamaresui.so.3.3.14" 2>/dev/null | grep -q 'NEEDED.*libQt6Qml'; then
        echo "  ✗ libcalamaresui NADAL linkuje libQt6Qml – -DWITH_QML=OFF nie zadziałało" >&2
        exit 1
    else
        echo "  ✓ libcalamaresui bez QML"
    fi
    # Komplet modułów wymaganych przez settings.conf (w tym Pythonowe).
    if ! _calamares_modules_ok; then
        echo "  ✗ Brakujące moduły Calamares: $(_calamares_missing_modules)" >&2
        echo "    Calamares MUSI być zbudowany z -DWITH_PYTHON=ON -DWITH_PYBIND11=ON" >&2
        echo "    (WITH_QML=OFF). Sprawdź w logu: '-- Skipped mount (No Python support)'." >&2
        exit 1
    else
        echo "  ✓ komplet modułów wymaganych przez settings.conf"
    fi
    # settings.conf MUSI mieć modules-search – inaczej Calamares nie znajdzie żadnego modułu.
    if ! grep -q '^modules-search:' "$PAGAN_ROOT/etc/calamares/settings.conf" 2>/dev/null; then
        echo "  ✗ settings.conf bez 'modules-search' – Calamares nie znajdzie modułów" >&2
        exit 1
    else
        echo "  ✓ settings.conf ma modules-search"
    fi
    # Backend KPMcore widoczny dla runtime Qt.
    if ! _kpmcore_backend_ok; then
        echo "  ✗ Backend KPMcore niewidoczny w '$(_qt_runtime_plugin_dir)'" >&2
        echo "    (_sync_qt_plugin_dirs powinno skopiować kpmcore do katalogu wtyczek Qt)" >&2
        exit 1
    else
        echo "  ✓ backend KPMcore widoczny dla Qt"
    fi
    # Świeży cache dynamicznego linkera w rootfsie (po usunięciu starych libek).
    ldconfig -r "$PAGAN_ROOT" 2>/dev/null || true
fi

# ── Przepakowanie ISO z istniejącego rootfsu (bez przebudowy pakietów) ──
if [[ $RESPIN -eq 1 ]]; then
    echo ""
    echo "── Respin ISO (create_iso) ──"
    export PAGAN_DE="${PAGAN_DE:-xfce}"
    export BUILD_IMG=0 BUILD_ISO=1
    umount_virtual_fs >/dev/null 2>&1 || true
    # Initramfs przebudowujemy zawsze – jest szybki, a zawiera logikę znajdowania
    # nośnika live (Ventoy/exFAT) i uruchamiania sesji; bez tego respin ISO
    # pakowałby stary initramfs.
    build_initramfs
    create_iso
    report_artifacts || true
fi

echo ""
echo "✅ Gotowe. Calamares: $PAGAN_ROOT/usr/bin/calamares"
if [[ $RESPIN -eq 1 ]]; then
    ls -la --time-style=+%H:%M "$OUTPUT_DIR" 2>/dev/null || true
fi