#!/bin/bash -e

ISO_BASENAME="Loongnix-server"
PRODUCT="Loongnix-Server Linux"
SHORTNAME="Loongnix"
VERSION="$1"
ARCH="loongarch64"
PLATFORMS="${ARCH}"
RELEASE="$2"
if [ -z $VERSION ] || [ -z $RELEASE ]
then
        echo "release or extra is empty!!!"
        exit 1
fi

LABEL="${ISO_BASENAME}-${VERSION}-${RELEASE}"
ISO_FULLNAME="${ISO_BASENAME}-${VERSION}.${ARCH}.${RELEASE}.iso"
BASEDIR=$(pwd)

essential_tools="lorax xorriso isomd5sum coreutils createrepo_c"

##################################################################################################
LORAX_REPO_BASEOS="http://10.130.0.6/loongnix-server/$VERSION/BaseOS/loongarch64/release/"
LORAX_REPO_APPSTREAM="http://10.130.0.6/loongnix-server/$VERSION/AppStream/loongarch64/release/"
LORAX_REPO_POWERTOOLS="http://10.130.0.6/loongnix-server/$VERSION/PowerTools/loongarch64/release/"
#LORAX_REPO_EPEL="http://10.130.0.6/loongnix-server/$VERSION/epel/loongarch64/release/Everything/"
LORAX_REPO_EPEL="http://10.130.0.6/loongnix-server/$VERSION/epel/loongarch64/release/"
##################################################################################################

OUTPUTDIR=${BASEDIR}/output
TMPDIR=${BASEDIR}/cache
LOGDIR=${BASEDIR}/log
ISOREPODIR=${TMPDIR}/yum.repo.d
ISOREPO=${ISOREPODIR}/iso.repo
COMPSDIR=$(pwd)/comps-8.4

STANDARD_COMPS_PKG=${TMPDIR}/standard-comps-pkgs.list
#STANDARD_PKG_GROUP=${TMPDIR}/standard-comps.xml
STANDARD_PKG_GROUP=${BASEDIR}/BaseOS-comps.loongarch64.xml
AppStream_Pkg_Group=${BASEDIR}/AppStream-comps.loongarch64.xml

############################################################################
#
# Generatte repos configure
#
function generate_repos_config() {
echo -e "\n## generate repos config ..... "
mkdir -pv ${ISOREPODIR}

cat > ${ISOREPO} << EOF
[baseos-iso]
name=Loongnix server $VERSION - BaseOS
baseurl=${LORAX_REPO_BASEOS}
gpgcheck=0
enabled=1
priority=1

[appstream-iso]
name=Loongnix server $VERSION - AppStream
baseurl=${LORAX_REPO_APPSTREAM}
gpgcheck=0
enabled=1
priority=2

[powertools-iso]
name=Loongnix server $VERSION - PowerTools
baseurl=${LORAX_REPO_POWERTOOLS}
gpgcheck=0
enabled=1
priority=3

[epel-iso]
name=Loongnix server $VERSION - EPEL
baseurl=${LORAX_REPO_EPEL}
gpgcheck=0
enabled=1
priority=4
EOF
}
############################################################################


############################################################################
#
# Covering .treeinfo generated by lorax
#
function generate_treeinfo() {

echo -e "\n## generate treeinfo ..... "
rm -rf ${OUTPUTDIR}/.treeinfo

efiboot_img_sha256=$(sha256sum ${OUTPUTDIR}/images/efiboot.img | awk '{print $1}')
install_img_sha256=$(sha256sum ${OUTPUTDIR}/images/install.img | awk '{print $1}')
pxeboot_initrd_sha256=$(sha256sum ${OUTPUTDIR}/images/pxeboot/initrd.img | awk '{print $1}')
pxeboot_vmlinuz_sha256=$(sha256sum ${OUTPUTDIR}/images/pxeboot/vmlinuz | awk '{print $1}')

cat > ${OUTPUTDIR}/.treeinfo << EOF
[checksums]
images/efiboot.img = sha256:${efiboot_img_sha256}
images/install.img = sha256:${install_img_sha256}
images/pxeboot/initrd.img = sha256:${pxeboot_initrd_sha256}
images/pxeboot/vmlinuz sha256:${pxeboot_vmlinuz_sha256}

[general]
family = ${PRODUCT}
name = ${PRODUCT} ${VERSION}
variant = BaseOS
variants = AppStream,BaseOS
version = 8
arch = ${ARCH}
platforms = ${PLATFORMS}
timestamp = ${currenttimestamp}
packagedir = BaseOS/Packages 

[header]
type = productmd.treeinfo
version = 1.2

[release]
name = ${PRODUCT}
short = ${SHORTNAME}
version = 8

[stage2]
mainimage = images/install.img

[tree]
arch = ${ARCH}
build_timestamp = ${currenttimestamp}
platforms = ${PLATFORMS}
variants = AppStream,BaseOS

[images-loongarch64]
kernel = images/pxeboot/vmlinuz
initrd = images/pxeboot/initrd.img
efiboot.img = images/efiboot.img

[media]
discnum = 1 
totaldiscs = 1 

[variant-BaseOS]
id = BaseOS
name = BaseOS
packages = BaseOS/Packages
repository = BaseOS
type = variant
uid = BaseOS

[variant-AppStream]
id = AppStream
name = AppStream
packages = AppStream/Packages
repository = AppStream
type = variant
uid = AppStream
EOF
}
############################################################################

############################################################################
#
# Generate standard comps xml
#
############################################################################

