#!/bin/sh

MODE=$1
MEDIA=$2
UPGR=$3

. /opt/hmc/bin/functions

cleanupHMCDataPartition()
{
    # Need to clean up /data without formatting complete partition as we are storing
    # install images under /data/diskimg
    activateVolumeGroup
    mkdir -p /tmp/mnt
    mount -t ext4 /dev/HMCDataVG/DataLV /tmp/mnt
    for file in `find /tmp/mnt -mindepth 1 -maxdepth 1`; do
        if [[ $file != *"diskimg" ]]; then
            rm -rf $file
        fi
    done
    umount /tmp/mnt
}

cleanupHMCExtraPartition()
{
    # Need to clean up /extra without formatting complete partition as we need to retain
    # vios updates that are part of /extra
    activateVolumeGroup
    mkdir -p /tmp/mnt
    mount -t ext4 /dev/HMCDataVG/ExtraLV /tmp/mnt
    for file in `find /tmp/mnt -mindepth 1 -maxdepth 1`; do
        if [[ $file != *"viosimages" ]]; then
            rm -rf $file
        fi
    done
    umount /tmp/mnt
}

#
# Check where the install image files are
#
pickInstallImagesFromDataDiskImg=0
if [ "$MEDIA" == "disk" ]; then
    activateVolumeGroup
    mkdir /tmp/mnt
    mount -t ext4 /dev/HMCDataVG/DataLV /tmp/mnt
    if [ -f /tmp/mnt/diskimg/.installFromDataDiskImg ]; then
        pickInstallImagesFromDataDiskImg=1
    fi
    umount /tmp/mnt
fi

echo "Initializing filesystems..."
# Determine partition table type in order
# to decide what to do with Swap when it
# comes to upgrade
ptype=$(getPartitionTableType)

# Make sure all udev devices are created
SettleDisk
waitForDevices

RunCmd -noerr mkfs.ext3 -b 4096 -L rootfs ${ROOTPARTITION}
RunCmd -noerr mkfs.ext3 -b 4096 -L var ${VARPARTITION}
# Upgrade from Version lower than V5
if [ "$UPGR" != "Yes" ]; then
  if [ "$MEDIA" != "disk" ]; then
    RunCmd -noerr mkfs.ext3  -b 4096 -L /hmcdump ${HMCDUMPPARTITION}
  else
    # Make sure hmcboot partition is labeled properly
    RunCmd -noerr tune2fs -L /hmcboot ${HMCBOOTPARTITION}
  fi
fi

# Remove VG to start fresh if not doing an upgrade
# otherwise if VG found, activate it
create_new_vg=0
pvs | grep -q "HMCDataVG"
if [ $? -eq 0 ]; then
  if [ "$UPGR" != "Yes" ] && [ $pickInstallImagesFromDataDiskImg -eq 0 ]; then
    removeVolumeGroup
    create_new_vg=1
  else
    activateVolumeGroup
  fi
else
# This is the condition where you come from a brand new installation
# with a disk without a prior HMCDataVG or you can upgrade from an
# HMC level without a Volume Group.
  create_new_vg=1
fi
if [ $create_new_vg -eq 1 ]; then
  waitForDevices
  echo "Creating Physical Volumes.."
  RunCmd pvcreate -ff -y --zero y ${LVMPV1}
  RunCmd pvcreate -ff -y --zero y ${LVMPV2}

  echo "Creating Volume Group..."
  RunCmd vgcreate HMCDataVG ${LVMPV1} ${LVMPV2}
  RunCmd echo "RC: $?"
  RunCmd vgscan
  RunCmd vgdisplay
  CreateLogicalVolumes
fi

waitForDevices
if [ "$UPGR" != "Yes" ]; then
  # Disk boot and install cannot switch to parted
  # because we are using partition 5 and 6
  if [[ "$MEDIA" == "disk" && "$ptype" = "msdos" && "$MARCH" != "ppc64le" ]]; then
    RunCmd mkswap -L Swap ${OLD_SWAPPARTITION}
  else
    RunCmd mkswap -L Swap ${SWAPPARTITION}
  fi
else
  # Upgrade from gpt base partition use new swap value
  # else stick with the old value
  if [ "$ptype" = "gpt" ]; then
    RunCmd mkswap -L Swap ${SWAPPARTITION}
  else
    RunCmd mkswap -L Swap ${OLD_SWAPPARTITION}
  fi
fi

if [ "$MODE" = "Install" ]; then
  echo "Initializing logical volumes .."
  RunCmd -noerr mkfs.ext4  -b 4096 -L upgrade /dev/HMCDataVG/UpgradeLV
  if [ "$MEDIA" != "disk" ]; then
    RunCmd -noerr mkfs.ext3  -b 4096 -L /hmcboot ${HMCBOOTPARTITION}
  fi
  if [ $pickInstallImagesFromDataDiskImg -eq 0 ]; then
    RunCmd -noerr mkfs.ext4  -b 4096 -L data /dev/HMCDataVG/DataLV
  else
    cleanupHMCDataPartition
  fi
