#!/usr/local/bin/cbsd
#v11.1.7
globalconf="${workdir}/cbsd.conf";
MYARG="action"
# action=list,get,put
# source=src,obj,base,kernel,img
MYOPTARG="mode quiet arch target_arch ver sources name basename stable inter newjname usehelpers useconfig fromfile"
MYDESC="Working with CBSD Repository"
ADDHELP="action can be: list, get, put
sources can be: src, obj, base, bhyve, kernel, img, helpers, modules\n
mode can be: check, upgrade\n\
stable=1 for RELENG_X\n\
ver=any for mode=list for show all version (no for cur. version only\n\
arch=any for mode=list for show all arch (no for cur. arch only\n\
inter=0 to prevent any questions and to accept answers by default\n\
newjname= for sources=img. Alternative jname for save\n\
fromfile= load arguments from ascii file\n"

. ${subr}
. ${system}
. ${strings}
. ${tools}

init $*

[ -z "${cbsd_queue_name}" ] && cbsd_queue_name="/clonos/bases/"

origver="${ver}"
. ${buildconf}
# prefered for ver in arg
[ "${ver}" != "${origver}" -a -n "${origver}" ] && ver=$origver

readconf buildworld.conf
. ${workdir}/universe.subr
. ${workdir}/fetch.subr

[ -f "${fromfile}" ] && . ${fromfile}

checkmd5()
{
	local _GOOD _OMD5 _RMD5 _i _FILE
	DIR=$1
	_GOOD=0

	for _i in $( /usr/bin/find ${DIR} -type f -depth 1 -name *.md5 -print); do
		_FILE=$( ${ECHO} ${_i} |/usr/bin/sed 's/\.md5//g' )
		_OMD5=$( /bin/cat ${_FILE}.md5 )
		_RMD5=$( /sbin/md5 -q ${_FILE} )
		[ "${_RMD5}" != "${_OMD5}" ] && _GOOD=$((_GOOD + 1))
	done

	return ${_GOOD}
}



checkrepo()
{
	local _i

	for _i in ${repo}; do
		[ -z $1 ] && printf "${MAGENTA}Check for repository${NORMAL}: ${GREEN}${_i}${NORMAL} ..."
		if fetchme -q 1 -u "${_i}/cbsd.index"; then
			/bin/cat "${TF}"
			exit 0
		else
			${ECHO} "${_i} Offline"
			exit 1
		fi
	done
}


getsrc()
{
	init_srcdir

	[ ! -f "${srcdir}/${DIR}/Makefile" -a $upgrade -ne 1 ] && err 1 "You already have ${ver}"

	for MYREPO in ${repo}; do
		${ECHO} "${MAGENTA}REPO${NORMAL}:${GREEN}${MYREPO}${NORMAL}"
		MIRROR="${MYREPO}/src_${ver}/mirror.html"
		fetchme -q 1 -u "${MIRROR}"
		if [ $? -eq 0 ]; then
			MYREPO=$( /bin/cat ${TF} )
			${ECHO} "${MAGENTA}Found new mirror for ${ver}${NORMAL}:${GREEN}${MYREPO}${NORMAL}"
		fi
		fetchme -o ${MYDIR}/src.txz -u ${MYREPO}/${DIR}/src.txz
		[ $? -eq 0 ] || ${ECHO} "${MAGENTA}Not found: ${GREEN}${MYREPO}/${DIR}/src.txz${NORMAL}" && icontinue
		fetchme -o ${MYDIR}/src.txz.md5 -u ${MYREPO}/${DIR}/src.txz.md5
		[ $? -eq 0 ] || ${ECHO} "${MAGENTA}Not found: ${GREEN}${MYREPO}/${DIR}/src.txz.md5${NORMAL}" && continue
	done

	[ -f "${MYDIR}/src.txz" -a -f "${MYDIR}/src.txz.md5" ] || err 1 "No sources found"

	if checkmd5 ${MYDIR}; then
		${ECHO} "${MAGENTA}MD5sum correct.${NORMAL}"
	else
		err 1 "${MAGENTA}MD5sum incorrect.${NORMAL}"
	fi

	ARCHIVE="${workdir}/tmp/src_${ver}.txz"
	[ -f "${ARCHIVE}" ] && /bin/rm -f ${ARCHIVE}

	${ECHO} "${MAGENTA}Extracting...${NORMAL}"
	cd $workdir/tmp
	set -e
	/usr/bin/tar xfz ${MYDIR}/src.txz
	set +e
	/bin/rm -f ${MYDIR}/src.txz
	/bin/mkdir -p ${srcdir}/src_${ver}
	/bin/mv ${workdir}/tmp/src_${ver} ${srcdir}/
	${ECHO} "${MAGENTA}Done...${NORMAL}"
	DT=$( /bin/date "+%Y%m%d" )
}

register_fetched_base()
{
	#idx platform name arch ver stable elf date
	baseelf=
	baseelf=$( ${miscdir}/elf_tables --ver ${BASE_DIR}/bin/sh 2>/dev/null )

	[ -z "${baseelf}" ] && baseelf="0"

	strpos --str="${ver}" --search="."

	pos=$?
	if [ ${pos} -eq 0 ]; then
		stable=1
	else
		stable=0
	fi

	#${ECHO} "${MAGENTA}Register base as: ${GREEN}p=$platform,a=$arch,t=$TARGET_ARCH,v=$ver,s=$stable${NORMAL}"
	register_base arch=${arch} ver=${ver} target_arch=${TARGET_ARCH} stable=${stable} platform="${platform}"
}


getbase()
{
	local _srcmd5_found _src_found _majorver _release _rel_postfix
	local win_mirror win_rate t_size
	local _mirror_num=0 _mirror_cur=0

	if [ -z "${basename}" ]; then
		BDIR="${basejailpref}_${arch}_${ver}"
	else
		BDIR="${basejailpref}_${basename}_${arch}_${ver}"
	fi

	case "${platform}" in
		DragonFly)
			err 1 "${MAGENTA}${platform} unsupported yet${NORMAL}"
			;;
		FreeBSD)
			case "${ver}" in
				12*)
					# HEAD placed at /pub/FreeBSD/snapshots/amd64/XX.0-CURRENT/
					_release="snapshots"
					_rel_postfix="CURRENT"
					FHIER="${arch}/${target_arch}/12.0"
					;;
				*)
					# RELEASES placed at /pub/FreeBSD/releases/${FHIER}-RELEASE/base.txz"
					_release="releases"
					_rel_postfix="RELEASE"
					FHIER="${arch}/${target_arch}/${ver}"
					;;
			esac
			BSDBASE_DISTSITE="https://download.freebsd.org/ftp/${_release}/${FHIER}-${_rel_postfix}/base.txz http://ftp.freebsd.org/pub/FreeBSD/${_release}/${FHIER}-${_rel_postfix}/base.txz https://pub.allbsd.org/pub/FreeBSD/${_release}/${FHIER}-${_rel_postfix}/base.txz"
			;;
		HardenedBSD)
			# Assume HBSD always in stable=1: at the moment (2018-01-17) doesn't have
			# /hardenedbsd-X.Y- url. So, adduct ver version to major version for repo hier
			_majorver=${ver%%.*}
			FHIER="${arch}/${target_arch}/hardenedbsd-${_majorver}-stable-LAST"
			BSDBASE_DISTSITE="https://pub.allbsd.org/pub/HardenedBSD/releases/${FHIER}/base.txz https://installer.hardenedbsd.org/pub/HardenedBSD/releases/${FHIER}/base.txz"
			;;
	esac

	if [ -x "${BASE_DIR}/bin/sh" ]; then
		[ ${upgrade} -eq 1 ] || err 1 "${MAGENTA}You already have ${ver}. Use mode=upgrade for upgrade${NORMAL}"
		${CHFLAGS_CMD} -R noschg ${BASE_DIR}
	fi

	strpos --str="${ver}" --search="."

	pos=$?
	if [ ${pos} -eq 0 ]; then
		stable=1
	else
		stable=0
	fi

	init_target_arch

	trap "cleanup_bases" HUP INT ABRT BUS TERM EXIT
	register_base arch=${arch} ver=${ver} target_arch=${TARGET_ARCH} stable=${stable} platform="${platform}"

	# CBSD QUEUE
	if [ -x "${moduledir}/cbsd_queue.d/cbsd_queue" ]; then
		[ "${cbsd_queue_name}" != "none" ] && cbsd_queue_sys cbsd_queue_name=${cbsd_queue_name} cmd=repo elf="-" id=base${ver}-${arch}-${stable} platform=${platform} arch=${arch} targetarch=${targetarch} ver=${ver} stable="${stable}" date="-" status=1
	fi

	if [ -x "${BASE_DIR}/bin/sh" ]; then
		base_status_is_maintenance_soft
	else
		base_status_is_maintenance_hard
	fi

	win_mirror=
	win_rate=0
	t_size=0

	if [ "${fbsdrepo}" = "1" ]; then
		${ECHO} "${MAGENTA}Scanning for fastest mirror...${NORMAL}"

		_mirror_num=$( echo "${BSDBASE_DISTSITE}" | /usr/bin/wc -w | /usr/bin/awk {'printf $1'} )

		local max_url_len=0
		local cur_url_len=0
		local free_len=0

		# determine longest url
		for i in ${BSDBASE_DISTSITE}; do
			cur_url_len=$( strlen ${i} )
			[ ${cur_url_len} -gt ${max_url_len} ] && max_url_len=${cur_url_len}
		done

		max_url_len=$(( max_url_len + 1 ))

		for i in ${BSDBASE_DISTSITE}; do
			_mirror_cur=$(( _mirror_cur + 1 ))
			cur_url_len=$( strlen ${i} )
			free_len=$(( max_url_len - cur_url_len ))
			printf " ${WHITE}* ${LGREEN}[ %-5s ] ${GREEN}${i}${NORMAL}:%-${free_len}s" ${_mirror_cur}/${_mirror_num}
			t_size=$( /usr/bin/timeout -s HUP 3 ${bindir}/cfetch -s 1 -o /dev/null -u ${i} 2>/dev/null )
			if [ -z "${t_size}" ]; then
				${ECHO} "${LRED}failed${NORMAL}"
			else
				${ECHO} "${LCYAN}${t_size}${NORMAL}"
				if ! is_number ${t_size}; then
					if [ ${t_size} -gt ${win_rate} ]; then
						win_rate=${t_size}
						win_mirror="${i}"
					fi
				else
					${ECHO} "${LRED}failed, no size${NORMAL}"
				fi
			fi
		done
		[ -n "${win_mirror}" ] && ${ECHO} "${LYELLOW} Winner: ${GREEN}${win_mirror}${NORMAL}"
		iso_site="${win_mirror} ${BSDBASE_DISTSITE}"
	fi

	if [ "${fbsdrepo}" = "1" -a -z "${basename}" ]; then
		## Official fbsd repo
		${ECHO} "${MAGENTA}Looking for official ${platform} mirror:${NORMAL}"
		ARCHIVE="${MYDIR}/base.txz"
		for i in ${iso_site}; do
			fetchme -u ${i} -o ${ARCHIVE}
			if [ $? -eq 0 ]; then
				break
			else
				[ -r ${ARCHIVE} ] && /bin/rm -f ${ARCHIVE}
			fi
		done
		if [ -r ${ARCHIVE} ]; then
			printf "\n${MAGENTA}Extracting base...${NORMAL}\n"
			[ ! -d "${BASE_DIR}" ] && mkdir -p ${BASE_DIR}
			cd ${BASE_DIR}
			set -e
			/usr/bin/tar xfz ${ARCHIVE}
			set +e
			/bin/rm -f ${ARCHIVE}
			# fetch lib32 only for amd64
			if [ "${arch}" = "amd64" ]; then
				if [ "${platform}" = "FreeBSD" ]; then
					BSDBASE_DISTSITE="https://download.freebsd.org/ftp/${_release}/${FHIER}-${_rel_postfix}/lib32.txz http://ftp.freebsd.org/pub/FreeBSD/${_release}/${FHIER}-${_rel_postfix}/lib32.txz https://pub.allbsd.org/pub/FreeBSD/${_release}/${FHIER}-${_rel_postfix}/lib32.txz"

					#BSDBASE_DISTSITE="$MIRROR/pub/FreeBSD/releases/${FHIER}-RELEASE/lib32.txz"
					ARCHIVE="${MYDIR}/lib32.txz"
					for i in ${BSDBASE_DISTSITE}; do
						fetchme -u ${i} -o ${ARCHIVE}
						if [ $? -eq 0 ]; then
							break
						else
							[ -r ${ARCHIVE} ] && /bin/rm -f ${ARCHIVE}
						fi
					done
					if [ -r ${ARCHIVE} ]; then
						printf "\n${MAGENTA}Extracting lib32...${NORMAL}\n"
						cd ${BASE_DIR}
						set -e
						/usr/bin/tar xfz ${ARCHIVE}
						set +e
						/bin/rm -f ${ARCHIVE}
					else
						printf "${GREEN} Lib32 not found${NORMAL}\n"
					fi
				fi
			fi
			preparebase dst=${BASE_DIR}
			register_fetched_base
			# CBSD QUEUE
			if [ -x "${moduledir}/cbsd_queue.d/cbsd_queue" ]; then
				baseelf=
				baseelf=$( ${miscdir}/elf_tables --ver ${BASE_DIR}/bin/sh 2>/dev/null )
				date=$( /bin/date +%s )
				[ "${cbsd_queue_name}" != "none" ] && cbsd_queue_sys cbsd_queue_name=${cbsd_queue_name} cmd=update id=base${ver}-${arch}-${stable} elf=${baseelf}  platform=${platform} ver=${ver} rev="${SCM_REV}" date="${date}" stable="${stable}" status=1
				[ "${cbsd_queue_name}" != "none" ] && cbsd_queue_sys cbsd_queue_name=${cbsd_queue_name} cmd=repo id=base${ver}-${arch}-${stable} status=2
			fi

			${ECHO} "${MAGENTA}Done...${NORMAL}"
			return 0
		fi
		printf "${GREEN} Not found${NORMAL}\n"
		### Official fbsd repo end ###
	fi

	# _srcmd5_found=0
	_src_found=0

	for MYREPO in ${repo}; do
		${ECHO} "${MAGENTA}REPO: ${GREEN}${MYREPO}${NORMAL}"
		MIRROR="${MYREPO}/releases/${FHIER}/mirror.html";
		fetchme -q1 -u ${MIRROR} -o ${TF}

		if [ $? -eq 0 ]; then
			MYREPO=$( /bin/cat ${TF} )
			${ECHO} "${MAGENTA}Found new mirror for ${ver}: ${GREEN}${MYREPO}${NORMAL}"
		fi

		if [ -z "${basename}" ]; then
			${ECHO} "${MAGENTA}Looking for: ${GREEN}${MYREPO}/releases/${FHIER}/base.txz${NORMAL}"
			fetchme -o ${MYDIR}/base_${arch}_${target_arch}_${ver}.txz -u ${MYREPO}/releases/${FHIER}/base.txz

			if [ $? -ne 0 ]; then
				${ECHO} "${MAGENTA}Base not found: ${GREEN}${MYREPO}/releases/${FHIER}/base.txz${NORMAL}"
				continue
			else
				_src_found=1
			fi

