#!/bin/bash ############# DEPENDENCIES ############# # - curl # - lm-sensors (optional for temp) # - jq (optional) ############################################ colorize() { local value=$1 local green_limit=$2 local yellow_limit=$3 if [ "$value" -lt "$green_limit" ]; then echo -e "${GREEN}${value}${NC}" elif [ "$value" -lt "$yellow_limit" ]; then echo -e "${YELLOW}${value}${NC}" else echo -e "${RED}${value}${NC}" fi } function dashboard_fast() { #### CHANGABLE OPTIONS #### ISTHISVM=0 # Change to 1 if this is a VM. This will remove the temperature bit. MIN_CHECK_IP=30 # Timing cache (minutes) for checking the public IP. MIN_CHECK_UPDATE=120 # Timing cache (minutes) for checking updates. LOCAL_CACHE=1 # 1: ~/.bashrc.d/.dashboard_cache, 0: /tmp/.dashboard_cache #### Colors #### GREEN="\e[32m" YELLOW="\e[33m" RED="\e[31m" CYAN="\e[36m" BOLD="\e[1m" NC="\e[0m" # reset #### Cache #### if [ $LOCAL_CACHE -ne 1 ]; then CACHE_DIR="/tmp/.dashboard_cache" else CACHE_DIR="${HOME}/.bashrc.d/.dashboard_cache" fi mkdir -p "$CACHE_DIR" 2>/dev/null #### Overview #### echo -e "${CYAN}========================================${NC}" echo -e "${BOLD} 🖥️ SYSTEM OVERVIEW${NC}" echo -e "${CYAN}========================================${NC}" #### OS Informations Include #### if [ -f /etc/os-release ]; then # shellcheck disable=SC1091 source /etc/os-release echo -e "${CYAN}DISTRO:${NC} ${PRETTY_NAME:-$ID}" echo -e "${CYAN}ID:${NC} $ID" [ -n "$VERSION" ] && echo -e "${CYAN}VERSION:${NC} $VERSION" [ -n "$HOME_URL" ] && echo -e "${CYAN}URL:${NC} $HOME_URL" [ -n "$BUG_REPORT_URL" ] && echo -e "${CYAN}BUGS_URL:${NC} $BUG_REPORT_URL" echo -e "${CYAN}========================================${NC}" fi #### Hostname #### echo "📛 $(hostname)" #### Local IP #### LOCAL_IPS=$(hostname -I 2>/dev/null | xargs) PRIMARY_IP=$(echo "$LOCAL_IPS" | awk '{print $1}') if [ -z "$LOCAL_IPS" ]; then echo "🏠 Local IP: NOT AVAILABLE (no network?)" else echo "🏠 Local IP: $LOCAL_IPS" fi #### Cockpit Web UI Auto-Detection #### COCKPIT_DETECTED=0 COCKPIT_PORT="" # Check if cockpit is installed or socket/service exists if command -v cockpit-ws >/dev/null 2>&1 || command -v cockpit-bridge >/dev/null 2>&1 || [ -d /etc/cockpit ] || systemctl list-unit-files 2>/dev/null | grep -q "cockpit.socket"; then COCKPIT_DETECTED=1 # 1. Search port in /etc/cockpit/cockpit.conf if [ -f /etc/cockpit/cockpit.conf ]; then COCKPIT_PORT=$(grep -Ei '^\s*(Port|Listen)\s*=' /etc/cockpit/cockpit.conf 2>/dev/null | head -n1 | awk -F= '{print $2}' | tr -d ' ') fi # 2. Search port in systemd socket definition if [ -z "$COCKPIT_PORT" ] && command -v systemctl >/dev/null 2>&1; then COCKPIT_PORT=$(systemctl cat cockpit.socket 2>/dev/null | grep -E '^ListenStream=' | head -n1 | awk -F= '{print $2}' | tr -d ' ') fi # 3. Search port in listening sockets if [ -z "$COCKPIT_PORT" ] && command -v ss >/dev/null 2>&1; then COCKPIT_PORT=$(ss -tlnp 2>/dev/null | grep -E 'cockpit|cockpit-ws' | awk '{print $4}' | awk -F: '{print $NF}' | head -n1) fi # 4. Default fallback port for Cockpit is 9090 if [ -z "$COCKPIT_PORT" ]; then COCKPIT_PORT=9090 fi fi if [ $COCKPIT_DETECTED -eq 1 ] && [ -n "$PRIMARY_IP" ]; then echo -e "🌐 Cockpit UI: ${GREEN}https://${PRIMARY_IP}:${COCKPIT_PORT}${NC}" fi #### Public IP #### if [ -f "$CACHE_DIR/public_ip" ] && find "$CACHE_DIR/public_ip" -mmin -$MIN_CHECK_IP | grep -q . 2>/dev/null; then PUBLIC_IP=$(cat "$CACHE_DIR/public_ip" 2>/dev/null) else PUBLIC_IP=$(timeout 2 curl -s ifconfig.me 2>/dev/null) if [ -n "$PUBLIC_IP" ]; then echo "$PUBLIC_IP" > "$CACHE_DIR/public_ip" 2>/dev/null fi fi if [ -z "$PUBLIC_IP" ]; then echo "🌍 Public IP: NOT AVAILABLE (no internet?)" else echo "🌍 Public IP: $PUBLIC_IP" fi echo -e "${CYAN} .................................. ${NC}" #### Cpu #### if [ -r /proc/loadavg ]; then LOAD=$(awk '{print $1}' /proc/loadavg) CPU_PCT=$(awk -v l="$LOAD" -v n="$(nproc 2>/dev/null || echo 1)" 'BEGIN {printf "%d", (l*100/n)}') CPU_COLOR=$(colorize "$CPU_PCT" 50 80) echo -e "🧠 CPU: ${CPU_COLOR}%" fi #### Ram #### if command -v free >/dev/null 2>&1; then read -r MEM_TOTAL MEM_USED <<< "$(free -m | awk '/Mem:/ {print $2, $3}')" if [ -n "$MEM_TOTAL" ] && [ "$MEM_TOTAL" -gt 0 ]; then MEM_PCT=$((MEM_USED * 100 / MEM_TOTAL)) MEM_COLOR=$(colorize "$MEM_PCT" 50 80) echo -e "💾 RAM: ${MEM_COLOR}% (${MEM_USED}/${MEM_TOTAL}MB)" fi fi #### Diskspace #### if command -v df >/dev/null 2>&1; then DISK_PCT=$(df / 2>/dev/null | awk 'NR==2 {gsub("%",""); print $5}') DISK_COLOR=$(colorize "${DISK_PCT:-0}" 50 80) DISK=$(df -h / 2>/dev/null | awk 'NR==2 {print $3 "/" $2}') echo -e "📦 Disk: ${DISK} (${DISK_COLOR}%)" fi #### Uptime #### if [ -r /proc/uptime ]; then echo "⏱️ Uptime: $(awk '{printf "%dd %dh %dm", $1/86400, ($1%86400)/3600, ($1%3600)/60}' /proc/uptime)" fi #### Load Average #### if [ -r /proc/loadavg ]; then echo "📊 Load avg: $(awk '{print $1, $2, $3}' /proc/loadavg)" fi #### Updates (Cross-Distro) #### if [ -f "$CACHE_DIR/updates" ] && find "$CACHE_DIR/updates" -mmin -$MIN_CHECK_UPDATE | grep -q . 2>/dev/null; then UPDATES=$(cat "$CACHE_DIR/updates" 2>/dev/null) else UPDATES=0 if command -v apt >/dev/null 2>&1; then UPDATES=$(apt list --upgradable 2>/dev/null | grep -c "upgradable from" 2>/dev/null || true) elif command -v dnf >/dev/null 2>&1; then UPDATES=$(dnf check-update -q 2>/dev/null | grep -E '\.(x86_64|noarch|aarch64|i686)' | wc -l) elif command -v pacman >/dev/null 2>&1; then UPDATES=$(checkupdates 2>/dev/null | wc -l || pacman -Qu 2>/dev/null | wc -l) elif command -v zypper >/dev/null 2>&1; then UPDATES=$(zypper list-updates 2>/dev/null | grep -c '^v ' || true) elif command -v apk >/dev/null 2>&1; then UPDATES=$(apk version -l '<' 2>/dev/null | wc -l) else UPDATES="N/A" fi echo "$UPDATES" > "$CACHE_DIR/updates" 2>/dev/null fi ## Dynamic Color for Updates ## if [[ "$UPDATES" =~ ^[0-9]+$ ]]; then if [ "$UPDATES" -eq 0 ]; then UPD_COLOR="${GREEN}${UPDATES}${NC}" elif [ "$UPDATES" -le 20 ]; then UPD_COLOR="${YELLOW}${UPDATES}${NC}" else UPD_COLOR="${RED}${UPDATES}${NC}" fi echo -e "📦 Updates: $UPD_COLOR" else echo "📦 Updates: N/A" fi #### Temperature #### if [ $ISTHISVM -ne 1 ]; then if [ -f /sys/class/thermal/thermal_zone0/temp ]; then TEMP_RAW=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null) if [ -n "$TEMP_RAW" ]; then TEMP=$((TEMP_RAW/1000)) if [ "$TEMP" -lt 50 ]; then TEMP_COLOR="${GREEN}${TEMP}°C${NC}" elif [ "$TEMP" -lt 70 ]; then TEMP_COLOR="${YELLOW}${TEMP}°C${NC}" else TEMP_COLOR="${RED}${TEMP}°C${NC}" fi echo -e "🌡️ Temp: $TEMP_COLOR" fi fi fi echo -e "${CYAN}========================================${NC}" } if [[ $- == *i* ]]; then dashboard_fast fi