#!/bin/bash # ============================================================================================== # ============================= plugin_setup.sh ================================================= # ============================================================================================== # # PURPOSE # ───────────────────────────────────────────────────────────────────────────── # Symlinks the OS-appropriate plugin directory into the web server on first # install or after the repo is moved. Run once by hand — never by a scheduler. # # Detects the running OS from /etc/*-version markers, picks the matching # Plugin// source directory, and creates a symlink at the web server's # plugin location. All subsequent file changes under Plugin// take effect # immediately without re-running this script. # # ============================================================================================== # OPERATIONAL MODEL # ============================================================================================== # # 1. Detect the OS from /etc/*-version markers # 2. Resolve Plugin// as the source — missing means abort before any change # 3. Inspect the web server's plugin location: # symlink already → remove it, it will be recreated # real directory → refuse, this is an existing install to clean up by hand # absent → proceed # 4. Create the symlink # # After this, every edit under Plugin// is live immediately — that is the whole point, # and why this is the development path rather than build.sh's packaged one. # # ============================================================================================== # DESIGN PRINCIPLES # ============================================================================================== # # Symlink, Not Copy # The web server points at the repo rather than holding its own copy, so there is exactly # one source of truth for the plugin's PHP. A copy would drift the moment anyone edited # either side, and the drift would only surface as a UI behaving unlike the code. # # Run Once, By Hand # Never scheduled. It performs a one-time structural change to where the web server looks; # putting that on a timer would mean an unattended job could recreate a symlink over a # deliberate manual install. # # Refuse, Do Not Replace # A real directory at the target is left alone and the script exits. That directory is a # genuine installation, and silently deleting it to make room for a symlink would discard # an install this script did not create. # # OS Detected, Not Assumed # The source directory comes from the detected OS, so the same script works unchanged on a # second platform once Plugin// exists — matching the adapter's approach. # # ============================================================================================== # OPERATIONAL SAFEGUARDS # ============================================================================================== # # No Root — Deliberate # Run by hand during install, when the operator already has whatever privilege the web # server's plugin path requires. The guards below are structural rather than privilege # based: the dangerous outcome here is clobbering an existing install, not lacking rights. # # Idempotent Symlink # Removes any existing symlink at the target before recreating it. Safe to # re-run after a repo move without leaving stale paths. # # Real Directory Guard # If the target exists as a real directory (not a symlink), the script refuses # to proceed. Manual cleanup is required to avoid silently discarding an # existing installation. # # Missing Source Guard # Exits early if Plugin// does not exist — catches a missing OS directory # before any filesystem changes are made. # # ============================================================================================== # CONFIGURATION # ============================================================================================== # # No config vars. All paths are derived from $BASH_SOURCE and the detected OS. # # PLUGIN_NAME varaverk (hardcoded — must match the plugin's registered name) # # OS detection markers: # /etc/unraid-version → unraid → /usr/local/emhttp/plugins/varaverk # /etc/debian_version → debian → (target path not yet defined) # /etc/arch-release → arch → (target path not yet defined) # # ============================================================================================== # RUNTIME MODES # ============================================================================================== # # ./plugin_setup.sh # Auto-detects the running OS and installs. # # ./plugin_setup.sh # Overrides OS detection. Valid values: unraid, debian, arch. # Useful when testing on a machine where the marker files differ. # # ============================================================================================== set -euo pipefail PLUGIN_NAME="varaverk" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # ── Detect OS ──────────────────────────────────────────────────────────────── detect_os() { if [[ -f /etc/unraid-version ]]; then echo "unraid" elif [[ -f /etc/debian_version ]]; then echo "debian" elif [[ -f /etc/arch-release ]]; then echo "arch" else echo "unknown"; fi } OS="${1:-$(detect_os)}" # accept override: ./plugin_setup.sh unraid # ── OS-specific install target ──────────────────────────────────────────────── case "$OS" in unraid) SOURCE="$SCRIPT_DIR/unraid" TARGET="/usr/local/emhttp/plugins/$PLUGIN_NAME" ;; debian|arch) echo "OS '$OS' detected but plugin target path not yet defined." echo "Add the TARGET= line for this OS in plugin_setup.sh." exit 1 ;; unknown|*) echo "Unsupported OS — could not detect from /etc/*-version markers." echo "Usage: $0 (e.g. $0 unraid)" exit 1 ;; esac # ── Install ─────────────────────────────────────────────────────────────────── if [[ ! -d "$SOURCE" ]]; then echo "ERROR: Plugin source not found: $SOURCE" exit 1 fi if [[ -L "$TARGET" ]]; then echo "Removing existing symlink: $TARGET" rm "$TARGET" elif [[ -d "$TARGET" ]]; then echo "ERROR: $TARGET exists as a real directory — remove it manually first." exit 1 fi ln -s "$SOURCE" "$TARGET" echo "" echo "OS: $OS" echo "Source: $SOURCE" echo "Target: $TARGET" echo "" echo "Plugin linked. Changes in Plugin/$OS/ take effect immediately."