-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeckdoc.sh
More file actions
executable file
·164 lines (143 loc) · 6.17 KB
/
Copy pathdeckdoc.sh
File metadata and controls
executable file
·164 lines (143 loc) · 6.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#!/usr/bin/env bash
set -uo pipefail
umask 077
FIX_MODE=false
DISPLAY_BLACK_REPORTED=false
DISPLAY_FIX_MODE=false
EXTERNAL_DISPLAY_FIX_MODE=false
PERSIST_DISPLAY_STABILITY=false
for arg in "$@"; do
case "$arg" in
--fix) FIX_MODE=true ;;
--display-black|--symptom=display-black) DISPLAY_BLACK_REPORTED=true ;;
--fix-display-blackout)
DISPLAY_BLACK_REPORTED=true
DISPLAY_FIX_MODE=true
;;
--fix-external-display-blackout)
DISPLAY_BLACK_REPORTED=true
EXTERNAL_DISPLAY_FIX_MODE=true
;;
--persist-display-stability)
DISPLAY_BLACK_REPORTED=true
DISPLAY_FIX_MODE=true
PERSIST_DISPLAY_STABILITY=true
;;
esac
done
export DECKDOC_DISPLAY_BLACK_REPORTED="$DISPLAY_BLACK_REPORTED"
export DECKDOC_PERSIST_DISPLAY_STABILITY="$PERSIST_DISPLAY_STABILITY"
if [ "$(id -u)" -ne 0 ]; then
echo "WARNING: Not running as root. Some diagnostics (dmesg, smartctl, btrfs stats) will be restricted."
echo "WARNING: Remediation modules require root. Use --fix with sudo for full effect."
fi
DECKDOC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
export DECKDOC_DIR
if [ -r "${DECKDOC_DIR}/VERSION" ]; then
DECKDOC_VERSION=$(<"${DECKDOC_DIR}/VERSION")
else
DECKDOC_VERSION="unknown"
fi
readonly DECKDOC_VERSION
MODULES_DIR="${DECKDOC_DIR}/modules"
REDACTOR="${DECKDOC_DIR}/lib/deckdoc-redact.sh"
LOG_DIR="${DECKDOC_LOG_DIR:-${DECKDOC_DIR}/logs}"
RUN_ID=$(date +%s)
REPORT_FILE="${LOG_DIR}/deckdoc_master_report_${RUN_ID}.log"
CAPABILITY_JSON="${LOG_DIR}/deckdoc_capabilities_${RUN_ID}.json"
CAPABILITY_ENV="${LOG_DIR}/.deckdoc_capabilities_${RUN_ID}.env"
if [ ! -x "$REDACTOR" ]; then
echo "DeckDoc public-safe output filter is missing or not executable; refusing collection." >&2
exit 1
fi
mkdir -p "${LOG_DIR}"
rm -f "${LOG_DIR}"/module_*.log
panic_sync() {
sync
}
trap panic_sync EXIT HUP INT QUIT TERM
echo "========================================" > "${REPORT_FILE}"
echo "DeckDoc v${DECKDOC_VERSION} - Diagnostics + Safe Remediation" >> "${REPORT_FILE}"
echo "Timestamp: $(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "${REPORT_FILE}"
echo "Reported symptom: display-black=${DISPLAY_BLACK_REPORTED}" >> "${REPORT_FILE}"
echo "========================================" >> "${REPORT_FILE}"
sync
run_module() {
local module="$1" output="$2"
"$module" 2>&1 | "$REDACTOR" > "$output"
}
if ! "${MODULES_DIR}/system_manifest.sh" --json "$CAPABILITY_JSON" --env "$CAPABILITY_ENV" 2>&1 \
| "$REDACTOR" > "${LOG_DIR}/module_00_system_manifest.log"; then
rm -f -- "$CAPABILITY_ENV" "$CAPABILITY_JSON"
echo "DeckDoc capability discovery failed; refusing an assumption-based report." >&2
exit 1
fi
while IFS='=' read -r capability_key capability_value; do
case "$capability_key" in
DECKDOC_MODEL_FAMILY|DECKDOC_MODEL_CLASS|DECKDOC_DRM_CARD_PATH|DECKDOC_INTERNAL_DISPLAY_PATH|\
DECKDOC_BACKLIGHT_PATH|DECKDOC_BATTERY_PATH|DECKDOC_PRIMARY_STORAGE|DECKDOC_WIFI_INTERFACE)
export "${capability_key}=${capability_value}"
;;
esac
done < "$CAPABILITY_ENV"
rm -f -- "$CAPABILITY_ENV"
export DECKDOC_CAPABILITY_JSON="$CAPABILITY_JSON"
# Hardware telemetry modules (v1.x)
run_module "${MODULES_DIR}/gpu_apu.sh" "${LOG_DIR}/module_gpu.log" &
run_module "${MODULES_DIR}/battery_pmic.sh" "${LOG_DIR}/module_battery.log" &
run_module "${MODULES_DIR}/thermal_fan.sh" "${LOG_DIR}/module_thermal.log" &
run_module "${MODULES_DIR}/storage_smart.sh" "${LOG_DIR}/module_storage.log" &
run_module "${MODULES_DIR}/fs_integrity.sh" "${LOG_DIR}/module_fs.log" &
# Software/OS diagnostic modules (v2.0 / v3.0)
run_module "${MODULES_DIR}/audio_sof.sh" "${LOG_DIR}/module_audio.log" &
run_module "${MODULES_DIR}/display_blackout.sh" "${LOG_DIR}/module_display.log" &
run_module "${MODULES_DIR}/dock_usb_c.sh" "${LOG_DIR}/module_dock.log" &
run_module "${MODULES_DIR}/coredump_analysis.sh" "${LOG_DIR}/module_coredump.log" &
run_module "${MODULES_DIR}/wifi_firmware.sh" "${LOG_DIR}/module_wifi.log" &
run_module "${MODULES_DIR}/gamescope_session.sh" "${LOG_DIR}/module_gamescope.log" &
run_module "${MODULES_DIR}/memory_swap.sh" "${LOG_DIR}/module_memory.log" &
run_module "${MODULES_DIR}/probe_incidents.sh" "${LOG_DIR}/module_probe.log" &
run_module "${MODULES_DIR}/steam_client_logs.sh" "${LOG_DIR}/module_steam.log" &
run_module "${MODULES_DIR}/ryudeck_app.sh" "${LOG_DIR}/module_ryudeck.log" &
run_module "${MODULES_DIR}/mmc_sd_card.sh" "${LOG_DIR}/module_mmc.log" &
run_module "${MODULES_DIR}/acpi_pm_state.sh" "${LOG_DIR}/module_acpi.log" &
run_module "${MODULES_DIR}/dxvk_page_fault.sh" "${LOG_DIR}/module_dxvk.log" &
wait
for log in "${LOG_DIR}"/module_*.log; do
cat "${log}" >> "${REPORT_FILE}"
echo -e "\n----------------------------------------\n" >> "${REPORT_FILE}"
sync
done
# Remediation modules (v3.0) — only with --fix flag
if [ "$FIX_MODE" = true ]; then
echo "" >> "${REPORT_FILE}"
echo "=== REMEDIATION PHASE ===" >> "${REPORT_FILE}"
echo "Timestamp: $(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> "${REPORT_FILE}"
echo "=========================" >> "${REPORT_FILE}"
sync
echo "Remediation phase enabled."
"${MODULES_DIR}/rem_audio_sof.sh" 2>&1 | "$REDACTOR" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
sync
echo "Remediation phase complete."
fi
# Display remediation is deliberately separate from broad --fix. A physical-black
# report and the module's live-panel prechecks are both required before it acts.
if [ "$DISPLAY_FIX_MODE" = true ]; then
echo "" >> "${REPORT_FILE}"
echo "=== DISPLAY REMEDIATION PHASE ===" >> "${REPORT_FILE}"
"${MODULES_DIR}/rem_display_blackout.sh" 2>&1 | "$REDACTOR" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
sync
fi
# External-display remediation targets the KWin desktop path, not gamescope; it
# shares the explicit physical-black symptom gate with the internal-panel fix.
if [ "$EXTERNAL_DISPLAY_FIX_MODE" = true ]; then
echo "" >> "${REPORT_FILE}"
echo "=== EXTERNAL DISPLAY REMEDIATION PHASE ===" >> "${REPORT_FILE}"
"${MODULES_DIR}/rem_external_display.sh" 2>&1 | "$REDACTOR" >> "${REPORT_FILE}"
echo "" >> "${REPORT_FILE}"
sync
fi
sync
exit 0