#!/bin/sh

alterator_api_version=1
MM_CONF="/etc/mailman/mm_config.py"

#turn off auto expansion
set -f

. alterator-sh-functions

_M_()
{
    TEXTDOMAINDIR=/usr/share/mailman/messages/ _ "$1" "mailman"
}

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

	[ "$value" = "fqdn" -o "$value" = "None" ] || value="'$value'"

	if grep -qs "^$name" "$MM_CONF"; then
		sed -r -i "s,^$name[[:space:]=].*,$name = $value," -- "$MM_CONF"
		return 0
	fi
	printf "%s = %s\n" "$name" "$value" >> "$MM_CONF"
}

mm_config_get()
{
	local name="$1" && shift

	sed -rn "s,^$name\s*=\s*'?([^']*)'?$,\1,p" -- "$MM_CONF"
}

virtualhost_add()
{
    if [ -n "$2" ]; then
	printf "add_virtualhost('%s', '%s')\n" "$1" "$2"
    else
	printf "add_virtualhost('%s')\n" "$1"
    fi >> "$MM_CONF"
}

virtualhost_del()
{
    sed -r "/^add_virtualhost\s*\(\s*'?$1'?/ d" -i "$MM_CONF"
}

virtualhost_list()
{
    sed -rn "s/^add_virtualhost\s*\(\s*'?([^),']+)'?\s*,\s*'?([^),']+)'?\).*/\1	\2/p" "$MM_CONF"
    sed -rn "s/^add_virtualhost\s*\(\s*'?([^),']+)'?\).*/\1/p" "$MM_CONF"
}

virtualhost_has()
{
    egrep -qs "^add_virtualhost\s*\(\s*'?$1'?[[:space:],)]" "$MM_CONF"
}

on_message()
{
	case "$in_action" in
		type)
			write_type_item urlhost hostname
			write_type_item emailhost hostname
			write_type_item new_virtualhost_url hostname
			write_type_item new_virtualhost_email hostname
			;;
		list)
			case "$in__objects" in
			    virtualhost)
				virtualhost_list|
				    LANG=C sort|
				    while read url email; do
					write_table_item virtualhost "$url" virtualhost_url "$url" virtualhost_email "$email"
				    done
			    ;;
			    mta)
				rpm -q postfix &> /dev/null && write_enum_item Postfix
				rpm -q exim &> /dev/null && write_enum_item Exim
				rpm -q qmail &> /dev/null && write_enum_item Qmail
				rpm -q sendmail &> /dev/null && write_enum_item Sendmail
				rpm -q courier &> /dev/null && write_enum_item Courier
				;;
			    lang)
				awk -F "'" '/^add_language/ { print $2 " " $4 }' /usr/share/mailman/Mailman/Defaults.py |
				    while read lang desc; do
					write_enum_item "$lang" "`_M_ "$desc"`"
				    done
				;;
			esac
			;;
		read)
			local urlhost="$(mm_config_get DEFAULT_URL_HOST)"
			local emailhost="$(mm_config_get DEFAULT_EMAIL_HOST)"

			if [ "$urlhost" = 'fqdn' -a "$emailhost" = 'fqdn' ]; then
			    write_bool_param autodetect 'yes'
			    write_string_param urlhost ''
			    write_string_param emailhost ''
			else
			    write_bool_param autodetect 'no'
			    write_string_param urlhost "$urlhost"
			    write_string_param emailhost "$emailhost"
			fi

			write_string_param mta "$(mm_config_get MTA)"
			write_string_param sitelist "$(mm_config_get MAILMAN_SITE_LIST)"
			write_string_param lang "$(mm_config_get DEFAULT_SERVER_LANGUAGE)"
			;;
		write)
			if [ -n "$in_general" ];then
			    if test_bool "$in_autodetect"; then
				in_urlhost='fqdn'
				in_emailhost='fqdn'
			    fi

			    [ -z "$in_urlhost" ] || mm_config_set DEFAULT_URL_HOST "$in_urlhost"
			    [ -z "$in_emailhost" ] || mm_config_set DEFAULT_EMAIL_HOST "$in_emailhost"
			    [ -z "$in_mta" ] || mm_config_set MTA "$in_mta"
			    [ -z "$in_sitelist" ] || mm_config_set MAILMAN_SITE_LIST "$in_sitelist"
			    [ -z "$in_lang" ] || mm_config_set DEFAULT_SERVER_LANGUAGE "$in_lang"

			    [ -n "$in_passwd1" -o -n "$in_passwd2" ] &&
				if [ "$in_passwd1" = "$in_passwd2" ]; then
				    /usr/share/mailman/bin/mmsitepass "$in_passwd1" &> /dev/null
				else
				    write_error "`_ "Passwords mismatch"`"
				    return
				fi
			    [ -n "$in_passwd3" -o -n "$in_passwd4" ] &&
				if [ "$in_passwd3" = "$in_passwd4" ]; then
				    /usr/share/mailman/bin/mmsitepass -c "$in_passwd3" &> /dev/null
				else
				    write_error "`_ "Passwords mismatch"`"
				    return
				fi
			elif [ -n "$in_virtualhost_add" ];then
			    if virtualhost_has "$in_new_virtualhost_url"; then
				write_error "`_ "same virtual host is already defined"`"
				return
			    else
				virtualhost_add "$in_new_virtualhost_url" "$in_new_virtualhost_email"
			    fi
			elif [ -n "$in_virtualhost_del" ];then
			    virtualhost_del "$in_virtualhost"
			fi
			;;
	esac
}

message_loop
