Added upgrade features, cat, multi-selector, new-menu

This commit is contained in:
2026-08-26 16:19:38 +01:00
parent 97d9ae202a
commit 9ebb62f13e
4 changed files with 1109 additions and 901 deletions
+173 -138
View File
@@ -1,168 +1,204 @@
#!/bin/bash
############# DEPENDENCIES #############
# - Debian Based OS (for now)
# - curl
# - lm-sensors
# apt update && apt install curl lm-sensors
# - lm-sensors (optional for temp)
# - jq (optional)
############################################
colorize() {
local value=$1
local green_limit=$2
local yellow_limit=$3
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
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 # Change this value to set the timing cache for checking the public IP.
MIN_CHECK_UPDATE=120 # Change this value to set the timing cache for checking updates.
LOCAL_CACHE=1 # Change this value to 1 if you want to create the local cache in the ~/.bashrc.d/.dashboard_cache.
UI_SHOWS=1 # Change to 1 if cockpit has been installed. This will shows the IP and port Link.
#### 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}"
#### 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/$(whoami)/.bashrc.d/.dashboard_cache"
fi
mkdir -p "$CACHE_DIR"
#### Overview ####
echo -e "${CYAN}========================================${NC}"
echo -e "${BOLD} 🖥️ SYSTEM OVERVIEW${NC}"
echo -e "${CYAN}========================================${NC}"
#### OS Informations Include ####
#### OS Informations Include ####
if [ -f /etc/os-release ]; then
# shellcheck disable=SC1091
source /etc/os-release
#### OS info ###
echo -e "${CYAN}DISTRO:${NC} $PRETTY_NAME"
echo -e "${CYAN}DISTRO:${NC} ${PRETTY_NAME:-$ID}"
echo -e "${CYAN}ID:${NC} $ID"
echo -e "${CYAN}VERSION:${NC} $VERSION"
echo -e "${CYAN}URL:${NC} $HOME_URL"
echo -e "${CYAN}BUGS_URL:${NC} $BUG_REPORT_URL"
[ -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
#### 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?)"
if [ $UI_SHOWS -eq 1 ]; then echo "🌐 Web UI: NOT AVAILABLE"; fi
else
echo "🏠 Local IP: $LOCAL_IPS"
if [ $UI_SHOWS -eq 1 ]; then echo "🌐 Web UI: http://$PRIMARY_IP:9090"; fi
# 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
#### Public IP ####
if [ -f "$CACHE_DIR/public_ip" ] && find "$CACHE_DIR/public_ip" -mmin -$MIN_CHECK_IP | grep -q .; then
PUBLIC_IP=$(cat "$CACHE_DIR/public_ip")
else
PUBLIC_IP=$(timeout 2 curl -s ifconfig.me 2>/dev/null)
if [ -n "$PUBLIC_IP" ]; then
echo "$PUBLIC_IP" > "$CACHE_DIR/public_ip"
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
if [ -z "$PUBLIC_IP" ]; then
echo "🌍 Public IP: NOT AVAILABLE (no internet?)"
else
echo "🌍 Public IP: $PUBLIC_IP"
# 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
#echo ""
echo -e "${CYAN} .................................. ${NC}"
#### Cpu ####
# 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)" 'BEGIN {printf "%d", (l*100/n)}')
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 ####
read MEM_TOTAL MEM_USED <<< $(free -m | awk '/Mem:/ {print $2, $3}')
MEM_PCT=$((MEM_USED * 100 / MEM_TOTAL))
MEM_COLOR=$(colorize "$MEM_PCT" 50 80)
echo -e "💾 RAM: ${MEM_COLOR}% (${MEM_USED}/${MEM_TOTAL}MB)"
#### Diskspace ####
DISK_PCT=$(df / | awk 'NR==2 {gsub("%",""); print $5}')
DISK_COLOR=$(colorize "$DISK_PCT" 50 80)
DISK=$(df -h / | awk 'NR==2 {print $3 "/" $2}')
echo -e "📦 Disk: ${DISK} (${DISK_COLOR}%)"
#### Uptime ####
echo "⏱️ Uptime: $(awk '{printf "%dd %dh %dm", $1/86400, ($1%86400)/3600, ($1%3600)/60}' /proc/uptime)"
#### Load Avarage ####
echo "📊 Load avg: $(awk '{print $1, $2, $3}' /proc/loadavg)"
#### Updates ####
if command -v apt >/dev/null 2>&1; then
if [ -f "$CACHE_DIR/updates" ] && find "$CACHE_DIR/updates" -mmin -$MIN_CHECK_UPDATE | grep -q .; then
UPDATES=$(cat "$CACHE_DIR/updates")
else
UPDATES=$(apt list --upgradable 2>/dev/null | wc -l)
UPDATES=$((UPDATES - 1))
echo "$UPDATES" > "$CACHE_DIR/updates"
fi
## 🎨 Dinamic Color ##
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"
#### 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
#### Temperature ####
if [ $ISTHISVM -ne 1 ]; then
if [ -f /sys/class/thermal/thermal_zone0/temp ]; then
TEMP_RAW=$(cat /sys/class/thermal/thermal_zone0/temp)
#### 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
@@ -176,12 +212,11 @@ function dashboard_fast() {
echo -e "🌡️ Temp: $TEMP_COLOR"
fi
fi
fi
echo -e "${CYAN}========================================${NC}"
echo -e "${CYAN}========================================${NC}"
}
if [[ $- == *i* ]]; then
dashboard_fast
dashboard_fast
fi