#!/bin/bash
# arch-debug.sh
# Kerää vianmäärityksen kannalta tärkeät järjestelmätiedot yhteen tekstitiedostoon.
# Aktivoi tämä skripti komennolla chmod +x "/hakemistopolku/tietoa_vikatilanteesta.sh"
# Sen jälkeen aja tämä skripti komennolla "/hakemistopolku/tietoa_vikatilanteesta.sh"

# Tee päivätty raporttitiedosto (esim. tietoa_vikatilanteesta-20260506-092931.txt)
# ajamalla skripti komennolla
# sudo "/hakemistopolku/tietoa_vikatilanteesta.sh"
# tai ilman sudo-valitsinta komennolla:
# "/hakemisto/tietoa_vikatilanteesta.sh"
# Sudo-valitsimella teetetty raportti on hieman laajempi kuin ilman ko. valitsinta tehty raportti.
# Jos skripti ajetaan sudolla, syntynyt tiedosto kuuluu rootille eli pääkäyttäjälle.
# ormaali käyttäjä ei pysty sitä muokkaamaan tai siirtämään.
# Omistajuus vaihdetaan käyttäjälle komennolla:
# sudo chown $USER: tietoa_vikatilanteesta-*.txt
# Asetus $USER: (ilman ryhmää) asettaa ryhmäksi käyttäjän ensisijaisen ryhmän.
# Tämä on turvallinen valinta. Järjestelmien välillä käyttäjien ryhmät voivat
# erota toisistaan.
# Voit lähettää raportin toiselle koneelle kopiointikomentolla (korjaa ensin osoitteita):
# scp /hakemisto/tietoa_vikatilanteesta*.txt käyttäjänimi@192.168.1.50:/home/käyttäjänimi//hakemisto/

TIEDOSTO="arch-debug-$(date +%Y%m%d-%H%M%S).txt"

# ---------------------------------------------------------------------------
# Apufunktiot
# ---------------------------------------------------------------------------

# Osion otsikko ja kuvaus
osio() {
    local otsikko="$1"
    local kuvaus="$2"
    echo ""                                                  >> "$TIEDOSTO"
    echo "############################################################" >> "$TIEDOSTO"
    echo "  ${otsikko}"                                      >> "$TIEDOSTO"
    echo "############################################################" >> "$TIEDOSTO"
    echo "  ${kuvaus}"                                       >> "$TIEDOSTO"
    echo "------------------------------------------------------------" >> "$TIEDOSTO"
    echo ""                                                  >> "$TIEDOSTO"
}

# Suorittaa komennon ja kirjoittaa tuloksen tiedostoon.
# Jos komento ei löydy, tulostaa selkeän ilmoituksen sen sijaan.
aja() {
    if command -v "$1" &>/dev/null; then
        "$@" >> "$TIEDOSTO" 2>&1
    else
        echo "(Komento '$1' ei ole asennettu, tulos puuttuu.)" >> "$TIEDOSTO"
    fi
    echo "" >> "$TIEDOSTO"
}

# ---------------------------------------------------------------------------
# Raportin otsikko
# ---------------------------------------------------------------------------
echo "############################################################" >> "$TIEDOSTO"
echo "  ARCH LINUX — VIANMÄÄRITYSRAPORTTI"                         >> "$TIEDOSTO"
echo "  Luotu : $(date '+%d.%m.%Y %H:%M:%S')"                      >> "$TIEDOSTO"
echo "  Kone  : $(hostnamectl --static 2>/dev/null || hostname)"    >> "$TIEDOSTO"
echo "############################################################"  >> "$TIEDOSTO"

# ---------------------------------------------------------------------------
# 1. Järjestelmän yleistiedot
# ---------------------------------------------------------------------------
osio "1. JÄRJESTELMÄN YLEISTIEDOT" \
"Käyttöjärjestelmä, ydin, arkkitehtuuri ja käynnissäoloaika. \
Kertoo nopeasti, millä ytimellä kone pyörii ja kuinka kauan se on ollut päällä."

