/usr/lib/ocf/resource.d/heartbeat/SAPDatabase is in resource-agents 1:3.9.7-1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 | #!/bin/sh
#
# SAPDatabase
#
# Description: Manages any type of SAP supported database instance
# as a High-Availability OCF compliant resource.
#
# Author: Alexander Krauth, October 2006
# Support: linux@sap.com
# License: GNU General Public License (GPL)
# Copyright: (c) 2006, 2007, 2010, 2012 Alexander Krauth
#
# An example usage:
# See usage() function below for more details...
#
# OCF instance parameters:
# OCF_RESKEY_SID
# OCF_RESKEY_DIR_EXECUTABLE (optional, well known directories will be searched by default)
# OCF_RESKEY_DBTYPE (mandatory, one of the following values: ORA,ADA,DB6,SYB,HDB)
# OCF_RESKEY_DBINSTANCE (optional, Database instance name, if not equal to SID)
# OCF_RESKEY_STRICT_MONITORING (optional, activate application level monitoring - with Oracle a failover will occur in case of an archiver stuck)
# OCF_RESKEY_AUTOMATIC_RECOVER (optional, automatic startup recovery, default is false)
# OCF_RESKEY_MONITOR_SERVICES (optional, default is to monitor all database services)
# OCF_RESKEY_PRE_START_USEREXIT (optional, lists a script which can be executed before the resource is started)
# OCF_RESKEY_POST_START_USEREXIT (optional, lists a script which can be executed after the resource is started)
# OCF_RESKEY_PRE_STOP_USEREXIT (optional, lists a script which can be executed before the resource is stopped)
# OCF_RESKEY_POST_STOP_USEREXIT (optional, lists a script which can be executed after the resource is stopped)
# Deprecated parameters:
# OCF_RESKEY_NETSERVICENAME
# OCF_RESKEY_DBJ2EE_ONLY
# OCF_RESKEY_JAVA_HOME
# OCF_RESKEY_DIR_BOOTSTRAP
# OCF_RESKEY_DIR_SECSTORE
# OCF_RESKEY_DB_JARS
#
#######################################################################
# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
#######################################################################
SH=/bin/sh
usage() {
methods=`sapdatabase_methods`
methods=`echo $methods | tr ' ' '|'`
cat <<-!
usage: $0 ($methods)
$0 manages a SAP database of any type as an HA resource.
Currently Oracle, MaxDB, DB/2 UDB, Sybase ASE and SAP HANA Database are supported.
ABAP databases as well as JAVA only databases are supported.
The 'start' operation starts the instance.
The 'stop' operation stops the instance.
The 'status' operation reports whether the instance is running
The 'monitor' operation reports whether the instance seems to be working
The 'recover' operation tries to recover the instance after a crash (instance will be stopped first!)
The 'validate-all' operation reports whether the parameters are valid
The 'methods' operation reports on the methods $0 supports
!
}
meta_data() {
cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="SAPDatabase">
<version>2.06</version>
<shortdesc lang="en">Manages a SAP database instance as an HA resource.</shortdesc>
<longdesc lang="en">
Resource script for SAP databases. It manages a SAP database of any type as an HA resource.
The purpose of the resource agent is to start, stop and monitor the database instance of a SAP system. Together with the RDBMS system it will also control the related network service for the database. Like the Oracle Listener and the xserver of MaxDB.
The resource agent expects a standard SAP installation of the database and therefore needs less parameters to configure.
The resource agent supports the following databases:
- Oracle 10.2, 11.2 and 12
- DB/2 UDB for Windows and Unix 9.x
- SAP-DB / MaxDB 7.x
- Sybase ASE 15.7
- SAP HANA Database since 1.00 - with SAP node 1625203 (http://sdn.sap.com)
In fact this resource agent does not run any database commands directly. It uses the SAP standard process SAPHostAgent to control the database.
The SAPHostAgent must be installed on each cluster node locally. It will not work, if you try to run the SAPHostAgent also as a HA resource.
Please follow SAP note 1031096 for the installation of SAPHostAgent.
The required minimum version of SAPHostAgent is:
Release: 7.20
Patch Number: 90
or compile time after: Dec 17 2011
</longdesc>
<parameters>
<parameter name="SID" unique="1" required="1">
<longdesc lang="en">The unique database system identifier. e.g. P01</longdesc>
<shortdesc lang="en">Database system ID</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="DIR_EXECUTABLE" unique="0" required="0">
<longdesc lang="en">The full qualified path where to find saphostexec and saphostctrl.
Usually you can leave this empty. Then the default: /usr/sap/hostctrl/exe is used.
</longdesc>
<shortdesc lang="en">path of saphostexec and saphostctrl</shortdesc>
<content type="string" default="/usr/sap/hostctrl/exe" />
</parameter>
<parameter name="DBTYPE" unique="0" required="1">
<longdesc lang="en">The name of the database vendor you use. Set either: ADA, DB6, ORA, SYB, HDB</longdesc>
<shortdesc lang="en">database vendor</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="DBINSTANCE" unique="1" required="0">
<longdesc lang="en">Must be used for special database implementations, when database instance name is not equal to the SID (e.g. Oracle DataGuard)</longdesc>
<shortdesc lang="en">Database instance name, if not equal to SID</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="NETSERVICENAME" unique="0" required="0">
<longdesc lang="en">Deprecated - do not use anymore. This parameter will be deleted in one of the next releases.</longdesc>
<shortdesc lang="en">deprecated - do not use anymore</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="DBJ2EE_ONLY" unique="0" required="0">
<longdesc lang="en">Deprecated - do not use anymore. This parameter will be deleted in one of the next releases.</longdesc>
<shortdesc lang="en">deprecated - do not use anymore</shortdesc>
<content type="boolean" default=""/>
</parameter>
<parameter name="JAVA_HOME" unique="0" required="0">
<longdesc lang="en">Deprecated - do not use anymore. This parameter will be deleted in one of the next releases.</longdesc>
<shortdesc lang="en">deprecated - do not use anymore</shortdesc>
<content type="string" default=""/>
</parameter>
<parameter name="STRICT_MONITORING" unique="0" required="0">
<longdesc lang="en">This controls how the resource agent monitors the database. If set to true, it will use 'saphostctrl -function GetDatabaseStatus' to test the database state. If set to false, only operating system processes are monitored.</longdesc>
<shortdesc lang="en">Activates application level monitoring</shortdesc>
<content type="boolean" default="false"/>
</parameter>
<parameter name="AUTOMATIC_RECOVER" unique="0" required="0">
<longdesc lang="en">If you set this to true, 'saphostctrl -function StartDatabase' will always be called with the '-force' option.</longdesc>
<shortdesc lang="en">Enable or disable automatic startup recovery</shortdesc>
<content type="boolean" default="false"/>
</parameter>
<parameter name="MONITOR_SERVICES" unique="0" required="0">
<longdesc lang="en">Defines which services are monitored by the SAPDatabase resource agent, if STRICT_MONITORING is set to true. Service names must correspond with the output of the 'saphostctrl -function GetDatabaseStatus' command.</longdesc>
<shortdesc lang="en">Database services to monitor</shortdesc>
<content type="string" default="Instance|Database|Listener"/>
</parameter>
<parameter name="DIR_BOOTSTRAP" unique="0" required="0">
<longdesc lang="en">Deprecated - do not use anymore. This parameter will be deleted in one of the next releases.</longdesc>
<shortdesc lang="en">deprecated - do not use anymore</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="DIR_SECSTORE" unique="0" required="0">
<longdesc lang="en">Deprecated - do not use anymore. This parameter will be deleted in one of the next releases.</longdesc>
<shortdesc lang="en">deprecated - do not use anymore</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="DB_JARS" unique="0" required="0">
<longdesc lang="en">Deprecated - do not use anymore. This parameter will be deleted in one of the next releases.</longdesc>
<shortdesc lang="en">deprecated - do not use anymore</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="PRE_START_USEREXIT" unique="0" required="0">
<longdesc lang="en">The full qualified path where to find a script or program which should be executed before this resource gets started.</longdesc>
<shortdesc lang="en">path to a pre-start script</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="POST_START_USEREXIT" unique="0" required="0">
<longdesc lang="en">The full qualified path where to find a script or program which should be executed after this resource got started.</longdesc>
<shortdesc lang="en">path to a post-start script</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="PRE_STOP_USEREXIT" unique="0" required="0">
<longdesc lang="en">The full qualified path where to find a script or program which should be executed before this resource gets stopped.</longdesc>
<shortdesc lang="en">path to a pre-start script</shortdesc>
<content type="string" default="" />
</parameter>
<parameter name="POST_STOP_USEREXIT" unique="0" required="0">
<longdesc lang="en">The full qualified path where to find a script or program which should be executed after this resource got stopped.</longdesc>
<shortdesc lang="en">path to a post-start script</shortdesc>
<content type="string" default="" />
</parameter>
</parameters>
<actions>
<action name="start" timeout="1800" />
<action name="stop" timeout="1800" />
<action name="status" timeout="60" />
<action name="monitor" depth="0" timeout="60" interval="120" />
<action name="validate-all" timeout="5" />
<action name="meta-data" timeout="5" />
<action name="methods" timeout="5" />
</actions>
</resource-agent>
END
}
#
# methods: What methods/operations do we support?
#
sapdatabase_methods() {
cat <<-!
start
stop
status
monitor
recover
validate-all
methods
meta-data
usage
!
}
#
# sapuserexit : Many SAP customers need some additional processes/tools to run their SAP systems.
# This specialties do not allow a totally generic SAP cluster resource agent.
# Someone should write a resource agent for each additional process you need, if it
# is required to monitor that process within the cluster manager. To enable
# you to extent this resource agent without developing a new one, this user exit
# was introduced.
#
sapuserexit() {
NAME="$1"
VALUE="$2"
if [ -n "$VALUE" ]
then
if have_binary "$VALUE"
then
ocf_log info "Calling userexit ${NAME} with customer script file ${VALUE}"
"$VALUE" >/dev/null 2>&1
ocf_log info "Exiting userexit ${NAME} with customer script file ${VALUE}, returncode: $?"
else
ocf_log warn "Attribute ${NAME} is set to ${VALUE}, but this file is not executable"
fi
fi
return $OCF_SUCCESS
}
#
# saphostctrl_installed
#
saphostctrl_installed() {
OCF_RESKEY_DIR_EXECUTABLE_default="/usr/sap/hostctrl/exe"
: ${OCF_RESKEY_DIR_EXECUTABLE=${OCF_RESKEY_DIR_EXECUTABLE_default}}
SAPHOSTCTRL="${OCF_RESKEY_DIR_EXECUTABLE}/saphostctrl"
SAPHOSTEXEC="${OCF_RESKEY_DIR_EXECUTABLE}/saphostexec"
SAPHOSTSRV="${OCF_RESKEY_DIR_EXECUTABLE}/sapstartsrv"
SAPHOSTOSCOL="${OCF_RESKEY_DIR_EXECUTABLE}/saposcol"
have_binary $SAPHOSTCTRL && have_binary $SAPHOSTEXEC
}
#
# 'main' starts here...
#
if
( [ $# -ne 1 ] )
then
usage
exit $OCF_ERR_ARGS
fi
# These operations don't require OCF instance parameters to be set
case "$1" in
meta-data) meta_data
exit $OCF_SUCCESS;;
usage) usage
exit $OCF_SUCCESS;;
methods) sapdatabase_methods
exit $?;;
*);;
esac
if ! ocf_is_root
then
ocf_log err "$0 must be run as root"
exit $OCF_ERR_PERM
fi
# mandatory parameter check
if [ -z "$OCF_RESKEY_SID" ]; then
ocf_log err "Please set OCF_RESKEY_SID to the SAP system id!"
exit $OCF_ERR_ARGS
fi
SID=`echo "$OCF_RESKEY_SID"`
if [ -z "$OCF_RESKEY_DBTYPE" ]; then
ocf_log err "Please set OCF_RESKEY_DBTYPE to the database vendor specific tag (ADA,DB6,ORA,SYB,HDB)!"
exit $OCF_ERR_ARGS
fi
DBTYPE=`echo "$OCF_RESKEY_DBTYPE" | tr '[:lower:]' '[:upper:]'`
# source functions and initialize global variables
if saphostctrl_installed; then
. ${OCF_FUNCTIONS_DIR}/sapdb.sh
else
. ${OCF_FUNCTIONS_DIR}/sapdb-nosha.sh
fi
sapdatabase_init
# we always want to fall to the faster status method in case of a probe by the cluster
ACTION=$1
if ocf_is_probe
then
ACTION=status
fi
# What kind of method was invoked?
case "$ACTION" in
start|stop|status|recover) sapdatabase_$ACTION
exit $?;;
monitor) sapdatabase_monitor $OCF_RESKEY_STRICT_MONITORING
exit $?;;
validate-all) sapdatabase_validate
exit $?;;
*) sapdatabase_methods
exit $OCF_ERR_UNIMPLEMENTED;;
esac
|