#!/bin/sh

. ../common/ajax_common

if [ "${PALANG}" = "en" ]; then
	LANG001="Error"		#ʧ
	LANG002="Success"	#ɹ
	LANG003="Set_Session_Policy_Stat"	#ӹܿز
	LANG004="Add_Session_Policy_Group"	#Ʋ
	LANG005="Copy_Policy_Group"			#Ʋ
	LANG006="Src_Group"	#Դ
	LANG007="New_Group"	#²
	LANG008="Del_Session_Policy_Group"	#ɾƲ
	LANG009="Set_Session_Policy_Policy"	#Ʋ
	LANG010="Del_Session_Policy_Policy"	#ɾƲ
	LANG011="Del_Session_Policy_Policy"	#ɾƲ
fi


load_group()
{
    cur_group=`${FLOWEYE} conlimit getcurgrp | cut -d" " -f1`
    def_group=`${FLOWEYE} conlimit getdefgrp | cut -d" " -f1`
    errmsg=`${FLOWEYE} conlimit listgrp`

    if [ "${errmsg}" = "" ]; then
        printf "[]"
        return 
    fi

    printf "["

    while read id name
    do
        defgrp="no"
        active="no"

        [ "${cur_group}" = "${id}" ] && active="yes"
        [ "${def_group}" = "${id}" ] && defgrp="yes"

        printf "${dot}{"
        printf "\"active\":\"${active}\","
        printf "\"defgrp\":\"${defgrp}\","
        printf "\"id\":\"${id}\","
        printf "\"name\":\"${name}\""
        printf "}"

        [ "${dot}" = "" ] && dot=","
    done << EOF
    ${errmsg}
EOF
    printf "]"
}


load_conlimit_stat()
{
    ${FLOWEYE} conlimit stat | awk -F"=" \
    'BEGIN{
        printf "{";
        dot = "";   
    }{
        printf "%s\"%s\":\"%s\"", dot, $1, $2;
        if(dot == "") dot = ",";
    }'

    ${FLOWEYE} flow stat | awk -F"=" \
    '{
        printf ",\"%s\":\"%s\"", $1, $2;
    }END{
        printf "}"   
    }'
}


set_conlimit_stat()
{
    errmsg=`${FLOWEYE} flow config dropflow_ttl=${CGI_dropflow_ttl} maxflow_perip=${CGI_maxflow_perip}`
    [ $? -ne 0 ] && retjson 1 "${LANG001:=ʧ}:${errmsg}"

    errmsg=`${FLOWEYE} conlimit config ignore_dns=${CGI_ignore_dns}`
    [ $? -ne 0 ] && retjson 1 "${LANG001:=ʧ}:${errmsg}"

    sync_floweye "conlimit config ignore_dns=${CGI_ignore_dns}"
    WEB_LOGGER "${LANG003:=ӹܿز}" "dropflow_ttl=${CGI_dropflow_ttl} maxflow_perip=${CGI_maxflow_perip} ignore_dns=${CGI_ignore_dns}"
	retjson 0 "${LANG002:=ɹ}"
}


add_group()
{
    errmsg=`${FLOWEYE} conlimit addgrp ${CGI_name}`

    if [ "$?" != "0" ]; then
        retjson 1 "${LANG001:=ʧ}${errmsg}"
    else
        sync_floweye "conlimit addgrp ${CGI_name}"
        WEB_LOGGER "${LANG004:=Ʋ}" "name=${CGI_name}"
		retjson 0 "${LANG002:=ɹ}"
    fi
}


copy_group()
{
    errmsg=`${FLOWEYE} conlimit clonegrp from=${CGI_id} to=${CGI_name}`

    if [ "$?" != "0" ]; then
        retjson 1 "${LANG001:=ʧ}${errmsg}"
    else
        sync_floweye "conlimit clonegrp from=${CGI_id} to=${CGI_name}"
        WEB_LOGGER "${LANG005:=Ʋ}" "${LANG006:=Դ}=${CGI_srcname} ${LANG007:=²}=${CGI_name}"
		retjson 0 "${LANG002:=ɹ}"
    fi
}


