#!/bin/bash

# Copyright (C) 2006, 2007, 2008, 2009, 2010, 2012, 2013 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

# This is a test script to ease development and testing on test clusters.
# It should not be used to update production environments.

# Usage: upload node-{1,2,3}
# it will upload the python libraries to
# $prefix/lib/python2.X/dist-packages/ganeti and the command line utils to
# $prefix/sbin. It needs passwordless root login to the nodes.

set -e -u

usage() {
  echo "Usage: $0 [--no-restart] [--no-cron] [--no-debug] hosts..." >&2
  exit $1
}

declare -r SED="sed -f autotools/replace_vars.sed"

NO_RESTART=
NO_CRON=
NO_DEBUG=
hosts=
while [ "$#" -gt 0 ]; do
  opt="$1"
  case "$opt" in
    --no-restart)
      NO_RESTART=1
      ;;
    --no-cron)
      NO_CRON=1
      ;;
    --no-debug)
      NO_DEBUG=1
      ;;
    -h|--help)
      usage 0
      ;;
    -*)
      echo "Unknown option: $opt" >&2
      usage 1
      ;;
    *)
      hosts="$hosts $opt"
      ;;
  esac
  shift
done

if [ -z "$hosts" ]; then
  usage 1
fi

set ${hosts}

make regen-vcs-version

TXD=`mktemp -d`
trap 'rm -rf $TXD' EXIT

if [[ -f /proc/cpuinfo ]]; then
  cpu_count=$(grep -E -c '^processor[[:space:]]*:' /proc/cpuinfo)
  make_args=-j$(( cpu_count + 1 ))
else
  make_args=
fi

# Make sure that directories will get correct permissions
umask 0022

# install ganeti as a real tree
make $make_args install DESTDIR="$TXD"

# at this point, make has been finished, so the configuration is
# fixed; we can read the prefix vars/etc.
PREFIX="$(echo @PREFIX@ | $SED)"
SYSCONFDIR="$(echo @SYSCONFDIR@ | $SED)"
LIBDIR="$(echo @LIBDIR@ | $SED)"
PKGLIBDIR="$(echo @PKGLIBDIR@ | $SED)"

# copy additional needed files
[ -f doc/examples/ganeti.initd ] && \
install -D --mode=0755 doc/examples/ganeti.initd \
  "$TXD/$SYSCONFDIR/init.d/ganeti"

[ -f doc/examples/ganeti.logrotate ] && \
install -D --mode=0755 doc/examples/ganeti.logrotate \
  "$TXD/$SYSCONFDIR/logrotate.d/ganeti"

[ -f doc/examples/ganeti-master-role.ocf ] && \
install -D --mode=0755 doc/examples/ganeti-master-role.ocf \
  "$TXD/$LIBDIR/ocf/resource.d/ganeti/ganeti-master-role"

[ -f doc/examples/ganeti-node-role.ocf ] && \
install -D --mode=0755 doc/examples/ganeti-node-role.ocf \
  "$TXD/$LIBDIR/ocf/resource.d/ganeti/ganeti-node-role"

[ -f doc/examples/ganeti.default-debug -a -z "$NO_DEBUG" ] && \
install -D --mode=0644 doc/examples/ganeti.default-debug \
  "$TXD/$SYSCONFDIR/default/ganeti"

[ -f doc/examples/bash_completion-debug ] && \
install -D --mode=0644 doc/examples/bash_completion-debug \
  "$TXD/$SYSCONFDIR/bash_completion.d/ganeti"

if [ -f doc/examples/ganeti.cron -a -z "$NO_CRON" ]; then
  install -D --mode=0644 doc/examples/ganeti.cron \
    "$TXD/$SYSCONFDIR/cron.d/ganeti"
fi

echo ---

( cd "$TXD" && find; )

echo ---

# and now put it under $prefix on the target node(s)
for host; do
  echo Uploading code to ${host}...
  rsync -v -rlKDc \
    -e "ssh -oBatchMode=yes" \
    --exclude="*.py[oc]" --exclude="*.pdf" --exclude="*.html" \
    "$TXD/" \
    root@${host}:/ &
done
wait

if test -z "${NO_RESTART}"; then
  for host; do
    echo Restarting ganeti-noded on ${host}...
    ssh -oBatchMode=yes root@${host} $SYSCONFDIR/init.d/ganeti restart &
  done
  wait
fi
