The package pool was committed but the installer still stopped at "no local package repository": it requires the compiled bundle (Packages, Packages.gz, packages.lock.tsv, SHA256SUMS), and building that had never run. The bundle - 1321 packages, 884 MiB, Ubuntu 26.04 amd64, built with apt-ftparchive on the fleet's own release so the closure matches the devices. - built/pool/ is gitignored: those .deb files are already tracked once under provisioning/offline-repo/packages/, and the same ~890 MB does not need a second path. What the installer reads from the bundle is the index. - The output directory is chmod 0755: mktemp -d created it 0700 and left it so, which made a valid bundle unreadable to the installer's probe. dpkg-deb output was parsed wrong in four places - `dpkg-deb -f <file> Package Version` prints "<Field>: <value>", and the callers kept the whole line, so the value carried its label. build-index.sh therefore accepted no package at all and reported an empty pool; add-packages.sh rejected every real .deb as an invalid name, missed version conflicts, and copied a duplicate; build-offline-repo.sh never matched a pin. - The test suite could not see any of this: its dpkg-deb stub emitted bare values. The stub now prints the labels exactly as the real tool does, which is what surfaced the remaining three sites. Tests - The secret scan covers the files we author, not apt-ftparchive's index over third-party packages: polkit's own description reads "...asked for their password:", which is prose in the packages, not a leak. Any secret reaching a manifest, README or tool is still caught. - The "test build must not touch the bundle" assertion now compares the directory before and after instead of demanding it be empty, so a maintainer's real build is not reported as test spill.
10 KiB
20 — Saha Teknisyeni Runbook
Kısa özet: Sahada cihaz başına giden teknisyenin el kitabı. Tek akış: USB'yi tak → Ubuntu'yu kur →
sudo bf→ bayi numarasını gir → sonucu gör. Komut ezberi istenmez: kurulum, durum ve destek paketi grafik arayüzdeki düğmelerle yapılır; her adımda "ne göreceksin, ne yazacaksın" vardır.
- Dosya:
docs/20-FIELD-TECHNICIAN-RUNBOOK.md - İlgili kararlar:
24-DECISION-LOG.md#K-09(USB → kurucu → bayi no),#K-12(bayi no →BF-<no>),#K-14(bf-status, support-bundle),#K-16(offline kurulum) - İlgili dokümanlar:
33-OPERATOR-CONSOLE.md(arayüz rehberi),27-OFFLINE-PROVISIONING.md(paket deposu) - Durum: [ ] Taslak
1. Amaç
Teknisyenin sahada tek başına, telefonsuz bile cihazı teslim edilebilir hale getirmesi. Bu dosya "neden" anlatmaz, "ne yap" söyler. Neden merak eden 01'e bakar.
2. Kapsam
- Kapsam içi: USB ile sıfır kurulum, grafik arayüzü açma, bayi no girişi, kurulum sonucunu doğrulama, arızalı cihazda ilk 3 hareket, merkeze ne zaman telefon açılacağı.
- Kapsam dışı: merkez onayları (21), arıza teşhis tablosu detayı (19 — sadece yönlendirme), update dalgaları (10).
3. Kararlar
KARAR: Teknisyen akışı 4 adımdır: USB → Ubuntu kur → `sudo bf` ile kurulum (bayi no) → sonucu gör. Grafik arayüz tek giriş noktasıdır; terminal konsolu (`sudo bf --tui`) yalnız grafik ekran veya tkinter yoksa kullanılan yedektir. Teknisyen hostname, IP, anahtar, paket yolu veya config dosyası ile uğraşmaz; paketler depoyla gelir ve kurulumda internet gerekmez.
GEREKÇE: K-09/K-16'nın hedef akışı; insan hatası en çok elle config ve ezberlenen komutta olur. Teknisyenin tek manuel girdisi 8 haneli bayi numarasıdır (K-12).
ALTERNATİF: Teknisyene tam Linux eğitimi + manuel kurulum — 700 cihazda standardizasyon bozulur; elendi. Yalnız bash menülü kurulum — grafik arayüz varken gereksiz terminal bilgisi ister; yedek yol olarak korundu.
RİSK: Depo kopyası eski sürüm kalır; azaltma: repo sürüm etiketi + merkezden "şu sürümden eski kopyayı kullanma" duyurusu.
MALİYET: Ücretsiz.
LİSANS: Yok.
4. Neden Bu Karar?
Teknisyenin işi "bilgisayarcılık" değil "bayi cihazını çalışır teslim etmek"tir. Karar, teknisyenin dikkatini tek kritik noktaya toplar: bayi numarasını doğru girmek. Geri kalan her şey uygulama + merkez otomasyonudur. Bu yüzden bu dosya kısa cümlelerle, emir kipiyle yazılır.
5. Alternatifler
| Alternatif | Artı | Eksi | Sonuç |
|---|---|---|---|
Grafik arayüz (sudo bf) |
Tek düğme, komut ezberi yok, onay görünür | Grafik katman gerekir | Seçildi |
| Detaylı Linux kılavuzu | Bilgili teknisyen | Uzun, hata açık, herkes okumaz | Elendi |
| Merkezden uzaktan kurulum (teknisyensiz) | Saha maliyeti yok | İlk kurulumda cihazda internet/VPN yok | Elendi (ilk kurulum sahada) |
6. Avantajlar
- Yeni teknisyen 1 saatlik eğitimle sahaya çıkar.
- Her cihaz aynı adımla kurulur; "ustalık farkı" kapanır.
- Kurulum internetsiz çalışır: paket seti depodan gelir, hiçbir şey indirilmez.
7. Dezavantajlar
- Uygulamanın yapmadığını teknisyen de yapamaz; olağandışı durumda merkeze bağımlıdır (bilerek böyle).
- Depo kopyası (paket setiyle birlikte ~888 MB) fiziksel/lojistik takip ister.
8. Riskler
| Risk | Olasılık | Etki | Azaltma |
|---|---|---|---|
| Bayi no yanlış girilir | Orta | Yüksek | Arayüz BF-<no>'yu gösterir, teknisyen bayiye onaylatır |
| Eski depo kopyası ile kurulum | Orta | Orta | Repo sürüm etiketi + kurucu başlangıçta depoyu ve paket sayısını söyler |
| Grafik arayüz açılmaz (ekran/tkinter) | Orta | Orta | sudo bf --tui yedeği; sorun merkeze bildirilir |
| Sonuç görülmeden sahadan çıkılır | Düşük | Yüksek | Kontrol listesi imzalanmadan iş kapanmaz |
9. Uygulama Planı
A. Sıfır kurulum (yeni cihaz) — 4 adım
ADIM 1 — USB'yi tak, bilgisayarı aç.
- Kurulum USB'sini tak.
- Bilgisayarı aç, USB'den başlat (açılışta genelde F12/F8/F2 — ekranda yazar).
- Ubuntu kurulum ekranı gelene kadar bekle.
Göreceğin: Ubuntu kurulum ekranı. Bunu görmüyorsan: USB tam takılı mı, BIOS boot sırası USB mi? Olmazsa merkeze telefon aç.
ADIM 2 — Ubuntu'yu kur ve depo kopyasını getir.
- Ekrandaki kurulumu varsayılanlarla tamamla (dil: Türkçe, disk: tamamını kullan).
- Kurulum bitince USB'yi çıkarma, bilgisayarı yeniden başlat.
- Repo kopyasını cihaza getir (merkezin söylediği yolla:
git clone— paketler Git LFS ile birlikte gelir — veya hazır kopya/opt/blueforce/offline-repoaltına konur).
Paketler repoyla birlikte gelir; internetten hiçbir şey indirilmez.
ADIM 3 — Grafik arayüzü aç, bayi numarasını gir, kurulumu başlat.
- Terminali aç, şunu yaz:
sudo bf
- Pencere açılır: başlık Blueforce Field OS — Yönetim. (Ekran yoksa veya tkinter yoksa uygulama Türkçe uyarı verir; o zaman
sudo bf --tuiyaz — §D.) - Üst çubuktaki Hedef > Bayi no (8 hane) alanına 8 haneli bayi numarasını yaz. Faturadaki/sistemdeki numarayı kullan. Örnek:
12010193. - Kurulum sekmesi →
Bu cihazı kur. - Arayüz komutu ekranda gösterir ve onay ister.
BF-12010193görünüyor mu? Doğruysa onayla; yanlışsa iptal et ve numarayı düzelt.
Arayüzden: sudo bf → Hedef: Bayi no (8 hane) → Kurulum → "Bu cihazı kur"
Komutla (yedek):
sudo bf --tui # terminal konsolu; Kurulum menüsünden aynı akış
sudo ./scripts/install/blueforce-install.sh --dealer-id 12010193
- Numarayı bayiye sesli onaylat: "Cihaz numaranız BF-12010193, doğru mu?"
ADIM 4 — Sonucu gör, çık.
- Kurulum bitene kadar bekle (kapatma, fişi çekme). Cihazın açık kalması şart.
- Sonucu gör:
Arayüzden: `Durum` düğmesi (basit mod) → Durum özeti ya da Kurulum sekmesi → "Kurulum modül durumu"
Komutla (yedek): bf-status
PROVISIONED_OFFLINEgörmen normaldir: kurulum yerelde tamamlandı, cihaz internetsiz kuruldu. Bu durumda cihazREADYdeğildir.- İnternet geldiğinde merkezden tek-kullanımlık enrollment token iste ve 29'daki adımı uygula.
- Token sonrası ENROLLED görünür; WireGuard, remote ve monitoring merkezi doğrulaması bitince READY görürsün.
- READY sonrası kontrol listesini doldur (§12), sahadan çık.
B. Arızalı cihaza gittin — ilk 3 hareket
- Durumu oku:
Arayüzden: sudo bf → `Durum` düğmesi (Durum özeti)
Komutla (yedek): bf-status
Kırmızı satır hangisi? Not al. 2. Bilgisayarı bir kez yeniden başlat. Düzelirse READY'yi gör, çık. 3. Düzelmezse destek paketini al, merkeze gönder:
Arayüzden: sudo bf → Detaylı mod → Araçlar sekmesi → "Destek paketi oluştur"
Komutla (yedek): bf-support-bundle --out /tmp/bf-<bayi-no>-bundle.tar.gz
Paketi merkeze ilet (telefonla nasıl göndereceğin söylenir), merkez sana söylemeden başka komut çalıştırma.
C. Merkeze telefon açma kuralları
Hemen ara: sonucu alamıyorsan, aynı arıza 2 cihazda üst üste çıktıysa, donanım kırık/yanık kokusu varsa, bayi numarasından emin değilsen.
Arama: cihaz başında ol, BF-<no>'yu ve durum özetini/bf-status çıktısını hazır tut.
D. Grafik arayüz açılmıyor — yedek yol
| Belirti | Ne yap |
|---|---|
| "Grafik ekran bulunamadı" / SSH oturumu | sudo bf --tui yaz; aynı işlemler terminal menüsünde numaralarla yürür |
| "tkinter bulunamadı" | sudo bf --tui ile devam et ve merkeze bildir; python3-tk paketi kurulum depounda pinlidir (19 §T-10) |
| Pencere açıldı ama dondu | Pencereyi kapat, sudo bf --tui ile devam et, merkeze bildir |
10. Test Planı
| Test | Beklenen sonuç | Ortam |
|---|---|---|
| Sıfır teknisyen 4 adımı desteksiz yapar | Hedef teslim durumu < hedef süre | LAB(2) |
| Yanlış bayi no girilir | Uygulama uyarır, komut üretilmez/çalışmaz | LAB(2) |
Ekransız oturumda sudo bf |
Türkçe yönlendirme + sudo bf --tui önerisi, exit 3 |
LAB(2) |
| Depo kopyası olmayan cihazda kurulum | Türkçe hata + aranan yollar + çıkış nedeni, sistem değişmez | LAB(2) |
| Elektrik kesintisi simülasyonu sonrası durum | Kurulum kaldığı yerden tamamlanır; durum doğru raporlanır | LAB(2) |
11. Rollback
Teknisyen rollback yapmaz. Kurulum yarıda kesildiyse: sudo bf → Kurulum sekmesi → Başarısız kuruluma devam et (--resume) (komutla yedek: aynı kurucu --resume bayrağıyla). İkinci denemede de olmazsa merkeze telefon aç — merkez 17-RECOVERY'den seviyeyi seçer.
12. Kontrol Listesi
- Depo kopyası/checkout sürümü güncel (etiket + merkez duyurusu eşleşiyor).
BF-<no>bayiye onaylatıldı.- Kurulum sonucu görüldü (
PROVISIONED_OFFLINEnormaldir; READY için §A/ADIM 4-5). - Cihaz fişe + internete bağlı bırakıldı.
- İş formu dolduruldu (bayi no, tarih, teknisyen adı).
13. Açık Sorular
- Depo kopyasının sahaya taşınma/sürüm takip yöntemi (git clone + LFS mı, hazır kopya mı) (sahibi: merkezi admin, 21).
- İş formu kağıt mı mobil mi (sahibi: 25-ROADMAP).
- Hedef kurulum süresi (öneri: P2'de ölçülecek).
Ek: Mermaid — teknisyen akışı
flowchart TB
USB["USB tak → aç"] --> KUR["Ubuntu kur"]
KUR --> DEPO["Depo kopyasını getir<br/>(paketler LFS ile gelir, indirme yok)"]
DEPO --> BF["sudo bf"]
BF --> EKRAN{"Grafik ekran +<br/>python3-tk var mı?"}
EKRAN -->|Hayır| TUI["sudo bf --tui<br/>(yedek terminal konsolu)"]
EKRAN -->|Evet| NO["Hedef: Bayi no (8 hane)"]
TUI --> NO
NO --> ONAY["Arayüz komutu gösterir + onay<br/>BF-no'yu bayiye onaylat"]
ONAY --> BEKLE["Kurulum bitsin<br/>(kapatma / fişi çekme)"]
BEKLE --> DURUM["Durum: PROVISIONED_OFFLINE / ENROLLED / READY"]
DURUM -->|"READY"| CIK["Formu doldur → çık"]
DURUM -->|"sorun var"| TEL["Destek paketi + merkeze telefon aç"]