#!/bin/bash
#################################################
#       Title:  mk-install-iso                  #
#        Date:  2014-11-26                      #
#     Version:  1.0                             #
#      Author:  dthaluru@vmware.com             #
#     Options:                                  #
#################################################
#	Overview
#		Generates a photon iso
#	End
#

set +x                 # disable hashall
PRGNAME=${0##*/}	    # script name minus the path
source config.inc		#	configuration parameters
source function.inc		#	commonn functions
LOGFILE=/var/log/"${PRGNAME}-${LOGFILE}"	#	set log file name


# Grab the name of the iso file 
if [ $# -lt 2 ]
then
    echo "Usage : " $0 " <output-iso-with-path>  <rpms-path> <pkg-list-path>"
    exit 1
fi
ISO_OUTPUT_NAME=$1
RPMS_PATH=$2
PACKAGE_LIST_FILE=$3
RPM_LIST=$4
STAGE_PATH=$5
ADDITIONAL_FILES_TO_COPY_FROM_STAGE=$6
LIVE_CD=$7
OUTPUT_DATA_PATH=$8
PHOTON_COMMON_DIR=$(dirname "${PACKAGE_LIST_FILE}")
PACKAGE_LIST_FILE_BASE_NAME=$(basename "${PACKAGE_LIST_FILE}")
#- Step 3 Setting up the boot loader
WORKINGDIR=${BUILDROOT}
BUILDROOT=${BUILDROOT}/photon-chroot

cp -r BUILD_DVD/isolinux ${WORKINGDIR}/
cp BUILD_DVD/isolinux/splash.png ${BUILDROOT}/installer/boot/.

if [ "$LIVE_CD" = true ] ; then
    mv ${WORKINGDIR}/isolinux/live-menu.cfg ${WORKINGDIR}/isolinux/menu.cfg
fi

cp sample_ks.cfg ${WORKINGDIR}/isolinux/

find ${BUILDROOT} -name linux-[0-9]*.rpm | head -1 | xargs rpm2cpio | cpio -iv --to-stdout ./boot/vmlinuz* > ${WORKINGDIR}/isolinux/vmlinuz

rm -f ${BUILDROOT}/installer/*.pyc
rm -rf ${BUILDROOT}/installer/BUILD_DVD
# Copy package list json files, dereference symlinks
cp -rf -L $OUTPUT_DATA_PATH/*.json ${BUILDROOT}/installer/
#ID in the initrd.gz now is PHOTON_VMWARE_CD . This is how we recognize that the cd is actually ours. touch this file there.
touch ${WORKINGDIR}/PHOTON_VMWARE_CD

# Step 4.5 Create necessary devices
mkfifo ${BUILDROOT}/dev/initctl
mknod ${BUILDROOT}/dev/ram0 b 1 0
mknod ${BUILDROOT}/dev/ram1 b 1 1
mknod ${BUILDROOT}/dev/ram2 b 1 2
mknod ${BUILDROOT}/dev/ram3 b 1 3
mknod ${BUILDROOT}/dev/sda b 8 0


#- Step 5 - Creating the boot script
mkdir -p ${BUILDROOT}/etc/systemd/scripts

# Step 6 create fstab

cp BUILD_DVD/fstab ${BUILDROOT}/etc/fstab

mkdir -p ${BUILDROOT}/etc/yum.repos.d
cat >> ${BUILDROOT}/etc/yum.repos.d/photon-iso.repo <<EOF
[photon-iso]
name=VMWare Photon Linux 1.0(x86_64)
baseurl=file:///mnt/cdrom/RPMS
gpgkey=file:///etc/pki/rpm-gpg/VMWARE-RPM-GPG-KEY
gpgcheck=1
enabled=1
skip_if_unavailable=True​
EOF

#- Step 7 - Create installer script
if [ "$LIVE_CD" = false ] ; then

cat >> ${BUILDROOT}/bin/bootphotoninstaller << EOF
#!/bin/bash
cd /installer
./isoInstaller.py --json-file=$PACKAGE_LIST_FILE_BASE_NAME 2> /var/log/installer && shutdown -r now
/bin/bash
EOF

chmod 755 ${BUILDROOT}/bin/bootphotoninstaller

fi

cat >> ${BUILDROOT}/init << EOF
mount -t proc proc /proc
/lib/systemd/systemd
EOF
chmod 755 ${BUILDROOT}/init

#adding autologin to the root user
# and set TERM=linux for installer
sed -i "s/ExecStart.*/ExecStart=-\/sbin\/agetty --autologin root --noclear %I linux/g" ${BUILDROOT}/lib/systemd/system/getty@.service

#- Step 7 - Create installer script
if [ "$LIVE_CD" = false ] ; then

    sed -i "s/root:.*/root:x:0:0:root:\/root:\/bin\/bootphotoninstaller/g" ${BUILDROOT}/etc/passwd

fi

mkdir -p ${BUILDROOT}/mnt/photon-root/photon-chroot
rm -rf ${BUILDROOT}/RPMS

#cp -r ${RPMS_PATH} ${WORKINGDIR}/
(
cd ${RPMS_PATH}
mkdir ${WORKINGDIR}/RPMS
for rpm_name in $RPM_LIST; do
    FILENAME="`find . -name "$rpm_name-[0-9]*" -or -name "$rpm_name-[a-z][0-9]*" -or -name "$rpm_name-debuginfo*" -type f`"
    if [ -n "$FILENAME" ]; then
        cp --parent $FILENAME ${WORKINGDIR}/RPMS/;
    fi
done
)

# Work in sub-shell using ( ... ) to come back to original folder.
(
cd $STAGE_PATH
for file_name in $ADDITIONAL_FILES_TO_COPY_FROM_STAGE; do
    if [ -n "$file_name" ]; then
        cp $file_name ${WORKINGDIR}/;
    fi
done
)

#creating rpm repo in cd..
createrepo --database ${WORKINGDIR}/RPMS

repodatadir=${WORKINGDIR}/RPMS/repodata
if [ -d $repodatadir ]; then
    pushd $repodatadir
    metaDataFile=`find -type f -name "*primary.xml.gz"`
    ln -sfv $metaDataFile primary.xml.gz
    popd
fi

rm -rf ${BUILDROOT}/LOGS

if [ "$LIVE_CD" = false ] ; then
    # Cleaning up
    #Remove our rpm database as it fills up the ramdisk
    rm -rf ${BUILDROOT}/home/*
    rm -rf ${BUILDROOT}/var/lib/rpm

    # Remove the boot directory
    rm -rf ${BUILDROOT}/boot

    #Remove the include files.
    rm -rf ${BUILDROOT}/usr/include

    rm ${BUILDROOT}/lib64/libmvec*
    rm ${BUILDROOT}/usr/sbin/grub2-bios-setup
    rm ${BUILDROOT}/usr/sbin/grub2-probe
    rm ${BUILDROOT}/usr/sbin/grub2-macbless
    rm ${BUILDROOT}/usr/sbin/grub2-reboot   
    rm ${BUILDROOT}/usr/sbin/grub2-sparc64-setup
    rm ${BUILDROOT}/usr/sbin/sln
    
    rm ${BUILDROOT}/usr/bin/grub2-mkrescue
    rm ${BUILDROOT}/usr/bin/grub2-fstest
    rm ${BUILDROOT}/usr/bin/grub2-syslinux2cfg
    rm ${BUILDROOT}/usr/bin/grub2-mkstandalone

    rm ${BUILDROOT}/usr/bin/localedef
    rm ${BUILDROOT}/usr/bin/systemd-nspawn
    rm ${BUILDROOT}/usr/bin/systemd-analyze
    rm -rf ${BUILDROOT}/usr/lib64/gconv

    rm -rf ${BUILDROOT}/usr/lib/python2.7/lib2to3
    rm -rf ${BUILDROOT}/usr/lib/python2.7/lib-tk
    rm -rf ${BUILDROOT}/usr/lib/python2.7/ensurepip
    rm -rf ${BUILDROOT}/usr/lib/python2.7/encoding
    rm -rf ${BUILDROOT}/usr/lib/python2.7/distutils
    rm -rf ${BUILDROOT}/usr/lib/python2.7/pydoc_data
    rm -rf ${BUILDROOT}/usr/lib/python2.7/idlelib
    rm -rf ${BUILDROOT}/usr/lib/python2.7/unittest 

    # TODO: mbassiouny, Find a clean way to do that
    for i in `ls ${BUILDROOT}/usr/share/`; do
    	if [ $i != 'terminfo' -a $i != 'cracklib' -a $i != 'grub' ]; then
    		rm -rf ${BUILDROOT}/usr/share/$i
    	fi
    done

fi

# Generate the intird
pushd $BUILDROOT
(find . | cpio -o -H newc --quiet | gzip -9 ) > ${WORKINGDIR}/isolinux/initrd.img
popd
rm -rf $BUILDROOT

#Step 9 Generate the ISO!!!!
pushd $WORKINGDIR
mkisofs -R -l -L -D -b isolinux/isolinux.bin -c isolinux/boot.cat \
		-no-emul-boot -boot-load-size 4 -boot-info-table -V "PHOTON_$(date +%Y%m%d)" \
		$WORKINGDIR >$ISO_OUTPUT_NAME

popd