#!/bin/sh /etc/rc.common
START=21

. /etc/ref_update_mapping
. /etc/cgi_dialog19_api

UCI_CONFIG="appuser_group"
#CGI_ERROR_MSG="/tmp/cgi_error_msg"
SCRIPT_LOCK="/tmp/web_apply_lock/$UCI_CONFIG"
sys_uptime=`cat /proc/uptime | awk 'FS="[.]+" {print $1}'`
BATCH_DEREF_FILE="/tmp/obj_de_ref/${UCI_CONFIG}_$$_$sys_uptime"
dtime=`date +%Y/%m/%d-%H:%M:%S`
DBG_PRINT() {
	echo "[$UCI_CONFIG][$dtime] $1" > /dev/console
	return
}

create_group_set() {
	status=`uci get $UCI_CONFIG.$1.status`
	if	[ "$status" = "enable" ]; then
		ipset -N usr_grp_$1 setlist --size 255
		member=`uci get $UCI_CONFIG.$1.member`
		
		#Modified by Vincent F. 2012/10/05
		#New command to improve performance: ipset -C usr_grp usr_01,usr_02,usr_03,...
		[ "$member" ] && [ ! "$member" = "None" ] && {
			user=`echo "usr_$member" |sed 's/ /,usr_/g'`
			#echo "user: $user" > /dev/console
			ipset -C usr_grp_$1 $user
		}
	fi
}

modify_group_set()
{
	members=`uci get $UCI_CONFIG.$1.member`
	org_mems=`uci oget $UCI_CONFIG.$1.member`
	[ "$members" = "$org_mems" ] && return
	ipset -F usr_grp_$1
	[ -n "$members" -a "$members" != "None" ] && {
		user=`echo "usr_$members" |sed 's/ /,usr_/g'`
		ipset -C usr_grp_$1 $user
	}
}

destroy_group_set() {
	filter_deref_param "$1" "$UCI_CONFIG" "$ref_user_group" "act_del"
	[ "$need_deref" = "1" ] && ERR_CODE=101
}

start() {
	appuser_group_booting $UCI_CONFIG
}

stop() {
	config_load $UCI_CONFIG
	config_foreach destroy_group_set
}

appuser_group_apply()
{
	add_grp=`uci fchanges new $UCI_CONFIG`
	mdf_grp=`uci fchanges modify $UCI_CONFIG`
	del_grp=`uci fchanges delete $UCI_CONFIG`
	#add new tunnel
	[ -n "$add_grp" ] && {
		for name_add in $add_grp
		do
			create_group_set $name_add
		done
		need_commit=1
	}
	#modify tunnel
	[ -n "$mdf_grp" ] && {
		for name_mdf in $mdf_grp
		do
			modify_group_set $name_mdf
			#destroy_group_set $name_mdf
			#create_group_set $name_mdf
		done
		need_commit=1
	}
	#delete old tunnel
	[ -n "$del_grp" ] && {
		for name_del in $del_grp
		do
			destroy_group_set $name_del
		done
		need_commit=1
	}
}

apply() {
	lock $SCRIPT_LOCK
	ERR_CODE=0
	need_commit=0
	
	#initialize -19 dialog format
	CGI_19_DIALOG_BOX_SETUP "CONFIRM" "Object Dereference" "2"
	CGI_19_DIALOG_BUTTON_SETUP "1" "$BATCH_DEREF_FILE &"
	CGI_19_DIALOG_BUTTON_SETUP "2" "rm $BATCH_DEREF_FILE"
	
	#initialized dereference batch file
	BATCH_DEREF_INIT "$UCI_CONFIG"
	
	appuser_group_apply
	
	if [ "$need_commit" = "1" ]; then
		[ -n "$del_grp" ] && {
			for elem in $del_grp; do
				echo "ipset -X usr_grp_$elem 2>&1 >/dev/null |logger" >>$BATCH_DEREF_FILE
				DEREF_CONSOLE "$UCI_CONFIG" "DEL ipset:usr_grp_$elem"
			done
		}
		
		#end of dereference batch file
		BATCH_DEREF_TERM "$UCI_CONFIG"
		
		#prepare BATCH_DEREF_FILE if dereference is needed
		if [ "$need_deref" = "1" ] ;then
			DBG_PRINT "BATCH_DEREF_FILE is ready: $BATCH_DEREF_FILE"
			#Because the obj has been deleted by cgi temporarily, 
			#we must do a revert before user press confirm 'OK'
			uci revert $UCI_CONFIG
			lock -u $SCRIPT_LOCK
			exit $ERR_CODE
		else
			rm $BATCH_DEREF_FILE
			[ -n "$del_grp" ] && {
				for elem in $del_grp; do
					ipset -X usr_grp_$elem 2>&1 >/dev/null |logger
				done
			}
		fi
		uci commit $UCI_CONFIG
	fi
	lock -u $SCRIPT_LOCK
	exit $ERR_CODE
}