Initial Go project built with Bubble Tea and Lip Gloss: - Live preview and management of /etc/update-motd.d scripts - Embedded presets (ubuntu-default, minimal, server-dashboard) - Bundled POSIX sh style scripts (brand header, sysinfo panel, footer) - Snapshot/restore safety around applying changes - CLI subcommands preview, apply, restore, list-presets - Unit tests for detect, sanitize, and apply logic
66 lines
2.2 KiB
Bash
66 lines
2.2 KiB
Bash
#!/bin/sh
|
|
# motd-assist :: sysinfo-panel — Load, Speicher, Disk und Updates als farbige Balken
|
|
set -u
|
|
|
|
E=$(printf '\033')
|
|
GREEN="${E}[38;5;114m"
|
|
YELLOW="${E}[38;5;221m"
|
|
RED="${E}[38;5;203m"
|
|
LBLUE="${E}[38;5;75m"
|
|
DIM="${E}[2m"
|
|
R="${E}[0m"
|
|
|
|
BAR=22
|
|
|
|
# bar <used> <total> — farbiger Balken mit Prozentanzeige
|
|
bar() {
|
|
awk -v u="$1" -v t="$2" -v b="$BAR" -v g="$GREEN" -v y="$YELLOW" -v r="$RED" -v d="$DIM" -v rset="$R" 'BEGIN{
|
|
if (t <= 0) { printf "%sn/a%s", d, rset; exit }
|
|
pct = u * 100 / t
|
|
if (pct > 100) pct = 100
|
|
f = int(pct / 100 * b + 0.5)
|
|
c = (pct < 60) ? g : ((pct < 85) ? y : r)
|
|
s = c
|
|
for (i = 0; i < f; i++) s = s "━"
|
|
s = s d
|
|
for (i = f; i < b; i++) s = s "·"
|
|
printf "%s%s%s %s%3d%%%s", s, rset, c, c, pct, rset
|
|
}'
|
|
}
|
|
|
|
mem=$(awk '/^MemTotal:/ {t=$2} /^MemAvailable:/ {a=$2} END {if (t>0) printf "%.0f %.0f", t-a, t}' /proc/meminfo 2>/dev/null)
|
|
[ -n "$mem" ] && printf '%b\n' "$LBLUE MEM $DIM│$R $(bar $mem)"
|
|
|
|
disk=$(df -P / 2>/dev/null | awk 'NR==2 {gsub("%","",$5); print $5}')
|
|
[ -n "$disk" ] && printf '%b\n' "$LBLUE DISK $DIM│$R $(bar $disk 100)"
|
|
|
|
if [ -r /proc/loadavg ]; then
|
|
load=$(awk '{print $1}' /proc/loadavg)
|
|
ncpu=$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1)
|
|
case $ncpu in ''|*[!0-9]*) ncpu=1 ;; esac
|
|
awk -v l="$load" -v n="$ncpu" -v b="$BAR" -v g="$GREEN" -v y="$YELLOW" -v r="$RED" -v d="$DIM" -v rset="$R" -v lbl="$LBLUE" 'BEGIN{
|
|
pct = l * 100 / n
|
|
if (pct > 100) pct = 100
|
|
f = int(pct / 100 * b + 0.5)
|
|
c = (pct < 60) ? g : ((pct < 85) ? y : r)
|
|
s = c
|
|
for (i = 0; i < f; i++) s = s "━"
|
|
s = s d
|
|
for (i = f; i < b; i++) s = s "·"
|
|
printf "%s LOAD %s│%s %s%s%s %s%s/%s%s\n", lbl, d, rset, s, rset, c, c, l, n, rset
|
|
}'
|
|
fi
|
|
|
|
if [ -r /var/lib/update-notifier/updates-available ]; then
|
|
upd=$(awk 'NR==1 {print $1; exit}' /var/lib/update-notifier/updates-available 2>/dev/null)
|
|
case $upd in
|
|
''|*[!0-9]*) ;;
|
|
*)
|
|
awk -v n="$upd" -v g="$GREEN" -v y="$YELLOW" -v r="$RED" -v d="$DIM" -v rset="$R" -v lbl="$LBLUE" 'BEGIN{
|
|
c = (n == 0) ? g : ((n < 20) ? y : r)
|
|
txt = (n == 0) ? "System ist auf dem aktuellen Stand" : n " Paket-Updates verfügbar"
|
|
printf "%s UPD %s│%s %s%s%s\n", lbl, d, rset, c, txt, rset
|
|
}'
|
|
;;
|
|
esac
|
|
fi
|