Files
pi-pm3/scripts/audit-build-scripts.sh
michael a9acdb85ce Build optimization: pre-built PM3 binaries, ARM64 CI, base image caching
Replace PM3 compile-from-source in pi-gen with pre-built tarball extraction
(saves 43-58 min). Merge stagePM3 into stageDangerousPi as 02-pm3-install
substage, renumber all subsequent substages. Switch CI PM3 build to native
ARM64 runner (ubuntu-24.04-arm64) eliminating QEMU overhead. Add weekly
base-image workflow for pre-baking stages 0-2. Support PM3_TARBALL,
BASE_IMAGE, and APT_PROXY env vars in build-image.sh.

Also includes prior Phase 5 work: theme system, design system integration,
component update system, OS updates, CI build pipeline, and test results.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 12:01:01 -08:00

199 lines
5.7 KiB
Bash
Executable File

#!/bin/bash
# Audit build scripts for common issues
# Usage: ./scripts/audit-build-scripts.sh
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
echo "=== Auditing Build Scripts ==="
echo ""
# Colors
RED='\033[0;31m'
YELLOW='\033[1;33m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
WARNINGS=0
ERRORS=0
# Function to report issues
warn() {
echo -e "${YELLOW}WARNING:${NC} $1"
((WARNINGS++))
}
error() {
echo -e "${RED}ERROR:${NC} $1"
((ERRORS++))
}
ok() {
echo -e "${GREEN}${NC} $1"
}
echo "1. Checking for commands used before installation..."
echo "------------------------------------------------"
# Check PM3 stage
PM3_SCRIPT="$PROJECT_DIR/pi-gen/stageDangerousPi/02-pm3-install/00-run-chroot.sh"
if [ -f "$PM3_SCRIPT" ]; then
# Check if cmake is used before apt-get install
if grep -q "cmake" "$PM3_SCRIPT"; then
if ! grep -B50 "cmake" "$PM3_SCRIPT" | grep -q "apt-get install.*cmake"; then
warn "PM3: cmake used but may not be installed"
else
ok "PM3: cmake installation verified"
fi
fi
# Check for git before installation
if grep -q "git clone" "$PM3_SCRIPT"; then
if ! grep -B50 "git clone" "$PM3_SCRIPT" | grep -q "apt-get install.*git"; then
warn "PM3: git used but may not be installed"
else
ok "PM3: git installation verified"
fi
fi
fi
# Check DangerousPi stage
DTPI_SCRIPT="$PROJECT_DIR/pi-gen/stageDangerousPi/04-dangerous-pi/00-run-chroot.sh"
if [ -f "$DTPI_SCRIPT" ]; then
# Check for pip3
if grep -q "pip3 install" "$DTPI_SCRIPT"; then
if ! grep -B50 "pip3 install" "$DTPI_SCRIPT" | grep -q "apt-get install.*python3-pip\|command -v pip3"; then
error "DangerousPi: pip3 used but not installed"
else
ok "DangerousPi: pip3 installation check present"
fi
fi
fi
echo ""
echo "2. Checking for missing directory creation..."
echo "-------------------------------------------"
# Check WiFi AP script
WIFI_SCRIPT="$PROJECT_DIR/pi-gen/stageDangerousPi/01-Wireless-AP/00-run-chroot.sh"
if [ -f "$WIFI_SCRIPT" ]; then
# Check for directory writes
DIRS_WRITTEN=$(grep -n "cat >" "$WIFI_SCRIPT" | grep -oE '/etc/[^/]+(/[^/]+)*/' | sort -u)
for dir in $DIRS_WRITTEN; do
dir_parent=$(dirname "$dir")
if ! grep -q "mkdir -p $dir_parent\|mkdir -p $dir" "$WIFI_SCRIPT"; then
warn "WiFi: Writing to $dir without mkdir -p"
else
ok "WiFi: $dir directory creation verified"
fi
done
fi
echo ""
echo "3. Checking for undefined variables..."
echo "------------------------------------"
for script in "$PROJECT_DIR"/pi-gen/stage*/*/00-run*.sh; do
if [ -f "$script" ]; then
stage=$(basename $(dirname $(dirname "$script")))
substage=$(basename $(dirname "$script"))
# Check for common undefined vars
if grep -q '\$ROOTFS_DIR' "$script" && [ "$(basename "$script")" != "00-run.sh" ]; then
warn "$stage/$substage: Uses \$ROOTFS_DIR in chroot script (should be in 00-run.sh)"
fi
fi
done
echo ""
echo "4. Checking for missing error handling..."
echo "---------------------------------------"
for script in "$PROJECT_DIR"/pi-gen/stage*/*/00-run*.sh; do
if [ -f "$script" ]; then
stage=$(basename $(dirname $(dirname "$script")))
substage=$(basename $(dirname "$script"))
# Check if script has #!/bin/bash -e
if ! head -1 "$script" | grep -q "bash -e"; then
warn "$stage/$substage: Missing 'set -e' or '#!/bin/bash -e'"
else
ok "$stage/$substage: Error handling enabled"
fi
fi
done
echo ""
echo "5. Checking for sudo usage (not allowed in chroot)..."
echo "---------------------------------------------------"
for script in "$PROJECT_DIR"/pi-gen/stage*/*/00-run*.sh; do
if [ -f "$script" ]; then
stage=$(basename $(dirname $(dirname "$script")))
substage=$(basename $(dirname "$script"))
if grep -q "sudo " "$script"; then
error "$stage/$substage: Contains 'sudo' commands (not allowed in chroot)"
fi
fi
done
ok "No sudo commands found in stage scripts"
echo ""
echo "6. Checking configuration consistency..."
echo "--------------------------------------"
CONFIG="$PROJECT_DIR/pi-gen/config"
if [ -f "$CONFIG" ]; then
USERNAME=$(grep "FIRST_USER_NAME=" "$CONFIG" | cut -d'"' -f2)
echo "Configured username: $USERNAME"
if [ "$USERNAME" != "pi" ]; then
warn "Username is '$USERNAME' (not standard 'pi')"
echo " This is OK if intentional, but verify all scripts handle it correctly"
else
ok "Using standard 'pi' username"
fi
# Check if QCOW2 is enabled
if grep -q "USE_QCOW2=1" "$CONFIG"; then
ok "QCOW2 caching enabled for fast rebuilds"
else
warn "QCOW2 caching disabled - rebuilds will be slow"
fi
fi
echo ""
echo "7. Checking for required EXPORT_IMAGE markers..."
echo "----------------------------------------------"
for stage in "$PROJECT_DIR"/pi-gen/stageDangerousPi; do
if [ -d "$stage" ]; then
stage_name=$(basename "$stage")
if [ -f "$stage/EXPORT_IMAGE" ]; then
ok "$stage_name: EXPORT_IMAGE present"
else
error "$stage_name: Missing EXPORT_IMAGE marker"
fi
fi
done
echo ""
echo "=== Audit Summary ==="
echo "Warnings: $WARNINGS"
echo "Errors: $ERRORS"
echo ""
if [ $ERRORS -gt 0 ]; then
echo -e "${RED}BUILD SCRIPTS HAVE ERRORS - REVIEW REQUIRED${NC}"
exit 1
elif [ $WARNINGS -gt 0 ]; then
echo -e "${YELLOW}BUILD SCRIPTS HAVE WARNINGS - REVIEW RECOMMENDED${NC}"
exit 0
else
echo -e "${GREEN}ALL CHECKS PASSED${NC}"
exit 0
fi