#!/bin/sh
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:$PATH
SUCCESS=0
FAILURE=1
export COLUMNS=500
MON_AGENT_UPGRADE_DIR=$MON_AGENT_HOME/upgrade
MON_AGENT_VENV_DIR=$MON_AGENT_HOME/../venv
MON_AGENT_VENV_DIR_PYTHON=$MON_AGENT_VENV_DIR/bin/python
MON_AGENT_VENV_DIR_PIP=$MON_AGENT_VENV_DIR/bin/pip
MON_AGENT_UPGRADE_LIB_DIR=$MON_AGENT_UPGRADE_DIR/monagent/lib
MON_AGENT_UPGRADE_PY_REQ_FILE=$MON_AGENT_UPGRADE_DIR/monagent/conf/requirements.txt
MON_AGENT_BACKUP_DIR=$MON_AGENT_HOME/backup
MON_AGENT_BACKUP_LIB_DIR=$MON_AGENT_BACKUP_DIR/lib
MON_AGENT_BIN_DIR=$MON_AGENT_HOME/bin
MON_AGENT_CONF_DIR=$MON_AGENT_HOME/conf
MON_AGENT_SCRIPTS_DIR=$MON_AGENT_HOME/scripts
MON_AGENT_TEMP_DIR=$MON_AGENT_HOME/temp
MON_AGENT_UPGRADE_NOTIFIER=$MON_AGENT_TEMP_DIR/upgrade_notifier
MON_AGENT_LIB_DIR=$MON_AGENT_HOME/lib
MON_AGENT_BIN=$MON_AGENT_BIN_DIR/monagent
MON_AGENT_WATCHDOG_BIN=$MON_AGENT_BIN_DIR/monagentwatchdog
MON_AGENT_HYBRID_UPGRADE_BIN=$MON_AGENT_BIN_DIR/hybrid_upgrade
MON_AGENT_PYTHON_REQUIREMENTS_FILE=$MON_AGENT_CONF_DIR/requirements.txt
MON_AGENT_PROG_NAME=Site24x7Agent
MON_AGENT_WATCHDOG_PROG_NAME=MonitoringAgentWatchdog.py
chmod 755 $MON_AGENT_WATCHDOG_BIN
UPGRADE_LOG_FILE=$MON_AGENT_HOME/logs/upgrade.txt
THIRTY_TWO_BIT='32-bit'
SIXTY_FOUR_BIT='64-bit'
MSG="default value"
OS_BINARY_TYPE=""
NEW_MON_AGENT_PROFILE=$MON_AGENT_HOME/.new_profile
NEW_MON_AGENT_WATCHDOG_BIN_BOOT_FILE=$MON_AGENT_BIN_DIR/new_monagentwatchdog
MON_AGENT_WATCHDOG_BIN_BOOT_FILE=$MON_AGENT_BIN_DIR/monagentwatchdog
MON_AGENT_PROFILE=$MON_AGENT_HOME/.profile
MON_AGENT_LOG_DIR=$MON_AGENT_HOME/logs/details
MON_AGENT_WATCHDOG_SCRIPT_PID_FILE_NAME='monagent_watchdog_pid'
MON_AGENT_WATCHDOG_SCRIPT_PID_FILE=$MON_AGENT_LOG_DIR/$MON_AGENT_WATCHDOG_SCRIPT_PID_FILE_NAME

checkShellUtility(){
	if [ `command -v bash` ]; then
    		SHELL_UTILITY="bash"
   	 	printf "Detected shell ---> bash" >> $UPGRADE_LOG_FILE
    else
    		SHELL_UTILITY="sh"
    		printf "Detected shell ---> sh" >> $UPGRADE_LOG_FILE
    fi
}

