Files
lxs/tools/system-infos.sh
hykocx 173b3bd581 refactor(nav): use exit code 75 to suppress redundant "Press Enter" prompt
- app submenus return 75 on back/exit instead of 0
- index menus capture child exit code and skip pause when rc is 75
- applies to apps (coolify, pterodactyl, uptime-kuma, cloudpanel, proxmox) and tools (server-benchmark, system-infos) indexes
2026-05-12 22:28:16 -04:00

286 lines
12 KiB
Bash
Executable File

#!/bin/bash
# LXS - System Infos
# Description: Essential system monitoring and diagnostic 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
export LXS_LOG_FILE="/tmp/lxs_system_infos.log"
# Menu: System Infos
menu_system_infos() {
while true; do
clear
show_box_top "SYSTEM INFOS"
echo ""
show_menu_item "1" "View system informations"
show_menu_item "2" "Check disk space"
show_menu_item "3" "Check memory usage"
show_menu_item "4" "Check CPU load"
show_menu_item "5" "Check network"
show_menu_item "6" "View system logs (last 50 lines)"
show_menu_item "7" "Show top resource-consuming processes"
show_menu_item "8" "Check disk health (SMART)"
show_menu_item "0" "Exit" "" exit
echo ""
show_box_bottom
echo ""
show_prompt
read -r choice
echo ""
case $choice in
1)
# View system informations
clear
show_box_top "SYSTEM INFORMATION"
echo ""
echo -e "${CYAN}${BOLD}Operating System:${NC}"
echo -e " $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo ""
echo -e "${CYAN}${BOLD}Kernel Version:${NC}"
echo -e " $(uname -r)"
echo ""
echo -e "${CYAN}${BOLD}System Uptime:${NC}"
echo -e " $(uptime -p 2>/dev/null || uptime | awk -F'up ' '{print $2}' | awk -F',' '{print $1}')"
echo ""
echo -e "${CYAN}${BOLD}Load Average:${NC}"
echo -e " $(uptime | awk -F'load average:' '{print $2}')"
echo ""
echo -e "${CYAN}${BOLD}CPU Information:${NC}"
echo -e " Model: $(lscpu | grep "Model name" | cut -d':' -f2 | xargs)"
echo -e " Cores: $(nproc)"
echo -e " Architecture: $(uname -m)"
echo ""
echo -e "${CYAN}${BOLD}Memory:${NC}"
local total_mem=$(free -h | awk '/^Mem:/ {print $2}')
local used_mem=$(free -h | awk '/^Mem:/ {print $3}')
local available_mem=$(free -h | awk '/^Mem:/ {print $7}')
echo -e " Total: $total_mem"
echo -e " Used: $used_mem"
echo -e " Available: $available_mem"
echo ""
echo -e "${CYAN}${BOLD}Disk Space:${NC}"
echo -e " Total: $(df -h / | awk 'NR==2 {print $2}')"
echo -e " Used: $(df -h / | awk 'NR==2 {print $3}')"
echo -e " Available: $(df -h / | awk 'NR==2 {print $4}')"
echo -e " Usage: $(df -h / | awk 'NR==2 {print $5}')"
echo ""
echo -e "${CYAN}${BOLD}Network:${NC}"
echo -e " Hostname: $(hostname)"
echo -e " Local IP: $(hostname -I | awk '{print $1}')"
echo -e " Public IP: $(get_public_ip)"
echo ""
echo -e "${CYAN}${BOLD}Installed Software:${NC}"
if command -v git &> /dev/null; then
echo -e " ${GREEN}[✓]${NC} Git: $(git --version 2>/dev/null | cut -d' ' -f3)"
else
echo -e " ${GRAY}[ ]${NC} Git: Not installed"
fi
if command -v docker &> /dev/null; then
echo -e " ${GREEN}[✓]${NC} Docker: $(docker --version 2>/dev/null | cut -d' ' -f3 | tr -d ',')"
else
echo -e " ${GRAY}[ ]${NC} Docker: Not installed"
fi
if command -v node &> /dev/null; then
echo -e " ${GREEN}[✓]${NC} Node.js: $(node --version 2>/dev/null)"
else
echo -e " ${GRAY}[ ]${NC} Node.js: Not installed"
fi
if command -v python3 &> /dev/null; then
echo -e " ${GREEN}[✓]${NC} Python3: $(python3 --version 2>/dev/null | cut -d' ' -f2)"
else
echo -e " ${GRAY}[ ]${NC} Python3: Not installed"
fi
;;
2)
# Check disk space
echo -e "${CYAN}${BOLD}Disk Space Usage:${NC}"
echo ""
df -h
echo ""
show_separator
echo -e "${CYAN}${BOLD}Inode Usage:${NC}"
echo ""
df -i
;;
3)
# Check memory usage
echo -e "${CYAN}${BOLD}Memory Usage:${NC}"
echo ""
free -h
echo ""
show_separator
echo -e "${CYAN}${BOLD}Detailed Memory Info:${NC}"
echo ""
cat /proc/meminfo | head -10
;;
4)
# Check CPU load
echo -e "${CYAN}${BOLD}CPU Load and Top Processes:${NC}"
echo ""
uptime
echo ""
show_separator
echo ""
top -bn1 | head -20
;;
5)
# Check network
echo -e "${CYAN}${BOLD}Network Check:${NC}"
echo ""
echo -e "${CYAN}[1/5]${NC} Network Interfaces:"
echo ""
ip -brief addr show 2>/dev/null || ifconfig -a
echo ""
echo -e "${CYAN}[2/5]${NC} Public IP Address:"
PUBLIC_IP=$(get_public_ip)
echo -e " ${WHITE}$PUBLIC_IP${NC}"
echo ""
echo -e "${CYAN}[3/5]${NC} DNS Resolution Test:"
echo -e -n " Testing google.com... "
if nslookup google.com >/dev/null 2>&1; then
echo -e "${GREEN}OK${NC}"
else
echo -e "${RED}FAILED${NC}"
fi
echo ""
echo -e "${CYAN}[4/5]${NC} Internet Connectivity Test:"
echo -e -n " Pinging google.com... "
if ping -c 1 google.com >/dev/null 2>&1; then
echo -e "${GREEN}OK${NC}"
else
echo -e "${RED}FAILED${NC}"
fi
echo ""
echo -e "${CYAN}[5/5]${NC} Open Ports:"
echo ""
if command -v ss &> /dev/null; then
ss -tulpn 2>/dev/null | grep LISTEN || echo " No listening ports or insufficient permissions"
elif command -v netstat &> /dev/null; then
netstat -tulpn 2>/dev/null | grep LISTEN || echo " No listening ports or insufficient permissions"
else
echo " ${YELLOW}Neither ss nor netstat available${NC}"
fi
;;
6)
# View system logs
echo -e "${CYAN}${BOLD}System Logs (last 50 lines):${NC}"
echo ""
sudo journalctl -n 50 --no-pager
;;
7)
# Show top resource-consuming processes
echo -e "${CYAN}${BOLD}Top Memory-Consuming Processes:${NC}"
echo ""
ps aux --sort=-%mem | head -15
echo ""
show_separator
echo ""
echo -e "${CYAN}${BOLD}Top CPU-Consuming Processes:${NC}"
echo ""
ps aux --sort=-%cpu | head -15
;;
8)
# Check disk health
echo -e "${CYAN}${BOLD}Disk Health Check (SMART):${NC}"
echo ""
if command -v smartctl &> /dev/null; then
disks=$(lsblk -d -n -p -o NAME,TYPE | grep "disk" | awk '{print $1}')
if [ -z "$disks" ]; then
echo -e "${RED}[✗] No disks found${NC}"
else
for disk in $disks; do
disk_name=$(basename "$disk")
show_separator
echo -e "${WHITE}Disk: $disk${NC}"
# Get disk info
disk_size=$(lsblk -d -n -o SIZE "$disk" 2>/dev/null)
disk_model=$(lsblk -d -n -o MODEL "$disk" 2>/dev/null | xargs)
disk_rota=$(cat /sys/block/$disk_name/queue/rotational 2>/dev/null)
echo -e " Size: ${CYAN}$disk_size${NC}"
[ -n "$disk_model" ] && echo -e " Model: ${CYAN}$disk_model${NC}"
[ "$disk_rota" == "0" ] && echo -e " Type: ${CYAN}SSD/Virtual${NC}" || echo -e " Type: ${CYAN}HDD${NC}"
echo ""
# Check if it's a virtual disk
if [[ $disk == *"/dev/vd"* ]] || [[ $disk == *"/dev/xvd"* ]]; then
echo -e " ${YELLOW}[!] Virtual disk detected - SMART not available${NC}"
echo -e " ${GRAY}[i] Virtual disks don't support SMART monitoring${NC}"
else
# Try SMART check for physical disks
smart_output=$(sudo smartctl -H "$disk" 2>&1)
if echo "$smart_output" | grep -q "PASSED"; then
echo -e " ${GREEN}[✓] SMART Status: PASSED${NC}"
elif echo "$smart_output" | grep -q "FAILED"; then
echo -e " ${RED}[✗] SMART Status: FAILED${NC}"
echo -e " ${RED}[!] WARNING: Disk may be failing!${NC}"
else
echo -e " ${YELLOW}[!] SMART not available for this disk${NC}"
fi
fi
echo ""
done
show_separator
fi
else
echo -e "${RED}[✗] smartmontools is not installed${NC}"
echo ""
read -p "Would you like to install it? (y/n): " install_smart
if [[ $install_smart =~ ^[Yy]$ ]]; then
echo ""
export DEBIAN_FRONTEND=noninteractive
export NEEDRESTART_MODE=a
export NEEDRESTART_SUSPEND=1
run_spinner "Updating package list..." "sudo apt update -qq"
run_spinner "Installing smartmontools..." "sudo apt install -y -qq smartmontools -o Dpkg::Options::='--force-confdef' -o Dpkg::Options::='--force-confold'"
echo ""
echo -e "${GRAY}[i] Run this option again to check disk health${NC}"
fi
fi
;;
0)
exit 75
;;
*)
echo -e "${RED}[✗] Invalid option. Please select 0-8.${NC}"
sleep 2
continue
;;
esac
echo ""
show_separator
echo ""
read -p "Press Enter to continue..."
done
}
menu_system_infos