fix: picoreplayer script

This commit is contained in:
2025-05-24 10:12:51 +02:00
parent 2a5496118b
commit 9feace9558

View File

@@ -1,6 +1,12 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail 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 # Default env file
ENV_FILE="./.env" ENV_FILE="./.env"
@@ -14,12 +20,10 @@ DOWNLOAD_URL="${BASE_URL}/${IMG_ZIP}"
usage() { usage() {
cat <<EOF cat <<EOF
Usage: sudo $0 --device <rpi-4|rpi-zero|rpi-zero-2> \ Usage: sudo $0 --device <rpi-4|rpi-zero|rpi-zero-2> \
--name <hostname> \
--sdcard </dev/sdX> \ --sdcard </dev/sdX> \
[--env-file /path/to/.env] [--env-file /path/to/.env]
--device Target board (rpi-4, rpi-zero, rpi-zero-2) --device Target board (rpi-4, rpi-zero, rpi-zero-2)
--name Hostname for the Pi
--sdcard Device node of the SD card (e.g. /dev/sdb) --sdcard Device node of the SD card (e.g. /dev/sdb)
--env-file File containing WIFI_SSID and WIFI_PSK (defaults to ./.env) --env-file File containing WIFI_SSID and WIFI_PSK (defaults to ./.env)
EOF EOF
@@ -27,20 +31,19 @@ EOF
} }
# Parse args # Parse args
DEVICE="" NAME="" SDCARD="" DEVICE="" SDCARD=""
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case "$1" in case "$1" in
--device) DEVICE="$2"; shift 2;; --device) DEVICE="$2"; shift 2;;
--name) NAME="$2"; shift 2;;
--sdcard) SDCARD="$2"; shift 2;; --sdcard) SDCARD="$2"; shift 2;;
--env-file) ENV_FILE="$2"; shift 2;; --env-file) ENV_FILE="$2"; shift 2;;
-h|--help) usage;; -h|--help) usage;;
*) echo "Unknown option: $1"; usage;; *) echo "Unknown option: $1" >&2; usage;;
esac esac
done done
# Validate # Validate
if [[ -z "$DEVICE" || -z "$NAME" || -z "$SDCARD" ]]; then if [[ -z "$DEVICE" || -z "$SDCARD" ]]; then
usage usage
fi fi
if [[ ! -b "$SDCARD" ]]; then if [[ ! -b "$SDCARD" ]]; then
@@ -53,7 +56,6 @@ if [[ ! -f "$ENV_FILE" ]]; then
fi fi
# Load Wi-Fi credentials # Load Wi-Fi credentials
# Expect lines: WIFI_SSID=... and WIFI_PSK=...
source "$ENV_FILE" source "$ENV_FILE"
if [[ -z "${WIFI_SSID:-}" || -z "${WIFI_PSK:-}" ]]; then if [[ -z "${WIFI_SSID:-}" || -z "${WIFI_PSK:-}" ]]; then
echo "Error: WIFI_SSID and WIFI_PSK must be set in $ENV_FILE" >&2 echo "Error: WIFI_SSID and WIFI_PSK must be set in $ENV_FILE" >&2
@@ -67,18 +69,16 @@ if [[ ! -f "$IMG_ZIP" ]]; then
fi fi
# Flash image # Flash image
echo "Flashing $IMG_ZIP to $SDCARD (this will overwrite everything!)" echo "Flashing $IMG_ZIP to $SDCARD (will overwrite everything!)"
sync sync
xzcat $IMG_ZIP | dd of="$SDCARD" bs=4M status=progress conv=fsync xzcat "$IMG_ZIP" | dd of="$SDCARD" bs=4M status=progress conv=fsync
sync sync
# Determine partition suffixes (/dev/sdX1 vs /dev/mmcblk0p1) # Determine partition suffixes (/dev/sdX1 vs /dev/mmcblk0p1)
if [[ "$SDCARD" =~ [0-9]$ ]]; then if [[ "$SDCARD" =~ [0-9]$ ]]; then
PART1="${SDCARD}p1" PART1="${SDCARD}p1"; PART2="${SDCARD}p2"
PART2="${SDCARD}p2"
else else
PART1="${SDCARD}1" PART1="${SDCARD}1"; PART2="${SDCARD}2"
PART2="${SDCARD}2"
fi fi
# Mount partitions # Mount partitions
@@ -87,7 +87,7 @@ ROOT_MNT=$(mktemp -d)
mount "$PART1" "$BOOT_MNT" mount "$PART1" "$BOOT_MNT"
mount "$PART2" "$ROOT_MNT" mount "$PART2" "$ROOT_MNT"
# Create hidden Wi-Fi config on boot partition (picoreplayer picks this up) # Create hidden Wi-Fi config on boot partition
cat > "$BOOT_MNT/wpa_supplicant.conf" <<EOF cat > "$BOOT_MNT/wpa_supplicant.conf" <<EOF
ctrl_interface=/var/run/wpa_supplicant ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=staff ctrl_interface_group=staff
@@ -103,13 +103,22 @@ network={
} }
EOF EOF
# Set hostname # If a Zero device, enable Hifiberry DAC+ and disable onboard audio
echo "$NAME" > "$ROOT_MNT/etc/hostname" if [[ "$DEVICE" == "rpi-zero" || "$DEVICE" == "rpi-zero-2" ]]; then
# Update /etc/hosts cat >> "$BOOT_MNT/config.txt" <<EOF
sed -i "s/127\.0\.1\.1.*/127.0.1.1\t$NAME/" "$ROOT_MNT/etc/hosts"
# Hifiberry DAC+ overlay for Zero models
dtoverlay=hifiberry-dacplus-std
# turn off onboard audio
dtparam=audio=off
EOF
fi
# Cleanup # Cleanup
umount "$BOOT_MNT" "$ROOT_MNT" umount "$BOOT_MNT" "$ROOT_MNT"
rmdir "$BOOT_MNT" "$ROOT_MNT" rmdir "$BOOT_MNT" "$ROOT_MNT"
echo "Done! SD card is ready with PiCorePlayer on $DEVICE, hostname '$NAME', hidden Wi-Fi '$WIFI_SSID'." echo "Done! SD card is ready with PiCorePlayer ${PCP_VERSION} on $DEVICE,"
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"