#!/bin/sh /etc/rc.common
#Author: monokoo <realstones2012@gmail.com>
#Thanks to FW867's help

START=99
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1

LOGFILE="/var/etc/frp/frpc.log"

echo_date(){
	local log=$1
	echo $(date +%Y/%m/%d\ %X): "$log" >> $LOGFILE
}

Reduce_Log(){
	local log=$1
	[ ! -f "$log" ] && return
	local sc=200
	[ -n "$2" ] && sc=$2
	local count=$(grep -c "" $log)
	if [ $count -gt $sc ];then
		let count=count-$sc
		sed -i "1,$count d" $log
	fi
}

conf_proxy_add() {

	local cfg="$1"
	local tmpconf="$2"
	local enable type domain_type custom_domains remote_port local_ip local_port enable_http_auth enable_host_header_rewrite host_header_rewrite
	local subdomain proxy_protocol_version use_encryption use_compression http_user http_pwd remark locations
	local enable_plugin plugin plugin_http_user plugin_http_passwd plugin_unix_path stcp_role stcp_secretkey stcp_servername
        local enable_https_plugin https_plugin plugin_local_addr plugin_crt_path plugin_key_path plugin_host_header_rewrite plugin_header_X_From_Where
	
	config_get_bool enable "$cfg" enable 1
	[ "$enable" -gt 0 ] || return 1
	
	config_get type "$cfg" type
	config_get custom_domains "$cfg" custom_domains
	config_get subdomain "$cfg" subdomain
	config_get remote_port "$cfg" remote_port
	config_get local_ip "$cfg" local_ip
	config_get local_port "$cfg" local_port
	config_get locations "$cfg" locations
	config_get host_header_rewrite "$cfg" host_header_rewrite
	config_get http_user "$cfg" http_user
	config_get http_pwd "$cfg" http_pwd
	config_get remark "$cfg" remark
	config_get plugin "$cfg" plugin
	config_get plugin_http_user "$cfg" plugin_http_user
	config_get plugin_http_passwd "$cfg" plugin_http_passwd
	config_get plugin_unix_path "$cfg" plugin_unix_path
	config_get stcp_role "$cfg" stcp_role
	config_get stcp_secretkey "$cfg" stcp_secretkey
	config_get stcp_servername "$cfg" stcp_servername
	config_get proxy_protocol_version "$cfg" proxy_protocol_version
	config_get https_plugin "$cfg" https_plugin
	config_get plugin_local_addr "$cfg" plugin_local_addr
	config_get plugin_crt_path "$cfg" plugin_crt_path
	config_get plugin_key_path "$cfg" plugin_key_path
	config_get plugin_host_header_rewrite "$cfg" plugin_host_header_rewrite
	config_get plugin_header_X_From_Where "$cfg" plugin_header_X_From_Where


	[ -n "$remark" ] && [ -n "$type" ] || return 1
	
	echo "" >>$tmpconf
	echo "[$remark]" >>$tmpconf
	echo "type=$type" >>$tmpconf
	[ -n "$custom_domains" ] && echo "custom_domains=$custom_domains" >>$tmpconf
	[ -n "$subdomain" ] && echo "subdomain=$subdomain" >>$tmpconf
	[ -n "$remote_port" ] && echo "remote_port=$remote_port" >>$tmpconf
	[ -z "$stcp_role" ] && [ -n "$local_ip" ] && echo "local_ip=$local_ip" >>$tmpconf
	[ -z "$stcp_role" ] && [ -n "$local_port" ] && echo "local_port=$local_port" >>$tmpconf
	[ -n "$locations" ] && echo "locations=$locations" >>$tmpconf
	[ -n "$http_user" -a -n "$http_pwd" ] && {
		echo "http_user=$http_user" >>$tmpconf
		echo "http_pwd=$http_pwd" >>$tmpconf
	}
	[ -n "$host_header_rewrite" ] && echo "host_header_rewrite=$host_header_rewrite" >>$tmpconf
	[ -n "$plugin" ] && echo "plugin=$plugin" >>$tmpconf
	[ -n "$plugin_http_user" -a -n "$plugin_http_passwd" ] && {
		echo "plugin_http_user=$plugin_http_user" >>$tmpconf
		echo "plugin_http_passwd=$plugin_http_passwd" >>$tmpconf
	}
	[ -n "$plugin_unix_path" ] && echo "plugin_unix_path=$plugin_unix_path" >>$tmpconf
	
	[ -n "$stcp_role" ] && {
		if [ "$stcp_role" == "visitor" ]; then
			echo "role=$stcp_role" >>$tmpconf
			[ -n "$local_ip" ] && echo "bind_addr=$local_ip" >>$tmpconf
			[ -n "$local_port" ] && echo "bind_port=$local_port" >>$tmpconf
			[ -n "$stcp_servername" ] && echo "server_name=$stcp_servername" >>$tmpconf || return 1
		else
			[ -n "$local_ip" ] && echo "local_ip=$local_ip" >>$tmpconf
			[ -n "$local_port" ] && echo "local_port=$local_port" >>$tmpconf
		fi
		[ -n "$stcp_secretkey" ] && echo "sk=$stcp_secretkey" >>$tmpconf || return 1
	}
	
	[ -n "$proxy_protocol_version" ] && {
		if [ "$proxy_protocol_version" != "disable" ]; then
			echo "proxy_protocol_version=$proxy_protocol_version" >>$tmpconf
		fi
	}

	[ -n "$https_plugin" ] && echo "plugin=$https_plugin" >>$tmpconf
	[ -n "$plugin_local_addr" ] && echo "plugin_local_addr=$plugin_local_addr" >>$tmpconf
	[ -n "$plugin_crt_path" -a -n "$plugin_key_path" ] && {
		echo "plugin_crt_path=$plugin_crt_path" >>$tmpconf
		echo "plugin_key_path=$plugin_key_path" >>$tmpconf
	}
	[ -n "$plugin_host_header_rewrite" ] && echo "plugin_host_header_rewrite=$plugin_host_header_rewrite" >>$tmpconf
	[ -n "$plugin_header_X_From_Where" ] && echo "plugin_header_X_From_Where=$plugin_header_X_From_Where" >>$tmpconf	

	frp_write_bool use_encryption $cfg 1
	frp_write_bool use_compression $cfg 1

}