rmv_group()
{
    errmsg=`${FLOWEYE} conlimit rmvgrp ${CGI_id}`

    if [ $? -ne 0 ]; then
		retjson 1 "${LANG001:=ʧ}${errmsg}"
    else
        sync_floweye "conlimit rmvgrp ${CGI_id}"
        WEB_LOGGER "${LANG008:=ɾƲ}" "id=${CGI_id}"
		retjson 0 "${LANG002:=ɹ}"
    fi
}


load_policy()
{
    stat="unuse"
    curgrp=`${FLOWEYE} conlimit getcurgrp | cut -d" " -f1`

    [ "${CGI_link}" = "" ] && CGI_link=0
    [ "${CGI_group}" = ""  ] && CGI_group="${curgrp}"
    [ "${CGI_group}" = "0" ] && CGI_group=`${FLOWEYE} conlimit listgrp | head -1 | cut -d" " -f1`

    if [ "${CGI_group}" = "" ]; then
        printf "{\"stat\":\"none\",\"policy\":[]}"
        return
    fi

    [ "${CGI_group}" = "${curgrp}" ] && stat='inwork'

    printf "{"
    printf "\"group\":\"${CGI_group}\","
    printf "\"stat\":\"${stat}\",\"policy\":["

    ${FLOWEYE} conlimit getgrp "${CGI_group}" | grep -i "${CGI_keyword}" | awk \
    -v group=${CGI_group} \
    'BEGIN{
        dot = "";
    }{
        col = 1;
        printf "%s{", dot;
        printf "\"group\":\"%s\",", group;
        printf "\"id\":\"%s\",", $(col++);
        printf "\"appname\":\"%s\",", $(col++);
        printf "\"appcname\":\"%s\",", $(col++);
        printf "\"bridge\":\"%s\",", $(col++);
        printf "\"ifname\":\"%s\",", $(col++);
        printf "\"intype\":\"%s\",", $(col++);
        printf "\"inip\":\"%s\",", $(col++);
        printf "\"inport\":\"%s\",", $(col++);
        printf "\"outtype\":\"%s\",", $(col++);
        printf "\"outip\":\"%s\",", $(col++);
        printf "\"outport\":\"%s\",", $(col++);
        printf "\"maxflow\":\"%s\",", $(col++);
        printf "\"maxtflow\":\"%s\",", $(col++);
        printf "\"maxuflow\":\"%s\",", $(col++);
        printf "\"tflowdenied\":\"%s\",", $(col++);
        printf "\"uflowdenied\":\"%s\",", $(col++);
        printf "\"flowpassed\":\"%s\"", $(col++);
        printf "}";
        if(dot == "") dot = ",";
    }'
    printf "]}"
}


get_policy()
{
    ${FLOWEYE} conlimit getrule group=${CGI_group} id=${CGI_id} | awk -F "=" \
    'BEGIN{
        dot = "";
        printf "{";
    }{
        printf "%s", dot;
        printf "\"%s\":\"%s\"", $1, $2;
        if (dot == "") dot = ",";
    }END{
        printf "}";
    }'
}


load_addpolicy_env()
{
    . ../common/ajax_object_lib

    printf "{"
    printf "\"iptab_list\":`lib_iptable_list`"
    printf ",\"bridge_list\":`lib_bridge_list`"
    printf ",\"interface_list\":`lib_interface_list`"

    if [ "${CGI_id}" != "" ]; then
        printf ",\"policy\":`get_policy`"
    fi

    printf "}"
}


