#!/bin/bash # install.sh — generate and install sky-cam systemd units from sky-cam.conf. # # Usage: # ./install.sh # installs to ~/.config/systemd/user (no root needed) # ./install.sh --system # installs to /etc/systemd/system (needs sudo) # # Run this once after editing sky-cam.conf, and again whenever sky-cam.conf # changes (e.g. SCRIPT_DIR moves, cameras added, schedules changed). # No other file needs editing. set -euo pipefail HERE="$(dirname "$(realpath "$0")")" source "$HERE/sky-cam.conf" # ── Install target ──────────────────────────────────────────────────────────── SYSTEM_MODE=false [ "${1:-}" = "--system" ] && SYSTEM_MODE=true if $SYSTEM_MODE; then UNIT_DIR="/etc/systemd/system" SC="sudo systemctl" else UNIT_DIR="$HOME/.config/systemd/user" SC="systemctl --user" fi mkdir -p "$UNIT_DIR" echo "Installing systemd units to $UNIT_DIR ..." # ── Helper: write a oneshot service unit ───────────────────────────────────── write_service() { local unit="$1" description="$2" script="$3" extra="${4:-}" cat > "$UNIT_DIR/${unit}.service" < "$UNIT_DIR/${unit}.timer" < "$UNIT_DIR/sky-cam-notify-failure@.service" < "$UNIT_DIR/sky-cam-sunrise.service" < "$UNIT_DIR/sky-cam-sunrise-upload.service" <, SCHEDULE_FULLDAY_ from sky-cam.conf. # Scripts receive the camera name as $1 so they know which camera to process. for cam in "${CAMERAS[@]}"; do sched_seasons_var="SCHEDULE_SEASONS_${cam}" sched_fullday_var="SCHEDULE_FULLDAY_${cam}" if [ -n "${!sched_seasons_var:-}" ]; then write_service "sky-cam-seasons-${cam}" \ "${cam}: Four Seasons daily clip" \ "4-seasons.sh ${cam}" \ "After=network-online.target\nWants=network-online.target\n" write_timer "sky-cam-seasons-${cam}" "${cam}: Four Seasons daily clip" \ "${!sched_seasons_var}" timers+=("sky-cam-seasons-${cam}") else echo " WARNING: SCHEDULE_SEASONS_${cam} not set — skipping seasons timer for ${cam}" fi if [ -n "${!sched_fullday_var:-}" ]; then write_service "sky-cam-fullday-${cam}" \ "${cam}: full-day timelapse" \ "fullday-video.sh ${cam}" write_timer "sky-cam-fullday-${cam}" "${cam}: full-day timelapse" \ "${!sched_fullday_var}" timers+=("sky-cam-fullday-${cam}") else echo " WARNING: SCHEDULE_FULLDAY_${cam} not set — skipping fullday timer for ${cam}" fi done # ── Reload and enable ───────────────────────────────────────────────────────── echo "" $SC daemon-reload for timer in "${timers[@]}"; do $SC enable --now "${timer}.timer" \ && echo " enabled + started ${timer}.timer" \ || echo " WARNING: could not enable ${timer}.timer" done echo "" echo "Done. Check status with:" if $SYSTEM_MODE; then echo " sudo systemctl list-timers 'sky-cam-*'" echo " sudo journalctl -u sky-cam-seasons-${CAMERAS[0]}.service -f" else echo " systemctl --user list-timers 'sky-cam-*'" echo " journalctl --user -u sky-cam-seasons-${CAMERAS[0]}.service -f" fi