frp_write_bool() {
	local opt="$1"
	local config="$2"
	local def="$3"
	local val

	config_get_bool val $config "$opt" "$def"
	if [ "$val" -eq 0 ]; then
		echo "${opt}=false" >> $tmpconf
	else
		echo "${opt}=true" >> $tmpconf
	fi
}

frp_add_cru(){
time=$1
if [ ! -f "/etc/crontabs/root" ] || [ -z "$(cat /etc/crontabs/root | grep frp)" ]; then
  sed -i '/frp/d' /etc/crontabs/root >/dev/null 2>&1
  echo "*/$time * * * * /etc/init.d/frp restart" >> /etc/crontabs/root 
fi

}

frp_del_cru(){
if [ ! -f "/etc/crontabs/root" ] || [ -n "$(cat /etc/crontabs/root | grep frp)" ]; then
  sed -i '/frp/d' /etc/crontabs/root >/dev/null 2>&1
fi
}

download_binary(){
	echo_date "开始下载frpc二进制文件..."
	/usr/bin/wget --no-check-certificate --timeout=10 --tries=1 -o $LOGFILE https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_linux_arm.tar.gz -O /tmp/frp_0.13.0_linux_arm.tar.gz
	[ ! -s "/tmp/frp_0.13.0_linux_arm.tar.gz" ] && /usr/bin/wget -q --no-check-certificate --timeout=10 --tries=1 https://any.mokoo.xyz/app/frp_0.13.0_linux_arm.tar.gz -O /tmp/frp_0.13.0_linux_arm.tar.gz
	[ -f "/tmp/frp_0.13.0_linux_arm.tar.gz" ] && tar -xf /tmp/frp_0.13.0_linux_arm.tar.gz -C /tmp && \
		mv /tmp/frp_0.13.0_linux_arm/frpc /usr/bin/frpc
	rm -rf /tmp/frp_0.13.0_linux_arm*
	if [ -f "/usr/bin/frpc" ]; then
		chmod +x /usr/bin/frpc && echo_date "成功下载frpc二进制文件"
	else
		echo_date "下载frpc二进制文件失败，请重试！"
	fi
}

