#!/bin/sh

po_domain="alterator-spamassassin"
spamdconffile="/var/lib/spamd/.spamassassin/user_prefs"
filterconffile="/etc/sa-content-filter/system"

set -f

. alterator-sh-functions
. shell-config

#service postfix start >&2 ||:
#service spamd start >&2 ||:

shell_add_or_subst()
{
	local name="$1" && shift
	local value="$1" && shift
	local file="$1" && shift

	[ -f "$file" ] || touch "$file"
	if grep -qs "^$name" "$file"; then
		/bin/sed -r -i "s,^$name.*,$name$value," -- "$file"
		return 0
	fi
	printf %s\\n "$name$value" >> "$file"
}

spamd_config_get()
{
    shell_config_get "$spamdconffile" "$1" '[[:space:]]\+'
}

spamd_config_set()
{
    shell_config_set "$spamdconffile" "$1" "$2" '[[:space:]]\+' ' '
}

list_scores()
{
    sed -nr '/^score/ {s,^score[[:space:]]+([[:alnum:]_]+)[[:space:]]+(.*)$,("\1" score "\2"),;p}' "$spamdconffile"
}

list_rules()
{
    grep -hr "^score" /usr/share/spamassassin | \
	sed -r 's,score[[:space:]]+([^[:space:]]+).*$,("\1"),g' | sort
}

read_rule()
{
    local RULE=$1
    [ -z "$RULE" -o "$RULE" = "add" ] && \
    	RULE=$(grep -hr "^score" /usr/share/spamassassin | \
		sed -r 's,score[[:space:]]+([^[:space:]]+).*$,\1,g' | sort | head -n1)
    echo -n "(\"$RULE\" description \""
    grep -hr "^describe[[:space:]]*$RULE[[:space:]]" /usr/share/spamassassin| \
	sed -r "s,^describe[[:space:]]+$RULE[[:space:]]+,,g"
    echo -n '" score "'
    grep -hr "^score[[:space:]]*$RULE[[:space:]]" /usr/share/spamassassin| \
	sed -r "s,^score[[:space:]]+$RULE[[:space:]]+,,g"
    echo '")'
}

on_message()
{
	case "$in_action" in
		constraints)
			echo '('
			if [ "$in__objects" == "/" ] ; then
			    printf 'smtp_mode (label "%s")' "`_ "SMTP transport status"`"
			    printf 'filter_mode (label "%s")' "`_ "Spam filter mode"`"
			    printf 'required_score (label "%s" match ("[0-9]+" "%s"))' \
				"`_ "Required score"`" \
				"`_ "should be number"`"
			    printf 'use_awl (default #f label "%s")' "`_ "Use automatic sender whitelist"`"
			fi
			printf 'name (label "%s")' "`_ "Rule"`"
			printf 'score (label "%s")' "`_ "Score"`"
			echo ')'
			;;
		list)
			echo '('
			case "$in__objects" in
			smtp_modes)
			    printf '("local" label "%s")' "`_ "Off"`"
			    printf '("server" label "%s")' "`_ "On, without content filter"`"
			    printf '("filter" label "%s")' "`_ "On, with content filter"`"
			    ;;
			filter_modes)
			    printf '("pass" label "%s")' "`_ "Mark only"`"
			    printf '("drop" label"%s")' "`_ "Drop mail"`"
			    ;;
			scores)
			    list_scores
			    ;;
			*)
			    list_rules
			    ;;
			esac
			echo ')'
			;;
		read)
			echo '('
			if [ "$in__objects" = "/" ]; then
			printf ' smtp_mode "%s"' "$(control postfix)"
			printf ' filter_mode "%s"' "$(shell_config_get "$filterconffile" FILTER_MODE)"
			printf ' required_score "%s"' "$(spamd_config_get required_score)"
			printf ' use_awl %s'    "$(write_bool $(spamd_config_get use_auto_whitelist))"
			else
				read_rule "${in__objects#*/}"
			fi
			echo ')'
			;;
		write)
			if [ "${in__objects%%/*}" = "add" ]; then
			        [ -n "$in_name" -a -n "$in_score" ] &&
				  shell_add_or_subst "score $in_name" " $in_score" "$spamdconffile"
				service spamd reload >&2
				write_nop
				return
			fi

			[ -n "$in_smtp_mode" ] && control postfix "$in_smtp_mode" >&2
			[ -n "$in_required_score" ] && spamd_config_set required_score "$in_required_score"
			[ -n "$in_filter_mode" ] && shell_config_set "$filterconffile" FILTER_MODE "$in_filter_mode"

			if test_bool "$in_use_awl";then
				spamd_config_set use_auto_whitelist 1
			else
				spamd_config_set use_auto_whitelist 0
			fi

			service spamd reload >&2
			write_nop
			;;
		delete)
			if [ "${in__objects%%/*}" = "scores" ]; then
				sed "/^score ${in__objects#*/}/ {d}" -i "$spamdconffile"
			fi
			write_nop
			;;
		*)
			echo '#f'
			;;
	esac
}


message_loop

