From 2de49417c4b295d7f3ec4af193b0de70753d9eef Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Wed, 17 Dec 2025 16:00:28 -0600 Subject: [PATCH] neues Script --- basic_setup/email-rule.sh | 431 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 431 insertions(+) create mode 100644 basic_setup/email-rule.sh diff --git a/basic_setup/email-rule.sh b/basic_setup/email-rule.sh new file mode 100644 index 0000000..055ad31 --- /dev/null +++ b/basic_setup/email-rule.sh @@ -0,0 +1,431 @@ +#!/bin/bash + +# AWS Region +REGION="us-east-2" +TABLE_NAME="email-rules" + +# Farben für Output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Logging-Funktionen +info() { echo -e "${GREEN}✓${NC} $1"; } +warn() { echo -e "${YELLOW}⚠${NC} $1"; } +error() { echo -e "${RED}✗${NC} $1"; exit 1; } + +# Hilfe-Funktion +show_help() { + cat << EOF +Usage: $0 [options] + +Commands: + set-ooo [--html] + Setzt Out-of-Office Nachricht + --html: Nachricht ist HTML-formatiert (default: text) + + set-forward [,address2,...] + Setzt Forward-Adressen (überschreibt bestehende) + + add-forward [,address2,...] + Fügt Forward-Adressen hinzu (behält bestehende) + + remove-ooo + Entfernt Out-of-Office Regel + + remove-forward + Entfernt alle Forward-Adressen + + remove-all + Löscht komplette Regel (OOO + Forwards) + + show + Zeigt aktuelle Regel + + list + Listet alle Regeln auf + +Examples: + $0 set-ooo john@example.com "I'm on vacation until Monday" + $0 set-ooo john@example.com "

Out of office

