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




set -x

usage() {
  printf "Usage: %s: [-f] [-d] [-i] \n" $(basename $0) >&2
}


path=
db=
ips=

while getopts 'p:d:i:' OPTION
do
  case $OPTION in
  p)    path="$OPTARG"
        ;;
  d)    db="$OPTARG"
        ;;
  i)    ips="$OPTARG"
        ;;

  ?)    usage
  esac
done


deploy_server() {
  echo "Deploying management server software on remote machine $1"

  rsync -avzh -e ssh $path/cloudstack-oss root@$1:/root/
  if [ $? -gt 0 ]; then echo "failed to rsync software between $path/cloudstack-oss and remote machine $1"; return 2; fi

  ssh root@$1 "cd /root/cloudstack-oss && ant clean build-all deploy-server"
  if [ $? -gt 0 ]; then echo "failed to deploy cluster on $1"; return 2; fi


  ssh root@$1 "dir=\`cat ~/.bashrc  | grep 'export CATALINA_HOME' | awk -F '=' '{ print \$2}'\` && file=\$dir/conf/db.properties && sed '/cluster.node.IP/ d' \$file > db.properties1; dos2unix db.properties1; mv -f db.properties1 \$file; echo \cluster.node.IP=$1 >> \$file && file=\$dir/conf/db.properties && sed '/db.cloud.host/ d' \$file > db.properties1; dos2unix db.properties1; mv -f db.properties1 \$file; echo \db.cloud.host=$db >> \$file && file=\$dir/conf/db.properties && sed '/db.usage.host/ d' \$file > db.properties1; dos2unix db.properties1; mv -f db.properties1 \$file; echo \db.usage.host=$db >> \$file"

if [ $? -gt 0 ]; then echo "failed to setup db.properties file on remote $1"; return 2; fi

#ssh root@$1 "cd /root/cloudstack-oss && nohup ant run &"
  #if [ $? -gt 0 ]; then echo "failed to start the softare on remote $1"; return 2; fi

  echo "Remote management server is deployed as a part of cluster setup; you have to start it manually by logging in remotely"
}

export IFS=","
for ip in $ips; do
  echo "$ip"
  deploy_server $ip
done