boot() {
	sleep 10s
	start
}

start() {

	config_load "frp"
	local enabled server_addr server_port time privilege_token user tcp_mux enable_cpool tls_enable
	local pool_count log_level log_max_days login_fail_exit http_proxy protocol admin_port admin_user admin_pwd

	config_get_bool enabled common enabled 1

	[ "$enabled" -gt 0 ] || return 1

	config_get server_addr common server_addr
	config_get server_port common server_port
	config_get token common token
	config_get user common user
	config_get enable_cpool common enable_cpool
	config_get pool_count common pool_count
	config_get log_level common log_level
	config_get log_max_days common log_max_days
	config_get http_proxy common http_proxy
	config_get protocol common protocol
	config_get time common time
	config_get admin_port common admin_port
	config_get admin_user common admin_user
	config_get admin_pwd common admin_pwd


	mkdir -p /var/etc/frp
	[ ! -f "$LOGFILE" ] && touch $LOGFILE
	
	[ ! -f "/usr/bin/frpc" ] && download_binary
	[ ! -f "/usr/bin/frpc" ] && logger -t Frp 'Download frpc failed, please retry.' && exit 0
	
	local tmpconf="/var/etc/frp/frpc.conf"

	echo "[common]" >$tmpconf
	echo "server_addr=${server_addr}" >>$tmpconf
	echo "server_port=${server_port}" >>$tmpconf
	echo "token=${token}" >>$tmpconf
	[ -n "$user" ] && echo "user=$user" >>$tmpconf
	echo "log_level=${log_level}" >>$tmpconf
	echo "log_max_days=${log_max_days}" >>$tmpconf
	echo "protocol=${protocol}" >>$tmpconf
	echo "log_file=$LOGFILE" >>$tmpconf
	[ -n "$http_proxy" ] && echo "http_proxy=$http_proxy" >>$tmpconf
	[ -n "$pool_count" ] && echo "pool_count=$pool_count" >>$tmpconf
	[ -n "$admin_port" ] && echo "admin_addr=0.0.0.0" >>$tmpconf && echo "admin_port=$admin_port" >>$tmpconf
	[ -n "$admin_user" ] && echo "admin_user=$admin_user" >>$tmpconf
	[ -n "$admin_pwd" ] && echo "admin_pwd=$admin_pwd" >>$tmpconf


	config_load "frp"
	frp_write_bool tcp_mux common 1
	frp_write_bool tls_enable common 0
	frp_write_bool login_fail_exit common 1
	config_foreach conf_proxy_add proxy "$tmpconf"

	[ "$(cat "$tmpconf" | grep -c "type=")" -gt 0 ] || (echo_date "frp服务启动失败，请首先添加服务列表！" && exit 0)
	logger -t FRPC 'Starting frp service'
	SERVICE_DAEMONIZE=1 \
		service_start /usr/bin/frpc -c $tmpconf

	[ "$time" -gt 0 ] && frp_add_cru $time
	[ -z "$(pgrep /usr/bin/frpc)" ] && echo_date "frp服务启动失败，请检查服务端 “TCP多路复用(tcp_mux)”设置，确保与客户端完全一致！"

	return 0
}

stop() {
	frp_del_cru
	if [ -n "`pidof frpc`" ]; then
		logger -t FRPC 'Shutting down frp service'
		service_stop /usr/bin/frpc
		Reduce_Log $LOGFILE
	fi
	return 0
}