" --html + $0 set-forward john@example.com alice@example.com,bob@example.com + $0 add-forward john@example.com charlie@example.com + $0 show john@example.com + $0 remove-all john@example.com + +EOF +} + +# Prüft ob Regel existiert +rule_exists() { + local email=$1 + aws dynamodb get-item \ + --table-name "$TABLE_NAME" \ + --key '{"email_address": {"S": "'"$email"'"}}' \ + --region "$REGION" \ + --output json 2>/dev/null | jq -e '.Item' > /dev/null +} + +# Holt aktuelle Regel +get_rule() { + local email=$1 + aws dynamodb get-item \ + --table-name "$TABLE_NAME" \ + --key '{"email_address": {"S": "'"$email"'"}}' \ + --region "$REGION" \ + --output json 2>/dev/null | jq -r '.Item // {}' +} + +# Validiert E-Mail-Adresse (basic) +validate_email() { + local email=$1 + if [[ ! "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then + error "Ungültige E-Mail-Adresse: $email" + fi +} + +# ============================================== +# COMMAND: set-ooo +# ============================================== +cmd_set_ooo() { + local email=$1 + local message=$2 + local content_type="text" + + if [ "$3" = "--html" ]; then + content_type="html" + fi + + if [ -z "$email" ] || [ -z "$message" ]; then + error "Usage: $0 set-ooo [--html]" + fi + + validate_email "$email" + + # Hole bestehende Forwards (falls vorhanden) + local existing_rule=$(get_rule "$email") + local forwards_json='{"L": []}' + + if [ "$existing_rule" != "{}" ]; then + forwards_json=$(echo "$existing_rule" | jq -r '.forwards // {"L": []}') + warn "Regel existiert bereits, behalte bestehende Forwards bei" + fi + + # Setze Regel + aws dynamodb put-item \ + --table-name "$TABLE_NAME" \ + --item '{ + "email_address": {"S": "'"$email"'"}, + "ooo_active": {"BOOL": true}, + "ooo_message": {"S": "'"${message//\"/\\\"}"'"}, + "ooo_content_type": {"S": "'"$content_type"'"}, + "forwards": '"$forwards_json"', + "last_updated": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"} + }' \ + --region "$REGION" >/dev/null + + info "Out-of-Office aktiviert für $email ($content_type)" +} + +# ============================================== +# COMMAND: set-forward +# ============================================== +cmd_set_forward() { + local email=$1 + local forward_addresses=$2 + + if [ -z "$email" ] || [ -z "$forward_addresses" ]; then + error "Usage: $0 set-forward [,address2,...]" + fi + + validate_email "$email" + + # Validiere alle Forward-Adressen + IFS=',' read -ra ADDRS <<< "$forward_addresses" + for addr in "${ADDRS[@]}"; do + validate_email "$(echo "$addr" | xargs)" # xargs trimmt whitespace + done + + # Konvertiere zu JSON-Array + local forwards_list=$(echo "$forward_addresses" | jq -R 'split(",") | map(gsub("^\\s+|\\s+$";"")) | map({"S": .})') + + # Hole bestehende OOO-Einstellungen (falls vorhanden) + local existing_rule=$(get_rule "$email") + local ooo_active="false" + local ooo_message="" + local ooo_content_type="text" + + if [ "$existing_rule" != "{}" ]; then + ooo_active=$(echo "$existing_rule" | jq -r '.ooo_active.BOOL // false') + ooo_message=$(echo "$existing_rule" | jq -r '.ooo_message.S // ""') + ooo_content_type=$(echo "$existing_rule" | jq -r '.ooo_content_type.S // "text"') + warn "Regel existiert bereits, behalte bestehende OOO-Einstellungen bei" + fi + + # Setze Regel + aws dynamodb put-item \ + --table-name "$TABLE_NAME" \ + --item '{ + "email_address": {"S": "'"$email"'"}, + "ooo_active": {"BOOL": '"$ooo_active"'}, + "ooo_message": {"S": "'"${ooo_message//\"/\\\"}"'"}, + "ooo_content_type": {"S": "'"$ooo_content_type"'"}, + "forwards": {"L": '"$forwards_list"'}, + "last_updated": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"} + }' \ + --region "$REGION" >/dev/null + + info "Forwards gesetzt für $email: ${ADDRS[*]}" +} + +# ============================================== +# COMMAND: add-forward +# ============================================== +cmd_add_forward() { + local email=$1 + local new_addresses=$2 + + if [ -z "$email" ] || [ -z "$new_addresses" ]; then + error "Usage: $0 add-forward [,address2,...]" + fi + + validate_email "$email" + + if ! rule_exists "$email"; then + error "Keine Regel für $email gefunden. Nutze 'set-forward' stattdessen." + fi + + # Hole bestehende Forwards + local existing_rule=$(get_rule "$email") + local existing_forwards=$(echo "$existing_rule" | jq -r '.forwards.L // [] | map(.S) | join(",")') + + # Kombiniere und dedupliziere + local combined="$existing_forwards,$new_addresses" + IFS=',' read -ra ALL_ADDRS <<< "$combined" + + # Dedupliziere und validiere + declare -A seen + local unique_addrs=() + for addr in "${ALL_ADDRS[@]}"; do + addr=$(echo "$addr" | xargs) # Trim whitespace + if [ -n "$addr" ] && [ -z "${seen[$addr]}" ]; then + validate_email "$addr" + seen[$addr]=1 + unique_addrs+=("$addr") + fi + done + + # Konvertiere zu Komma-separiertem String + local final_list=$(IFS=','; echo "${unique_addrs[*]}") + + # Nutze set-forward mit kombinierter Liste + cmd_set_forward "$email" "$final_list" + info "Forwards hinzugefügt (insgesamt ${#unique_addrs[@]} Adressen)" +} + +# ============================================== +# COMMAND: remove-ooo +# ============================================== +cmd_remove_ooo() { + local email=$1 + + if [ -z "$email" ]; then + error "Usage: $0 remove-ooo " + fi + + validate_email "$email" + + if ! rule_exists "$email"; then + warn "Keine Regel für $email gefunden" + return 0 + fi + + # Update: OOO deaktivieren, Message-Felder entfernen + aws dynamodb update-item \ + --table-name "$TABLE_NAME" \ + --key '{"email_address": {"S": "'"$email"'"}}' \ + --update-expression "SET ooo_active = :false, last_updated = :timestamp REMOVE ooo_message, ooo_content_type" \ + --expression-attribute-values '{ + ":false": {"BOOL": false}, + ":timestamp": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"} + }' \ + --region "$REGION" >/dev/null + + info "Out-of-Office entfernt für $email" +} + +# ============================================== +# COMMAND: remove-forward +# ============================================== +cmd_remove_forward() { + local email=$1 + + if [ -z "$email" ]; then + error "Usage: $0 remove-forward " + fi + + validate_email "$email" + + if ! rule_exists "$email"; then + warn "Keine Regel für $email gefunden" + return 0 + fi + + # Update: Forwards leeren + aws dynamodb update-item \ + --table-name "$TABLE_NAME" \ + --key '{"email_address": {"S": "'"$email"'"}}' \ + --update-expression "SET forwards = :empty, last_updated = :timestamp" \ + --expression-attribute-values '{ + ":empty": {"L": []}, + ":timestamp": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"} + }' \ + --region "$REGION" >/dev/null + + info "Forwards entfernt für $email" +} + +# ============================================== +# COMMAND: remove-all +# ============================================== +cmd_remove_all() { + local email=$1 + + if [ -z "$email" ]; then + error "Usage: $0 remove-all " + fi + + validate_email "$email" + + if ! rule_exists "$email"; then + warn "Keine Regel für $email gefunden" + return 0 + fi + + aws dynamodb delete-item \ + --table-name "$TABLE_NAME" \ + --key '{"email_address": {"S": "'"$email"'"}}' \ + --region "$REGION" >/dev/null + + info "Regel komplett gelöscht für $email" +} + +# ============================================== +# COMMAND: show +# ============================================== +cmd_show() { + local email=$1 + + if [ -z "$email" ]; then + error "Usage: $0 show " + fi + + validate_email "$email" + + if ! rule_exists "$email"; then + warn "Keine Regel für $email gefunden" + return 0 + fi + + local rule=$(get_rule "$email") + + echo "" + echo "Regel für: $email" + echo "─────────────────────────────────────────" + + # OOO Status + local ooo_active=$(echo "$rule" | jq -r '.ooo_active.BOOL // false') + if [ "$ooo_active" = "true" ]; then + local ooo_msg=$(echo "$rule" | jq -r '.ooo_message.S // ""') + local ooo_type=$(echo "$rule" | jq -r '.ooo_content_type.S // "text"') + echo "Out-of-Office: ${GREEN}AKTIV${NC} ($ooo_type)" + echo "Nachricht: $ooo_msg" + else + echo "Out-of-Office: ${RED}INAKTIV${NC}" + fi + + # Forwards + local forwards=$(echo "$rule" | jq -r '.forwards.L // [] | map(.S) | join(", ")') + if [ -n "$forwards" ]; then + echo "Forwards: $forwards" + else + echo "Forwards: ${RED}KEINE${NC}" + fi + + # Letztes Update + local updated=$(echo "$rule" | jq -r '.last_updated.S // "unbekannt"') + echo "Letzte Änderung: $updated" + echo "" +} + +# ============================================== +# COMMAND: list +# ============================================== +cmd_list() { + echo "" + echo "Alle E-Mail-Regeln:" + echo "═════════════════════════════════════════════════════════════════" + + local items=$(aws dynamodb scan \ + --table-name "$TABLE_NAME" \ + --region "$REGION" \ + --output json | jq -r '.Items') + + local count=$(echo "$items" | jq 'length') + + if [ "$count" -eq 0 ]; then + warn "Keine Regeln gefunden" + echo "" + return 0 + fi + + echo "$items" | jq -r '.[] | + "\(.email_address.S)\n" + + " OOO: \(if .ooo_active.BOOL then "✓ AKTIV (\(.ooo_content_type.S // "text"))" else "✗ INAKTIV" end)\n" + + " Forwards: \(if (.forwards.L | length) > 0 then (.forwards.L | map(.S) | join(", ")) else "KEINE" end)\n" + + " Updated: \(.last_updated.S // "unbekannt")\n"' + + echo "─────────────────────────────────────────────────────────────────" + echo "Gesamt: $count Regel(n)" + echo "" +} + +# ============================================== +# MAIN +# ============================================== +COMMAND=$1 +shift + +case "$COMMAND" in + set-ooo) + cmd_set_ooo "$@" + ;; + set-forward) + cmd_set_forward "$@" + ;; + add-forward) + cmd_add_forward "$@" + ;; + remove-ooo) + cmd_remove_ooo "$@" + ;; + remove-forward) + cmd_remove_forward "$@" + ;; + remove-all) + cmd_remove_all "$@" + ;; + show) + cmd_show "$@" + ;; + list) + cmd_list + ;; + help|--help|-h|"") + show_help + ;; + *) + error "Unbekannter Befehl: $COMMAND\n\nNutze '$0 help' für Hilfe" + ;; +esac \ No newline at end of file