Improve RPi image scripts

- flash-image.sh: Add optional device argument to bypass auto-detection
- flash-image.sh/pull-image.sh: Remove bc dependency, use bash integer math
- sanitize-for-image.sh: Add better debugging and verification for wizard setup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Aaron D. Lee
2026-01-03 03:16:01 -05:00
parent 45b99d2c5e
commit 0d7b5a14cb
3 changed files with 119 additions and 86 deletions

View File

@@ -3,8 +3,10 @@
# Flash Stegasoo image to SD card # Flash Stegasoo image to SD card
# Auto-detects SD card, decompresses and writes with progress # Auto-detects SD card, decompresses and writes with progress
# #
# Usage: ./flash-image.sh <image.img.xz> # Usage: ./flash-image.sh <image.img.xz> [device]
# ./flash-image.sh <image.img> # ./flash-image.sh <image.img> [device]
#
# If device is specified, skips auto-detection (useful for large drives)
# #
set -e set -e
@@ -32,15 +34,16 @@ fi
# Check for image argument # Check for image argument
if [ -z "$1" ]; then if [ -z "$1" ]; then
echo -e "${RED}Usage: $0 <image.img.xz|image.img>${NC}" echo -e "${RED}Usage: $0 <image.img.xz|image.img> [device]${NC}"
echo "" echo ""
echo "Examples:" echo "Examples:"
echo " $0 stegasoo-rpi-20260103.img.xz" echo " $0 stegasoo-rpi-20260103.img.xz # auto-detect SD card"
echo " $0 stegasoo-rpi-20260103.img" echo " $0 stegasoo-rpi-20260103.img.xz /dev/sdb # specify device"
exit 1 exit 1
fi fi
IMAGE="$1" IMAGE="$1"
MANUAL_DEVICE="$2"
if [ ! -f "$IMAGE" ]; then if [ ! -f "$IMAGE" ]; then
echo -e "${RED}Error: Image file not found: $IMAGE${NC}" echo -e "${RED}Error: Image file not found: $IMAGE${NC}"
@@ -86,14 +89,27 @@ if [ "$COMPRESSED" = true ]; then
fi fi
echo "" echo ""
# Auto-detect SD card candidates # Use manual device or auto-detect
echo -e "${BOLD}Scanning for SD cards...${NC}" if [ -n "$MANUAL_DEVICE" ]; then
echo "" # Manual device specified
if [ ! -b "$MANUAL_DEVICE" ]; then
echo -e "${RED}Error: $MANUAL_DEVICE is not a block device${NC}"
exit 1
fi
SELECTED="$MANUAL_DEVICE"
echo -e "Using specified device: ${YELLOW}$SELECTED${NC}"
echo ""
lsblk "$SELECTED" -o NAME,SIZE,TYPE,MODEL
echo ""
else
# Auto-detect SD card candidates
echo -e "${BOLD}Scanning for SD cards...${NC}"
echo ""
declare -a CANDIDATES declare -a CANDIDATES
declare -a CANDIDATE_INFO declare -a CANDIDATE_INFO
while IFS= read -r line; do while IFS= read -r line; do
DEV=$(echo "$line" | awk '{print $1}') DEV=$(echo "$line" | awk '{print $1}')
SIZE=$(echo "$line" | awk '{print $2}') SIZE=$(echo "$line" | awk '{print $2}')
TYPE=$(echo "$line" | awk '{print $3}') TYPE=$(echo "$line" | awk '{print $3}')
@@ -111,52 +127,48 @@ while IFS= read -r line; do
continue continue
fi fi
# Parse size to bytes for comparison # Get size in bytes for reliable comparison
SIZE_NUM=$(echo "$SIZE" | sed 's/[^0-9.]//g') SIZE_BYTES=$(lsblk -b -d -o SIZE -n "/dev/$DEV" 2>/dev/null | tr -d ' ')
SIZE_UNIT=$(echo "$SIZE" | sed 's/[0-9.]//g') SIZE_GB_INT=$((SIZE_BYTES / 1073741824)) # 1024^3
case $SIZE_UNIT in
G) SIZE_GB=$SIZE_NUM ;;
T) SIZE_GB=$(echo "$SIZE_NUM * 1024" | bc) ;;
M) SIZE_GB=$(echo "scale=2; $SIZE_NUM / 1024" | bc) ;;
*) SIZE_GB=0 ;;
esac
# Check if size is in SD card range (8GB - 128GB) # Check if size is in SD card range (8GB - 128GB)
if (( $(echo "$SIZE_GB >= 8" | bc -l) )) && (( $(echo "$SIZE_GB <= 128" | bc -l) )); then if [ "$SIZE_GB_INT" -ge 8 ] && [ "$SIZE_GB_INT" -le 128 ]; then
CANDIDATES+=("/dev/$DEV") CANDIDATES+=("/dev/$DEV")
CANDIDATE_INFO+=("$SIZE $TYPE ${TRAN:-???} $MODEL") CANDIDATE_INFO+=("$SIZE $TYPE ${TRAN:-???} $MODEL")
fi fi
done < <(lsblk -d -o NAME,SIZE,TYPE,TRAN,MODEL -n | grep "disk") done < <(lsblk -d -o NAME,SIZE,TYPE,TRAN,MODEL -n | grep "disk")
if [ ${#CANDIDATES[@]} -eq 0 ]; then if [ ${#CANDIDATES[@]} -eq 0 ]; then
echo -e "${RED}No SD card candidates found.${NC}" echo -e "${RED}No SD card candidates found.${NC}"
echo "Looking for USB/removable disks between 8GB and 128GB." echo "Looking for USB/removable disks between 8GB and 128GB."
echo "" echo ""
echo "Available disks:" echo "Available disks:"
lsblk -d -o NAME,SIZE,TYPE,TRAN,MODEL lsblk -d -o NAME,SIZE,TYPE,TRAN,MODEL
echo ""
echo -e "${YELLOW}Tip: Specify device manually: $0 $IMAGE /dev/sdX${NC}"
exit 1 exit 1
fi fi
echo -e "${GREEN}Found ${#CANDIDATES[@]} candidate(s):${NC}" echo -e "${GREEN}Found ${#CANDIDATES[@]} candidate(s):${NC}"
echo "" echo ""
for i in "${!CANDIDATES[@]}"; do for i in "${!CANDIDATES[@]}"; do
echo -e " ${BOLD}[$((i+1))]${NC} ${CANDIDATES[$i]} - ${CANDIDATE_INFO[$i]}" echo -e " ${BOLD}[$((i+1))]${NC} ${CANDIDATES[$i]} - ${CANDIDATE_INFO[$i]}"
done done
echo "" echo ""
if [ ${#CANDIDATES[@]} -eq 1 ]; then if [ ${#CANDIDATES[@]} -eq 1 ]; then
SELECTED="${CANDIDATES[0]}" SELECTED="${CANDIDATES[0]}"
echo -e "Auto-selected: ${YELLOW}$SELECTED${NC}" echo -e "Auto-selected: ${YELLOW}$SELECTED${NC}"
else else
read -p "Select device [1-${#CANDIDATES[@]}]: " -r read -p "Select device [1-${#CANDIDATES[@]}]: " -r
if [[ ! $REPLY =~ ^[0-9]+$ ]] || [ "$REPLY" -lt 1 ] || [ "$REPLY" -gt ${#CANDIDATES[@]} ]; then if [[ ! $REPLY =~ ^[0-9]+$ ]] || [ "$REPLY" -lt 1 ] || [ "$REPLY" -gt ${#CANDIDATES[@]} ]; then
echo -e "${RED}Invalid selection.${NC}" echo -e "${RED}Invalid selection.${NC}"
exit 1 exit 1
fi fi
SELECTED="${CANDIDATES[$((REPLY-1))]}" SELECTED="${CANDIDATES[$((REPLY-1))]}"
fi
fi fi
# Show current partitions # Show current partitions

View File

@@ -76,19 +76,12 @@ while IFS= read -r line; do
continue continue
fi fi
# Parse size to bytes for comparison # Get size in bytes for reliable comparison
SIZE_NUM=$(echo "$SIZE" | sed 's/[^0-9.]//g') SIZE_BYTES=$(lsblk -b -d -o SIZE -n "/dev/$DEV" 2>/dev/null | tr -d ' ')
SIZE_UNIT=$(echo "$SIZE" | sed 's/[0-9.]//g') SIZE_GB_INT=$((SIZE_BYTES / 1073741824)) # 1024^3
case $SIZE_UNIT in
G) SIZE_GB=$SIZE_NUM ;;
T) SIZE_GB=$(echo "$SIZE_NUM * 1024" | bc) ;;
M) SIZE_GB=$(echo "scale=2; $SIZE_NUM / 1024" | bc) ;;
*) SIZE_GB=0 ;;
esac
# Check if size is in SD card range (8GB - 128GB) # Check if size is in SD card range (8GB - 128GB)
if (( $(echo "$SIZE_GB >= 8" | bc -l) )) && (( $(echo "$SIZE_GB <= 128" | bc -l) )); then if [ "$SIZE_GB_INT" -ge 8 ] && [ "$SIZE_GB_INT" -le 128 ]; then
CANDIDATES+=("/dev/$DEV") CANDIDATES+=("/dev/$DEV")
CANDIDATE_INFO+=("$SIZE $TYPE ${TRAN:-???} $MODEL") CANDIDATE_INFO+=("$SIZE $TYPE ${TRAN:-???} $MODEL")
fi fi

View File

@@ -90,7 +90,22 @@ echo " Stegasoo instance data cleared"
echo -e "${GREEN}[5/9]${NC} Setting up first-boot wizard..." echo -e "${GREEN}[5/9]${NC} Setting up first-boot wizard..."
# Find stegasoo install directory # Find stegasoo install directory
STEGASOO_DIR=$(ls -d /home/*/stegasoo 2>/dev/null | head -1) STEGASOO_DIR=$(ls -d /home/*/stegasoo 2>/dev/null | head -1)
echo " Looking for stegasoo in: $STEGASOO_DIR"
if [ -z "$STEGASOO_DIR" ]; then
echo -e " ${RED}ERROR: Could not find stegasoo directory in /home/*/stegasoo${NC}"
echo " Checking common locations..."
for dir in /home/*/stegasoo /root/stegasoo /opt/stegasoo; do
if [ -d "$dir" ]; then
STEGASOO_DIR="$dir"
echo " Found at: $STEGASOO_DIR"
break
fi
done
fi
STEGASOO_USER=$(stat -c '%U' "$STEGASOO_DIR" 2>/dev/null || echo "pi") STEGASOO_USER=$(stat -c '%U' "$STEGASOO_DIR" 2>/dev/null || echo "pi")
echo " Stegasoo user: $STEGASOO_USER"
if [ -n "$STEGASOO_DIR" ] && [ -f "$STEGASOO_DIR/rpi/stegasoo-wizard.sh" ]; then if [ -n "$STEGASOO_DIR" ] && [ -f "$STEGASOO_DIR/rpi/stegasoo-wizard.sh" ]; then
# Install the profile.d hook # Install the profile.d hook
@@ -126,8 +141,21 @@ WantedBy=multi-user.target
EOF EOF
systemctl daemon-reload systemctl daemon-reload
echo " Reset service to defaults" echo " Reset service to defaults"
# Verify files were created
if [ -f /etc/stegasoo-first-boot ] && [ -f /etc/profile.d/stegasoo-wizard.sh ]; then
echo -e " ${GREEN}✓ Wizard setup verified${NC}"
else
echo -e " ${RED}✗ Wizard files missing after setup!${NC}"
fi
else else
echo " ${YELLOW}Warning: Stegasoo not found, skipping wizard setup${NC}" echo -e " ${RED}ERROR: Could not set up wizard${NC}"
echo " STEGASOO_DIR: $STEGASOO_DIR"
echo " Wizard script exists: $([ -f "$STEGASOO_DIR/rpi/stegasoo-wizard.sh" ] && echo 'yes' || echo 'NO')"
echo ""
echo " You may need to manually run:"
echo " sudo touch /etc/stegasoo-first-boot"
echo " sudo cp $STEGASOO_DIR/rpi/stegasoo-wizard.sh /etc/profile.d/"
fi fi
echo -e "${GREEN}[6/9]${NC} Clearing logs..." echo -e "${GREEN}[6/9]${NC} Clearing logs..."