#! /bin/ksh
#
#	Copyright 05 Nov 1997 Sun Microsystems, Inc.  All Rights Reserved.
#
# @(#)sybase_status_svcs.shs	1.8 97/11/05 SMI
#
# sybase_status_svcs - report list of data services provided for logical
#		       hosts in HA_METASETSERVE (or HA_NO_METASETSERVE if
#		       used with -no option, or HA_SIBLING_METASETSERVE if
#		       used with the -sibling option
#
# Environment:
# HA_ENV - name of HA environment file
# HA_METASETSERVE - list of hosts (default)
# HA_NO_METASETSERVE - list of hosts (with -no)
# HA_SIBLING_METASETSERVE - list of hosts (with -sibling)
#

#	Copyright 10 Sep 1997 Sun Microsystems, Inc.  All Rights Reserved.
#
# @(#)sybase_boiler	1.24 97/09/10 SMI

# begin of common ha-dbms boilerplate

# remember our name
argv0=`basename $0`

# Get the BASEDIR and PRODUCTDIR settings from the installed pkgs
_basedir=`pkgparam SUNWscsyb BASEDIR 2>/dev/null`
_productdir=`pkgparam SUNWscsyb PRODUCTDIR 2>/dev/null`
_basedir=${_basedir:=""}
_productdir=${_productdir:="SUNWcluster"}

LOGGER=/usr/bin/logger

PATH=${_basedir}/${_productdir}/bin:${_basedir}/${_productdir}/ha/sybase:${PATH}
export PATH
HA_FILES=/etc/${_basedir}/SUNWscsyb; export HA_FILES
HA_VAR=/var/${_basedir}/SUNWscsyb; export HA_VAR

# include HA utilities library
. dbms_utilities
if [ $? -ne 0 ]; then
	$LOGGER -p local7.err -t "$HA_SLOGTAG" "$argv0: Cannot find HA utilities library"
	exit 1
fi

HA_CLUSTER=$CLUSTNAME; export HA_CLUSTER

# some default files and locations
# don't move this up - it depends on HA_FILES, which gets set above
HA_DATABASES=hasybase_databases
HA_DB_SUPPORT=${HA_FILES}/hasybase_support
ds="sybase"

PREFIX="SUNWcluster.ha.${ds}"
HA_FM_NAME="fault_mon"

# verify that we have the hasybase_support file
if [ ! -r $HA_DB_SUPPORT ] ; then
  logerr "4000" \
	"file ${HA_DB_SUPPORT} does not exist or is not readable!"
  exit 2
fi


# talk_start ... - echo the args, run them, and evaluate return value
talk_start() {
  	logprint "$$: $*"
  	if $* ; then
    		return 0
  	else
    		logprint "$$: $* ... failed"
    		return 1
  	fi
}


# talk_start_bg ... - print the args, then run them in the background
talk_start_bg() {
  	logprint "$$: $*"
  	$* &
  	}


# get_pid [ -u userid ] pattern - find the process id of a running program
# if called with "-u userid", only process for that user will be considered
get_pid() {
	if [ "$1" = "-u" ] ; then
		ps_args="-f -u $2"
		shift
		shift
	else
		ps_args="-ef"
	fi
	PID=`/usr/bin/ps $ps_args | grep "\<$*\>" | nawk -v pat="$*" '
 BEGIN { 
   search_pat = substr(pat, 0, 79)
   }
 { if ( match($0, search_pat) )
     if ( ! match($0, "nawk -v pat=") )
    	print $2
  }
'`
}

	
# kill_proc pattern - find and terminate a process
kill_proc() {
  	logprint "Killing $*..." 
  	get_pid $*
  	if [ "$PID" ] ; then
    		for p in ${PID} ; do
      			logprint "Killing process id $p"
      			kill -KILL $p
    		done
  	else
    		logprint "process \"$*\" could not be located..." 
  	fi
}

#get_server_pid <server name>  - check that the SQL dataserver is running or 
#                      not on the system
get_server_pid () {

servername="RUN_$*"
SPID=`/usr/bin/ps -fe | grep "\<$servername\>$" | 
			grep -v "grep" | nawk -v pat="$servername" '
 BEGIN { 
   search_pat = substr(pat,0,79)
   }
 { if ( match($0, search_pat) )
     if ( ! match($0, "nawk -v pat=") )
       		print $2
  }
'`
}

# get_pgid pattern - get the process group id of a running server
get_pgid() {

PGID=`/usr/bin/ps -o pgid -p $1 | grep -v "PGID" | nawk '{print $1}'`

}

# kill_server - kill server processes if it cannot be shutdown normally
kill_server() {

	get_server_pid $*
	if [ "${SPID}" != "" ]; then

		for gpid in $SPID ; do
			get_pgid $gpid
				if [ "${PGID}" != "" ]; then
					kill -KILL -${PGID}
 
				fi
		done
	fi

}

 

