#!/usr/bin/env bash set -euo pipefail # Must be run as root if [[ $EUID -ne 0 ]]; then echo "This script must be run as root. Try sudo $0 ..." >&2 exit 1 fi # Default env file ENV_FILE="./.env" # PiCorePlayer version to use PCP_VERSION="10.0.0" BASE_URL="https://repo.pcplayer.org/insitu/piCorePlayer${PCP_VERSION}" IMG_ZIP="piCorePlayer${PCP_VERSION}.img.xz" DOWNLOAD_URL="${BASE_URL}/${IMG_ZIP}" # Print usage usage() { cat < \ [--env-file /path/to/.env] --sdcard Device node of the SD card (e.g. /dev/sdb) --env-file File containing WIFI_SSID and WIFI_PSK (defaults to ./.env) EOF exit 1 } # Parse args SDCARD="" while [[ $# -gt 0 ]]; do case "$1" in --sdcard) SDCARD="$2"; shift 2;; --env-file) ENV_FILE="$2"; shift 2;; -h|--help) usage;; *) echo "Unknown option: $1" >&2; usage;; esac done # Validate if [[ -z "$SDCARD" ]]; then usage fi if [[ ! -b "$SDCARD" ]]; then echo "Error: $SDCARD is not a block device." >&2 exit 1 fi if [[ ! -f "$ENV_FILE" ]]; then echo "Error: env file '$ENV_FILE' not found." >&2 exit 1 fi # Load Wi-Fi credentials source "$ENV_FILE" if [[ -z "${WIFI_SSID:-}" || -z "${WIFI_PSK:-}" ]]; then echo "Error: WIFI_SSID and WIFI_PSK must be set in $ENV_FILE" >&2 exit 1 fi # Download if needed if [[ ! -f "$IMG_ZIP" ]]; then echo "Downloading $IMG_ZIP ..." wget -q --show-progress "$DOWNLOAD_URL" fi # Flash image echo "Flashing $IMG_ZIP to $SDCARD (will overwrite everything!)" sync xzcat "$IMG_ZIP" | dd of="$SDCARD" bs=4M status=progress sync # Determine partition suffixes (/dev/sdX1 vs /dev/mmcblk0p1) if [[ "$SDCARD" =~ [0-9]$ ]]; then PART1="${SDCARD}p1"; PART2="${SDCARD}p2" else PART1="${SDCARD}1"; PART2="${SDCARD}2" fi # Mount partitions BOOT_MNT=$(mktemp -d) ROOT_MNT=$(mktemp -d) mount "$PART1" "$BOOT_MNT" mount "$PART2" "$ROOT_MNT" # Create hidden Wi-Fi config on boot partition cat > "$BOOT_MNT/wpa_supplicant.conf" <