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.
159 lines
7.0 KiB
Bash
Executable File
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."
|