Created
September 17, 2016 06:45
-
-
Save kbni/ff19c629e64fc17b566a50b8835e00cf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Author: Alex Wilson <admin@kbni.net> | |
# | |
# Basic script to assist with managing zato hosts | |
function script_help() { | |
echo "$(basename "$0") - Zato control script" | |
echo "author: Alex Wilson <admin@kbni.net>" | |
echo "" | |
echo "arguments:" | |
echo " echo echo each hosts name, role and path" | |
echo " sleep sleep (might want to use between calls)" | |
echo " start start servers that are not load_balancer or web_admin)" | |
echo " startall start ALL servers including load_balancer and web_admin" | |
echo " stop stop servers that are not load_balancer or web_admin)" | |
echo " stopall stop ALL servers including load_balancer and web_admin" | |
echo " buildzep creates zato_extra_paths from pyenv + pysrc directories" | |
echo " pushzep pushes zato_extra_paths to remote hosts" | |
echo " zep buildzep+pushzep" | |
echo "" | |
echo "hosts file is ${hosts_file}" | |
echo " should contain list of hosts, their path and role:" | |
echo " zato@server:/opt/zato/path-to-env/server_dir:role" | |
echo " where role should be server, web_admin or load_balancer" | |
echo "" | |
exit 0 | |
} | |
this_file=$(readlink -nf "$0") | |
this_dir=$(dirname "$this_file") | |
pyenv_dir="${this_dir}/pyenv" | |
pysrc_dir="${this_dir}/pysrc" | |
zep_dir="${this_dir}/zato_extra_paths" | |
hosts_file="${this_dir}/hosts" | |
zato_bin="/opt/zato/current/bin/zato" | |
function zato_echo() { | |
zato_host=$1 | |
zato_path=$2 | |
echo "$zato_host" | |
} | |
function zato_sleep() { | |
zato_host=$1 | |
zato_path=$2 | |
sleep 2 | |
} | |
function zato_stop() { | |
zato_host=$1 | |
zato_path=$2 | |
echo -n "stopping ${zato_host}:" | |
ssh "$zato_host" "$zato_bin" stop "$zato_path" < /dev/null # don't gobble stdin | |
} | |
function zato_start() { | |
zato_host=$1 | |
zato_path=$2 | |
echo -n "starting ${zato_host}: " | |
ssh "$zato_host" "$zato_bin" start "$zato_path" < /dev/null # don't gobble stdin | |
} | |
function zato_clearpid() { | |
zato_host=$1 | |
zato_path=$2 | |
ssh "$zato_host" rm "${zato_path}/pidfile" < /dev/null # don't gobble stdin | |
} | |
function zato_sync() { | |
zato_host=$1 | |
zep_dir=$2 | |
rsync -rz "${zep_dir}/" "${zato_host}:current/zato_extra_paths/" --delete-after | |
} | |
function generate_zep() { | |
pyenv_dir=$1 | |
pysrc_dir=$2 | |
zep_dir=$3 | |
if [ -d "$zep_dir" ]; then | |
echo -n "Cleaning up ${zep_dir}.." | |
rm -rf "$zep_dir" | echo "." | |
fi | |
mkdir "$zep_dir" && echo "Recreating ${zep_dir}" | |
# Copy items from pyenv_dir into zep_dir | |
for ifile in "${pyenv_dir}/lib/python2.7/site-packages"/*/__init__.py; do | |
if [ ! -e "$ifile" ]; then | |
echo "Warning: Nothing found in pyenv: ${pyenv_dir}" > /dev/stderr | |
break | |
else | |
dir=$(dirname "$ifile") | |
echo -n " copying from pyenv: ${dir} .." | |
rsync -rz --copy-links --exclude .git --exclude .pyc "${dir}" "${zep_dir}/" && echo ". OK" | |
fi | |
done | |
# Copy items from pysrc_dir into zep_dir | |
for dir in "${pysrc_dir}/"*; do | |
if [ ! -e "$dir" ]; then | |
echo "Warning: Nothing found in pysrc: ${pysrc_dir}" > /dev/stderr | |
break | |
else | |
[[ -d "$dir" || "$dir" == *".py" ]] || continue | |
[[ "$dir" == "setuptools" ]] && continue | |
echo -n " copying from pysrc: ${dir} .." | |
rsync -rz --copy-links --exclude .git --exclude .pyc "${dir}" "${zep_dir}/" && echo ". OK" | |
fi | |
done | |
} | |
[[ "$1" == "" ]] && script_help | |
for arg in "$@"; do | |
# Global options are parsed here | |
case "$arg" in | |
zep|buildzep) | |
generate_zep "$pyenv_dir" "$pysrc_dir" "$zep_dir" ;; | |
-h|--help|help) | |
script_help ;; | |
esac | |
# Per host options are parsed here | |
while IFS=: read zato_host zato_path zato_role; do | |
pidfile="${zato_path}/pidfile" | |
case "$arg" in | |
multitail|mt) | |
ssh $zato_host tail -f "${zato_path}/logs/server.log" < /dev/null & ;; | |
echo) | |
zato_echo "$zato_host" "$zato_path" ;; | |
start) | |
[[ $zato_role != "server" ]] && zato_start "$zato_host" "$zato_path" ;; | |
stop) | |
[[ $zato_role == "server" ]] && zato_stop "$zato_host" "$zato_path" ;; | |
startall) | |
zato_start "$zato_host" "$zato_path" ;; | |
stopall) | |
zato_stop "$zato_host" "$zato_path" ;; | |
sleep) | |
zato_sleep "$zato_host" "$zato_path" ;; | |
zep|pushzep) | |
[[ $zato_role == "server" ]] && zato_sync "$zato_host" "$zep_dir" ;; | |
clearpid|cleanpid) | |
zato_clearpid "$zato_host" "$zato_path" ;; | |
esac | |
done < $hosts_file | |
# Global options are parsed here | |
case "$arg" in | |
multitail|mt) | |
trap "kill $(pgrep -P $$ -d' ')" EXIT | |
wait | |
;; | |
esac | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment