#!/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 # 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 # 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=//')}" PROXY_MODE="${PROXY_MODE:-$(grep -E '^PROXY_MODE=' /var/www/mailwolt/.env 2>/dev/null | sed 's/^PROXY_MODE=//')}" NPM_IP="${NPM_IP:-$(grep -E '^NPM_IP=' /var/www/mailwolt/.env 2>/dev/null | sed 's/^NPM_IP=//')}" fi # ASCII-Header printf "${CY}" cat <<'ASCII' :::: :::: ::: ::::::::::: ::: ::: ::: :::::::: ::: ::::::::::: +:+:+: :+:+:+ :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: +:+ +:+:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +#+ +:+ +#+ +#++:++#++: +#+ +#+ +#+ +:+ +#+ +#+ +:+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+#+ +#+ +#+ +#+ +#+ +#+ #+# #+# #+# #+# #+# #+# #+#+# #+#+# #+# #+# #+# #+# ### ### ### ### ########### ########## ### ### ######## ########## ### ASCII printf "${NC}\n" # 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)" # 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) )) # Disks (/, /var) disk_line(){ local mnt="$1" df -hP "$mnt" 2>/dev/null | awk 'NR==2{printf "%s/%s (%s used)", $3,$2,$5}' } disk_root="$(disk_line /)" disk_var="$(disk_line /var)" svc_state(){ local unit="$1" if systemctl is-active --quiet "$unit"; then printf "${GR}OK${NC}" else printf "${RD}FAIL${NC}" fi } # Zeilen printf "${CY}Information as of:${NC} ${YE}%s${NC}\n" "$now" printf "${GY}FQDN :${NC} %s\n" "$fqdn" if [ -n "$ip_ext" ]; then printf "${GY}IP :${NC} %s ${GY}(ext:${NC} %s${GY})${NC}\n" "${ip_int:-?}" "$ip_ext" else printf "${GY}IP :${NC} %s\n" "${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:-?}" # 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" if [ -n "${PROXY_MODE:-}" ]; then if [ "$PROXY_MODE" = "1" ]; then printf "${GY}Proxy :${NC} ja (NPM: %s)\n" "${NPM_IP:-unbekannt}" else printf "${GY}Proxy :${NC} nein\n" 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)" # Zertifikate (kurzer Hinweis, optional) show_cert_hint(){ local name="$1" path="$2" if [ -r "$path" ]; then local exp exp="$(openssl x509 -in "$path" -noout -enddate 2>/dev/null | sed 's/notAfter=//')" [ -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" echo SH 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 #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 #NC="\033[0m"; CY="\033[1;36m"; GR="\033[1;32m"; YE="\033[1;33m"; RD="\033[1;31m"; GY="\033[0;90m" #printf "\033[1;36m" #cat <<'ASCII' #:::: :::: ::: ::::::::::: ::: ::: ::: :::::::: ::: ::::::::::: #+:+:+: :+:+:+ :+: :+: :+: :+: :+: :+: :+: :+: :+: :+: #+:+ +:+:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ +:+ #+#+ +:+ +#+ +#++:++#++: +#+ +#+ +#+ +:+ +#+ +#+ +:+ +#+ +#+ #+#+ +#+ +#+ +#+ +#+ +#+ +#+ +#+#+ +#+ +#+ +#+ +#+ +#+ ##+# #+# #+# #+# #+# #+# #+#+# #+#+# #+# #+# #+# #+# #### ### ### ### ########### ########## ### ### ######## ########## ### #ASCII #printf "\033[0m\n" #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 -s --max-time 1 https://ifconfig.me || 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)" #svc(){ systemctl is-active --quiet "$1" && echo -e "${GR}OK${NC}" || echo -e "${RD}FAIL${NC}"; } #printf "${CY}Information as of:${NC} ${YE}%s${NC}\n" "$now" #printf "${GY}FQDN :${NC} %s\n" "$fqdn" #if [ -n "$ip_ext" ]; then printf "${GY}IP :${NC} %s ${GY}(ext:${NC} %s${GY})${NC}\n" "${ip_int:-?}" "$ip_ext"; else printf "${GY}IP :${NC} %s\n" "${ip_int:-?}"; fi #printf "${GY}Uptime :${NC} %s\n" "${upt:-?}" #printf "${GY}Cores :${NC} %s\n" "$cores" #printf "${GY}Load :${NC} %s (1/5/15)\n" "${load:-?}" #printf "${GY}Svc :${NC} postfix: $(svc postfix) dovecot: $(svc dovecot) nginx: $(svc nginx) mariadb: $(svc mariadb) redis: $(svc redis)\n" #SH #chmod +x /usr/local/bin/mw-motd # #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 # cat >/etc/profile.d/10-mailwolt-motd.sh <<'SH' #case "$-" in *i*) /usr/local/bin/mw-motd ;; esac #SH #fi #: > /etc/motd 2>/dev/null || true