summaryrefslogtreecommitdiffstats
path: root/heartbeat/oraasm
blob: 34c8df0b112d44532075ea28ea3bc5c9e352e51c (plain)
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
#!/bin/sh
#
#  License:      GNU General Public License (GPL)
#  (c) 2017 O. Albrigtsen
#           and Linux-HA contributors
#
# -----------------------------------------------------------------------------
#      O C F    R E S O U R C E    S C R I P T   S P E C I F I C A T I O N
# -----------------------------------------------------------------------------
#
# NAME
#       oraasm : OCF resource agent script for Oracle ASM
#

# Initialization:
: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs

# Defaults
OCF_RESKEY_user_default="grid"
OCF_RESKEY_diskgroup_default=""
OCF_RESKEY_home_default=""

: ${OCF_RESKEY_user=${OCF_RESKEY_user_default}}
: ${OCF_RESKEY_diskgroup=${OCF_RESKEY_diskgroup_default}}
: ${OCF_RESKEY_home=${OCF_RESKEY_home_default}}


oraasm_usage() {
	cat <<END
    usage: $0 (start|stop|validate-all|meta-data|help|usage|monitor)
    $0 manages a Oracle ASM Disk Group as an OCF HA resource.
    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 'validate-all' operation reports whether the parameters are valid
END
}

oraasm_meta_data() {
	cat <<END
<?xml version="1.0"?>
<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
<resource-agent name="oraasm" version="0.75">
<version>1.0</version>

<longdesc lang="en">OCF Resource script for Oracle ASM. It uses the ohasd init-script to manage a Oracle ASM Disk Group as a HA resource.</longdesc>
<shortdesc lang="en">Oracle ASM resource agent</shortdesc>

<parameters>

<parameter name="user">
    <longdesc lang="en">Oracle Grid user</longdesc>
    <shortdesc lang="en">Oracle Grid user</shortdesc>
    <content type="string" default="${OCF_RESKEY_user_default}" />
</parameter>

<parameter name="diskgroup" required="1">
    <longdesc lang="en">
The name of the Oracle Disk Group.
If not specified, then the Disk Group along with its home should be listed in /etc/oratab.
    </longdesc>
    <shortdesc lang="en">Oracle Disk Group</shortdesc>
    <content type="string" default="${OCF_RESKEY_diskgroup_default}" />
</parameter>

<parameter name="home" unique="0">
<longdesc lang="en">The Oracle Grid home directory</longdesc>
<shortdesc lang="en">home</shortdesc>
<content type="string" default="${OCF_RESKEY_home_default}" />
</parameter>

</parameters>

<actions>
<action name="start" timeout="60s" />
<action name="stop" timeout="60s" />
<action name="status" timeout="30s" />
<action name="monitor" depth="0" timeout="30s" interval="10s" />
<action name="validate-all" timeout="5s" />
<action name="meta-data" timeout="5s" />
</actions>
</resource-agent>
END
}

oraasm_methods() {
	cat <<-!
	start
	stop
	status
	monitor
	validate-all
	methods
	meta-data
	usage
	!
}

oraasm_getconfig() {
	[ x = "x$OCF_RESKEY_home" ] &&
		OCF_RESKEY_home=`awk -F: "/^+$OCF_RESKEY_diskgroup:/"'{print $2}' /etc/oratab`
	PATH="$OCF_RESKEY_home/bin:$PATH"

	ORA_ENVF=`mktemp`
	cat << EOF > $ORA_ENVF
PATH="$OCF_RESKEY_home/bin:$PATH"
EOF
	chmod 644 $ORA_ENVF
	trap "rm -f $ORA_ENVF" EXIT
}

oraasm_start() {
	# if resource is already running, no need to continue code after this.
	if oraasm_monitor; then
		ocf_log info "Oracle ASM is already running"
		return $OCF_SUCCESS
	fi

	ocf_run -q /etc/init.d/ohasd start

	while ! oraasm_monitor; do
		sleep 1
	done

	return $OCF_SUCCESS
}

oraasm_stop() {
	oraasm_monitor
	if [ $? -ne $OCF_SUCCESS ]; then
		# Currently not running. Nothing to do.
		ocf_log info "Oracle ASM is already stopped"

		return $OCF_SUCCESS
	fi

	ocf_run -q /etc/init.d/ohasd stop

	# Wait for process to stop
	while oraasm_monitor; do
		sleep 1
	done

	return $OCF_SUCCESS
}

oraasm_monitor() {
	su - $OCF_RESKEY_user -c ". $ORA_ENVF; crsctl check has | grep -q \"CRS-4638\""
	case "$?" in
		0)
			rc=$OCF_SUCCESS
			;;
		1)
			rc=$OCF_NOT_RUNNING
			ocf_log info "Oracle ASM is not running"
			;;
		*)
			rc=$OCF_ERR_GENERIC
			;;
	esac
	return $rc
}

oraasm_status() {
	rc=$(oraasm_monitor)
	return $rc
}

oraasm_validate_all() {
	if [ x = "x$OCF_RESKEY_home" ]; then
		ocf_exit_reason "home not set"
		return $OCF_ERR_CONFIGURED
	fi
}


OCF_REQUIRED_PARAMS="user diskgroup"
OCF_REQUIRED_BINARIES="/etc/init.d/ohasd crsctl"
ocf_rarun $*

# vim:tabstop=4:shiftwidth=4:textwidth=0:wrapmargin=0