New functions.ksh
1 #
2 # CDDL HEADER START
3 #
4 # The contents of this file are subject to the terms of the
5 # Common Development and Distribution License (the License).
6 # You may not use this file except in compliance with the License.
7 #
8 # You can obtain a copy of the license at usr/src/CDDL.txt
9 # or http://www.opensolaris.org/os/licensing.
10 # See the License for the specific language governing permissions
11 # and limitations under the License.
12 #
13 # When distributing Covered Code, include this CDDL HEADER in each
14 # file and include the License file at usr/src/CDDL.txt.
15 # If applicable, add the following below this CDDL HEADER, with the
16 # fields enclosed by brackets [] replaced with your own identifying
17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 #
19 # CDDL HEADER END
20 #
21 # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
22 # Use is subject to license terms.
23 #
24 #ident "%Z%%M% %I% %E% SMI"
25 #
26
27 PKG=SUNWscids
28 LOGFILE=/var/tmp/${RESOURCE}_logfile
29 TASK_COMMAND=""
30 RESOURCE_PROJECT_NAME=""
31 SCLOGGER=/usr/cluster/lib/sc/scds_syslog
32 LOGGER=/usr/bin/logger
33
34 syslog_tag()
35 {
36 ${SET_DEBUG}
37 print "SC[${PKG:-??}.${COMPONENT:-??}.${METHOD:-??}]:${RESOURCEGROUP:-??}:${RESOURCE:-??}"
38 }
39
40 scds_syslog()
41 {
42 if [ -f "${SCLOGGER}" ]
43 then
44 ${SCLOGGER} "$@" &
45 else
46 while getopts 'p:t:m' opt
47 do
48 case "${opt}" in
49 t) TAG=${OPTARG};;
50 p) PRI=${OPTARG};;
51 esac
52 done
53
54 shift $((${OPTIND} - 1))
55 LOG_STRING=`/usr/bin/printf "$@"`
56 ${LOGGER} -p ${PRI} -t ${TAG} ${LOG_STRING}
57 fi
58 }
59
60 debug_message()
61 {
62 if [ "${DEBUG}" = "${RESOURCE}" -o "${DEBUG}" = "ALL" ]
63 then
64 SET_DEBUG="set -x"
65 DEBUG_TEXT=${1}
66
67 scds_syslog -p daemon.debug -t $(syslog_tag) -m \
68 "%s" "${DEBUG_TEXT}"
69 else
70 SET_DEBUG=
71 fi
72 }
73
74 log_message()
75 {
76 debug_message "Function: log_message - Begin"
77 {SET_DEBUG}
78
79 if [ -s "${LOGFILE}" ]
80 then
81 PRIORITY=$1
82 HEADER=$2
83
84 strings ${LOGFILE} > ${LOGFILE}.copy
85
86 while read MSG_TXT
87 do
88 scds_syslog -p daemon.${PRIORITY} -t $(syslog_tag) -m \
89 "%s - %s" \
90 "${HEADER}" "${MSG_TXT}"
91 done < ${LOGFILE}.copy
92
93 cat /dev/null > ${LOGFILE}
94 fi
95
96 debug_message "Function: log_message - End"
97 }
98
99 set_redirection()
100 {
101 debug_message "Function: set_redirection - Begin"
102 ${SET_DEBUG}
103
104 if /usr/bin/getent passwd ${USERID} | /usr/bin/awk -F: '{print $7}' | /usr/bin/grep csh > /dev/null
105 then
106 OUTPUT=">& ${LOGFILE}"
107 else
108 OUTPUT="> ${LOGFILE} 2>&1"
109 fi
110
111 debug_message "Function: set_redirection - End"
112 }
113
114 validate()
115 {
116 debug_message "Function: validate - Begin"
117 ${SET_DEBUG}
118
119 rc=0
120
121 # Note that group/user informix is an IDS requirement. Refer to
122 # http://publib.boulder.ibm.com/infocenter/idshelp/v111/index.jsp?topic
123 # and in particular Installing IDS.
124
125 if /usr/bin/getent passwd informix > /dev/null
126 then
127 debug_message "Validate - User informix exists"
128 else
129 # SCMSGS
130 # @explanation
131 # The userid informix does not exist.
132 # @user_action
133 # You must create the userid informix.
134 scds_syslog -p daemon.error -t $(syslog_tag) -m \
135 "Validate - User informix does not exist"
136 rc=1
137 fi
138
139 if /usr/bin/getent group informix > /dev/null
140 then
141 debug_message "Validate - Group informix exists"
142 else
143 # SCMSGS
144 # @explanation
145 # The group informix does not exist.
146 # @user_action
147 # You must create the group informix.
148 scds_syslog -p daemon.error -t $(syslog_tag) -m \
149 "Validate - Group informix does not exist"
150 rc=1
151 fi
152
153 if [ "${USERID}" = "informix" ]
154 then
155 debug_message "Validate - Userid is informix"
156 else
157 pgroup=`/usr/bin/getent passwd ${USERID} | /usr/bin/awk -F: '{print $4}'`
158
159 if [ -n "${pgroup}" ]
160 then
161 if /usr/bin/getent group ${pgroup} | /usr/bin/awk -F: '{ if ($1 == "informix") print $3}' | \
162 /usr/bin/grep "^${pgroup}$" > /dev/null
163 then
164 debug_message "Validate - Primary group for userid ${USERID} is informix"
165 else
166 if /usr/bin/getent group informix | /usr/bin/awk -F: '{print $4}' | \
167 /usr/bin/grep ${USERID} > /dev/null
168 then
169 debug_message "Validate - Secondary group for userid ${USERID} is informix"
170 else
171 # SCMSGS
172 # @explanation
173 # The user is not a member of the group informix.
174 # @user_action
175 # Ensure the user is a member of the group informix.
176 scds_syslog -p daemon.error -t $(syslog_tag) -m \
177 "Validate - Userid %s is not a member of group informix" \
178 "${USERID}"
179 rc=1
180 fi
181 fi
182 else
183 # SCMSGS
184 # @explanation
185 # The user is not a valid userid.
186 # @user_action
187 # Ensure the user name is correct.
188 scds_syslog -p daemon.error -t $(syslog_tag) -m \
189 "Validate - User %s is not a valid userid" \
190 "${USERID}"
191 rc=1
192 fi
193 fi
194
195 if [ -d "${INFORMIXDIR}" ]
196 then
197 debug_message "Validate - ${INFORMIXDIR} exists"
198
199 if [ -x "${INFORMIXDIR}/bin/oninit" ]
200 then
201 debug_message "Validate - ${INFORMIXDIR}/bin/oninit exists and is executable"
202 else
203 # SCMSGS
204 # @explanation
205 # oninit was not found in ${INFORMIXDIR}/bin.
206 # @user_action
207 # Ensure that ${INFORMIXDIR} is the directory path
208 # where the Informix files are installed.
209 scds_syslog -p daemon.error -t $(syslog_tag) -m \
210 "Validate - %s/bin/oninit does not exist" \
211 "${INFORMIXDIR}"
212 rc=1
213 fi
214 else
215 # SCMSGS
216 # @explanation
217 # ${INFORMIXDIR} does not exist or is not a directory.
218 # @user_action
219 # Ensure that ${INFORMIXDIR} is the directory path
220 # where the Informix files are installed.
221 scds_syslog -p daemon.error -t $(syslog_tag) -m \
222 "Validate - %s does not exist or is not a directory" \
223 "${INFORMIXDIR}"
224 rc=1
225 fi
226
227 # Here, we check that the ${ONCONFIG} file contains
228 # the ROOTNAME variable, below is snipped sample
229 # ${ONCONFIG} file containing ROOTNAME.
230 #
231 # ROOTNAME rootdbs # Root dbspace name
232
233 if [ -f "${INFORMIXDIR}/etc/${ONCONFIG}" ]
234 then
235 debug_message "Validate - ${INFORMIXDIR}/etc/${ONCONFIG} exists"
236
237 if /usr/xpg4/bin/grep -qw ROOTNAME ${INFORMIXDIR}/etc/${ONCONFIG}
238 then
239 debug_message "Validate - ROOTNAME found in ${INFORMIXDIR}/etc/${ONCONFIG}"
240 else
241 # SCMSGS
242 # @explanation
243 # ${INFORMIXDIR}/bin/${ONCONFIG} is not a valid onconfig file.
244 # @user_action
245 # Ensure that ${INFORMIXDIR}/etc/${ONCONFIG} is a valid onconfig file.
246 scds_syslog -p daemon.error -t $(syslog_tag) -m \
247 "Validate - %s/bin/%s is not a valid onconfig file" \
248 "${INFORMIXDIR}" "${ONCONFIG}"
249 rc=1
250 fi
251
252 # Here, we check that the ${ONCONFIG} file contains
253 # the ${INFORMIXSERVER} name, below is snipped sample
254 # ${ONCONFIG} file containing ${INFORMIXSERVER}.
255 #
256 # DBSERVERNAME demo_on
257 #
258 # Note that ${INFORMIXSERVER} is represented by "demo_on".
259
260 if /usr/xpg4/bin/grep -qw ${INFORMIXSERVER} ${INFORMIXDIR}/etc/${ONCONFIG}
261 then
262 debug_message "Validate - ${INFORMIXSERVER} found in ${INFORMIXDIR}/etc/${ONCONFIG}"
263 else
264 # SCMSGS
265 # @explanation
266 # ${INFORMIXDIR}/etc/${ONCONFIG} does not contain ${INFORMIXSERVER}.
267 # @user_action
268 # Ensure that ${INFORMIXDIR}/etc/${ONCONFIG} contains ${INFORMIXSERVER}.
269 scds_syslog -p daemon.error -t $(syslog_tag) -m \
270 "Validate - %s/etc/%s does not contain %s" \
271 "${INFORMIXDIR}" "${ONCONFIG}" "${INFORMIXSERVER}"
272 rc=1
273 fi
274 else
275 # SCMSGS
276 # @explanation
277 # ${INFORMIXDIR}/etc/${ONCONFIG} does not exist.
278 # @user_action
279 # Ensure that ${INFORMIXDIR}/etc/${ONCONFIG} exists.
280 scds_syslog -p daemon.error -t $(syslog_tag) -m \
281 "Validate - %s/etc/%s does not exist" \
282 "${INFORMIXDIR}" "${ONCONFIG}"
283 rc=1
284 fi
285
286 # Here, we check that the ${INFORMIXSQLHOSTS} file contains
287 # the ${INFORMIXSERVER} name, below is snipped sample
288 # ${INFORMIXSQLHOSTS} file containing ${INFORMIXSERVER}.
289 #
290 # demo_on ontlitcp lzmutt1a 9088
291 #
292 # Note that ${INFORMIXSERVER} is represented by "demo_on".
293
294 if [ -f "${INFORMIXSQLHOSTS}" ]
295 then
296 debug_message "Validate - ${INFORMIXSQLHOSTS} exists"
297
298 if /usr/xpg4/bin/grep -qw ${INFORMIXSERVER} ${INFORMIXSQLHOSTS}
299 then
300 debug_message "Validate - ${INFORMIXSERVER} found in ${INFORMIXSQLHOSTS}"
301 else
302 # SCMSGS
303 # @explanation
304 # ${INFORMIXSQLHOSTS} does not contain ${INFORMIXSERVER}.
305 # @user_action
306 # Ensure that ${INFORMIXSQLHOSTS} is contains ${INFORMIXSERVER}.
307 scds_syslog -p daemon.error -t $(syslog_tag) -m \
308 "Validate - %s does not contain %s" \
309 "${INFORMIXSQLHOSTS}" "${INFORMIXSERVER}"
310 rc=1
311 fi
312 else
313 # SCMSGS
314 # @explanation
315 # ${INFORMIXSQLHOSTS does not exist.
316 # @user_action
317 # Ensure that ${INFORMIXSQLHOSTS} exists.
318 scds_syslog -p daemon.error -t $(syslog_tag) -m \
319 "Validate - %s does not exist" \
320 "${INFORMIXSQLHOSTS}"
321 rc=1
322 fi
323
324 if [ "${rc}" -eq 0 ]
325 then
326 # SCMSGS
327 # @explanation
328 # The Informix Server validation was successful.
329 # @user_action
330 # None required, informational message.
331 scds_syslog -p daemon.info -t $(syslog_tag) -m \
332 "Validate - Informix Server (%s) validation was successful" \
333 "${INFORMIXSERVER}"
334 fi
335
336 debug_message "Function: validate - End"
337 return ${rc}
338 }
339
340 start_ids()
341 {
342 debug_message "Function: start_ids - Begin"
343 ${SET_DEBUG}
344
345 /usr/bin/rm ${LOGFILE} 2> /dev/null
346
347 if [ "${CALLER}" = "GDS" ]
348 then
349 get_state
350 check_ids debug
351 rc=$?
352
353 # Check_ids will return 0 if
354 # - The Informix Server is running
355 # - No blocked on "MEDIA FAILURE" or "HANG_SYSTEM" exists
356
357 if [ "${rc}" -eq 0 ]
358 then
359 # Turn off PMF restart if ${INFORMIXSERVER} has been manually started
360 /usr/bin/sleep ${START_TIMEOUT} &
361 /usr/cluster/bin/pmfadm -s ${RESOURCEGROUP},${RESOURCE},0.svc
362
363 # SCMSGS
364 # @explanation
365 # The specified Informix Server has been manually started.
366 # @user_action
367 # None required. Informational message.
368 scds_syslog -p daemon.notice -t $(syslog_tag) -m \
369 "start_ids - Informix Server (%s) was manually started" \
370 "${INFORMIXSERVER}"
371
372 return 0
373 fi
374
375 /usr/bin/su ${USERID} -c "${TASK_COMMAND} env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/oninit -y ${OUTPUT} &" > /dev/null
376
377 else
378 env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/oninit -y > ${LOGFILE} 2>&1 &
379
380 fi
381
382 rc=$?
383
384 if [ "${rc}" -eq 0 ]
385 then
386 # SCMSGS
387 # @explanation
388 # The specified Informix Server was started successfully.
389 # @user_action
390 # None required. Informational message.
391 scds_syslog -p daemon.info -t $(syslog_tag) -m \
392 "start_ids - Informix Server (%s) started rc(%s)" \
393 "${INFORMIXSERVER}" "${rc}"
394
395 # At present there is no equivalent "wait_for_online" within SMF
396 # therefore we'll perform our own.
397
398 if [ "${CALLER}" = "SMF" ]
399 then
400 smf_wait_for_online
401 rc=$?
402 fi
403 else
404 # SCMSGS
405 # @explanation
406 # The specified Informix Server failed to start.
407 # @user_action
408 # Check the syslog for further messages. If possible the
409 # Solaris Cluster will attempt to restart the Informix
410 # Server.
411 scds_syslog -p daemon.error -t $(syslog_tag) -m \
412 "start_ids - Informix Server (%s) failed to start rc(%s)" \
413 "${INFORMIXSERVER}" "${rc}"
414
415 log_message error "start_ids rc(${rc})"
416 fi
417
418 debug_message "Function: start_ids - End"
419 return ${rc}
420 }
421
422 check_start()
423 {
424 debug_message "Function: check_start - Begin"
425 ${SET_DEBUG}
426
427 if [ "${CALLER}" = "GDS" ]
428 then
429 if [ -x /sbin/zonename ]
430 then
431 /usr/bin/pgrep -z ${ZONENAME} -f "$1 .*-R ${RESOURCE} " >/dev/null 2>&1
432 else
433 /usr/bin/pgrep -u root -f "$1 .*-R ${RESOURCE} " >/dev/null 2>&1
434 fi
435 else
436 /usr/bin/pgrep -u ${USERID} -f "$1 ${RESOURCE} " >/dev/null 2>&1
437 fi
438
439 rc=$?
440
441 debug_message "Function: check_start - End"
442 return ${rc}
443 }
444
445 get_state()
446 {
447 debug_message "Function: get_state - Begin"
448 ${SET_DEBUG}
449
450 # The Informix Dynamic Server has an operating mode which can be obtained
451 # by using the "onstat -" utility that prints the output header of the
452 # onstat utility. The format of the output header is as follows,
453 #
454 # Version--Mode (Type)--(Checkpnt)--Up Uptime--Sh_mem Kbytes
455 #
456 # "Version" will contain the product name and version number.
457 # "Mode" will contain the currrent operating mode.
458 #
459 # In addition to the operating mode, the database maybe blocked from
460 # performing any work. If the database is blocked, the blocked reason
461 # is also displayed in the onstat output header.
462 #
463 # Of interest to us is "Version", "Mode" and any blocked reason.
464 #
465 # Under normal operation the product name within "Version" will contain
466 # "IBM Informix Dynamic Server", after which "Mode" will reflect an
467 # appropriate operating mode. Blocked states only appear once a "Mode"
468 # is reached.
469 #
470 # The following shows two sample "onstat -" outputs,
471 # Before IDS is started.
472 #
473 # shared memory not initialized for INFORMIXSERVER 'demo_on'
474 #
475 # After IDS is started.
476 #
477 # IBM Informix Dynamic Server Version 11.10.FC1 -- On-Line -- Up 01:47:59 -- 29696 Kbytes
478
479 if [ "${CALLER}" = "GDS" ]
480 then
481 onstat_header=`/usr/bin/su ${USERID} -c "${TASK_COMMAND} env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/onstat - | /usr/bin/grep ."`
482 else
483 onstat_header=`env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/onstat - | /usr/bin/grep .`
484 fi
485
486 if echo ${onstat_header} | /usr/xpg4/bin/grep -q "Informix Dynamic Server"
487 then
488 onstat_mode=`echo ${onstat_header} | /usr/bin/sed -e 's/ -- Up.*$//' -e 's/^.*-- //'`
489
490 if echo ${onstat_header} | /usr/xpg4/bin/grep -q "Blocked:"
491 then
492 onstat_blocked=`echo ${onstat_header} | /usr/bin/sed -e 's/^.*Blocked://'`
493 else
494 onstat_blocked=""
495 fi
496 fi
497
498 debug_message "Function: get_state - End"
499 }
500
501 check_ids()
502 {
503 debug_message "Function: check_ids - Begin"
504 ${SET_DEBUG}
505
506 LEVEL=error
507 [ "$1" = "debug" ] && LEVEL=debug
508
509 # Check if IDS is starting up.
510 if echo ${onstat_header} | /usr/xpg4/bin/grep -q "Changing data structure"
511 then
512 # SCMSGS
513 # @explanation
514 # The Informix Server database is starting up.
515 # @user_action
516 # None required. Solaris Cluster will restart the Informix Server
517 # so that it is managed by Solaris Cluster.
518 scds_syslog -p daemon.${LEVEL} -t $(syslog_tag) -m \
519 "check_ids - Database Instance %s is restarting" \
520 "${INFORMIXSERVER}"
521
522 return 100
523 fi
524
525 # Check if IDS is down.
526 if echo ${onstat_header} | /usr/xpg4/bin/grep -q -E "shared memory not initialized|WARNING: IBM Informix Dynamic Server is no longer running"
527 then
528 # SCMSGS
529 # @explanation
530 # The Informix Server database is down.
531 # @user_action
532 # None required. Solaris Cluster will restart the Informix Server.
533 scds_syslog -p daemon.${LEVEL} -t $(syslog_tag) -m \
534 "check_ids - Database Instance %s is down" \
535 "${INFORMIXSERVER}"
536
537 return 100
538 fi
539
540 # Check for any blocked states.
541 # Regardless of the onstat_mode, if a blocked state of "MEDIA FAILURE" or
542 # "HANG_SYSTEM" exists we will register a complete failure and indicate
543 # that the DBA needs to be involved.
544
545 if [ -n "${onstat_blocked}" ]
546 then
547 if echo "${onstat_blocked}" | /usr/xpg4/bin/grep -q -E "MEDIA_FAILURE|HANG_SYSTEM"
548 then
549 # SCMSGS
550 # @explanation
551 # The Informix Dynamic Server database has failed.
552 # @user_action
553 # Check the system log for error messages and contact your DBA.
554 # Solaris Cluster will restart the Informix Server.
555 scds_syslog -p daemon.${LEVEL} -t $(syslog_tag) -m \
556 "check_ids - Database Instance %s has failed mode(%s) blocked(%s), contact your DBA" \
557 "${INFORMIXSERVER}" "${onstat_mode}" "${onstat_blocked}"
558
559 return 100
560 fi
561 fi
562
563 case "${onstat_mode}" in
564 # Maintenance & Startup modes
565 "Quiescent"|"Administration"|"Single User"|"Initialization"|"Fast Recovery"|"Recovery")
566
567 rc=100
568 ;;
569
570 # The following IDS server modes are acceptable normal operation modes.
571
572 "On-Line"|"Read-only") # Normal operation modes
573
574 rc=0
575 ;;
576
577 # Any other IDS server modes are treated as a complete failure.
578
579 *) # Unknown modes
580 rc=100
581 ;;
582 esac
583
584 debug_message "check_ids - ${onstat_header}"
585
586 if [ "${CALLER}" = "GDS" -a "${LEVEL}" != "debug" ]
587 then
588 # While we tolerate some blocked states we will output a status message
589 # to Solaris Cluster if one is found. Nevertheless the resource remains online.
590
591 saved_rc=${rc}
592
593 # Check if GDS is still starting the resource. If GDS start has finished we'll set
594 # the Solaris Cluster resource status with the appropriate Mode and any Blocked state.
595
596 if ! check_start gds_svc_start
597 then
598 MESSAGE=
599 [ -n "${onstat_mode}" ] && MESSAGE="Mode:${onstat_mode}"
600 [ -n "${onstat_blocked}" ] && MESSAGE="${MESSAGE} Blocked:${onstat_blocked}"
601
602 /usr/cluster/bin/scha_resource_setstatus -R ${RESOURCE} -G ${RESOURCEGROUP} -s OK -m "${MESSAGE}"
603 fi
604
605 rc=${saved_rc}
606
607 fi
608
609 debug_message "Function: check_ids - End"
610 return ${rc}
611 }
612
613 stop_ids()
614 {
615 debug_message "Function: stop_ids - Begin"
616 ${SET_DEBUG}
617
618 MAX_STOP_TIMEOUT=`/usr/bin/expr ${STOP_TIMEOUT} \* 70 \/ 100`
619 SECONDS=0
620
621 if [ "${CALLER}" = "GDS" ]
622 then
623 /usr/bin/su ${USERID} -c "${TASK_COMMAND} env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/onmode -uky ${OUTPUT} &" > /dev/null
624
625 else
626 env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/onmode -uky > ${LOGFILE} 2>&1 &
627 fi
628
629 while [ "${SECONDS}" -lt "${MAX_STOP_TIMEOUT}" ]
630 do
631 get_state
632
633 if echo ${onstat_header} | /usr/xpg4/bin/grep -q "shared memory not initialized"
634 then
635 SECONDS=${MAX_STOP_TIMEOUT}
636 else
637 sleep 5
638 fi
639 done
640
641 # Note that the shutdown will be run in the background. As such the contents
642 # of ${LOGFILE} is not of interest so we will clear that file.
643
644 cat /dev/null > ${LOGFILE}
645
646 get_state
647
648 if ! echo ${onstat_header} | /usr/xpg4/bin/grep -q "shared memory not initialized"
649 then
650 /usr/cluster/bin/pmfadm -s ${RESOURCEGROUP},${RESOURCE},0.svc KILL 2> /dev/null
651 fi
652
653 debug_message "Function: stop_ids - End"
654 return 0
655 }
656
657 smf_wait_for_online()
658 {
659 debug_message "Function: smf_wait_for_online - Begin"
660 ${SET_DEBUG}
661
662 # In order to ensure that the SMF service is really online, we need
663 # to check getstate() and check_ids(). However, we need to enforce
664 # an SMF_EXIT_ERR_CONFIG if we are just about to timeout. If we do not
665 # do this, then svc.startd will try to restart the SMF service three
666 # times. Essentially we need Sun Cluster to do that.
667
668 MAX_START_TIMEOUT=`/usr/bin/expr ${START_TIMEOUT} \* 95 \/ 100`
669 SECONDS=0
670
671 while [ "${SECONDS}" -lt "${MAX_START_TIMEOUT}" ]
672 do
673 get_state
674 check_ids
675 rc=$?
676
677 # Check_ids will return 0 if
678 # - The Informix Server is running
679 # - No blocked on "MEDIA FAILURE" or "HANG_SYSTEM" exists
680
681 if [ "${rc}" -eq 0 ]
682 then
683 SECONDS=${MAX_START_TIMEOUT}
684 else
685 rc=${SMF_EXIT_ERR_CONFIG}
686 sleep 2
687 fi
688 done
689
690 debug_message "Function: smf_wait_for_online - End"
691 return ${rc}
692 }
693
694 cleanup_ipc()
695 {
696 debug_message "Function: cleanup_ipc - Begin"
697 ${SET_DEBUG}
698
699 # Cleanup any IPC shared memory segments however only if
700 #
701 # - The shared memory segment(s) are owned by
702 # OWNER=root and GROUP=informix
703 # - The shared memory has no attached processes
704 # - The CPID and LPID processes are not running
705
706 flag=
707
708 if [ "${DEBUG}" = "${RESOURCE}" -o "${DEBUG}" = "ALL" ]
709 then
710 debug_message "IPC Status BEFORE removal of non-attached segments created by group informix"
711 /usr/bin/ipcs -mcopbZ | /usr/bin/grep " ${ZONENAME}$" > ${LOGFILE}
712 log_message debug ipcs
713 fi
714
715 /usr/bin/ipcs -mcopbZ | /usr/bin/grep " ${ZONENAME}$" | /usr/bin/awk ' \
716 {if (NF == 13 && $5 == "root" && $6 == "informix" && $9 == 0 ) print $2,$11,$12; else \
717 if (NF == 12 && $4 == "root" && $5 == "informix" && $8 == 0 ) print $1,$10,$11 }' | \
718 while read SHMID CPID LPID
719 do
720 if /usr/bin/ps -p ${LPID} -o zone | /usr/bin/grep " ${ZONENAME}$" > /dev/null
721 then
722 debug_message "Informix SHMID: ${SHMID} - LPID ${LPID} is running"
723 else
724 if /usr/bin/ps -p ${CPID} -o zone | /usr/bin/grep " ${ZONENAME}$" > /dev/null
725 then
726 debug_message "Informix SHMID: ${SHMID} - CPID ${CPID} is running"
727 else
728 SHMID=`/usr/bin/echo ${SHMID} | /usr/xpg4/bin/tr 'm' ' '`
729
730 # As the initial ipcs -mcopbZ is only a snapshot in time, Informix
731 # may have already cleaned up. Therefore the following attempt to remove a
732 # shared memory segment may fail with "not found". To prevent misleading
733 # console messages stdout/stderr is redirected to /dev/null.
734
735 /usr/bin/ipcrm -z ${ZONENAME} -m ${SHMID} > /dev/null 2>&1
736
737 debug_message "Informix SHMID: ${SHMID} - removed"
738
739 flag=deleted
740 fi
741 fi
742 done
743
744 if [ -n "${flag}" ]
745 then
746 # SCMSGS
747 # @explanation
748 # All the Informix shared memory segments that were not being
749 # used have been removed.
750 # @user_action
751 # None required. Informational message.
752 scds_syslog -p daemon.notice -t $(syslog_tag) -m \
753 "All Informix non-attached IPC shared memory segments removed"
754 fi
755
756 debug_message "IPC Status AFTER removal of non-attached segments created by group informix"
757
758 if [ "${DEBUG}" = "${RESOURCE}" -o "${DEBUG}" = "ALL" ]
759 then
760 /usr/bin/ipcs -mcopbZ | /usr/bin/grep " ${ZONENAME}$" > ${LOGFILE}
761 log_message debug ipcs
762 fi
763
764 debug_message "Function: cleanup_ipc - End"
765 return 0
766 }