#!/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() {
  printf "\nUsage: %s:\n\t-m secondary storage mount point\n\t-f system vm template file\n\t-h hypervisor name: kvm|vmware|xenserver|hyperv|ovm3\n\t-s mgmt server secret key, if you specified any when running cloudstack-setup-database, default is password\n\t-u Url to system vm template\n\t-F clean up system templates of specified hypervisor\n\t-e Template suffix, e.g vhd, ova, qcow2\n\t-o Database server hostname or ip, e.g localhost\n\t-r Database user name, e.g root\n\t-p mysql database port\n\t-d Database password. Followed by nothing if the password is empty\n\n" $(basename $0) >&2
  printf "\tor\n"
  printf "\nUsage: %s:\n\t-m secondary storage mount point\n\t-u http url for system vm template\n\t-h hypervisor name: kvm|vmware|xenserver|hyperv|ovm3\n\t-s mgmt server secret key\n\n" $(basename $0) >&2
}

# Usage: e.g. failed $? "this is an error"
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
}

#set -x
umask 0022 # ensure we have the proper permissions even on hardened deployments
mflag=
fflag=
ext="vhd"
templateId=
hyper=
msKey=password
DISKSPACE=2120000  #free disk space required in kilobytes
dbHost="localhost"
dbUser="root"
dbPassword=
dbPort=3306
jarfile='/usr/share/cloudstack-common/lib/cloudstack-utils.jar'

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

OPTERR=0
while getopts 'm:h:f:u:Ft:e:Ms:o:r:d:p:'# OPTION
do
  case $OPTION in
  m)    mflag=1
        mntpoint="$OPTARG"
        ;;
  f)    fflag=1
        tmpltimg="$OPTARG"
        ;;
  u)    uflag=1
        url="$OPTARG"
        ;;
  F)    Fflag=1
        ;;
  t)    templateId="$OPTARG"
        ;;
  e)    ext="$OPTARG"
        ;;
  h)    hyper="$OPTARG"
        ;;
  s)    sflag=1
        msKey="$OPTARG"
        ;;
  o)    oflag=1
        dbHost="$OPTARG"
        ;;
  r)    rflag=1
        dbUser="$OPTARG"
        ;;
  d)    dflag=1
        dbPassword="$OPTARG"
        ;;
  p)    pflag=1
        dbPort="$OPTARG"
        ;;
  ?)    usage
        exit 0
        ;;
  *)    usage
        exit 0
        ;;
  esac
done

if [[ "$mflag$fflag" != "11" && "$mflag$uflag" != "11" ]]; then
  failed 2 "Please add a mount point and a system vm template file"
fi

if [[ -z "$hyper" ]]; then
  failed 2 "Please add a correct hypervisor name like: kvm|vmware|xenserver|hyperv|ovm3"
fi

if [[ ! -d $mntpoint ]]; then
  failed 2 "mount point $mntpoint doesn't exist\n"
fi

if [[ "$fflag" == "1" && ! -f $tmpltimg ]]; then
  failed 2 "template image file $tmpltimg doesn't exist"
fi

