#!/bin/bash
#external by cuma
[ "$EXTERNAL_ENABLED" == "y" ] || error 1 "external is used by make"

mkdir -p "${EXTERNAL_MOD_DIR}"

#preparation for Downloader outsourcing
OUT_DIR="outboard"
OUT_CONF="downloader.conf"
MESSAGE="EXTERNAL SCRIPT:"
if [ "$EXTERNAL_DOWNLOADER" == "y" ]; then
	if [ -e "$OUT_DIR" ]; then
		echo1 "\"$(pwd)/$OUT_DIR\" is used as directory for outsourced files"
		echo1 "all existing files in this directory will be rewritten"
	else
		echo1 "creating directory \"$(pwd)/$OUT_DIR\" for outsourced files"
		mkdir $OUT_DIR
		[ $? -ne 0 ] && error 1 "$MESSAGE Directory \"$OUT_DIR\" cannot be created"
	fi
	if [ -e "$OUT_DIR/$OUT_CONF" ]; then
		echo1 "removing old Downloader configuration file $OUT_DIR/$OUT_CONF"
		rm "$OUT_DIR/$OUT_CONF"
		[ $? -ne 0 ] && error 1 "$MESSAGE $OUT_DIR/$OUT_CONF cannot be deleted"
	fi
	echo1 "creating new Downloader configuration file $OUT_DIR/$OUT_CONF"
	touch "$OUT_DIR/$OUT_CONF"
fi

#external services
for EXTERNAL_SERVICE in $(find make -maxdepth 2 -name external.services); do
	source $EXTERNAL_SERVICE
done
#.pkg files
echo $EXTERNAL_SERVICES > "${VARTAR_MOD_DIR}/var/mod/etc/external.pkg"
if [ "$EXTERNAL_CREATEPAK_DYNAMIC" != "y" ]; then
	cat "${VARTAR_MOD_DIR}/var/mod/etc/external.pkg" > "${EXTERNAL_MOD_DIR}/external.pkg"
else
	touch "${EXTERNAL_MOD_DIR}/external.pkg"
	for pkg in $EXTERNAL_SERVICES; do
		mkdir -p "${EXTERNAL_MOD_DIR}-${pkg}"
		echo "${pkg}" > "${EXTERNAL_MOD_DIR}-${pkg}/${pkg}.pkg"
	done
fi