############################################################################
function clean_all() {
	sync
	test -d ${TMPDIR} && rm -rf ${TMPDIR} || :
	test -d ${LOGDIR} && rm -rf ${LOGDIR} || :
	test -d ${OUTPUTDIR} && rm -rf ${OUTPUTDIR} || :
	sync
}
############################################################################


############################################################################
# start
############################################################################

############################################################################
[[ "0" != "${UID}" ]] && echo "use root!" && exit 1

# clean tmp, log, output
#clean_all

mkdir -p ${TMPDIR}
mkdir -p ${LOGDIR}
############################################################################

############################################################################
#
# Install essential tools
#
#dnf clean metadata
#dnf install -y ${essential_tools}
############################################################################

############################################################################
#
# generation timestamp
#
current=`date "+%Y-%m-%d %H:%M:%S"`
timestamp=`date -d "$current" +%s`
currenttimestamp=$(($timestamp+`date "+%N"`/1000000))
############################################################################

############################################################################
#
# need install lorax, and lorax need selinux must be disabled or in Permissive
# mode maybe not necessary: need yum install some pkgs: rpm-ostree ...
#
echo "## start lorax ..... "
echo "lorax arguments:"
echo "     --isfinal"
echo "     --nomacboot"
echo "     --tmp ${TMPDIR}"
echo "     --logfile ${LOGDIR}/lorax.log"
echo "     --volid ${LABEL}"
echo "     --buildarch ${ARCH}"
echo "     --product ${PRODUCT}"
echo "     --version ${VERSION}"
echo "     --release ${RELEASE}"
echo "     --source ${LORAX_REPO_BASEOS}"
echo "     --source ${LORAX_REPO_APPSTREAM}"
echo "     --outputdir ${OUTPUTDIR}"
echo ""



lorax 	--isfinal \
	--nomacboot \
	--tmp ${TMPDIR} \
	--logfile ${LOGDIR}/lorax.log \
	--volid "${LABEL}" \
	--buildarch "${ARCH}" \
	--product "${PRODUCT}" \
	--variant "BaseOS" \
	--version "${VERSION}" \
	--release "${RELEASE}" \
	--source "${LORAX_REPO_BASEOS}" \
	--source "${LORAX_REPO_APPSTREAM}"  \
	"${OUTPUTDIR}"

if [ $? != 0 ];then
	echo "## lorax error, code = $?."
	exit 1;
else
	echo -e "## lorax done.\n\n"
fi
generate_treeinfo
############################################################################

############################################################################
generate_repos_config

echo -e "\n## start download rpms ..... "
DNF_PARAMS="--releasever=${VERSION} --setopt=reposdir=${ISOREPODIR} --quiet"
dnf ${DNF_PARAMS} clean metadata

echo -e "\n## download rpms"
for comps_file in `ls comps-8.4`
do
	{
		#echo -e "\n## generate packages list ..... "
		cat comps-8.4/${comps_file} | grep "<packagereq" | sed 's;\(<packagereq.*\)>\(.*\)\(</packagereq>.*\);\2;g' | sort | uniq > comps-8.4/${comps_file%.*}.txt

		rm -rf ${OUTPUTDIR}/${comps_file%.*}.log
		download_dir=`echo ${comps_file} | awk -F "-" '{print $1}'`
		TMPDIR=/home/scripts/cache
		cat comps-8.4/${comps_file%.*}.txt | while read line; do
		        echo "# Download rpms: $line"
		        dnf download ${DNF_PARAMS} \
		            --installroot=${TMPDIR} \
		            --resolve \
		            --destdir=${OUTPUTDIR}/${download_dir}/Packages \
		            $line  >> ${LOGDIR}/${comps_file%.*}.log 2>&1
		done
	}&
done
wait

echo -e "\n## createrepo_c -g"
for comps_file in `ls comps-8.4`
do
        download_dir=`echo ${comps_file} | awk -F "-" '{print $1}'`
        REPOS_BASEOS_DIR=${OUTPUTDIR}/${download_dir}
        echo "ceraterepo for ${REPOS_BASEOS_DIR}"
        pushd ${REPOS_BASEOS_DIR}
        createrepo_c -g ${COMPSDIR}/${comps_file} .
        popd
done

############################################################################

############################################################################
echo -e "\n## create ISO ..... "

if [[ -f "${OUTPUTDIR}/images/efiboot.img" ]]; then
	echo "use efiboot ......"
	_iso_efi_boot_args="-eltorito-alt-boot
	-e images/efiboot.img
	-no-emul-boot
	-isohybrid-gpt-basdat"
fi

rm -vf "${OUTPUTDIR}/images/boot.iso" || true
rm -vf "${ISO_FULLNAME}"        || :
rm -vf "${ISO_FULLNAME}.md5"    || :

sync && xorriso -as mkisofs \
        -iso-level 3 \
        -full-iso9660-filenames \
        -volid "${LABEL}" \
        -appid "Loongnix <http://www.loongnix.org>" \
        -publisher "${ISO_BASENAME} Install CD" \
        -preparer "prepared by mkarchiso" \
        ${_iso_efi_boot_args} \
        -output ${ISO_FULLNAME} \
        "${OUTPUTDIR}" 

sync && implantisomd5 --force --supported-iso "${ISO_FULLNAME}"

md5sum    "${ISO_FULLNAME}" > "${ISO_FULLNAME}.md5"

#clean_all
############################################################################

############################################################################
sync && echo -e "\n^^^^^^ done ^^^^^^^^^^\n"
############################################################################
