#!/bin/sh
#copyright by monlor
export PATH=$PATH:/etc/mixbox/bin

mburl_coding="https://monlor.coding.net/p/mbfiles/d/mbfiles/git/raw/master"
mburl_github="https://raw.githubusercontent.com/monlor/MIXBOX/master"
# mburl_test="https://monlor.coding.net/p/mbfiles/d/mbfiles/git/raw/test"
mburl=$(mbdb get mixbox.main.url) || mburl="$mburl_coding"
mbroot=$(mbdb get mixbox.main.path)
mbdisk=$(mbdb get mixbox.main.mbdisk)
mbbackup="/etc/mbbackup"
[ -z "$mbdisk" ] && mbdisk="${mbroot}"
wanip=$(ubus call network.interface.wan status 2> /dev/null | grep \"address\" | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') || wanip="127.0.0.1"
lanip=$(uci get network.lan.ipaddr 2> /dev/null) || lanip="127.0.0.1"
profilepath=$(mbdb get mixbox.main.profilepath) 
libpath=$(mbdb get mixbox.main.libpath) 
mbver=$(mbdb get mixbox.main.version)
mbtmp=/tmp/mbtmp
[ ! -d "${mbtmp}" ] && mkdir -p ${mbtmp}
model=$(mbdb get mixbox.main.model)
xq=$(cat /proc/xiaoqiang/model 2> /dev/null) || xq="$(uname -s)"

source ${mbroot}/scripts/helper.sh

# if [ "$xq" == "R1D" -o "$xq" == "R2D" -o "$xq" == "R3D"  ]; then
# 	model=arm
# elif [ "$xq" == "R3" -o "$xq" == "R3P" -o "$xq" == "R3G" -o "$xq" == "R1CM" ]; then
# 	model=mips
# fi


# 备份uci配置，主要为了系统升级后能恢复配置
# if [ -f "/etc/config/mixbox" ]; then
# 	[ ! -f ${mbroot}/config/mixbox.uci ] && touch ${mbroot}/config/mixbox.uci
# 	md5_1=$(md5sum /etc/config/mixbox | cut -d' ' -f1)
# 	md5_2=$(md5sum ${mbroot}/config/mixbox.uci | cut -d' ' -f1)
# 	if [ "$md5_1" != "$md5_2" ]; then
# 		cp -rf /etc/config/mixbox ${mbroot}/config/mixbox.uci
# 	fi
# fi

checkuci() {
	# 最初用来检查插件的uci是否存在，现在当插件已经安装则返回0
	result=$(mbdb show $1.main)
	if [ ! -z "$result" -a -d ${mbroot}/apps/$1 ]; then
		return 0
	else
		return 1
	fi

}

checkread() {
	# 传入参数为0或1则返回0，否则返回1
	if [ "$1" == '1' -o "$1" == '0' ]; then
		return 0
	else
		return 1
	fi
}

cutsh() {
	# 传入要分割的文本和要分割出的位置，以逗号分割
	local delimiter=","
	if [ -n "$1" -a -n "$2" ]; then
		[ -n "$3" ] && delimiter="$3"
		echo $1 | cut -d"${delimiter}" -f"$2"
	elif [ -n "$1" -a -z "$2" ]; then
		[ -n "$2" ] && delimiter="$2"
		xargs | cut -d"${delimiter}" -f"$1" 
	fi

}

logsh() {
	# 输出信息到/tmp/messages和标准输出，-s只输入到标准输出，-p只输入到日志文件
	command -v logger &> /dev/null
	if [ $? -eq 0 ]; then
		if [ "$3" == "-s" ]; then
			logger -s -t "$1" "$2"
		elif [ "$3" == "-p" ]; then
			logger -p 1 -t "$1" "$2"
		else
			logger -s -p 1 -t "$1" "$2"
		fi
		return 0
	else
		alias echo_date='echo 【$(TZ=UTC-8 date -R +%Y年%m月%d日\ %X)】:'
		if [ "$3" == "-s" ]; then
			echo_date "$2"
		elif [ "$3" == "-p" ]; then
			echo_date "$2" &> ${mbroot}/var/log/mixbox.log
		else
			echo_date "$2" | tee ${mbroot}/var/log/mixbox.log
		fi
	fi
	
}

pssh() {

	ps -aux &> /dev/null
	[ $? -eq 0 ] && ps -aux | grep -v grep || ps -w | grep -v grep

}

pingsh() {

	ping qq.com -c 2 &> /dev/null
	result1="$?"
	ping baidu.com -c 2 &> /dev/null
	result2="$?"
	[ "$result1" -eq 0 -o "$result2" -eq 0 ] && return 0 || return 1

}

echosh() {
	local length=""
	local string=""
	if [ -z "$2" ]; then
		length="$1"
		string="$(xargs)"
	else
		string="$1"
		length="$2"
	fi
	if [ "${#string}" -gt "$length" ]; then
		let length="$length"-2
		string="$(echo "$string" | cut -b 1-"$length")"..
	fi
	echo -e "$string"
}

readsh() {
	local readtext="$1"
	local uciname="$2"
	local value="$(mbdb get ${appname}.main.$2)"
	local default="$3"
	if [ -z "$value" ]; then
		[ -n "$default" ] && showtext="[回车即$default]" || showtext="[未设置]"
	else
		showtext="[回车即$value]"
	fi
	read -p "$readtext$showtext：" res
	if [ "$uciname" = "res" ]; then
		res="$res"
		return 0
	fi
	
	if [ "$res" = '-1' ]; then
		mbdb del ${appname}.main.$uciname
	else
		if [ -z "$res" ]; then
			if [ -n "$value" ]; then
				mbdb set $appname.main.$uciname="$value" || echo "设置key:"$uciname"等于value:"$value"出错！"
			else
				mbdb set $appname.main.$uciname="$default" || echo "设置key:"$uciname"等于value:"$default"出错！"
			fi
		else
			if [ "$uciname" = "port" ] && [ -n "$(netstat -tunpl 2> /dev/null | grep -w "$res")" ]; then
				echo "端口已被占用！请重新输入！"
				readsh $@
			else
				mbdb set $appname.main.$uciname="$res" || echo "设置key:"$uciname"等于value:"$res"出错！"
				eval "$uciname"="\"$res\""
				return 0
			fi
		fi
	fi
	return 0
}

umountsh() {
	local mount_point="$1"
	[ -z "$mount_point" ] && return 1
	mount_points="$(df -h | grep -Ew "[ ]*"$mount_point"[ ]*" | awk '{print$6}')"
	[ -n "$mount_points" ] && umount -lf "$mount_points" &> /dev/null
	return 0
}

write_firewall_start(){
	if [ "$openport" == "1" ];then
		logsh "【$service】" "添加nat-start触发事件..."
		mbdb set mixbox.firewall.${appname}=1
	fi
	
}

remove_firewall_start(){
	logsh "【$service】" "删除nat-start触发..."
	[ -z "${appname}" ] && return 1
	mbdb set mixbox.firewall.${appname}=0
}

daemon() {
	local binname="$(basename "${1}")"
	nohup $@ &> ${mbroot}/var/log/${binname}.log &
	return $?
}

open_port () {
	local protocol=""
	[ -n "$1" ] && local port="$1"
	[ -n "$2" ] && protocol="$2" || protocol="tcp"
    if [ "$openport" = '1' ]; then
    	if [ -n "$(echo ${port} | grep ',')" ]; then
    		iptables -I INPUT -p "$protocol" -m multiport --dport "${port}" -m comment --comment "mixbox-${appname}" -j ACCEPT 
    	else
    		iptables -I INPUT -p "$protocol" --dport "${port}" -m comment --comment "mixbox-${appname}" -j ACCEPT 
    	fi
    fi

}

close_port () {

	eval `iptables -S | grep "mixbox-${appname}" | sed -e 's/-A/iptables -D/g' | sed -e 's/\$/;/g'`

}

bincheck () {

	binname="$@"
	command -v apt &> /dev/null
	if [ $? -eq 0 ]; then
		logsh "【$service】" "监测到apt程序，使用apt安装..."
		echo y | apt install ${binname} &> /dev/null
	fi
	command -v yum &> /dev/null
	if [ $? -eq 0 ]; then
		logsh "【$service】" "监测到yum程序，使用yum安装..."
		yum install ${binname} -y &> /dev/null
	fi
	command -v pacman &> /dev/null
	if [ $? -eq 0 ]; then
		logsh "【$service】" "监测到pacman程序，使用pacman安装..."
		pacman -S ${binname} --noconfirm &> /dev/null
	fi
	command -v opkg &> /dev/null
	if [ $? -eq 0 ]; then
		logsh "【$service】" "监测到opkg程序，使用opkg安装..."
		opkg install ${binname} &> /dev/null
		[ $? -ne 0 -a -x /opt/bin/opkg ] && /opt/bin/opkg install ${binname} &> /dev/null
	fi
	command -v brew &> /dev/null
	if [ $? -eq 0 ]; then
		logsh "【$service】" "监测到brew程序，使用brew安装..."
		brew install ${binname} &> /dev/null
	fi
	return $?
}


# 通过传入一个字符串，取变量名称等于该字符串的变量值
parse_str() {

    [ -z "${1}" ] && echo -n "" || eval echo -n '$'"${1}"

}