#	    fetchme -q1 -o ${MYDIR}/base_${arch}_${ver}.txz.md5 -u ${MYREPO}/${DIR}/base_${arch}_${ver}.txz.md5

#	    if [ $? -ne 0 ]; then
#		${ECHO} "${MAGENTA}MD5 base not found: ${GREEN}${MYREPO}/${DIR}/base_${arch}_${ver}.txz.md5${NORMAL}"
#		continue
#	    else
		_srcmd5_found=1
#	    fi
	    else
		${ECHO} "${MAGENTA}Looking for: ${GREEN}${MYREPO}/releases/${FHIER}/base_${basename}.txz${NORMAL}"
		fetchme -o ${MYDIR}/base_${basename}_${arch}_${target_arch}_${ver}.txz -u ${MYREPO}/releases/${FHIER}/base_${basename}.txz

		if [ $? -ne 0 ]; then
			${ECHO} "${MAGENTA}Base not found: ${GREEN}${MYREPO}/releases/${FHIER}/base_${basename}.txz${NORMAL}"
			continue
		else
			_src_found=1
		fi

#	    fetchme -q1 -o ${MYDIR}/base_${basename}_${arch}_${ver}.txz.md5 -u ${MYREPO}/${DIR}/base_${basename}_${arch}_${ver}.txz.md5