aja uname -a
aja hostnamectl
aja uptime -p

# ---------------------------------------------------------------------------
# 2. Käynnistystila (UEFI/BIOS) ja käynnistyslataaja
# ---------------------------------------------------------------------------
osio "2. KÄYNNISTYSTILA JA KÄYNNISTYSLATAAJA" \
"Onko järjestelmä UEFI- vai Legacy BIOS -tilassa, ja mikä käynnistyslataaja \
on käytössä. Tärkeä tieto käynnistysongelmissa ja ytimen päivitysten jälkeen."

echo "--- UEFI efivars (tyhjä = Legacy BIOS) ---"               >> "$TIEDOSTO"
ls /sys/firmware/efi/efivars >> "$TIEDOSTO" 2>&1 \
    || echo "(Kansiota ei löydy — todennäköisesti Legacy BIOS -tila.)" >> "$TIEDOSTO"
echo ""                                                          >> "$TIEDOSTO"

echo "--- bootctl status (systemd-boot) ---"                    >> "$TIEDOSTO"
aja bootctl status

echo "--- efibootmgr (UEFI-käynnistysjärjestys) ---"            >> "$TIEDOSTO"
aja efibootmgr

echo "--- GRUB-konfiguraatio ---"                               >> "$TIEDOSTO"
if [ -f /boot/grub/grub.cfg ]; then
    echo "Tiedosto /boot/grub/grub.cfg löytyy — GRUB on todennäköisesti käytössä." >> "$TIEDOSTO"
else
    echo "Tiedostoa /boot/grub/grub.cfg ei löydy." >> "$TIEDOSTO"
fi
echo "" >> "$TIEDOSTO"

echo "--- Ytimen käynnistysparametrit ---"                      >> "$TIEDOSTO"
cat /proc/cmdline >> "$TIEDOSTO" 2>&1
echo "" >> "$TIEDOSTO"

# ---------------------------------------------------------------------------
# 3. Suoritin (CPU)
# ---------------------------------------------------------------------------
osio "3. SUORITIN (CPU)" \
"Suorittimen malli, ytimien määrä, arkkitehtuuri ja tuetut käskykantalaajennukset. \
Hyödyllinen mm. suorituskykyongelmissa ja yhteensopivuuskysymyksissä."

aja lscpu

# ---------------------------------------------------------------------------
# 4. Keskusmuisti (RAM)
# ---------------------------------------------------------------------------
osio "4. KESKUSMUISTI (RAM)" \
"Muistin kokonaismäärä, käytetty muisti ja swap-tila. \
Korkea muistinkäyttö tai puuttuva swap voivat aiheuttaa kaatumisia ja hidastumista."

aja free -h

# ---------------------------------------------------------------------------
# 5. Näytönohjain ja ajurit
# ---------------------------------------------------------------------------
osio "5. NÄYTÖNOHJAIN JA AJURIT" \
"PCI-laitteet ja niiden käyttämät kernel-ajurit. Erityisen tärkeä grafiikkaongelmissa: \
'Kernel driver in use' -rivi kertoo, onko käytössä oikea ajuri \
(esim. nvidia, amdgpu, i915) vai avoimen lähdekoodin varaversio (nouveau, radeon)."

aja lspci -nnk

# ---------------------------------------------------------------------------
# 6. USB-laitteet
# ---------------------------------------------------------------------------
osio "6. USB-LAITTEET" \
"Kaikki tunnistetut USB-laitteet. Hyödyllinen oheislaitteisiin ja \
ajureihin liittyvissä ongelmissa."

aja lsusb

# ---------------------------------------------------------------------------
# 7. Ladatut kernel-moduulit
# ---------------------------------------------------------------------------
osio "7. LADATUT KERNEL-MODUULIT" \
"Tällä hetkellä aktiiviset kernel-moduulit. Puuttuva tai väärä moduuli \
on usein syy laitteiston toimimattomuuteen."

