#!/bin/bash
# ==============================================================================
# THE GOD DUMP - Ultimate Hardware & Firmware Profiler for Debian Live
# Użycie: sudo ./god_dump.sh /katalog/docelowy/na/pendrive
# ==============================================================================

if [ "$EUID" -ne 0 ]; then
  echo "Uruchom skrypt jako root (sudo)!"
  exit 1
fi

DEST_DIR="${1:-/tmp}"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DUMP_DIR="$DEST_DIR/system_dump_$TIMESTAMP"
mkdir -p "$DUMP_DIR"

echo "[1/7] Aktualizacja list pakietów i instalacja narzędzi ratunkowych..."
apt-get update -qq
apt-get install -y -qq inxi lshw dmidecode pciutils usbutils hwinfo \
    smartmontools nvme-cli fwupd lm-sensors acpica-tools chntpw libhivex-bin \
    ntfs-3g edid-decode ethtool upower

echo "[2/7] Generowanie zbiorczych, ludzkich raportów (inxi, lshw, hwinfo)..."
inxi -Fxxxz -m -c 0 --usb --slots --filter --disk-full > "$DUMP_DIR/01_inxi_summary.txt" 2>&1
lshw -html > "$DUMP_DIR/02_lshw_report.html" 2>&1
lshw -numeric -notime > "$DUMP_DIR/02_lshw_report.txt" 2>&1
hwinfo --all > "$DUMP_DIR/03_hwinfo_full.txt" 2>&1

echo "[3/7] Głęboki zrzut magistrali (PCIe, USB, DMI/BIOS)..."
lspci -vvvnnxxx > "$DUMP_DIR/04_pci_detailed.txt" 2>&1
lsusb -vvv > "$DUMP_DIR/05_usb_detailed.txt" 2>&1
dmidecode -t all > "$DUMP_DIR/06_dmidecode_full.txt" 2>&1

echo "[4/7] Zrzut tabel ACPI i klucza OEM Windows (z BIOS/UEFI)..."
mkdir -p "$DUMP_DIR/ACPI"
acpidump -b > "$DUMP_DIR/ACPI/acpi_tables.bin" 2>&1
# Wyciąganie klucza wpisanego w płytę główną (Windows 8/10/11)
if [ -f /sys/firmware/acpi/tables/MSDM ]; then
    strings /sys/firmware/acpi/tables/MSDM | tail -n 1 > "$DUMP_DIR/WINDOWS_OEM_KEY_BIOS.txt"
    echo "Znaleziono klucz Windows w BIOS!"
else
    echo "Brak tabeli MSDM (brak klucza w BIOS)." > "$DUMP_DIR/WINDOWS_OEM_KEY_BIOS.txt"
fi

echo "[5/7] Ekstrakcja Firmware, Baterii i Matrycy..."
fwupdmgr get-devices --verbose > "$DUMP_DIR/07_firmware_lvfs.txt" 2>&1
upower -d > "$DUMP_DIR/08_power_battery.txt" 2>&1
# Wyciąganie danych matrycy (EDID)
for edid in /sys/class/drm/*/edid; do
    if [ -s "$edid" ]; then
        name=$(echo "$edid" | cut -d'/' -f5)
        edid-decode "$edid" > "$DUMP_DIR/09_monitor_${name}_edid.txt" 2>/dev/null
    fi
done

echo "[6/7] Storage & SMART (Dyski i kontrolery)..."
mkdir -p "$DUMP_DIR/Storage"
lsblk -O -f > "$DUMP_DIR/Storage/lsblk_full.txt" 2>&1
for dev in $(lsblk -nd -o NAME | grep -E '^(sd|nvme|mmc)'); do
    smartctl -x /dev/$dev > "$DUMP_DIR/Storage/smart_${dev}.txt" 2>&1
    if [[ $dev == nvme* ]]; then
        nvme id-ctrl /dev/$dev -H > "$DUMP_DIR/Storage/nvme_firmware_${dev}.txt" 2>&1
    fi
done

echo "[7/7] Poszukiwanie klucza Windows w plikach rejestru na dysku..."
# Szukamy partycji NTFS, która ma katalog Windows/System32/config
mkdir -p /mnt/win_temp
for part in $(lsblk -nd -o NAME,FSTYPE | grep -i "ntfs" | awk '{print $1}'); do
    mount -t ntfs-3g -o ro "/dev/$part" /mnt/win_temp 2>/dev/null
    if [ -f "/mnt/win_temp/Windows/System32/config/SOFTWARE" ]; then
        echo "Znaleziono instalację Windows na /dev/$part. Wyciąganie klucza..."
        hivexget /mnt/win_temp/Windows/System32/config/SOFTWARE \
        "\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" \
        BackupProductKeyDefault > "$DUMP_DIR/WINDOWS_KEY_REGISTRY.txt" 2>/dev/null
    fi
    umount /mnt/win_temp 2>/dev/null
done
rm -rf /mnt/win_temp

# Pętla pakująca to "w jedno miejsce"
echo "Kompresowanie raportu do jednego pliku tar.gz..."
cd "$DEST_DIR" || exit
tar -czf "system_dump_$TIMESTAMP.tar.gz" "system_dump_$TIMESTAMP"
rm -rf "system_dump_$TIMESTAMP" # usuwamy folder, zostawiamy tylko archiwum

echo "========================================================================="
echo "GOTOWE! Twój zrzut systemu znajduje się w: $DEST_DIR/system_dump_$TIMESTAMP.tar.gz"
echo "========================================================================="