#!/bin/bash # LXS - Apps index # Description: Interactive menu listing the application installers in apps/ # Author: LXS # Date: 2025 # Load LXS common library (colors, separator, run_spinner, loggers) LXS_RAW_BASE="${LXS_RAW_BASE:-https://git.hyko.cx/hykocx/lxs/raw/branch/main}" _lib=$(curl -fsSL "${LXS_RAW_BASE}/lib/common.sh") || { echo "Failed to fetch lib/common.sh" >&2; exit 1; } eval "$_lib" unset _lib # Run a sibling app script. Prefers a file next to this script (installed # layout); falls back to downloading from LXS_RAW_BASE. run_sibling() { local script_path=$1 shift local script_name self_dir resolved src="${BASH_SOURCE[0]}" script_name=$(basename "$script_path") if [ -n "$src" ]; then resolved=$(readlink -f "$src" 2>/dev/null) \ || resolved=$(realpath "$src" 2>/dev/null) \ || resolved="$src" self_dir=$(dirname "$resolved") fi if [ -n "$self_dir" ] && [ -f "${self_dir}/${script_name}" ]; then chmod +x "${self_dir}/${script_name}" 2>/dev/null || true "${self_dir}/${script_name}" "$@" return $? fi local temp_file exit_code temp_file=$(mktemp "/tmp/lxs.${script_name%.*}.XXXXXX.sh") echo -e "${PURPLE}[*] Downloading ${BOLD}${script_name}${NC}${PURPLE}...${NC}" if curl -fsSL -H "Cache-Control: no-cache" -o "${temp_file}" "${LXS_RAW_BASE}/${script_path}"; then echo -e "${GREEN}[✓] Downloaded${NC}" chmod +x "${temp_file}" "${temp_file}" "$@" exit_code=$? rm -f "${temp_file}" return $exit_code else echo -e "${RED}[✗] Failed to download ${script_path}${NC}" rm -f "${temp_file}" return 1 fi } menu_apps() { while true; do clear echo -e "${WHITE}╔═══════════════════════════════════════════════════════╗${NC}" echo -e "${WHITE}║ APPLICATIONS ║${NC}" echo -e "${WHITE}╚═══════════════════════════════════════════════════════╝${NC}" echo "" echo -e " ${GREEN}[1]${NC} Coolify" echo -e " ${GREEN}[2]${NC} Pterodactyl Panel" echo -e " ${GREEN}[3]${NC} Uptime Kuma" echo -e " ${GREEN}[4]${NC} CloudPanel" echo -e " ${GREEN}[5]${NC} Proxmox VE Tools" echo -e " ${RED}[0]${NC} Back" echo "" echo -e -n "${BOLD}Choice [0-5]: ${NC}" read -r choice case $choice in 1) run_sibling "apps/coolify.sh" ;; 2) run_sibling "apps/pterodactyl.sh" ;; 3) run_sibling "apps/uptime-kuma.sh" ;; 4) run_sibling "apps/cloudpanel.sh" ;; 5) run_sibling "apps/proxmox.sh" ;; 0) return ;; *) echo -e "${RED}[✗] Invalid option. Please select 0-5.${NC}"; sleep 1; continue ;; esac if [ "$choice" != "0" ]; then echo "" read -r -p "Press Enter to continue..." fi done } menu_apps