--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dev/provisioning/modules/puppi/templates/puppi.erb Fri Jan 15 15:35:00 2016 +0100
@@ -0,0 +1,517 @@
+#!/bin/bash
+configfile="<%= scope.lookupvar('puppi::params::basedir') %>/puppi.conf"
+
+# This is the actual command used to run the different scripts
+# Use cat for debugging noop purposes
+# runcommand="cat"
+runcommand=""
+
+# Define defaults
+verbosity="max"
+show="yes"
+
+# Define action tag
+export tag=$(date +%Y%m%d-%H%M%S)
+
+counter=0
+
+# Load general configurations
+if [ ! -f $configfile ] ; then
+ echo "Config file: $configfile not found"
+ exit 1
+else
+ . $configfile
+ . $scriptsdir/functions
+fi
+
+# Main functions
+check_host () {
+ for command in $(ls -1 $checksdir) ; do
+ title="$HOSTNAME check: $command"
+ code=$(cat "$checksdir/$command")
+ ask_interactive
+ output=$($runcommand "$checksdir/$command" 2>&1)
+ handle_result
+ done
+}
+
+check () {
+ for command in $(ls -1 $projectsdir/$project/check) ; do
+ title="$HOSTNAME check: $command"
+ code=$(cat "$projectsdir/$project/check/$command")
+ ask_interactive
+ output=$($runcommand "$projectsdir/$project/check/$command" 2>&1)
+ handle_result
+ done
+
+ check_host
+ # show_report
+}
+
+log () {
+ tailcommand="tail"
+ which colortail >/dev/null 2>&1 && tailcommand="colortail"
+
+ if [ "x$project" != "xdefault" ] ; then
+ if [ $logsdir/$project ] ; then
+ alllog="$alllog $(cat $logsdir/$project)"
+ else
+ echo "WARNING: $logsdir/$project does not exist!"
+ exit 1
+ fi
+ else
+ if [ "$interactive" = "yes" ] ; then
+ echo "Choose one or more log topics to show. Select the last number (done) to end selection"
+ PS3="Type one number to add a log topic to the show list."
+ all_choices=""
+ select choice in $( ls $logsdir ) done
+ do
+ echo "You selected $choice [$REPLY]"
+ [[ $choice == "done" ]] && break
+ all_choices="$all_choices $choice"
+ echo "Your choices: $all_choices"
+ done
+ for log in $all_choices ; do
+ alllog="$alllog $(cat $logsdir/$log)"
+ done
+ else
+ for log in $(ls $logsdir) ; do
+ alllog="$alllog $(cat $logsdir/$log)"
+ done
+ fi
+ fi
+
+ # So, show something
+ if [ ! -z "$counts" ] ; then
+ if [ ! -z "$greppattern" ] ; then
+ $tailcommand -n $counts $alllog | grep $greppattern
+ else
+ $tailcommand -n $counts $alllog
+ fi
+ else
+ if [ ! -z "$greppattern" ] ; then
+ $tailcommand -f $alllog | grep $greppattern
+ else
+ $tailcommand -f $alllog
+ fi
+ fi
+}
+
+info () {
+ if [ "x$project" != "xdefault" ] ; then
+ if [ $infodir/$project ] ; then
+ $infodir/$project
+ else
+ echo "WARNING: $infodir/$project does not exist!"
+ exit 1
+ fi
+ else
+ if [ "$interactive" = "yes" ] ; then
+ echo "Choose one or more topics to show. Select the last number (done) to end selection"
+ PS3="Type one number to add an info topic to the show list."
+ all_choices=""
+ select choice in $( ls $infodir ) done
+ do
+ echo "You selected $choice [$REPLY]"
+ [[ $choice == "done" ]] && break
+ all_choices="$all_choices $choice"
+ echo "Your choices: $all_choices"
+ done
+ for info in $all_choices ; do
+ if [ ! -z "$greppattern" ] ; then
+ $infodir/$info | grep $greppattern
+ else
+ $infodir/$info
+ fi
+ done
+ else
+ for info in $(ls $infodir) ; do
+ if [ ! -z "$greppattern" ] ; then
+ $infodir/$info | grep $greppattern
+ else
+ $infodir/$info
+ fi
+ done
+ fi
+ fi
+}
+
+
+todo () {
+ for todo in $(ls $tododir) ; do
+ $tododir/$todo
+ done
+}
+
+
+rollback () {
+ if [ ! -z $rollbackversion ] ; then
+ save_runtime_config "rollbackversion=$rollbackversion" || initerr=1
+ else
+ echo "Choose deploy to rollback:"
+ ls -1 $archivedir/$project
+ read rollbackversion
+ save_runtime_config "rollbackversion=$rollbackversion" || initerr=1
+ fi
+
+ for command in $(ls -1 $projectsdir/$project/rollback) ; do
+ title="$HOSTNAME Rollback: $command"
+ code=$(cat "$projectsdir/$project/rollback/$command")
+ ask_interactive
+ output=$($runcommand "$projectsdir/$project/rollback/$command" 2>&1)
+ handle_result
+ done
+
+ send_reports
+ show_report
+ [ "$result" = "OK" ] && exit 0
+}
+
+deploy () {
+ for command in $(ls -1 $projectsdir/$project/deploy) ; do
+ title="$HOSTNAME Deploy: $command"
+ code=$(cat "$projectsdir/$project/deploy/$command")
+ ask_interactive
+ output=$($runcommand "$projectsdir/$project/deploy/$command" 2>&1)
+ handle_result
+ [ "$EXITCRIT" = "1" ] && [ "$force" != "yes" ] && break
+ if [ "$DONTDEPLOY" = "1" ] ; then
+ echo "No need to deploy: source file has not changed"
+ echo "Type 'rm $archivedir/$project/md5sum' and run puppi again to force deployment"
+ exit 0
+ fi
+ done
+
+ send_reports
+ show_report
+ [ "$result" = "OK" ] && exit 0
+}
+
+initialize () {
+ for command in $(ls -1 $projectsdir/$project/initialize) ; do
+ title="$HOSTNAME Init: $command"
+ code=$(cat "$projectsdir/$project/initialize/$command")
+ ask_interactive
+ output=$($runcommand "$projectsdir/$project/initialize/$command" 2>&1)
+ handle_result
+ [ "$EXITCRIT" = "1" ] && [ "$force" != "yes" ] && break
+ done
+
+ send_reports
+ show_report
+ [ "$result" = "OK" ] && exit 0
+}
+
+configure () {
+ for command in $(ls -1 $projectsdir/$project/configure) ; do
+ title="$HOSTNAME Init: $command"
+ code=$(cat "$projectsdir/$project/configure/$command")
+ ask_interactive
+ output=$($runcommand "$projectsdir/$project/configure/$command" 2>&1)
+ handle_result
+ [ "$EXITCRIT" = "1" ] && [ "$force" != "yes" ] && break
+ done
+
+ send_reports
+ show_report
+ [ "$result" = "OK" ] && exit 0
+}
+
+save_summary () {
+ tagend=$(date +%Y%m%d-%H%M%S)
+
+ result="OK"
+ if [ "$EXITWARN" = "1" ] ; then
+ result="WARNING"
+ fi
+ if [ "$EXITCRIT" = "1" ] ; then
+ result="ERROR"
+ fi
+
+ echo "Report for $action on $project" > $logdir/$project/$tag/summary
+ echo "Job start: $tag" >> $logdir/$project/$tag/summary
+ echo "Job end: $tagend" >> $logdir/$project/$tag/summary
+ echo "Job result: $result" >> $logdir/$project/$tag/summary
+ echo "Actions executed:" >> $logdir/$project/$tag/summary
+ cd $logdir/$project/$tag/
+ for message in $(ls -1 $logdir/$project/$tag/ | grep -v summary ) ; do
+ msg_title=$(head -1 $message)
+ msg_code=$(head -2 $message | tail -1)
+ msg_result=$(head -3 $message | tail -1)
+ echo "[$msg_result] $msg_title : $msg_code" >> $logdir/$project/$tag/summary
+ done
+
+ # Copy runtime config in archive
+ cp $workdir/$project/config $logdir/$project/$tag/
+
+ # Write runtime config on Summary
+ echo >> $logdir/$project/$tag/summary
+ echo "RUNTIME CONFIGURATION" >> $logdir/$project/$tag/summary
+ cat $workdir/$project/config | grep -vE "^#|^$" >> $logdir/$project/$tag/summary
+
+}
+
+send_reports () {
+ if [[ "x$report" == "xyes" ]] ; then
+ save_summary
+ for command in $(ls -1 $projectsdir/$project/report) ; do
+ title="Reporting: $command"
+ code=$(cat "$projectsdir/$project/report/$command")
+ echo -n $title
+ output=$($runcommand "$projectsdir/$project/report/$command" 2>&1)
+ # handle_result # This breaks the overall exit code when deploy fails
+ done
+ fi
+}
+
+show_report () {
+ echo
+ echo "REPORT FOR PUPPI - STATUS $result"
+ echo "Summary of operations is: $logdir/$project/$tag/summary "
+ echo "Details are in: $logdir/$project/$tag/"
+ echo "Temporary workdir has been: $workdir/$project/ (Will be rewritten at the next puppi run)"
+ echo "Runtime config file is: $workdir/$project/config"
+ echo "Files have been archived in: $archivedir/$project/$tag"
+ test "$testmode" = "yes" && echo "This was a TEST RUN! Nothing has been done for real."
+}
+
+
+create_runtime_conf () {
+ if [[ ( ! -e $projectsdir/$project ) && ( ! -e $infodir/$project ) && ( ! -e $logsdir/$project ) ]] ; then
+ showhelp
+ exit 1
+ fi
+
+ initerr=0
+
+ # When project is unset we set it to default
+ [ ! -z "$project" ] || export project="default"
+
+ # Clean up and Create runtime configuration file
+# command="00-$project-RuntimeConfig-Initialization"
+# title="Puppi setup: $command"
+# code="rm -rf $workdir/$project && touch $workdir/$project/config [...]"
+# echo -n $title
+
+ echo $workdir | grep tmp >/dev/null 2>&1 || ( echo "Workdir must contain string tmp" ; exit 1 )
+ rm -rf $workdir/$project || initerr=1
+
+ mkdir -p $workdir/$project || initerr=1
+ touch $workdir/$project/config || initerr=1
+
+ test -r "$projectsdir/$project/config" && cp $projectsdir/$project/config $workdir/$project/
+ chmod 644 $workdir/$project/config || initerr=1
+
+ save_runtime_config "project=$project" || initerr=1
+ save_runtime_config "tag=$tag" || initerr=1
+ save_runtime_config "action=$action" || initerr=1
+
+ storedir=$workdir/$project/store || initerr=1
+ mkdir -p $storedir || initerr=1
+ save_runtime_config "storedir=$storedir" || initerr=1
+
+ predeploydir=$workdir/$project/deploy || initerr=1
+ mkdir -p $predeploydir || initerr=1
+ save_runtime_config "predeploydir=$predeploydir" || initerr=1
+
+ save_runtime_config "force=$force" || initerr=1
+ save_runtime_config "testmode=$testmode" || initerr=1
+ save_runtime_config "interactive=$interactive" || initerr=1
+ save_runtime_config "debug=$debug" || initerr=1
+ save_runtime_config "report=$report" || initerr=1
+ save_runtime_config "show=$show" || initerr=1
+ save_runtime_config "counts=$counts" || initerr=1
+ save_runtime_config "greppattern=$greppattern" || initerr=1
+
+ for oopt in $(echo $options) ; do
+ save_runtime_config "$(echo $oopt)" || initerr=1
+ done
+
+ echo $initerr | grep "0" 2>&1 > /dev/null
+# handle_result
+}
+
+
+showhelp () {
+ echo "Usage: puppi <command> [project|topic] [options]"
+ echo " "
+ echo "Available commands:"
+ echo "check [project] [-s <yes|no|fail>] - Run puppi checks host or project wide"
+ echo "log [topic] [-i] [-g <pattern>] - Show system and application specific logs"
+ echo "info [topic] [-i] [-g <pattern>] - Show informations about the system"
+ echo "todo - Show todo's checklist of the system"
+ echo "init <project> [-i] [-f] [-t] - First time project initialization and setup"
+ echo "configure <project> [-i] [-f] [-t] - Project configuration deployment."
+ echo "deploy <project> [-i] [-f] [-t] [-o ...] - Deploy the specified project"
+ echo "rollback <project> [state] [-i] [-f] [-t] - Rollback the specified project. "
+ echo " "
+ echo "Available options:"
+ echo "-f - Force puppi commands execution flow also on CRITICAL errors"
+ echo "-i - Interactively ask confirmation for every step"
+ echo "-t - Test mode. Just show the commands that should be executed"
+ echo "-d <yes|full> - Debug mode. Show debug of what is done."
+ echo "-r <yes|no|fail> - Enable reporting: yes/no/only on failures. Default depends on action"
+ echo "-s <yes|no|fail> - Show output: yes/no/only for failures. Default: yes"
+ echo "-g <pattern> - Grep command output with the selected pattern"
+ echo "-o \"parameter=value parameter2=value2\" - Set manual options to override defaults"
+ echo " "
+ echo "Available deploy projects:"
+ ls -1 $projectsdir
+ echo
+ echo "Available info topics:"
+ ls $infodir
+ echo
+ echo "Available log topics:"
+ ls $logsdir
+}
+
+# Check Input
+if [ "$#" = "0" ] ; then
+ showhelp
+ exit
+fi
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ deploy|init|configure)
+ report="yes"
+ export action=$1
+ if [ -n "$2" ] ; then
+ echo "$2" | egrep -q "^-.$"
+ if [ "$?" != "0" ] ; then
+ export project=$(shell_filter_strict $2)
+ shift 2
+ else
+ shift
+ fi
+ else
+ showhelp
+ exit
+ shift
+ fi
+ ;;
+ rollback)
+ report="yes"
+ export action=$1
+ if [ -n "$3" ] ; then
+ echo "$3" | egrep -q "^-.$"
+ if [ "$?" != "0" ] ; then
+ export project=$(shell_filter_strict $2)
+ export rollbackversion=$(shell_filter_strict $3)
+ shift 3
+ else
+ shift 2
+ fi
+ elif [ -n "$2" ] ; then
+ echo "$2" | egrep -q "^-.$"
+ if [ "$?" != "0" ] ; then
+ export project=$(shell_filter_strict $2)
+ shift 2
+ else
+ shift
+ fi
+ else
+ showhelp
+ exit
+ shift
+ fi
+ ;;
+ check)
+ report="no"
+ export action="checkhost"
+ if [ -n "$2" ] ; then
+ echo "$2" | egrep -q "^-.$"
+ if [ "$?" != "0" ] ; then
+ export project=$(shell_filter_strict $2)
+ export action="check"
+ shift 2
+ else
+ shift
+ fi
+ else
+ shift
+ fi
+ ;;
+ log)
+ report="no"
+ export action="log"
+ if [ -n "$2" ] ; then
+ echo "$2" | egrep -q "^-.$"
+ if [ "$?" != "0" ] ; then
+ export project=$(shell_filter_strict $2)
+ shift 2
+ else
+ shift
+ fi
+ else
+ shift
+ fi
+ ;;
+ info)
+ report="no"
+ export action="info"
+ if [ -n "$2" ] ; then
+ echo "$2" | egrep -q "^-.$"
+ if [ "$?" != "0" ] ; then
+ export project=$(shell_filter_strict $2)
+ shift 2
+ else
+ shift
+ fi
+ else
+ shift
+ fi
+ ;;
+ todo)
+ report="no"
+ export action="todo"
+ shift ;;
+ -i)
+ interactive="yes"
+ shift ;;
+ -f)
+ force="yes"
+ shift ;;
+ -t)
+ testmode="yes"
+ runcommand="cat"
+ shift ;;
+ -o)
+ options="$2"
+ shift 2;;
+ -d)
+ debug="$(shell_filter_strict $2)"
+ shift 2;;
+ -r)
+ report="$(shell_filter_strict $2)"
+ shift 2;;
+ -s)
+ show="$(shell_filter_strict $2)"
+ shift 2;;
+ -c)
+ counts="$(shell_filter_strict $2)"
+ shift 2;;
+ -g)
+ greppattern="$(shell_filter_strict $2)"
+ # greppattern="$(shell_filter $2)" # This allows partial regexp usage
+ # greppattern="$2" # This allows full regexp usage but is highly insecure if you sudo puppi
+ shift 2;;
+ *)
+ showhelp
+ exit
+ ;;
+ esac
+done
+
+# Action!
+case $action in
+ check) check ;;
+ checkhost) check_host ;;
+ log) create_runtime_conf ; log ;;
+ info) create_runtime_conf ; info ;;
+ todo) create_runtime_conf ; todo ;;
+ rollback) create_runtime_conf ; rollback ;;
+ deploy) create_runtime_conf ; deploy ;;
+ init) create_runtime_conf ; initialize ;;
+ configure) create_runtime_conf ; configure ;;
+esac