431 lines
12 KiB
Bash
Executable File
431 lines
12 KiB
Bash
Executable File
#!/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 <command> [options]
|
|
|
|
Commands:
|
|
set-ooo <email> <message> [--html]
|
|
Setzt Out-of-Office Nachricht
|
|
--html: Nachricht ist HTML-formatiert (default: text)
|
|
|
|
set-forward <email> <address1>[,address2,...]
|
|
Setzt Forward-Adressen (überschreibt bestehende)
|
|
|
|
add-forward <email> <address1>[,address2,...]
|
|
Fügt Forward-Adressen hinzu (behält bestehende)
|
|
|
|
remove-ooo <email>
|
|
Entfernt Out-of-Office Regel
|
|
|
|
remove-forward <email>
|
|
Entfernt alle Forward-Adressen
|
|
|
|
remove-all <email>
|
|
Löscht komplette Regel (OOO + Forwards)
|
|
|
|
show <email>
|
|
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 "<p>Out of office</p>" --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 <email> <message> [--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 <email> <address1>[,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 <email> <address1>[,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 <email>"
|
|
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 <email>"
|
|
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 <email>"
|
|
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 <email>"
|
|
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 |