#!/bin/sh
#
# for Loongnix server 8.3
# create qcow2 files from repository
#
#set -x

set -e

arch=loongarch64
releasever="$1"
version="$2"
extra="$3"

if [ -z $releasever ] 
then
        echo "release is empty!!!"
        exit 1
fi

output="Loongnix-server-${version}.${arch}${extra}.qcow2"

repos_baseos_url="http://10.130.0.6/loongnix-server/$releasever/BaseOS/loongarch64/release/"
repos_appstream_url="http://10.130.0.6/loongnix-server/$releasever/AppStream/loongarch64/release/"

trap cleanup TERM

base_dir=$(pwd)
work_dir=$(mktemp -d ${base_dir}/qcow2-image.XXXXXX)
rootfs=${work_dir}/rootfs

raw_image_file="${work_dir}/loongnix.img"
raw_image_size="8192M"
efi_part_size="128M"
root_part_size="8000M"

repo_dir="${work_dir}/yum.repo.d"
repo_conf="${repo_dir}/loongnix.repo"
setting_scripts=setting.sh

pkg_list=""
pkg_list="$pkg_list @core chrony dnf yum NetworkManager rng-tools qemu-guest-agent dhcp-client"
pkg_list="$pkg_list grub2-common grub2-efi-loongarch64 grub2-efi-loongarch64-cdboot grub2-tools-minimal"
pkg_list="$pkg_list grub2-tools grub2-tools-efi grub2-tools-extra grubby grubby-deprecated"
pkg_list="$pkg_list kernel kernel-core kernel-modules"

exclude_pkgs=""
exclude_pkgs="$exclude_pkgs brotli aic94xx-firmware alsa-firmware alsa-lib"
exclude_pkgs="$exclude_pkgs alsa-tools-firmware ivtv-firmware iwl100-firmware iwl1000-firmware"
exclude_pkgs="$exclude_pkgs iwl105-firmware iwl135-firmware iwl2000-firmware iwl2030-firmware iwl3160-firmware"
exclude_pkgs="$exclude_pkgs iwl3945-firmware iwl4965-firmware iwl5000-firmware iwl5150-firmware iwl6000-firmware"
exclude_pkgs="$exclude_pkgs iwl6000g2a-firmware iwl6000g2b-firmware iwl6050-firmware iwl7260-firmware"
exclude_pkgs="$exclude_pkgs libertas-sd8686-firmware libertas-sd8787-firmware libertas-usb8388-firmware"
exclude_pkgs="$exclude_pkgs biosdevname iprutils plymouth *-langpacks-* *-langpacks-en"
exclude_pkgs="$exclude_pkgs firewalld"

####################################################################
release_dev()
{
	mount | grep ${efi_part}   > /dev/null 2>&1 && unmount_efi
	mount | grep ${root_part}  > /dev/null 2>&1 && unmount_root
	dmsetup ls | grep loop     > /dev/null 2>&1 && remove_device
	losetup -a | grep loongnix > /dev/null 2>&1 && detach_device
}

clean_workdir()
{
	rm -rf ${work_dir} && sync
}

cleanup()
{
	release_dev   || :
	clean_workdir || :
}

unmount_efi()
{
	umount -v /dev/mapper/${efi_part} || :
}

unmount_root()
{
	umount -v /dev/mapper/${root_part} || :
}

remove_device()
{
	kpartx -d ${loop_dev} || :
}

detach_device()
{
	losetup -d ${loop_dev} || :
}

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

mkdir -pv ${rootfs}   || :
mkdir -pv ${repo_dir} || :

####################################################################
# gen repos conf
####################################################################
cat > ${repo_conf} << EOF
[baseos]
name=Loongnix server $releasever (loongarch64) - BaseOS
baseurl=${repos_baseos_url}
gpgcheck=0
enabled=1
priority=1
excludepkgs="${exclude_pkgs}"
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-LOONGNIX