add_policy()
{
    [ "${CGI_action}" = "edit_policy" ] && action="setrule" || action="addrule"

    case "${CGI_intype}" in
        "any")
            CGI_inip="any"
            ;;

        "net")
            CGI_inip="${CGI_inipnet}"
            ;;

        "range")
            CGI_inip="${CGI_iniprng}"
            ;;

        "table")
            CGI_inip="${CGI_iniptab}"
            ;;
    esac

    if [ "${CGI_inport}" != "" -a "${CGI_inport}" != "0" ]; then
        CGI_inip="${CGI_inip}:${CGI_inport}"
    fi	

    case "${CGI_outtype}" in
        "any")
            CGI_outip="any"
            ;;

        "net")
            CGI_outip="${CGI_outipnet}"
            ;;

        "range")
            CGI_outip="${CGI_outiprng}"
            ;;

        "table")
            CGI_outip="${CGI_outiptab}"
            ;;
    esac

	if [ "${CGI_outport}" != "" -a "${CGI_outport}" != "0" ]; then
		CGI_outip="${CGI_outip}:${CGI_outport}"
	fi	

	[ "${CGI_maxtflow}" = "" ] && CGI_maxtflow="0"
	[ "${CGI_maxuflow}" = "" ] && CGI_maxuflow="0"
	[ "${CGI_maxflow}" = "" ] &&  CGI_maxflow="0"

	cmdargs="${action} group=${CGI_group} id=${CGI_id} inip=${CGI_inip} \
outip=${CGI_outip} maxtcpflow=${CGI_maxtflow} maxudpflow=${CGI_maxuflow} maxflow=${CGI_maxflow} \
app=${CGI_appid} bridge=${CGI_bridge} ifname=${CGI_ifname}"

    errmsg=`${FLOWEYE} conlimit ${cmdargs}`

    if [ $? -ne 0 ]; then
        retjson 1 "${LANG001:=ʧ}:${errmsg}"
    else
        sync_floweye "conlimit ${cmdargs}"
        WEB_LOGGER "${LANG009:=Ʋ}" "${action} group=${CGI_group} id=${CGI_id}"
		retjson 0 "${LANG002:=ɹ}"
    fi
}


remove_policy()
{
    [ "${CGI_group}" = "" ] && retjson 1 "INV_GROUP"
    [ "${CGI_id}" = "" ] && retjson 1 "INV_ID"

    errmsg=`${FLOWEYE} conlimit rmvrule ${CGI_group} ${CGI_id}`

    if [ $? -ne 0 ]; then
        retjson 1 "${LANG001:=ʧ}:${errmsg}"
    else
        sync_floweye "conlimit rmvrule ${CGI_group} ${CGI_id}"
        WEB_LOGGER "${LANG010:=ɾƲ}" "group=${CGI_group},id=${CGI_id}"
		retjson 0 "${LANG002:=ɹ}"
    fi
}


btnremove_policy()
{
    for id in `echo ${CGI_items} | tr ";" " "`
    do
        errmsg=`${FLOWEYE} conlimit rmvrule ${CGI_group} ${id}`
        [ $? -ne 0 ] && retjson 1 "${errmsg}"
        sync_floweye "conlimit rmvrule ${CGI_group} ${id}"
    done

    WEB_LOGGER "${LANG011:=ɾƲ}" "group=${CGI_group} ids=${CGI_items}"
	retjson 0 "${LANG002:=ɹ}"
}


case "${CGI_action}" in
    "load_group")
        retjson 0 "OK" "`load_group`"
        ;;

    "load_policy")
        retjson 0 "OK" "`load_policy`"
        ;;

    "load_conlimit_stat")
        retjson 0 "OK" "`load_conlimit_stat`"
        ;;
    
    "load_addpolicy_env")
        retjson 0 "OK" "`load_addpolicy_env`"
        ;;

    "set_conlimit_stat")
        action_check
        set_conlimit_stat
        ;;

    "add_group")
        action_check
        add_group
        ;;

    "copy_group")
        action_check
        copy_group
        ;;

    "rmv_group")
        action_check
        rmv_group
        ;;

    "add_policy"|"edit_policy")
        action_check
        add_policy
        ;;

    "remove_policy")
        action_check
        remove_policy
        ;;

    "btnremove_policy")
        action_check
        btnremove_policy
        ;;

    *)
        retjson 1 "UNKNOW_ACTION"
        ;;
esac
