141 lines
5.9 KiB
Bash
Executable File
141 lines
5.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# gniza installer — from a local clone:
|
|
# bash scripts/install.sh
|
|
|
|
set -eo pipefail
|
|
|
|
INSTALL_DIR="/usr/local/gniza"
|
|
BIN_LINK="/usr/local/bin/gniza"
|
|
REPO_URL="https://git.linux-hosting.co.il/shukivaknin/gniza.git"
|
|
TMPDIR_CLONE=""
|
|
|
|
if [[ $EUID -ne 0 ]]; then
|
|
echo "Error: install.sh must be run as root" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Determine source directory — local clone or fresh git clone
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-}")" 2>/dev/null && pwd)" || true
|
|
if [[ -n "${SCRIPT_DIR:-}" && -f "$SCRIPT_DIR/../bin/gniza" ]]; then
|
|
SOURCE_DIR="$(dirname "$SCRIPT_DIR")"
|
|
else
|
|
echo "Cloning gniza..."
|
|
TMPDIR_CLONE="$(mktemp -d)"
|
|
git clone --depth 1 "$REPO_URL" "$TMPDIR_CLONE" 2>&1
|
|
SOURCE_DIR="$TMPDIR_CLONE"
|
|
fi
|
|
|
|
cleanup() { [[ -n "${TMPDIR_CLONE:-}" ]] && rm -rf "$TMPDIR_CLONE"; }
|
|
trap cleanup EXIT
|
|
|
|
echo "Installing gniza to $INSTALL_DIR..."
|
|
|
|
# Create install directory
|
|
mkdir -p "$INSTALL_DIR"
|
|
|
|
# Copy files
|
|
cp -r "$SOURCE_DIR/bin" "$INSTALL_DIR/"
|
|
cp -r "$SOURCE_DIR/lib" "$INSTALL_DIR/"
|
|
cp -r "$SOURCE_DIR/etc" "$INSTALL_DIR/"
|
|
cp "$SOURCE_DIR/scripts/uninstall.sh" "$INSTALL_DIR/uninstall.sh"
|
|
chmod +x "$INSTALL_DIR/uninstall.sh"
|
|
|
|
# Make bin executable
|
|
chmod +x "$INSTALL_DIR/bin/gniza"
|
|
|
|
# Create symlink
|
|
ln -sf "$INSTALL_DIR/bin/gniza" "$BIN_LINK"
|
|
|
|
# Create working directory
|
|
mkdir -p "$INSTALL_DIR/workdir"
|
|
|
|
# Create config directory structure with restrictive permissions
|
|
mkdir -p -m 700 /etc/gniza/remotes.d /etc/gniza/schedules.d
|
|
chmod 700 /etc/gniza
|
|
|
|
# Copy example configs if no config exists
|
|
if [[ ! -f /etc/gniza/gniza.conf ]]; then
|
|
cp "$INSTALL_DIR/etc/gniza.conf.example" /etc/gniza/gniza.conf.example
|
|
echo "Example config copied to /etc/gniza/gniza.conf.example"
|
|
fi
|
|
cp "$INSTALL_DIR/etc/remote.conf.example" /etc/gniza/remote.conf.example
|
|
cp "$INSTALL_DIR/etc/schedule.conf.example" /etc/gniza/schedule.conf.example
|
|
|
|
# Create log directory
|
|
mkdir -p /var/log/gniza
|
|
|
|
echo "gniza installed successfully!"
|
|
|
|
# ── WHM Plugin (if cPanel/WHM is present) ─────────────────────
|
|
WHM_CGI_DIR="/usr/local/cpanel/whostmgr/docroot/cgi"
|
|
if [[ -d "$WHM_CGI_DIR" ]]; then
|
|
echo "Installing WHM plugin..."
|
|
# Remove old assets cruft (node_modules, src) if upgrading
|
|
rm -rf "$WHM_CGI_DIR/gniza-whm/assets/node_modules" \
|
|
"$WHM_CGI_DIR/gniza-whm/assets/src" \
|
|
"$WHM_CGI_DIR/gniza-whm/assets/package.json" \
|
|
"$WHM_CGI_DIR/gniza-whm/assets/package-lock.json" 2>/dev/null || true
|
|
cp -r "$SOURCE_DIR/whm/gniza-whm" "$WHM_CGI_DIR/"
|
|
cp "$SOURCE_DIR/whm/gniza-whm.conf" "$WHM_CGI_DIR/gniza-whm/"
|
|
chmod +x "$WHM_CGI_DIR/gniza-whm/"*.cgi
|
|
# Remove build artifacts that shouldn't be on the server
|
|
rm -rf "$WHM_CGI_DIR/gniza-whm/assets/node_modules" \
|
|
"$WHM_CGI_DIR/gniza-whm/assets/src" \
|
|
"$WHM_CGI_DIR/gniza-whm/assets/package.json" \
|
|
"$WHM_CGI_DIR/gniza-whm/assets/package-lock.json" 2>/dev/null || true
|
|
/usr/local/cpanel/bin/register_appconfig "$WHM_CGI_DIR/gniza-whm/gniza-whm.conf"
|
|
echo "WHM plugin installed — access via WHM > Plugins > gniza Backup Manager"
|
|
else
|
|
echo "WHM not detected, skipping WHM plugin installation."
|
|
fi
|
|
|
|
# ── cPanel User Plugin (if cPanel is present) ────────────────
|
|
CPANEL_BASE="/usr/local/cpanel/base/frontend/jupiter"
|
|
ADMINBIN_DIR="/usr/local/cpanel/bin/admin/Gniza"
|
|
if [[ -d "$CPANEL_BASE" ]]; then
|
|
echo "Installing cPanel user plugin..."
|
|
# Copy CGI files + lib + assets
|
|
mkdir -p "$CPANEL_BASE/gniza/lib/GnizaCPanel" "$CPANEL_BASE/gniza/assets"
|
|
cp "$SOURCE_DIR/cpanel/gniza/index.live.cgi" "$CPANEL_BASE/gniza/"
|
|
cp "$SOURCE_DIR/cpanel/gniza/restore.live.cgi" "$CPANEL_BASE/gniza/"
|
|
chmod +x "$CPANEL_BASE/gniza/"*.cgi
|
|
cp "$SOURCE_DIR/cpanel/gniza/lib/GnizaCPanel/UI.pm" "$CPANEL_BASE/gniza/lib/GnizaCPanel/"
|
|
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-whm.css" "$CPANEL_BASE/gniza/assets/"
|
|
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-logo.svg" "$CPANEL_BASE/gniza/assets/"
|
|
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-cpanel-icon.png" "$CPANEL_BASE/gniza/assets/"
|
|
cp "$SOURCE_DIR/cpanel/gniza/install.json" "$CPANEL_BASE/gniza/"
|
|
# Install AdminBin module (runs as root)
|
|
mkdir -p "$ADMINBIN_DIR"
|
|
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore" "$ADMINBIN_DIR/"
|
|
cp "$SOURCE_DIR/cpanel/admin/Gniza/Restore.conf" "$ADMINBIN_DIR/"
|
|
chmod 0700 "$ADMINBIN_DIR/Restore"
|
|
chmod 0600 "$ADMINBIN_DIR/Restore.conf"
|
|
# Register plugin in cPanel interface (install_plugin expects a tar.gz archive
|
|
# containing install.json + the icon file referenced in it)
|
|
PLUGIN_TMPDIR="$(mktemp -d)"
|
|
mkdir -p "$PLUGIN_TMPDIR/gniza/assets"
|
|
cp "$SOURCE_DIR/cpanel/gniza/install.json" "$PLUGIN_TMPDIR/"
|
|
cp "$SOURCE_DIR/cpanel/gniza/assets/gniza-cpanel-icon.png" "$PLUGIN_TMPDIR/gniza/assets/"
|
|
tar -czf "$PLUGIN_TMPDIR/gniza-cpanel.tar.gz" -C "$PLUGIN_TMPDIR" install.json gniza/assets/gniza-cpanel-icon.png
|
|
/usr/local/cpanel/scripts/install_plugin "$PLUGIN_TMPDIR/gniza-cpanel.tar.gz" 2>/dev/null || true
|
|
rm -rf "$PLUGIN_TMPDIR"
|
|
# Rebuild icon sprites so the new icon appears in cPanel
|
|
/usr/local/cpanel/bin/rebuild_sprites 2>/dev/null || true
|
|
# Regenerate per-user sprites for all cPanel accounts
|
|
if [[ -f /etc/trueuserdomains ]]; then
|
|
while IFS=: read -r _ user; do
|
|
user="${user// /}"
|
|
[[ -n "$user" ]] && cpapi2 --user="$user" Branding gensprites 2>/dev/null || true
|
|
done < /etc/trueuserdomains
|
|
fi
|
|
echo "cPanel user plugin installed — users will see gniza Restore in Files section"
|
|
else
|
|
echo "cPanel not detected, skipping cPanel user plugin installation."
|
|
fi
|
|
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Run 'gniza init' to create your configuration"
|
|
echo " 2. Or copy /etc/gniza/gniza.conf.example to /etc/gniza/gniza.conf"
|
|
echo " 3. Run 'gniza status' to verify your setup"
|