#!/bin/bash
# Copyright 2012 Severalnines AB
#
# MODIFY THE BELOW TO SUIT YOU ENV:
joiner=$1
wsrep_cluster_address=$2
jobid=$3



LOCKFILE="/tmp/s9s_galera_$joiner.lock"

if [ ! -e /etc/cmon.cnf ] ; then
    echo "Could not find /etc/cmon.cnf"
    exit 1
    else
    source /etc/cmon.cnf
fi
CID=$cluster_id
CMON_USER=cmon
CMON_PASSWORD=$mysql_password
CMON_DB_HOST=$mysql_hostname
CMON_DB_DB=cmon
MYSQL_BASEDIR=$mysql_basedir
MYSQL_BIN=$mysql_basedir/bin/mysql
MYCNF="/etc/my.cnf"





function log_job_message
{    
    MSG=$1
    EXIT_CODE=$2
    QUERY="INSERT INTO cmon_job_message(cid, jobid,message,exit_code,report_ts) VALUES($CID,$jobid,'$MSG',$EXIT_CODE,now())"
    if [ $jobid -ne 0 ]; then 
	$MYSQL_BIN  -B -N  --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT  -e "$QUERY" 2>&1 >$HOME/s9s_galera_err.log
    fi
}

function log_job
{    
    STATUS=$1
    STATUS_TXT=$2
    EXIT_CODE=$3
    QUERY="UPDATE cmon_job SET status='$STATUS', status_txt='$STATUS_TXT', exit_code=$EXIT_CODE, report_ts=NOW()  WHERE cid=$CID AND jobid=$jobid"
    if [ $jobid -ne 0 ]; then 
	$MYSQL_BIN  -B -N  --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT  -e "$QUERY" 2>&1  >$HOME/s9s_galera_err.log
    fi
}

function write_logfile
{
   LOGFILE=$1
   cat $LOGFILE | sed  -e "s/'/\\\'/g" -e 's/"/\\"/g' > /tmp/s9s_galera_log_escaped
   LOG_CONTENT=`cat /tmp/s9s_backup_log_escaped`
   SIZE=`stat --printf='%s' /tmp/s9s_backup_log_escaped`
   HNAME=`$MYSQL_BIN -N -B -A --user=$CMON_USER --password=$CMON_PASSWORD  --host=127.0.0.1 --port=$CMON_DB_PORT -e "SHOW GLOBAL VARIABLES LIKE 'hostname'" | awk '{print $2;}'`
   QUERY="REPLACE INTO cmon_host_log(cid, hostname, filename, result_len, result, report_ts,description, tag) VALUES
($CID,'$HNAME', '$BACKUP_LOGFILE', $SIZE, \"$LOG_CONTENT\", NOW(), 's9s_rebuild_slave log', 's9s_rebuild_slave')"
   $MYSQL_BIN  -B -N  --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT  -e "$QUERY" 2>&1  >$HOME/s9s_galera_err.log
   rm -rf /tmp/s9s_galera_log_escaped
}

if [ "$joiner" = "" ]; then
    log_job_message "joiner not set" 1
    log_job 'FAILED' 'recover galera node failed' 1
    exit 1
fi
if [ ! -e $LOCKFILE ]; then    
    trap "rm -f $LOCKFILE; exit" INT TERM EXIT
    touch $LOCKFILE
    log_job 'RUNNING' 'The job is running' 0
        
    SUDO=""
    CONFIGDIR=`$MYSQL_BIN -N -B -A --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT -e "select value from cmon_configuration where param='CONFIGDIR' AND cid=$CID"`    
    SSH_USER=`$MYSQL_BIN -N -B -A --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT -e "select value from cmon_configuration where param='SSH_USER' AND cid=$CID"`    
    SSH_PORT=`$MYSQL_BIN -N -B -A --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT -e "select value from cmon_configuration where param='SSH_PORT' AND cid=$CID"`    
    SSH_IDENTITY=`$MYSQL_BIN -N -B -A --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT -e "select value from cmon_configuration where param='SSH_IDENTITY' AND cid=$CID"`    
    OS_USER_HOME=`$MYSQL_BIN -N -B -A --user=$CMON_USER --password=$CMON_PASSWORD --database=$CMON_DB_DB --host=$CMON_DB_HOST --port=$CMON_DB_PORT -e "select value from cmon_configuration where param='OS_USER_HOME' AND cid=$CID"`    

    if [ "$SSH_USER" = "" ]; then
	log_job_message "SSH_USER is not set" 1
	log_job 'FAILED' 'Job failed' 1
	exit 1
    fi

    if [ "$SSH_PORT" = "" ]; then
	log_job_message "SSH_PORT is not set" 1
	log_job 'FAILED' 'Job failed' 1
	exit 1
    fi

    if [ "$OS_USER_HOME" = "" ]; then
	log_job_message "OS_USER_HOME is not set" 1
	log_job 'FAILED' 'Job failed' 1
	exit 1
    fi


    if [ "$CONFIGDIR" = "" ]; then
	log_job_message "CONFIGDIR is not set" 1
	log_job 'FAILED' 'Job failed' 1
	exit 1
    fi


    if [ "$SSH_IDENTITY" != "" ]; then
	SSH_IDENTITY="-oIdentityFile=${SSH_IDENTITY}"
    else
	
	SSH_IDENTITY="-oIdentityFile=$OS_USER_HOME/.ssh/id_rsa"
    fi

    
    SSH_OPTS="-q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -oNumberOfPasswordPrompts=0 -oConnectTimeout=10 $SSH_IDENTITY"
    
    if [ "$SSH_USER" != "root" ]; then
	SUDO="sudo -s"
	SSH_OPTS=" -t $SSH_OPTS"
    fi

    MYCNF=${CONFIGDIR}/my.cnf   
   

    START_MYSQLD="$SUDO $MYSQL_BASEDIR/bin/mysqld_safe --defaults-file=$MYCNF $wsrep_cluster_address >/dev/null 2>&1 &"
    log_job_message "Starting s9s_galera_recovery: $START_MYSQLD " 0
    ssh $SSH_OPTS -p${SSH_PORT}  $SSH_USER@$joiner "killall -9 mysqld mysqld_safe rsync >/dev/null 2>&1"
    ssh $SSH_OPTS -p${SSH_PORT}  $SSH_USER@$joiner "$START_MYSQLD"
    if [ $? -ne 0 ]; then
	log_job_message "Failed: ssh $SSH_OPTS -p${SSH_PORT}  $SSH_USER@$joiner \"$START_MYSQLD\"" 1
	log_job 'FAILED' 'Job failed' 1
	rm $LOCKFILE
	trap - INT TERM EXIT
	exit 1
    fi
   
    rm $LOCKFILE
    trap - INT TERM EXIT
    exit 0
fi
log_job 'FAILED' 's9s_galera_recovery - lockfile exists' 1
log_job_message "remove $LOCKFILE on $CMON_DB_HOST" 1
exit 1