System Health Dashboard (BigBlack)
Source: Notion | Last edited: 2024-11-06 | ID: 1362d2dc-3ef...
/home/tca/scripts/system_health_dashboard.sh
#!/bin/bashexport TERM=xterm-256color
# Define required packages and their minimum versions (if needed)declare -A REQUIRED_PACKAGES=( ["neofetch"]="" ["nvidia-smi"]="" ["duf"]="" ["logrotate"]="" ["docker"]="" ["nvme-cli"]="" ["smartmontools"]="" ["fwupd"]="" ["sysstat"]="" ["netplan.io"]="" ["htop"]="")
echocolor() { echo -e "$@"}
define_colors() { RED=$'\e[0;31m' YELLOW=$'\e[1;33m' GREEN=$'\e[0;32m' BLUE=$'\e[0;34m' CYAN=$'\e[0;36m' NC=$'\e[0m' BOLD=$'\e[1m' DIM=$'\e[2m'}
check_command() { local cmd=$1 command -v "$cmd" >/dev/null 2>&1}
install_packages() { local packages=("$@") for pkg in "${packages[@]}"; do if ! sudo apt-get install -y "$pkg" >/dev/null 2>&1; then echocolor "${RED}Failed to install ${pkg}${NC}" exit 1 fi done}
check_and_install_packages() { local missing_packages=() for pkg in "${!REQUIRED_PACKAGES[@]}"; do if ! check_command "$pkg"; then case "$pkg" in "nvidia-smi") if ! lspci | grep -i nvidia >/dev/null 2>&1; then continue fi ;; *) missing_packages+=("$pkg") ;; esac fi done [ ${#missing_packages[@]} -gt 0 ] && install_packages "${missing_packages[@]}"}
display_colored_message() { local color=$1 local message=$2 echocolor "${color}${message}${NC}"}
check_and_display_status() { local type=$1 local items=("$@") shift for item in "${items[@]}"; do local status=$(systemctl is-active "$item.$type" 2>/dev/null) if [ "$status" = "active" ]; then display_colored_message "$GREEN" " โโ โ $item" else display_colored_message "$RED" " โโ โ $item ($status)" fi done}
check_services_and_timers() { local services=("prometheus-node-exporter" "nvidia-persistenced" "smartmontools" "sysstat" "bluetooth") local timers=("nvme-monitor" "prometheus-node-exporter-nvme" "sysstat-collect") display_colored_message "$BOLD$BLUE" "โถ Service Status:" echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ" check_and_display_status "service" "${services[@]}" echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ" display_colored_message "$BOLD$BLUE" "โถ Timer Status:" echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ" check_and_display_status "timer" "${timers[@]}" echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"}
define_colorscheck_and_install_packages > /dev/nullcheck_services_and_timers
if ! sudo -v; then echo "Failed to obtain sudo privileges" exit 1fisudo -vwhile true; do sudo -n true sleep 45 kill -0 "$$" || exitdone 2>/dev/null &
mkdir -p ~/backups ~/logs/nvme 2>/dev/null
clearechocolor "${BOLD}${BLUE}โโโโโโโโโโโโโโโโ System Health Dashboard โโโโโโโโโโโโโโโโ${NC}"
# Replace the current neofetch section with:neofetch --stdout \ --off \ --cpu_temp C \ --memory_percent on \ | grep -E "^(OS|Kernel|Uptime|CPU|Memory|Disk):" \ | awk -v cyan="$CYAN" -v nc="$NC" '{ prefix = (NR == 6) ? " โโ " : " โโ " printf "%s%s%s%s\n", prefix, cyan, $0, nc }'
echocolor "${BOLD}${BLUE}โโโโโโโโโโโโโโโโ System Health Dashboard โโโโโโโโโโโโโโโโ${NC}"echocolor
echocolor "${BOLD}${BLUE}โถ System Statistics:${NC}"echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"if command -v sar >/dev/null 2>&1; then # Get last hour's CPU, memory, and I/O statistics cpu_stats=$(sar -u 1 1 | tail -n1) mem_stats=$(sar -r 1 1 | tail -n1) io_stats=$(sar -b 1 1 | tail -n1)
echocolor " โโ CPU Usage (usr/sys/iowait): ${CYAN}$(echo "$cpu_stats" | awk '{printf "%.1f/%.1f/%.1f%%", $3, $5, $6}')${NC}" echocolor " โโ Memory Pages (fault/maj): ${CYAN}$(echo "$mem_stats" | awk '{printf "%d/%d", $7, $8}')${NC}" echocolor " โโ I/O (read/write): ${CYAN}$(echo "$io_stats" | awk '{printf "%.1f/%.1f tps", $2, $3}')${NC}"else echocolor " โโ ${YELLOW}sysstat not installed${NC}"fi
echocolorechocolor "${BOLD}${BLUE}โถ Network Environment:${NC}"echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
# Check Wi-Fi blacklist statuscheck_wifi_blacklist() { local blacklist_files=(/etc/modprobe.d/blacklist*.conf) local wifi_blacklisted=false local blacklist_file="" local blacklist_date=""
for file in "${blacklist_files[@]}"; do if [ -f "$file" ] && grep -q "blacklist.*iwlwifi" "$file"; then wifi_blacklisted=true blacklist_file=$file blacklist_date=$(stat -c %y "$file" | cut -d. -f1) break fi done
if $wifi_blacklisted; then echocolor " โโ Wi-Fi Status: ${GREEN}Disabled${NC}" echocolor " โ โโ Blacklist: ${CYAN}$blacklist_file${NC}" echocolor " โ โโ Modified: ${CYAN}$blacklist_date${NC}" else if lsmod | grep -q "iwlwifi"; then echocolor " โโ Wi-Fi Status: ${YELLOW}Active (not blacklisted)${NC}" else echocolor " โโ Wi-Fi Status: ${CYAN}Not loaded${NC}" fi fi}
# Get active interfaces with their statesget_network_interfaces() { local interfaces=$(ip -br link show | awk '{print $1, $2}')
echo "$interfaces" | while read -r iface state; do if [[ "$iface" != "lo" && "$iface" != "docker"* && "$iface" != "br-"* && "$iface" != "veth"* ]]; then local ip_addr=$(ip -br addr show "$iface" | awk '{print $3}') local type=$(nmcli -g GENERAL.TYPE device show "$iface" 2>/dev/null || echo "unknown") local speed="" local mtu=$(ip link show "$iface" | grep -oP 'mtu \K\d+') local rx_bytes=$(cat /sys/class/net/$iface/statistics/rx_bytes 2>/dev/null) local tx_bytes=$(cat /sys/class/net/$iface/statistics/tx_bytes 2>/dev/null)
if [[ "$type" == "ethernet" ]]; then speed=$(ethtool "$iface" 2>/dev/null | grep "Speed:" | awk '{print $2}') fi
echocolor " โโ Interface: ${CYAN}$iface${NC}" echocolor " โ โโ State: ${GREEN}$state${NC}" [ ! -z "$ip_addr" ] && echocolor " โ โโ IP: ${CYAN}$ip_addr${NC}" [ ! -z "$type" ] && echocolor " โ โโ Type: ${CYAN}$type${NC}" [ ! -z "$mtu" ] && echocolor " โ โโ MTU: ${CYAN}$mtu${NC}" [ ! -z "$speed" ] && echocolor " โ โโ Speed: ${CYAN}$speed${NC}"
if [ ! -z "$rx_bytes" ] && [ ! -z "$tx_bytes" ]; then echocolor " โ โโ Traffic: ${CYAN}โ$(numfmt --to=iec $rx_bytes)B โ$(numfmt --to=iec $tx_bytes)B${NC}" fi fi done}
# Check DNS configurationcheck_dns_config() { local dns_servers=$(grep "nameserver" /etc/resolv.conf | awk '{print $2}') local resolv_date=$(stat -c %y /etc/resolv.conf | cut -d. -f1)
if [ -n "$dns_servers" ]; then echocolor " โโ DNS Configuration:" echocolor " โ โโ Modified: ${CYAN}$resolv_date${NC}" echo "$dns_servers" | while read -r server; do if [[ "$server" == "127.0.0.53" ]]; then echocolor " โ โโ Server: ${CYAN}$server${NC} (systemd-resolved)" else echocolor " โ โโ Server: ${CYAN}$server${NC}" fi done else echocolor " โโ ${YELLOW}No DNS servers configured${NC}" fi}
# Display network informationcheck_wifi_blacklistget_network_interfacescheck_dns_config
echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
echocolorechocolor "${BOLD}${BLUE}โถ NVMe Health Status:${NC}"if nvme_metrics=$(curl -s "http://localhost:9100/metrics" 2>/dev/null); then temp=$(echo "$nvme_metrics" | grep "^nvme_temperature_celsius.*nvme0n1" | awk '{print int($2)}') spare=$(echo "$nvme_metrics" | grep "^nvme_available_spare_ratio.*nvme0n1" | awk '{print int($2 * 100)}') used=$(echo "$nvme_metrics" | grep "^nvme_percentage_used_ratio.*nvme0n1" | awk '{print int($2 * 100)}') errors=$(echo "$nvme_metrics" | grep "^nvme_media_errors_total.*nvme0n1" | awk '{print int($2)}') critical=$(echo "$nvme_metrics" | grep "^nvme_critical_warning.*nvme0n1" | awk '{print int($2)}') if [ ! -z "$temp" ]; then status="${GREEN}โ Normal${NC}" [ "$critical" -gt 0 ] && status="${RED}โ CRITICAL${NC}" [ "$temp" -ge 80 ] && [ "$temp" -lt 90 ] && status="${YELLOW}โก Warning${NC}" echocolor " โโ Status: $status" echocolor " โโ Temperature: ${CYAN}${temp}ยฐC${NC}" [ ! -z "$spare" ] && echocolor " โโ Available Spare: ${CYAN}${spare}%${NC}" [ ! -z "$used" ] && echocolor " โโ Percentage Used: ${CYAN}${used}%${NC}" [ ! -z "$errors" ] && echocolor " โโ Media Errors: ${CYAN}${errors}${NC}" else echocolor " ${YELLOW}No temperature data available${NC}" fielse echocolor " ${YELLOW}Unable to fetch NVMe metrics${NC}"fiechocolorechocolor "${BOLD}${BLUE}โถ System Load:${NC}"uptime | awk -v cyan="$CYAN" -v nc="$NC" '{printf " โโ Load Average: %s%.2f%s, %s%.2f%s, %s%.2f%s\n", cyan, $(NF-2), nc, cyan, $(NF-1), nc, cyan, $NF, nc}'echocolorechocolor "${BOLD}${BLUE}โถ GPU Status:${NC}"if command -v nvidia-smi &> /dev/null; then driver_version=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits 2>/dev/null) if [ ! -z "$driver_version" ]; then echocolor " โโ Driver: ${CYAN}${driver_version}${NC}"
installed_pkg=$(dpkg -l | grep "^ii.*nvidia-driver-" | awk '{print $2}' | head -n1) if [ ! -z "$installed_pkg" ]; then if [[ "$installed_pkg" == *"nvidia-driver-550"* ]]; then echocolor " โโ Status: ${GREEN}โ Using recommended driver${NC}" else echocolor " โโ Status: ${YELLOW}Consider updating to driver 550${NC}" fi fi fi
cuda_version=$(nvidia-smi -q | grep "CUDA Version" | awk '{print $NF}') if [ ! -z "$cuda_version" ]; then echocolor " โโ CUDA: ${CYAN}${cuda_version}${NC}" fi
gpu_model=$(lspci | grep -i "VGA.*NVIDIA" | cut -d: -f3) if [ ! -z "$gpu_model" ]; then echocolor " โโ Model:${CYAN}${gpu_model}${NC}" fi
gpu_info=$(nvidia-smi --query-gpu=temperature.gpu,utilization.gpu,memory.used,memory.total,power.draw,power.limit --format=csv,noheader,nounits 2>&1) if [[ ! "$gpu_info" == *"Failed to initialize NVML"* ]] && [ ! -z "$gpu_info" ]; then IFS=',' read -r temp util mem_used mem_total power_draw power_limit <<< "$gpu_info" echocolor " โโ Temperature: ${CYAN}${temp}ยฐC${NC}" echocolor " โโ Utilization: ${CYAN}${util}%${NC}" echocolor " โโ Memory: ${CYAN}${mem_used}/${mem_total} MB${NC}" echocolor " โโ Power: ${CYAN}${power_draw}W / ${power_limit}W${NC}" else echocolor " โโ ${YELLOW}GPU metrics unavailable${NC}" fielse echocolor " โโ ${YELLOW}NVIDIA tools not installed${NC}"fiechocolorechocolor "${BOLD}${BLUE}โถ Disk Space:${NC}"if command -v duf >/dev/null 2>&1; then # Preserve original duf output with all devices duf --style unicode \ --output mountpoint,size,used,avail,usage,type,filesystem \ --sort mountpointelse df -h / | awk -v cyan="$CYAN" -v nc="$NC" 'NR==2 {printf " โโ Usage: %s%s of %s (%s)%s\n", cyan, $3, $2, $5, nc}'fiechocolorechocolor "${BOLD}${BLUE}โถ Recent System Errors:${NC}"echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"display_errors() { local period=$1 local period_text=$2 local errors if ! errors=$(journalctl -p err..emerg --since "$period hours ago" --no-pager 2>/dev/null); then errors=$(sudo journalctl -p err..emerg --since "$period hours ago" --no-pager 2>/dev/null || echo "") fi local error_count=$(echo "$errors" | wc -l) echocolor " ${BOLD}${period_text}${NC}" if [ $error_count -eq 0 ]; then echocolor " โโ${GREEN}โ No errors in the last $period hours${NC}" echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ" else [ $error_count -gt 10 ] && echocolor " โโ${YELLOW}โก Found $error_count errors (grouped by type)${NC}" echo "$errors" | awk -v dim="$DIM" -v nc="$NC" -v yellow="$YELLOW" ' { # Create a normalized version of the line by removing PIDs and timestamps normalized = $0 gsub(/\[[0-9]+\]/, "[PID]", normalized) gsub(/[A-Z][a-z]+ [0-9]+ [0-9:]+/, "TIMESTAMP", normalized) gsub(/[0-9]+/, "N", normalized) # Replace all numbers with N
if (!(normalized in first)) { first[normalized] = $0 count[normalized] = 1 order[normalized] = ++total } else { count[normalized]++ } } END { n = 0 while (n < 10 && n < total) { max_count = 0 max_type = "" for (type in count) { if (count[type] > max_count) { max_count = count[type] max_type = type } } prefix = (n == 9 || n == total-1) ? " โโ" : " โโ" if (max_count > 1) { print prefix yellow "(" max_count " similar errors)" nc print " โ " first[max_type] } else { print prefix first[max_type] } if (n < 9 && n < total-1) print " โ" delete count[max_type] n++ } print " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ" }' fi}
display_errors 1 "Last hour"display_errors 6 "Last 6 hours"display_errors 12 "Last 12 hours"display_errors 24 "Last 24 hours"echocolorechocolor "${BOLD}${BLUE}โถ Maintenance Status:${NC}"echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
# Add startup health checks# Check systemd boot timeboot_time=$(systemd-analyze time 2>/dev/null | awk '{print $NF}')if [[ "$boot_time" =~ ^[0-9]+\.[0-9]+s$ ]]; then boot_seconds=$(echo "$boot_time" | sed 's/s//') if (( $(echo "$boot_seconds > 30" | bc -l) )); then echocolor " โโ ${YELLOW}โก Slow boot time: ${boot_time}${NC}" echocolor " โ ${DIM}Action: systemd-analyze blame${NC}" fifi
# Check for failed units during bootfailed_units=$(systemctl list-units --state=failed --no-legend | wc -l)if [ "$failed_units" -gt 0 ]; then echocolor " โโ ${YELLOW}โก $failed_units units failed during boot${NC}" echocolor " โ ${DIM}Action: systemctl list-units --state=failed${NC}"fi
# Check for masked units that might be importantmasked_critical=$(systemctl list-unit-files --state=masked | grep -E 'network|systemd-modules-load|systemd-sysctl|systemd-timesyncd' | wc -l)if [ "$masked_critical" -gt 0 ]; then echocolor " โโ ${YELLOW}โก Critical system units are masked${NC}" echocolor " โ ${DIM}Action: systemctl list-unit-files --state=masked${NC}"fi
# Check for kernel modules failing to loadfailed_modules=$(sudo dmesg 2>/dev/null | grep -i "failed to load" | wc -l)if [ "$failed_modules" -gt 0 ]; then echocolor " โโ ${YELLOW}โก $failed_modules kernel modules failed to load${NC}" echocolor " โ ${DIM}Action: sudo dmesg | grep -i 'failed to load'${NC}"fi
# Check systemd-journald statusjournald_status=$(systemctl is-active systemd-journald)if [ "$journald_status" != "active" ]; then echocolor " โโ ${YELLOW}โก systemd-journald is not active${NC}" echocolor " โ ${DIM}Action: sudo systemctl status systemd-journald${NC}"fi
# Check system updates with actionif ! updates=$(apt-get -s upgrade 2>/dev/null | grep -P '^\d+ upgraded' | cut -d" " -f1); then updates=$(sudo apt-get -s upgrade 2>/dev/null | grep -P '^\d+ upgraded' | cut -d" " -f1)fiif [ "$updates" -gt 0 ] 2>/dev/null; then echocolor " โโ ${YELLOW}โก $updates system updates available${NC}" echocolor " โ ${DIM}Action: sudo apt update && sudo apt upgrade${NC}"fi
# Check system reboot requirement with actionif [ -f /var/run/reboot-required ]; then echocolor " โโ ${YELLOW}โก System restart required${NC}" echocolor " โ ${DIM}Action: sudo reboot${NC}"fi
# Check disk space warnings with actiondisk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')if [ "$disk_usage" -gt 85 ]; then echocolor " โโ ${YELLOW}โก Root partition usage above 85%${NC}" echocolor " โ ${DIM}Action: sudo apt autoremove && sudo apt clean${NC}" echocolor " โ ${DIM} du -sh /* | sort -hr | head -n 10${NC}"fi
# Check SMART statusif command -v smartctl >/dev/null 2>&1; then smart_status=$(sudo smartctl -H /dev/nvme0n1 2>/dev/null | grep "SMART overall-health") if [[ "$smart_status" != *"PASSED"* ]]; then echocolor " โโ ${YELLOW}โก SMART health check failed${NC}" echocolor " โ ${DIM}Action: sudo smartctl -a /dev/nvme0n1${NC}" fifi
# Check firmware updatesif command -v fwupdmgr >/dev/null 2>&1; then if ! fwupdmgr refresh >/dev/null 2>&1 || \ ! fwupdmgr get-updates 2>&1 | grep -q "No updates available"; then fw_updates=$(fwupdmgr get-updates 2>&1) if [[ "$fw_updates" =~ "Updates available" ]]; then echocolor " โโ ${YELLOW}โก Firmware updates available${NC}" echocolor " โ ${DIM}Action: sudo fwupdmgr update${NC}" fi fifi
# Check system activityif [ -f "/var/log/sysstat/sa$(date +%d)" ]; then cpu_usage=$(sar -u 1 1 | tail -n1 | awk '{print 100-$NF}') if [ "$(echo "$cpu_usage > 90" | bc)" -eq 1 ]; then echocolor " โโ ${YELLOW}โก High CPU usage detected in system activity logs${NC}" echocolor " โ ${DIM}Action: sar -u -f /var/log/sysstat/sa$(date +%d)${NC}" fifi
# Check old logs with actionold_logs=$(find ~/logs/nvme -name "nvme_health_*.log" -mtime +30 2>/dev/null | wc -l)if [ $old_logs -gt 0 ]; then echocolor " โโ ${YELLOW}โก $old_logs log files older than 30 days${NC}" echocolor " โ ${DIM}Action: find ~/logs/nvme -name \"nvme_health_*.log\" -mtime +30 -delete${NC}"fi
# Check backup status with actionif [ ! -f ~/backups/scripts_$(date +%Y%m%d).tar.gz ]; then echocolor " โโ ${YELLOW}โก No script backup found for today${NC}" echocolor " โ ${DIM}Action: tar czf ~/backups/scripts_$(date +%Y%m%d).tar.gz ~/scripts/${NC}"fi
# Check systemd failed services with actionfailed_services=$(systemctl --failed --no-pager | grep "loaded units listed" | awk '{print $1}')if [ "$failed_services" -gt 0 ] 2>/dev/null; then echocolor " โโ ${YELLOW}โก $failed_services systemd services failed${NC}" echocolor " โ ${DIM}Action: systemctl --failed${NC}" echocolor " โ ${DIM} sudo systemctl reset-failed${NC}ew!xT44U"fi
# Check for zombie processes with actionzombies=$(ps aux | awk '{print $8}' | grep -c '^Z')if [ "$zombies" -gt 0 ]; then echocolor " โโ ${YELLOW}โก $zombies zombie processes detected${NC}" echocolor " โ ${DIM}Action: ps aux | grep Z${NC}" echocolor " โ ${DIM} sudo kill -9 <PID>${NC}"fi
# Check system load with actionload_5min=$(uptime | awk -F'load average:' '{print $2}' | awk -F, '{print $2}' | tr -d ' ')cpu_cores=$(nproc)bc_result=$(echo "$load_5min > $cpu_cores * 0.8" | bc -l)if [ "$bc_result" -eq 1 ] 2>/dev/null; then echocolor " โโ ${YELLOW}โก High system load detected${NC}" echocolor " โ ${DIM}Action: htop${NC}" echocolor " โ ${DIM} sudo nice -n 19 <process>${NC}"fi
# Check swap usage with actionswap_used=$(free | awk '/Swap/ {print $3}')swap_total=$(free | awk '/Swap/ {print $2}')if [ "$swap_total" -gt 0 ] 2>/dev/null; then swap_percent=$((swap_used * 100 / swap_total)) if [ "$swap_percent" -gt 80 ]; then echocolor " โโ ${YELLOW}โก Swap usage above 80%${NC}" echocolor " โ ${DIM}Action: sudo swapoff -a && sudo swapon -a${NC}" fifi
# If no issues foundif [ ! -f /var/run/reboot-required ] && \ [ "$updates" -eq 0 ] 2>/dev/null && \ [ "$disk_usage" -le 85 ] && \ [ $old_logs -eq 0 ] && \ [ -f ~/backups/scripts_$(date +%Y%m%d).tar.gz ] && \ [ "$failed_services" -eq 0 ] 2>/dev/null && \ [ "$zombies" -eq 0 ] && \ [ "$bc_result" -eq 0 ] 2>/dev/null && \ [ "$swap_percent" -le 80 ] 2>/dev/null && \ [[ "$smart_status" == *"PASSED"* ]] && \ [ "$(echo "$cpu_usage <= 90" | bc)" -eq 1 ]; then echocolor " โโ ${GREEN}โ All maintenance checks passed${NC}"fi
echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
echocolor "${BOLD}${BLUE}โถ Log Maintenance:${NC}"echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
# Get current user and groupcurrent_user=$(whoami)current_group=$(id -gn)
# Create directories if they don't existmkdir -p ~/logs/nvme 2>/dev/null
# Determine system log pathif [ -f "/var/log/syslog" ]; then syslog_path="/var/log/syslog"elif [ -f "/var/log/messages" ]; then syslog_path="/var/log/messages"else syslog_path="/var/log/journal"fi
# Create temporary logrotate config with proper permissions and path checkssudo tee /etc/logrotate.d/system_health.conf >/dev/null <<EOF$syslog_path { maxsize 5G rotate 7 daily compress delaycompress notifempty su root root missingok}
/var/lib/docker/containers/*/*.log { maxsize 1G rotate 3 daily compress delaycompress notifempty copytruncate su root root missingok}
$HOME/logs/nvme/nvme_health_*.log { maxage 30 rotate 5 monthly compress delaycompress notifempty su $current_user $current_group missingok}EOF
# Force rotation and show statusif sudo logrotate -f /etc/logrotate.d/system_health.conf; then echocolor " โโ ${GREEN}โ Logs rotated successfully${NC}" # Fix size reporting by summing up all related files syslog_size=$(sudo du -ch $syslog_path* 2>/dev/null | grep 'total$' | cut -f1) docker_size=$(sudo du -ch /var/lib/docker/containers 2>/dev/null | grep 'total$' | cut -f1) nvme_size=$(du -ch ~/logs/nvme 2>/dev/null | grep 'total$' | cut -f1) echocolor " โโ System Logs: ${CYAN}${syslog_size:-0B}${NC}" echocolor " โโ Docker Logs: ${CYAN}${docker_size:-0B}${NC}" echocolor " โโ NVMe Logs: ${CYAN}${nvme_size:-0B}${NC}"else echocolor " โโ ${RED}โ Log rotation failed${NC}"fi
# Cleanup temporary configsudo rm -f /etc/logrotate.d/system_health.conf
echocolor " โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ"
echocolor "${BOLD}${BLUE}โโโโโโโโโโโโโโโ End of Dashboard โโโโโโโโโโโโโโโ${NC}"echocolorechocolor "${DIM}Tools Used:${NC}"for pkg in "${!REQUIRED_PACKAGES[@]}"; do version="" case "$pkg" in "neofetch") version=$(neofetch --version | head -n1 | awk '{print $2}');; "nvidia-smi") version=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null);; "duf") version=$(duf --version 2>&1 | head -n1 | awk '{print $2}');; "logrotate") version=$(logrotate --version | head -n1 | awk '{print $2}');; "docker") version=$(docker --version | awk '{print $3}' | tr -d ',');; "nvme-cli") version=$(nvme --version 2>/dev/null | head -n1 | awk '{print $3}');; "smartmontools") version=$(smartctl --version | head -n1 | awk '{print $2}');; "fwupd") version=$(fwupdmgr --version 2>/dev/null | head -n1 | awk '{print $2}');; "sysstat") version=$(sar -V 2>&1 | head -n1 | awk '{print $4}');; "htop") version=$(htop --version | head -n1 | awk '{print $2}');; esac [ -n "$version" ] && echocolor "${DIM}โข ${pkg} v${version}${NC}"done