Bayraklar, Çıktı ve Çıkış Kodları
Bu kurallar her ironflock komutu için geçerlidir ve bir betik bunlara güvenebilir. Her komutun sayfası yalnızca o komutun eklediklerini belirtir.
Bir komut satırı iki biçimden birine sahiptir:
ironflock <group> <verb> [flags] ironflock agent install -c device.flock
ironflock <verb> [flags] ironflock versionGrup üründür: cihaz ajanı için agent, IronFlock Appliance için appliance, IronFlockOS için os. Bir fiil her grupta aynı anlama gelir. Makinenin bütünüyle ilgili komutların grubu yoktur. Fiil olmadan çalıştırılan ironflock ve ironflock <group> yardımlarını yazdırır. Sayfasında aksi belirtilmedikçe hiçbir komut konumsal bağımsız değişken almaz; geri kalan her şey bir bayraktır. login ve device ayrılmış adlardır: ayrılmış olduklarını söyler ve çıkış kodu 2 ile sona ererler.
Genel Bayraklar
Her komut bu bayrakları kabul eder. --help dışındaki hepsi komutun adından önce veya sonra gelebilir: ironflock --json version ile ironflock version --json aynıdır.
| Bayrak | Anlamı |
|---|---|
--download-base <url> | İndirmelerin temel URL’si. Varsayılan: IronFlock bulutu, https://instance-registry.ironflock.com/dl; bir IronFlock Appliance’ın cihazı için bazı komutlar önce Appliance’ın yansısını kullanır. Bkz. İndirme Tabanı. |
--host [user@]machine | Komutu burada değil, SSH üzerinden o makinede çalıştırır. Birkaç makine için birden fazla kez verin. Bkz. SSH Üzerinden Uzak Makineler. |
--hosts <file> | Komutu dosyanın belirttiği her makinede çalıştırır; her satırda bir [user@]machine. Bkz. Hosts Dosyası. |
--parallel <n> | --host ve --hosts makinelerinden aynı anda en fazla n tanesini çalıştırır. Varsayılan 10, 1 ile 100 arası. |
--json | Sonucu stdout’a tek bir JSON nesnesi olarak yazar ve hiçbir şey sormaz. |
--yes | Komutun sorusunu evet ile yanıtlar. Bir reddi asla kaldırmaz. |
-h, --help | Komutun yardımını yazdırır. |
Sabit Adlı Bayraklar
Bir bayrak adı, o bayrağı kullanan her komutta aynı anlama gelir. -h dışında yalnızca -c ve -d kısa bayrak olarak vardır.
| Bayrak | Anlamı | Komutlar |
|---|---|---|
-c, --config <file> | cihazın .flock dosyası | agent install, agent configure, doctor, os flash, os install, os reset |
-d, --drive <drive> | komutun yazdığı sürücü | os flash |
--disk <disk> | çalışan sistemin başlatıldığı ve komutun yerine yenisini yazdığı disk | os install |
--output <file> | komutun bir sürücü yerine yazdığı dosya | os flash |
--http-proxy, --https-proxy, --no-proxy | kurumsal proxy | agent install, agent configure, os install |
--proxy-password-file <file> | tek satırı proxy URL’lerindeki kullanıcının parolası olan bir dosya veya pipe | agent install, agent configure, os install |
İndirme Tabanı ve Proxy
İndirme tabanı --download-base bayrağından, ardından IRONFLOCK_DL_BASE ortam değişkeninden gelir; ikisi de yoksa https://instance-registry.ironflock.com/dl olur. İkisi de olmadığında agent install, doctor, os install ve os update, buluttan önce cihazın .flock dosyasının belirttiği Appliance’ın indirme yansısını kullanır (IronFlock Appliance Cihazları).
Proxy bayraklardan, ardından HTTP_PROXY, HTTPS_PROXY ve NO_PROXY değişkenlerinden (veya küçük harfli biçimlerinden) gelir. agent configure bir istisnadır: cihazın proxy’sini yalnızca kendi bayraklarıyla değiştirir; komutun ortamı orada hiçbir şeyi değiştirmez. Bir proxy URL’si http://proxy.example.com:3128 biçimindedir; https:// ve socks5:// de çalışır, şeması olmayan bir URL ise http:// sayılır. Proxy oturum açma gerektirdiğinde URL, http://[email protected]:3128 örneğindeki gibi kullanıcıyı belirtir, parolayı ise --proxy-password-file verir (bkz. Gizli Bilgiler). Proxy arkasındaki cihazlar için bkz. Kurumsal Proxy Arkasında.
Çıktı ve JSON
stdout yalnızca sonucu taşır. Bu, bir kişi için kısa bir metin ya da --json ile tek satırda tam olarak bir JSON nesnesidir. --help de stdout’a gider. Tek istisna, sonucu günlüğün kendisi olan agent logs komutudur: --json ile günlüğün her satırı için bir JSON nesnesi yazar.
stderr geri kalan her şeyi taşır: ilerleme, bir komutun çalıştırdığı araçların çıktısı (apt, Docker yükleyicisi), uyarılar, sorular ve hatalar.
Böylece bir yönlendirme veya komut ikamesi yalnızca sonucu alır; sessizlik isteyen bir betik stderr’i yönlendirir:
# Sonuç metin olarak bir dosyada; ilerleme ve uyarılar yine terminalde görünür
ironflock status > result.txt
# Sonuç JSON olarak bir kabuk değişkeninde, stderr'deki mesajlar olmadan
result=$(ironflock status --json 2>/dev/null)JSON’daki alan adları snake_case biçimindedir. Komut bir şeyi değiştirdiğinde sonuçta action alanı bulunur, örneğin "installed", "configured" veya "removed". Zamanla alanlar eklenir; bir ana sürüm içinde hiçbir alan yeniden adlandırılmaz veya kaldırılmaz. Bir sonucu okuyan program, bilmediği alanları yok sayar. Birkaç makinede --json bunun yerine makine başına bir satır yazar (bkz. SSH Üzerinden Uzak Makineler).
İlerleme
Uzun bir adım, ne kadar ilerlediğini stderr’de gösterir: terminalde bir çubukla, aksi hâlde her onda birde bir satırla. --json ile stdout yine tam olarak bir JSON nesnesi, yani sonucu alır; stderr ise ilerlemeyi olaylar olarak, satır başına bir JSON nesnesi şeklinde alır:
{"event":"progress","phase":"writing","done":104857600,"total":412345678}| Alan | Anlamı |
|---|---|
event | progress |
phase | downloading: bir görüntü dosyasını veya bir sürümü indirme; checking: SHA-256 değerini katalogdakine göre denetleme; preparing: os install yazımını görüntüden hazırlama; writing: sürücüye (veya --output dosyasına) yazma; verifying: sürücüyü (veya dosyayı) geri okuyarak doğrulama; installing: bir sürümü diğer yuvaya kurma (os update) |
done, total | Bayt: downloading, checking, preparing ve writing için görüntü dosyasının, verifying için yazılan görüntünün baytları. installing için yüzde: total 100’dür. |
os install yeniden başlatmadan önce görüntü dosyasını iki kez okur: checking onun SHA-256 değerini imzalı katalogla karşılaştırır; preparing ise görüntüyü bir kez açarak IRONFLOCKOS bölümünü bulur, cihazın .flock dosyasını ve ağ ayarlarını bu bölüme koyar ve yazımın diske koyacaklarının sağlama toplamlarını hesaplar. Terminalde bunlar Checking ve Preparing olarak görünür.
Bir aşama başladığında (done 0’dır), tam sayı yüzde her değiştiğinde ve aşama tamamlandığında (done, total değerine eşittir) bir olay gelir. Kaldığı yerden devam eden bir indirme, elindeki bayt sayısına atlar. stderr’deki diğer satırlar, uyarılar da dahil, bir kişi için yazılmış metinlerdir: bir program JSON nesnesi olarak ayrıştırılabilen satırları alır ve geri kalanını atlar.
Sorular ve Onay
Makineyi değiştiren bir komut önce ne yapacağını söyler, sonra sorar:
- Bir şeyi kaldıran veya üzerine yazan bir komut önce neyin gideceğini söyler. Kurulum yapan bir komut önce neyi kuracağını söyler.
agent stopönce ajanı durdurmanın neyi sona erdireceğini söyler. --yes, komutun her sorusunu evet ile yanıtlar ve komutun seçim sunduğu yerde varsayılanı alır.- Terminalde bir soru “Yes” seçeneğini önceden seçer; böylece yalnızca Enter’a basmak devam ettirir. Üç soru “No” seçeneğini önceden seçer; böylece yalnızca Enter’a basmak hiçbir şeyi silmez ve kaldırmaz:
os flashbir sürücüyü silmeden önce,os flash--outputdosyasını değiştirmeden önce veagent remove. os resetcihazın adını,os installise makinenin ana bilgisayar adını yazmanızı ister. Başka herhangi bir yanıt, yalnızca Enter da dahil, hayır anlamına gelir.- Bir soru görünmeden önce yazdıklarınız atılır. Bir soru, komutun söylediklerini okuduktan sonra yanıtlanır.
- Esc hayır yanıtı verir: komut hiçbir şeyi değiştirmez ve çıkış kodu 4 ile sona erer. Bir soruda Ctrl-C hiçbir yanıt vermez, önceden seçilmiş olanı bile: komut hiçbir şeyi değiştirmez ve çıkış kodu 130 ile sona erer.
Bir soru hem stdin hem de stderr üzerinde bir terminal gerektirir. Terminal yoksa (bir pipe, CI, bir cloud-init betiği) komut beklemez ve tahmin yürütmez: çıkış kodu 4 ile sona erer ve --yes ile onaylanabileceğini söyler. Hiçbir şey sormayan --json ile de aynısı geçerlidir. Bu nedenle betikler --yes bayrağını --json ile birlikte verir.
--yes bir reddi asla kaldırmaz. Bir komut reddettiğinde (çıkış kodu 3 veya başarısız bir denetim), hiçbir bayrak onu devam ettiremez. Her komutun sayfası neyi reddettiğini listeler. Tek istisna dahili bir disktir: --drive onu belirttiğinde os flash --allow-internal ona yazar.
--host üzerinden, komutu bir terminalde çalıştırdığınızda sorular size ulaşır. Aynı anda birkaç makinede kimseye soru sorulmaz; bu yüzden soru soran bir komut orada yalnızca --yes ile çalışır (bkz. SSH Üzerinden Uzak Makineler).
Root Yetkileri
Sistemi değiştiren bir komut root gerektirir. Root olmadan çıkış kodu 3 ile sona erer ve nedenini söyler. sudo komutunu kendisi çağırmaz; bunu yalnızca --host diğer makinede yapar. os flash bu durumda yazılacak komut satırını başında sudo ile belirtir.
| Komutlar | Root |
|---|---|
version, completion, os images, os drives, her --help | gerekmez |
status, doctor | gerekmez. Root olmadan status, okuyamadığı şeyler için unknown (needs root) der; doctor ise bu tür denetimleri skipped olarak işaretler. sudo ile bunları okurlar. |
agent install, agent configure, agent update, agent remove, agent restart, agent stop, agent start | gerekir |
agent logs | gerekir: yalnızca okur, ama okuduğu şeyi yalnızca root okuyabilir |
os flash | bir sürücüye yazmak için gerekir. --output ile gerekmez. macOS’ta sürücünün ham aygıtına yazma izni olan bir kullanıcı root gerektirmez. |
os install, os update, os rollback, os reset | gerekir |
self-update | ikili dosyanın klasörüne yazma izni ve ikili dosyanın sahibi olup grubunun üyesi olmak ya da root. /usr/local/bin/ironflock için bu root demektir |
--host üzerinden, root gerektiren bir komut, SSH kullanıcısı root değilse diğer makinede sudo aracılığıyla çalışır.
Gizli Bilgiler
Hiçbir komut gizli bir bilgiyi yazdırmaz: ne bir .flock dosyasındaki gizli bilgiyi, ne bir WiFi parolasını, ne bir proxy parolasını, ne de bir lisans anahtarını. Bu kural stdout, stderr, --json ve hata mesajları için geçerlidir.
Bir dosyanın taşıyabileceği yerlerde gizli bilgi asla bir bayrağın değeri olmaz, çünkü komut satırları ps çıktısında ve kabuk geçmişinde görünür. Proxy parolası da bir istisna değildir:
- Bir bayraktaki proxy URL’si kullanıcıyı parola olmadan belirtir:
http://[email protected]:3128. http://user:password@proxy:3128gibi parola içeren bir URL hatalı bir komut satırıdır (çıkış kodu 2). Herhangi bir şey çalışmadan önce,--hostile de makineye gitmeden önce reddedilir. Hata mesajı URL’yi tekrarlamaz.- Parola
--proxy-password-filebayrağından gelir: tek satırlık bir dosya veya bir pipe (/dev/stdin). agent installkomutunun başvurduğu ortamdaki proxy değişkenleri parola taşıyabilir: bunlar bir komut satırında yer almaz.
# Parola bir dosyadan
sudo ironflock agent configure --https-proxy http://[email protected]:3128 --proxy-password-file proxy-password.txt
# Parola bir pipe üzerinden
sudo ironflock agent configure --proxy-password-file /dev/stdin --yes < proxy-password.txtagent install komutunun kurduğu bir cihazda proxy parolası yalnızca root’un okuyabildiği bir yerdedir: /etc/ironflock/proxy.env dosyasında (mod 0600). docker.service ve ironflock-device-agent.service için drop-in dosyaları bu dosyanın adını verir ve hiçbir proxy ayarı içermez; böylece systemctl show her kullanıcıya dosyanın adını söyler, içeriğinden ise hiçbir şey söylemez.
--host üzerinden, bir bayrakta belirtilen .flock dosyası, WiFi parola dosyası veya proxy parola dosyası hiçbir zaman bir komut satırında değil, SSH bağlantısı üzerinden diğer makineye gider (bkz. SSH Üzerinden Uzak Makineler). İçinde kullanıcı adı ve parola bulunan bir indirme tabanı, hiçbir makineye ulaşılmadan çıkış kodu 2 ile sona erer.
Çıkış Kodları
| Kod | Tür | Anlamı |
|---|---|---|
| 0 | tamamlandı | |
| 1 | failed | komut başladı ve tamamlanamadı |
| 2 | usage | komut satırı hatalı: bilinmeyen bir komut veya bayrak, eksik bir bayrak, ayrılmış bir ad. Hiçbir şeye dokunulmadı. |
| 3 | precondition | makine, komutun gerektirdiği durumda değil: root değil, kurulu ajan yok, zaten kurulu bir ajan var, komutun çalışmadığı bir sistem. Hiçbir şeye dokunulmadı. |
| 4 | declined | soru hayır ile yanıtlandı ya da sorulamadı ve --yes verilmedi |
| 130 | interrupted | komut bitmeden kesildi (Ctrl-C); --host ile ayrıca diğer makinede hat kapanması (hangup), kesme veya sonlandırma sinyaliyle sona eren bir komut |
| 255 | ssh | --host için SSH bağlantısı başarısız oldu: makineye ulaşılamadı ya da bağlantı koptu |
Bir hata, stderr’de Error: ve ardından mesajdan oluşan tek bir satırdır. Bir kullanım hatasının ardından okunacak --help komutunu belirten bir satır gelir. --json ile hata sonucun kendisidir: stdout bir hata nesnesi alır, stderr ise hata satırı almaz. kind, tablodaki türlerden biridir.
{"error":{"kind":"precondition","message":"the agent is not installed on this machine"}}İki komut sonucunu yazar ve yine de çıkış kodu 1 ile sona erer. agent update, ajan kendi sürümünde kaldığında bunu yapar: sonuç nedenini söyler ve stderr Error: satırını alır. doctor, bir denetim başarısız olduğunda bunu yapar: sonuç hangi denetim olduğunu söyler ve ardından hata satırı gelmez. Bu durumlarda --json ile ikisi de hata nesnesi yazmaz: stdout’ta sonuç bulunur.
--help ile bilinmeyen bir komut hata değildir: ironflock os nosuch --help, ironflock os yardımını çıkış kodu 0 ile yazdırır. Birkaç makinede komut, makinelerin en kötü çıkış koduyla sona erer (bkz. SSH Üzerinden Uzak Makineler).
Kesmeler
Ctrl-C, SIGTERM ve SIGHUP (terminal veya SSH oturumu ortadan kalktığında) çoğu komutu, herhangi bir programı sonlandırdıkları gibi, hata satırı olmadan hemen sonlandırır; kabuk 130 görür (SIGTERM sonrasında 143, SIGHUP sonrasında 129). Bazı adımlar bu sinyalleri kendisi ele alır:
os flashbir görüntüyü indirirken, yazarken veya geri okurken,os updatede bir güncelleme paketini indirirken ve denetlerken bir sonraki blokta durur. Geride ne bıraktıklarınıinterruptedtüründe bir hata olarak söyler ve 130 ile sona ererler;os updatebu durumda hiçbir şey kurmaz.os flashson bloğu geri okuduktan sonra kapanış adımlarını tamamlar ve 0 ile sona erer. İkinci bir Ctrl-C süreci hemen sonlandırır;--outputile.partdosyası geride kalabilir.agent logs --followböyle bir sinyale kadar günlüğü izler ve ardından 0 ile sona erer.agent updategüncellemeyi izlemeyi 130 ile bırakır; ajan kendi başına devam eder.os reset, isteğini yazarken isteği geri alır, 130 ile sona erer ve cihaz yeniden başlamaz.agent configure, makineyi değiştirmeye başladıktan sonra kaybolan bir terminal veya SSH oturumu yüzünden artık durmaz. Ctrl-C ve SIGTERM onu yine hemen sonlandırır.os installsorusundan önce ve sonra farklı davranır; bkz.ironflock os install.
Betikte Çıkış Kodları
Bir betik, komutun sorusunda durmaması için --yes, okuyabileceği bir sonuç için --json verir ve çıkış kodunu denetler:
#!/bin/sh
# Ajanın kendini güncellemesini sağlayın; JSON sonucunu tutun, stderr'deki ilerlemeyi atın.
result=$(sudo ironflock agent update --yes --json 2>/dev/null)
code=$?
case $code in
0) echo "agent is current: $result" ;;
1) echo "agent update failed: $result" ;;
3) echo "agent update refused on this machine: $result" ;;
*) echo "agent update ended with exit code $code: $result" ;;
esacÇıkış kodu 0 ile $result, outcome değeri updated veya current olan sonucu tutar. Çıkış kodu 1 ile ya outcome ve reason değerleri ajanın neden kendi sürümünde kaldığını söyleyen sonucu ya da bir hata nesnesini tutar. Çıkış kodu 3 ile hata nesnesini tutar.