Obsah

Diagnostika stavu PC pre NixOS

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

Výsledok diagnostiky

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.

Parametre

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

Čo sa vykoná?

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."

Jednotlivé časti scriptu

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 ""
}

Verzia: 0.1.0 © Curo s.r.o. | Táto stránka nepoužíva keksíky a nepotrebuje JavaScript.
Komunikujeme cez  Matrix