#!/bin/sh

. ../common/ajax_common

if [ "${PALANG}" = "en" ]; then
	LANG001="Error"		#ʧ
	LANG002="Success"	#ɹ
	LANG003="Set_DSCP_TAG"	#DSCP
	LANG004="Set_Free_IP"	#òIP
	LANG005="Add_Traffic_Control_Group"		#Ʋ
	LANG006="Copy_Traffic_Control_Group"	#Ʋ
	LANG007="Src Group"	#Դ
	LANG008="New Group"	#²
	LANG009="Del_Traffic_Control_Group"		#ɾƲ
	LANG010="Add_Traffic_Control_Policy"	#ز
	LANG011="Edit_Traffic_Control_Policy"	#༭Ʋ
	LANG012="Del_Traffic_Control_Policy"	#ɾƲ
	LANG013="Diable_Traffic_Control_Policy"	#Ʋ
	LANG014="Enable_Traffic_Control_Policy"	#Ʋ
	LANG015="Del_Traffic_Control_Policy"	#ɾƲ
	LANG016="Diable_Traffic_Control_Policy"	#Ʋ
	LANG017="Enable_Traffic_Control_Policy"	#Ʋ
fi


load_group()
{
    cur_group=`${FLOWEYE} policy getcurgrp | cut -d" " -f1`
    def_group=`${FLOWEYE} policy getdefgrp | cut -d" " -f1`
    errmsg=`${FLOWEYE} policy 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 "]"
}


get_policy_stat()
{
    printf "{"
    printf "\"_NULL_\":\"_NULL_\""

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


set_policy_tos()
{
    [ ${CGI_tos} -ne 1 -a ${CGI_tos} -ne 0 ] && retjson 1 "INV_TOS"

    errmsg=`${FLOWEYE} policy config force_tos=${CGI_tos}`

    if [ $? -ne 0 ]; then
        retjson 1 "${LANG001:=ʧ}${errmsg}"
    else
        sync_floweye "policy config force_tos=${CGI_tos}"
        WEB_LOGGER "${LANG003:=DSCP}" "force_tos=${CGI_tos}"
        retjson 0 "${LANG002:=ɹ}"
    fi
}


set_policy_passip()
{
    [ ${CGI_ip} = "" ] && CGI_ip="0.0.0.0"

    errmsg=`${FLOWEYE} policy config passip=${CGI_ip}`

    if [ $? -ne 0 ]; then
        retjson 1 "${LANG001:=ʧ}${errmsg}"
    else
        sync_floweye "policy config passip=${CGI_ip}"
        WEB_LOGGER "${LANG004:=òIP}" "ip=${CGI_ip}"
        retjson 0 "${LANG002:=ɹ}"
    fi
}


load_search_obj()
{
    . ../common/ajax_object_lib

	printf "{"
    printf "\"stat\":`get_policy_stat`,"
	printf "\"link\":`lib_plink_list`,"
    printf "\"iptab\":`lib_iptable_list`"
	printf "}"
}


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

    [ "${CGI_link}" = "" ] && CGI_link=0
    [ "${CGI_group}" = ""  ] && CGI_group="${curgrp}"
    [ "${CGI_group}" = "0" ] && CGI_group=`${FLOWEYE} policy 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} policy getgrp group="${CGI_group}" link="${CGI_link}" json=1
    printf "]}"
}


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

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


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

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


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

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


get_policy()
{
    ${FLOWEYE} policy 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 "\"ippool_list\":`lib_ippool_list`"
    printf ",\"proxy_list\":`lib_proxy_list`"
	printf ",\"plink_list\":`lib_plink_list`"
    printf ",\"wangroup_list\":`lib_wangroup_list`"
    printf ",\"interface_list\":`lib_interface_list`"
    printf ",\"datapie_list\":`lib_datapie_list`"
    printf ",\"ntmso_list\":[`${FLOWEYE} ntmso list`]"

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

    printf "}"
}