aja lsmod

# ---------------------------------------------------------------------------
# 8. Lohkolaitteet ja osiot
# ---------------------------------------------------------------------------
osio "8. LOHKOLAITTEET JA OSIOT" \
"Kovalevyt, SSD:t, osiot, koot ja mount-pisteet. \
Käytetään tarkistamaan, onko oikeat osiot liitetty oikeisiin paikkoihin."

aja lsblk -a -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID

# ---------------------------------------------------------------------------
# 9. Levytilan käyttö
# ---------------------------------------------------------------------------
osio "9. LEVYTILAN KÄYTTÖ" \
"Osiokohtainen levytila: kokonaiskoko, käytetty, vapaa ja käyttöprosentti. \
Täynnä oleva osio (100 %) on yleinen vikojen aiheuttaja."

aja df -h --output=source,size,used,avail,pcent,target

# ---------------------------------------------------------------------------
# 10. Tiedostojärjestelmätaulu (fstab)
# ---------------------------------------------------------------------------
osio "10. TIEDOSTOJÄRJESTELMÄTAULU (fstab)" \
"Automaattisesti liitettävät osiot ja niiden asetukset. Virheellinen fstab-merkintä \
estää järjestelmän käynnistymisen."

if [ -f /etc/fstab ]; then
    grep -v '^#\|^$' /etc/fstab >> "$TIEDOSTO"
else
    echo "(Tiedostoa /etc/fstab ei löydy.)" >> "$TIEDOSTO"
fi
echo "" >> "$TIEDOSTO"

# ---------------------------------------------------------------------------
# 11. Mount-pisteet
# ---------------------------------------------------------------------------
osio "11. TÄLLÄ HETKELLÄ LIITETYT TIEDOSTOJÄRJESTELMÄT" \
"Kaikki aktiiviset mount-pisteet. Vertaa fstab-tauluun: \
puuttuvat liitokset kertovat käynnistyspulmista."

aja findmnt --real

# ---------------------------------------------------------------------------
# 12. Init-järjestelmä
# ---------------------------------------------------------------------------
osio "12. INIT-JÄRJESTELMÄ (PID 1)" \
"Tarkistaa, onko käytössä systemd vai jokin muu init. \
Arch Linuxissa tämän pitäisi lähes poikkeuksetta olla systemd."

ps -p 1 -o comm= >> "$TIEDOSTO" 2>&1
echo "" >> "$TIEDOSTO"

# ---------------------------------------------------------------------------
# 13. Epäonnistuneet palvelut
# ---------------------------------------------------------------------------
osio "13. EPÄONNISTUNEET SYSTEMD-PALVELUT" \
"Palvelut, jotka eivät käynnistyneet onnistuneesti. \
Epäonnistuneet palvelut ovat usein suora syy järjestelmän toimintaongelmiin."

aja systemctl --failed --no-pager

# ---------------------------------------------------------------------------
# 14. Kaikki aktiiviset palvelut
# ---------------------------------------------------------------------------
osio "14. KAIKKI AKTIIVISET PALVELUT" \
"Lista kaikista käynnissä olevista systemd-palveluista. \
Hyödyllinen tarkistettaessa, onko tarpeellinen palvelu ylipäätään käynnissä."

aja systemctl list-units --type=service --no-pager

# ---------------------------------------------------------------------------
# 15. Näyttöpalvelin ja työpöytäympäristö
# ---------------------------------------------------------------------------
osio "15. NÄYTTÖPALVELIN JA TYÖPÖYTÄYMPÄRISTÖ" \
"Käytössä oleva näyttöprotokolla (Wayland/X11), työpöytäympäristö ja \
kirjautumisikkuna (display manager). Oleellinen tieto grafiikka- ja \
käyttöliittymäongelmissa."