check_agent_user(){
  USER_NAME="$(cat $MON_AGENT_TEMP_DIR/lockfile.txt)"
  if [[ "$USER_NAME" = *"root"* ]]; then
    printf "$(date) Agent User :: root | Changing nologin entry \n" >> $UPGRADE_LOG_FILE
    sed -i 's|/opt/site24x7/monagent:/bin/bash|/opt/site24x7/monagent:/sbin/nologin|' /etc/passwd &>/dev/null
    printf "$(date) nologin changed :: $(cat /etc/passwd | grep site24x7) \n" >> $UPGRADE_LOG_FILE
  elif [[ "$USER_NAME" = *"site24x7-agent"* ]]; then
    printf "$(date) Agent User :: site24x7-agent | skipping nologin entry \n" >> $UPGRADE_LOG_FILE
  else
    printf "$(date) Agent User :: $USER_NAME | skipping nologin entry \n" >> $UPGRADE_LOG_FILE
  fi
}

remove_old_src(){
	rm -rf $MON_AGENT_LIB_DIR/* 2>> $UPGRADE_LOG_FILE
}

copy_new_lib(){
		cp -rf $MON_AGENT_UPGRADE_LIB_DIR/* $MON_AGENT_LIB_DIR/ 2>> $UPGRADE_LOG_FILE
}

copy_backup_lib(){
		cp -rf $MON_AGENT_BACKUP_LIB_DIR/* $MON_AGENT_LIB_DIR/ 2>> $UPGRADE_LOG_FILE
}

copy_pymodules_requirements_file(){
	cp -f $MON_AGENT_UPGRADE_PY_REQ_FILE $MON_AGENT_PYTHON_REQUIREMENTS_FILE 2>> $UPGRADE_LOG_FILE
}

isWatchdogRunning(){
	PID=`cat $MON_AGENT_WATCHDOG_SCRIPT_PID_FILE 2>> $UPGRADE_LOG_FILE`
	if [ "$PID" = "" ]; then
		return $FAILURE
	else
	    process_running=`ps -p $PID 2>> $UPGRADE_LOG_FILE`
	    RETVAL=$?
	    if [ $RETVAL -ne $SUCCESS ]; then
           return $FAILURE
        else
           return $SUCCESS
       fi
    fi
}

updatePyModules(){
	$MON_AGENT_VENV_DIR_PIP install -r  $MON_AGENT_PYTHON_REQUIREMENTS_FILE >> $MON_AGENT_VENV_DIR/pip_out.txt 2>> $UPGRADE_LOG_FILE
}

startWatchdog(){
	$MON_AGENT_WATCHDOG_BIN start 2>&1 >> $UPGRADE_LOG_FILE
	sleep 2
	isWatchdogRunning
	RETVAL=$?
	if [ $RETVAL -eq $FAILURE ]; then
		MSG="FAILURE | Watchdog new upgrade failed"
		copy_backup_lib
		$MON_AGENT_WATCHDOG_BIN start 2>&1 >> $UPGRADE_LOG_FILE
		sleep 2
		isWatchdogRunning
		RETVAL=$?
		if [ $RETVAL -eq $FAILURE ]; then
			MSG="FAILURE | Watchdog backup not running and Watchdog new upgrade failed"
		else
			MSG="FAILURE | Watchdog backup running but Watchdog new upgrade failed"
		fi
	else
		MSG="SUCCESS | Watchdog new upgrade success"
	fi
}

change_watchdog_exec(){
	sed "s/MON_AGENT_WATCHDOG_PROG_NAME=.*/MON_AGENT_WATCHDOG_PROG_NAME=\"MonitoringAgentWatchdog.py\"/" $MON_AGENT_PROFILE > $NEW_MON_AGENT_PROFILE
	sed "s@MON_AGENT_WATCHDOG_EXEC_COMMAND=.*@MON_AGENT_WATCHDOG_EXEC_COMMAND=\"\$NOHUP_COMMAND $MON_AGENT_VENV_DIR_PYTHON \$MON_AGENT_LIB_DIR\/devops\/source\/python3.3\/src\/com\/manageengine\/monagent\/watchdog\/\$MON_AGENT_WATCHDOG_PROG_NAME >> \$MON_AGENT_WATCHDOG_ERR_FILE 2>\&1\"@" $MON_AGENT_WATCHDOG_BIN_BOOT_FILE > $NEW_MON_AGENT_WATCHDOG_BIN_BOOT_FILE
	mv $NEW_MON_AGENT_WATCHDOG_BIN_BOOT_FILE $MON_AGENT_WATCHDOG_BIN_BOOT_FILE 2>> $UPGRADE_LOG_FILE
	mv $NEW_MON_AGENT_PROFILE $MON_AGENT_PROFILE 2>> $UPGRADE_LOG_FILE
	chmod 755 $MON_AGENT_WATCHDOG_BIN_BOOT_FILE 2>> $UPGRADE_LOG_FILE
	chmod 755 $MON_AGENT_PROFILE 2>> $UPGRADE_LOG_FILE
}

