You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
377 lines
11 KiB
377 lines
11 KiB
#!/bin/bash
|
|
#
|
|
# OpenHamClock - Raspberry Pi Setup Script
|
|
#
|
|
# This script configures a Raspberry Pi for kiosk mode operation
|
|
# Supports: Pi 3B, 3B+, 4, 5 (32-bit and 64-bit Raspberry Pi OS)
|
|
#
|
|
# Usage:
|
|
# chmod +x setup-pi.sh
|
|
# ./setup-pi.sh
|
|
#
|
|
# Options:
|
|
# --kiosk Enable kiosk mode (auto-start on boot)
|
|
# --server Install as a server (no GUI)
|
|
# --help Show help
|
|
#
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
INSTALL_DIR="$HOME/openhamclock"
|
|
SERVICE_NAME="openhamclock"
|
|
NODE_VERSION="20"
|
|
|
|
# Print banner
|
|
echo -e "${BLUE}"
|
|
echo "╔═══════════════════════════════════════════════════════════╗"
|
|
echo "║ ║"
|
|
echo "║ ██████╗ ██████╗ ███████╗███╗ ██╗ ║"
|
|
echo "║ ██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ║"
|
|
echo "║ ██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ║"
|
|
echo "║ ██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ║"
|
|
echo "║ ╚██████╔╝██║ ███████╗██║ ╚████║ ║"
|
|
echo "║ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ HAM CLOCK ║"
|
|
echo "║ ║"
|
|
echo "║ Raspberry Pi Setup Script ║"
|
|
echo "║ ║"
|
|
echo "╚═══════════════════════════════════════════════════════════╝"
|
|
echo -e "${NC}"
|
|
|
|
# Parse arguments
|
|
KIOSK_MODE=false
|
|
SERVER_MODE=false
|
|
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case $1 in
|
|
--kiosk) KIOSK_MODE=true ;;
|
|
--server) SERVER_MODE=true ;;
|
|
--help)
|
|
echo "Usage: ./setup-pi.sh [OPTIONS]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --kiosk Enable kiosk mode (fullscreen, auto-start)"
|
|
echo " --server Install as headless server only"
|
|
echo " --help Show this help message"
|
|
exit 0
|
|
;;
|
|
*) echo "Unknown option: $1"; exit 1 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# Check if running on Raspberry Pi
|
|
check_raspberry_pi() {
|
|
if [ -f /proc/device-tree/model ]; then
|
|
MODEL=$(cat /proc/device-tree/model)
|
|
echo -e "${GREEN}✓ Detected: $MODEL${NC}"
|
|
else
|
|
echo -e "${YELLOW}⚠ Warning: This doesn't appear to be a Raspberry Pi${NC}"
|
|
read -p "Continue anyway? (y/N) " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Update system
|
|
update_system() {
|
|
echo -e "${BLUE}>>> Updating system packages...${NC}"
|
|
sudo apt-get update -qq
|
|
sudo apt-get upgrade -y -qq
|
|
}
|
|
|
|
# Install Node.js
|
|
install_nodejs() {
|
|
echo -e "${BLUE}>>> Installing Node.js ${NODE_VERSION}...${NC}"
|
|
|
|
# Check if Node.js is already installed
|
|
if command -v node &> /dev/null; then
|
|
CURRENT_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
|
|
if [ "$CURRENT_VERSION" -ge "$NODE_VERSION" ]; then
|
|
echo -e "${GREEN}✓ Node.js $(node -v) already installed${NC}"
|
|
return
|
|
fi
|
|
fi
|
|
|
|
# Install Node.js via NodeSource
|
|
curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION}.x | sudo -E bash -
|
|
sudo apt-get install -y nodejs
|
|
|
|
echo -e "${GREEN}✓ Node.js $(node -v) installed${NC}"
|
|
}
|
|
|
|
# Install dependencies
|
|
install_dependencies() {
|
|
echo -e "${BLUE}>>> Installing system dependencies...${NC}"
|
|
|
|
PACKAGES="git"
|
|
|
|
if [ "$SERVER_MODE" = false ]; then
|
|
# Note: Package is 'chromium' on Raspberry Pi OS Bookworm+, 'chromium-browser' on older versions
|
|
# Try chromium first (newer), fall back to chromium-browser (older)
|
|
PACKAGES="$PACKAGES unclutter xdotool x11-xserver-utils"
|
|
if apt-cache show chromium &>/dev/null; then
|
|
PACKAGES="$PACKAGES chromium"
|
|
else
|
|
PACKAGES="$PACKAGES chromium-browser"
|
|
fi
|
|
fi
|
|
|
|
sudo apt-get install -y -qq $PACKAGES
|
|
echo -e "${GREEN}✓ Dependencies installed${NC}"
|
|
}
|
|
|
|
# Clone or update repository
|
|
setup_repository() {
|
|
echo -e "${BLUE}>>> Setting up OpenHamClock...${NC}"
|
|
|
|
if [ -d "$INSTALL_DIR" ]; then
|
|
echo "Updating existing installation..."
|
|
cd "$INSTALL_DIR"
|
|
git pull
|
|
else
|
|
echo "Cloning repository..."
|
|
git clone https://github.com/k0cjh/openhamclock.git "$INSTALL_DIR"
|
|
cd "$INSTALL_DIR"
|
|
fi
|
|
|
|
# Install npm dependencies
|
|
npm install
|
|
|
|
# Build frontend for production
|
|
npm run build
|
|
|
|
# Make update script executable
|
|
chmod +x scripts/update.sh 2>/dev/null || true
|
|
|
|
echo -e "${GREEN}✓ OpenHamClock installed to $INSTALL_DIR${NC}"
|
|
}
|
|
|
|
# Create systemd service
|
|
create_service() {
|
|
echo -e "${BLUE}>>> Creating systemd service...${NC}"
|
|
|
|
sudo tee /etc/systemd/system/${SERVICE_NAME}.service > /dev/null << EOF
|
|
[Unit]
|
|
Description=OpenHamClock Server
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=$USER
|
|
WorkingDirectory=$INSTALL_DIR
|
|
ExecStart=/usr/bin/node server.js
|
|
Restart=on-failure
|
|
RestartSec=10
|
|
Environment=NODE_ENV=production
|
|
Environment=PORT=3000
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable ${SERVICE_NAME}
|
|
sudo systemctl start ${SERVICE_NAME}
|
|
|
|
echo -e "${GREEN}✓ Service created and started${NC}"
|
|
}
|
|
|
|
# Setup kiosk mode
|
|
setup_kiosk() {
|
|
echo -e "${BLUE}>>> Configuring kiosk mode...${NC}"
|
|
|
|
# Disable screen blanking
|
|
sudo raspi-config nonint do_blanking 1 2>/dev/null || true
|
|
|
|
# Create autostart directory
|
|
mkdir -p "$HOME/.config/autostart"
|
|
|
|
# Create kiosk launcher script
|
|
cat > "$INSTALL_DIR/kiosk.sh" << 'EOF'
|
|
#!/bin/bash
|
|
# OpenHamClock Kiosk Launcher
|
|
|
|
# Wait for desktop
|
|
sleep 5
|
|
|
|
# Disable screen saver and power management
|
|
xset s off
|
|
xset -dpms
|
|
xset s noblank
|
|
|
|
# Hide mouse cursor
|
|
unclutter -idle 1 -root &
|
|
|
|
# Wait for server to be ready
|
|
while ! curl -s http://localhost:3000/api/health > /dev/null; do
|
|
sleep 1
|
|
done
|
|
|
|
# Launch Chromium in kiosk mode
|
|
# Use 'chromium' on newer Pi OS, 'chromium-browser' on older
|
|
if command -v chromium &> /dev/null; then
|
|
CHROME_CMD="chromium"
|
|
else
|
|
CHROME_CMD="chromium-browser"
|
|
fi
|
|
|
|
$CHROME_CMD \
|
|
--kiosk \
|
|
--noerrdialogs \
|
|
--disable-infobars \
|
|
--disable-session-crashed-bubble \
|
|
--disable-restore-session-state \
|
|
--disable-features=TranslateUI \
|
|
--check-for-update-interval=31536000 \
|
|
--disable-component-update \
|
|
--overscroll-history-navigation=0 \
|
|
--disable-pinch \
|
|
--incognito \
|
|
http://localhost:3000
|
|
EOF
|
|
|
|
chmod +x "$INSTALL_DIR/kiosk.sh"
|
|
|
|
# Create autostart entry
|
|
cat > "$HOME/.config/autostart/openhamclock-kiosk.desktop" << EOF
|
|
[Desktop Entry]
|
|
Type=Application
|
|
Name=OpenHamClock Kiosk
|
|
Exec=$INSTALL_DIR/kiosk.sh
|
|
Hidden=false
|
|
X-GNOME-Autostart-enabled=true
|
|
EOF
|
|
|
|
# Configure boot for faster startup
|
|
if [ -f /boot/config.txt ]; then
|
|
# Disable splash screen for faster boot
|
|
if ! grep -q "disable_splash=1" /boot/config.txt; then
|
|
echo "disable_splash=1" | sudo tee -a /boot/config.txt > /dev/null
|
|
fi
|
|
|
|
# Allocate more GPU memory
|
|
if ! grep -q "gpu_mem=" /boot/config.txt; then
|
|
echo "gpu_mem=128" | sudo tee -a /boot/config.txt > /dev/null
|
|
fi
|
|
fi
|
|
|
|
echo -e "${GREEN}✓ Kiosk mode configured${NC}"
|
|
}
|
|
|
|
# Create helper scripts
|
|
create_scripts() {
|
|
echo -e "${BLUE}>>> Creating helper scripts...${NC}"
|
|
|
|
# Start script
|
|
cat > "$INSTALL_DIR/start.sh" << EOF
|
|
#!/bin/bash
|
|
cd "$INSTALL_DIR"
|
|
node server.js
|
|
EOF
|
|
chmod +x "$INSTALL_DIR/start.sh"
|
|
|
|
# Stop script
|
|
cat > "$INSTALL_DIR/stop.sh" << EOF
|
|
#!/bin/bash
|
|
sudo systemctl stop ${SERVICE_NAME}
|
|
pkill -f chromium 2>/dev/null || true
|
|
pkill -f unclutter 2>/dev/null || true
|
|
echo "OpenHamClock stopped"
|
|
EOF
|
|
chmod +x "$INSTALL_DIR/stop.sh"
|
|
|
|
# Restart script
|
|
cat > "$INSTALL_DIR/restart.sh" << EOF
|
|
#!/bin/bash
|
|
sudo systemctl restart ${SERVICE_NAME}
|
|
echo "OpenHamClock restarted"
|
|
EOF
|
|
chmod +x "$INSTALL_DIR/restart.sh"
|
|
|
|
# Status script
|
|
cat > "$INSTALL_DIR/status.sh" << EOF
|
|
#!/bin/bash
|
|
echo "=== OpenHamClock Status ==="
|
|
sudo systemctl status ${SERVICE_NAME} --no-pager
|
|
echo ""
|
|
echo "=== Server Health ==="
|
|
curl -s http://localhost:3000/api/health | python3 -m json.tool 2>/dev/null || echo "Server not responding"
|
|
EOF
|
|
chmod +x "$INSTALL_DIR/status.sh"
|
|
|
|
echo -e "${GREEN}✓ Helper scripts created${NC}"
|
|
}
|
|
|
|
# Print summary
|
|
print_summary() {
|
|
echo ""
|
|
echo -e "${GREEN}╔═══════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${GREEN}║ Installation Complete! ║${NC}"
|
|
echo -e "${GREEN}╚═══════════════════════════════════════════════════════════╝${NC}"
|
|
echo ""
|
|
echo -e " ${BLUE}Installation Directory:${NC} $INSTALL_DIR"
|
|
echo -e " ${BLUE}Web Interface:${NC} http://localhost:3000"
|
|
echo ""
|
|
echo -e " ${YELLOW}Helper Commands:${NC}"
|
|
echo " $INSTALL_DIR/scripts/update.sh - Update to latest version"
|
|
echo " $INSTALL_DIR/start.sh - Start server manually"
|
|
echo " $INSTALL_DIR/stop.sh - Stop everything"
|
|
echo " $INSTALL_DIR/restart.sh - Restart server"
|
|
echo " $INSTALL_DIR/status.sh - Check status"
|
|
echo ""
|
|
echo -e " ${YELLOW}Service Commands:${NC}"
|
|
echo " sudo systemctl start ${SERVICE_NAME}"
|
|
echo " sudo systemctl stop ${SERVICE_NAME}"
|
|
echo " sudo systemctl status ${SERVICE_NAME}"
|
|
echo " sudo journalctl -u ${SERVICE_NAME} -f"
|
|
echo ""
|
|
|
|
if [ "$KIOSK_MODE" = true ]; then
|
|
echo -e " ${GREEN}Kiosk Mode:${NC} Enabled"
|
|
echo " OpenHamClock will auto-start on boot in fullscreen"
|
|
echo " To disable: rm ~/.config/autostart/openhamclock-kiosk.desktop"
|
|
echo ""
|
|
fi
|
|
|
|
echo -e " ${BLUE}73 de OpenHamClock!${NC}"
|
|
echo ""
|
|
|
|
if [ "$KIOSK_MODE" = true ]; then
|
|
read -p "Reboot now to start kiosk mode? (y/N) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
sudo reboot
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Main installation flow
|
|
main() {
|
|
check_raspberry_pi
|
|
update_system
|
|
install_nodejs
|
|
install_dependencies
|
|
setup_repository
|
|
create_service
|
|
create_scripts
|
|
|
|
if [ "$KIOSK_MODE" = true ]; then
|
|
setup_kiosk
|
|
fi
|
|
|
|
print_summary
|
|
}
|
|
|
|
# Run main
|
|
main
|