[appstream]
name=Loongnix server $releasever (loongarch64) - AppStream
baseurl=${repos_appstream_url}
gpgcheck=0
enabled=1
priority=2
excludepkgs="${exclude_pkgs}"
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-LOONGNIX
EOF
####################################################################


###########################################################################
# create raw image
truncate -s ${raw_image_size} ${raw_image_file} || :

#
# fdisk 2 partitions: efi, root
#
fdisk_cmd=""

# Create a new GPT partition table
fdisk_cmd="${fdisk_cmd}g\n"

# Create EFI partition-1:
fdisk_cmd="${fdisk_cmd}n\n1\n\n+${efi_part_size}\nt\n1\n"

# Create root partition-2
fdisk_cmd="${fdisk_cmd}n\n2\n\n+${root_part_size}\nt\n2\n20\n"

# write result to disk
fdisk_cmd="${fdisk_cmd}w\n"

echo -e "${fdisk_cmd}" | fdisk ${raw_image_file} > /dev/null 2>&1
###########################################################################


loop_dev=$(losetup -f ${raw_image_file} --show)
kpartx -a ${loop_dev}

efi_part="${loop_dev#/dev/}p1"
root_part="${loop_dev#/dev/}p2"

sleep 1
mkfs.vfat    /dev/mapper/${efi_part}
mkfs.ext4 -F /dev/mapper/${root_part}

# mount root
mount /dev/mapper/${root_part} ${rootfs}

# mount efi
mkdir -pv ${rootfs}/boot/efi
mount /dev/mapper/${efi_part}  ${rootfs}/boot/efi

efi_uuid=$(lsblk  /dev/mapper/${efi_part}  -n -o UUID)
root_uuid=$(lsblk /dev/mapper/${root_part} -n -o UUID)

####################################################################
DNF_OPTS="\
	--setopt=install_weak_deps=False \
	--setopt=reposdir=${repo_dir} \
	--releasever=${releasever} \
	--installroot=${rootfs} \
	--nodocs"

dnf ${DNF_OPTS} makecache --refresh
dnf ${DNF_OPTS} -y install ${pkg_list}
####################################################################

####################################################################
cat > ${rootfs}/${setting_scripts} << EOF
#!/bin/bash

echo "###################### Statart configure #########################"

## mount proc
mount -t proc none /proc

###########################################################################
kernel_release=\$(ls /lib/modules)

# Prepare grub-efi bootloader
mkdir -pv /boot/efi/EFI/BOOT
mkdir -pv /boot/efi/EFI/loongnix-server

###########################################################################
cat > /boot/efi/EFI/loongnix-server/grub.cfg << FOE
set default=0
set timeout=5

set menu_color_normal=white/black
set menu_color_highlight=yellow/black

function load_video {
  insmod efi_gop
  insmod efi_uga
  insmod video_bochs
  insmod video_cirrus
  insmod all_video
}

load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2

### END /etc/grub.d/00_header ###

search --no-floppy --fs-uuid --set=root ${root_uuid}

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Loongnix server ${releasever} ${arch} KVM GUEST' --class fedora --class gnu-linux --class gnu --class os {
	linux  /boot/vmlinuz-\${kernel_release} root=UUID=${root_uuid} LANG=en_US.UTF-8
	initrd /boot/initramfs-\${kernel_release}.img
}
FOE

###########################################################################
## /etc/grub2-efi.cfg -> /boot/efi/EFI/loongnix-server/grub.cfg
ln -svf /boot/efi/EFI/loongnix-server/grub.cfg  /etc/grub2-efi.cfg
cp -a /boot/efi/EFI/loongnix-server/grubloongarch64.efi /boot/efi/EFI/BOOT/BOOTLOONGARCH.EFI
###########################################################################

###########################################################################
# set fstab
cat > /etc/fstab << FOE
UUID=${efi_uuid}   /boot/efi  vfat  umask=0077,shortname=winnt 0 2
UUID=${root_uuid}  /          ext4  defaults                   1 1
FOE
###########################################################################