#dynamic files
if [ "$EXTERNAL_DYNAMIC" == "y" ]; then
	# search files
	for pkg in $EXTERNAL_SERVICES; do
		pkg_ver="${pkg}-$(cat "$PACKAGES_DIR/.${pkg}")"
		# check if along with ${pkg} a package named ${pkg}-cgi is available, for some packages (e.g. openvpn, ppp, transmission)
		# pkg-files (rc.$pkg, etc.) are provided by the package named ${pkg}-cgi and not by ${pkg}.
		pkg_files="$(collect_pkg_files ${pkg} ${pkg}-cgi ${pkg}-v2-cgi)"

		for file in $pkg_files; do
			case $file in
				/etc/default.$pkg/*|/etc/init.d/rc.*|/etc/onlinechanged/*|/etc/cron.d/*|/usr/lib/cgi-bin/$pkg*)
					[ "$EXTERNAL_DYNAMIC_SCRIPTS" != "y" ] && continue
					;;
			esac
			EXTERNAL_DYNAMIC_FILES+=" $file"
		done
	done
fi

#own files
EXTERNAL_FILES="$EXTERNAL_OWN_FILES $EXTERNAL_DYNAMIC_FILES"
for EXT_FILE in make/*/external.files make/libs/*/external.files; do
	if [ "$EXTERNAL_DYNAMIC" == "y" ]; then
		pkg=$(basename "${EXT_FILE%/external.files}")
		echo "$EXTERNAL_SERVICES" | grep -qE "(^| )${pkg}( |$)" && continue
	fi
	source $EXT_FILE
done
EXTERNAL_FILES=$(echo $EXTERNAL_FILES | sed -e 's| |\n/|g;s|//\+|/|g' | sort -u)

for EXTERNAL_FILE in $EXTERNAL_FILES; do
	FILENAME=$(basename $EXTERNAL_FILE)
	if [ -L "${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE" -a "$EXTERNAL_LINKS" != "y" ]; then
		warn "$MESSAGE ${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE is a symbolic link. It will not be processed"
	else
		IS_SCRIPT=n
		EXTERNAL_LINKSUBDIR=""
		EXTERNAL_TARGETDIR="${EXTERNAL_MOD_DIR}"
		#subdir
		if [ "$EXTERNAL_SUBDIRS" == "y" ]; then
			EXTERNAL_LINKSUBDIR="$(dirname $EXTERNAL_FILE)"
			EXTERNAL_TARGETDIR+="$EXTERNAL_LINKSUBDIR"
			mkdir -p "$EXTERNAL_TARGETDIR"
			#script
			case $EXTERNAL_FILE in
				/etc/cron.d/*|/etc/default.*|/etc/init.d/rc.*|/etc/onlinechanged/*|/usr/lib/cgi-bin/*)
					IS_SCRIPT=y
					;;
			esac
		fi
		#downloader
		EXTERNAL_TEMP="${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE"
		if [ "$EXTERNAL_DOWNLOADER" == "y" ]; then
			[ "$IS_SCRIPT" != "n" ] && continue
			FILEPERM=$(ls -l $EXTERNAL_TEMP | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o",k)}')
			echo2 "packing $FILENAME.gz for Downloader"
			gzip -c "$EXTERNAL_TEMP" > "$OUT_DIR/$FILENAME.gz"
			[ $? -ne 0 ] && error 1 "$MESSAGE $OUT_DIR/$FILENAME.gz cannot be created"
		fi
		#move file
		if [ `ls "$EXTERNAL_TEMP" 2>/dev/null | wc -l` -gt 0 ]; then
			[ -e "$EXTERNAL_TARGETDIR/$FILENAME" ] && error 1 "The file $EXTERNAL_TARGETDIR/$FILENAME already exists"
			mv "$EXTERNAL_TEMP" "$EXTERNAL_TARGETDIR/"
			EXTERNAL_MSG="moved"
			[ "$EXTERNAL_DOWNLOADER" == "y" ] && echo "$FILENAME $FILEPERM /mod/external$EXTERNAL_LINKSUBDIR" >> $OUT_DIR/$OUT_CONF
		else
			EXTERNAL_MSG="not found"
		fi

		#link file
		if [ "$IS_SCRIPT" != "n" ]; then
			EXTERNAL_LINKED=""
		else
			EXTERNAL_LINKED=" & linked"
			ln -s "/mod/external$EXTERNAL_LINKSUBDIR/$FILENAME" "${FILESYSTEM_MOD_DIR}$EXTERNAL_FILE"
		fi
		echo2 "$EXTERNAL_FILE ... $EXTERNAL_MSG$EXTERNAL_LINKED."
	fi
done

#directory for each service package
if [ "$EXTERNAL_CREATEPAK_DYNAMIC" == "y" ]; then
	for pkg in $EXTERNAL_SERVICES; do
		pkg_dir="${EXTERNAL_MOD_DIR}-${pkg}"
		pkg_ver="${pkg}-$(cat "$PACKAGES_DIR/.${pkg}")"
		# check if along with ${pkg} a package named ${pkg}-cgi is available, for some packages (e.g. openvpn, ppp, transmission)
		# pkg-files (rc.$pkg, etc.) are provided by the package named ${pkg}-cgi and not by ${pkg}.
		pkg_files="$(collect_pkg_files ${pkg} ${pkg}-cgi ${pkg}-v2-cgi)"

		for file in $pkg_files; do
			[ ! -e "${EXTERNAL_MOD_DIR}$file" ] && continue
			mkdir -p "${pkg_dir}${file%/*}"
			mv "${EXTERNAL_MOD_DIR}$file" "${pkg_dir}${file}"
		done
		touch "${pkg_dir}/.external"
	done
fi

#remove emtpy directories, dynamic leftover
for dir in $(echo $EXTERNAL_DYNAMIC_FILES | sort -ru); do
	rmdir "${FILESYSTEM_MOD_DIR}$dir" "${EXTERNAL_MOD_DIR}$dir" 2>/dev/null
	while [ "$dir" != "${dir%/*}" ]; do
		dir="${dir%/*}"
		rmdir "${FILESYSTEM_MOD_DIR}$dir" "${EXTERNAL_MOD_DIR}$dir" 2>/dev/null
	done
done

[ $(find $EXTERNAL_MOD_DIR -type f | wc -l) -gt 0 ] && touch "${EXTERNAL_MOD_DIR}/.external"
if [ "$EXTERNAL_DOWNLOADER" == "y" ]; then
	echo "  NOTE: Please upload zipped Downloader files from"
	echo "        \"$(pwd)/$OUT_DIR\" to your http or ftp server"
	echo "        and copy the Downloader configuration from"
	echo "        \"$(pwd)/$OUT_DIR/$OUT_CONF\" into Downloader WEBUI."
elif [ "$EXTERNAL_CREATEPAK" != "y" ]; then
	echo "  NOTE: Please copy content of build/modified/external/ to your box."
fi