Files
Varaverk/Plugin/plugin_setup.sh
T
Gmer4Lfe c377ddfcca Complete the header template across Partnership, Kernel, Deployment and Plugin
Finishes the pass: every script now documents its safeguards, and the deliberate absences
in the sourced libraries are recorded so they are not "corrected" later.
2026-08-01 22:44:23 -04:00

159 lines
7.0 KiB
Bash
Executable File

#!/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/<os>/ source directory, and creates a symlink at the web server's
# plugin location. All subsequent file changes under Plugin/<os>/ take effect
# immediately without re-running this script.
#
# ==============================================================================================
# OPERATIONAL MODEL
# ==============================================================================================
#
# 1. Detect the OS from /etc/*-version markers
# 2. Resolve Plugin/<os>/ 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/<os>/ 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/<os>/ 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/<os>/ 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 <os>
# 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 <os> (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."