Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dc1475c64a | |||
| dbe4b95190 |
@@ -60,13 +60,15 @@ lxs/
|
|||||||
├── lib/
|
├── lib/
|
||||||
│ └── common.sh # Shared helpers (colors, loggers, spinner)
|
│ └── common.sh # Shared helpers (colors, loggers, spinner)
|
||||||
├── apps/ # Application installers
|
├── apps/ # Application installers
|
||||||
|
│ ├── index.sh # Interactive menu listing the apps below
|
||||||
│ ├── coolify.sh
|
│ ├── coolify.sh
|
||||||
│ ├── pterodactyl.sh
|
│ ├── pterodactyl.sh
|
||||||
│ ├── uptime-kuma.sh
|
│ ├── uptime-kuma.sh
|
||||||
│ ├── cloudpanel.sh
|
│ ├── cloudpanel.sh
|
||||||
│ └── proxmox.sh
|
│ └── proxmox.sh
|
||||||
└── tools/ # System tools
|
└── tools/ # System tools
|
||||||
├── system-tools.sh
|
├── index.sh # Interactive menu listing the tools below
|
||||||
|
├── system-infos.sh
|
||||||
├── server-benchmark.sh
|
├── server-benchmark.sh
|
||||||
└── harden.sh
|
└── harden.sh
|
||||||
```
|
```
|
||||||
|
|||||||
Executable
+86
@@ -0,0 +1,86 @@
|
|||||||
|
#!/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
|
||||||
@@ -252,7 +252,7 @@ cmd_help() {
|
|||||||
LXS - Linux multi-tool (v${LXS_VERSION})
|
LXS - Linux multi-tool (v${LXS_VERSION})
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
lxs Interactive menu
|
lxs Interactive menu (browse apps and tools)
|
||||||
lxs setup Install lxs and all sub-scripts to ${LXS_INSTALL_DIR}
|
lxs setup Install lxs and all sub-scripts to ${LXS_INSTALL_DIR}
|
||||||
lxs update Update all installed files to latest
|
lxs update Update all installed files to latest
|
||||||
lxs install <app> Install an application
|
lxs install <app> Install an application
|
||||||
@@ -261,17 +261,7 @@ Usage:
|
|||||||
lxs version Show version
|
lxs version Show version
|
||||||
lxs help Show this help
|
lxs help Show this help
|
||||||
|
|
||||||
Applications (lxs install ...):
|
Run \`lxs\` for the interactive menu to browse available applications and tools.
|
||||||
coolify Self-hosted PaaS
|
|
||||||
pterodactyl Game server management panel
|
|
||||||
uptime-kuma Monitoring tool
|
|
||||||
cloudpanel Web hosting control panel
|
|
||||||
proxmox Proxmox VE management tools
|
|
||||||
|
|
||||||
Tools (lxs tool ...):
|
|
||||||
system System monitoring and diagnostics
|
|
||||||
benchmark Server benchmark (CPU/RAM/disk/network)
|
|
||||||
harden Baseline hardening (UFW + fail2ban + SSH key-only + auto-updates)
|
|
||||||
|
|
||||||
Source: ${LXS_REPO_URL}
|
Source: ${LXS_REPO_URL}
|
||||||
EOF
|
EOF
|
||||||
@@ -294,7 +284,7 @@ cmd_tool() {
|
|||||||
local tool="${1:-}"
|
local tool="${1:-}"
|
||||||
shift || true
|
shift || true
|
||||||
case "$tool" in
|
case "$tool" in
|
||||||
system) download_and_run "tools/system-tools.sh" "$@" ;;
|
system) download_and_run "tools/system-infos.sh" "$@" ;;
|
||||||
benchmark) download_and_run "tools/server-benchmark.sh" "$@" ;;
|
benchmark) download_and_run "tools/server-benchmark.sh" "$@" ;;
|
||||||
harden) download_and_run "tools/harden.sh" "$@" ;;
|
harden) download_and_run "tools/harden.sh" "$@" ;;
|
||||||
"") echo -e "${RED}[✗] Missing tool name. Try: lxs help${NC}"; return 1 ;;
|
"") echo -e "${RED}[✗] Missing tool name. Try: lxs help${NC}"; return 1 ;;
|
||||||
@@ -381,41 +371,9 @@ cmd_install_self() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
# Interactive menus
|
# Interactive menu
|
||||||
# ═══════════════════════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
menu_install_apps() {
|
|
||||||
while true; do
|
|
||||||
show_header
|
|
||||||
echo -e "${WHITE}${BOLD}APPLICATIONS${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) download_and_run "apps/coolify.sh" ;;
|
|
||||||
2) download_and_run "apps/pterodactyl.sh" ;;
|
|
||||||
3) download_and_run "apps/uptime-kuma.sh" ;;
|
|
||||||
4) download_and_run "apps/cloudpanel.sh" ;;
|
|
||||||
5) download_and_run "apps/proxmox.sh" ;;
|
|
||||||
0) return ;;
|
|
||||||
*) echo -e "${RED}[✗] Invalid option. Please select 0-5.${NC}"; sleep 1 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if [ "$choice" != "0" ]; then
|
|
||||||
echo ""
|
|
||||||
read -r -p "Press Enter to continue..."
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
main_menu() {
|
main_menu() {
|
||||||
check_os
|
check_os
|
||||||
check_remote_version
|
check_remote_version
|
||||||
@@ -424,7 +382,7 @@ main_menu() {
|
|||||||
echo -e "${WHITE}${BOLD}MAIN MENU${NC}"
|
echo -e "${WHITE}${BOLD}MAIN MENU${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${GREEN}[1]${NC} Applications"
|
echo -e " ${GREEN}[1]${NC} Applications"
|
||||||
echo -e " ${CYAN}[2]${NC} System Tools"
|
echo -e " ${CYAN}[2]${NC} Tools"
|
||||||
echo -e " ${GRAY}[u]${NC} Update lxs"
|
echo -e " ${GRAY}[u]${NC} Update lxs"
|
||||||
echo -e " ${RED}[0]${NC} Exit"
|
echo -e " ${RED}[0]${NC} Exit"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -432,8 +390,8 @@ main_menu() {
|
|||||||
read -r choice
|
read -r choice
|
||||||
|
|
||||||
case $choice in
|
case $choice in
|
||||||
1) menu_install_apps ;;
|
1) download_and_run "apps/index.sh" ;;
|
||||||
2) download_and_run "tools/system-tools.sh" ;;
|
2) download_and_run "tools/index.sh" ;;
|
||||||
u|U) cmd_update ;;
|
u|U) cmd_update ;;
|
||||||
0)
|
0)
|
||||||
clear
|
clear
|
||||||
@@ -444,7 +402,7 @@ main_menu() {
|
|||||||
*) echo -e "${RED}[✗] Invalid option.${NC}"; sleep 1 ;;
|
*) echo -e "${RED}[✗] Invalid option.${NC}"; sleep 1 ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ "$choice" != "0" && "$choice" != "1" ]]; then
|
if [[ "$choice" != "0" && "$choice" != "1" && "$choice" != "2" ]]; then
|
||||||
echo ""
|
echo ""
|
||||||
read -r -p "Press Enter to continue..."
|
read -r -p "Press Enter to continue..."
|
||||||
fi
|
fi
|
||||||
|
|||||||
Executable
+83
@@ -0,0 +1,83 @@
|
|||||||
|
#!/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 "${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_tools() {
|
||||||
|
while true; do
|
||||||
|
clear
|
||||||
|
echo -e "${WHITE}╔═══════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${WHITE}║ TOOLS ║${NC}"
|
||||||
|
echo -e "${WHITE}╚═══════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${CYAN}[1]${NC} System Infos"
|
||||||
|
echo -e " ${PURPLE}[2]${NC} Server Benchmark"
|
||||||
|
echo -e " ${YELLOW}[3]${NC} Harden Server"
|
||||||
|
echo -e " ${RED}[0]${NC} Back"
|
||||||
|
echo ""
|
||||||
|
echo -e -n "${BOLD}Choice [0-3]: ${NC}"
|
||||||
|
read -r choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1) run_sibling "tools/system-infos.sh" ;;
|
||||||
|
2) run_sibling "tools/server-benchmark.sh" ;;
|
||||||
|
3) run_sibling "tools/harden.sh" ;;
|
||||||
|
0) return ;;
|
||||||
|
*) echo -e "${RED}[✗] Invalid option. Please select 0-3.${NC}"; sleep 1; continue ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ "$choice" != "0" ]; then
|
||||||
|
echo ""
|
||||||
|
read -r -p "Press Enter to continue..."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
menu_tools
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# LXS - System Tools
|
# LXS - System Infos
|
||||||
# Description: Essential system monitoring and diagnostic tools
|
# Description: Essential system monitoring and diagnostic tools
|
||||||
# Author: LXS
|
# Author: LXS
|
||||||
# Date: 2025
|
# Date: 2025
|
||||||
@@ -10,52 +10,14 @@ 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; }
|
_lib=$(curl -fsSL "${LXS_RAW_BASE}/lib/common.sh") || { echo "Failed to fetch lib/common.sh" >&2; exit 1; }
|
||||||
eval "$_lib"
|
eval "$_lib"
|
||||||
unset _lib
|
unset _lib
|
||||||
export LXS_LOG_FILE="/tmp/lxs_system_tools.log"
|
export LXS_LOG_FILE="/tmp/lxs_system_infos.log"
|
||||||
|
|
||||||
# Run a sibling tool script. Prefers a file next to this script (installed
|
# Menu: System Infos
|
||||||
# layout); falls back to downloading from LXS_RAW_BASE.
|
menu_system_infos() {
|
||||||
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: System Tools
|
|
||||||
menu_system_tools() {
|
|
||||||
while true; do
|
while true; do
|
||||||
clear
|
clear
|
||||||
echo -e "${WHITE}╔═══════════════════════════════════════════════════════╗${NC}"
|
echo -e "${WHITE}╔═══════════════════════════════════════════════════════╗${NC}"
|
||||||
echo -e "${WHITE}║ SYSTEM TOOLS ║${NC}"
|
echo -e "${WHITE}║ SYSTEM INFOS ║${NC}"
|
||||||
echo -e "${WHITE}╚═══════════════════════════════════════════════════════╝${NC}"
|
echo -e "${WHITE}╚═══════════════════════════════════════════════════════╝${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${CYAN}[1]${NC} View system informations"
|
echo -e " ${CYAN}[1]${NC} View system informations"
|
||||||
@@ -66,11 +28,9 @@ menu_system_tools() {
|
|||||||
echo -e " ${CYAN}[6]${NC} View system logs (last 50 lines)"
|
echo -e " ${CYAN}[6]${NC} View system logs (last 50 lines)"
|
||||||
echo -e " ${CYAN}[7]${NC} Show top resource-consuming processes"
|
echo -e " ${CYAN}[7]${NC} Show top resource-consuming processes"
|
||||||
echo -e " ${CYAN}[8]${NC} Check disk health (SMART)"
|
echo -e " ${CYAN}[8]${NC} Check disk health (SMART)"
|
||||||
echo -e " ${PURPLE}[9]${NC} Server Benchmark"
|
|
||||||
echo -e " ${YELLOW}[10]${NC} Harden Server"
|
|
||||||
echo -e " ${RED}[0]${NC} Exit"
|
echo -e " ${RED}[0]${NC} Exit"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e -n "${BOLD}Choice [0-10]: ${NC}"
|
echo -e -n "${BOLD}Choice [0-8]: ${NC}"
|
||||||
read -r choice
|
read -r choice
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
@@ -306,17 +266,11 @@ menu_system_tools() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
9)
|
|
||||||
run_sibling "tools/server-benchmark.sh"
|
|
||||||
;;
|
|
||||||
10)
|
|
||||||
run_sibling "tools/harden.sh"
|
|
||||||
;;
|
|
||||||
0)
|
0)
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo -e "${RED}[✗] Invalid option. Please select 0-10.${NC}"
|
echo -e "${RED}[✗] Invalid option. Please select 0-8.${NC}"
|
||||||
sleep 2
|
sleep 2
|
||||||
continue
|
continue
|
||||||
;;
|
;;
|
||||||
@@ -329,5 +283,5 @@ menu_system_tools() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
menu_system_tools
|
menu_system_infos
|
||||||
|
|
||||||
Reference in New Issue
Block a user