#!/usr/bin/env bash set -euo pipefail if [[ "${TRACE-0}" == "1" ]]; then set -o xtrace fi # Colors color_reset="\033[0m" color_red="\033[0;31m" color_green="\033[0;32m" color_yellow="\033[0;33m" color_bright_black="\033[1;30m" # Help message print_help() { echo "Usage: ./server-stats.sh [OPTIONS...]" echo " -h --help Print help" } # Early argument parsing case "${1:-}" in "-h" | "--help") print_help exit 0 ;; "") # do script below ;; *) echo -e "${color_red}unrecognized option: ${1}${color_reset}" >&2 echo "" >&2 print_help >&2 exit 1 ;; esac # System stats cpu_total=$(LC_ALL=C top -bn1 | awk '/Cpu\(s\)/ {printf "%.0f", 100 - $8}') read -r ram_total ram_used <<<"$(free --mebi | awk '/Mem:/ {print $2, $3}')" ram_percentage=$(awk "BEGIN {printf \"%d\", ($ram_used/$ram_total)*100}") read -r disk_total disk_used disk_percentage <<<"$(LC_ALL=C df --human-readable / | awk 'NR==2{print $2, $3, $5}')" disk_percentage="${disk_percentage%\%}" # Tops top_cpu=$(ps -e --format comm --sort=-%cpu | head -6 | tail -5) top_ram=$(ps -e --format comm --sort=-%mem | head -6 | tail -5) # System info os_version=$(grep '^PRETTY_NAME=' /etc/os-release | cut -d= -f2 | tr -d '"') uptime=$(uptime --pretty) load_avg=$(uptime | awk -F'load average:' '{print $2}' | sed 's/^ //') users_logged_in=$(who | awk '{print $1}' | sort -u | paste -sd ", ") ### Failed login attempts # if [ -f /var/log/auth.log ]; then # failed_logins=$(grep -ci "Failed password" /var/log/auth.log) # last_failed=$(grep -i "Failed password" /var/log/auth.log | tail -3 | sed 's/^/ /') # elif [ -f /var/log/secure ]; then # failed_logins=$(grep -ci "Failed password" /var/log/secure) # last_failed=$(grep -i "Failed password" /var/log/secure | tail -3 | sed 's/^/ /') # else # failed_logins="N/A" # last_failed="Log file not found" # fi # Conditional display if ((cpu_total > 85)); then cpu_color=$color_red elif ((cpu_total > 70)); then cpu_color=$color_yellow else cpu_color=$color_green fi if ((ram_percentage > 85)); then ram_color=$color_red elif ((ram_percentage > 70)); then ram_color=$color_yellow else ram_color=$color_green fi if ((disk_percentage > 85)); then disk_color=$color_red elif ((disk_percentage > 70)); then disk_color=$color_yellow else disk_color=$color_green fi # Output echo -e "${color_bright_black}╭───────────────── System stats ─────────────────╮${color_reset}" echo -e " CPU Usage: ${cpu_color}${cpu_total}%${color_reset}" echo -e " RAM Usage: ${ram_color}${ram_used}/${ram_total} MB (${ram_percentage}%)${color_reset}" echo -e " Disk Usage: ${disk_color}${disk_used}/${disk_total} (${disk_percentage}%)${color_reset}" echo -e "${color_bright_black}├───────── Top 5 Processes by CPU usage ─────────┤${color_reset}" echo "${top_cpu}" | awk '{printf " %d. %s\n", NR, $0}' echo -e "${color_bright_black}├───────── Top 5 Processes by RAM usage ─────────┤${color_reset}" echo "${top_ram}" | awk '{printf " %d. %s\n", NR, $0}' echo -e "${color_bright_black}├────────────── System information ──────────────┤${color_reset}" echo " OS Version: ${os_version}" echo " Uptime: ${uptime}" echo " Load Average: ${load_avg}" echo " Logged in Users: ${users_logged_in}" # echo -e "${color_bright_black}├──────────── Failed login attempts ─────────────┤${color_reset}" # echo " Failed logins: ${failed_logins}" # echo " Last failed: ${last_failed}" echo -e "${color_bright_black}╰────────────────────────────────────────────────╯${color_reset}" exit 0