#	    if [ $? -ne 0 ]; then
#		${ECHO} "${MAGENTA}MD5 base not found: ${GREEN}${MYREPO}/${DIR}/base_${arch}_${ver}.txz.md5${NORMAL}"
#		continue
#	    else
		_srcmd5_found=1
#	    fi
		fi

		[ ${_srcmd5_found} -eq 1 -a ${_src_found} -eq 1 ] && break
	done

#    if checkmd5 ${MYDIR}; then
#	${ECHO} "${MAGENTA}MD5 sum:${GREEN} correct${NORMAL}"
#    else
#	err 1 "${MAGENTA}MD5 sum: ${GREEN}incorrect${NORMAL}"
#    fi

#    if [ -z "${basename}" ]; then
#	rm -f  ${MYDIR}/base_${arch}_${ver}.txz.md5
#    else
#	rm -f ${MYDIR}/base_${basename}_${arch}_${ver}.txz.md5
#    fi

	[ ${_src_found} -ne 1 ] && err 1 "${MAGENTA}Not found data${NORMAL}"

	${ECHO} "${MAGENTA}Extracting...${NORMAL}"
	[ ! -d "${BASE_DIR}" ] && mkdir -p ${BASE_DIR}
	#/base_${arch}_${ver}
	cd $BASE_DIR
	#/base_${arch}_${ver}

	if [ -z "${basename}" ]; then
		set -e
		tar xfz ${MYDIR}/base_${arch}_${target_arch}_${ver}.txz
		set +e
