#!/bin/bash
#################################################
# Title: cloud-image-build.sh #
# Date: 2015-07-22 #
# Version: 1.0 #
# Author: anishs@vmware.com #
#################################################
# Overview
# Create cloud images
# End
#
set -x
BUILD_SCRIPTS_PATH=$1
IMG_NAME=$2
SRC_ROOT=$3
GENERATED_DATA_PATH=$4
PHOTON_ISO_PATH=$5
PHOTON_STAGE_PATH=${PHOTON_ISO_PATH%/*}
ADDITIONAL_RPMS_PATH=$6
INSTALLER_PATH=$PHOTON_STAGE_PATH/$IMG_NAME
ISO_MOUNT_FOLDER=$PHOTON_STAGE_PATH/iso_mount
PHOTON_IMG_OUTPUT_PATH=$PHOTON_STAGE_PATH/$IMG_NAME
VMDK_CONFIG_FILE=${BUILD_SCRIPTS_PATH}/$IMG_NAME/vmdk_$IMG_NAME.json
VMDK_CONFIG_SAFE_FILE=${BUILD_SCRIPTS_PATH}/$IMG_NAME/vmdk_safe_$IMG_NAME.json
mkdir -p $INSTALLER_PATH/installer
cp -R $SRC_ROOT/installer $INSTALLER_PATH/
cd $INSTALLER_PATH/installer
cp $VMDK_CONFIG_FILE $VMDK_CONFIG_SAFE_FILE
cp ${BUILD_SCRIPTS_PATH}/mk-setup-vmdk.sh .
cp ${BUILD_SCRIPTS_PATH}/mk-clean-vmdk.sh .
if [[ $IMG_NAME != ova* ]]
then
cp ${BUILD_SCRIPTS_PATH}/mk-setup-grub.sh .
fi
if [ -e ${BUILD_SCRIPTS_PATH}/${IMG_NAME}/mk-setup-grub.sh ]
then
cp ${BUILD_SCRIPTS_PATH}/${IMG_NAME}/mk-setup-grub.sh .
fi
PASSWORD=`date | md5sum | cut -f 1 -d ' '`
sed -i "s/PASSWORD/$PASSWORD/" $VMDK_CONFIG_SAFE_FILE
if [ -n "$ADDITIONAL_RPMS_PATH" ]
then
mkdir $PHOTON_STAGE_PATH/RPMS/additonal
cp -f $ADDITIONAL_RPMS_PATH/* $PHOTON_STAGE_PATH/RPMS/additonal/
fi
./photonInstaller.py -p $GENERATED_DATA_PATH/build_install_options_$IMG_NAME.json -r $PHOTON_STAGE_PATH/RPMS -v $INSTALLER_PATH/photon-${IMG_NAME} -o $GENERATED_DATA_PATH -f $VMDK_CONFIG_SAFE_FILE
cat $VMDK_CONFIG_SAFE_FILE
rm $VMDK_CONFIG_SAFE_FILE
cd $BUILD_SCRIPTS_PATH
DISK_DEVICE=`losetup --show -f ${PHOTON_IMG_OUTPUT_PATH}/photon-${IMG_NAME}.raw`
echo "Mapping device partition to loop device"
kpartx -av $DISK_DEVICE
DEVICE_NAME=`echo $DISK_DEVICE|cut -c6- `
echo "DISK_DEVICE=$DISK_DEVICE"
echo "ROOT_PARTITION=/dev/mapper/${DEVICE_NAME}p2"
rm -rf $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}
mkdir $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}
mkdir -p $ISO_MOUNT_FOLDER
mount -o loop $PHOTON_ISO_PATH $ISO_MOUNT_FOLDER
mount -v -t ext4 /dev/mapper/${DEVICE_NAME}p2 $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}
rm -rf $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/installer
rm -rf $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/LOGS
cp $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/shadow $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/shadow.bak
sed -e "s/^\(root:\)[^:]*:/\1*:/" $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/shadow.bak > $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/shadow
rm -f $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/shadow.bak
rm -f $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/shadow-
mount -o bind /proc $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/proc
mount -o bind /dev $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/dev
mount -o bind /dev/pts $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/dev/pts
mount -o bind /sys $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/sys
if [ -n "$ADDITIONAL_RPMS_PATH" ]
then
mkdir $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/additional_rpms
mkdir $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/var/run
cp -f $PHOTON_STAGE_PATH/RPMS/additonal/* $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/additional_rpms/
chroot $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME} /bin/bash -c "rpm -i /additional_rpms/*"
rm -rf $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/additional_rpms/
fi
if [ $IMG_NAME != "ova" ] && [ $IMG_NAME != "ova_uefi" ] && [ $IMG_NAME != "ova_ovs" ]
then
#Copy the initrd image
rm -rf /tmp/initrd*
rm -rf /tmp/installer
cp $ISO_MOUNT_FOLDER/isolinux/initrd.img /tmp/initrd.gz
gunzip /tmp/initrd.gz
cd /tmp
cpio -idu < initrd
cp /tmp/installer/boot/initrd.img* $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/boot/
rm -rf /tmp/initrd*
rm -rf /tmp/installer
cd $BUILD_SCRIPTS_PATH
if [ $IMG_NAME = "gce" ]
then
cp ntpd.service $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/lib/systemd/system/
fi
if [ $IMG_NAME != "ova_generic" ]
then
cp ntpd.service $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/lib/systemd/system/
cp eth0.service $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/lib/systemd/system/
cp -f docker.service $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/lib/systemd/system/
cp -f docker.socket $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/lib/systemd/system/
if [ -e $IMG_NAME/cloud-photon.cfg ]
then
cp -f $IMG_NAME/cloud-photon.cfg $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/cloud/cloud.cfg
fi
cp $IMG_NAME/$IMG_NAME-patch.sh $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/
cp /etc/resolv.conf $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/etc/
echo "chrooting and running patch inside the chroot"
chroot $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME} /bin/bash -c "/$IMG_NAME-patch.sh"
rm -f $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/$IMG_NAME-patch.sh
fi
fi
umount $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/sys
umount $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/dev/pts
umount $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/dev
umount $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}/proc
umount $PHOTON_IMG_OUTPUT_PATH/photon-${IMG_NAME}
umount $ISO_MOUNT_FOLDER
rm -rf $ISO_MOUNT_FOLDER
echo "Deleting device map partition"
kpartx -d $DISK_DEVICE
rm -rf photon-${IMG_NAME}
echo "Detaching loop device from raw disk"
losetup -d $DISK_DEVICE
cd $IMG_NAME
./mk-$IMG_NAME-image.sh $PHOTON_STAGE_PATH/$IMG_NAME $SRC_ROOT
exit 0