2016-09-07 12:14:41 +02:00
#!/bin/bash
# -------------------------------------------------------------------------- #
2020-04-30 15:00:02 +02:00
# Copyright 2002-2020, OpenNebula Project, OpenNebula Systems #
2016-09-07 12:14:41 +02:00
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
##############################################################################
# WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
#
# This script needs to be modified to enable fencing of the host. By default it
# will fail, as the first line is 'exit 1'. You will need to remove it.
#
# In order to perform the fencing, you will probably need to install a fencing
# utility. They are typically found in: fence-agents-all (CentOS) and fence-
# agents (Ubuntu). They come with many utilities: fence_ilo, fence_ipmilan,
# fence_apc, etc...
#
# To call the fencing utility, you will need to pass some parameters, which are
# typically the iLO IP of the host, etc. We recommend you enter this information
# in the host's template, and pick it up using the xpath example below. AS AN
# EXAMPLE (only an example) the script below expects that you have defined a
# parameter called FENCE_IP in the Host's template, and it will rely on that to
# call the fencing mechanism. You should customize this to your needs. It is
# perfectly OK to discard the code below and use a different mechanism, like
# storing the information required to perform the fencing in a separate CMDB,
# etc. However, you will probably need to get the host's NAME, which should be
# done as shown below.
#
# WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
#############################################################################
2020-09-23 11:57:25 +02:00
# Configuration attributes
SLEEP_TIME = "1"
RETRIES = "5"
USERNAME = ""
PASSWORD = ''
ACTION = "off"
2016-09-07 12:14:41 +02:00
# @param $1 the host information in base64
2020-09-23 11:57:25 +02:00
HOST_TEMPLATE = $( cat -)
2016-09-07 12:14:41 +02:00
# @return 0 on success. Make sure this script does not return 0 if it fails.
# To enable remove this line
2019-07-18 12:11:29 +02:00
echo "" Fence host not configured, please edit ft/fence_host.sh"" && exit 1
2016-09-07 12:14:41 +02:00
#-------------------------------------------------------------------------------
# Get host parameters with XPATH
#-------------------------------------------------------------------------------
if [ -z " $ONE_LOCATION " ] ; then
XPATH = /var/lib/one/remotes/datastore/xpath.rb
else
XPATH = $ONE_LOCATION /var/remotes/datastore/xpath.rb
fi
if [ ! -x " $XPATH " ] ; then
echo " XPATH not found: $XPATH "
exit 1
fi
2020-09-23 11:57:25 +02:00
XPATH = " ${ XPATH } -b ${ HOST_TEMPLATE } "
2016-09-07 12:14:41 +02:00
unset i j XPATH_ELEMENTS
while IFS = read -r -d '' element; do
XPATH_ELEMENTS[ i++] = " $element "
done < <( $XPATH /HOST/ID \
/HOST/NAME \
/HOST/TEMPLATE/FENCE_IP )
HOST_ID = " ${ XPATH_ELEMENTS [j++] } "
NAME = " ${ XPATH_ELEMENTS [j++] } "
FENCE_IP = " ${ XPATH_ELEMENTS [j++] } "
if [ -z " $FENCE_IP " ] ; then
echo "Fence ip not found"
exit 1
fi
#-------------------------------------------------------------------------------
# Fence
#-------------------------------------------------------------------------------
2020-09-23 11:57:25 +02:00
# Examples:
#
# Without retries
# fence_ilo -a $FENCE_IP -l <username> -p <password> && exit 0
#
# With retries
# while [ "$RETRIES" -gt 0 ]
# do
# fence_ilo5 -P --ip=$FENCE_IP --password="${PASSWORD}" --username="${USERNAME}" --action="${ACTION}" && exit 0
# RETRIES=$((RETRIES-1))
# sleep $SLEEP_TIME
# done
# Reaching this point means fencing failed
exit 1