#		rm -f ${MYDIR}/base_${arch}_${target_arch}_${ver}.txz.md5
	else
		set -e
		tar xfz ${MYDIR}/base_${basename}_${arch}_${target_arch}_${ver}.txz
		set +e
#		rm -f ${MYDIR}/base_${basename}_${arch}_${target_arch}_${ver}.txz.md5
	fi

	register_fetched_base
	cleanup_bases

	# CBSD QUEUE
	if [ -x "${moduledir}/cbsd_queue.d/cbsd_queue" ]; then
		baseelf=
		baseelf=$( ${miscdir}/elf_tables --ver ${BASE_DIR}/bin/sh 2>/dev/null )
		date=$( /bin/date +%s )
		[ "${cbsd_queue_name}" != "none" ] && cbsd_queue_sys cbsd_queue_name=${cbsd_queue_name} cmd=update id=base${ver}-${arch}-${stable} elf=${baseelf}  platform=${platform} ver=${ver} rev="${SCM_REV}" date="${date}" stable="${stable}" status=1
		[ "${cbsd_queue_name}" != "none" ] && cbsd_queue_sys cbsd_queue_name=${cbsd_queue_name} cmd=repo id=base${ver}-${arch}-${stable} status=2
	fi

	${ECHO} "${MAGENTA}Done...${NORMAL}"

	return 0
}