if [[ -f /etc/cloudstack/management/db.properties ]]; then
  if [[ "$pflag" != 1 ]]; then
    dbPort=$(sed '/^\#/d' /etc/cloudstack/management/db.properties | grep 'db.cloud.port'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  fi

  if [[ "$oflag" != 1 ]]; then
    dbHost=$(sed '/^\#/d' /etc/cloudstack/management/db.properties | grep 'db.cloud.host'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  fi

  if [[ "$rflag" != 1 ]]; then
    dbUser=$(sed '/^\#/d' /etc/cloudstack/management/db.properties | grep 'db.cloud.username'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  fi

  encType=$(sed '/^\#/d' /etc/cloudstack/management/db.properties | grep 'db.cloud.encryption.type'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  if [[ "$encType" == "file" ]]; then
    msKey=$(cat /etc/cloudstack/management/key)
  elif [[ "$encType" == "web" ]]; then
    if [[ ! "$sflag" == "1" ]]; then
      failed 2 "Encryption type web requires mgmt secret key using -s option"
    fi
  fi

  if [[ "$encType" == "file" || "$encType" == "web" ]]; then
    encPassword=$(sed '/^\#/d' /etc/cloudstack/management/db.properties | grep 'db.cloud.password'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'i | sed 's/^ENC(\(.*\))/\1/')
    if [[ ! $encPassword == "" ]]; then
      dbPassword=(`java -classpath $jarfile com.cloud.utils.crypt.EncryptionCLI -d -i "$encPassword" -p "$msKey"`)
      if [[ ! $dbPassword ]]; then
        failed 2 "Failed to decrypt DB password from db.properties"
      fi
    fi
  else
    if [[ "$dflag" != 1 ]]; then
      dbPassword=$(sed '/^\#/d' /etc/cloudstack/management/db.properties | grep 'db.cloud.password'  | tail -n 1 | cut -d "=" -f2- | sed 's/^[[:space:]]*//;s/[[:space:]]*$//'i )
    fi
  fi
fi

if [[ "$templateId" == "" ]]; then
  if [[ "$hyper" == "kvm" ]]; then
    ext="qcow2"
    templateId=(`mysql -P $dbPort -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"KVM\" and removed is null"`)
    qemuimgcmd=$(which qemu-img)
  elif [[ "$hyper" == "xenserver" ]]; then
    ext="vhd"
    templateId=(`mysql -P $dbPort -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"XenServer\" and removed is null"`)
  elif [[ "$hyper" == "vmware" ]]; then
    ext="ova"
    templateId=(`mysql -P $dbPort -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"VMware\" and removed is null"`)
  elif [[ "$hyper" == "lxc" ]]; then
    ext="qcow2"
    templateId=(`mysql -P $dbPort -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"LXC\" and removed is null"`)
  elif [[ "$hyper" == "hyperv" ]]; then
    ext="vhd"
    templateId=(`mysql -P $dbPort -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"Hyperv\" and removed is null"`)
  elif [[ "$hyper" == "ovm3" ]]; then
    ext="raw"
    templateId=(`mysql -P $dbPort -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "select max(id) from cloud.vm_template where type = \"SYSTEM\" and hypervisor_type = \"Ovm3\" and removed is null"`)
  else
    failed 2 "Please add a correct hypervisor name like: kvm|vmware|xenserver|hyperv|ovm3"
  fi
fi

if [[ ! $templateId ]]; then
  failed 2 "Unable to get template Id from database"
fi

_uuid=$(uuidgen)
localfile=$_uuid.$ext

_res=(`mysql -P $dbPort -h $dbHost --user=$dbUser --password=$dbPassword --skip-column-names -U cloud -e "update cloud.vm_template set uuid=\"$_uuid\", url=\"$url\" where id=\"$templateId\""`)

mntpoint=`echo "$mntpoint" | sed 's|/*$||'`

destdir=$mntpoint/template/tmpl/1/$templateId/

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

if [[ "$Fflag" == "1" ]]; then
  rm -rf $destdir/*
  if [[ $? -ne 0 ]]; then
    failed 2 "Failed to clean up template directory $destdir -- check permissions?"
  fi
fi

if [[ -f $destdir/template.properties ]]; then
  failed 2 "Data already exists at destination $destdir -- use -F to force cleanup of old template\nIF YOU ARE ATTEMPTING AN UPGRADE, YOU MAY NEED TO SPECIFY A TEMPLATE ID USING THE -t FLAG"
fi

destfiles=$(find $destdir -name \*.$ext)
if [[ "$destfiles" != "" ]]; then
  failed 2 "Data already exists at destination $destdir -- use -F to force cleanup of old template"
fi

tmplfile=$(dirname $0)/$localfile

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

destcap=$(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 $(dirname $0) | awk '{print $4}' | tail -1 )
[ $localcap -lt $DISKSPACE ] && echo "Insufficient free disk space for local temporary folder $(dirname $0): avail=${localcap}k req=${DISKSPACE}k" && failed 4

if [[ "$uflag" == "1" ]]; then
  wget -O $tmplfile $url
  if [[ $? -ne 0 ]]; then
    failed 2 "Failed to fetch system vm template from $url"
  fi
fi

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

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

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

if [ "$ext" == "ova" ]
then
  tar xvf $destdir/$localfile -C $destdir &> /dev/null
fi

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

echo "$ext=true" >> $destdir/template.properties
echo "id=$templateId" >> $destdir/template.properties
echo "public=true" >> $destdir/template.properties
echo "$ext.filename=$localfile" >> $destdir/template.properties
echo "uniquename=routing-$templateId" >> $destdir/template.properties
echo "$ext.virtualsize=$vrtmpltsize" >> $destdir/template.properties
echo "virtualsize=$vrtmpltsize" >> $destdir/template.properties
echo "$ext.size=$tmpltsize" >> $destdir/template.properties

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