213 lines
8.1 KiB
Bash
213 lines
8.1 KiB
Bash
#!/bin/bash
|
||
# ============================================
|
||
# ktouch 日志采集与打包脚本
|
||
# 按类别分目录存储,方便排查触摸屏问题
|
||
# ============================================
|
||
|
||
set -e
|
||
|
||
LOG_PATH="/opt/ktouch"
|
||
NOW=$(date "+%m%d-%H%M%S")
|
||
TMP_BASE="/tmp/klog_$NOW"
|
||
|
||
# ---------- 子目录定义 ----------
|
||
DIR_SYSTEM="$TMP_BASE/system"
|
||
DIR_HARDWARE="$TMP_BASE/hardware"
|
||
DIR_APP="$TMP_BASE/app"
|
||
DIR_PROGRAM="$TMP_BASE/program"
|
||
|
||
mkdir -p "$DIR_SYSTEM" "$DIR_HARDWARE" "$DIR_APP" "$DIR_PROGRAM"
|
||
|
||
echo "正在采集日志(部分操作需 sudo)..."
|
||
|
||
# ============================================
|
||
# 1. 系统日志 ─── system/
|
||
# ============================================
|
||
echo " 采集系统日志..."
|
||
|
||
# journalctl(系统服务日志)
|
||
if command -v journalctl &>/dev/null; then
|
||
sudo journalctl -b -n 5000 --no-pager > "$DIR_SYSTEM/journal_boot.txt" 2>/dev/null || true
|
||
sudo journalctl -u ktouch_daemon --no-pager > "$DIR_SYSTEM/journal_ktouch.txt" 2>/dev/null || true
|
||
sudo journalctl -u lightdm --no-pager > "$DIR_SYSTEM/journal_lightdm.txt" 2>/dev/null || true
|
||
sudo journalctl -u sddm --no-pager > "$DIR_SYSTEM/journal_sddm.txt" 2>/dev/null || true
|
||
fi
|
||
|
||
# dmesg 内核日志
|
||
dmesg > "$DIR_SYSTEM/dmesg.txt" 2>/dev/null || true
|
||
|
||
# 传统系统日志文件
|
||
sudo cp /var/log/syslog* "$DIR_SYSTEM/" 2>/dev/null || true
|
||
sudo cp /var/log/messages* "$DIR_SYSTEM/" 2>/dev/null || true
|
||
sudo cp /var/log/kern* "$DIR_SYSTEM/" 2>/dev/null || true
|
||
sudo cp /var/log/boot* "$DIR_SYSTEM/" 2>/dev/null || true
|
||
sudo cp /var/log/Xorg* "$DIR_SYSTEM/" 2>/dev/null || true
|
||
sudo cp /var/log/dpkg* "$DIR_SYSTEM/" 2>/dev/null || true
|
||
sudo cp /var/log/apt/* "$DIR_SYSTEM/" 2>/dev/null || true
|
||
|
||
# 显示管理器日志
|
||
[ -d /var/log/lightdm ] && sudo cp -r /var/log/lightdm "$DIR_SYSTEM/" 2>/dev/null || true
|
||
[ -d /var/log/sddm ] && sudo cp -r /var/log/sddm "$DIR_SYSTEM/" 2>/dev/null || true
|
||
|
||
# 系统版本
|
||
if [ -f /etc/kylin-release ]; then
|
||
cat /etc/os-release /etc/kylin-release 2>/dev/null > "$DIR_SYSTEM/os_version.txt" || true
|
||
elif [ -f /etc/uos-release ]; then
|
||
cat /etc/os-release /etc/uos-release /etc/os-version 2>/dev/null > "$DIR_SYSTEM/os_version.txt" || true
|
||
else
|
||
cat /etc/os-release 2>/dev/null > "$DIR_SYSTEM/os_version.txt" || true
|
||
fi
|
||
|
||
# ============================================
|
||
# 2. 硬件信息 ─── hardware/
|
||
# ============================================
|
||
echo " 采集硬件信息..."
|
||
|
||
export DISPLAY=:0
|
||
|
||
# X11 输入设备列表 + 属性(按设备分离)
|
||
xinput list > "$DIR_HARDWARE/xinput_list.txt" 2>/dev/null || true
|
||
for id in $(xinput list --id-only 2>/dev/null); do
|
||
echo "========== device id: $id ==========" >> "$DIR_HARDWARE/xinput_props.txt"
|
||
xinput list-props "$id" >> "$DIR_HARDWARE/xinput_props.txt" 2>/dev/null || true
|
||
echo "" >> "$DIR_HARDWARE/xinput_props.txt"
|
||
done
|
||
|
||
# xrandr 显示器信息
|
||
xrandr --verbose > "$DIR_HARDWARE/xrandr.txt" 2>/dev/null || true
|
||
|
||
# libinput 设备列表
|
||
libinput list-devices > "$DIR_HARDWARE/libinput_devices.txt" 2>/dev/null || true
|
||
|
||
# /proc/bus/input/devices(内核视角的输入设备)
|
||
cat /proc/bus/input/devices > "$DIR_HARDWARE/input_devices.txt" 2>/dev/null || true
|
||
|
||
# 每个 event 设备的 udev 信息
|
||
mkdir -p "$DIR_HARDWARE/evdev/"
|
||
for ev in /dev/input/event*; do
|
||
[ -e "$ev" ] || continue
|
||
name=$(basename "$ev")
|
||
echo "========== 设备路径: $ev ==========" >> "$DIR_HARDWARE/evdev/${name}_udev.txt"
|
||
udevadm info --query=all --name="$ev" >> "$DIR_HARDWARE/evdev/${name}_udev.txt" 2>/dev/null || true
|
||
|
||
# 尝试用 evtest 采集设备支持的事件类型(需要 root)
|
||
if command -v evtest &>/dev/null; then
|
||
sudo evtest --info "$ev" > "$DIR_HARDWARE/evdev/${name}_evtest.txt" 2>/dev/null || true &
|
||
fi
|
||
done
|
||
wait 2>/dev/null || true
|
||
|
||
# 每个 event 设备的能力位(capabilities)
|
||
for ev in /dev/input/event*; do
|
||
[ -e "$ev" ] || continue
|
||
name=$(basename "$ev")
|
||
echo "========== $ev ==========" >> "$DIR_HARDWARE/evdev/${name}_caps.txt"
|
||
if command -v evemu-describe &>/dev/null; then
|
||
evemu-describe "$ev" >> "$DIR_HARDWARE/evdev/${name}_caps.txt" 2>/dev/null || true
|
||
fi
|
||
done
|
||
|
||
# DRM 显示器信息
|
||
mkdir -p "$DIR_HARDWARE/drm"
|
||
for card in /sys/class/drm/card*-*; do
|
||
[ -e "$card" ] || continue
|
||
card_name=$(basename "$card")
|
||
mkdir -p "$DIR_HARDWARE/drm/$card_name"
|
||
for attr in status enabled modes dpms edid; do
|
||
[ -f "$card/$attr" ] && cp "$card/$attr" "$DIR_HARDWARE/drm/$card_name/$attr" 2>/dev/null || true
|
||
done
|
||
done
|
||
|
||
# USB 设备树
|
||
lsusb > "$DIR_HARDWARE/lsusb.txt" 2>/dev/null || true
|
||
lsusb -t >> "$DIR_HARDWARE/lsusb.txt" 2>/dev/null || true
|
||
lsusb -v > "$DIR_HARDWARE/lsusb_verbose.txt" 2>/dev/null || true
|
||
|
||
# PCI 设备
|
||
lspci -k > "$DIR_HARDWARE/lspci.txt" 2>/dev/null || true
|
||
|
||
# 块设备
|
||
lsblk -f > "$DIR_HARDWARE/lsblk.txt" 2>/dev/null || true
|
||
|
||
# 硬件信息(需要 root)
|
||
sudo dmidecode > "$DIR_HARDWARE/dmidecode.txt" 2>/dev/null || true
|
||
|
||
# udev 规则
|
||
[ -d /etc/udev/rules.d ] && cp -r /etc/udev/rules.d "$DIR_HARDWARE/udev_rules/" 2>/dev/null || true
|
||
[ -d /lib/udev/rules.d ] && cp -r /lib/udev/rules.d "$DIR_HARDWARE/udev_rules_lib/" 2>/dev/null || true
|
||
|
||
echo "程序版本: ktouch V2" > "$DIR_HARDWARE/ktouch_version.txt"
|
||
[ -f "$LOG_PATH/kscreen-remap-daemon" ] && head -5 "$LOG_PATH/kscreen-remap-daemon" >> "$DIR_HARDWARE/ktouch_version.txt" 2>/dev/null || true
|
||
|
||
# ============================================
|
||
# 3. 程序日志与配置 ─── app/
|
||
# ============================================
|
||
echo " 采集程序日志和配置..."
|
||
|
||
# 程序日志
|
||
[ -f "$LOG_PATH/touchscreen.log" ] && cp "$LOG_PATH/touchscreen.log" "$DIR_APP/touchscreen.log" 2>/dev/null || true
|
||
[ -f "$LOG_PATH/install.log" ] && cp "$LOG_PATH/install.log" "$DIR_APP/install.log" 2>/dev/null || true
|
||
[ -f "$LOG_PATH/sub_modules.log" ] && cp "$LOG_PATH/sub_modules.log" "$DIR_APP/sub_modules.log" 2>/dev/null || true
|
||
# 日志轮转文件
|
||
for f in "$LOG_PATH/"*.log.*; do
|
||
[ -f "$f" ] && cp "$f" "$DIR_APP/" 2>/dev/null || true
|
||
done
|
||
|
||
# 触摸屏配置
|
||
[ -f "$LOG_PATH/config" ] && cp "$LOG_PATH/config" "$DIR_APP/config" 2>/dev/null || true
|
||
[ -f "$LOG_PATH/touch_dis_table.txt" ] && cp "$LOG_PATH/touch_dis_table.txt" "$DIR_APP/" 2>/dev/null || true
|
||
|
||
# 显示器自定义分辨率配置
|
||
[ -d "$LOG_PATH/display_config" ] && cp -r "$LOG_PATH/display_config" "$DIR_APP/display_config" 2>/dev/null || true
|
||
|
||
# /tmp/ktouch 缓存文件
|
||
if [ -d /tmp/ktouch ]; then
|
||
mkdir -p "$DIR_APP/tmp_cache"
|
||
cp -r /tmp/ktouch/* "$DIR_APP/tmp_cache/" 2>/dev/null || true
|
||
fi
|
||
|
||
# systemd 服务文件
|
||
[ -f /etc/systemd/system/ktouch_daemon.service ] && sudo cp /etc/systemd/system/ktouch_daemon.service "$DIR_APP/service_file" 2>/dev/null || true
|
||
|
||
# ============================================
|
||
# 4. 程序本体 ─── program/
|
||
# ============================================
|
||
echo " 采集程序本体..."
|
||
|
||
# 完整拷贝 /opt/ktouch(检查文件完整性 + 配置文件正确性)
|
||
cp -r /opt/ktouch "$DIR_PROGRAM/ktouch"
|
||
|
||
# 同时生成 md5 清单,方便快速比对
|
||
find /opt/ktouch -type f -exec md5sum {} \; 2>/dev/null | sort > "$DIR_PROGRAM/file_md5.txt" || true
|
||
|
||
# ============================================
|
||
# 5. 整理 & 打包
|
||
# ============================================
|
||
echo " 整理并打包..."
|
||
|
||
# 统一权限
|
||
sudo chmod 755 -R "$TMP_BASE" 2>/dev/null || true
|
||
|
||
# 生成文件清单
|
||
find "$TMP_BASE" -type f | sort > "$TMP_BASE/_file_index.txt"
|
||
|
||
# 打包
|
||
echo "正在生成压缩包..."
|
||
cd /tmp
|
||
tar -czf ~/ktouch_log-"$NOW".tar.gz "klog_$NOW"
|
||
|
||
# 清理
|
||
rm -rf "$TMP_BASE"
|
||
|
||
echo ""
|
||
echo "============================================"
|
||
echo " 日志采集完成"
|
||
echo " 文件: ~/ktouch_log-${NOW}.tar.gz"
|
||
echo "============================================"
|
||
echo ""
|
||
echo "压缩包结构:"
|
||
echo " system/ - 系统日志(journalctl, dmesg, syslog, Xorg...)"
|
||
echo " hardware/ - 硬件信息(xinput, xrandr, libinput, udev, evdev...)"
|
||
echo " app/ - 程序日志和配置(log, config, tmp_cache, service...)"
|
||
echo " program/ - 程序本体(文件清单 + md5 + 关键脚本)"
|