add_policy()
{
    [ "${CGI_group}" = "" ] && retjson 1 "INV_GROUP"
    [ "${CGI_action}" = "edit_policy" ] && action="setrule id=${CGI_oldid} newid=${CGI_polno} " || action="addrule id=${CGI_polno}"

    [ "${CGI_inip}" = "" ] && CGI_inip="any"
    [ "${CGI_outip}" = "" ] && CGI_outip="any"
    [ "${CGI_priority}" = "" ] && CGI_priority=0
    [ "${CGI_natip}" = "" ] && CGI_natip="0"
    [ "${CGI_tos}" = "" ] && CGI_tos="0"
    [ "${CGI_priority}" = "" ] && CGI_priority="0"
    [ "${CGI_iprate}" = "" ] && CGI_iprate="0"
    [ "${CGI_hasms}" = "" ] && CGI_hasms="0"
    [ "${CGI_qqcnt}" = "" ] && CGI_qqcnt="0"
    [ "${CGI_appnot}" = "" ] && CGI_appnot="0"
    [ "${CGI_ttl}" = "" -o "${CGI_ttl}" = "0" ] && CGI_ttl="0-255"
    [ "${CGI_matchact}" = "continue" ] && next=1 || next=0

    if [ "${CGI_proto}" != "any" ]; then
        app="${CGI_appid}.${CGI_proto}"
    else
        app="${CGI_appid}"
    fi

    case "${CGI_pact}" in
        "route")
            CGI_pact="${CGI_pact}-${CGI_route_proxy}"
            [ "${CGI_nexthop}" != "" ] && CGI_pact="${CGI_pact}/${CGI_nexthop}"
            ;;
        "iwansr")
            [ "${CGI_nexthop}" = "" ] && retjson 1 "NO_NEXTHOP"
            CGI_pact="${CGI_pact}-${CGI_mirror_iwan}/${CGI_nexthop}"
            ;;
        "dup")
            CGI_pact="${CGI_pact}-${CGI_netif}"
            ;;
        "portfwd")
            CGI_pact="${CGI_pact}-${CGI_netif}"
            [ "${CGI_netif_vlan}" != "" -a "${CGI_netif_vlan}" != "0" ] && CGI_pact="${CGI_pact}/${CGI_netif_vlan}"
            ;;
        "iwanmir")
            CGI_pact="iwanmir-${CGI_mirror_iwan}"
            [ "${CGI_netif_vlan}" != "" -a "${CGI_netif_vlan}" != "0" ] && CGI_pact="${CGI_pact}/${CGI_netif_vlan}"
            ;;
        "pipe")
            CGI_pact="${CGI_pipe}"
            ;;
        "permit"|"deny")
            CGI_pact="${CGI_pact}"
            ;;
        "tap")
            CGI_pact="${CGI_pact}-${CGI_tap_group}"
            ;;
        *)
            retjson 1 "INV_ACTION"
            ;;
    esac

    id=${CGI_polno}
    [ "${CGI_oldid}" != "" ] && id=${CGI_oldid}
    [ "${CGI_inpxy}" != "" -a "${CGI_inpxy}" != "any" ] && CGI_inif="${CGI_inif}/${CGI_inpxy}"

    cmdargs="${cmdargs} group=${CGI_group} id=${id} newid=${CGI_polno} bridge=${CGI_bridge} dir=${CGI_dir} macgid=${CGI_macgid}"
    cmdargs="${cmdargs} inport=${CGI_inport} outport=${CGI_outport} app=${app} inip=${CGI_submit_srcip} outip=${CGI_submit_dstip}"
    cmdargs="${cmdargs} action=${CGI_pact} iprate=${CGI_iprate} next=${next} ifname=${CGI_ifname}/${CGI_firstpxy} inif=${CGI_inif}"
    cmdargs="${cmdargs} pri=${CGI_priority} natip=${CGI_natip} hasms=${CGI_hasms} qqcnt=${CGI_qqcnt} vlan=${CGI_vlan} pktno=${CGI_pktno}"
    cmdargs="${cmdargs} ttl=${CGI_ttl} soid=${CGI_soid} disable=${CGI_disable} appnot=${CGI_appnot}"

    if [ "${CGI_desc}" != "NULL" -o "${CGI_desc}" != "" ]; then
        [ "${PALANG}" = "en" ] && CGI_desc=`echo ${CGI_desc} | sed -r 's/ /\%20/g'`
        cmdargs="${cmdargs} desc=${CGI_desc}"
    fi

    if [ "${CGI_pact}" = "permit" ]; then
        cmdargs="${cmdargs} tos=${CGI_tos}"
    fi

    errmsg=`${FLOWEYE} policy ${action} ${cmdargs}`

    if [ $? -ne 0 ]; then
        retjson 1 "${LANG001:=ʧ}${errmsg}"
    else
        sync_floweye "policy ${action} ${cmdargs}"
        WEB_LOGGER "${LANG010:=ز}" "action=${CGI_action} ${cmdargs}"
        retjson 0 "${LANG002:=ɹ}"
    fi
}


