111 lines
2.5 KiB
Bash
Executable File
111 lines
2.5 KiB
Bash
Executable File
#!/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 <<EOF
|
|
Usage: sudo $0 --sdcard </dev/sdX> \
|
|
[--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" <<EOF
|
|
ctrl_interface=/var/run/wpa_supplicant
|
|
ctrl_interface_group=staff
|
|
country=AT
|
|
update_config=1
|
|
|
|
network={
|
|
ssid="$WIFI_SSID"
|
|
psk="$WIFI_PSK"
|
|
scan_ssid=1
|
|
key_mgmt=WPA-PSK
|
|
auth_alg=OPEN
|
|
}
|
|
EOF
|
|
|
|
# Cleanup
|
|
umount "$BOOT_MNT" "$ROOT_MNT"
|
|
rmdir "$BOOT_MNT" "$ROOT_MNT"
|
|
|
|
echo "Done! SD card is ready with PiCorePlayer ${PCP_VERSION},"
|
|
echo "hidden Wi-Fi '$WIFI_SSID'."
|
|
echo "Insert the SD card into the Pi and power it on."
|
|
echo "You can now connect to the PiCorePlayer web interface at http://pcp.local"
|