# 33 — Operatör Arayüzü Rehberi (`bf`) > Kısa özet: Bu rehber, Linux/DevOps'a yeni başlayan bir operatörün Blueforce cihazını **git deposundan** kurmasını ve tek giriş noktası olan `sudo bf` **grafik operatör uygulaması** ile cihazı işletmesini adım adım anlatır. Kurulum, filo işlemleri, merkez hazırlığı, araçlar ve cihaz bilgisi işlerinin tamamı bu pencereden açılır; komut ezberlemek gerekmez. - Dosya: `docs/33-OPERATOR-CONSOLE.md` - İlgili kararlar: `24-DECISION-LOG.md#K-09` (golden image + kurucu), `#K-12` (kimlik formatı `^[0-9]{8}$`), `#K-13` (SSH anahtar zorunlu), `#K-11` (onaysız update yasağı), `#K-21` (durum modeli), `#K-22` (RDP her zaman hazır / `bf-gui-*` yalnız yerel GUI) - Uygulama: Python paketi `bfos` (depo kökü) — `bfos/ui_gui.py` (grafik arayüz, tkinter), `bfos/tui.py` + `bfos/cli.py` (terminal konsolu), `bfos/operations.py` (iş mantığı + işlem kataloğu), `bfos/runner.py` (çalıştırma + denetim kaydı), `bfos/config.py` (Türkçe metinler) - Giriş noktası: `admin/bf` (sarmalayıcı) → `sudo bf` ve `sudo bf --tui`. Kurucu: `admin/bf-bootstrap.sh` - Yedek yol: `admin/bf-menu` + `admin/lib/*` (eski bash konsolu) — ana yol değildir; yalnız Python'suz cihazlar ve olağanüstü durumlar için korunur - Durum: [ ] Taslak — pencere yerleşimi ve örnek satırlar LAB'da alınan gerçek koşuyla güncellenir > **Dürüstlük notu (bu reponun kuralı):** Aşağıdaki pencere ve çıktı örnekleri, tasarımı anlatmak için yazılmıştır. Gösterilen metinler uygulamanın kaynağından (`bfos/ui_gui.py`, `bfos/config.py`, `bfos/runner.py`) alınmış **gerçek satır biçimleridir**; ancak pencere yerleşimi tema, ekran çözünürlüğü ve envanter içeriğine göre birebir farklı görünür. Kurulum betiğinin kendi çıktısı (`[installer] ...` satırları) LAB koşusunda bu dosyaya işlenir (§10, §13). --- ## 1. Amaç **Bu araç nedir?** `bf`, cihaza `sudo bf` yazınca açılan **grafik operatör uygulamasıdır**. Varsayılan olarak **basit mod** gelir: ekranda üç büyük düğme vardır — `Kur`, `Durum`, `Çıkış`. Üst çubuktaki `Detaylı mod` düğmesiyle **5 kategori sekmesi** açılır: Kurulum, Cihaz işlemleri, Merkez hazırlığı, Araçlar, Cihaz bilgisi. Listeden bir işlem seçip `Komutu göster ve çalıştır` düğmesine basarsın; uygulama senin adına doğru komutu üretir, çalıştırmadan **önce gösterip onay ister** ve ne yaptığını Türkçe satırlarla akıtır. **Neyi kolaylaştırır?** Normalde cihazı kurmak, durumunu okumak, teşhis paketi almak veya bir filo işlemi başlatmak için onlarca komutu ve doğru sırasını bilmek gerekir. `bf` bunları sekmeler ve arama yapılabilir listeler altında toplar, her komutu **çalıştırmadan önce** gösterir, tehlikeli işlemlerde ikinci kez sorar, `production` dalgası ve sürüm kapısı için ayrı onay ister ve her işlemi bir denetim kaydına (`/var/log/blueforce-console.log`, mod `600`) yazar. Kısacası: ezberleyeceğin tek şey `sudo bf` komutudur. ## 2. Kapsam - Kapsam içi: Ubuntu'da ilk kurulum (git'ten indir + bootstrap), basit mod ve 5 kategori sekmesi, üst çubuktan hedef seçimi (bayi no / dalga / tüm filo), uçtan uca örnek seans, yetki modeli (`sudo bf` = tam yetki), şifre dosyası (`bf-creds`) davranışı, grafik arayüz açılamadığında ne olacağı, en sık hatalar ve güvenlik kuralları. - Kapsam dışı: ISO/firstboot/offline provisioning yolu (26, 27 — artık **ikincil/opsiyonel**), merkez sunucularının kurulumu (07, 09 — arayüz yalnız **hazırlar ve denetler**, kurmaz), update onay zincirinin merkez tarafı (10, 21), rol bazlı eğitim müfredatı (31). ## 3. Kararlar ```text KARAR: Cihaz ve filo işlemlerinin tek operatör giriş noktası `sudo bf` grafik uygulamasıdır (`bfos/ui_gui.py`, tkinter). Operatör komut ezberlemez; basit modda üç düğmeden, detaylı modda kategori sekmesinden seçer. GEREKÇE: Operatör profili Linux/DevOps'a yeni başlayan kişidir; serbest komut yazımı 700 cihazda yazım hatasını filo arızasına çevirir (K-11 blast-radius). Arayüz her komutu çalıştırmadan önce gösterir ve onay ister; dalga kapılı playbook'lara bayrak sessizce geçirilmez, operatör kapıyı ayrıca onaylar. ALTERNATİF: Numara yazılan terminal menüsü (`sudo bf --tui`, aynı iş mantığı) — grafik ekran yoksa (SSH/başsız oturum) yedek yol olarak korunur. Eski bash konsolu (`admin/bf-menu`) — Python'suz cihaz için son çare olarak durur, ana yol değildir. Yalnız merkez Semaphore UI — saha cihazında çevrimdışıyken erişilemez; merkez tarafı için korunur (09). RİSK: Arayüzün katalog tablosu, altındaki playbook'tan ayrışır ve yanlış kapıyla çalıştırır; azaltma: komut üretimi playbook kapsamını (simple/wave/release) playbook dosyasının kendisinden okuyup karşılaştırır, uyuşmazlıkta **çalıştırmayı reddeder** (`bfos/operations.py` + `bfos/ui_gui.py` → kapsam karşılaştırması; yıkıcı işlemler için ayrıca katalog playbook'la senkron doğrulanır). MALİYET: Ücretsiz. LİSANS: Yok (kurum içi operatör aracı). ``` ```text KARAR: Kurulum git deposundan yapılır: depo klonlanır ve `sudo admin/bf-bootstrap.sh` (veya `curl -fsSL /admin/bf-bootstrap.sh | sudo bash`) çalıştırılır. Kurulum paketleri DEPONUN İÇİNDEDİR (`provisioning/offline-repo/packages/`, 1321 .deb, Git LFS): kurulan cihaz HİÇBİR ŞEY İNDİRMEZ, kurulum için internet gerekmez. ISO/firstboot yolu (26, 27) silinmez, ikincil/opsiyonel yol olarak korunur. GEREKÇE: Dağıtım imajı/ISO üretimi bu fazda yapılmayacaktır; en hızlı doğrulanabilir yol, sürümü Git geçmişiyle izlenebilen tek bir bootstrap scriptidir. Bootstrap repoyu `/opt/blueforce-linux` (veya bulunduğu checkout) altına alır, ön koşulları kurar, `bf-*` araçlarını ve grafik arayüz girişini (`/usr/local/bin/bf`) `/usr/local/bin`'e bağlar; cihaz kimliği (bayi no) hiçbir zaman bir imaja gömülmez (K-09/K-12). İnternet yalnız `git clone` adımında gerekir; saha cihazı kurulduktan sonra çevrimdışı çalışır. ALTERNATİF: Tek USB Field OS ISO (K-20) — üretim/doğrulama maliyeti yüksek olduğu için bu fazda birincil yol değil; yedek olarak korunur. USB'ye elle kopyalama — sürüm izi ve güncellenebilirlik yok; elendi. RİSK: `curl | bash` deseni kötüye kullanıma açıktır; azaltma: script yalnız resmi depo adresinden çalıştırılır, `git clone` ile içeriği önce incelenebilir, secret yazmaz, `git reset`/`stash` yapmaz ve yerel değişiklikleri asla silmez. MALİYET: Ücretsiz. LİSANS: Yok (kurum içi script). ``` ```text KARAR: Grafik arayüz varsayılandır; açılamıyorsa uygulama SUSMAZ: Türkçe hata verir ve `sudo bf --tui` yolunu önerir. Grafik arayüz için gereken `python3-tk` paketi çevrimdışı depoda pinlidir (`provisioning/offline-repo/manifests/base-packages.txt`) ve kurulum sonu kapısı `scripts/install/installer/modules/18-final-check.sh` tkinter'ı ayrıca denetler; eksikse kurulum durdurulmaz, WARN yazıp terminal konsolunu işaret eder. GEREKÇE: Minimal imajlarda `python3` vardır ama pencere araç takımı yoktur; operatör ne arayüz ne de başka bir yol bulamazsa elinde hiçbir giriş noktası kalmaz ve cihazda internet olmadığı için bu durumu düzeltemez. Paketin depoda pinli olması bu riski kurulum anında kapatır; kapı ayrıca görünür bir uyarı bırakır. ALTERNATİF: tkinter'ı kurulum dışı bırakmak — sahada tek giriş noktası terminale düşerdi; elendi. tkinter yokluğunda kurulumu durdurmak — çalışan bir terminal konsolu varken cihazı kurulmamış bırakırdı; elendi (uyarı verilir, kurulum sürer). RİSK: Çevrimdışı depo güncellenmezse pin eskir; azaltma: paket seti Git LFS ile sürümlenir ve depo bütünlüğü kurulum öncesi doğrulanır (offline depo denetimi). MALİYET: Ücretsiz. LİSANS: Yok. ``` ```text KARAR: Şifre/kimlik bilgisi üretimi OPSİYONELDİR ve VARSAYILAN OLARAK KAPALIDIR; yalnız `bf-creds --generate` açıkça istendiğinde üretilir ve parola hiçbir zaman ekrana/loga/komut satırına yazılmaz. GEREKÇE: SSH zaten anahtar zorunludur (parola girişi kapalı, `blueforce` hesabı kilitli — K-13); kullanılmayan bir parola üretmek sızma yüzeyini büyütür. Varsayılan kapalı olması secret'ın git'e/medyaya/support bundle'a kaçmasını da baştan engeller. ALTERNATİF: Kurulumda otomatik parola üretimi — hiçbir kanal bu parolayı kullanmadığı için gereksiz secret üretir; elendi. Parolayı repoya/ISO'ya gömmek — secret yasağına aykırı; yasak. RİSK: Kayıt dosyası yanlış yere kopyalanıp paylaşılır; azaltma: dosya `/root` altında mod `600`, `--fetch` hedefi `admin/secrets/` git-ignore'lu (dizin `700`), parola yalnız dosyaya yazılır. MALİYET: Ücretsiz. LİSANS: Yok. ``` ## 4. Neden Bu Karar? 700 cihazlık bir filoda en pahalı hata, teknisyenin yanlış komutu yanlış cihazda çalıştırmasıdır. Grafik arayüz bu riski dört yerden küçültür: (1) operatör komut yazmaz, listeden doğru işlemi seçer; (2) her komut **çalıştırılmadan önce bir onay penceresinde** görünür ve onay ister — "ne çalışacak?" sorusu asla cevapsız kalmaz, komut çıktı alanına da ayrıca yazılır; (3) filo işlemleri hedefi üst çubuktan açıkça seçtirir (bayi no / dalga / tüm filo) ve dalga kapılarını (production için `production` yazma, sürüm kapısı için `GATE` yazma) operatöre ayrıca onaylatır; (4) yıkıcı işlemler ikinci bir onay penceresi ister ve yetki yoksa düğme yerine **çalıştırma katmanı** reddeder. Grafik arayüz aynı zamanda bir görünürlük kazancıdır: katalogda hangi işlemin kapsamı (`yerel — bu cihaz`, `filo — dalga kapılı`, `filo — sürüm kapılı`) ve türü (`salt-okunur` / `YIKICI`) olduğu listede renkli olarak durur. Git tabanlı kurulum "hangi sürüm sahada?" sorusunu `git log` ile yanıtlanabilir kılar; kurulum paketlerinin depoda Git LFS ile durması ise "saha cihazı kurulurken ne indiriyor?" sorusunu **hiçbir şey** olarak yanıtlar. Şifre üretiminin varsayılan kapalı olması aynı felsefenin devamıdır: anahtar zaten var, ikinci bir gizli bilgi üretmenin faydası yok. ## 5. Alternatifler | Alternatif | Artı | Eksi | Sonuç | |---|---|---|---| | Grafik operatör uygulaması (`sudo bf`, tkinter) | En keşfedilebilir; komutu gösterip onay ister; hedef ve kapılar tek ekranda; denetim kaydı tutar; çevrimdışı çalışır | Grafik oturum gerekir; tkinter paketi (depoda pinli) | **Seçildi** | | Terminal konsolu (`sudo bf --tui`, aynı `bfos` iş mantığı) | Grafik ekran gerektirmez; SSH/başsız oturumda çalışır | Numara yazmaya dayanır, daha az keşfedilebilir | Yedek (grafik açılamazsa önerilir) | | Eski bash konsolu (`admin/bf-menu`) | Python'suz cihazda da çalışır | Ayrı bir katalog tablosu; iki giriş noktası zamanla ayrışır | Yedek (son çare) | | Dokümandan komut kopyalama | Araç gerektirmez | Sıra atlama + yanlış hedef riski | Elendi | | Yalnız Semaphore UI (web) | Güzel arayüz, merkezden yönetim | Saha cihazında çevrimdışı erişilemez; cihaz-kurulumunu kapsamaz | Merkez için korunur (09) | | Tek düz komut scripti (`bf-do`) | Basit | Keşfedilebilirlik ve hedef seçimi yok, acemi için anlaşılmaz | Elendi | ## 6. Avantajlar - Öğrenme maliyeti tek satır: `sudo bf`. Basit modda iki iş kararı yeter: `Kur`, `Durum`. - Her komut çalıştırılmadan önce onay penceresinde gösterilir; komut çıktı alanına da yazılır. Tehlikeli işlemler iki kez onaylanır — yanlış komut/yanlış sıra riski ortadan kalkar. - Katalogda 48 işlem vardır ve her birinin kapsamı ile türü listede görünür: **13 işlem yıkıcı (yazma)**, **35 işlem salt-okunur**. Yıkıcı satırlar listede kırmızı gösterilir (`YIKICI` / `salt-okunur` sütunu). - Filo işlemleri yalnız mevcut playbook'larla ve açık bir hedefle çalışır; arayüz **yeni playbook üretmez** ve envanter dışı bir cihaza dokunmaz. - Uzun süren işler arka planda koşar: çıktı canlı akar, pencere kilitlenmez, `Çalışanı iptal et` ile durdurulabilir. - Çevrimdışı çalışır — ISO/firstboot yoluna bağımlı değildir; kurulum paketleri de depodadır, saha cihazı hiçbir şey indirmez. - Grafik ekran yoksa uygulama Türkçe hata verip `sudo bf --tui` yolunu gösterir; operatör kör bırakılmaz. - Denetim kaydı (`/var/log/blueforce-console.log`, mod `600`) komutu, hedefi ve çıkış kodunu kaydeder; **secret ve ham komut çıktısı kayda yazılmaz** (tek bir temizleyici, `password=`/`token=`/`secret=`/`private_key=`/PEM bloklarını `` yapar). ## 7. Dezavantajlar - Katalog tablosu ile playbook'lar arasında kapsam (scope) uyuşmazlığı olursa komut üretilmez ve arayüz **çalıştırmayı reddeder**; bu, playbook güncellemesiyle katalog kaydının birlikte güncellenmesini zorunlu kılar. - Grafik arayüz bir pencere sistemine ihtiyaç duyar: `DISPLAY`/`WAYLAND_DISPLAY` yoksa (başsız sunucu, X yönlendirmesiz SSH) açılmaz — o durumda terminal konsoluna düşülür. - Cihaz işlemleri sekmesindeki filo işlemleri için makinede `ansible-playbook` gerekir; yoksa arayüz envanter notunda `UYARI: ansible-playbook bulunamadı; filo işlemleri çalışmaz` satırını gösterir ve komut üretilemez. - Çok özel/tek seferlik işler katalogda yoksa operatör kabuğa döner (kataloğa ekleme PR ile yapılır, `bfos/operations.py`). - Grafik katalog, terminal konsolunun kapsamının tamamını taşır: 48 işlemin hepsi `Detaylı mod` sekmelerinden erişilebilir (ölçüldü; `Araçlar` sekmesinde 9 işlem, `Cihaz bilgisi` sekmesinde ortam/kimlik/ağ/kaynak/servis ekranları). `sudo bf --tui` kolaylık için vardır, eksik bir yetenek için değil. - Her onay ayrı bir denetim satırı üretir; komutun ham çıktısı kayda kopyalanmaz (K-14). ## 8. Riskler | Risk | Olasılık | Etki | Azaltma | |---|---|---|---| | Katalog bayatlar, yanlış kapıyla çalıştırır | Orta | Yüksek | Komut üretimi playbook kapsamını dosyadan okur, uyuşmazlıkta reddeder; statik testler katmanında katalog↔playbook doğrulaması her sürümde koşar | | Operatör "tüm filo" hedefini yanlışlıkla seçer | Orta | Yüksek | Wave-scoped playbook'larda filo dalga dalga ilerler, her dalga **ayrı onaylanır**; production için `production` yazma zorunlu (09/10) | | Yetkisiz oturumda yazma işlemi denenir | Orta | Orta | Açılışta başlıkta uyarı şeridi; yazma işlemleri kapalı ve çalıştırma katmanı da reddeder (`[ENGELLENDİ]`), §9.8 | | Grafik arayüz açılamaz (başsız/X yok) | Orta | Orta | Türkçe hata + `sudo bf --tui` önerisi, çıkış kodu 3; terminal konsolu aynı iş mantığını kullanır | | `python3-tk` imajda eksik kalır | Düşük | Orta | Paket çevrimdışı depoda pinli; kurulum sonu kapısı tkinter'ı denetler ve eksikse WARN + `--tui` yolu yazar | | `curl \| bash` ile sahte script çalıştırma | Düşük | Yüksek | Yalnız resmi depo adresi; `git clone` + gözden geçirme önerilir | | Şifre kaydı yanlışlıkla paylaşılır | Düşük | Yüksek | Varsayılan kapalı; `/root/blueforce-credentials.txt` mod `600`; `admin/secrets/` git-ignore'lu (§9.5) | | İşlem yarıda kalkar (elektrik) | Orta | Orta | Kurulum idempotent; `Kurulum → Başarısız kuruluma devam et` (`--resume`) sunulur (§11) | | Arayüz, envanter dışı cihaza dokunur | Düşük | Yüksek | Hedefler envanterden çözülür; cihaz/grup bulunamazsa komut üretilmez | ## 9. Uygulama Planı Bu bölüm sıfırdan başlayan içindir. Her adımda **hangi komutu nereye yazacağın** ve **ekranda ne göreceğin** yazılıdır. ### 9.1 Ubuntu'da ilk kurulum — adım adım **Ön koşullar (elinde olması gerekenler):** - Ubuntu Server tabanlı bir makine (desteklenen baseline `24.04` / `26.04`). - `sudo` yetkisi olan bir kullanıcı. - Kurulum başlangıcında **internet** (repoyu git'ten indirmek için). Kurulum paketleri deponun içinde geldiği için cihaza kurulan hiçbir şey indirilmez; cihaz kurulduktan sonra çalışması için internet gerekmez. **Adım 1 — Terminali aç.** Ekranda şöyle bir satır görürsün: ```text emirhan@makine:~$ ``` `$` işareti "senin yazacağın yer" demektir; **`$` işaretini sen yazmazsın.** Aşağıdaki komutları bu satıra yazıp Enter'a bas. **Adım 2 — Git kurulu mu?** ```bash git --version ``` Beklenen çıktı: `git version 2.x.y`. `command not found` yazarsa kur: ```bash sudo apt update && sudo apt install -y git ``` `[sudo] password for emirhan:` yazınca **klavyeden parolanı yaz** — ekranda hiçbir karakter görünmez, bu normaldir — sonra Enter. **Adım 3 — Depoyu indir (klonla).** ```bash git clone https://github.com/emirhanmamak-blueforce/Blueforce-Linux.git cd Blueforce-Linux ``` Ekranda `Cloning into 'Blueforce-Linux'...` görürsün ve komut `$` satırına döner. Depo Git LFS kullandığı için kurulum paket setinin de indiğinden emin ol (`git lfs pull`); paket sayısı `provisioning/offline-repo/packages/` altında **1321** `.deb` olmalıdır. **Adım 4 — Bootstrap'ı çalıştır.** İki yol var, ikisi de aynı sonucu verir. *Yol A — depo içinden (önerilen; önce içeriği inceleyebilirsin):* ```bash sudo admin/bf-bootstrap.sh ``` *Yol B — tek satırla (depoyu klonlamadan; repoyu `/opt/blueforce-linux` altına klonlar):* ```bash curl -fsSL https://raw.githubusercontent.com/emirhanmamak-blueforce/Blueforce-Linux/main/admin/bf-bootstrap.sh | sudo bash ``` > `sudo admin/bf-bootstrap.sh --check` **hiçbir şeyi değiştirmeden** ne yapılacağını raporlar (root bile gerekmez). Önce bunu çalıştırmak iyi alışkanlıktır. Bootstrap `bf-*` araçlarını `/usr/local/bin`'e bağlar ve **grafik arayüz girişini** hazırlar; kendi özet çıktısında iki konsolu ayrı satırlarda bildirir: `console : /usr/local/bin/bf (Python, primary)` ve `fallback : /usr/local/bin/bf-menu (bash)`. Son satırlar: ```text bf-bootstrap: summary repository : /opt/blueforce-linux branch : main revision : tools : linked into /usr/local/bin console : /usr/local/bin/bf (Python, primary) fallback : /usr/local/bin/bf-menu (bash) next : sudo bf Installation complete. To get started: sudo bf Kurulum tamam. Başlamak için: sudo bf ``` | Bootstrap ne yapar | Ne yapmaz | |---|---| | Ön koşulları kurar (`git`, `curl`, `ansible-core`) | Cihaz kimliği (bayi no) atamaz | | Repoyu klonlar veya mevcut checkout'u **fast-forward** eder | `git reset` / `git stash` yapmaz; yerel değişikliği **silmez** | | `admin/bf-*`, `scripts/diagnostics/bf-*`, `scripts/maintenance/bf-*` araçlarını `/usr/local/bin`'e bağlar | Parola/secret üretmez veya indirmez | | `admin/bf`'yi çalıştırılabilir yapıp `/usr/local/bin/bf` bağını kurar (`bf-menu` yedek olarak kalır) | Disk bölmez, servis silmez, onaysız paket güncellemez | **Adım 5 — Arayüzü aç ve doğrula.** ```bash sudo bf ``` Pencere açılıyorsa kurulum tamam. Bundan sonra her iş için aynı komut: ```bash sudo bf ``` > **Bundan sonra ezberleyeceğin tek şey bu komuttur.** Pencereden çıkmak için `Çıkış` düğmesi (basit modda üçüncü düğme, alt çubukta da bir `Çıkış` düğmesi var). **tkinter notu (grafik arayüz için gerekli).** Pencerenin açılabilmesi için `python3-tk` paketi gerekir. Bu paket **çevrimdışı depoda pinlidir** (`provisioning/offline-repo/manifests/base-packages.txt`), yani normal kurulumda senin bir şey yapmana gerek yoktur; kurulum sonu kapısı (`scripts/install/installer/modules/18-final-check.sh`) tkinter'ı denetler. Yine de eksikse uygulama şu Türkçe hatayı verir ve çıkış kodu `3` ile biter: ```text tkinter bulunamadı; masaüstü arayüzü başlatılamıyor (teknik ayrıntı: ...). Bu, minimal kurulumlarda sık görülür: tkinter ayrı bir sistem paketidir. Ubuntu/Debian üzerinde kurmak için: sudo apt install -y python3-tk sudo apt update && sudo apt install -y python3-tk tkinter kurmak istemiyorsanız terminal menüsünü kullanın: sudo bf --tui ``` İnternet yoksa paketi kuramazsın; **terminal konsolu çalışmaya devam eder**: `sudo bf --tui`. **Grafik ekran yoksa (SSH / başsız oturum).** `DISPLAY` ve `WAYLAND_DISPLAY` tanımlı değilse pencere açılmaz; uygulama şu Türkçe mesajı yazıp çıkış kodu `3` ile biter: ```text Grafik ekran bulunamadı (DISPLAY ve WAYLAND_DISPLAY tanımlı değil). SSH veya başsız (headless) bir oturumda masaüstü penceresi açılamaz. Bu durumda terminal menüsünü kullanın: sudo bf --tui Yerel ekranda çalıştırmak için oturum açık bir makinede deneyin: python3 -m bfos.ui_gui ``` ### 9.2 Arayüzü kullanma — sekme sekme `sudo bf` çalıştırınca **basit mod** açılır. Başlıkta `Blueforce Field OS — Yönetim`, altında `Blueforce saha cihazı yönetimi (Kur / Durum / Bakım)`, ardından depo yolu ve kullanılan katalog kaynağı (gerçek iş mantığı katmanı, örn. `bfos.operations + bfos.runner`) görünür. **Basit mod (varsayılan):** ekranda `Ne yapmak istiyorsunuz?` sorusu ve üç büyük düğme — `Kur`, `Durum`, `Çıkış`. `Kur` bir seçim penceresi açar: `Ön kontrol (--check)`, `Kurulumu başlat`, `Vazgeç`. `Durum` salt-okunur özeti (`info-summary`) çalıştırır. Daha fazlası için üst çubuktaki **`Detaylı mod`** düğmesine bas. ```text Ne yapmak istiyorsunuz? [ Kur ] bu cihazı kurar (bayi no gerekir) [ Durum ] salt-okunur özet [ Çıkış ] pencereyi kapatır ``` **Detaylı mod:** 5 kategori **sekmesi** açılır. Her sekmede solda işlem listesi (sütunlar: `İşlem`, `Kapsam`, `Tür`), sağda `Seçenekler ve açıklama` paneli vardır; seçtiğin işlemin kapsamı, playbook yolu ve varsa zorunlu alanları orada görünür. Alt çubukta `Komutu göster ve çalıştır`, `Çıktıyı temizle`, `Çalışanı iptal et`, `Yalnız denetim (--check)`, `Çıkış` ve durum etiketi (`Hazır.`) bulunur. | Sekme | İşlem sayısı | Yazma (yıkıcı) | Salt-okunur | |---|---|---|---| | **Kurulum** | 6 | 3 (`Bu cihazı kur`, `Başarısız kuruluma devam et`, `Tek modül çalıştır`) | 3 (ön kontrol, modül durumu, kurulum günlüğü) | | **Cihaz işlemleri** | 21 | 9 (servis yeniden başlatmalar, grafik oturumu aç/kapat, betik, reboot, paket güncellemesi) | 12 (11 filo raporu + log toplama) | | **Merkez hazırlığı** | 4 | 0 | 4 | | **Araçlar** | 9 | 1 (`Bu kopyayı güncelle`) | 8 | | **Cihaz bilgisi** | 8 | 0 | 8 | | **Toplam** | **48** | **13** | **35** | Sekme sekme hangi işler var: **1) Kurulum (bu cihaz)** — yalnız **senin oturduğun makineyi** kurar; hiçbir filo cihazına dokunmaz. Üst çubukta **bayi no (8 hane)** dolu olmalıdır; boşsa `Komutu göster ve çalıştır` bir uyarı penceresi açar. | # | İşlem (arayüzde görünen ad) | Tür | Ne yapar | |---|---|---|---| | 1 | Kurulum ön kontrolü (--check) | salt-okunur | Kurulum betiğini `--check` ile çalıştırır; hiçbir şey yazmaz (kayıt/durum/dizin oluşturmaz) | | 2 | Bu cihazı kur | **YIKICI** | Tam kurulum; hedef cihaz kimliği `BF-`, ana makine adı `bf-` | | 3 | Başarısız kuruluma devam et (--resume) | **YIKICI** | Yarıda kalan kurulumu idempotent biçimde sürdürür; zaten `OK` olan modüller atlanır | | 4 | Tek modül çalıştır (--only) | **YIKICI** | Tek bir kurulum modülünü çalıştırır (`01-precheck` … `18-final-check`), modül adı seçenekten girilir | | 5 | Kurulum modül durumu | salt-okunur | `/var/lib/blueforce/install-state` içeriğini gösterir: hangi modül hangi durumda | | 6 | Kurulum günlüğü (son 40 satır) | salt-okunur | `/var/log/blueforce-install.log` sonunu gösterir | Kurulum seçenekleri: `Yerel çevrimdışı depodan kur (--offline)` ve `Zaten OK olan modülleri atla (--resume)` onay kutuları. Kurulum paketleri deponun içinde olduğu için **--offline pratikte varsayılan yoldur**; cihaz hiçbir şey indirmez. Geçersiz bayi no'da (7/9 hane, harf, boşluk) komut hiç üretilmez: üst çubukta kırmızı uyarı çıkar ve `Komutu göster ve çalıştır` bir hata penceresi açar. **2) Cihaz işlemleri (filo)** — yalnız repodaki **mevcut** playbook'ları, açık bir hedefle çalıştırır. Üst çubuktan bayi no, dalga ya da `Tüm filo (dikkat)` seçilir. *Salt-okunur raporlar (11 işlem, hiçbiri cihazı değiştirmez):* | # | İşlem | Ne yapar | |---|---|---| | 1 | Erişilebilirlik testi (ping) | SSH erişilebilirliği | | 2 | Çalışma süresi | Açık kalma süresi ve sistem yükü | | 3 | Disk kullanımı | Disk doluluğu; eşik üstünde uyarır (eşik opsiyonel girilir) | | 4 | Docker durumu | Docker servisi ve konteynerler | | 5 | Paket sürümleri | Sabitlenmiş paketlerin kurulu sürümleri | | 6 | Bekleyen güvenlik güncellemeleri | **Yalnız rapor**; hiçbir paket kurmaz | | 7 | Kurulum fazı raporu | Cihaz başına `state.json` fazı | | 8 | Kayıt ve merkez kanıtı | ENROLLED/READY iddialarını merkezi kanıta karşı denetler | | 9 | Field OS sürüm raporu | Sürüm; istenirse sapma (drift) denetimi | | 10 | Uzak erişim kanalları | SSH/xRDP/RustDesk/WireGuard hazırlığı | | 11 | Çevrimdışı hazırlık raporu | İnternetsiz kurulum için yerel ön koşullar | *Bakım işlemleri (10 işlem; 9'u yıkıcı, hepsi ikinci onay ister):* | İşlem | Kapsam | Not | |---|---|---| | xRDP servisini yeniden başlat | tek cihaz/grup | Servis yeniden başlatma | | RustDesk servisini yeniden başlat | tek cihaz/grup | Servis yeniden başlatma | | WireGuard servisini yeniden başlat | tek cihaz/grup | `wg-quick@wg0` | | İzinli bir servisi yeniden başlat | tek cihaz/grup | Yalnız izinli servis adları (`blueforce-agent`, `docker`, `ssh`, `sshd`, `systemd-journald`, `cron`) | | Grafik arayüzü kapat (headless) | dalga kapılı | Dalgayı `multi-user.target`'e alır | | Grafik arayüzü aç (bakım) | dalga kapılı | Grafik oturumu yeniden başlatır | | Log topla / destek paketi | dalga kapılı | Zaman damgalı journal + destek paketi (salt-okunur) | | Onaylı betik çalıştır | dalga kapılı | Yalnız `/opt/blueforce/bin` ve `/usr/local/sbin` | | Kontrollü yeniden başlatma | sürüm kapılı | Sıralı yeniden başlatma + sağlık kapısı; bekleme süresi girilir | | Onaylı paket güncellemesi kur | sürüm kapılı | `paket=sürüm` pinleri + dalga ve sağlık kapıları | > **`GUI kapat` xRDP'i durdurmaz.** `xrdp`/`xrdp-sesman` her zaman enable+active kalır; `bf-gui-*` yalnız **yerel fiziksel** grafik katmanını kontrol eder (K-22). "GUI kapalı ≠ RDP kapalı." **3) Merkez hazırlığı** — merkez entegrasyonunu **denetler/hazırlar**; merkez sunucusunu **kurmaz**. Dört işlemin tamamı salt-okunurdur: | # | İşlem | Ne gösterir | |---|---|---| | 1 | Envanter hedefleri | Dalga/grup/cihaz sayıları | | 2 | Doldurulmamış PLACEHOLDER denetimi | `ansible/inventory/group_vars/all.yml` içinde kalan PLACEHOLDER değerleri | | 3 | Yapılandırılmış merkez uç noktaları | WireGuard hub, izleme ve depo anahtarları (**secret gösterilmez**) | | 4 | Merkez hazırlık kontrol listesi | Kayıttan önce merkezde var olması gerekenler | > `--tui` menüsünde bu sekmenin karşılığında ayrıca "Merkez hazırlık durumu", "uç noktaları dene" (DNS+TCP) ve "dalga geçiş kapısı durumu" ekranları vardır. **4) Araçlar** — repo ve yerel yardımcılar. Yalnız `Bu kopyayı güncelle (git pull --ff-only)` yazma işlemidir; kalan 8'i salt-okunurdur: `İşlem kataloğunu göster (--list)`, `Yerel çevrimdışı kapısı (bf-check-local)`, `Kayıt kapısı (bf-check-enrollment)`, `Teslim kapısı (bf-check-ready)`, `Derin teşhis (bf-diagnostics)`, `Field OS sürüm kimliği (bf-release)`, `Destek paketi oluştur`, `Konsol denetim günlüğü (son 40 satır)`. **5) Cihaz bilgisi** — sekiz salt-okunur ekran: `Durum özeti (sağlık + kurulum durumu)`, `Kimlik (hostname, cihaz no)`, `Ağ (adres, rota, DNS, WireGuard)`, `Disk, bellek, yük`, `Kurulu pinlenmiş paketler`, `Servis durumu`, `Son journal hataları`, `Kurulum/kayıt durumu (state.json beyaz liste)`. > **Not (WireGuard):** Arayüz WireGuard private/preshared key'lerini **hiçbir zaman istemez, göstermez veya kaydetmez**; yalnız peer durumunu, port ve el sıkışma zamanlarını okur. ### 9.3 Hedef seçimi: tek cihaz mı dalga mı Filo işlemlerinde hedef **üst çubuktan** seçilir; işlem seçildiğinde ekran hedefi ayrıca sormaz, çubuktaki değeri kullanır: ```text [Detaylı mod] Hedef: [ 12010193 ] Bayi no (8 hane) [ pilot_1 ▾ ] Dalga [ ] Tüm filo (dikkat) ``` | Hedef türü | Çubukta ne yaparsın | Örnek | Boyut | Tipik kullanım | |---|---|---|---|---| | Tek cihaz | Bayi no alanına 8 hane yaz | `12010193` | 1 | Arıza teşhisi, tek cihaz bakımı | | Dalga / grup | `Dalga` açılır listesinden bir dalga seç | `lab` | 2 | Yeni playbook denemesi (önce LAB kuralı) | | Dalga / grup | `Dalga` listesi | `pilot_1` / `pilot_2` / `wave_1` / `wave_2` | 5 / 20 / 50 / 100 | Kademeli yayılım (K-11) | | Tüm filo | `Tüm filo (dikkat)` kutusunu işaretle | — | kalan | Yalnız onaylı; dalga dalga ilerler | Bayi no alanına yazdıkça anında doğrulanır; geçerliyse durum satırı `Bayi no geçerli: BF-12010193` yazar, geçersizse kırmızı uyarı görünür (örn. `Geçersiz bayi numarası '1201019': tam 8 hane olmalıdır (verilen uzunluk: 7). Örnek: 12010193`). Kurallar (arayüzün kendi davranışı): - **Tek cihaz** normalde en güvenli seçenektir; cihaz envanterde yoksa komut **üretilmez** (`... onaylı bir dalga grubunda değil` veya `envanterde yok`). - **Dalga / grup** listesi, envanterde gerçekten bulunan onaylı dalgalarla doldurulur; envanter okunamazsa varsayılan onaylı dalga sırası gösterilir. - **Wave-scoped** bir playbook'ta tüm filo seçilirse araç, dalgaları **sırayla** (`lab → pilot_1 → pilot_2 → wave_1 → wave_2 → production`) işler ve **her dalga için ayrı ayrı** onay ister; bir dalga başarısız olursa sonraki dalgaya **geçmez** (katalogdaki filo işlemleri ilk hatada durur). - **Release-gated** playbook'lar (reboot, paket güncellemesi) tek cihaz veya tüm filo kabul etmez; **tek onaylı dalga** ister. - **production** dalgası ayrıca `production` yazdırılarak, sürüm kapısı ise `GATE` yazdırılarak onaylanır. Hiçbir kapı sessizce geçilmez: onay pencereleri sırayla `PRODUCTION onayı — canlı filo`, `Production ek onayı`, `Sürüm kapısı onayı (dalga: )`, `FİLO GENELİ onayı` (kutuya `all` yazılır) ve `İKİNCİ ONAY — yıkıcı işlem` başlıklarıyla açılır. ### 9.4 Uçtan uca örnek seans Aşağıdaki iki kısa seans, kurulumdan günlük işletime tipik akışı gösterir. Metin biçimleri uygulamanın kendi metinleridir; kurulum betiğinin kendi `[installer]` satırları LAB koşusunda eklenir. **Seans A — Yeni cihazın kurulumu (bayi no girme)** ```text emirhan@makine:~$ sudo bf ``` Pencere açılır: `Blueforce Field OS — Yönetim` / `Blueforce saha cihazı yönetimi (Kur / Durum / Bakım)`. 1) Üst çubuktaki `Bayi no (8 hane)` alanına `12010193` yaz: ```text Hedef: [ 12010193 ] Bayi no (8 hane) [ lab ▾ ] Dalga [ ] Tüm filo (dikkat) durum: Bayi no geçerli: BF-12010193 ``` 2) Basit modda `Kur` düğmesine bas. Seçim penceresi açılır (başlık: `Kurulum`): ```text Bu cihazda ne yapılacak? Ön kontrol (--check) hiçbir şey yazmaz; kurulum cihazı değiştirir. [ Ön kontrol (--check) ] [ Kurulumu başlat ] [ Vazgeç ] ``` 3) Önce `Ön kontrol (--check)` ile kuru koşu yapmak iyi alışkanlıktır: komut çıktı alanında görünür ve çalışır — hiçbir şey yazmaz. ```text ======================================================================== Çalıştırılıyor: Kurulum ön kontrolü (--check) bash /opt/blueforce-linux/scripts/install/blueforce-install.sh --dealer-id 12010193 --check ======================================================================== ... (kurulum betiğinin kendi --check satırları) ... [OK] Komut başarıyla tamamlandı (çıkış kodu 0). ``` 4) Şimdi gerçek kurulum: yeniden `Kur` → `Kurulumu başlat`. Komut, **çalışmadan önce** bir onay penceresinde gösterilir: ```text Çalıştırılacak komut(lar): bash /opt/blueforce-linux/scripts/install/blueforce-install.sh --dealer-id 12010193 --offline İşlem : Bu cihazı kur [install-local] Kapsam : yerel — bu cihaz Açıklama: Cihazı kurar, hostname'i bf- yapar. Hedef : cihaz BF-12010193 (bf-12010193) Yetki : root gerekir — konsolu sudo ile açın. Not : Hedef cihaz kimliği: BF-12010193 (bf-12010193). UYARI: Bu YIKICI bir işlemdir; seçili hedefte değişiklik yapar. Bu komut çalıştırılsın mı? [Evet] [Hayır] ``` `Evet` dedikten sonra **ikinci onay** gelir (yıkıcı işlem), ardından komut çıktı alanına yazılır ve koşar: ```text ======================================================================== Çalıştırılıyor: Bu cihazı kur bash /opt/blueforce-linux/scripts/install/blueforce-install.sh --dealer-id 12010193 --offline ======================================================================== ... (kurulum betiği yerel paket deposunu bulur, 18 modülü sırayla koşar) ... [OK] Komut başarıyla tamamlandı (çıkış kodu 0). ``` Kurulum sonunda cihaz `PROVISIONED_OFFLINE` olur; **`READY` değildir** — merkeze kayıt (enrollment) ve merkezi kanal kanıtı gerekir (K-21). Bunu görmek için `Cihaz bilgisi` sekmesinden `Kurulum/kayıt durumu (state.json beyaz liste)` ya da `Durum özeti` açılır. **Seans B — Günlük kontrol (salt-okunur rapor) ve teşhis paketi** ```text Üst çubuk: Hedef: [ 12010193 ] Dalga [ pilot_1 ▾ ] Detaylı mod → Cihaz işlemleri sekmesi → listeden "Erişilebilirlik testi (ping)" satırını seç Alt çubuk: [ Komutu göster ve çalıştır ] ``` Onay penceresi: ```text Çalıştırılacak komut(lar): ansible-playbook -i ansible/inventory/hosts.yml ansible/playbooks/bf-ping.yml --limit bf-12010193 İşlem : Erişilebilirlik testi (ping) [ping] Kapsam : filo — tek cihaz/grup (salt-okunur) Hedef : cihaz BF-12010193 (bf-12010193) Not : (playbook çıktısı canlı akar) Bu komut çalıştırılsın mı? [Evet] [Hayır] ``` Çıktı alanında playbook çıktısı canlı akar; iş bitince: ```text [OK] Komut başarıyla tamamlandı (çıkış kodu 0). ``` Teşhis paketi için: `Araçlar` sekmesi → `Destek paketi oluştur`. Paket yolu çıktı alanında yazılır ve paket **parola, private key veya token içermez** (K-14). Denetim kaydını görmek için aynı sekmedeki `Konsol denetim günlüğü (son 40 satır)` açılır. ### 9.5 Kimlik bilgileri / şifre dosyası (opsiyonel — varsayılan KAPALI) **Önce şunu bil:** SSH bu cihazda **anahtar zorunludur**; parola girişi kapalıdır ve `blueforce` bakım hesabı kilitlidir (K-13). Yani günlük yönetim için parolaya ihtiyaç yoktur. Bu yüzden şifre üretimi **varsayılan olarak kapalıdır** ve yalnız açıkça istenirse yapılır. | Konu | Davranış (`admin/bf-creds`) | |---|---| | Varsayılan | **Kapalı.** `sudo bf-creds` hiçbir parola üretmez; yalnız cihazda **zaten var olan** gizlileri raporlar. | | Üretme | `sudo bf-creds --generate` — cihaz kaydını yazar (ayrıca `BF_GENERATE_CREDENTIALS=1`) | | Kayıt dosyası | `/root/blueforce-credentials.txt` (mod `0600`) — cihaz kimliği (`BF-`), hostname, oluşturma zamanı, WireGuard **public** anahtarı + private anahtarın **yolu** (içeriği değil), varsa RustDesk ID ve yerel **yönetici parolası** | | Çekme (merkeze/kasaya) | `sudo bf-creds --fetch` — `/admin/secrets/.txt` (dizin `0700`, dosya `0600`, **git-ignore'lu**) | | Parola ekranda görünür mü? | **Hayır.** Parola yalnızca dosyaya yazılır; stdout/stderr'e, log'a veya komut satırına asla konmaz. | | Git'e / ISO'ya / destek paketine girer mi? | **Hayır.** Secret hiçbir zaman depoya, medyaya veya support bundle'a konmaz. | | SSH'ı değiştirir mi? | **Hayır.** `bf-creds` `sshd_config`'i düzenlemez, hesap açmaz/kilit açmaz, parola girişi yolunu açmaz. | **Neden varsayılan kapalı?** Kullanılmayan her secret fazladan bir sızma yüzeyidir. Anahtar tabanlı erişim varken ikinci bir parola üretmek, sadece "git'e kaçabilecek yeni bir dosya" yaratır. İstisna (ör. yerel konsolda geçici bir parola isteyen bir ekip) `--generate` ile karşılanır ve kayıt dosyasının varlığı kayda geçer. **Varsayılanı değiştirmek bir karar gerektirir; sessizce açılmaz.** ### 9.6 Bir şey ters giderse — en sık 5 hata | # | Belirti (ekranda ne görürsün) | Neden | Çözüm | |---|---|---|---| | 1 | `bf: command not found` | Bootstrap çalışmamış veya araçlar bağlanmamış | Bootstrap'ı tekrar koş: `sudo admin/bf-bootstrap.sh`; sonra tam yoldan dene: `sudo /usr/local/bin/bf`. Python'suz cihazda yedek: `sudo bf-menu` | | 2 | Pencere açılıyor ama başlıkta turuncu şerit: `Yönetici yetkisi yok: salt-okunur raporlar çalışır, kurulum ve değişiklik gerektiren işlemler kapalıdır. Tam yetki için: sudo bf` | Arayüz `sudo` olmadan açıldı; yazma işlemleri kapalı | Pencereyi kapat ve `sudo bf` ile aç (§9.8) | | 3 | Hata penceresi: `Geçersiz bayi numarası '1201019': tam 8 hane olmalıdır (verilen uzunluk: 7). Örnek: 12010193` | Bayi no 8 haneli ve yalnız rakam olmalı | Tam 8 hane, sadece rakam gir; baştaki sıfırı silme. Örnek: `12010193` | | 4 | Envanter notunda `UYARI: ansible-playbook bulunamadı; filo işlemleri çalışmaz (sudo apt install ansible).` | Makinede Ansible yok | `sudo apt install ansible` (reponun kurulumu `ansible-core`'u zaten kurar) ve araçları bağla: `sudo admin/bf-bootstrap.sh` | | 5 | `Komut üretilemedi`: `Playbook bulunamadı: ansible/playbooks/...` veya `... konsol kapsamı 'X' beklerken playbook 'Y' beyan ediyor.` | Katalog ile repo checkout'u uyuşmuyor (eski checkout veya `--repo` yanlış) | `Araçlar` sekmesinden `Bu kopyayı güncelle (git pull --ff-only)` veya doğru repoyu ver: `sudo bf --repo /opt/blueforce-linux`; arayüzü yeniden başlat | Ek olarak sık görülen dört durum: - **Grafik ekran yok** (`Grafik ekran bulunamadı (DISPLAY ve WAYLAND_DISPLAY tanımlı değil).`, çıkış kodu 3): Terminal konsolunu kullan: `sudo bf --tui`. Yerel ekranda oturum açık bir makinede `python3 -m bfos.ui_gui` çalışır. - **tkinter yok** (`tkinter bulunamadı; masaüstü arayüzü başlatılamıyor ...`): `sudo apt install -y python3-tk` (paket çevrimdışı depoda pinlidir) ya da `sudo bf --tui`. - **`Pencere açılamadı; grafik oturumuna erişilemiyor.`**: SSH oturumundasın ve X yönlendirmesi yok, ekran kilitli ya da başka bir kullanıcının X sunucusuna bağlanıyorsun; `sudo bf --tui` ile devam et. - **`git clone` internet/DNS hatası** (`Could not resolve host`): İnternet/DNS'i kontrol et; **yalnız bu adımda** internet gerekir. Kurulum paketleri depodadır, saha cihazı hiçbir şey indirmez. ### 9.7 Güvenlik kuralları 1. **Secret git'e, ISO'ya veya destek paketine girmez.** Parola, private key ve token repoda/medyada bulunmaz; destek paketi çıktısı secret sızdırmaz (K-14). Denetim kaydı da tek bir temizleyiciden geçer: `password=`/`token=`/`secret=`/`api_key=`/`private_key=`/`psk=` değerleri ve PEM blokları `` olur. 2. **Onaysız update yoktur.** Güncelleme yalnız `Cihaz işlemleri` sekmesindeki `Onaylı paket güncellemesi kur` ile, `paket=sürüm` pinleri + dalga kapısı + sağlık kapısı altında yapılır (K-11). Serbest `apt upgrade`, `latest` imaj veya otomatik güncelleyici mimaride yoktur (`Bekleyen güvenlik güncellemeleri` **yalnız rapor**tur). 3. **Yıkıcı işlemler onaylıdır.** Her komut çalıştırılmadan önce onay penceresinde gösterilir, onay istenir ve çıktı alanına da yazılır; yıkıcı işlemler ayrıca ikinci kez sorulur; onaylar eklendikten sonra komut değiştiyse **kesin komut** yeniden gösterilip onaylatılır. `production` dalgası için `production`, sürüm kapısı için `GATE`, tüm filo için `all` yazılması zorunludur. Disk bölme/silme arayüzde otomatikleştirilmemiştir. 4. **Yetki kapısı çalıştırma katmanındadır.** Yetkisiz oturumda yazma işlemleri kapalıdır ve komut planı root gerektiriyorsa çalıştırma katmanı son savunma olarak reddeder (`[ENGELLENDİ]`); ayrıntı §9.8. 5. **SSH yalnız anahtarla.** Parola girişi kapalı, `blueforce` hesabı kilitli; paylaşılan private key yasaktır (K-13). 6. **Tek kullanımlık enrollment token kaydedilmez.** Token arayüz dışında bir kez girilir; denetim kaydı ham çıktıyı ve secret'ı yazmaz (K-17). 7. **Cihaz kimliği imajda taşınmaz.** Bayi no yalnız ilk kurulum seansında üst çubuktaki alana girilir (K-09/K-12). ### 9.8 Yetki modeli Arayüz beklenen kullanımda **tam yetkili** çalışır: `sudo bf`. Kurulum betiği dosya sistemine yazar, servisleri yönetir ve güvenlik duvarı temel çizgisini uygular; bu yüzden yazma işlemleri root ister. Ama arayüz root olmadan da **açılır** — çünkü raporlar repoyu ve envanteri okur, root gerektirmez. | Durum | Ne olur | |---|---| | `sudo bf` (tam yetki) | 48 işlemin tamamı çalışır: kurulum, filo bakımı, paket güncellemesi, kontrollü reboot ve `--check` koşuları | | Root değil (yetkisiz açılış) | Başlıkta turuncu uyarı şeridi: `Yönetici yetkisi yok: salt-okunur raporlar çalışır, kurulum ve değişiklik gerektiren işlemler kapalıdır. Tam yetki için: sudo bf`. **35 salt-okunur işlem** çalışır (raporlar, envanter denetimi, bilgi ekranları, destek paketi); **13 yıkıcı işlem kapalıdır** | | Yetkisizken yazma denenirse | Yazma işlemleri düğme düzeyinde kapalıdır; bir yol bulunup denenirse **çalıştırma katmanı** reddeder ve çıktı alanına `[ENGELLENDİ] Bu işlem yönetici yetkisi gerektirir (sudo bf).` yazılır, işlem çalışmaz (çıkış kodu 2) | | `--check` kipi | Salt-okunur olduğu için yetki istemez: `Yalnız denetim (--check)` kutusu işaretliyse deneme koşusu yetkisiz oturumda da yapılabilir | Hangi işlemler yetki ister: katalogda **13 yıkıcı işlem** — `Bu cihazı kur`, `Başarısız kuruluma devam et`, `Tek modül çalıştır` (Kurulum); servis yeniden başlatmalar (`xRDP`, `RustDesk`, `WireGuard`, izinli servis), `Grafik arayüzü kapat/aç`, `Onaylı betik çalıştır`, `Kontrollü yeniden başlatma`, `Onaylı paket güncellemesi kur` (Cihaz işlemleri); `Bu kopyayı güncelle` (Araçlar). Yetki kuralı tek kaynaktan türetilir: bir işlem yıkıcı olarak işaretliyse root gerektirir; ayrıca belirtildiyse o değer geçerlidir. Planlama yetki istemez: komut önizlemesi, onay pencereleri ve `--check` üretimi root olmadan da çalışır, böylece operatör "bu benim yetkimle ne yapar?" sorusunu cevaplayabilir. Reddetme yalnız **gerçek çalıştırmaya** düşer. ## 10. Test Planı | Test | Beklenen sonuç | Ortam | |---|---|---| | `sudo admin/bf-bootstrap.sh` iki kez koşulur | İkinci koşu hata üretmez (idempotent), araçlar yerinde, `/usr/local/bin/bf` bağlı | LAB(2) | | `sudo bf --list` / `python3 -m bfos.ui_gui --list` | 48 işlem, 5 kategori, 13 YIKICI / 35 salt-okunur, pencere açılmadan listelenir | LAB(2) | | `sudo bf` açılır, `Çıkış` ile kapanır | Pencere açılır, hiçbir değişiklik yapılmaz | LAB(2) | | `sudo bf --tui` ile aynı işlem listesi | Terminal konsolu iki giriş noktası ayrışmadan çalışır | LAB(2) | | Grafik ekran olmadan (`env -u DISPLAY -u WAYLAND_DISPLAY sudo bf`) | Türkçe hata + `sudo bf --tui` önerisi, çıkış kodu `3` | LAB(2) | | tkinter'siz ortamda başlatma | Türkçe hata + `python3-tk` ipucu + `--tui` önerisi, çıkış kodu `3`; kurulum sonu kapısı bunu WARN olarak kaydeder | LAB(2) | | Kurulum → `Ön kontrol (--check)` | Değişiklik yok, rapor üretir | LAB(2) | | Kurulum → `Bu cihazı kur`, bayi no `12010193`, `--offline` | `PROVISIONED_OFFLINE`; ana makine adı `bf-12010193`; ağ erişimi olmadan tamamlanır | LAB(2) | | Geçersiz bayi no (7/9 hane, harf) | Kırmızı uyarı; `Komutu göster ve çalıştır` hata penceresi açar, komut üretilmez | LAB(2) | | Cihaz işlemleri → `Kontrollü yeniden başlatma`, tek cihaz | İki onay istenir; cihaz yeniden başlar; denetim satırı yazılır | LAB(2) | | Wave-scoped playbook, hedef `Tüm filo (dikkat)` | Dalga dalga; her dalga ayrı onaylanır; hata sonraki dalgayı durdurur | LAB(2) | | production dalgası denemesi | `production` yazılmadan çalışmaz | LAB(2) | | Araçlar → `Konsol denetim günlüğü` | Mod `600`; secret ve ham komut çıktısı yok | LAB(2) | | Yetkisiz oturum: `bf --dry-run` ile yazma işlemi planla, sonra çalıştırmayı dene | Başlıkta uyarı şeridi; `[ENGELLENDİ]` satırı; hiçbir komut çalışmaz; çıkış kodu 2 | LAB(2) | | `sudo bf-creds` (bayraksız) | Hiçbir parola üretilmez, açıkça söyler | LAB(2) | | `sudo bf-creds --generate` | Kayıt dosyası `0600`; parola ekranda görünmez | LAB(2) | ## 11. Rollback 1. Kurulum yarıda kaldıysa: `Kurulum` sekmesi → `Başarısız kuruluma devam et (--resume)`; modüller idempotenttir ve zaten `OK` olanlar atlanır. 2. Yanlış bayi no girildiyse: doğru no ile tam yeniden koşu; kimlik modülü ana makine adını üzerine yazar (K-12). 3. Bootstrap yanlış kurulduysa: repoyu güncelleyip (`Araçlar` → `Bu kopyayı güncelle`, `git pull --ff-only`) yeniden koş; bootstrap **hiçbir şeyi silmez, `git reset`/`stash` yapmaz**, yerel çalışmanı korur. 4. Filo işlemi başarısız dalga bıraktıysa: `Onaylı paket güncellemesi kur` geri alma zinciri önceki onaylı release manifestine döner (10, 30). 5. Grafik arayüz bozulduysa/başlatılamıyorsa: iş emri durdurmaz — `sudo bf --tui` ile aynı iş mantığına devam edilir; Python'un kendisi de yoksa yedek bash konsolu `sudo bf-menu` kullanılır. 6. Çözülmeyen cihaz: 17-RECOVERY seviye merdiveni (L8 = temiz yeniden kurulum) uygulanır. ## 12. Kontrol Listesi - [x] `bfos` paketi ve giriş dosyası `admin/bf` repoda mevcut; `sudo bf` grafik arayüzü açar, `sudo bf --tui` terminal konsolu. - [x] `admin/bf-bootstrap.sh` `/usr/local/bin/bf` bağını kurar; bash konsolu (`admin/bf-menu`) yedek olarak korunur, ana yol değildir. - [x] Kurulum git tabanlı (clone + bootstrap); kurulum paketleri depoda (1321 `.deb`, Git LFS) — kuran kişi hiçbir şey indirmez. - [x] `python3-tk` çevrimdışı depoda pinli; kurulum sonu kapısı tkinter'ı denetler ve eksikse WARN + `--tui` yolu bildirir. - [x] Her komut çalıştırılmadan önce gösterilip onaylanıyor; yıkıcı işlemler iki kez soruyor; onay sonrası komut değişirse kesin komut yeniden onaylatılıyor. - [x] Bayi no kapısı `^[0-9]{8}$`; geçersiz girişte komut üretilmiyor. - [x] Filo işlemleri açık hedefle; wave-scoped filo akışı dalga dalga ilerliyor; production için `production` yazma zorunlu. - [x] Katalog, playbook kapsamıyla uyuşmazsa çalıştırmayı reddediyor (kapsam playbook dosyasından okunur). - [x] Yetki modeli: `sudo bf` tam yetki; yetkisiz açılışta yazma işlemleri kapalı ve çalıştırma katmanı `[ENGELLENDİ]` ile reddediyor. - [x] Grafik ekran/tkinter yokluğunda Türkçe hata + `sudo bf --tui` önerisi ve çıkış kodu 3. - [x] Şifre üretimi varsayılan **kapalı**; yalnız `bf-creds --generate` ile üretiliyor; parola ekrana/loga gitmiyor. - [x] `Cihaz işlemleri` içinde onaysız güncelleme seçeneği **yok**; `Bekleyen güvenlik güncellemeleri` yalnız rapor. - [x] Denetim kaydı mod `600`; secret ve ham komut çıktısı yazılmıyor. - [ ] Örnek pencere/çıktı satırları gerçek LAB koşusuyla (özellikle kurulum betiğinin `[installer]` satırları) güncellendi. ## 13. Açık Sorular - [ ] Katalog işlemlerinin playbook kümesiyle tam eşleşmesi: yeni playbook'lar kataloğa nasıl eklenecek (`bfos/operations.py` + sekme tablosu) ve bu süreç hangi PR şablonuyla yürüyecek (sahibi: 09 + arayüz sahibi). - [ ] Terminal konsolunda bulunup grafik katalogda ayrı işlem olmayan araçlar (ortam bilgisi, canlı donanım kontrolü, uzak erişim durumu, donanım envanteri, merkez uç noktası probu) sekme listesine taşınacak mı; iki giriş noktası bu noktada bilinçli olarak ayrı mı kalacak (sahibi: arayüz sahibi + 15). - [ ] Merkez hazırlığı ekranlarının gerçek merkez uç noktaları geldiğinde hangi kanıtı "hazır" sayacağı (sahibi: 29/21 yazarları). - [ ] `bf-creds --fetch` hedefinin (`admin/secrets/`) kurumsal kasa (vault) akışına bağlanması (sahibi: 06-ssh + merkezi admin). - [ ] Arayüz işlem geçmişinin merkezi log toplamaya (Loki/ELK, Faz-sonrası) dahil edilip edilmeyeceği (sahibi: 15-LOGGING yazarı). - [ ] Git kurulumu ile ISO/firstboot yolunun uzun vadeli rolü: ISO tamamen arşiv mi, yedek yol mu kalır (sahibi: yönetim + 26 yazarı). - [ ] Kurumsal proxy/air-gapped sahalarda `git clone` yerine iç ayna (mirror) deposu kullanılacak mı; bootstrap `--repo`/`BF_REPO_URL` ile buna hazır mı (sahibi: merkezi admin). - [ ] Grafik arayüzün uzak masaüstü (xRDP) oturumu üzerinden de çalıştırılması desteklenen/desteklenmeyen bir senaryo mu; K-22 ile ilişkisi (sahibi: 08-rdp + arayüz sahibi). --- ## Ek: Arayüz haritası ```mermaid flowchart TB START["sudo bf
(grafik arayüz, varsayılan)"] --> WIN["Pencere: Blueforce Field OS — Yönetim
üst çubuk: Bayi no (8 hane) + Dalga + Tüm filo"] WIN --> SIMPLE["Basit mod (varsayılan)
3 büyük düğme: Kur / Durum / Çıkış"] WIN -->|"üstte 'Detaylı mod'"| DETAIL["Detaylı mod
5 kategori sekmesi"] SIMPLE -. "Detaylı mod düğmesi" .-> DETAIL DETAIL --> T1["Kurulum (6 işlem, 3 yazma)
ön kontrol / bu cihazı kur / resume / --only
modül durumu / kurulum günlüğü"] DETAIL --> T2["Cihaz işlemleri (21 işlem, 9 yazma)
11 salt-okunur rapor + 10 bakım işlemi"] DETAIL --> T3["Merkez hazırlığı (4, hepsi salt-okunur)
envanter / PLACEHOLDER / uç noktalar / kontrol listesi"] DETAIL --> T4["Araçlar (9 işlem, 1 yazma)
checkout güncelle / katalog / kapılar / destek paketi / denetim kaydı"] DETAIL --> T5["Cihaz bilgisi (8, hepsi salt-okunur)
özet / kimlik / ağ / kaynaklar / paketler / servisler / journal / state"] WIN --> FOOT["Alt çubuk: Komutu göster ve çalıştır / Çıktıyı temizle /
Çalışanı iptal et / Yalnız denetim (--check) / Çıkış"] FOOT --> GATES{"Onaylar: komut önizleme →
dalga adı / production / GATE / all →
yıkıcı ikinci onay"} GATES --> RUN["Komut çıktı alanına yazılır ve koşar
denetim kaydı: /var/log/blueforce-console.log (600)"] START -. "grafik ekran veya tkinter yoksa
(çıkış kodu 3, Türkçe hata)" .-> TUI["sudo bf --tui
(terminal konsolu, yedek)"] TUI -. "python3 yoksa" .-> BASH["admin/bf-menu
(bash konsolu, son çare)"] ``` ## Ek: İlk kurulum ve durum akışı ```mermaid flowchart LR G["git clone
Blueforce-Linux"] --> LFS["git lfs pull
provisioning/offline-repo/packages/
1321 .deb"] LFS --> B["sudo admin/bf-bootstrap.sh
(veya curl | sudo bash)"] B --> BF["/usr/local/bin/bf
+ bf-menu (yedek)"] BF --> GUI["sudo bf
grafik arayüz"] GUI --> ID["Üst çubuk: bayi no gir
ör. 12010193"] ID --> INST["Kurulum sekmesi → Bu cihazı kur
--offline (yerel paket deposu)"] INST --> MOD["18/18 modül OK
+ final-check: tkinter kapısı"] MOD --> PO["PROVISIONED_OFFLINE
yerel kurulum bitti"] PO -->|"Cihaz bilgisi: kayıt durumu"| EN["ENROLLED"] EN -->|merkez kanal kanıtı| RDY["READY
teslim edilebilir"] GUI -. "grafik ekran yok / tkinter yok" .-> TUI["sudo bf --tui"] B -. "ISO/firstboot yolu
(ikincil, opsiyonel)" .-> FB["docs/26 / docs/27"] ``` ## Ek: Hızlı referans (arayüz ↔ komut) Her satırda önce **arayüzdeki yol**, sonra aynı işin **`sudo bf --tui` (terminal konsolu)** karşılığı, en altta altta çalışan komut/playbook yazar. | Arayüzde (grafik) | `sudo bf --tui` karşılığı | Altında çalışan komut / playbook | |---|---|---| | Basit mod → `Kur` → `Ön kontrol (--check)` | `1) Kur` → `1) Ön kontrol (--check)` | `blueforce-install.sh --dealer-id <8hane> --check` | | Basit mod → `Kur` → `Kurulumu başlat` | `1) Kur` → `2) Bu cihazı kur` | `blueforce-install.sh --dealer-id <8hane>` (`--offline`, `--resume` opsiyonel) | | Kurulum → `Başarısız kuruluma devam et` | Kurulum → `3) Başarısız kurulumu sürdür` | `blueforce-install.sh --dealer-id <8hane> --resume` | | Kurulum → `Tek modül çalıştır (--only)` | Kurulum → `4) Tek modül çalıştır` | `blueforce-install.sh --dealer-id <8hane> --only ` | | Kurulum → `Kurulum modül durumu` / `Kurulum günlüğü` | Kurulum → `5)` / `6)` | `/var/lib/blueforce/install-state`, `/var/log/blueforce-install.log` | | Basit mod → `Durum` / Cihaz bilgisi → `Durum özeti` | `1) Kur` menüsünden `2) Durum` / Cihaz bilgisi → `2) Sağlık özeti` | `bf-status`, `state.json` beyaz listesi, envanter hedefleri | | Cihaz işlemleri → `Erişilebilirlik testi (ping)` | Cihaz işlemleri → `1) Salt okunur raporlar` → ping | `bf-ping.yml` | | Cihaz işlemleri → `Field OS sürüm raporu` | Cihaz işlemleri → salt-okunur raporlar → Field OS sürümü | `bf-fieldos-version.yml` | | Cihaz işlemleri → `Log topla / destek paketi` | Cihaz işlemleri → `2) Bakım işlemleri` → log topla | `bf-collect-logs.yml` | | Cihaz işlemleri → `Kontrollü yeniden başlatma` | Cihaz işlemleri → bakım işlemleri → kontrollü reboot | `bf-reboot.yml` (sürüm kapılı, sıralı + sağlık kapısı) | | Cihaz işlemleri → `Onaylı paket güncellemesi kur` | Cihaz işlemleri → bakım işlemleri → onaylı güncelleme | `bf-deploy-update.yml` (`paket=sürüm` pinleri) | | Cihaz işlemleri → `Grafik arayüzü kapat/aç` | Cihaz işlemleri → bakım işlemleri → GUI off / on | `bf-gui-off.yml` / `bf-gui-on.yml` (xRDP'e dokunmaz, K-22) | | Merkez hazırlığı → `Envanter hedefleri` | Merkez hazırlığı → `1..5` ekranları | envanter okuma + `group_vars/all.yml` denetimi + DNS/TCP probe (`--tui`) | | Araçlar → `Bu kopyayı güncelle` | Araçlar → `1) Depoyu güncelle` | `git -C pull --ff-only` | | Araçlar → `İşlem kataloğunu göster` | Araçlar → `3) İşlem kataloğunu göster` | `bf --list` (48 işlem, kategori kategori) | | Araçlar → `Yerel çevrimdışı kapısı` / `Kayıt kapısı` / `Teslim kapısı` | Araçlar → `4)`, `5)`, `6)` | `bf-check-local`, `bf-check-enrollment`, `bf-check-ready` (`--check`) | | Araçlar → `Derin teşhis` / `Field OS sürüm kimliği` | Araçlar → `7)`, `10)` | `bf-diagnostics` (yoksa `bf-status`), `bf-release` | | Araçlar → `Destek paketi oluştur` | Araçlar → `12) Destek paketi` | `bf-support-bundle --out-dir /var/tmp` | | Araçlar → `Konsol denetim günlüğü` | Araçlar → `13) Konsol denetim kaydını göster` | `tail -n 40 /var/log/blueforce-console.log` | | Cihaz bilgisi → `Kimlik` / `Ağ` / `Disk, bellek, yük` / `Servis durumu` / `Son journal hataları` | Cihaz bilgisi → `1)`, `4)`, `5)`, `7)`, `8)` | `hostname` + `state.json`, `ip`/`resolv.conf`/`wg show`, `df`-`free`-`uptime`, `systemctl is-active`, `journalctl -p err -n 20` | | Cihaz bilgisi → `Kurulum/kayıt durumu` | Cihaz bilgisi → `3) Kurulum ve kayıt durumu` | `state.json` beyaz liste (`phase`, `enrollment_status`, `fleet_status`, `device_id`, `provisioning_id`) | | (arayüzde ayrı işlem değil) | Araçlar → `2) Ortam ve sürüm bilgisi`, `8) Canlı donanım / OS kontrolü`, `9) Uzak erişim kanalları`, `11) Donanım envanteri` | `environment_lines`, `bf-live-hw-check`, `bf-remote-status --check`, `bf-hardware-inventory.sh` | | Arayüz dışı (opsiyonel) | Arayüz dışı (opsiyonel) | `sudo bf-creds --generate` / `--fetch` | | Denetim kaydı | Denetim kaydı | `/var/log/blueforce-console.log` (mod `600`; yazılamazsa `$XDG_STATE_HOME/blueforce/blueforce-console.log`) | | Grafik ekran/tkinter yoksa | Bu konsol | `sudo bf --tui`; Python yoksa `sudo bf-menu` |