echo "Näyttöprotokolla (XDG_SESSION_TYPE) : ${XDG_SESSION_TYPE:-ei asetettu}" >> "$TIEDOSTO"
echo "Työpöytäympäristö (DESKTOP_SESSION) : ${DESKTOP_SESSION:-ei asetettu}"  >> "$TIEDOSTO"
echo "" >> "$TIEDOSTO"
echo "--- Näyttöpalvelin (display manager) ---" >> "$TIEDOSTO"
aja systemctl status display-manager --no-pager

# ---------------------------------------------------------------------------
# 16. Verkkoasetukset
# ---------------------------------------------------------------------------
osio "16. VERKKOASETUKSET" \
"Verkkoliitännät, IP-osoitteet ja reititystaulukko. \
Käytetään verkko-ongelmien diagnosointiin."

echo "--- Verkkoliitännät ---" >> "$TIEDOSTO"
aja ip a

echo "--- Reititystaulukko ---" >> "$TIEDOSTO"
aja ip route

# ---------------------------------------------------------------------------
# 17. Kernel-viestit (dmesg)
# ---------------------------------------------------------------------------
osio "17. KERNEL-VIESTIT (dmesg)" \
"Ytimen tulostamat viestit käynnistyksen ja käytön ajalta. \
Laitteisto-ongelmat, ajurivirheet ja muistivirheet näkyvät täällä."

aja dmesg --level=err,warn,crit,alert,emerg

# ---------------------------------------------------------------------------
# 18. Lokivirheet (journalctl)
# ---------------------------------------------------------------------------
osio "18. LOKIVIRHEET TÄLTÄ KÄYNNISTYSKERRALTA" \
"Systemd-journalin kirjaamat virheet (taso 'error' ja vakavammat) \
tältä käynnistyskerralta. Nopein tapa löytää järjestelmätason ongelmat."

aja journalctl -p err -b --no-pager

# ---------------------------------------------------------------------------
# 19. Edellisen käynnistyskerran loki
# ---------------------------------------------------------------------------
osio "19. EDELLISEN KÄYNNISTYSKERRAN VIRHEET" \
"Virheloki edelliseltä käynnistyskerralta. Tärkeä silloin, kun järjestelmä \
kaatui tai käynnistyi uudelleen odottamatta."

journalctl -p err -b -1 --no-pager >> "$TIEDOSTO" 2>&1 \
    || echo "(Edellistä käynnistyskertaa ei löydy lokista.)" >> "$TIEDOSTO"
echo "" >> "$TIEDOSTO"

# ---------------------------------------------------------------------------
# 20. Pacman-loki ja asennetut paketit
# ---------------------------------------------------------------------------
osio "20. VIIMEISIMMÄT PAKETTIMUUTOKSET (pacman-loki)" \
"50 viimeisintä merkintää Pacmanin lokista. Hyödyllinen silloin, kun \
jokin lakkasi toimimasta päivityksen jälkeen."

tail -50 /var/log/pacman.log >> "$TIEDOSTO" 2>/dev/null \
    || echo "(Pacman-lokia ei löydy.)" >> "$TIEDOSTO"
echo "" >> "$TIEDOSTO"

osio "20b. ERIKSEEN ASENNETUT PAKETIT" \
"Lista paketeista, jotka käyttäjä on asentanut suoraan (ei riippuvuuksina). \
Helpottaa tarpeettomien tai ongelmallisten pakettien tunnistamista."

aja pacman -Qe

# ---------------------------------------------------------------------------
# Valmis
# ---------------------------------------------------------------------------
echo "" >> "$TIEDOSTO"
echo "############################################################" >> "$TIEDOSTO"
echo "  Raportti valmis: $(date '+%d.%m.%Y %H:%M:%S')"             >> "$TIEDOSTO"
echo "  Tiedosto: ${TIEDOSTO}"                                      >> "$TIEDOSTO"
echo "############################################################"  >> "$TIEDOSTO"

nano "${TIEDOSTO}"
echo ""
echo "Valmis! Raportti tallennettu tiedostoon:"
echo "  ${TIEDOSTO}"