getobj()
{
	if [ -z "${basename}" ]; then
		DST="${srcdir}/obj_${arch}_${ver}"
	else
		DST="${srcdir}/obj_${basename}_${arch}_${ver}"
	fi

	for MYREPO in ${repo}; do
		${ECHO} "${MAGENTA}REPO:${GREEN}${MYREPO}${NORMAL}"
		if [ -z "${basename}" ]; then
			MIRROR="${MYREPO}/obj_${arch}_${ver}/mirror.html";
		else
			MIRROR="${MYREPO}/obj_${basename}_${arch}_${ver}/mirror.html";
		fi

		if [ -d "${DST}" ]; then
			[ $upgrade -eq 1 ] || err 1 "You already have ${ver}"
			removeobj ver=${ver} arch=${arch}
		fi

		fetchme -q1 -u ${MIRROR} -o ${TF}

		if [ $? -eq 0 ]; then
			MYREPO=$( /bin/cat ${TF} )
			${ECHO} "Found new mirror for ${basename}: ${MYREPO}"
		fi

		if [ -z "${basename}" ]; then
			fetchme -o ${MYDIR}/obj_${arch}_${ver}.txz -u ${MYREPO}/${DIR}/obj_${arch}_${ver}.txz
			[ $? -eq 0 ] || continue
			fetchme -q1 -o ${MYDIR}/obj_${arch}_${ver}.txz.md5 -u ${MYREPO}/${DIR}/obj_${arch}_${ver}.txz.md5
			[ $? -eq 0 ] || continue
		else
			fetchme -o ${MYDIR}/obj_${basename}_${arch}_${ver}.txz -u ${MYREPO}/${DIR}/obj_${basename}_${arch}_${ver}.txz
			[ $? -eq 0 ] || continue
			fetchme -q1 -o ${MYDIR}/obj_${basename}_${arch}_${ver}.txz.md5 -u ${MYREPO}/${DIR}/obj_${basename}_${arch}_${ver}.md5
			[ $? -eq 0 ] || continue
		fi
	done

	if [ -z "${basename}" ]; then
		[ ! -f "${MYDIR}/obj_${arch}_${ver}.txz.md5" -a ! -f "${MYDIR}/obj_${arch}_${ver}.txz" ] && err 1 "No sources found"
	else
		[ ! -f "${MYDIR}/obj_${basename}_${arch}_${ver}.txz.md5" -a ! -f "${MYDIR}/obj_${basename}_${arch}_${ver}.txz" ] && err 1 "No sources found"
	fi

	if checkmd5 ${MYDIR}; then
		${ECHO} "MD5sum correct."
	else
		err 1 "MD5sum incorrect."
	fi

	/bin/rm -f ${MYDIR}/obj_${arch}_${ver}.txz.md5

	${ECHO} "Extracting..."
	cd $srcdir
	set -e
	tar xfz ${MYDIR}/obj_${arch}_${ver}.txz
	set +e
	rm -f ${MYDIR}/obj_${arch}_${ver}.txz
	${ECHO} "Done..."
}


getkernel()
{
	local name KERNNAME

	if [ -n "${name}" -a "${name}" != "GENERIC" ]; then
		KERNNAME="-${name}"
	else
		KERNNAME="-GENERIC"
	fi

	FHIER="${arch}/${target_arch}/${ver}"

	if [ -d "${KERNEL_DIR}" ]; then
		[ $upgrade -ne 1 ] && err 1 "${MAGENTA}You already have kernel ${name} for ${ver}${NORMAL}"
		removekernel ver=${ver} arch=${arch} name=${name}
	fi

	for MYREPO in ${repo}; do
		${ECHO} "${MAGENTA}REPO: ${GREEN}${MYREPO}${NORMAL}"
		MIRROR="${MYREPO}/releases/${FHIER}/mirror.html"
		fetchme -q1 -u ${MIRROR} -o ${TF}

		if [ $? -eq 0 ]; then
			MYREPO=$( /bin/cat ${TF} )
			${ECHO} "${MAGENTA}Found new mirror for ${ver}: ${GREEN}${MYREPO}${NORMAL}"
		fi

		${ECHO} "${MAGENTA}Looking for: ${GREEN}${MYREPO}/releases/${FHIER}/kernel${KERNNAME}.txz${NORMAL}"
		fetchme -o ${MYDIR}/kernel_${name}_${arch}_${ver}.txz -u ${MYREPO}/releases/${FHIER}/kernel${KERNNAME}.txz
		[ $? -eq 0 ] || continue
		# fetchme -q1 -o ${MYDIR}/kernel_${name}_${arch}_${ver}.txz.md5 -u ${MYREPO}/${DIR}/kernel_${name}_${arch}_${ver}.txz.md5
		# [ $? -eq 0 ] || continue
	done

	[ ! -f "${MYDIR}/kernel_${name}_${arch}_${ver}.txz" ] && err 1 "${MAGENTA}No such sources:${GREEN}${MYDIR}/kernel_${name}_${arch}_${ver}.txz${NORMAL}"

	# if checkmd5 ${MYDIR}; then
	# ${ECHO} "${MAGENTA}MD5 sum: ${GREEN}correct${NORMAL}"
	# else
	# err 1 "${MAGENTA}MD5 sum: ${GREEN}incorrect${NORMAL}"
	# exit 1
	# fi

	# /bin/rm -f ${MYDIR}/kernel_${name}_${arch}_${ver}.txz.md5

	${ECHO} "${MAGENTA}Extracting...${NORMAL}"
	[ ! -d "${KERNEL_DIR}" ] && mkdir -p ${KERNEL_DIR}
	cd $KERNEL_DIR
	set -e
	tar xfz ${MYDIR}/kernel_${name}_${arch}_${ver}.txz
	set +e
	rm -f ${MYDIR}/kernel_${name}_${arch}_${ver}.txz
	${ECHO} "${MAGENTA}Done...${NORMAL}"
}