medit_policy()
{
    for id in `echo ${CGI_items} | tr ";" " "`
    do
        for nameval in `${FLOWEYE} policy getrule group=${CGI_group} id=${id}`
        do
            eval "L_${nameval}"
        done

        L_theapid="${L_appid}"
        [ "${L_proto}" != "any" ] && L_theapid="${L_appid}.${L_proto}"

        case "${L_intype}" in
            "table")
                L_inip=`${FLOWEYE} table list | awk '{if ($2==name) print $1}' name=$L_inip`
                ;;
            "pppoe")
                L_inip=`${FLOWEYE} pppoeippool list | awk '{if($2==name) print $1}' name=$L_inip`
                L_inip="pppoe.${L_inip}"
                ;;
            *)
                L_inip="${L_inip}"
                ;;
        esac
        
        [ "${L_inport}" != "" -a "${L_inport}" != "0" ] && L_inip="${L_inip}:${L_inport}"

        case "${L_outtype}" in
            "table")
                L_outip=`${FLOWEYE} table list | awk '{if ($2==name) print $1}' name=$L_outip`
                ;;
            "pppoe")
                L_outip=`${FLOWEYE} pppoeippool list | awk '{if($2==name) print $1}' name=$L_outip`
                L_outip="pppoe.${L_outip}"
                ;;
            *)
                L_outip="${L_outip}"
                ;;
        esac
        
        [ "${L_outport}" != "" -a "${L_outport}" != "0" ] && L_outip="${L_outip}:${L_outport}"

        case "${L_matchact}" in
            "continue")
                L_next="1"
                ;;
            "stop")
                L_next="0"
                ;;
            "")
                L_next="0"
                ;;
        esac

        [ "${L_inpxy}" != "" -a "${L_inpxy}" != "any" ] && L_inif="${L_inif}/${L_inpxy}"

        cmdargs="policy setrule group=${CGI_group} id=${id} newid=${id} bridge=${CGI_bridge} dir=${L_dir} \
        app=${L_theapid} inip=${L_inip} outip=${L_outip} action=${L_action} iprate=${L_iprate} next=${L_next} \
        tos=${L_tos} pri=${L_priority} natip=${L_natip} hasms=${L_hasms} qqcnt=${L_qqcnt} vlan=${L_vlan} ttl=${L_ttl} desc=${L_desc} \
        macgid=${L_macgid} ifname=${L_ifname} inif=${L_inif} soid=${L_soid}"

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

        [ $? -ne 0 ] && retjson 1 "${LANG001:=ʧ}${errmsg}"
        sync_floweye "${cmdargs}"
    done

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


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

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

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


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

    errmsg=`${FLOWEYE} policy disable group=${CGI_group} id=${CGI_id} disable=1`

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


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

	errmsg=`${FLOWEYE} policy disable group=${CGI_group} id=${CGI_id} disable=0`

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


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

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


btndisable_policy()
{
    for id in `echo ${CGI_items} | tr ";" " "`
    do
        errmsg=`${FLOWEYE} policy disable group=${CGI_group} id=${id} disable=1`
        [ $? -ne 0 ] && retjson 1 "${LANG001:=ʧ}${errmsg}"
        sync_floweye "policy disable group=${CGI_group} id=${id} disable=1"
    done

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


btnenable_policy()
{
    for id in `echo ${CGI_items} | tr ";" " "`
    do
        errmsg=`${FLOWEYE} policy disable group=${CGI_group} id=${id} disable=0`
        [ $? -ne 0 ] && retjson 1 "${LANG001:=ʧ}${errmsg}"
        sync_floweye "policy disable group=${CGI_group} id=${id} disable=0"
    done

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


moveto_new_policy()
{
    ${FLOWEYE} policy listgrp | while read grpid grpname
    do
        havetime=`${FLOWEYE} policy listtime | grep " ${grpid} ${grpname} " | head -1`

        if [ "${havetime}" != "" ]; then
            _month=`echo ${havetime} | cut -d" " -f4`
            _startday=`echo ${havetime} | cut -d" " -f5`
            _endday=`echo ${havetime} | cut -d" " -f6`
            _start=`echo ${havetime} | awk '{printf "%s:%s:%s", $7,$8,$9}'`
            _end=`echo ${havetime} | awk '{printf "%s:%s:%s", $10,$11,$12}'`
        else
            _month=0
            _startday=1
            _endday=7
            _start="00:00:00"
            _end="23:59:59"
        fi

        cmdargs="name=${grpname} inip=any outip=any"
        cmdargs="${cmdargs} month=${_month} startday=${_startday} endday=${_endday} start=${_start} end=${_end}"
        cmdargs="${cmdargs} disable=1 stop=1"

        ${FLOWEYE} policygroup2 add ${cmdargs}
        [ $? -ne 0 ] && continue
        
        while read cfg
        do
            [ "${cfg}" = "" ] && continue
            ${FLOWEYE} newpolicy add ${cfg}
        done <<EOF
`grep "^rule group=${grpname} " ${PGETC}/panabit.conf | cut -d" " -f2-`
EOF
    done

    retjson 0 "${LANG002:=ɹ}"
}


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

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

    "load_search_obj")
        retjson 0 "OK" "`load_search_obj`"
        ;;

    "set_policy_tos")
        action_check
        set_policy_tos
        ;;
    
    "set_policy_passip")
        action_check
        set_policy_passip
        ;;

    "add_group")
        action_check
        add_group
        ;;

    "copy_group")
        action_check
        copy_group
        ;;

    "rmv_group")
        action_check
        rmv_group
        ;;

    "get_policy")
        retjson 0 "OK" "`get_policy`"
        ;;

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

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

    "medit_policy")
        action_check
        medit_policy
        ;;

    "remove_policy")
        action_check
        remove_policy
        ;;

    "disable_policy")
        action_check
        disable_policy
        ;;
    
    "enable_policy")
        action_check
        enable_policy
        ;;

    "btnremove_policy")
        action_check
        btnremove_policy
        ;;

    "btndisable_policy")
        action_check
        btndisable_policy
        ;;

    "btnenable_policy")
        action_check
        btnenable_policy
        ;;

    "moveto_new_policy")
        action_check
        moveto_new_policy
        ;;


    *)
        retjson 1 "UNKNOW_ACTION"
        ;;
esac
