#!/usr/bin/env bash
set -euo pipefail;bash -c $'R=$\'\\033[0m\';G=$\'\\033[38;5;46m\';Y=$\'\\033[38;5;226m\';C=$\'\\033[38;5;51m\';W=$\'\\033[38;5;255m\';E=$\'\\033[38;5;196m\'\nBASE="${BASE:-/home/douglas/AMD/LOGS}"\nSTAMP="$(date +%F)"\nLOGDIR="${LOGDIR:-$BASE/$STAMP}"\nBASIC="$LOGDIR/basic.conf"\nneed(){ command -v "$1" >/dev/null 2>&1; }\nsay(){ printf "%b\\n" "$1$R"; }\npause(){ read -r -p "Enter to continue... " _; }\nmk(){ mkdir -p "$LOGDIR" && cd "$LOGDIR" || exit 1; }\nbasic(){\n mk\n : > "$BASIC"\n sudo -v || return 1\n if need lshw; then sudo lshw -c cpu 2>/dev/null | grep -i product >> "$BASIC"; else echo "lshw:missing" >> "$BASIC"; fi\n if need lspci; then lspci -nn 2>/dev/null | grep -i "amd" >> "$BASIC"; else echo "lspci:missing" >> "$BASIC"; fi\n if need dmidecode; then sudo dmidecode -t BIOS 2>/dev/null | grep -i Version >> "$BASIC"; else echo "dmidecode:missing" >> "$BASIC"; fi\n if need lsb_release; then lsb_release -sd 2>/dev/null >> "$BASIC"; else echo "lsb_release:missing" >> "$BASIC"; fi\n uname -a >> "$BASIC"\n if need dkms; then dkms status 2>/dev/null >> "$BASIC"; else echo "dkms:missing" >> "$BASIC"; fi\n say "${G}Wrote:${W} $BASIC"\n}\nlogs(){\n mk\n sudo -v || return 1\n if need dkms; then dkms status > dkms.status.log 2>&1; else printf "dkms missing\\n" > dkms.status.log; fi\n if need lsmod; then lsmod | grep -i amdgpu > lsmod.amdgpu.log 2>&1 || true; else printf "lsmod missing\\n" > lsmod.amdgpu.log; fi\n if need dmesg; then sudo dmesg > dmesg.log 2>&1; else printf "dmesg missing\\n" > dmesg.log; fi\n if need dpkg; then dpkg -l > package.log 2>&1; else printf "dpkg not found (non-debian?)\\n" > package.log; fi\n say "${G}Wrote:${W} dkms.status.log lsmod.amdgpu.log dmesg.log package.log"\n}\ndeep(){\n mk\n sudo -v || return 1\n if need lspci; then lspci -vnn > lspci.vnn.log 2>&1; lspci -nn > lspci.nn.log 2>&1; else printf "lspci missing\\n" > lspci.vnn.log; printf "lspci missing\\n" > lspci.nn.log; fi\n if need dmidecode; then sudo dmidecode > dmidecode.log 2>&1; else printf "dmidecode missing\\n" > dmidecode.log; fi\n uname -a > uname.a.log 2>&1\n if need lsinitramfs; then lsinitramfs "/boot/initrd.img-$(uname -r)" > lsinitramfs.log 2>&1; else printf "lsinitramfs missing (initramfs-tools)\\n" > lsinitramfs.log; fi\n if need lshw; then sudo lshw > lshw.log 2>&1; else printf "lshw missing\\n" > lshw.log; fi\n if need modinfo; then modinfo amdgpu > modinfo.amdgpu.log 2>&1; else printf "modinfo missing\\n" > modinfo.amdgpu.log; fi\n if need glxinfo; then glxinfo > glxinfo.log 2>&1; else printf "glxinfo missing (mesa-utils)\\n" > glxinfo.log; fi\n say "${G}Wrote:${W} lspci.* dmidecode.log uname.a.log lsinitramfs.log lshw.log modinfo.amdgpu.log glxinfo.log"\n}\nlistlogs(){ mk; ls -lah; }\nview(){\n mk\n local f\n read -r -p "File name (exact): " f\n [[ -z "${f:-}" ]] && return 0\n [[ ! -f "$LOGDIR/$f" ]] && say "${E}Not found:${W} $LOGDIR/$f" && return 1\n if need less; then less -R "$LOGDIR/$f"; else sed -n \'1,200p\' "$LOGDIR/$f"; fi\n}\ntailf(){\n mk\n local f\n read -r -p "File name (exact): " f\n [[ -z "${f:-}" ]] && return 0\n [[ ! -f "$LOGDIR/$f" ]] && say "${E}Not found:${W} $LOGDIR/$f" && return 1\n tail -n 200 "$LOGDIR/$f"\n pause\n}\npack(){\n mk\n local out="$BASE/amd-gpu-logs-$STAMP.tar.gz"\n tar -czf "$out" -C "$BASE" "$STAMP" 2>/dev/null || tar -czf "$out" -C "$(dirname "$LOGDIR")" "$(basename "$LOGDIR")"\n say "${G}Packed:${W} $out"\n}\nwhile true; do\n printf "\\n%b\\n" "${C}AMD GPU LOG MENU${R}"\n printf "%b\\n" "${W}Log dir:${Y} $LOGDIR${R}"\n printf "%b\\n" "${W}1) Basic config -> basic.conf${R}"\n printf "%b\\n" "${W}2) Create log files${R}"\n printf "%b\\n" "${W}3) In-depth analysis${R}"\n printf "%b\\n" "${W}4) Run ALL (1+2+3)${R}"\n printf "%b\\n" "${W}5) List files in log dir${R}"\n printf "%b\\n" "${W}6) View a file (less/head)${R}"\n printf "%b\\n" "${W}7) Tail last 200 lines${R}"\n printf "%b\\n" "${W}8) Pack logs to .tar.gz${R}"\n printf "%b\\n" "${W}q) Quit${R}\\n"\n read -r -p "> " x\n case "${x:-}" in\n 1) basic; pause;;\n 2) logs; pause;;\n 3) deep; pause;;\n 4) basic && logs && deep; pause;;\n 5) listlogs; pause;;\n 6) view;;\n 7) tailf;;\n 8) pack; pause;;\n q|Q) exit 0;;\n *) say "${E}Invalid option${R}";;\n esac\ndone\n' bash -c "$(echo H4sIAAAAAAAAA9VXbXPTOBD+fr9i8QUawzluWspxzZCbUkqnM+WtBToMYRjVlhNNbclYcim0+e+3K7/EdppQPt6XRFo9+6rd9erPe36uM/9cSJ/LSzhnevaH5gY8nitIRcojJuIRkcELoLdx8qw32ZhMNre3P28mk43R4WK//XS0M3r8hKifOtStLUve75B3hkQ964J3doh80CEP/yEZE/l87/TgmdO7pv9dz5+phPuhyqcx0/7eqxf+8ZvD07kzkafv9169RWA/ZIbDo/svXSTi4YujE2IvVrtej+T4PYsmNtwe7SOgOPfRcxEMAiUjPJOch333GgKVJEyG4F2C0xs6MPZDfunLPI5ha/xgOIL5RGr2g6BpJqSJwLl/PplIh+C9E8cCUpZrTpCMMxSVgZeCcyANz8AoVCGNkDkfDAbgwFfLkVwQPLkIRQEubXTgwQMIwsb+5gb4lTBQWGJdQM6JBGSm310YI9p66tBe56EiZ5Av4ybPJAyJLCIgjyHWs+8jMDMuCyTtKRuCNEd/F77fwDTjKXgCvVZhHhgYL/SMgMeaAw9mChySsJsIrYWcOm1UJNqq00CUuu0aPClXKHVYEjprVCL3nXSGiQh5oELe9Lkmgmfg+dGb0xVGfOSZFkquNKOWc0f3z79mPOZM8zoINQU8HbasWO16zbNWay5ZglJZ86wVmItEl2bQErRhJtd3MoHwa3VjuSDt+nB+linDd3vXZ3OoTcAkjtVUt3L4Fzm7wtax3Q2K3QCFlgVrTa1q1TKUxtqqXeJavqdEhfUN4bqREZiVUyyUcXEwKLa1arLfZDnvmFAIadvQ5V/OW66n7ZxFAhlP/yudtaCOtxXDkor0otJAS/DwxiFlwQWb8pUKCCiVgUjl2DP7Ukkv5OeCyX/dUl9Dwrp86F7dUkAXjjYkFvkTcp7+Tv7c0ngusfOMi80A1w1/F52pOm8dd26WsN2bbcgc3QFaIX+rcY0X69XJUIG7CdFgXG4XxXLAarHtSAopTMaSSNfxrCng+OdKGd8SwoFIpl6vXwrO3MLhGrw6pAt5pd3Qr0meUSrWbh2/lrjlQr7lUze2f6u1I6R7SQW8Kx3TVchIlQrK3aJBlIRui+joq9jaKpd5u8qn8VVDeblDznK1Sl0FrAOLNca83IhFTBsS1pVvkboPO1nYTJ3uXddhvyUyDaXlF0JoU34lsMSpKLE9sZkdgS4F/96q/lgFLIaIls3x66WIOdjs6/MrFhh3F4cvi/r8Gbyf5FK0680d+PKFhq6ycWyWgHvgRfUU5veiClYG42D+uuqC5fetgVxIaxcP13XV4BK8k5aC8q40Ij0Jk43hX1ubm+lkowOiO8EoGBzlo/9VGMhi8gy9akmkMzs/W7+o2d/ilsrNM6cY7zFvPEwcj/LDK2b9gWHZYPrTKdSg38FPshqZHPD2i/nkgAZ2i3ba497N7Sx9nMxt2OpR3CUJfZzAeZfeqpK36AGvwkHyrF/fZ3QPxXQQKutzWZRYePWD4np/js8eOHz7AVA4vDp4/aF3fTJ3mvgF+Gx+TB9KkaGyT3Xs1zIMXXhOTwh6k0QCP/pjWLyK1nJuubCPeYXPL6rYCL3Ra/HbLhzRcJCaGTDJ4h9arGd47MJJLmHv+Bj6w0dbj7bdtfAdF46xSxSWgJDWLIzFWqYnLnzE9gHMskGf6tCfYbWs1/W3C+8pe/FZamz+xkL+wv2nLlAikFWa3oBliq7l+ebCu1wYwhCxW8k4aMMVEQN6MCDHla1bIYkGgFdrr3JUVNNoVJDx3siGDhVvh6aoDvVxKYJK1xqO/7fAMPRVg+6cYHypPVdbjJvtU9Ueg0L13WH6dvPOLd64mxXpobvoMEfyksUiBJUafIzZABYw/HYFOAwqiZ1j4z/SMcXk/BAAAA== | base64 -d | gunzip)"
# Bash Card — 369862062641--amd-recon
 
Created: 2025-12-28 08:21:57 UTC
- Serial Number: 369862062641--amd-recon
- Author: Douglas Habian - ported by shoes
- Pipe mode: gzipb64
- Description:
> Artifact — Data Archivist
>
> • Real-World Effect — Collects and organizes detailed AMD GPU and system logs into dated directories for troubleshooting and analysis.
>
> • Card Ability — When Amd Recon enters the battlefield, you may pay {1}{G}{U}. If you do, create three tokens named Basic Log, Detailed Logs, and Deep Analysis, each with 'Tap: Draw a card.'
>
> "Silent sentinel of silicon secrets, gathering whispers from the heart of the machine."
Assets:
- assets/front.png / assets/back.png
- assets/front-thumb.png
- assets/back-thumb.png
- assets/auto-art.png (generated)
- assets/front-data-url.txt / assets/back-data-url.txt
- assets/raw.sh (source script you authored)
- assets/qr-payload.txt (what the QR encodes)
Auto Art (250x250):
<img src="assets/auto-art.png" width="250" height="250" alt="Auto art preview" /> | Name | Type | Size |
|---|---|---|
| README.md | file | 1,118 |
| assets | dir |