getimg()
{
	local FHIER DST

	[ -z "${newjname}" ] && newjname="${name}"

	DST="${importdir}/${newjname}.img"
	FHIER="${arch}/${target_arch}/${ver}/${name}"

	if [ -f "${DST}" ]; then
		getyesno "You already have ${DST}. Remove them?"
		if [ $? -eq 0 -o $? -eq 3 ]; then
			/bin/rm -f ${DST}
		else
			err 1 "${MAGENTA}You already have: ${GREEN}${DST}${NORMAL}"
		fi
	fi

	jstatus jname=${newjname} > /dev/null 2>&1
	[ $? -ne 0 ] && err 1 "${MAGENTA}You already have ${GREEN}${newjname}${MAGENTA} jail. Remove it or use ${GREEN}newjname=${NORMAL}"

	for MYREPO in ${repo}; do
		${ECHO} "${MAGENTA}REPO:${GREEN} ${MYREPO}"
		MIRROR="${MYREPO}/img/${FHIER}/mirror.html"
		fetchme -q1 -u ${MIRROR} -o ${TF}

		if [ $? -eq 0 ]; then
			MYREPO=$( /bin/cat ${TF} )
			${ECHO} "${MAGENTA}Found new mirror for ${name} ${NORMAL}: ${MYREPO}"
		fi

		${ECHO} "${MAGENTA}Fetching ${name} jail: ${GREEN}${MYREPO}/${DIR}${MAGENTA}${NORMAL}"
		fetchme -o ${DST} -u ${MYREPO}/img/${FHIER}/${name}.img

		[ $? -eq 0 ] || continue
	done

	[ ! -f "${DST}" ] && err 1 "No such remote file or network problem"
}

getbhyve()
{
	local FHIER DST

	[ -z "${name}" ] && err 1 "${MAGENTA}Empty name=${NORMAL}"

	[ -z "${newjname}" ] && newjname="${name}"

	DST="${importdir}/${newjname}.img"

	if [ -f "${DST}" ]; then
		getyesno "You already have ${DST}. Remove them?"
		if [ $? -eq 0 -o $? -eq 3 ]; then
			/bin/rm -f ${DST}
		else
			err 1 "${MAGENTA}You already have: ${GREEN}${DST}${NORMAL}"
		fi
	fi

	jstatus jname=${newjname} > /dev/null 2>&1
	[ $? -ne 0 ] && err 1 "${MAGENTA}You already have ${GREEN}${newjname}${MAGENTA} vm."

	for MYREPO in ${repo}; do
		${ECHO} "${MAGENTA}REPO:${GREEN} ${MYREPO}"
		MIRROR="${MYREPO}/bhyve/${name}/mirror.html"
		fetchme -q1 -u ${MIRROR} -o ${TF}

		if [ $? -eq 0 ]; then
			MYREPO=$( /bin/cat ${TF} )
			${ECHO} "${MAGENTA}Found new mirror for ${name} ${NORMAL}: ${MYREPO}"
		fi

		${ECHO} "${MAGENTA}Fetching ${name} jail: ${GREEN}${MYREPO}/${DIR}${MAGENTA}${NORMAL}"
		fetchme -o ${DST} -u ${MYREPO}/bhyve/${name}.img

		[ $? -eq 0 ] || continue
	done

	[ ! -f "${DST}" ] && err 1 "No such remote file or network problem"
}




