neues Script
This commit is contained in:
parent
c12e6263f3
commit
2de49417c4
|
|
@ -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 <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
|
||||
Loading…
Reference in New Issue