#!/bin/zsh # Script Version: 01 # Description: Removes non-existent rules from SpamAssassin local.cf configuration file. # Variables # ======== CONFIG_FILE="/etc/mail/spamassassin/local.cf" BACKUP_FILE="/etc/mail/spamassassin/local.cf.bak" TEMP_FILE=$(mktemp /tmp/local.cf.temp.XXXXXX) # Backup original config # ======== if ! cp "$CONFIG_FILE" "$BACKUP_FILE"; then echo "Error: Backup of $CONFIG_FILE to $BACKUP_FILE failed. Aborting." >&2 exit 1 fi echo "Backup of local.cf saved to $BACKUP_FILE" # Extract non-existent rules from SpamAssassin lint output # ======== RULES=$(spamassassin --lint -D 2>&1 | grep 'warning: score set for non-existent rule' | awk '{print $NF}' | sort | uniq) if [ -z "$RULES" ]; then echo "No non-existent rules found in the lint output." rm -f "$TEMP_FILE" # Clean up the temporary file exit 0 fi echo "Non-existent rules to be removed:" echo "$RULES" # Remove non-existent rules from the config file # ======== cp "$CONFIG_FILE" "$TEMP_FILE" while read -r RULE; do sed -i "/^score\s\+$RULE\b/d" "$TEMP_FILE" done <<< "$RULES" # Overwrite the original config # ======== if mv "$TEMP_FILE" "$CONFIG_FILE"; then echo "Non-existent rules removed from $CONFIG_FILE" else echo "Error: Failed to update $CONFIG_FILE. Aborting." >&2 rm -f "$TEMP_FILE" # Clean up in case of failure exit 1 fi # Restart SpamAssassin to apply changes # ======== echo "Restarting SpamAssassin..." if systemctl restart spamassassin; then echo "SpamAssassin restarted successfully." if ! systemctl is-active --quiet spamassassin; then echo "Error: SpamAssassin is not active after restart." >&2 exit 1 fi else echo "Error: Failed to restart SpamAssassin." >&2 exit 1 fi exit 0