#!/bin/bash # LXS - Tools index # Description: Interactive menu listing the scripts in tools/ # 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 tool 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 # self_dir points at tools/; the install layout puts siblings here too. 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 "${CYAN}[..] Fetching ${BOLD}${script_name}${NC}${CYAN}...${NC}" if curl -fsSL -H "Cache-Control: no-cache" -o "${temp_file}" "${LXS_RAW_BASE}/${script_path}"; then echo -e "${GREEN}[OK] Payload acquired${NC}" chmod +x "${temp_file}" "${temp_file}" "$@" exit_code=$? rm -f "${temp_file}" return $exit_code else echo -e "${RED}[KO] Failed to download ${script_path}${NC}" rm -f "${temp_file}" return 1 fi } menu_tools() { while true; do clear show_box_top "TOOLS" "SYS_DAEMONS" echo "" show_menu_item "01" "System Infos" show_menu_item "02" "Server Benchmark" show_menu_item "03" "Harden Server" show_menu_item "04" "Change Root Password" show_menu_item "05" "Update Server" show_menu_item "06" "Root SSH Password Login" show_menu_item "07" "Welcome Message (MOTD)" show_menu_item "00" "BACK" "" exit echo "" show_box_bottom echo "" show_prompt read -r choice child_rc=0 case $choice in 1|01) run_sibling "tools/system-infos.sh"; child_rc=$? ;; 2|02) run_sibling "tools/server-benchmark.sh"; child_rc=$? ;; 3|03) run_sibling "tools/harden.sh"; child_rc=$? ;; 4|04) run_sibling "tools/root-password.sh"; child_rc=$? ;; 5|05) run_sibling "tools/update-server.sh"; child_rc=$? ;; 6|06) run_sibling "tools/root-ssh-login.sh"; child_rc=$? ;; 7|07) run_sibling "tools/welcome-message.sh"; child_rc=$? ;; 0|00) return ;; *) echo -e "${RED}[KO] Invalid protocol. Select 0-7.${NC}"; sleep 1; continue ;; esac # Exit code 75 from a child means it already paused on its own # (its own "Back" or end-of-run prompt) — skip the redundant prompt. if [ "$child_rc" -ne 75 ]; then echo "" read -r -p "Press Enter to continue..." fi done } menu_tools