#!/bin/bash # # set-mattermost-notices.sh # # Setzt in der Mattermost config.json die beiden Parameter # AnnouncementSettings.AdminNoticesEnabled = false # AnnouncementSettings.UserNoticesEnabled = false # # Eigenschaften: # - installiert 'jq' automatisch nach, falls es fehlt # - funktioniert unabhaengig davon, ob "AnnouncementSettings" und/oder # die einzelnen Parameter bereits existieren oder nicht # - legt vor jeder Aenderung ein Backup an # - stellt im Fehlerfall automatisch das Backup wieder her # - gibt fuer jeden Schritt eine farbige Statuszeile aus # ( [ OK ] in gruen, [ ERROR ] in rot ) set -uo pipefail # --------------------------------------------------------------------------- # Variablen / Konfiguration # --------------------------------------------------------------------------- CONFIG_FILE="/opt/mattermost/config/config.json" BACKUP_FILE="${CONFIG_FILE}.bak.$(date +%Y%m%d-%H%M%S)" TMP_FILE="$(mktemp)" # Merker, ob bereits ein Backup angelegt wurde (fuer den Fehlerfall) BACKUP_CREATED=0 # Farben fuer die Statusausgabe COLOR_GREEN="\033[0;32m" COLOR_RED="\033[0;31m" COLOR_RESET="\033[0m" # --------------------------------------------------------------------------- # Hilfsfunktionen fuer die Statusausgabe # --------------------------------------------------------------------------- # Gibt eine Erfolgszeile aus, z.B.: [ OK ] jq ist installiert print_ok() { local message="$1" echo -e "[ ${COLOR_GREEN}OK${COLOR_RESET} ] ${message}" } # Gibt eine Fehlerzeile aus, stellt bei Bedarf das Backup wieder her # und beendet das Skript mit Exit-Code 1. print_error_and_exit() { local message="$1" echo -e "[ ${COLOR_RED}ERROR${COLOR_RESET} ] ${message}" # Falls bereits ein Backup existiert, Originaldatei wiederherstellen if [[ "${BACKUP_CREATED}" -eq 1 && -f "${BACKUP_FILE}" ]]; then if cp -p "${BACKUP_FILE}" "${CONFIG_FILE}" 2> /dev/null; then echo -e "[ ${COLOR_GREEN}OK${COLOR_RESET} ] Vorherige Konfiguration aus Backup wiederhergestellt" else echo -e "[ ${COLOR_RED}ERROR${COLOR_RESET} ] Wiederherstellung aus Backup fehlgeschlagen: ${BACKUP_FILE}" fi fi # Aufraeumen der temporaeren Datei rm -f "${TMP_FILE}" echo "" exit 1 } # --------------------------------------------------------------------------- # Ausgabe: fuehrende Leerzeile # --------------------------------------------------------------------------- echo "" # --------------------------------------------------------------------------- # Schritt 1: Pruefen / Installieren von jq # --------------------------------------------------------------------------- if command -v jq &> /dev/null; then print_ok "jq ist bereits installiert" else echo "jq ist nicht installiert, versuche Installation..." if ! apt-get update -qq; then print_error_and_exit "apt-get update ist fehlgeschlagen" fi if ! apt-get install -y -qq jq; then print_error_and_exit "Installation von jq ist fehlgeschlagen" fi if command -v jq &> /dev/null; then print_ok "jq wurde erfolgreich installiert" else print_error_and_exit "jq konnte nicht installiert werden" fi fi # --------------------------------------------------------------------------- # Schritt 2: Pruefen, ob die Konfigurationsdatei existiert # --------------------------------------------------------------------------- if [[ -f "${CONFIG_FILE}" ]]; then print_ok "Konfigurationsdatei gefunden: ${CONFIG_FILE}" else print_error_and_exit "Konfigurationsdatei '${CONFIG_FILE}' wurde nicht gefunden" fi # --------------------------------------------------------------------------- # Schritt 3: Pruefen, ob die Datei valides JSON enthaelt # --------------------------------------------------------------------------- if jq empty "${CONFIG_FILE}" 2> /dev/null; then print_ok "Konfigurationsdatei enthaelt valides JSON" else print_error_and_exit "'${CONFIG_FILE}' enthaelt kein valides JSON" fi # --------------------------------------------------------------------------- # Schritt 4: Backup der Originaldatei anlegen # --------------------------------------------------------------------------- if cp -p "${CONFIG_FILE}" "${BACKUP_FILE}"; then BACKUP_CREATED=1 print_ok "Backup erstellt: ${BACKUP_FILE}" else print_error_and_exit "Backup konnte nicht erstellt werden" fi # --------------------------------------------------------------------------- # Schritt 5: Parameter setzen # --------------------------------------------------------------------------- # .AnnouncementSettings //= {} -> Block anlegen, falls er fehlt # .AdminNoticesEnabled = false -> Parameter setzen/ueberschreiben # .UserNoticesEnabled = false -> Parameter setzen/ueberschreiben if jq ' .AnnouncementSettings //= {} | .AnnouncementSettings.AdminNoticesEnabled = false | .AnnouncementSettings.UserNoticesEnabled = false ' "${CONFIG_FILE}" > "${TMP_FILE}"; then print_ok "Parameter AdminNoticesEnabled / UserNoticesEnabled berechnet" else print_error_and_exit "Fehler beim Verarbeiten der Konfiguration mit jq" fi # --------------------------------------------------------------------------- # Schritt 6: Ergebnis erneut auf valides JSON pruefen # --------------------------------------------------------------------------- if jq empty "${TMP_FILE}" 2> /dev/null; then print_ok "Neue Konfiguration ist valides JSON" else print_error_and_exit "Die erzeugte Konfiguration ist kein valides JSON, es wurde nichts uebernommen" fi # --------------------------------------------------------------------------- # Schritt 7: Original-Rechte/Eigentuemer ermitteln und Datei uebernehmen # --------------------------------------------------------------------------- ORIG_OWNER="$(stat -c '%U:%G' "${CONFIG_FILE}" 2> /dev/null)" ORIG_PERMS="$(stat -c '%a' "${CONFIG_FILE}" 2> /dev/null)" if [[ -z "${ORIG_OWNER}" || -z "${ORIG_PERMS}" ]]; then print_error_and_exit "Eigentuemer/Rechte der Originaldatei konnten nicht ermittelt werden" fi if mv "${TMP_FILE}" "${CONFIG_FILE}" \ && chown "${ORIG_OWNER}" "${CONFIG_FILE}" \ && chmod "${ORIG_PERMS}" "${CONFIG_FILE}"; then print_ok "Konfigurationsdatei aktualisiert (Rechte/Eigentuemer uebernommen)" else print_error_and_exit "Schreiben der neuen Konfigurationsdatei ist fehlgeschlagen" fi # --------------------------------------------------------------------------- # Schritt 8: Abschliessende Erfolgsmeldung und Hinweis zum Neuladen # --------------------------------------------------------------------------- print_ok "AdminNoticesEnabled=false und UserNoticesEnabled=false gesetzt" echo "" echo "Hinweis: Die Aenderung wird erst nach einem Neuladen wirksam," echo "z.B. mit: systemctl restart mattermost" # --------------------------------------------------------------------------- # Ausgabe: abschliessende Leerzeile # --------------------------------------------------------------------------- echo "" exit 0