diff --git a/scripts/98-motd.sh b/scripts/98-motd.sh index a8e912a..d3a0224 100644 --- a/scripts/98-motd.sh +++ b/scripts/98-motd.sh @@ -1,24 +1,14 @@ -#!/usr/bin/env bash -set -euo pipefail -source ./lib.sh - -log "MOTD installieren …" - -install -d /usr/local/bin - cat >/usr/local/bin/mw-motd <<'SH' #!/usr/bin/env bash -set -euo pipefail +# bewusst KEIN "set -e"; MOTD soll nie hart abbrechen +set -u # Farben NC="\033[0m"; CY="\033[1;36m"; GR="\033[1;32m"; YE="\033[1;33m"; RD="\033[1;31m"; GY="\033[0;90m"; WH="\033[1;37m" # Installer-Variablen (optional) UI_HOST=""; WEBMAIL_HOST=""; MAIL_HOSTNAME=""; LE_EMAIL=""; PROXY_MODE=""; NPM_IP="" -if [ -r /etc/mailwolt/installer.env ]; then - # shellcheck disable=SC1091 - . /etc/mailwolt/installer.env || true -fi +[ -r /etc/mailwolt/installer.env ] && . /etc/mailwolt/installer.env || true # Aus .env (falls vorhanden) if [ -r /var/www/mailwolt/.env ]; then LE_EMAIL="${LE_EMAIL:-$(grep -E '^LE_EMAIL=' /var/www/mailwolt/.env 2>/dev/null | sed 's/^LE_EMAIL=//')}" @@ -26,7 +16,7 @@ if [ -r /var/www/mailwolt/.env ]; then NPM_IP="${NPM_IP:-$(grep -E '^NPM_IP=' /var/www/mailwolt/.env 2>/dev/null | sed 's/^NPM_IP=//')}" fi -# ASCII-Header +# Header printf "${CY}" cat <<'ASCII' :::: :::: ::: ::::::::::: ::: ::: ::: :::::::: ::: ::::::::::: @@ -39,28 +29,29 @@ cat <<'ASCII' ASCII printf "${NC}\n" +# Safe-Helfer (niemals Script killen) +grab() { eval "$1" 2>/dev/null || true; } +line() { printf "${GY}%-7s:${NC} %s\n" "$1" "$2"; } + # Systemdaten -now="$(date '+%Y-%m-%d %H:%M:%S %Z')" -fqdn="$(hostname -f 2>/dev/null || hostname)" -ip_int="$(hostname -I 2>/dev/null | awk '{print $1}')" -ip_ext=""; command -v curl >/dev/null 2>&1 && ip_ext="$(curl -fsS --max-time 1 https://ifconfig.me 2>/dev/null || true)" -upt="$(uptime -p 2>/dev/null || true)" -cores="$(nproc 2>/dev/null || echo -n '?')" -load="$(awk '{print $1" / "$2" / "$3}' /proc/loadavg 2>/dev/null)" +now="$(date '+%Y-%m-%d %H:%M:%S %Z' 2>/dev/null || echo -n '-')" +fqdn="$(hostname -f 2>/dev/null || hostname 2>/dev/null || echo -n '-')" +ip_int="$(hostname -I 2>/dev/null | awk '{print $1}' 2>/dev/null || true)" +ip_ext="$(curl -fsS --max-time 1 https://ifconfig.me 2>/dev/null || true)" +upt="$(uptime -p 2>/dev/null || echo -n '-')" +cores="$(nproc 2>/dev/null || echo -n '-')" +load="$(awk '{print $1" / "$2" / "$3}' /proc/loadavg 2>/dev/null || echo -n '-')" # RAM/SWAP (MiB) -mem_total="$(awk '/MemTotal/ {print int($2/1024)}' /proc/meminfo 2>/dev/null)" -mem_avail="$(awk '/MemAvailable/ {print int($2/1024)}' /proc/meminfo 2>/dev/null)" -mem_used=$(( (mem_total-mem_avail) )) -swap_total="$(awk '/SwapTotal/ {print int($2/1024)}' /proc/meminfo 2>/dev/null)" -swap_free="$(awk '/SwapFree/ {print int($2/1024)}' /proc/meminfo 2>/dev/null)" -swap_used=$(( (swap_total-swap_free) )) +mem_total="$(awk '/MemTotal/ {print int($2/1024)}' /proc/meminfo 2>/dev/null || echo -n '-')" +mem_avail="$(awk '/MemAvailable/ {print int($2/1024)}' /proc/meminfo 2>/dev/null || echo -n '0')" +mem_used=$(( ${mem_total:-0}-${mem_avail:-0} )) +swap_total="$(awk '/SwapTotal/ {print int($2/1024)}' /proc/meminfo 2>/dev/null || echo -n '-')" +swap_free="$(awk '/SwapFree/ {print int($2/1024)}' /proc/meminfo 2>/dev/null || echo -n '0')" +swap_used=$(( ${swap_total:-0}-${swap_free:-0} )) -# Disks (/, /var) -disk_line(){ - local mnt="$1" - df -hP "$mnt" 2>/dev/null | awk 'NR==2{printf "%s/%s (%s used)", $3,$2,$5}' -} +# Disks +disk_line(){ df -hP "$1" 2>/dev/null | awk 'NR==2{printf "%s/%s (%s used)", $3,$2,$5}'; } disk_root="$(disk_line /)" disk_var="$(disk_line /var)" @@ -73,48 +64,49 @@ svc_state(){ fi } -# Zeilen +# Ausgabe printf "${CY}Information as of:${NC} ${YE}%s${NC}\n" "$now" -printf "${GY}FQDN :${NC} %s\n" "$fqdn" +line "FQDN" "$fqdn" if [ -n "$ip_ext" ]; then - printf "${GY}IP :${NC} %s ${GY}(ext:${NC} %s${GY})${NC}\n" "${ip_int:-?}" "$ip_ext" + printf "${GY}%-7s:${NC} %s ${GY}(ext:${NC} %s${GY})${NC}\n" "IP" "${ip_int:--}" "$ip_ext" else - printf "${GY}IP :${NC} %s\n" "${ip_int:-?}" + line "IP" "${ip_int:--}" fi -printf "${GY}Uptime :${NC} %s\n" "${upt:-?}" -printf "${GY}CPU :${NC} %s cores, load %s (1/5/15)\n" "$cores" "${load:-?}" -printf "${GY}RAM :${NC} %s MiB used / %s MiB total\n" "${mem_used:-?}" "${mem_total:-?}" -printf "${GY}SWAP :${NC} %s MiB used / %s MiB total\n" "${swap_used:-?}" "${swap_total:-?}" -printf "${GY}Disk / :${NC} %s\n" "${disk_root:-?}" -printf "${GY}Disk/var:${NC} %s\n" "${disk_var:-?}" +line "Uptime" "$upt" +printf "${GY}%-7s:${NC} %s cores, load %s (1/5/15)\n" "CPU" "$cores" "$load" +printf "${GY}%-7s:${NC} %s MiB used / %s MiB total\n" "RAM" "$mem_used" "$mem_total" +printf "${GY}%-7s:${NC} %s MiB used / %s MiB total\n" "SWAP" "$swap_used" "$swap_total" +line "Disk /" "${disk_root:-'-'}" +line "Disk/var" "${disk_var:-'-'}" # App/Installer Infos -[ -n "$LE_EMAIL" ] && printf "${GY}LE E-Mail:${NC} %s\n" "$LE_EMAIL" -[ -n "$UI_HOST" ] && printf "${GY}UI Host :${NC} %s\n" "$UI_HOST" -[ -n "$WEBMAIL_HOST" ] && printf "${GY}Webmail :${NC} %s\n" "$WEBMAIL_HOST" -[ -n "$MAIL_HOSTNAME" ]&& printf "${GY}MX Host :${NC} %s\n" "$MAIL_HOSTNAME" +[ -n "${LE_EMAIL:-}" ] && line "LE Mail" "$LE_EMAIL" +[ -n "${UI_HOST:-}" ] && line "UI" "$UI_HOST" +[ -n "${WEBMAIL_HOST:-}" ] && line "Webmail" "$WEBMAIL_HOST" +[ -n "${MAIL_HOSTNAME:-}" ]&& line "MX" "$MAIL_HOSTNAME" if [ -n "${PROXY_MODE:-}" ]; then if [ "$PROXY_MODE" = "1" ]; then - printf "${GY}Proxy :${NC} ja (NPM: %s)\n" "${NPM_IP:-unbekannt}" + line "Proxy" "ja (NPM: ${NPM_IP:-unbekannt})" + elif [ "$PROXY_MODE" = "dev" ]; then + line "Proxy" "Entwicklungsmodus" else - printf "${GY}Proxy :${NC} nein\n" + line "Proxy" "nein" fi fi # Services printf "${WH}\nServices:${NC}\n" -printf " nginx … %b\n" "$(svc_state nginx)" -printf " mariadb … %b\n" "$(svc_state mariadb)" -printf " redis-server … %b\n" "$(svc_state redis-server)" -printf " postfix … %b\n" "$(svc_state postfix)" -printf " dovecot … %b\n" "$(svc_state dovecot)" -# App Units (optional) -printf " mailwolt-ws … %b\n" "$(svc_state mailwolt-ws)" -printf " mailwolt-queue… %b\n" "$(svc_state mailwolt-queue)" -printf " mailwolt-schedule … %b\n" "$(svc_state mailwolt-schedule)" +printf " nginx … %b\n" "$(svc_state nginx)" +printf " mariadb … %b\n" "$(svc_state mariadb)" +printf " redis-server … %b\n" "$(svc_state redis-server)" +printf " postfix … %b\n" "$(svc_state postfix)" +printf " dovecot … %b\n" "$(svc_state dovecot)" +printf " mailwolt-ws … %b\n" "$(svc_state mailwolt-ws)" +printf " mailwolt-queue … %b\n" "$(svc_state mailwolt-queue)" +printf " mailwolt-schedule … %b\n" "$(svc_state mailwolt-schedule)" -# Zertifikate (kurzer Hinweis, optional) -show_cert_hint(){ +# Zertifikatskurzinfo (nur wenn vorhanden) +show_cert_exp(){ local name="$1" path="$2" if [ -r "$path" ]; then local exp @@ -122,32 +114,14 @@ show_cert_hint(){ [ -n "$exp" ] && printf "${GY}%s cert:${NC} expires %s\n" "$name" "$exp" fi } -show_cert_hint "UI" "/etc/ssl/ui/fullchain.pem" -show_cert_hint "Webmail" "/etc/ssl/webmail/fullchain.pem" -show_cert_hint "MX" "/etc/ssl/mail/fullchain.pem" +show_cert_exp "UI" "/etc/ssl/ui/fullchain.pem" +show_cert_exp "Webmail" "/etc/ssl/webmail/fullchain.pem" +show_cert_exp "MX" "/etc/ssl/mail/fullchain.pem" -echo +exit 0 SH +chmod 755 /usr/local/bin/mw-motd -chmod +x /usr/local/bin/mw-motd - -# update-motd integration -if [[ -d /etc/update-motd.d ]]; then - cat >/etc/update-motd.d/10-mailwolt <<'SH' -#!/usr/bin/env bash -/usr/local/bin/mw-motd -SH - chmod +x /etc/update-motd.d/10-mailwolt - [[ -f /etc/update-motd.d/50-motd-news ]] && chmod -x /etc/update-motd.d/50-motd-news || true -else - # Fallback für Systeme ohne dynamic MOTD - cat >/etc/profile.d/10-mailwolt-motd.sh <<'SH' -case "$-" in *i*) /usr/local/bin/mw-motd ;; esac -SH -fi - -# altes /etc/motd leeren (sonst doppelt) -: > /etc/motd 2>/dev/null || true ##!/usr/bin/env bash #set -euo pipefail