#!/bin/bash
# LGSM core_dl.sh function
# Author: Daniel Gibbs
# Website: http://gameservermanagers.com
lgsm_version="050216"

# Description: Deals with all downloads for LGSM.

# fileurl: The URL of the file: http://example.com/dl/File.tar.bz2
# filedir: location the file is to be saved: /home/server/lgsm/tmp
# filename: name of file (this can be different from the url name): file.tar.bz2
# executecmd: Optional, set to "executecmd" to make file executable using chmod +x
# run: Optional, set to run to execute the file
# force: Optional, force re-download of file even if exists
# md5: Optional, Checks file against an md5 sum
#
# Downloads can be defined in code like so:
# fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}"
# fn_fetch_file "http://example.com/file.tar.bz2" "/some/dir" "file.tar.bz2" "executecmd" "run" "force" "10cd7353aa9d758a075c600a6dd193fd"

fn_dl_md5(){
# Runs MD5 Check if available
if [ "${md5}" != "0" ]&&[ "${md5}" != "nomd5" ]; then
	echo -ne "verifying ${filename} with MD5..."
	sleep 1
	local md5sumcmd=$(md5sum "${filedir}/${filename}"|awk '{print $1;}')
	if [ "${md5sumcmd}" != "${md5}" ]; then
		fn_print_fail_eol_nl
		echo "${filename} returned MD5 checksum: ${md5sumcmd}"
		echo "expected MD5 checksum: ${md5}"
		fn_scriptlog "verifying ${filename} with MD5: FAIL"
		fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}"
		fn_scriptlog "expected MD5 checksum: ${md5}"
		exit 1	
	else
		fn_print_ok_eol_nl
		fn_scriptlog "verifying ${filename} with MD5: OK"
		fn_scriptlog "${filename} returned MD5 checksum: ${md5sumcmd}"
		fn_scriptlog "expected MD5 checksum: ${md5}"		
	fi
fi	
}

# Extracts bzip2 or gzip files
# Extracts can be defined in code like so:
# fn_dl_extract "${filedir}" "${filename}" "${extractdir}"
# fn_dl_extract "/home/gameserver/lgsm/tmp" "file.tar.bz2" "/home/gamserver/serverfiles"
fn_dl_extract(){
filedir="${1}"
filename="${2}"
extractdir="${3}"
# extracts archives
echo -ne "extracting ${filename}..."
fn_scriptlog "extracting download"
mime=$(file -b --mime-type "${filedir}/${filename}")

if [ "${mime}" == "application/gzip" ]; then
	tarcmd=$(tar -zxf "${filedir}/${filename}" -C "${extractdir}")
elif [ "${mime}" == "application/x-bzip2" ]; then
	tarcmd=$(tar -jxf "${filedir}/${filename}" -C "${extractdir}")
fi
local exitcode=$?
if [ ${exitcode} -ne 0 ]; then
	fn_print_fail_eol_nl
	fn_scriptlog "extracting download: FAIL"
	echo "${tarcmd}" | tee -a "${scriptlog}"
	exit ${exitcode}
else
	fn_print_ok_eol_nl
fi
}

# Trap to remove file download if canceled before completed
fn_fetch_trap() {
	echo ""
	echo -ne "downloading ${filename}: "
	fn_print_canceled_eol_nl
	fn_scriptlog "downloading ${filename}: CANCELED"
	sleep 1
	rm -f "${filedir}/${filename}" | tee -a "${scriptlog}"
	echo -ne "downloading ${filename}: "
	fn_print_removed_eol_nl
	fn_scriptlog "downloading ${filename}: REMOVED"
	exit
}

fn_fetch_file(){
fileurl="${1}"
filedir="${2}"
filename="${3}"
executecmd="${4:-0}"
run="${5:-0}"
force="${6:-0}"
md5="${7:-0}"

# If the file is missing, then download
if [ ! -f "${filedir}/${filename}" ]; then
	if [ ! -d "${filedir}" ]; then
		mkdir -p "${filedir}"
	fi
	
	# Check curl exists and use available path
	curlpaths="$(command -v curl 2>/dev/null) $(which curl >/dev/null 2>&1) /usr/bin/curl /bin/curl /usr/sbin/curl /sbin/curl $(echo $PATH | sed "s/\([:]\|\$\)/\/curl /g")"
	for curlcmd in ${curlpaths}
	do
		if [ -x "${curlcmd}" ]; then
			break
		fi
	done
	# If curl exists download file
	if [ "$(basename ${curlcmd})" == "curl" ]; then
		# trap to remove part downloaded files
		trap fn_fetch_trap INT
		# if larger file shows progress bar
		if [ ${filename##*.} == "bz2" ]; then
			echo -ne "downloading ${filename}..."
			sleep 1
			curlcmd=$(${curlcmd} --progress-bar --fail -o "${filedir}/${filename}" "${fileurl}")
			echo -ne "downloading ${filename}..."
		else
			echo -ne "    fetching ${filename}...\c"
			curlcmd=$(${curlcmd} -s --fail -o "${filedir}/${filename}" "${fileurl}" 2>&1)
		fi
		local exitcode=$?
		if [ ${exitcode} -ne 0 ]; then
			fn_print_fail_eol_nl
			if [ -f "${scriptlog}" ]; then
				fn_scriptlog "downloading ${filename}: FAIL"
			fi	
			echo "${curlcmd}" | tee -a "${scriptlog}"
			echo -e "${fileurl}\n" | tee -a "${scriptlog}"
			exit ${exitcode}
		else
			fn_print_ok_eol_nl
			if [ -f "${scriptlog}" ]; then
				fn_scriptlog "downloading ${filename}: OK"
			fi	
		fi
		# remove trap
		trap - INT	
	else
		fn_print_fail_eol_nl
		echo "Curl is not installed!"
		echo -e ""
		exit 1
	fi
	# make file executecmd if executecmd is set
	if [ "${executecmd}" == "executecmd" ]; then
		chmod +x "${filedir}/${filename}"
	fi	
fi

if [ -f "${filedir}/${filename}" ]; then
	fn_dl_md5
	# run file if run is set
	if [ "${run}" == "run" ]; then
		source "${filedir}/${filename}"
	fi
fi	
}



# fileurl: The directory the file is located in teh GitHub repo
# filedir: name of file
# filename: location file to be saved
# executecmd: set to "executecmd" to make file executecmd
# run: Optional, set to run to execute the file
# force: force download of file even if exists
# md5: Checks fail against an md5 sum


# Fetches files from the github repo
fn_fetch_file_github(){
github_file_url_dir="${1}"
github_file_url_name="${2}"
githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
fileurl="${githuburl}"
filedir="${3}"
filename="${github_file_url_name}"
executecmd="${4:-0}"
run="${5:-0}"
force="${6:-0}"
md5="${7:-0}"
fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}"
}


# Fetches functions
fn_fetch_function(){
github_file_url_dir="functions" # github dir containing the file
github_file_url_name="${functionfile}" # name of the github file
githuburl="https://raw.githubusercontent.com/${githubuser}/${githubrepo}/${githubbranch}/${github_file_url_dir}/${github_file_url_name}"
fileurl="${githuburl}"
filedir="${functionsdir}"
filename="${github_file_url_name}"
executecmd="executecmd"
run="run"
force="noforce"
md5="nomd5"
fn_fetch_file "${fileurl}" "${filedir}" "${filename}" "${executecmd}" "${run}" "${force}" "${md5}"
}