installer/mk-install-iso.sh
08d94448
 #! /bin/bash
f4d17450
 #################################################
 #       Title:  mk-install-iso                  #
 #        Date:  2014-11-26                      #
 #     Version:  1.0                             #
 #      Author:  dthaluru@vmware.com             #
 #     Options:                                  #
 #################################################
ada2a971
 #   Overview
 #       Generates a photon iso
 #   End
f4d17450
 #
 
2f46569e
 set +x                 # disable hashall
ada2a971
 source config.inc       #   configuration parameters
 source function.inc     #   commonn functions
8f19be8a
 PRGNAME=${0##*/}    # script name minus the path
ada2a971
 LOGFILE=/var/log/"${PRGNAME}-${LOGFILE}"    #   set log file name
f4d17450
 
 
 # Grab the name of the iso file 
 if [ $# -lt 2 ]
85b82155
 then
     echo "Usage : " $0 " <output-iso-with-path>  <rpms-path> <pkg-list-path>"
     exit 1
f4d17450
 fi
 ISO_OUTPUT_NAME=$1
85b82155
 RPMS_PATH=$2
 PACKAGE_LIST_FILE=$3
4d6a578d
 RPM_LIST=$4
2f46569e
 STAGE_PATH=$5
 ADDITIONAL_FILES_TO_COPY_FROM_STAGE=$6
07751fba
 LIVE_CD=$7
2cbd5a80
 OUTPUT_DATA_PATH=$8
5d05cfcc
 PHOTON_COMMON_DIR=$(dirname "${PACKAGE_LIST_FILE}")
 PACKAGE_LIST_FILE_BASE_NAME=$(basename "${PACKAGE_LIST_FILE}")
f4d17450
 #- Step 3 Setting up the boot loader
b84da80d
 WORKINGDIR=${BUILDROOT}
 BUILDROOT=${BUILDROOT}/photon-chroot
f4d17450
 
8f19be8a
 run_command "cp isolinux to working directory: ${WORKINGDIR}" "cp -r BUILD_DVD/isolinux ${WORKINGDIR}/" "${LOGFILE}"
80cad58a
 run_command "cp boot/grub2 to working directory: ${WORKINGDIR}" "cp -r BUILD_DVD/boot ${WORKINGDIR}/" "${LOGFILE}"
 run_command "# 1" "mkdir ${WORKINGDIR}/boot/grub2/fonts/" "${LOGFILE}"
 run_command "# 2" "cp boot/ascii.pf2 ${WORKINGDIR}/boot/grub2/fonts/" "${LOGFILE}"
 run_command "# 3" "mkdir -p ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
 run_command "# 4" "cp boot/splash.png ${WORKINGDIR}/boot/grub2/themes/photon/photon.png" "${LOGFILE}"
 run_command "# 5" "cp boot/terminal_*.tga ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
 run_command "# 6" "cp boot/theme.txt ${WORKINGDIR}/boot/grub2/themes/photon/" "${LOGFILE}"
8f19be8a
 run_command "echo : ${WORKINGDIR}" "echo ${WORKINGDIR}" "${LOGFILE}"
adde0296
 cp BUILD_DVD/isolinux/splash.png ${BUILDROOT}/installer/boot/.
a6e91563
 mkdir -p ${BUILDROOT}/installer/EFI/BOOT
0f1fdc4b
 cp EFI_$(uname -m)/BOOT/* ${BUILDROOT}/installer/EFI/BOOT/
dc75e58c
 
08d94448
 #Generate efiboot image
 # efiboot is a fat16 image that has at least EFI/BOOT/bootx64.efi
 
 # As a bootx64.efi we use shimx64.efi from shim-12
 # # make VENDOR_CERT_FILE=<VMware cert> EFI_PATH=/usr/lib 'DEFAULT_LOADER=\\\\grubx64.efi' shimx64.efi
 # # mv shimx64.efi bootx64.efi
 
 # grubx64.efi is generated on Photon OS by using grub2-efi >= 2.02-7:
9ad0d5b7
 # # grub2-efi-mkimage -o grubx64.efi -p /boot/grub2 -O x86_64-efi  fat iso9660 part_gpt part_msdos  normal boot linux configfile loopback chain  efifwsetup efi_gop efi_uga  ls search search_label search_fs_uuid search_fs_file  gfxterm gfxterm_background gfxterm_menu test all_video loadenv  exfat ext2 udf halt gfxmenu png tga lsefi help linuxefi probe echo
08d94448
 
 # both bootx64.efi and grubx64.efi are signed with VMware key
 EFI_IMAGE=boot/grub2/efiboot.img
 EFI_FOLDER=`readlink -f ${STAGE_PATH}/efiboot`
 dd if=/dev/zero of=${WORKINGDIR}/${EFI_IMAGE} bs=3K count=1024
 mkdosfs ${WORKINGDIR}/${EFI_IMAGE}
 mkdir $EFI_FOLDER
 mount -o loop ${WORKINGDIR}/${EFI_IMAGE} $EFI_FOLDER
0f1fdc4b
 mkdir $EFI_FOLDER/EFI
 cp -r ./EFI_$(uname -m)/BOOT $EFI_FOLDER/EFI
08d94448
 ls -lR $EFI_FOLDER
 umount $EFI_FOLDER
 rm -rf $EFI_FOLDER
 #mcopy -s -i ${WORKINGDIR}/${EFI_IMAGE} ./EFI '::/'
 
dc75e58c
 if [ "$LIVE_CD" = true ] ; then
     mv ${WORKINGDIR}/isolinux/live-menu.cfg ${WORKINGDIR}/isolinux/menu.cfg
 fi
 
4967065a
 cp sample_ks.cfg ${WORKINGDIR}/isolinux/
f4d17450
 
b84da80d
 find ${BUILDROOT} -name linux-[0-9]*.rpm | head -1 | xargs rpm2cpio | cpio -iv --to-stdout ./boot/vmlinuz* > ${WORKINGDIR}/isolinux/vmlinuz
f4d17450
 
b84da80d
 rm -f ${BUILDROOT}/installer/*.pyc
4967065a
 rm -rf ${BUILDROOT}/installer/BUILD_DVD
182ad6e9
 # Copy package list json files, dereference symlinks
2cbd5a80
 cp -rf -L $OUTPUT_DATA_PATH/*.json ${BUILDROOT}/installer/
f4d17450
 #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.
b84da80d
 touch ${WORKINGDIR}/PHOTON_VMWARE_CD
f4d17450
 
 # 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
 
6860f77c
 mkdir -p ${BUILDROOT}/etc/yum.repos.d
d5d0d5e8
 cat >> ${BUILDROOT}/etc/yum.repos.d/photon-iso.repo << EOF
6860f77c
 [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
d5d0d5e8
 skip_if_unavailable=True
6860f77c
 EOF
 
f4d17450
 #- Step 7 - Create installer script
07751fba
 if [ "$LIVE_CD" = false ] ; then
f4d17450
 
d3de51b8
 cat >> ${BUILDROOT}/bin/bootphotoninstaller << EOF
f4d17450
 #!/bin/bash
b84da80d
 cd /installer
a672bd24
 [ \$(tty) == '/dev/tty1' ] && LANG=en_US.UTF-8 ./isoInstaller.py --json-file=$PACKAGE_LIST_FILE_BASE_NAME 2> /var/log/installer && shutdown -r now
f4d17450
 /bin/bash
 EOF
 
 chmod 755 ${BUILDROOT}/bin/bootphotoninstaller
 
07751fba
 fi
 
b84da80d
 cat >> ${BUILDROOT}/init << EOF
 mount -t proc proc /proc
 /lib/systemd/systemd
 EOF
 chmod 755 ${BUILDROOT}/init
 
f4d17450
 #adding autologin to the root user
f1897db0
 # 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
f4d17450
 
07751fba
 #- 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
f4d17450
 
b84da80d
 mkdir -p ${BUILDROOT}/mnt/photon-root/photon-chroot
 rm -rf ${BUILDROOT}/RPMS
4d6a578d
 
eccee406
 run_command " echo ${RPMS_PATH}" "echo ${RPMS_PATH}" "${LOGFILE}"
4d6a578d
 #cp -r ${RPMS_PATH} ${WORKINGDIR}/
 (
 cd ${RPMS_PATH}
 mkdir ${WORKINGDIR}/RPMS
 for rpm_name in $RPM_LIST; do
eccee406
     if [ -f "$rpm_name" ]; then
         cp --parent $rpm_name ${WORKINGDIR}/RPMS/;
5d05cfcc
     fi
4d6a578d
 done
 )
f4d17450
 
2f46569e
 # 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
 )
 
f4d17450
 #creating rpm repo in cd..
b84da80d
 createrepo --database ${WORKINGDIR}/RPMS
f4d17450
 
4f7dcd46
 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
 
b84da80d
 rm -rf ${BUILDROOT}/LOGS
f4d17450
 
07751fba
 if [ "$LIVE_CD" = false ] ; then
     # Cleaning up
     #Remove our rpm database as it fills up the ramdisk
8f19be8a
     for filename in ${BUILDROOT}/usr/lib/*; do 
         #run_command " echo ${filename}" "echo ${filename}" "${LOGFILE}"
         if [[ -f ${filename} ]]; then
             file ${filename} | grep ELF >/dev/null 2>&1
             #run_command " file ${filename}" "echo ${filename}" "${LOGFILE}"
             if [[ $? -eq 0 ]]; then
                 run_command " strip ${filename}" "strip ${filename}" "${LOGFILE}"
             fi;
         fi;
     done
 
     #Remove our rpm database as it fills up the ramdisk
     for filename in $(find ${BUILDROOT}/usr/lib/modules); do 
         #run_command " echo ${filename}" "echo ${filename}" "${LOGFILE}"
         if [[ -f ${filename} ]]; then
             file ${filename} | grep ELF >/dev/null 2>&1
             #run_command " file ${filename}" "echo ${filename}" "${LOGFILE}"
             if [[ $? -eq 0 ]]; then
                 run_command " strip ${filename}" "strip ${filename}" "${LOGFILE}"
             fi;
         fi;
     done
07751fba
     rm -rf ${BUILDROOT}/home/*
     rm -rf ${BUILDROOT}/var/lib/rpm
b2a012df
 
07751fba
     # Remove the boot directory
     rm -rf ${BUILDROOT}/boot
b2a012df
 
07751fba
     #Remove the include files.
     rm -rf ${BUILDROOT}/usr/include
b2a012df
 
adde0296
     rm ${BUILDROOT}/lib64/libmvec*
     rm ${BUILDROOT}/usr/sbin/sln
8f19be8a
     rm ${BUILDROOT}/usr/bin/oldfind
 
adde0296
     rm ${BUILDROOT}/usr/bin/localedef
     rm ${BUILDROOT}/usr/bin/systemd-nspawn
     rm ${BUILDROOT}/usr/bin/systemd-analyze
     rm -rf ${BUILDROOT}/usr/lib64/gconv
8f19be8a
     rm ${BUILDROOT}/usr/bin/sqlite3
 
     rm ${BUILDROOT}/usr/bin/bsdcpio
     rm ${BUILDROOT}/usr/bin/bsdtar
     rm ${BUILDROOT}/usr/bin/networkctl
     rm ${BUILDROOT}/usr/bin/machinectl
     rm ${BUILDROOT}/usr/bin/pkg-config
     rm ${BUILDROOT}/usr/bin/openssl
     rm ${BUILDROOT}/usr/bin/timedatectl
     rm ${BUILDROOT}/usr/bin/localectl
     rm ${BUILDROOT}/usr/bin/systemd-cgls
     rm ${BUILDROOT}/usr/bin/systemd-inhibit
     rm ${BUILDROOT}/usr/bin/systemd-studio-bridge
     rm ${BUILDROOT}/usr/bin/iconv
adde0296
 
     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/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 
 
8f19be8a
     rm ${BUILDROOT}/usr/lib/librpmbuild.so*
     rm ${BUILDROOT}/usr/lib/libdb_cxx*
     rm ${BUILDROOT}/usr/lib/libnss_compat*
 
ada2a971
     rm ${BUILDROOT}/usr/bin/grub2-*
     rm ${BUILDROOT}/usr/lib/grub/i386-pc/*.module
     rm ${BUILDROOT}/usr/lib/grub/x86_64-efi/*.module
 
     for j in `ls ${BUILDROOT}/usr/sbin/grub2*`; do
         bsname=$(basename "$j")
94335728
         if [ $bsname != 'grub2-install' ]; then
ada2a971
             rm $j
         fi
     done
8f19be8a
 
07751fba
     # TODO: mbassiouny, Find a clean way to do that
     for i in `ls ${BUILDROOT}/usr/share/`; do
7396fd40
         if [ $i != 'terminfo' -a $i != 'cracklib' -a $i != 'grub' -a $i != 'factory' -a $i != 'dbus-1' ]; then
ada2a971
             rm -rf ${BUILDROOT}/usr/share/$i
         fi
07751fba
     done
 
 fi
b84da80d
 
e4d5e715
 # Set password max days to 99999 (disable aging)
 chage -R ${BUILDROOT} -M 99999 root
 
b84da80d
 # Generate the intird
f4d17450
 pushd $BUILDROOT
b84da80d
 (find . | cpio -o -H newc --quiet | gzip -9 ) > ${WORKINGDIR}/isolinux/initrd.img
 popd
 rm -rf $BUILDROOT
 
 #Step 9 Generate the ISO!!!!
 pushd $WORKINGDIR
f4d17450
 mkisofs -R -l -L -D -b isolinux/isolinux.bin -c isolinux/boot.cat \
ada2a971
         -no-emul-boot -boot-load-size 4 -boot-info-table \
08d94448
         -eltorito-alt-boot -e ${EFI_IMAGE} -no-emul-boot \
ada2a971
         -V "PHOTON_$(date +%Y%m%d)" \
         $WORKINGDIR >$ISO_OUTPUT_NAME
f4d17450
 popd