#!/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