#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# Usage: e.g. failed $? "this is an error"
set -x
umask 0022 # ensure we have the proper permissions even on hardened deployments

failed() {
  local returnval=$1
  local returnmsg=$2

  # check for an message, if there is no one don't print anything
  if [[ -z $returnmsg ]]; then
    :
  else
    echo -e $returnmsg
  fi
  if [[ $returnval -eq 0 ]]; then
    return 0
  else
    echo "Installation failed"
    exit $returnval
  fi
}

# check if first parameter is not a dash (-) then print the usage block
if [[ ! $@ =~ ^\-.+ ]]; then
	usage
	exit 0
fi

OPTERR=0
DISKSPACE=2120000  #free disk space required in kilobytes

while getopts 'h:f:d:u::'# OPTION
do
  case $OPTION in
  u)    uflag=1
        uuid="$OPTARG"
        ;;
  f)    fflag=1
        tmpltimg="$OPTARG"
        ;;
  h)    hyper="$OPTARG"
        ;;
  d)    destdir="$OPTARG"
        ;;
  ?)    usage
        exit 0
        ;;
  *)    usage
        exit 0
        ;;
  esac
done

if [[ "$hyper" == "kvm" ]]; then
    ext="qcow2"
    qemuimgcmd=$(which qemu-img)
  elif [[ "$hyper" == "xenserver" ]]; then
    ext="vhd"
  elif [[ "$hyper" == "vmware" ]]; then
    ext="ova"
  elif [[ "$hyper" == "lxc" ]]; then
    ext="qcow2"
  elif [[ "$hyper" == "hyperv" ]]; then
    ext="vhd"
  elif [[ "$hyper" == "ovm3" ]]; then
    ext="raw"
  else
    failed 2 "Please add a correct hypervisor name like: kvm|vmware|xenserver|hyperv|ovm3"
fi


localfile=$uuid.$ext


sudo mkdir -p $destdir
if [[ $? -ne 0 ]]; then
  failed 2 "Failed to write to destdir $destdir -- is it mounted?\n"
fi

if [[ -f $destdir/template.properties ]]; then
  failed 2 "Data already exists at destination $destdir"
fi

destfiles=$(sudo find $destdir -name \*.$ext)
if [[ "$destfiles" != "" ]]; then
  failed 2 "Data already exists at destination $destdir"
fi

tmpfolder=/tmp/cloud/templates/
mkdir -p $tmpfolder
tmplfile=$tmpfolder/$localfile

touch $tmplfile
if [[ $? -ne 0 ]]; then
  failed 2 "Failed to create temporary file in directory $tmpfolder -- is it read-only or full?\n"
fi

destcap=$(sudo df -P $destdir | awk '{print $4}' | tail -1 )
[ $destcap -lt $DISKSPACE ] && echo "Insufficient free disk space for target folder $destdir: avail=${destcap}k req=${DISKSPACE}k" && failed 4

localcap=$(df -P $tmpfolder | awk '{print $4}' | tail -1 )
[ $localcap -lt $DISKSPACE ] && echo "Insufficient free disk space for local temporary folder $tmpfolder: avail=${localcap}k req=${DISKSPACE}k" && failed 4


if [[ "$fflag" == "1" ]]; then
  sudo cp $tmpltimg $tmplfile
  if [[ $? -ne 0 ]]; then
    failed 2 "Failed to create temporary file in directory $tmpfolder -- is it read-only or full?\n"
  fi
fi

installrslt=$($(dirname $0)/createtmplt.sh -s 2 -d "SystemVM Template ( $hyper )" -n $localfile -t $destdir/ -f $tmplfile -u -v -c)

if [[ $? -ne 0 ]]; then
  failed 2 "Failed to install system vm template $tmpltimg to $destdir: $installrslt"
fi

tmpdestdir=$tmpfolder

if [ "$ext" == "ova" ]
then
  tar xvf $tmpdestdir/$localfile -C $tmpdestdir &> /dev/null
  sudo cp $tmpdestdir/*.vmdk $tmpdestdir/*.mf $tmpdestdir/*.ovf $destdir/
  rm -rf $tmpdestdir/*.vmdk $tmpdestdir/*.mf $tmpdestdir/*.ovf $tmpdestdir/*.ova
else
  rm -rf $tmpdestdir/*.tmp
fi


tmpltfile=$destdir/$localfile
tmpltsize=$(sudo ls -l $tmpltfile | awk -F" " '{print $5}')
if [[ "$ext" == "qcow2" ]]; then
  vrtmpltsize=$(sudo $qemuimgcmd info $tmpltfile | grep -i 'virtual size' | sed -ne 's/.*(\([0-9]*\).*/\1/p' | xargs)
else
  vrtmpltsize=$tmpltsize
fi

templateId=${destdir##*/}
sudo touch $destdir/template.properties
echo "$ext=true" >> $tmpdestdir/template.properties
echo "id=$templateId" >> $tmpdestdir/template.properties
echo "public=true" >> $tmpdestdir/template.properties
echo "$ext.filename=$localfile" >> $tmpdestdir/template.properties
echo "uniquename=routing-$templateId" >> $tmpdestdir/template.properties
echo "$ext.virtualsize=$vrtmpltsize" >> $tmpdestdir/template.properties
echo "virtualsize=$vrtmpltsize" >> $tmpdestdir/template.properties
echo "$ext.size=$tmpltsize" >> $tmpdestdir/template.properties

sudo cp $tmpdestdir/template.properties $destdir/template.properties
if [ -f "$tmpdestdir/template.properties" ]
then
    rm -rf $tmpdestdir/template.properties
fi

echo "Successfully installed system VM template $tmpltimg and template.properties to $destdir"
exit 0
