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   "@(#)functions.ksh 1.5     08/05/27 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         get_state
348         check_ids debug
349         rc=$?
350 
351         # Check_ids will return 0 if
352         # - The Informix Server is running
353         # - No blocked on "MEDIA FAILURE" or "HANG_SYSTEM" exists
354 
355         if [ "${rc}" -eq 0 ]
356         then
357            # Turn off PMF restart if ${INFORMIXSERVER} has been manually started
358            /usr/bin/sleep ${START_TIMEOUT} &
359            /usr/cluster/bin/pmfadm -s ${RESOURCEGROUP},${RESOURCE},0.svc
360         
361            # SCMSGS
362            # @explanation
363            # The specified Informix Server has been manually started.
364            # @user_action
365            # None required. Informational message.
366            scds_syslog -p daemon.notice -t $(syslog_tag) -m \
367                 "start_ids - Informix Server (%s) was manually started" \
368                 "${INFORMIXSERVER}"
369 
370            return 0
371         fi
372 
373         /usr/bin/su ${USERID} -c "${TASK_COMMAND} /usr/bin/env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/oninit -y ${OUTPUT} &" > /dev/null
374 
375         rc=$?
376 
377         if [ "${rc}" -eq 0 ]
378         then
379            # SCMSGS
380            # @explanation
381            # The specified Informix Server was started successfully.
382            # @user_action
383            # None required. Informational message.
384            scds_syslog -p daemon.info -t $(syslog_tag) -m \
385                 "start_ids - Informix Server (%s) started rc(%s)" \
386                 "${INFORMIXSERVER}" "${rc}"
387         else
388            # SCMSGS
389            # @explanation
390            # The specified Informix Server failed to start.
391            # @user_action
392            # Check the syslog for further messages. If possible the 
393            # Solaris Cluster will attempt to restart the Informix
394            # Server.
395            scds_syslog -p daemon.error -t $(syslog_tag) -m \
396                 "start_ids - Informix Server (%s) failed to start rc(%s)" \
397                 "${INFORMIXSERVER}" "${rc}"
398 
399            log_message error "start_ids rc(${rc})"
400         fi
401 
402         debug_message "Function: start_ids - End"
403         return ${rc}
404 }
405 
406 check_start()
407 {
408         debug_message "Function: check_start - Begin"
409         ${SET_DEBUG}
410 
411         if [ -x /sbin/zonename ]
412         then
413            /usr/bin/pgrep -z ${ZONENAME} -f "$1 .*-R ${RESOURCE} " >/dev/null 2>&1
414         else
415            /usr/bin/pgrep -u root -f "$1 .*-R ${RESOURCE} " >/dev/null 2>&1
416         fi
417 
418         rc=$?
419 
420         debug_message "Function: check_start - End"
421         return ${rc}
422 }
423 
424 get_state()
425 {
426         debug_message "Function: get_state - Begin"
427         ${SET_DEBUG}
428 
429         # The Informix Dynamic Server has an operating mode which can be obtained 
430         # by using the "onstat -" utility that prints the output header of the
431         # onstat utility. The format of the output header is as follows, 
432         # 
433         # Version--Mode (Type)--(Checkpnt)--Up Uptime--Sh_mem Kbytes
434         # 
435         # "Version" will contain the product name and version number.
436         # "Mode" will contain the currrent operating mode.
437         #
438         # In addition to the operating mode, the database maybe blocked from
439         # performing any work. If the database is blocked, the blocked reason
440         # is also displayed in the onstat output header.
441         # 
442         # Of interest to us is "Version", "Mode" and any blocked reason. 
443         # 
444         # Under normal operation the product name within "Version" will contain 
445         # "IBM Informix Dynamic Server", after which "Mode" will reflect an
446         # appropriate operating mode. Blocked states only appear once a "Mode" 
447         # is reached.
448         #
449         # The following shows two sample "onstat -" outputs,
450         # Before IDS is started.
451         #
452         #  shared memory not initialized for INFORMIXSERVER 'demo_on'
453         #
454         # After IDS is started.
455         #
456         #  IBM Informix Dynamic Server Version 11.10.FC1       -- On-Line -- Up 01:47:59 -- 29696 Kbytes
457 
458         onstat_header=$(/usr/bin/su ${USERID} -c "${TASK_COMMAND} /usr/bin/env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/onstat - | /usr/bin/grep .")
459 
460         if echo ${onstat_header} | /usr/xpg4/bin/grep -q "Informix Dynamic Server"
461         then
462            onstat_mode=$(echo ${onstat_header} | /usr/bin/sed -e 's/ -- Up.*$//' -e 's/^.*-- //')
463 
464            if echo ${onstat_header} | /usr/xpg4/bin/grep -q "Blocked:"
465            then
466                 onstat_blocked=$(echo ${onstat_header} | /usr/bin/sed -e 's/^.*Blocked://')
467            else
468                 onstat_blocked=""
469            fi
470         fi
471 
472         debug_message "Function: get_state - End"
473 }
474 
475 check_ids()
476 {
477         debug_message "Function: check_ids - Begin"
478         ${SET_DEBUG}
479 
480         LEVEL=error
481         [ "$1" = "debug" ] && LEVEL=debug
482 
483         # Check if IDS is starting up.
484         if echo ${onstat_header} | /usr/xpg4/bin/grep -q "Changing data structure"
485         then
486            # SCMSGS
487            # @explanation
488            # The Informix Server database is starting up.
489            # @user_action
490            # None required. Solaris Cluster will restart the Informix Server 
491            # so that it is managed by Solaris Cluster.
492            scds_syslog -p daemon.${LEVEL} -t $(syslog_tag) -m \
493                 "check_ids - Database Instance %s is restarting" \
494                 "${INFORMIXSERVER}"
495 
496            return 100
497         fi
498 
499         # Check if IDS is down.
500         if echo ${onstat_header} | /usr/xpg4/bin/grep -q -E "shared memory not initialized|WARNING: IBM Informix Dynamic Server is no longer running"
501         then
502            # SCMSGS
503            # @explanation
504            # The Informix Server database is down.
505            # @user_action
506            # None required. Solaris Cluster will restart the Informix Server. 
507            scds_syslog -p daemon.${LEVEL} -t $(syslog_tag) -m \
508                 "check_ids - Database Instance %s is down" \
509                 "${INFORMIXSERVER}"
510 
511            return 100
512         fi
513 
514         # Check for any blocked states.
515         # Regardless of the onstat_mode, if a blocked state of "MEDIA FAILURE" or
516         # "HANG_SYSTEM" exists we will register a complete failure and indicate 
517         # that the DBA needs to be involved.
518 
519         if [ -n "${onstat_blocked}" ]
520         then
521            if echo "${onstat_blocked}" | /usr/xpg4/bin/grep -q -E "MEDIA_FAILURE|HANG_SYSTEM"
522            then
523                 # SCMSGS
524                 # @explanation
525                 # The Informix Dynamic Server database has failed.
526                 # @user_action
527                 # Check the system log for error messages and contact your DBA.
528                 # Solaris Cluster will restart the Informix Server.
529                 scds_syslog -p daemon.${LEVEL} -t $(syslog_tag) -m \
530                    "check_ids - Database Instance %s has failed mode(%s) blocked(%s), contact your DBA" \
531                    "${INFORMIXSERVER}" "${onstat_mode}" "${onstat_blocked}"
532 
533                 return 100
534            fi
535         fi
536 
537         case "${onstat_mode}" in
538                                                                         # Maintenance & Startup modes
539                 "Quiescent"|"Administration"|"Single User"|"Initialization"|"Fast Recovery"|"Recovery")
540 
541                         rc=100
542                         ;;
543                            
544                 # The following IDS server modes are acceptable normal operation modes.
545 
546                 "On-Line"|"Read-only")                                  # Normal operation modes
547 
548                         rc=0
549                         ;;
550 
551                 # Any other IDS server modes are treated as a complete failure.
552         
553                 *)                                                      # Unknown modes
554                         rc=100
555                         ;;
556         esac
557 
558         debug_message "check_ids - ${onstat_header}"
559 
560         if [ "${LEVEL}" != "debug" ]
561         then
562            # While we tolerate some blocked states we will output a status message
563            # to Solaris Cluster if one is found. Nevertheless the resource remains online.
564 
565            saved_rc=${rc}
566 
567            # Check if GDS is still starting the resource. If GDS start has finished we'll set
568            # the Solaris Cluster resource status with the appropriate Mode and any Blocked state.
569 
570            if ! check_start gds_svc_start
571            then
572                 MESSAGE=
573                 [ -n "${onstat_mode}" ] && MESSAGE="Mode:${onstat_mode}"
574                 [ -n "${onstat_blocked}" ] && MESSAGE="${MESSAGE} Blocked:${onstat_blocked}"
575 
576                 /usr/cluster/bin/scha_resource_setstatus -R ${RESOURCE} -G ${RESOURCEGROUP} -s OK -m "${MESSAGE}"
577            fi
578 
579            rc=${saved_rc}
580 
581         fi
582 
583         debug_message "Function: check_ids - End"
584         return ${rc}
585 }
586 
587 stop_ids()
588 {
589         debug_message "Function: stop_ids - Begin"
590         ${SET_DEBUG}
591 
592         MAX_STOP_TIMEOUT=$(/usr/bin/expr ${STOP_TIMEOUT} \* 70 \/ 100)
593         SECONDS=0
594 
595         /usr/bin/su ${USERID} -c "${TASK_COMMAND} /usr/bin/env INFORMIXDIR=${INFORMIXDIR} INFORMIXSERVER=${INFORMIXSERVER} INFORMIXSQLHOSTS=${INFORMIXSQLHOSTS} ONCONFIG=${ONCONFIG} ${INFORMIXDIR}/bin/onmode -uky ${OUTPUT} &" > /dev/null
596 
597         while  [ "${SECONDS}" -lt "${MAX_STOP_TIMEOUT}" ]
598         do
599            get_state
600 
601            if echo ${onstat_header} | /usr/xpg4/bin/grep -q "shared memory not initialized"
602            then
603                 SECONDS=${MAX_STOP_TIMEOUT}
604            else
605                 sleep 5
606            fi
607         done
608 
609         # Note that the shutdown will be run in the background. As such the contents
610         # of ${LOGFILE} is not of interest so we will clear that file.
611 
612         cat /dev/null > ${LOGFILE}
613 
614         get_state
615 
616         if ! echo ${onstat_header} | /usr/xpg4/bin/grep -q "shared memory not initialized"
617         then
618            /usr/cluster/bin/pmfadm -s ${RESOURCEGROUP},${RESOURCE},0.svc KILL 2> /dev/null
619         fi
620 
621         debug_message "Function: stop_ids - End"
622         return 0
623 }
624 
625 cleanup_ipc()
626 {
627         debug_message "Function: cleanup_ipc - Begin"
628         ${SET_DEBUG}
629 
630         # Cleanup any IPC shared memory segments however only if
631         #
632         #       - The shared memory segment(s) are owned by
633         #               OWNER=root and GROUP=informix
634         #       - The shared memory has no attached processes
635         #       - The CPID and LPID processes are not running
636 
637         flag=
638 
639         if [ "${DEBUG}" = "${RESOURCE}" -o "${DEBUG}" = "ALL" ]
640         then
641            debug_message "IPC Status BEFORE removal of non-attached segments created by group informix"
642            /usr/bin/ipcs -mcopbZ | /usr/bin/grep " ${ZONENAME}$" > ${LOGFILE}
643            log_message debug ipcs
644         fi
645 
646         /usr/bin/ipcs -mcopbZ | /usr/bin/grep " ${ZONENAME}$" | /usr/bin/awk ' \
647            {if (NF == 13 && $5 == "root" && $6 == "informix" && $9 == 0 ) print $2,$11,$12; else \
648            if (NF == 12 && $4 == "root" && $5 == "informix" && $8 == 0 ) print $1,$10,$11 }' | \
649            while read SHMID CPID LPID
650            do
651                 if /usr/bin/ps -p ${LPID} -o zone | /usr/bin/grep " ${ZONENAME}$" > /dev/null
652                 then
653                    debug_message "Informix SHMID: ${SHMID} - LPID ${LPID} is running"
654                 else
655                    if /usr/bin/ps -p ${CPID} -o zone | /usr/bin/grep " ${ZONENAME}$" > /dev/null
656                    then
657                         debug_message "Informix SHMID: ${SHMID} - CPID ${CPID} is running"
658                    else
659                         SHMID=$(/usr/bin/echo ${SHMID} | /usr/xpg4/bin/tr 'm' ' ')
660 
661                         # As the initial ipcs -mcopbZ is only a snapshot in time, Informix
662                         # may have already cleaned up. Therefore the following attempt to remove a 
663                         # shared memory segment may fail with "not found". To prevent misleading 
664                         # console messages stdout/stderr is redirected to /dev/null. 
665 
666                         /usr/bin/ipcrm -z ${ZONENAME} -m ${SHMID} > /dev/null 2>&1
667 
668                         debug_message "Informix SHMID: ${SHMID} - removed"
669 
670                         flag=deleted
671                    fi
672                 fi
673            done
674 
675         if [ -n "${flag}" ]
676         then
677            # SCMSGS
678            # @explanation
679            # All the Informix shared memory segments that were not being
680            # used have been removed.
681            # @user_action
682            # None required. Informational message.
683            scds_syslog -p daemon.notice -t $(syslog_tag) -m \
684                 "All Informix non-attached IPC shared memory segments removed"
685         fi
686 
687         debug_message "IPC Status AFTER removal of non-attached segments created by group informix"
688 
689         if [ "${DEBUG}" = "${RESOURCE}" -o "${DEBUG}" = "ALL" ]
690         then
691            /usr/bin/ipcs -mcopbZ | /usr/bin/grep " ${ZONENAME}$" > ${LOGFILE}
692            log_message debug ipcs
693         fi
694 
695         debug_message "Function: cleanup_ipc - End"
696         return 0
697 }