#!/bin/bash
#
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
USAGE='Usage: deploy_puppet.sh [-rsndh]'
HELP="${USAGE}\n\n\
Force puppet deployment.\n\
The script will first fetch server hostnames from server db,\n\
given the server role and status and/or server name.\n\
And then force puppet deployment on the selected servers.\n\n\
Requirement:
- Run on the machine that has access to server db and
- Run it as chromeos-test.\n\
- The server must exist in server db, even if -n is used.
It should be safe to rerun the script multiple time, \n\
as it doesn't hurt to deploy puppet multiple times.\n\n\
Options:\n\
-r server role as in server db, e.g. 'drone'.\n\
-s server status as in server db, e.g. 'primary'.\n\
-n server hostname.\n\
-d dryrun.\n\
-h help."
ROLE=
ROLE_OPT=
STATUS=
STATUS_OPT=
HOSTNAME=
DRYRUN="FALSE"
AUTOTEST_ROOT="/usr/local/autotest"
while getopts ":s:r:n:dh" opt; do
case $opt in
r)
ROLE=$OPTARG
;;
s)
STATUS=$OPTARG
;;
n)
HOSTNAME=$OPTARG
;;
d)
DRYRUN="TRUE"
;;
h)
echo -e "${HELP}" >&2
exit 0
;;
\?)
echo "Invalid option: -$OPTARG" >&2
echo -e "${HELP}" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
echo -e "${HELP}" >&2
exit 1
;;
esac
done
if [ -n "${ROLE}" ]; then
ROLE_OPT="-r ${ROLE}"
fi
if [ -n "${STATUS}" ]; then
STATUS_OPT="-s ${STATUS}"
fi
if [ -z "${ROLE}" ] && [ -z "${STATUS}" ] && [ -z "${HOSTNAME}" ]; then
echo "You must specify at least one of -r, -s or -n"
exit 1
fi
hosts="$(${AUTOTEST_ROOT}/cli/atest server list ${STATUS_OPT} ${ROLE_OPT} ${HOSTNAME} | awk '/hostname *:/ {gsub(/"/, "", $2); print $2}')"
echo -e "\n******* Will update the following servers ********\n "
for host in ${hosts}; do
echo ${host}
done
echo -e "\n**************************************************\n"
for host in ${hosts}; do
run_puppet="ssh ${host} -- 'sudo /root/chromeos-admin/puppet/sync_and_run_puppet -f'"
echo -e "\n********** Processing ${host} ****************\n"
echo "[Running] ${run_puppet}"
if [ "${DRYRUN}" != "TRUE" ]; then
eval ${run_puppet}
fi
echo -e "\n********* Finished processing ${host} *******\n"
done