#!/bin/sh
# APPװϵͳű

. /etc/PG.conf

RAMDISK="/usr/ramdisk"
TMPDIR="${RAMDISK}/tmp"
APPROOT="${RAMDISK}/app"
APPUPDIR="${RAMDISK}/appupgrade"
APPIMGDIR="${RAMDISK}/admin/app_img"
FLOWEYE="${RAMDISK}/bin/floweye"
NOTICE_FILE="${TMPDIR}/app_install_notice"

if [ -f "/usr/pabin/pacu" ]; then
	CURL="/usr/pabin/pacu"
else
	CURL="`which curl | tail -1`"
fi

SVRIP="download.panabit.com"
SVRURL="https://${SVRIP}:9443"
CURL="${CURL} -k --connect-timeout 20"


resolv_cloud_ip()
{
	SVRIP=`${FLOWEYE} nslookup download.panabit.com 223.5.5.5`

	[ $? -ne 0 ] && return 1

	SVRURL="https://${SVRIP}:9443"

	return 0
}



retjson()
{	
	mkdir -p "${TMPDIR}"
	touch ${NOTICE_FILE}
	chmod -R 777 ${TMPDIR}

	if [ "${3}" = "" ]; then
		echo -n "{ \"code\": ${1}, \"msg\": \"${2}\", \"data\": \"\"}" > ${NOTICE_FILE}
	else
		echo -n "{ \"code\": ${1}, \"msg\": \"${2}\", \"data\": ${3}}" > ${NOTICE_FILE}
	fi

	exit 0
}


upload_app()
{
    local app_file="${1}"
	local app_name="${2}"

	# verify the ramdisk size
	ram_size=10000
	ram_size=`df -k | awk '{if($6=="/usr/ramdisk")print $4}'`

	if [ ${ram_size} -le 27000 ]; then
		rm -rf "${app_file}"
		retjson 1 "RAMDISKĿ¼ռС27M<br>${cname}ֹͣװ"
	fi

	local app_installroot="${APPUPDIR}/__tmp__"

	# give it more space for upgrading
	[ -d ${app_installroot} ] && rm -rf ${app_installroot}
	mkdir -p ${app_installroot}  

	# verify the archive
	if [ "`tar ztf ${app_file} | grep app.inf`" = "" ]; then
		rm -rf ${app_file}
        retjson 1 "ϴļһЧAPPװ"
	fi

	errmsg=`tar xzf ${app_file} -C ${app_installroot} 2>&1`

	if [ "$?" != "0" ]; then
		rm -rf ${app_installroot}
		rm -rf ${app_file}
        sync
        retjson 1 "װ޷⿪!"
	fi

	rm -rf ${app_file}
	sync

	appinf=`find ${app_installroot} -name "app.inf" -maxdepth 1`

	[ "${appinf}" = "" ] && retjson 1 "ϴļһЧAPPװ"

	data=`awk -F "=" \
	'BEGIN{
		dot = "";
		printf "{";
	}{
		gsub("\"", "", $2);

		printf "%s", dot;
		printf "\"%s\":\"%s\"", $1, $2;
		if(dot == "") dot = ",";
	}END{
		printf "}";
	}' ${appinf} `

	retjson 0 "ϴɹ" "${data}"
}