gethelpers()
{
	DST="${sharedir}/helpers"

	[ ! -d "${DST}" ] && mkdir -p ${DST}

	MIRROR="https://boot.bsdstore.ru/helpers"

	if [ -z "${name}" ]; then
		fetchme -q1 -u ${MIRROR}/helpersls -o ${ftmpdir}/helpers.$$.list
		[ $? -ne 0 ] && err 1 "${MAGENTA}Error fetching for: ${GREEN}helper list${NORMAL}"
		for i in $( /bin/cat ${ftmpdir}/helpers.$$.list ); do
			${ECHO} "${MAGENTA}Get helpers: ${GREEN}${i}${NORMAL}"
			if [ "${mode}" = "upgrade" ]; then
				repo action=get sources=helpers name=${i} mode=upgrade
			else
				repo action=get sources=helpers name=${i}
			fi
		done
		/bin/rm -f ${ftmpdir}/helpers.$$.list
		exit 0
	fi

	[ ! -d "${tmpdir}/helpers" ] && mkdir -p ${tmpdir}/helpers
	fetchme -q1 -u ${MIRROR}/${name}.tgz -o ${tmpdir}/helpers/helpers_${name}.$$.tgz

	if [ $? -eq 0 ]; then
		if [ -d "${DST}/${name}" -a "${mode}" = "upgrade" ]; then
			rm -rf $DST/${name}
		elif [ -d "${DST}/${name}" ]; then
			rm -f ${tmpdir}/helpers/helpers_${name}.$$.tgz
			rmdir ${tmpdir}/helpers
			err 1 "${MAGENTA}Helpers already exist: ${GREEN}${name}${MAGENTA}. Use mode=upgrade for upgrading.${NORMAL}"
		fi
		mkdir ${DST}/${name}
		set -e
		tar xfz ${tmpdir}/helpers/helpers_${name}.$$.tgz -C ${DST}/${name}
		set +e
		rm -f ${tmpdir}/helpers/helpers_${name}.$$.tgz
	fi

	rmdir ${tmpdir}/helpers
}

getmodules()
{
	DST="${moduledir}"

	[ ! -d "${DST}" ] && /bin/mkdir -p ${DST}

	MIRROR="https://boot.bsdstore.ru/modules"

	if [ -z "${name}" ]; then
		fetchme -q1 -u ${MIRROR}/modulesls -o ${ftmpdir}/modules.$$.list
		[ $? -ne 0 ] && err 1 "${MAGENTA}Error fetching for: ${GREEN}modules list${NORMAL}"
		for i in $( /bin/cat ${ftmpdir}/modules.$$.list ); do
			${ECHO} "${MAGENTA}Get modules: ${GREEN}${i}${NORMAL}"
			if [ "${mode}" = "upgrade" ]; then
				repo action=get sources=modules name=${i} mode=upgrade
			else
				repo action=get sources=modules name=${i}
			fi
		done
		/bin/rm -f ${ftmpdir}/modules.$$.list
		exit 0
	fi

	[ ! -d "${tmpdir}/modules" ] && /bin/mkdir -p ${tmpdir}/modules
	fetchme -q1 -u ${MIRROR}/${name}.tgz -o ${tmpdir}/modules/modules_${name}.$$.tgz

	if [ $? -eq 0 ]; then
		if [ -d "${DST}/${name}" -a "${mode}" = "upgrade" ]; then
			/bin/rm -rf $DST/${name}
		elif [ -d "${DST}/${name}" ]; then
			/bin/rm -f ${tmpdir}/modules/modules_${name}.$$.tgz
			/bin/rmdir ${tmpdir}/modules
			err 1 "${MAGENTA}modules already exist: ${GREEN}${name}${MAGENTA}. Use mode=upgrade for upgrading.${NORMAL}"
		fi
		mkdir ${DST}/${name}
		set -e
		tar xfz ${tmpdir}/modules/modules_${name}.$$.tgz -C ${DST}/${name}
		set +e
		rm -f ${tmpdir}/modules/modules_${name}.$$.tgz
	fi

	/bin/rmdir ${tmpdir}/modules
}



#### MAIN ####
[ -z "${quiet}" ] && quiet=0
[ -z "${upgrade}" ] && upgrade=0
[ -z "${usehelpers}" ] && usehelpers="0"
[ -z "${useconfig}" ] && useconfig="1"

TF="${ftmpdir}/test.$$"
MYDIR="${workdir}/tmp/src.$$"
[ -z "${inter}" ] && inter=1

[ -z "${action}" ] && err 1 "Give me action"

case "${mode}" in
	"upgrade")
		upgrade=1
		;;
esac

init_target_arch
init_supported_arch

