Prepokladom použitia tohto scriptu je, že tvoje PC je spustené z inštalačného média, alebo z už nainštalovanej distribúcie NixOS.
Stránka, ktorú čítaš obsahuje vysvetlenie diagnostického scriptu, ktorý môžeš na svojom PC spustiť nasledovným príkazom:
# priamy upload na server
curl -sL "linux.curo.sk/diag?&u" | sudo sh
# diagnostika a interaktivne otazky o uploade
curl -sL "linux.curo.sk/diag?" | sudo sh
Predtým máš možnosť si ho skontrolovať v prehliadači pridaním parametra /diag?render=sh.
Najbezpečnejší spốsob je script najskôr stiahnuť na disk, skontrolovať a následne spustiť.
# stiahni do súboru
curl -sL "linux.curo.sk/diag?" > /tmp/diag.sh
# skontroluj
less /tmp/diag.sh
# prezeranie ukončíš stlačením klávesy 'q'
# spusti
sudo sh /tmp/diag.sh
Pokiaľ výsledky odošleš na server linux.curo.sk, tak ti zobrazí kód tvojej hardwarovej zostavy.
Pridaj tento kód za názov servera (napr. http://linux.curo.sk/ZOSTAVA) a zobrazí sa ti náš analytický nástroj, ktorý podľa parametrov tvojho hardware navrhne najvhodnejšie inštalačné parametre.
V prípade, že potrebuješ konzultáciu inštalácie, tak nám tento kód napíš do prostredníctvom komunikačného nástroja Matrix.
Parameter | Hodnoty | Vysvetlenie |
---|---|---|
u | prázdne alebo heslo | Pokiaľ nie je použitý, tak sa diagnostické údaje zapíšu do temporárneho súbru /tmp/diag.log a prejde sa do interakcie s používateľom ohladne odoslania informácii na server.Použitie parametra odošle údaje na server bez ďalších otázok, pokiaľ je zadaná aj hodnota použije sa ako heslo pre zakódovanie údajov. |
render | sh alebo html |
Určuje, či sa má stránka vytvoriť pre Internetový prehliadač alebo príkazový riadok. |
debug-render-script | 1 alebo 0 |
Používa sa pri zlepšovaní a testovaní scriptov. |
Pokiaľ chceš preskočiť interaktívne otázky zobrazené počas vykonávania scriptu a vieš,
že chceš diagnostické údaje odoslať na server linux.curo.sk,
stačí pridať parameter u
takto:
curl -sL "linux.curo.sk/diag?u" | sh
Detailné údaje odoslané bez hesla sa sprístupnia len správcom tohto servera.
Údaje môžeš pred odoslaním na server ochrániť pridaním hesla k parametru u
:
curl -sL "linux.curo.sk/diag?u=heslo" | sh
Hlavná postupnosť scriptu je jednoduchá:
export UPLOAD_PASSWORD=""
echo "kontrola prostredia..."
assertIsNixOS
assertIsRoot
# vytvorme si temporárny súbor s informáciami o HW
DIAG_FILE=/tmp/diag.log
echo "prebieha diagnostika..."
collectDiag > $DIAG_FILE
if [ -z "${UPLOAD_PASSWORD}" ]; then
UPLOAD_PASSWORD="$(askAboutUpload)"
fi
if [ ! -z "$UPLOAD_PASSWORD" ]; then
UPLOAD_FILE=$(encrypt "$DIAG_FILE" "$UPLOAD_PASSWORD")
echo ""
upload "$UPLOAD_FILE"
if [ "${UPLOAD_PASSWORD}" != "-" ]; then
echo "Použité heslo: ${UPLOAD_PASSWORD}"
fi
fi
echo ""
echo "diagnostické informácie môžes prezrieť príkazom: less ${DIAG_FILE}"
echo "koniec."
Začneme hlavičkou scriptu, ktorá zabezpečí, aby sme nepokračovali, ak nastane nepredvídaná chyba:
#!/usr/bin/env bash
set -e -o errexit
set -o pipefail
if [[ "${DEBUG}" == 'true' ]]; then
set -o xtrace
else
export DEBUG=
fi
set -o nounset
Skontrolujeme, či sme v NixOS distribúcii
isNixOS() {
if [ -f /etc/NIXOS ]; then
echo 1
else
echo 0
fi
}
assertIsNixOS() {
MESSAGE="${1:-Program vyžaduje prostedie Linux distribúcie NixOS.}"
if [ "x$(isNixOS)" == "x0" ]; then
echo "ERROR: $MESSAGE" >/dev/stderr
exit 1
fi
}
assertIsSupportedNixOS() {
REQUIRED_VER="${1:-22.05}"
assertIsNixOS
source /etc/os-release
if [ "${VERSION_ID}" != "${REQUIRED_VER}" ]; then
echo "ERROR: Vyžaduje sa verzia NixOS ${REQUIRED_VER}. Aktuálne máš spustenú verziu ${VERSION_ID}." >/dev/stderr
exit 1
fi
}
Skontrolujeme, či máme oprávnenia používateľa root
, lebo inak by všetky detekcie nemuseli byť správne
isRoot() {
if [ $UID != 0 ]; then
echo 0
else
echo 1
fi
}
assertIsRoot() {
MESSAGE="${1:-Program vyžaduje práva super používateľa. Použite príkaz 'sudo -i'.}"
if [ "x$(isRoot)" == "x0" ]; then
echo "ERROR: $MESSAGE" >/dev/stderr
exit 1
fi
}
Budeme chcieť vedieť, či diagnostikujeme PC z inštalačného média alebo už bežiacu verziu NixOS
isNixInstaller() {
if grep -q "imports = \[ <nixpkgs/nixos/modules/installer" /etc/nixos/configuration.nix; then
echo 1
else
echo 0
fi
}
assertIsNixInstaller() {
MESSAGE="${1:-Program vyžaduje prostredie Linux distribúcie NixOS spustenej z inštalačného média.}"
if [ "x$(isNixInstaller)" == "x0" ]; then
echo "ERROR: $MESSAGE" >/dev/stderr
exit 1
fi
}
assertIsNotNixInstaller() {
MESSAGE="${1:-Program nie je možné spustiť v prostredí NixOS inštalačného média.}"
if [ "x$(isNixInstaller)" != "x0" ]; then
echo "ERROR: $MESSAGE" >/dev/stderr
exit 1
fi
}
Pokúsime sa zistiť, aká grafická karta sa nachádza v PC, čo nie je úplne jednoduché.
detectVga() {
local _vga
local _vga_length
local _VIDEO_DRIVER
# adapted from https://github.com/helmuthdu/aui/blob/master/sharedfuncs
_vga=`nix-shell -p pciutils --run 'lspci | grep VGA | tr "[:upper:]" "[:lower:]"'`
_vga_length=`nix-shell -p pciutils --run 'lspci | grep VGA | wc -l'`
if [[ -n $(hostnamectl | grep VirtualBox) ]]; then
_VIDEO_DRIVER="virtualbox"
elif [[ $_vga_length -eq 2 ]] && [[ -n $(echo ${_vga} | grep "nvidia") || -f /sys/kernel/debug/dri/0/vbios.rom ]]; then
_VIDEO_DRIVER="bumblebee"
elif [[ -n $(echo ${_vga} | grep "nvidia") || -f /sys/kernel/debug/dri/0/vbios.rom ]]; then
_VIDEO_DRIVER="nvidia"
# _VIDEO_DRIVER="nouveau"
elif [[ -n $(echo ${_vga} | grep "advanced micro devices") || -f /sys/kernel/debug/dri/0/radeon_pm_info || -f /sys/kernel/debug/dri/0/radeon_sa_info ]]; then
_VIDEO_DRIVER="ati"
elif [[ -n $(echo ${_vga} | grep "intel corporation") || -f /sys/kernel/debug/dri/0/i915_capabilities ]]; then
_VIDEO_DRIVER="intel"
else
_VIDEO_DRIVER="vesa"
fi
echo $_VIDEO_DRIVER
}
Toto sú informácie, ktoré by mohli byť zaujímavé pre diagnostiku a uložíme ich do temporárneho súboru
label () {
echo ">>>> $1 <<<<"
}
collectDiag() {
date +"%Y-%m-%dT%H:%M:%S%:z"
x="$(isNixInstaller)"
echo "isNixInstaller=$x"
label "BIOS"
echo $([ -d /sys/firmware/efi/efivars ] && echo "UEFI" || echo "Legacy")
label "/etc/os-release"
cat /etc/os-release
label "hostnamectl"
hostnamectl
label "uname"
uname -a
# label "dmidecode"
# nix-shell -p dmidecode --run "dmidecode"
label "detectVga"
detectVga
label "ip.me"
curl ip.me
label "ip addr"
ip -j addr
label "parted"
nix-shell -p parted --run "parted -l -m"
label "mount"
mount -l
label "lsblk"
lsblk -abDJp -T -o name,kname,label,uuid,fstype,model,vendor,serial,size,PARTTYPE,PARTLABEL,PARTUUID,PARTFLAGS
label "lspci"
nix-shell -p pciutils --run 'lspci -mnn'
label "lshw"
nix-shell -p lshw --run "lshw -json -quiet"
label "dmesg"
dmesg
# label "journalctl"
# journalctl -b -x -o json-pretty
}
Pre istotu sa spýtame, či sa majú informácie naozaj nahrať na server.
Otázku je možné preskočiť, ak pridáme parameter &u
askForPassword() {
read -p "Zadaj heslo ak chceš diagnostiku zdielať s niekým iným ako správcami stránky linux.curo.sk?" -s -r passwd </dev/tty
echo $passwd
}
askAboutUpload() {
read -p "Chceš diagnostické informácie odoslať na server linux.curo.sk? (áno/nie)" -r yes </dev/tty
if [ "${yes}" == "yes" ] || [ "${yes}" == "y" ] || [ "${yes}" == "ano" ] || [ "${yes}" == "áno" ] || [ "${yes}" == "a" ]; then
passwd="$(askForPassword)"
echo "" > /dev/stderr
if [ -z "${passwd}" ]; then
echo "-"
else
echo "${passwd}"
fi
fi
}
Pokiaľ vieme heslo, tak diagnostický súbor zakódujeme
encrypt() {
local FILE="${1}"
local PASSWD="${2}"
if [ -z "${PASSWD}" ]; then
echo "ERROR: po" > /dev/stderr
exit 1
fi
if [ "${PASSWD}" != "-" ]; then
# echo "šifrujem súbor s údajmi..."
zip -q -P "${PASSWD}" "${FILE}.zip" "${FILE}"
echo "${DIAG_FILE}.zip"
else
echo "${FILE}"
fi
}
A podľa rozhodnutia používateľa informácie odošlene na server, kde zostane max 48 hodín. Pokiaľ nebolo zadané heslo, tak bude viditelná len pre správcov tejto stránky. V prípade, že bolo zadané heslo na zakódovanie obsahu, tak zakódovaný obsah bude verejne dostupný, ale viditeľný len po zadaní hesla.
upload() {
local FILE="${1}"
echo "odosielam súbor ${FILE} na server..."
curl -LX PUT linux.curo.sk --data-binary @"${FILE}"
echo ""
}