bash_copy_new_bin(){
	cp -f $MON_AGENT_UPGRADE_DIR/monagent/bin/monagentwatchdog $MON_AGENT_WATCHDOG_BIN 2>> $UPGRADE_LOG_FILE
	cp -f $MON_AGENT_UPGRADE_DIR/monagent/bin/monagent $MON_AGENT_BIN 2>> $UPGRADE_LOG_FILE
	change_watchdog_exec
}

shell_copy_new_bin(){
	cp -f $MON_AGENT_UPGRADE_DIR/monagent/bin/shell_monagentwatchdog $MON_AGENT_WATCHDOG_BIN 2>> $UPGRADE_LOG_FILE
	change_watchdog_exec
}

copyHybridUpgrade(){
	cp -f $MON_AGENT_UPGRADE_DIR/monagent/bin/hybrid_upgrade $MON_AGENT_HYBRID_UPGRADE_BIN 2>> $UPGRADE_LOG_FILE
	chmod 755 $MON_AGENT_HYBRID_UPGRADE_BIN 2>> $UPGRADE_LOG_FILE
}

copyConfDirectory(){
	cp -f $MON_AGENT_UPGRADE_DIR/monagent/conf/*.zip $MON_AGENT_CONF_DIR 2>> $UPGRADE_LOG_FILE
	cp -f $MON_AGENT_UPGRADE_DIR/monagent/conf/*.xml $MON_AGENT_CONF_DIR 2>> $UPGRADE_LOG_FILE
	cp -f $MON_AGENT_UPGRADE_DIR/monagent/conf/*.json $MON_AGENT_CONF_DIR 2>> $UPGRADE_LOG_FILE
	cp -rf $MON_AGENT_UPGRADE_DIR/monagent/conf/apps $MON_AGENT_CONF_DIR 2>> $UPGRADE_LOG_FILE
}

copy_new_script(){
	cp -rf $MON_AGENT_UPGRADE_DIR/monagent/scripts $MON_AGENT_SCRIPTS_DIR 2>> $UPGRADE_LOG_FILE
}

notifySite24x7Agent(){
	printf "$(date) $MSG \n" >> $UPGRADE_LOG_FILE
	printf "$MSG" > $MON_AGENT_UPGRADE_NOTIFIER
}
printf "$(date) Upgrade started by daemon \n" >> $UPGRADE_LOG_FILE
checkShellUtility
check_agent_user
remove_old_src
copy_new_lib
copy_new_script
copy_pymodules_requirements_file
printf "\n [Before Upgrading Bin Executive files]\n------------------------------------------\n $(ls -lha $MON_AGENT_BIN_DIR) \n------------------------------------------\n" >> $UPGRADE_LOG_FILE
if [ "$SHELL_UTILITY" = "bash" ]; then
	printf "bash detected"
	bash_copy_new_bin
else
	printf "shell detected"
	shell_copy_new_bin
fi
printf "\n [After Upgrading Bin Executive files]\n------------------------------------------\n $(ls -lha $MON_AGENT_BIN_DIR) \n------------------------------------------\n" >> $UPGRADE_LOG_FILE
copyHybridUpgrade
copyConfDirectory
startWatchdog
updatePyModules
notifySite24x7Agent
