add log file export script

This commit is contained in:
2026-05-01 23:04:23 +02:00
parent 045f2d2b50
commit bc2ef7b326
2 changed files with 198 additions and 0 deletions
+1
View File
@@ -15,3 +15,4 @@ alias l='ls $LS_OPTIONS -lA'
PS1='\[\033[1;33m\]\u\[\033[1;37m\]@\[\033[1;32m\]\h\[\033[1;37m\] \[\033[1;31m\]\w \[\033[1;37m\]> \[\033[0m\]' PS1='\[\033[1;33m\]\u\[\033[1;37m\]@\[\033[1;32m\]\h\[\033[1;37m\] \[\033[1;31m\]\w \[\033[1;37m\]> \[\033[0m\]'
alias restartrehdd='systemctl restart getty@tty1.service' alias restartrehdd='systemctl restart getty@tty1.service'
alias exportlogsrehdd='clear && /usr/bin/bash /root/export_reHDD_logs.sh'
+197
View File
@@ -0,0 +1,197 @@
#!/usr/bin/env bash
# export_reHDD_logs.sh
# Exports reHDD logs to a selected drive with optional ext4 formatting.
set -euo pipefail
# ─── Colors ───────────────────────────────────────────────────────────────────
RED='\033[0;31m'
YEL='\033[1;33m'
GRN='\033[0;32m'
CYN='\033[0;36m'
BLD='\033[1m'
RST='\033[0m'
# ─── Privilege check ──────────────────────────────────────────────────────────
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}Error: This script must be run as root.${RST}" >&2
exit 1
fi
# ─── Dependency check ─────────────────────────────────────────────────────────
for cmd in lsblk mkfs.ext4 mount umount sync; do
if ! command -v "$cmd" &>/dev/null; then
echo -e "${RED}Error: Required command '${cmd}' not found.${RST}" >&2
exit 1
fi
done
SOURCE_LOG="/root/reHDD/reHDD.log"
if [[ ! -f "$SOURCE_LOG" ]]; then
echo -e "${RED}Error: Log file not found: ${SOURCE_LOG}${RST}" >&2
exit 1
fi
# ─── 1. Discover drives ───────────────────────────────────────────────────────
echo -e "\n${BLD}${CYN}=== reHDD Log Exporter ===${RST}\n"
echo -e "${BLD}Scanning for block devices...${RST}\n"
# Collect drives (disk type, not partitions/loops/rom)
# Temporarily disable errexit so an empty result doesn't kill the script
DRIVES=()
while IFS= read -r line; do
[[ -n "$line" ]] && DRIVES+=("$line")
done < <(lsblk -dpno NAME,TYPE 2>/dev/null | awk '$2=="disk"{print $1}' || true)
if [[ ${#DRIVES[@]} -eq 0 ]]; then
echo -e "${RED}No drives found.${RST}" >&2
exit 1
fi
# Build display table
declare -a DRIVE_PATHS DRIVE_SIZES DRIVE_FS
idx=0
for drv in "${DRIVES[@]}"; do
# NVMe uses /dev/nvme0n1p1, SATA/USB use /dev/sda1
if [[ "$drv" =~ nvme ]]; then
part="${drv}p1"
else
part="${drv}1"
fi
# Human-readable size of the whole disk
size=$(lsblk -dno SIZE "$drv" 2>/dev/null || echo "N/A")
# Filesystem on first partition (if it exists)
if [[ -b "$part" ]]; then
fs=$(lsblk -no FSTYPE "$part" 2>/dev/null | head -1 || true)
fs=${fs:-"<unknown>"}
else
fs="<no partition>"
fi
DRIVE_PATHS[$idx]="$drv"
DRIVE_SIZES[$idx]="$size"
DRIVE_FS[$idx]="$fs"
(( idx++ )) || true
done
# Print table
printf " ${BLD}%-4s %-12s %-10s %-15s${RST}\n" "No." "Path" "Size" "FS (part1)"
printf " %-4s %-12s %-10s %-15s\n" "----" "------------" "----------" "---------------"
for i in "${!DRIVE_PATHS[@]}"; do
printf " ${GRN}%-4s${RST} %-12s %-10s %-15s\n" \
"$((i+1))" "${DRIVE_PATHS[$i]}" "${DRIVE_SIZES[$i]}" "${DRIVE_FS[$i]}"
done
echo ""
# ─── 2. Drive selection ───────────────────────────────────────────────────────
while true; do
read -rp "$(echo -e "${BLD}Select drive [1-${#DRIVE_PATHS[@]}]:${RST} ")" sel
if [[ "$sel" =~ ^[0-9]+$ ]] && (( sel >= 1 && sel <= ${#DRIVE_PATHS[@]} )); then
SELECTED_IDX=$((sel-1))
break
fi
echo -e "${YEL}Invalid selection, try again.${RST}"
done
DRIVE="${DRIVE_PATHS[$SELECTED_IDX]}"
# NVMe partitions use 'p1' suffix, SATA/USB use '1'
if [[ "$DRIVE" =~ nvme ]]; then
PARTITION="${DRIVE}p1"
else
PARTITION="${DRIVE}1"
fi
CURRENT_FS="${DRIVE_FS[$SELECTED_IDX]}"
echo -e "\nSelected: ${BLD}${DRIVE}${RST} (${DRIVE_SIZES[$SELECTED_IDX]}, fs: ${CURRENT_FS})\n"
# ─── 3. Create ext4 if needed ─────────────────────────────────────────────────
if [[ "$CURRENT_FS" != "ext4" ]]; then
echo -e "${YEL}Warning:${RST} Partition ${PARTITION} does not have an ext4 filesystem."
echo -e " Current: ${BLD}${CURRENT_FS}${RST}"
echo -e "${RED} All existing data on ${PARTITION} will be DESTROYED.${RST}\n"
read -rp "$(echo -e "${BLD}Create ext4 filesystem on ${PARTITION}? [yes/NO]: ${RST}")" confirm
if [[ "$confirm" != "yes" ]]; then
echo -e "${YEL}Aborted by user.${RST}"
exit 0
fi
echo -e "\n${CYN}Creating ext4 filesystem on ${PARTITION}...${RST}"
# If there is no partition table / first partition, create one first
if [[ ! -b "$PARTITION" ]]; then
echo -e "${CYN}No first partition found creating a single primary partition...${RST}"
echo -e "o\nn\np\n1\n\n\nw" | fdisk "$DRIVE" >/dev/null 2>&1 || true
partprobe "$DRIVE" 2>/dev/null || true
sleep 1
fi
mkfs.ext4 -F "$PARTITION"
echo -e "${GRN}ext4 filesystem created successfully.${RST}\n"
fi
# ─── 4. Mount partition ───────────────────────────────────────────────────────
RAND_HEX=$(tr -dc 'a-f0-9' </dev/urandom | head -c 16 || true)
MNT_DIR="/mnt/${RAND_HEX}_reHDD_Log_Exporter"
echo -e "${CYN}Mounting ${PARTITION} at ${MNT_DIR} ...${RST}"
mkdir -p "$MNT_DIR"
# Ensure cleanup on unexpected exit
cleanup() {
local exit_code=$?
if mountpoint -q "$MNT_DIR" 2>/dev/null; then
umount "$MNT_DIR" 2>/dev/null || true
fi
if [[ -d "$MNT_DIR" ]]; then
rmdir "$MNT_DIR" 2>/dev/null || true
fi
exit $exit_code
}
trap cleanup ERR INT TERM
mount "$PARTITION" "$MNT_DIR"
echo -e "${GRN}Mounted successfully.${RST}\n"
# ─── 5. Prefix input ─────────────────────────────────────────────────────────
while true; do
read -rp "$(echo -e "${BLD}Enter a prefix (no spaces, e.g. shredderpc42): ${RST}")" PREFIX
if [[ -z "$PREFIX" ]]; then
echo -e "${YEL}Prefix must not be empty.${RST}"
elif [[ "$PREFIX" =~ [[:space:]] ]]; then
echo -e "${YEL}Prefix must not contain spaces.${RST}"
else
break
fi
done
# ─── 6. Copy log file ─────────────────────────────────────────────────────────
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
DEST_FILE="${MNT_DIR}/${PREFIX}_reHDD_${TIMESTAMP}.log"
echo -e "\n${CYN}Copying log to ${DEST_FILE} ...${RST}"
cp "$SOURCE_LOG" "$DEST_FILE"
echo -e "${GRN}Log copied successfully.${RST}\n"
# ─── 7. Sync ──────────────────────────────────────────────────────────────────
echo -e "${CYN}Syncing buffers to disk...${RST}"
sync
echo -e "${GRN}Sync complete.${RST}\n"
# ─── 8. Unmount & cleanup ─────────────────────────────────────────────────────
echo -e "${CYN}Unmounting ${MNT_DIR} ...${RST}"
umount "$MNT_DIR"
echo -e "${GRN}Unmounted.${RST}"
echo -e "${CYN}Removing mount directory...${RST}"
rmdir "$MNT_DIR"
echo -e "${GRN}Done.${RST}\n"
# Disable trap — clean exit
trap - ERR INT TERM
echo -e "${BLD}${GRN}✓ Log exported successfully to ${DRIVE} as:${RST}"
echo -e " ${BLD}${PREFIX}_reHDD_${TIMESTAMP}.log${RST}\n"