dev/provisioning/modules/puppi/templates/puppi.erb
changeset 28 b0b56e0f8c7f
--- /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