# read_ha_databases server - find an entry in the HA_DATABASES file,
# 	parse it apart, and return in variables. Assumes that sybase_home
#	is set!
read_ha_databases() {
#	conf_line=`grep "^o[nf][f]*	$1	" $HA_DATABASES`
        set_inst_name $1
	conf_line=$(get_instance "${ds}" "$1")
	if [ "$conf_line" = "" ] ; then
		logerr "4010" "$1 missing from HA SYBASE CCD!"
		return 1
	fi

        on_off_mode=`echo "$conf_line" | cut -s -f 1`
# The following 'server_name' is and extra line for sybase
	server_name=`echo "$conf_line" | cut -s -f 2`
	logical_host=`echo "$conf_line" | cut -s -f 3`
	poll_cycle=`echo "$conf_line" | cut -s -f 4`
	connect_cycle=`echo "$conf_line" | cut -s -f 5`
	timeout=`echo "$conf_line" | cut -s -f 6`
	restart_delay=`echo "$conf_line" | cut -s -f 7`
	db_login=`echo "$conf_line" | cut -s -f 8`
	runserver_file=`echo "$conf_line" | cut -s -f 9`
	if [ "`echo $conf_line | wc -w`" -eq 11 ] ; then
		backup_server=`echo "$conf_line" | cut -s -f 10`
		runbackup_file=`echo "$conf_line" | cut -s -f 11`
	fi

        set_logical_host $logical_host
	return 0
}

# find_sybase server - finds and sets various Sybase related variables:
#	SYBASE ISQL RUN_FILE
# in case of a problem, it returns with an empty SYBASE variable
find_sybase() {
  	SYBTAB=/var/opt/sybase/sybtab

  	SYBASE=""
	ISQL=""
	if sybtab_line=`grep "^[	 ]*$1:" $SYBTAB` ; then
		sybase_home=`echo $sybtab_line | awk -F: '{print $2}' -`
		if [ -d $sybase_home ] && [ -n "`disk_mounted $1`" ] ; then
			if [ -x ${sybase_home}/bin/isql ] ; then
				read_ha_databases $1
				SYBASE="$sybase_home"
				ISQL="${SYBASE}/bin/isql"
				RUN_FILE="$runserver_file"
			else
				logerr "4030" \
				"No isql executable in ${sybase_home}/bin!"
			fi
		fi
	else
		logerr "4040" \
			"Database '$1' not found in ${SYBTAB}"
	fi
    	export SYBASE ISQL RUN_FILE
}


make_rpc_call() {
  	logprint "Calling $3 for server $2 on host $1..."
  	ha_dbms_call $1 $2 $3 
  	}

get_remote_host(){
	get_diskgroups $1 $2
	RSHHOST=""
	for X in `haget  -f private_links -h $HA_REMOTEHOST` ; do
	  net_pinghost $X > /dev/null 2>&1
	  if [ $? -eq 0 ] ; then
		RSHHOST=$X
		export RSHHOST
		return 0
	  fi
	done
	return 1
	}

#end of common ha-dbms boiler plate
#include_boiler

mode="all"
the_hosts=`hareg -q sybase -H | tr '\012' ' '`

while [ $# -gt 0 ] ; do
	case $1 in
		-mode)	shift
			mode=$1
			if [ "$mode" != "" ] ; then
				shift
			fi
		     	;;
		-hosts) shift
			the_hosts=$1
			if [ "$the_hosts" != "" ] ; then
		     		shift 
			fi
			;;
		*) echo "usage: $argv0 [ -mode mode | -hosts hosts ]"
			exit 2 ;;
 	esac
done


services_found=""
if [ "$the_hosts" != "" ] ; then
	hosts=`echo $the_hosts | tr ',' ' '`
	# Now read the ha_databases file and check for matching hosts
	sybase_sid_entries=$(get_all sybase)
	DEF_IFS=$IFS
	IFS=":"
	echo "$sybase_sid_entries" | \
        while read entry_type DSQUERY meta_host poll timeout restart_delay id pfile
	do
  		OLD_IFS=$IFS
  		IFS=$DEF_IFS
		if [ "$mode" = "all" -o "$entry_type" = "$mode" ] ; then
#			matches=`expr " $the_hosts " : ".* $meta_host "`
#  			if [ "$matches" -ne 0 ] ; then
			is_member $meta_host "$hosts"
			if [ $? -eq 0 ] ; then
				if [ "$id" = "" ] ; then
					logerr "${prog}.4110" \
	"Entry for server $DSQUERY in ${HA_DATABASES} does not have enough fields - skipped!"
				else
  					echo $DSQUERY" \c"
				fi
			fi
		fi
  		IFS=$OLD_IFS
	done 
fi
echo 