###########################################################################
echo "export TERM=linux" >> etc/bash.bashrc
# XXX instance type markers - MUST match CentOS Infra expectation
echo 'genclo' > /etc/yum/vars/infra
###########################################################################

###########################################################################
#Generate installtime file record
/bin/date +%Y%m%d_%H%M > /etc/BUILDTIME
###########################################################################

###########################################################################
# Limit languages to help reduce size.
LANG="en_US"
echo "%_install_langs $LANG" > /etc/rpm/macros.image-language-conf
echo "LANG=en_US.UTF-8" > /etc/locale.conf

pushd /usr/share/locale > /dev/null
	ls | egrep -x -v "en|en@arabic|en@boldquot|en@cyrillic|en@greek|en@hebrew|en@piglatin|en@quot|en@shaw|en_CA|en_GB|en_US|locale.alias" | xargs rm -rf
popd > /dev/null
###########################################################################

###########################################################################
# work around for poor key import UI in PackageKit
rm -f /var/lib/rpm/__db*
releasever=\$(rpm -q --qf '%{version}\n' --whatprovides system-release)
basearch=\$(uname -i)
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-* 
rpm -qa | sort > /dev/null
rpm -qa --qf "%{name}\n" | sort > /dev/null
rm -f /var/lib/rpm/__db*

# go ahead and pre-make the man -k cache (#455968)
/usr/bin/mandb
###########################################################################

###########################################################################
# Remove root password lock
passwd -d root > /dev/null
###########################################################################

###########################################################################
# setup systemd to boot to the right runlevel
rm -f /etc/systemd/system/default.target
ln -s /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
echo .

systemctl mask tmp.mount
systemctl mask kdump
systemctl mask sssd
systemctl mask auditd

systemctl unmask NetworkManager
systemctl unmask sshd
systemctl unmask rsyslog
systemctl unmask chronyd
systemctl unmask rngd

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

###########################################################################
# Remove installed but we dont ship it in qcow2
dnf -C -y remove linux-firmware
###########################################################################

###########################################################################
# make sure firstboot doesn't start
echo "RUN_FIRSTBOOT=NO" > /etc/sysconfig/firstboot
###########################################################################

###########################################################################
mkdir -pv /etc/tuned
echo "virtual-guest" > /etc/tuned/active_profile

# generic localhost names
cat > /etc/hosts << FOE
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1       localhost localhost.localdomain localhost6 localhost6.localdomain6
FOE
echo .
###########################################################################

###########################################################################
cat /dev/null > /etc/machine-id
###########################################################################

###########################################################################
# clean tmp file
dnf clean all

rm -rf /var/log/dnf*
rm -rf /var/lib/yum/*
rm -rf /root/install.log
rm -rf /root/install.log.syslog
rm -rf /root/anaconda-ks.cfg
rm -rf /var/lib/systemd/random-seed
###########################################################################

###########################################################################
echo "Fixing SELinux contexts."
touch    /var/log/cron
touch    /var/log/boot.log
mkdir -p /var/cache/yum
/usr/sbin/fixfiles -R -a restore
###########################################################################

###########################################################################
umount /proc
rm -f \$0
echo -e "######################   End configure   #########################\n"
###########################################################################
EOF
####################################################################

####################################################################
## chroot to rootfs and exec config scripts
chmod +x ${rootfs}/${setting_scripts}
chroot   ${rootfs} /${setting_scripts}

pushd ${base_dir} > /dev/null
	## release loop device
	release_dev

	## convert raw -> qcow2
	if [ -e "${output}" ]; then
		rm -rf ${output}
	fi

	echo "Generating ${output} ...."
	sync && qemu-img convert -c -f raw ${raw_image_file} -O qcow2 ${output}

	echo "Generating ${output} md5sum...."
	sync && md5sum ${output} > ${output}.md5
popd > /dev/null
####################################################################

####################################################################
clean_workdir || :
sync && echo -e "\n^^^^^^ done ^^^^^^^^^^\n"
####################################################################