case "${action}" in
	"ping")
		if [ $quiet -eq 1 ]; then
			checkrepo quiet
		else
			checkrepo
		fi
		;;
	"list")
		for i in ${repo}; do
			if fetchme -q 1 -u "${i}/${sources}ls"; then
				[ ${quiet} -ne 1 ] && ${ECHO} "${MAGENTA}Available sources on ${GREEN}$i:${NORMAL}"
				case "${sources}" in
					"bhyve")
						/bin/cat ${TF}
					;;
				*)
					if [ "${ver}" = "any" ]; then
						ver="[[:alnum:]]"
					else
						[ -z "${ver}" ] && ver=$( /sbin/sysctl -n kern.osrelease|cut -d "-" -f1 )
					fi
					if [ "${arch}" = "any" ]; then
						arch="[[:alnum:]]"
					else
						[ -z "${arch}" ] && arch=$( /sbin/sysctl -n hw.machine_arch )
					fi
					${GREP_CMD} -E ${arch}_${ver} ${TF} |/usr/bin/cut -d " " -f2-100
					;;
				esac
				/bin/rm -f ${TF}
			fi
		done
		;;
	"get")
		[ -z "${sources}" ] && err 1 "Give me sources"
		case "${sources}" in
			"src")
				init_basedir
				init_kerneldir
				DIR="src_${ver}"
				DST="${srcdir}/src_${ver}"
				LOCKFILE=${DST}.lock
				makelock ${LOCKFILE} "rm -f ${TF}; /bin/rm -rf ${MYDIR}" safe
				mkdir -p ${MYDIR}
				getsrc
				;;
			"base")
				# LOCKFILE=${SRC}.lock
				# makelock $LOCKFILE "rm -f ${TF}; /bin/rm -rf ${MYDIR}" safe
				init_basedir
				init_kerneldir

				# make base lock
				echo $$ > ${BASE_DIR_LOCKFILE}
				trap "rm -f ${TF} ${BASE_DIR_LOCKFILE}; /bin/rm -rf ${MYDIR}"
				/bin/mkdir -p ${MYDIR}
				getbase
				;;
			"obj")
				if [ -z "${basename}" ]; then
					DIR="obj_${arch}_${ver}";
				else
					DIR="obj_${basename}_${arch}_${ver}";
				fi
				init_basedir
				init_kerneldir
				SRC="${srcdir}/src_${ver}"
				LOCKFILE=${SRC}.lock
				makelock $LOCKFILE "rm -f ${TF}; /bin/rm -rf ${MYDIR}" safe
				mkdir -p ${MYDIR}
				getobj
				;;
			"kernel")
				# [ -z "${name}" ] && name="GENERIC"
				# LOCKFILE=${SRC}.lock
				# makelock $LOCKFILE "rm -f ${TF}; /bin/rm -rf ${MYDIR}" safe
				init_basedir
				init_kerneldir
				trap "rm -f ${TF}; /bin/rm -rf ${MYDIR}"
				mkdir -p ${MYDIR}
				getkernel
				;;
			"img")
				[ -z "${name}" ] && err 1 "Give me name"
				LOCKFILE="${jaildir}/${name}.lock"
				makelock ${LOCKFILE} "rm -f ${TF}; /bin/rm -rf ${MYDIR}"
				mkdir -p ${MYDIR}
				getimg
#				[ "${usehelpers}" = "1" ] && gethelpers ${name} ${name}
				${ECHO} "${MAGENTA}Done... Importing...${NORMAL}"
				if [ -n "${newjname}" ]; then
					name="${newjname}"
					jimport jname=${name} newjname="${name}"
				else
					jimport jname=${name}
				fi
				if [ -f "${importdir}/${name}.img" ]; then
					${ECHO} "${MAGENTA}Import complete${NORMAL}"
					getyesno "Do you want to remove source image ${importdir}/${name}.img ?"
					[ $? -eq 0 -o $? -eq 3 ] && /bin/rm -f ${importdir}/${name}.img
				fi
				if [ "${usehelpers}" = "1" ]; then
					[ -f ${jailsysdir}/${name}/bin/bootstrap.sh -a -f ${jailsysdir}/${name}/bin/forms.sqlite ] && imghelper bootstrap=${jailsysdir}/${name}/bin/bootstrap.sh formfile=${jailsysdir}/${name}/bin/forms.sqlite jname=${name}
				fi
#				[ ${inter} -ne 0 -a "${useconfig}" = "1" ] && jsetup-tui jname=${name} repo ip4_addr interface astart host_hostname
#				[ ${inter} -ne 0 -a "${useconfig}" = "1" ] && jsetup-tui jname=${name} ip4_addr interface astart host_hostname

				;;
			"helpers")
				gethelpers
				;;
			modules)
				getmodules
				;;
			bhyve)
				getbhyve
				${ECHO} "${MAGENTA}Done... Importing...${NORMAL}"
				if [ -n "${newjname}" ]; then
					name="${newjname}"
					bimport jname=${name} newjname="${name}"
				else
					bimport jname=${name}
				fi
				if [ -f "${importdir}/${name}.img" ]; then
					${ECHO} "${MAGENTA}Import complete${NORMAL}"
					getyesno "Do you want to remove source image ${importdir}/${name}.img ?"
					[ $? -eq 0 -o $? -eq 3 ] && /bin/rm -f ${importdir}/${name}.img
				fi
				;;
			*)
				err 1 "${MAGENTA}Unknown sources: ${GREEN}${sources}${NORMAL}"
				;;
		esac ## END of source case
		;;
esac ## END of action case
