feat: add picoreplayer script
This commit is contained in:
115
raspberry/picoreplayer.sh
Executable file
115
raspberry/picoreplayer.sh
Executable file
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# 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 --device <rpi-4|rpi-zero|rpi-zero-2> \
|
||||
--name <hostname> \
|
||||
--sdcard </dev/sdX> \
|
||||
[--env-file /path/to/.env]
|
||||
|
||||
--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)
|
||||
--env-file File containing WIFI_SSID and WIFI_PSK (defaults to ./.env)
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Parse args
|
||||
DEVICE="" NAME="" SDCARD=""
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
--device) DEVICE="$2"; shift 2;;
|
||||
--name) NAME="$2"; shift 2;;
|
||||
--sdcard) SDCARD="$2"; shift 2;;
|
||||
--env-file) ENV_FILE="$2"; shift 2;;
|
||||
-h|--help) usage;;
|
||||
*) echo "Unknown option: $1"; usage;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Validate
|
||||
if [[ -z "$DEVICE" || -z "$NAME" || -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
|
||||
# Expect lines: WIFI_SSID=... and WIFI_PSK=...
|
||||
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 (this will overwrite everything!)"
|
||||
sync
|
||||
xzcat $IMG_ZIP | dd of="$SDCARD" bs=4M status=progress conv=fsync
|
||||
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 (picoreplayer picks this up)
|
||||
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
|
||||
|
||||
# Set hostname
|
||||
echo "$NAME" > "$ROOT_MNT/etc/hostname"
|
||||
# Update /etc/hosts
|
||||
sed -i "s/127\.0\.1\.1.*/127.0.1.1\t$NAME/" "$ROOT_MNT/etc/hosts"
|
||||
|
||||
# Clean up
|
||||
umount "$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'."
|
||||
Reference in New Issue
Block a user