install_app()
{
	local app_installroot="${1}"

	#app.inf, appctrl
	appctrl=`find ${app_installroot} -name appctrl`

	if [ "${appctrl}" = "" ]; then
		rm -rf ${app_installroot}
		retjson 1 "װûappctrlűֹװ!"
	fi

	if [ ! -x ${appctrl} ]; then
		rm -rf ${app_installroot}
		retjson 1 "appctrlűǿִгֹװ!"
	fi

	appinf="`dirname ${appctrl}`/app.inf"
	if [ ! -e ${appinf} ]; then
		rm -rf ${app_installroot}
		retjson 1 "һЧAPPװ"  "[\"ȱҪļ:app.inf\"]"
	fi

	. ${appinf}

	if [ "${app_name}" = "" -o "${app_id}" = "" -o "${app_cname}" = "" ]; then
		rm -rf ${app_installroot}
		retjson 1 "ЧAPPƻIDֹװ!"
	fi

	preinstall="${app_installroot}/preinstall"
	if [ -x ${preinstall} ]; then
		errmsg=`${preinstall}`
		if [ "$?" != "0" ]; then
			rm -rf ${app_installroot}
			retjson 1 "װ${app_cname}" "[\"${errmsg}\"]"
		fi

		rm -f ${preinstall}
	fi

	mkdir -p ${PGPATH}/app/${app_name}
	mkdir -p ${RAMDISK}/app/${app_name}
	cp -Rf ${app_installroot}/* ${PGPATH}/app/${app_name}/
	rm -rf ${app_installroot}/*
	cp -Rf ${PGPATH}/app/${app_name}/* ${RAMDISK}/app/${app_name}/
	sync

	afterinstall="${RAMDISK}/app/${app_name}/afterinstall"
	if [ -x ${afterinstall} ]; then
		errmsg=`${afterinstall}`
		rm -f ${PGPATH}/app/${app_name}/afterinstall
		rm -f ${RAMDISK}/app/${app_name}/afterinstall
	fi

	appctrl="${RAMDISK}/app/${app_name}/appctrl"
	errmsg=`${appctrl} start`

	if [ "$?" != "0" ]; then
		errlist=`awk '{printf ",\"%s\"", $0}' <<EOF
${errmsg}
EOF
`
		retjson 2 "${app_cname}װɹʧ" "[\"\" ${errlist}]"
	fi

	sync
}


download_app()
{	
	local app_name="${1}"
	local app_cname="${2}"
	local file_md5="${3}"

	[ "${app_name}" = "" ] && retjson 1 "NO_APP_NAME"
	[ "${file_md5}" = "" ] && retjson 1 "NO_FILE_MD5"

	curdir=`pwd`

	resolv_cloud_ip
	
	[ $? -ne 0 ] && retjson 1 "ʧ"

    filename="PanabitApp_${app_name}.apx"
    filepath="${curdir}/${filename}"

    url="${SVRURL}/json/index.php?r=package&action=download_package&file_md5=${file_md5}"
	local app_installroot="${APPUPDIR}/${app_name}"

	# verify the ramdisk size
	ram_size=10000
	ram_size=`df -k | awk '{if($6=="/usr/ramdisk")print $4}'`
	[ ${ram_size} -le 27000 ] && retjson 1 "RAMDISKĿ¼ռС27M<br>${CGI_app_cname}ֹͣװ"

	# download file
    if [ ${linux} -eq 1 ]; then
    	${CURL} ${url} -o ${filepath} >/dev/null 2>&1
    else
        ${CURL} ${url} -o ${filepath} >/dev/null 2>&1
    fi

    [ ! -f ${filepath} ] && retjson 1 "${CGI_app_cname}ʧ!"

	# give it more space for upgrading
	[ -d ${app_installroot} ] && rm -rf ${app_installroot}
	mkdir -p ${app_installroot}  

	# verify the archive
	if [ "`tar ztf ${filepath} | grep app.inf`" = "" ]; then
		rm -rf ${filepath}
        retjson 1 "ص${CGI_app_cname}һЧAPPװ!"
	fi

	errmsg=`tar xzf ${filepath} -C ${app_installroot} 2>&1`
	if [ "$?" != "0" ]; then
		rm -rf ${app_installroot}
		rm -rf ${filepath}
        sync
        retjson 1 "${CGI_app_cname}İװ޷⿪!"
	fi
	rm -rf ${filepath}
	sync

	install_app ${app_installroot}

	WEB_LOGGER "Ӧ̵갲װAPP" "name=${CGI_app_cname}"
	retjson 0 "${CGI_app_cname} װɹ"
}


app_base_action()
{
	local action="${1}"
	local app="${2}"

	appctrl="${APPROOT}/${app}/appctrl"
	[ ! -e ${appctrl} ] && retjson "1" "NO_APP_FIND"

	errmsg=`${appctrl} ${action}`

	if [ "$?" != "0" ]; then
		errlist=`awk '{printf ",\"%s\"", $0}' <<EOF
${errmsg}
EOF
`
		retjson 1 "ɹ" "[\"\" ${errlist}]"
	fi

	retjson 0 "ɹ"
}


upload_sys()
{
    return 0
}


upgrade_sys()
{
	return 0
}


case "$1" in
    "upload_app")
        shift
        upload_app $*
        ;;

    "install_app")
        shift
        install_app $*
        ;;

	"download_app")
		shift
		download_app $*
		;;

    "app_base_action")
        shift
        app_base_action $*
        ;;

	"upload_sys")
		shift
		upload_sys $*
		;;

	"upgrade_sys")
		shift
		upgrade_sys $*
		;;

    *)
        echo "$0 [start/stop]"
        ;;
esac
