111 lines
3.8 KiB
Bash
111 lines
3.8 KiB
Bash
#!/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 |