#!/usr/bin/env 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.


# $Id: installIso.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/storage/secondary/installIso.sh $
# installIso.sh -- install an iso

usage() {
  printf "Usage: %s: -t <iso-fs> -f <iso file> -c <md5 cksum> [-u]\n" $(basename $0) >&2
}


#set -x

verify_cksum() {
  echo  "$1  $2" | md5sum  -c --status
  if [ $? -gt 0 ]
  then
    printf "Checksum failed, not proceeding with install\n"
    exit 3
  fi
}

install_file() {
  local isofs=$1
  local isofile=$2
  local cleanup=$3
  local tmpltname=$4

  mv $isofile /$isofs/$tmpltname

  if [ $? -gt 0 ]
  then
    printf "Move operation failed, iso $isofile not installed\n"
    exit 4
  fi

  #create symbolic link for iso file
  file=$tmpltname
  isofs=$isofs/$file
  mp=${isofs%/iso/*}
  mp=/$mp/iso
  path=${isofs:${#mp}}
  pushd $mp
  ln -s $path $file
  popd


}


tflag=
fflag=
cleanup=false
cflag=
tmpltname=

while getopts 'ut:f:n:c:' OPTION
do
  case $OPTION in
  t)	tflag=1
		isofs="$OPTARG"
		;;
  f)	fflag=1
		isofile="$OPTARG"
		;;
  c)	cflag=1
		cksum="$OPTARG"
		;;
  u)	cleanup="true"
		;;
  n)    tmpltname="$OPTARG"
        ;;
  ?)	usage
		exit 2
		;;
  esac
done

if [ "$tflag$fflag" != "11" ]
then
 usage
 exit 2
fi

if [ -n "$cksum" ]
then
  verify_cksum $cksum $isofile
fi

if [ ${isofs:0:1} == / ]
then
  isofs=${isofs:1}
fi

if [ ! -d /$isofs ]
then
  mkdir -p /$isofs
  if [ $? -gt 0 ]
  then
    printf "Failed to create iso fs $isofs\n" >&2
    exit 1
  fi
fi

install_file $isofs $isofile $cleanup $tmpltname

isofilename=${isofile##*/}
today=$(date '+%m_%d_%Y')

echo "filename=$tmpltname" > /$isofs/template.properties
echo "snapshot.name=$today" >> /$isofs/template.properties


exit 0
