dhodovsk / source-git / pacemaker

Forked from source-git/pacemaker 3 years ago
Clone
Blob Blame History Raw
#!/bin/bash
#
# Copyright 2014-2015 the Pacemaker project contributors
#
# The version control history for this file may have further details.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.  Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
#######################################################################

port=""
action="list"		 # Default fence action

function usage()
{
cat <<EOF
`basename $0` - A fencing agent for docker containers for testing purposes
 
Usage: `basename $0` -o|--action [-n|--port] [options]
Options:
 -h, --help 		This text
 -V, --version		Version information
 
Commands:
 -o, --action		Action to perform: on|off|reboot|status|monitor
 -n, --port 		The name of a container to control/check

EOF
	exit 0;
}

function metadata()
{
cat <<EOF
<?xml version="1.0" ?>
<resource-agent name="fence_docker_cts" shortdesc="docker fencing agent for testing purposes" >
	<longdesc>
		fence_docker_cts fences docker containers for testing purposes.
	</longdesc>
	<parameters>
	<parameter name="action" unique="1" required="0">
		<getopt mixed="-o, --action=[action]" />
		<content type="string" default="reboot" />
		<shortdesc lang="en">Fencing Action</shortdesc>
	</parameter>
	<parameter name="port" unique="1" required="0">
		<getopt mixed="-n, --port=[port]" />
		<content type="string" />
		<shortdesc lang="en">The name/id of docker container to control/check</shortdesc>
	</parameter>
	</parameters>
	<actions>
	<action name="on" />
	<action name="off" />
	<action name="reboot" />
	<action name="status" />
	<action name="list" />
	<action name="monitor" />
	<action name="metadata" />
	</actions>
</resource-agent>
EOF
	exit 0;
}

function docker_log() {
	if ! [ "$action" = "list" ]; then
		printf "$*\n" 1>&2
	fi
}

# stdin option processing
if [ -z $1 ]; then
	# If there are no command line args, look for options from stdin
	while read line; do
		for word in $(echo "$line"); do
			case $word in 
			option=*|action=*) action=`echo $word | sed s/.*=//`;;
			port=*)			port=`echo $word | sed s/.*=//`;;
			node=*)			port=`echo $word | sed s/.*=//`;;
			nodename=*)			port=`echo $word | sed s/.*=//`;;
			--);;
			*) docker_log "Invalid command: $word";;
			esac
		done
	done
fi

# Command line option processing
while true ; do
	if [ -z "$1" ]; then
		break;
	fi
	case "$1" in
	-o|--action|--option) action=$2;	shift; shift;;
	-n|--port)			port=$2;	  shift; shift;;
	-V|--version) echo "1.0.0"; exit 0;;
	--help|-h) 
		usage;
		exit 0;;
	--) shift ; break ;;
	*) docker_log "Unknown option: $1. See --help for details."; exit 1;;
	esac
done

action=`echo $action | tr 'A-Z' 'a-z'`
case $action in
	hostlist|list) action=list;;
	stat|status)   action=status;;
	restart|reboot|reset)  action=reboot;;
	poweron|on)	action=start;;
	poweroff|off)  action=stop;;
esac

function fence_done() 
{
	if [ $1 -eq 0 ]; then
		docker_log "Operation $action (port=$port) passed"
	else
		docker_log "Operation $action (port=$port) failed: $1"
	fi
	if [ -z "$returnfile" ]; then
		rm -f $returnfile
	fi
	if [ -z "$helperscript" ]; then
		rm -f $helperscript
	fi
	exit $1
}

case $action in 
	metadata) metadata;;
esac

returnfile=$(mktemp /tmp/fence_docker_cts_returnfileXXXX)
returnstring=""
helper_script=$(mktemp /tmp/fence_docker_cts_helperXXXX)

exec_action()
{
	echo "#!/bin/bash" > $helper_script
	echo "sleep 10000" >> $helper_script
	chmod 755 $helper_script
	src="$(uname -n)"

	$helper_script "$src" "$action" "$returnfile" "$port" > /dev/null 2>&1 &
	pid=$!
	docker_log "waiting on pid $pid"
	wait $pid > /dev/null 2>&1
	returnstring=$(cat $returnfile)

	if [ -z "$returnstring" ]; then
		docker_log "fencing daemon did not respond"
		fence_done 1
	fi

	if [ "$returnstring" == "fail" ]; then
		docker_log "fencing daemon failed to execute action [$action on port $port]"
		fence_done 1
	fi

	return 0
}

exec_action
case $action in 
	list)
		cat $returnfile
		fence_done 0
		;;

	status)
		# 0 if container is on
		# 1 if container can not be contacted or unknown
		# 2 if container is off
		if [ "$returnstring" = "true" ]; then
			fence_done 0
		else 
			fence_done 2
		fi
		;;
	monitor|stop|start|reboot) : ;;
	*) docker_log "Unknown action: $action"; fence_done 1;;
esac

fence_done $?