#!/bin/sh

po_domain="alterator-postfix-dovecot"
alterator_api_version=1

. alterator-sh-functions
. alterator-service-functions
. alterator-postfix-dovecot-functions
. shell-config

write_limit_param()
{
    local v="$(postconf_read "$1")"
    write_string_param "$1" "$(($v / 1048576))"
}

read_limit_param()
{
    [ -z "$2" ] || postconf_write  "$1" "$(($2 * 1048576))"
}

control_postfix()
{
    if [ -n "$1" ]; then
        /usr/sbin/control postfix "$1"
     else
        /usr/sbin/control postfix
    fi
}

daemon_status()
{
    test -n "$1" || return 1

    if service_control "$1" is-enabled && service_control "$1" is-active; then
        return 0
    fi

    return 1
}

daemon_on()
{
    test -n "$1" || return
    daemon_status "$1" && return 0

    service_control "$1" on
    service_control "$1" start || :
}

daemon_off()
{
    test -n "$1" || return
    service_control "$1" condstop
    service_control "$1" off
}

daemon_condreload()
{
	test -n "$1" || return
	service_control "$1" condreload
}

domain_is_master()
{
    [ "$(shell_config_get /etc/sysconfig/system SERVER_ROLE)" = "master" ] &&
        return 0 || return 1
}

on_message() {
	set | grep '^in_' >&2
	echo >&2
	case "$in_action" in
		type)
			write_type_item relayhost		hostname
			write_type_item message_size_limit	postfix-limit
			write_type_item domainlist		hostname-list
#			write_type_item filtered_recipients	hostname-list
			;;
		list)
			case "$in__objects" in
				modes)
					write_enum_item relay "`_ "Relay"`"
					write_enum_item mx "`_ "MX"`"
					;;
			esac
			;;
		read)
			if [ "$(control_postfix)" != "local" ]; then
			    write_bool_param postfix_daemon yes
			else
			    write_bool_param postfix_daemon no
			fi
			if dovecot_read protocols | grep -qs '\bimap pop3 lmtp\b'; then
			    ! daemon_status dovecot
			    write_bool_param pop3_imap "$?"
			else
			    write_bool_param pop3_imap no
			fi
			if [ -n "$(postconf_read relayhost)" ]; then
				write_string_param mode 'relay'
			else
				write_string_param mode 'mx'
			fi
			write_string_param relayhost "$(postconf_read relayhost)"
			write_string_param domainlist "$(cat "$MYDESTINATION" | tr '\n' ' ')"
			if [ -n "$(postconf_read relayhost)" ]; then
				write_string_param mode 'relay'
			else
				write_string_param mode 'mx'
			fi
			write_string_param relayhost "$(postconf_read relayhost)"
			write_string_param domainlist "$(cat "$MYDESTINATION" | tr '\n' ' ')"
			write_string_param rootmail "$(rootmail_read)"
			write_limit_param message_size_limit

			if [ "$(control_postfix)" = "filter" ]; then
				! daemon_status spamd
				write_bool_param spamfilter "$?"
			else
				write_bool_param spamfilter no
			fi

			if postconf_has smtpd_client_restrictions reject_rbl_client ; then
				write_bool_param filter_senders yes
			else
				write_bool_param filter_senders no
			fi

			if grep -qs '\bREJECT\b' "$(list_name recipient)"; then
				write_bool_param filter_recipients yes
				write_string_param filtered_recipients "$(reject_list recipient | tr '\n' ' ')"
			else
				write_bool_param filter_recipients no
			fi

			write_string_param mynetworks "$(cat "$MYNETWORKS" | tr '\n' ' ')"

            [ "$(shell_config_get /etc/sysconfig/system SERVER_ROLE)" = "master" ] &&
                write_bool_param domain_master true ||
                write_bool_param domain_master false
			;;
		write)
			case "$in_mode" in
				mx)
					postconf_write relayhost ""
					echo -n > "$MYDESTINATION"
					for i in $in_domainlist; do
					     echo "$i" >> "$MYDESTINATION"
					done
					;;
				relay)
					postconf_write relayhost "$in_relayhost"
#					echo -n > "$MYDESTINATION"
					;;
			esac
			rootmail_write "$in_rootmail"
			read_limit_param message_size_limit "$in_message_size_limit"

			if test_bool "$in_filter_senders"; then
				postconf_restrict_on
			else
				postconf_restrict_off
			fi

			if test_bool "$in_filter_recipients"; then
				for i in $in_filtered_recipients; do
				    reject_has "$(list_name recipient)" "$i" ||
					reject_add "$(list_name recipient)" "$i"
				done
			else
				reject_clean "$(list_name recipient)"
			fi

			echo -n > "$MYNETWORKS"
			for i in $in_mynetworks; do
			     echo "$i" >> "$MYNETWORKS"
			done

			if test_bool "$in_pop3_imap"; then
				dovecot_write protocols "imap pop3 lmtp"
#				dovecot_auth_write auth_mechanisms "plain login"
				daemon_condreload dovecot
				daemon_on dovecot
			else
				dovecot_write protocols "none"
				daemon_condreload dovecot
			fi

			if test_bool "$in_postfix_daemon"; then
				if test_bool "$in_spamfilter"; then
					daemon_on spamd
					if [ "$(control_postfix)" = "filter" ]; then
						daemon_condreload postfix
					else
						control_postfix filter
					fi
				else
					daemon_off spamd
					if [ "$(control_postfix)" != "server" ]; then
						control_postfix server
						/usr/sbin/control postfix-submission enable
					fi
				fi
			else
				if [ "$(control_postfix)" != "local" ]; then
					/usr/sbin/control postfix-submission disable
					control_postfix local
					daemon_off spamd
				fi
			fi
			;;
	esac
}

message_loop
# vim: set ts=4 sts=4 sw=4:
