forked from pisilinux-rs/yali-rs
d161556c73330e0970ec39bf3d27f495fb531645
Veri kaybı / güvenlik / açılmayan sistem düzeyindeki 7 sorun giderildi.
## 1. Parola düz metin olarak argv'ye geçiyordu (jobs/users.rs)
`sh -c "echo 'user:pass' | chpasswd -c SHA512"` deseni kaldırıldı:
- parola /proc/<pid>/cmdline üzerinden okunabiliyordu
- ' veya $(...) içeren parola komutu bozuyordu
Doğru desen (`set_password_via_chpasswd`, stdin pipe) geri getirildi —
jobs/partition.rs::run_luks_format ile aynı. Yazılan veri yazımdan
sonra sıfırlanıyor. Dosyadaki yorum satırındaki güvenli sürüm de
silinerek tek uygulama bırakıldı.
## 2. parted "MB" birim tuzağı geri gelmişti (jobs/partition.rs:237)
EFI ve swap `{}MiB` geçerken kök bölüm `{}MB` idi. parted "MB"yi ondalık
(10^6) okur, bizim hesaplar ikilidir (2^20): 4609MB = 9001992.1875
sektör → hizasız başlangıç. AGENTS.md bunu KRİTİK not almıştı;
`7209d58` ile düzeltilmiş, sonra regresyona uğramıştı. `{}MiB` yapıldı
ve nedeni yorumla sabitlendi.
## 3. LUKS çekirdek parametresi geçersizdi (jobs/bootloader.rs)
`cryptdevice=UUID=<x>:cryptroot` geçerli bir söz dizimi değil, üstelik
kök bölümü `is_uefi` ile tahmin ediliyordu (UEFI'de 3, BIOS'ta 2) —
manuel modda bu numaralar assign_partition_numbers'tan geldiği için
ilgisiz bir bölümün UUID'si okunabiliyordu. `.unwrap_or_default()`
`UUID=:` üretebiliyordu.
Artık `cryptsetup status` ile mapper'ın arkasındaki GERÇEK aygıt
çalışma zamanında çözülüyor, blkid ile LUKS başlık UUID'si alınıyor,
ve dracut (`rd.luks.uuid=luks-…`) + mkinitcpio (`cryptdevice=…`)
biçimleri birlikte yazılıyor. UUID boş çıkarsa hata verilir; tahmin
yok.
Ayrıca `CRYPTROOT_NAME` sabiti tanımlandı: "cryptroot" 5 yerde
hardcoded'dı, artık tek kaynaktan geliyor.
## 4. Kritik hatalar yutuluyordu (jobs/finish.rs)
- RunComarJob tamamen yorum satırıydı → `pisi configure-pending`
hiç çalışmıyordu, paketlerin post-install betikleri koşmuyordu.
Geri getirildi; "yapılandırılacak paket yok" durumu zararsız sayılıyor.
- ldconfig ve update-environment hataları loglanıp yutuluyordu.
update-environment PisiLinux init finalizasyonudur: yutulursa
kurulum "başarılı" görünür ama sistem açılmaz. Artık fatal.
- CleanupLiveJob'da 10 adet `let _ =`; depo tanımları sessizce
başarısız olabiliyordu (kullanıcı paket kuramaz). Artık fatal.
## 5. Hata durumunda hiç temizlik yapılmıyordu (jobs/mod.rs)
run_all ilk hatada return ediyordu: hedef bölümler bağlı, LUKS
mapper'ları açık, swap aktif kalıyordu. Yeniden başlatma reddediliyor,
elle düzeltmesi dakikalar sürüyordu.
- JobQueue::cleanup listesi eklendi; with_cleanup(...) ile verilen
işler başarıda da hatada da çalışır.
- Yeni EmergencyCleanupJob (jobs/cleanup.rs): tüm mount'lar → LVM
lvchange -an → cryptsetup close (yalnızca hedef diskin
mapper'ları) → swapoff.
- Temizlik de hata verirse bu hatalar asıl hataya eklenip
kullanıcıya "elle ne yapılacak" listesi olarak gösterilir.
## 6. UnmountBindJob /home, /var, /boot'u çözmüyordu (jobs/execution.rs)
Elle yazılmış sabit liste (proc, sys, dev, boot/efi) yalnızca otomatik
modda doğruydu; manuel düzende ek bölümler kurulum bitince bağlı
kalıyordu. Artık /proc/self/mountinfo okunuyor ve mount/ altındaki her
şey en derinden yüzeye çözülüyor — düzen bilinmeye gerek yok.
mountinfo'daki \0NNN oktal kaçışlarını çözen unescape_mount_field ve
mounted_paths_under eklendi.
## 7. Parolasız LUKS kombinasyonu (jobs/partition.rs)
encrypt_root=true + boş parola → kök düz ext4 formatlanıyor, sonra
MountPartitionsJob /dev/mapper/cryptroot'u mount etmeye çalışıp
kurulumu öldürüyordu. Job başında reddediliyor.
## 8. rescue.rs'te iki panik noktası
- &entry.summary[..50]: len() bayt sayar, dilim bayt sınırı ister.
pisi history çıktısı paket adlarından gelir ve Türkçe karakter
içerir (ş/ğ 2 bayt) → sınırda PANİK. chars().take(50) ile değişti.
- parse_pisi_history: '[' ve ']' bağımsız aranıyordu; ']' önce
gelen girdide remainder[start+1..end] PANİK veriyordu. Kapanış
parantez açılıştan sonra aranıyor.
Her ikisi için 5 test eklendi (rescue.rs'te test modu yoktu).
## Doğrulama
cargo check --all-targets : 0 hata, 0 uyarı
cargo test : 28/28 geçti (23 + 5 yeni)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(P0): parola sızıntısı, parted birim hatası, hatalı LUKS cmdline, yutulan hatalar, hata temizliği
YALI (Yet Another Linux Installer) — Rust / egui
A rewritten Pisi GNU/Linux installation tool in Rust and egui. YALI installs the system from the live environment, installs packages, and performs basic configuration. It is a modern, fast, and maintainable rewrite of the original Python/Qt version.
Features
- 10-step installation wizard: Welcome → Location → Keyboard → Network → Disk Partitioning → Users → Bootloader → Summary → Installation → Finish
- Two modes: Graphical interface (default) and automatic installation with answer file (
--auto-install answer.toml) - Demo mode: Skips system checks, simulates installation (
--demo) - Disk partitioning: Automatic (GPT/MBR) or manual, LVM and LUKS encryption support
- Network configuration: WiFi scanning (nmcli), proxy settings
- Bootloader: GRUB device/password/timeout settings, kernel parameters
- Rescue mode: Chroot, GRUB reinstallation, Pisi rollback
- OEM mode: Predefined settings for manufacturer pre-installation
- Internationalization: Turkish and English (with rust-i18n via TOML locale files)
- Branding system: Runtime-loadable
branding.tomlfor logo, slides, color settings - Theme: Dark/light theme, atomic color management, custom gradient buttons
- Async job queue: All installation steps run in separate
tokioruntime, UI updated viampscchannel - System checks: 8 pre-checks including RAM, disk space, internet, UEFI, CPU, NVMe
- Slideshow: Custom branded slides for 9 desktop environments
- Demo session cleanup: Removes live environment artifacts, adds production repository
Usage
# Normal installation (requires root)
sudo cargo run --release
# Demo mode (no root required)
cargo run --release -- --demo
# Automatic installation (with answer file)
sudo cargo run --release -- --auto-install answer.toml
# Slideshow test (standalone window, no root required)
cargo run --bin slides_test [desktop] [lang]
# E.g.: cargo run --bin slides_test xfce en
Project Structure
├── src/
│ ├── main.rs # Entry point, eframe App, GUI layout
│ ├── lib.rs # Library root (reserved for future DLL structure)
│ ├── installer.rs # InstallerStep trait, GlobalState, WelcomeStep
│ ├── funct.rs # Shared UI helpers (form fields, language selector)
│ ├── branding.rs # Branding.toml loader (logo, slides, theme, OEM)
│ ├── bin/
│ │ └── slides_test.rs # Standalone slideshow test binary
│ ├── ui/
│ │ ├── theme.rs # Colors, fonts, Visuals, section_heading, error/warning/success boxes
│ │ ├── buttons.rs # Gradient buttons (primary, secondary, danger, etc.)
│ │ ├── combobox.rs # ComboBox helpers (show_combo_box, selectable_value)
│ │ ├── combobox_stil.rs # ComboBox visual constants (weak_bg, border, text colors)
│ │ ├── slideshow.rs # Auto-advancing slideshow
│ │ └── error_screen.rs # Error screen (log viewer, copy, retry)
│ ├── steps/
│ │ ├── location.rs # Location/timezone + date/time
│ │ ├── license.rs # License agreement
│ │ ├── keyboard.rs # Keyboard layout/variant selection
│ │ ├── network.rs # Network configuration (WiFi, proxy)
│ │ ├── partition.rs # Disk partitioning (automatic + manual + LVM)
│ │ ├── users.rs # User account creation
│ │ ├── bootloader.rs # GRUB configuration
│ │ ├── summary.rs # Installation summary
│ │ ├── execution.rs # Installation execution (progress bar, log)
│ │ ├── finish.rs # Completion screen
│ │ ├── netinstall.rs # Extra package group selection
│ │ └── rescue.rs # Rescue mode (chroot, GRUB, Pisi takeback)
│ ├── jobs/mod.rs # Async job queue and all installation jobs
│ └── autoinstall/
│ ├── mod.rs # Answer file loading and state application
│ └── checker.rs # System pre-checks
├── locales/
│ ├── tr.toml # Turkish translations
│ └── en.toml # English translations
├── slides/
│ ├── img/ # Slide images (PNG)
│ ├── slides_tr.toml # Turkish slide content
│ └── slides_en.toml # English slide content
├── assets/
│ ├── icons/ # UI icons (YALI_icon_LIGHT.svg, language-icon.svg, etc.)
│ ├── flags/ # Country flags (~250 SVG)
│ └── pisi-logo-*.png # Distribution logos (branding `[general]`)
├── branding.toml # Default branding configuration
├── branding_en.toml # English branding
├── branding_tr.toml # Turkish branding
└── answer-example.toml # Example answer file
Installation Workflow
- Welcome — Language selection, system checks, rescue mode
- Location / Time — Timezone selection (region/area dual ComboBox), GeoIP, NTP or manual date/time
- Keyboard — Layout/variant selection, search, live preview (setxkbmap)
- Network — WiFi scanning, connection, proxy
- Disk Partitioning — Automatic (guided) or manual, LVM, LUKS
- Users — Account creation, password strength indicator, root password, autologin
- Bootloader — GRUB device, timeout, password, kernel parameters
- Summary — Review all selections
- Installation — Slideshow + progress bar + live log
- Finish — Successful installation, reboot or return to live desktop
Dependencies
| Dependency | Version | Purpose |
|---|---|---|
eframe |
0.27 (wgpu) | egui framework, WebGPU backend |
egui_extras |
0.27 (image, file, svg) | Image loading, file dialogs, SVG |
image |
0.24 | PNG decoding |
serde / toml |
1.0 / 0.8 | Branding and answer file serialization |
zbus |
4.0 | D-Bus communication (COMAR) |
tokio |
1.0 (full) | Async job queue |
sysinfo |
0.30 | System information (RAM, disk, OS) |
rust-i18n |
3.1 | Internationalization |
chrono |
0.4 | Date/time operations |
License
GNU General Public License v3.0
This project is developed by the Pisi GNU/Linux team.
Releases
1
yali-rs v4.0.3
Latest
Languages
Rust
98.8%
Makefile
1.2%