From baaafe711ca9c9831136d4e752e12762fc78c396 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Wed, 17 Dec 2025 16:08:55 -0600 Subject: [PATCH] fix --- basic_setup/email-rule.sh | 121 +++++++++++++++++++++++++++----------- 1 file changed, 86 insertions(+), 35 deletions(-) diff --git a/basic_setup/email-rule.sh b/basic_setup/email-rule.sh index 055ad31..11558e3 100755 --- a/basic_setup/email-rule.sh +++ b/basic_setup/email-rule.sh @@ -60,11 +60,17 @@ EOF # Prüft ob Regel existiert rule_exists() { local email=$1 - aws dynamodb get-item \ + local result=$(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 + --output json 2>/dev/null) + + if echo "$result" | jq -e '.Item' > /dev/null 2>&1; then + return 0 # Existiert + else + return 1 # Existiert nicht + fi } # Holt aktuelle Regel @@ -74,7 +80,7 @@ get_rule() { --table-name "$TABLE_NAME" \ --key '{"email_address": {"S": "'"$email"'"}}' \ --region "$REGION" \ - --output json 2>/dev/null | jq -r '.Item // {}' + --output json 2>/dev/null | jq -r '.Item' } # Validiert E-Mail-Adresse (basic) @@ -104,28 +110,43 @@ cmd_set_ooo() { validate_email "$email" # Hole bestehende Forwards (falls vorhanden) - local existing_rule=$(get_rule "$email") - local forwards_json='{"L": []}' + local forwards_json='[]' - if [ "$existing_rule" != "{}" ]; then - forwards_json=$(echo "$existing_rule" | jq -r '.forwards // {"L": []}') - warn "Regel existiert bereits, behalte bestehende Forwards bei" + if rule_exists "$email"; then + local existing_rule=$(get_rule "$email") + + # Prüfe ob existing_rule nicht null ist + if [ "$existing_rule" != "null" ] && [ -n "$existing_rule" ]; then + # Extrahiere forwards, fallback auf leeres Array + local existing_forwards=$(echo "$existing_rule" | jq -r '.forwards.L // []') + if [ "$existing_forwards" != "[]" ] && [ "$existing_forwards" != "null" ]; then + forwards_json="$existing_forwards" + warn "Regel existiert bereits, behalte bestehende Forwards bei" + fi + fi fi + # Escape JSON-String korrekt + local escaped_message=$(echo "$message" | jq -Rs .) + # Setze Regel aws dynamodb put-item \ --table-name "$TABLE_NAME" \ --item '{ "email_address": {"S": "'"$email"'"}, "ooo_active": {"BOOL": true}, - "ooo_message": {"S": "'"${message//\"/\\\"}"'"}, + "ooo_message": {"S": '"$escaped_message"'}, "ooo_content_type": {"S": "'"$content_type"'"}, - "forwards": '"$forwards_json"', + "forwards": {"L": '"$forwards_json"'}, "last_updated": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"} }' \ - --region "$REGION" >/dev/null + --region "$REGION" 2>&1 - info "Out-of-Office aktiviert für $email ($content_type)" + if [ $? -eq 0 ]; then + info "Out-of-Office aktiviert für $email ($content_type)" + else + error "Fehler beim Setzen der OOO-Regel" + fi } # ============================================== @@ -144,39 +165,52 @@ cmd_set_forward() { # Validiere alle Forward-Adressen IFS=',' read -ra ADDRS <<< "$forward_addresses" for addr in "${ADDRS[@]}"; do - validate_email "$(echo "$addr" | xargs)" # xargs trimmt whitespace + addr=$(echo "$addr" | xargs) # xargs trimmt whitespace + if [ -n "$addr" ]; then + validate_email "$addr" + fi done # Konvertiere zu JSON-Array - local forwards_list=$(echo "$forward_addresses" | jq -R 'split(",") | map(gsub("^\\s+|\\s+$";"")) | map({"S": .})') + local forwards_list=$(echo "$forward_addresses" | jq -R 'split(",") | map(gsub("^\\s+|\\s+$";"")) | map(select(length > 0)) | 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" + if rule_exists "$email"; then + local existing_rule=$(get_rule "$email") + + if [ "$existing_rule" != "null" ] && [ -n "$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 fi + # Escape message für JSON + local escaped_ooo_message=$(echo "$ooo_message" | jq -Rs .) + # 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_message": {"S": '"$escaped_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 + --region "$REGION" 2>&1 - info "Forwards gesetzt für $email: ${ADDRS[*]}" + if [ $? -eq 0 ]; then + info "Forwards gesetzt für $email: ${ADDRS[*]}" + else + error "Fehler beim Setzen der Forward-Regel" + fi } # ============================================== @@ -198,7 +232,11 @@ cmd_add_forward() { # Hole bestehende Forwards local existing_rule=$(get_rule "$email") - local existing_forwards=$(echo "$existing_rule" | jq -r '.forwards.L // [] | map(.S) | join(",")') + local existing_forwards="" + + if [ "$existing_rule" != "null" ] && [ -n "$existing_rule" ]; then + existing_forwards=$(echo "$existing_rule" | jq -r '.forwards.L // [] | map(.S) | join(",")') + fi # Kombiniere und dedupliziere local combined="$existing_forwards,$new_addresses" @@ -250,9 +288,13 @@ cmd_remove_ooo() { ":false": {"BOOL": false}, ":timestamp": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"} }' \ - --region "$REGION" >/dev/null + --region "$REGION" 2>&1 >/dev/null - info "Out-of-Office entfernt für $email" + if [ $? -eq 0 ]; then + info "Out-of-Office entfernt für $email" + else + error "Fehler beim Entfernen der OOO-Regel" + fi } # ============================================== @@ -281,9 +323,13 @@ cmd_remove_forward() { ":empty": {"L": []}, ":timestamp": {"S": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"} }' \ - --region "$REGION" >/dev/null + --region "$REGION" 2>&1 >/dev/null - info "Forwards entfernt für $email" + if [ $? -eq 0 ]; then + info "Forwards entfernt für $email" + else + error "Fehler beim Entfernen der Forwards" + fi } # ============================================== @@ -306,9 +352,13 @@ cmd_remove_all() { aws dynamodb delete-item \ --table-name "$TABLE_NAME" \ --key '{"email_address": {"S": "'"$email"'"}}' \ - --region "$REGION" >/dev/null + --region "$REGION" 2>&1 >/dev/null - info "Regel komplett gelöscht für $email" + if [ $? -eq 0 ]; then + info "Regel komplett gelöscht für $email" + else + error "Fehler beim Löschen der Regel" + fi } # ============================================== @@ -339,10 +389,10 @@ cmd_show() { 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 -e "Out-of-Office: ${GREEN}AKTIV${NC} ($ooo_type)" echo "Nachricht: $ooo_msg" else - echo "Out-of-Office: ${RED}INAKTIV${NC}" + echo -e "Out-of-Office: ${RED}INAKTIV${NC}" fi # Forwards @@ -350,7 +400,7 @@ cmd_show() { if [ -n "$forwards" ]; then echo "Forwards: $forwards" else - echo "Forwards: ${RED}KEINE${NC}" + echo -e "Forwards: ${RED}KEINE${NC}" fi # Letztes Update @@ -367,11 +417,12 @@ cmd_list() { echo "Alle E-Mail-Regeln:" echo "═════════════════════════════════════════════════════════════════" - local items=$(aws dynamodb scan \ + local result=$(aws dynamodb scan \ --table-name "$TABLE_NAME" \ --region "$REGION" \ - --output json | jq -r '.Items') + --output json 2>/dev/null) + local items=$(echo "$result" | jq -r '.Items // []') local count=$(echo "$items" | jq 'length') if [ "$count" -eq 0 ]; then