else
  # see if there is upgrade data present in the old partition
  # if so see if you are upgrading from an older version
  mkdir -p /upgr
  mount -t ext3 ${HMCBOOTPARTITION} /upgr
  if [[ -f /upgr/SaveHSCSystemUpgradeData.tar && -f /upgr/doRestore ]]; then
  # Format these 2 partitions prior to copy data over
  # This is the only time that upgrade and data will be initialized
  # subsequent upgrade from this level onward, upgrade and data will not be
  # formatted unless on an Install
    RunCmd -noerr mkfs.ext4  -b 4096 -L upgrade /dev/HMCDataVG/UpgradeLV
    RunCmd -noerr mkfs.ext4  -b 4096 -L data /dev/HMCDataVG/DataLV
    echo "Copying data to new upgrade partition.."
    mkdir -p /newupgr
    mount -t ext4 /dev/HMCDataVG/UpgradeLV /newupgr
    cp -a /upgr/* /newupgr
    if [ $? -eq 0 ]; then
      rm -rf /upgr/*
    fi
    umount /newupgr
  fi
  umount /upgr
  # Now for upgrade make sure we re-label partitions that we are not
  # reformatting due to presence of data. hmcboot and hmcdump partitions
  # retain the '/' in the label because we need to support installing
  # older version of HMC from disk, in which case the older install
  # code relies on /hmcboot and /hmcdump labels
  for lbl in '/upgrade' '/data'; do
    partname=$(blkid -L $lbl)
    if [ -n "$partname" ]; then
      newlbl=$(echo $lbl | tr -d "/")
      tune2fs -L $newlbl $partname
    fi
  done
fi
echo "Creating additional filesystems..."
RunCmd -noerr mkfs.ext4  -b 4096 -L dump /dev/HMCDataVG/DumpLV
# Still initialize home as we will restore content back
# from upgrade data
RunCmd -noerr mkfs.ext4  -b 4096 -L home /dev/HMCDataVG/HomeLV
if [ "$MODE" = "Install" ]; then
   RunCmd -noerr mkfs.ext4  -b 4096 -L extra /dev/HMCDataVG/ExtraLV
else
   cleanupHMCExtraPartition
fi
RunCmd -noerr mkfs.ext4  -b 4096 -L log /dev/HMCDataVG/LogLV

RunCmd -noerr mkdir -p /hmc
RunCmd -noerr mount -t ext3 ${ROOTPARTITION} /hmc
RunCmd -noerr mkdir -p /hmc/var
RunCmd -noerr mkdir -p /hmc/var/hsc
RunCmd -noerr mkdir -p /hmc/hmcboot
RunCmd -noerr mkdir -p /hmc/data
RunCmd -noerr mkdir -p /hmc/extra
RunCmd -noerr mkdir -p /hmc/hmcdump
RunCmd -noerr mkdir -p /hmc/dump
RunCmd -noerr mount -t ext3 ${VARPARTITION} /hmc/var
diskSize=`getDiskSize`
if [[ $diskSize -ge 80 && $diskSize -lt 120 ]]; then
  MOUNT_HOME_LV=0
else
  MOUNT_HOME_LV=1
fi
if [ $MOUNT_HOME_LV -eq 1 ]; then
  RunCmd -noerr mkdir -p /hmc/home
  RunCmd -noerr mount -t ext4 /dev/HMCDataVG/HomeLV /hmc/home
else
  # Update fstab here to remove home mount point if needed
  if [ -f /opt/hmc/data/fstab ]; then
    sed -e "/^LABEL=home/d" /opt/hmc/data/fstab > /opt/hmc/data/fstab.new
    mv /opt/hmc/data/fstab.new /opt/hmc/data/fstab
  fi
fi
mkdir -p /hmc/var/hsc/log
RunCmd -noerr mount -t ext4 /dev/HMCDataVG/LogLV /hmc/var/hsc/log
RunCmd -noerr mount -t ext4 /dev/HMCDataVG/ExtraLV /hmc/extra
RunCmd -noerr mount -t ext4 /dev/HMCDataVG/DumpLV /hmc/dump
RunCmd -noerr mount -t ext4 /dev/HMCDataVG/DataLV /hmc/data
RunCmd -noerr mkdir -p /hmc/data/hmc/profiles
RunCmd -noerr ln -sf /data/hmc/profiles /hmc/var/hsc/

# Create partition anf filesystem needed for secure boot
# /boot/efi will have all efi binaries need for secure boot
# This entry will be added to /etc/fstab
if [ "$FIRMWARE" = "efi" ]; then
  echo "EFI Firmware Enabled,Creating EFI filesystem.."
  RunCmd -noerr mkfs.vfat -F32 ${EFIPARTITION}
  RunCmd -noerr dosfslabel ${EFIPARTITION} EFI
  RunCmd -noerr mkdir -p /hmc/boot/efi
  RunCmd -noerr mount -t vfat ${EFIPARTITION} /hmc/boot/efi
fi

# Create info directory in data to relieve sapce usage
# in root filesystem. Clear it first if it exists
# as in Upgrade scenario data partition is not cleaned up
if [ -d /hmc/data/info ]; then
    rm -rf /hmc/data/info/*
fi
mkdir -p /hmc/data/info
RunCmd -noerr ln -sf /data/info /hmc/info

# Create additional swap space
if [ ! -f /hmc/data/hmcxtraswap ]; then
    echo "Creating additional swap space..."
    RunCmd -noerr fallocate -l 2G /hmc/data/hmcxtraswap
    chmod 600 /hmc/data/hmcxtraswap
    RunCmd -noerr mkswap /hmc/data/hmcxtraswap
fi

# Check for presence of external xData
# First mount and see if we are successful
# Comment out code since we are not advertising or
# testing this function.

#mkdir -p /hmc/xData
#mount -t ext4 -L xData /hmc/xData 2>/dev/null
#if [ $? -eq 0 ]; then
#  mount -o bind /hmc/xData /hmc/data
#  grep -q "LABEL=xData" /opt/hmc/data/fstab
#  if [ $? -ne 0 ]; then
#    echo "LABEL=xData  /xData        ext4     defaults 1 2" >> /opt/hmc/data/fstab
#    echo "/xData       /data         none     bind  0 0" >> /opt/hmc/data/fstab
#  fi
#else
#  rmdir /hmc/xData
#fi
