898 lines
20 KiB
Bash
898 lines
20 KiB
Bash
#!/bin/bash
|
|
|
|
# In case we are being run by a service, set some stock paths
|
|
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH"
|
|
|
|
# iAnywhere Solutions, Inc. One Sybase Drive, Dublin, CA 94568, USA
|
|
# Copyright (c) 2001-2008, iAnywhere Solutions, Inc. Portions copyright (c)
|
|
# 1988-2008, Sybase, Inc. All rights preserved. All unpublished rights reserved.
|
|
|
|
get_major_version()
|
|
###################
|
|
{
|
|
echo "16"
|
|
}
|
|
|
|
get_minor_version()
|
|
###################
|
|
{
|
|
echo "0"
|
|
}
|
|
|
|
get_patch_version()
|
|
###################
|
|
{
|
|
echo "0"
|
|
}
|
|
|
|
get_build_version()
|
|
###################
|
|
{
|
|
echo "2043"
|
|
}
|
|
|
|
get_full_version()
|
|
##################
|
|
{
|
|
echo "16.0.0.2043"
|
|
}
|
|
|
|
get_version()
|
|
#############
|
|
{
|
|
echo "`get_major_version``get_minor_version``get_patch_version`"
|
|
}
|
|
|
|
get_lang_code()
|
|
###############
|
|
{
|
|
if [ "$LANG" != "" ]; then
|
|
LANGCODE=`echo $LANG | awk -F"_" '{print $1}'`
|
|
else
|
|
LANGCODE="en"
|
|
fi
|
|
|
|
echo $LANGCODE
|
|
}
|
|
|
|
get_res_charset_code()
|
|
######################
|
|
{
|
|
echo $RESCHARSET
|
|
}
|
|
|
|
get_os_charset_code()
|
|
#####################
|
|
{
|
|
if [ "$LANG" != "" ]; then
|
|
CHARSET=`echo $LANG | awk -F"." '{print $2}'`
|
|
fi
|
|
if [ "$CHARSET" = "" ]; then
|
|
CHARSET="LATIN1"
|
|
fi
|
|
|
|
echo $CHARSET
|
|
}
|
|
|
|
create_new_tmpfile()
|
|
####################
|
|
# PRE : none
|
|
# POST: new empty file $TMPFILE created.
|
|
{
|
|
TMPPREFIX="/tmp/SqlAny_dbsvc."
|
|
|
|
if [ "_$TMPFILE" != "_" ] && [ -f "$TMPFILE" ]; then
|
|
rm -f "$TMPFILE"
|
|
fi
|
|
|
|
TMPFILE="${TMPPREFIX}$$"
|
|
|
|
touch $TMPFILE
|
|
}
|
|
|
|
check_os_requirements()
|
|
#######################
|
|
{
|
|
if [ ! -r "$INIT_FUNCS" ]; then
|
|
output_fatal_error "${ERR_EXPECTINGFILES}"
|
|
fi
|
|
}
|
|
|
|
get_bitness()
|
|
#############
|
|
# called only when in "utility" mode
|
|
{
|
|
MY_DIR=`dirname "$0"`
|
|
OCWD=`pwd`
|
|
cd "$MY_DIR"
|
|
|
|
BIN=`echo $PWD | awk -F bin32 '{ print $1 }' | grep bin64`
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "64"
|
|
else
|
|
echo "32"
|
|
fi
|
|
cd "$OCWD"
|
|
}
|
|
|
|
opposite_bitness()
|
|
##################
|
|
{
|
|
if [ "${1:-}" = "32" ]; then
|
|
echo 64
|
|
elif [ "${1:-}" = "64" ]; then
|
|
echo 32
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
load_language_file()
|
|
####################
|
|
{
|
|
# something to fall back on
|
|
. "${DBSVC_DIR}/language/en/messages.txt"
|
|
|
|
local lc
|
|
lc=`get_lang_code`
|
|
|
|
case $lc in
|
|
"ja" )
|
|
;;
|
|
"zh" )
|
|
;;
|
|
"de" )
|
|
;;
|
|
* )
|
|
lc="en"
|
|
;;
|
|
esac
|
|
|
|
RESCHARSET="UTF8"
|
|
|
|
if [ "$LANGCODE" != "en" ]; then
|
|
create_new_tmpfile
|
|
if [ -r "${DBSVC_DIR}/language/$lc/messages.txt" ]; then
|
|
iconv -f $RESCHARSET -t `get_os_charset_code` "${DBSVC_DIR}/language/$lc/messages.txt" > $TMPFILE 2>/dev/null
|
|
fi
|
|
# Only override usage if we were able to convert to their charset; otherwise fall back on english
|
|
[ $? -eq 0 ] && . $TMPFILE
|
|
fi
|
|
rm -f $TMPFILE
|
|
}
|
|
|
|
get_abspath()
|
|
{
|
|
# assumes a path to a file is passed in
|
|
|
|
local dir=`dirname $1`
|
|
local file=`basename $1`
|
|
|
|
odir=`pwd`
|
|
cd $dir
|
|
dir=`pwd`
|
|
cd $odir
|
|
|
|
echo $dir/$file
|
|
}
|
|
|
|
|
|
init()
|
|
###########
|
|
# initialization that is common for both modes of operation:
|
|
# "svc" mode and "utility" mode
|
|
{
|
|
SVCNAME_PFX="SA_"
|
|
VERSION=`get_major_version`
|
|
INIT_FUNCS=/lib/lsb/init-functions
|
|
|
|
SCRIPT="`get_abspath $0`"
|
|
SCRIPTDIR="`dirname $SCRIPT`"
|
|
SCRIPTPARENTDIR="`dirname $SCRIPTDIR`"
|
|
|
|
SQLANYDIR="$SQLANY16"
|
|
if [ -z "$SQLANYDIR" ]; then
|
|
# fall back on canonical SQL Anywhere directory structure
|
|
SQLANYDIR="$SCRIPTPARENTDIR"
|
|
fi
|
|
}
|
|
|
|
init_utility()
|
|
###################
|
|
{
|
|
# figure out bitness
|
|
BITNESS=`get_bitness`
|
|
BIN=bin${BITNESS}
|
|
OBIN=bin`opposite_bitness ${BITNESS}`
|
|
|
|
DBSVC_DIR="$SQLANYDIR/$BIN"
|
|
if [ ! -d "${DBSVC_DIR}/dbsvc_scripts" ]; then
|
|
DBSVC_DIR="$SQLANYDIR/$OBIN"
|
|
fi
|
|
BIN32=bin32
|
|
BIN64=bin64
|
|
|
|
QUIET=0
|
|
AUTOYES=0
|
|
LISTCMD=FALSE
|
|
|
|
DBSVC_TYPE="Personal"
|
|
}
|
|
|
|
init_svc()
|
|
###############
|
|
{
|
|
BITNESS=${BITNESS:-32}
|
|
BIN=bin${BITNESS}
|
|
OBIN=bin`opposite_bitness ${BITNESS}`
|
|
BIN32=bin32
|
|
BIN64=bin64
|
|
DBSVC_DIR="$SQLANYDIR/$BIN"
|
|
}
|
|
|
|
usage()
|
|
#######
|
|
{
|
|
FV=`echo "FULL"_"VERSION"`
|
|
MJR=`echo "SA"_"MAJOR"`
|
|
|
|
local lc
|
|
lc=`get_lang_code`
|
|
|
|
create_new_tmpfile
|
|
if [ -r "${DBSVC_DIR}/language/$lc/messages.txt" ]; then
|
|
iconv -f `get_res_charset_code` -t `get_os_charset_code` "${DBSVC_DIR}/language/`get_lang_code`/usage.txt" > $TMPFILE 2>/dev/null
|
|
# Only override usage if we were able to convert to their charset; otherwise fall back on english
|
|
[ $? -ne 0 ] && cat "${DBSVC_DIR}/language/en/usage.txt" > $TMPFILE
|
|
else
|
|
cat "${DBSVC_DIR}/language/en/usage.txt" > $TMPFILE
|
|
fi
|
|
|
|
cat $TMPFILE | sed -e "s/${FV}/`get_full_version`/" | sed -e "s/${MJR}/`get_major_version`/"
|
|
rm -f $TMPFILE
|
|
|
|
[ "F$1" = "F-?" ] && exit 0
|
|
exit 1
|
|
}
|
|
|
|
echobanner()
|
|
############
|
|
{
|
|
[ ${QUIET:-0} -ne 0 ] && return ;
|
|
|
|
output_msg "$BANNER `get_full_version`"
|
|
}
|
|
|
|
deleteservice()
|
|
###############
|
|
{
|
|
echobanner
|
|
CWD=`pwd`;
|
|
cd ${SVCDIR}
|
|
|
|
if [ -r $SVCNAME_PFX$SERVICENAME ]; then
|
|
if not cui_ask_y_n "${PRMPT_DELETE}" "N" ; then
|
|
exit 0
|
|
fi
|
|
|
|
stopservice >/dev/null 2>/dev/null
|
|
disableservice
|
|
rm -f $SVCNAME_PFX$SERVICENAME
|
|
dbsvc_iface_checkdeletedsvc
|
|
|
|
else
|
|
output_msg "${INF_NOSERVICENAME}" # $SERVICENAME
|
|
fi
|
|
|
|
cd $CWD
|
|
}
|
|
|
|
detailservice()
|
|
###############
|
|
{
|
|
echobanner
|
|
CWD=`pwd`;
|
|
cd ${SVCDIR}
|
|
|
|
local output
|
|
if [ -r $SVCNAME_PFX$SERVICENAME ]; then
|
|
output=`cat $SVCNAME_PFX$SERVICENAME | grep = | grep -v TMP= | grep -v "internal use" | sort`
|
|
if [ "$LISTCMD" = "TRUE" ]; then
|
|
output=`echo "$output" | grep -v INPUTCMD=`
|
|
output="$output"$'\n'$'\n'
|
|
output="$output"`cat $SVCNAME_PFX$SERVICENAME | grep INPUTCMD`
|
|
fi
|
|
echo "$output"
|
|
else
|
|
output_msg "${INF_NOSERVICENAME}" # $SERVICENAME
|
|
fi
|
|
cd $CWD
|
|
}
|
|
|
|
listservices()
|
|
##############
|
|
{
|
|
SNAME=""
|
|
echobanner
|
|
CWD=`pwd`;
|
|
cd ${SVCDIR};
|
|
|
|
for j in `ls ${SVCNAME_PFX}* 2>/dev/null `; do
|
|
SNAME=`echo $j | awk -F "$SVCNAME_PFX" '{ print $2 }'`
|
|
echo $SNAME
|
|
if [ "$LISTCMD" = "TRUE" ]; then
|
|
cat $j | grep INPUTCMD
|
|
fi
|
|
done
|
|
if [ "$SNAME" = "" ]; then
|
|
output_msg "${INF_NOSERVICE}"
|
|
fi
|
|
cd $CWD
|
|
}
|
|
|
|
startservice()
|
|
##############
|
|
{
|
|
I="$PREFIX"$SERVICENAME
|
|
if [ -r "$I" ]; then
|
|
$I start
|
|
else
|
|
output_msg "${INF_NOSERVICENAME}" # $SERVICENAME
|
|
fi
|
|
}
|
|
|
|
stopservice()
|
|
#############
|
|
{
|
|
I="$PREFIX"$SERVICENAME
|
|
if [ -r "$I" ]; then
|
|
$I stop
|
|
else
|
|
output_msg "${INF_NOSERVICENAME}" # $SERVICENAME
|
|
fi
|
|
}
|
|
|
|
statusservice()
|
|
###############
|
|
{
|
|
I="$PREFIX"$SERVICENAME
|
|
if [ -r "$I" ]; then
|
|
$I status
|
|
else
|
|
output_msg "${INF_NOSERVICENAME}" # $SERVICENAME
|
|
fi
|
|
}
|
|
|
|
echoconfiginfo()
|
|
################
|
|
{
|
|
local RUNLEVELS=`echo $RUNLEVEL | sed 's/[0-9]/& /g'`
|
|
local STOPLEVELS=`echo $RUNLEVELS , 0 1 2 3 4 5 6 | sed 's@ @\n@g' | sort | uniq -u | sed 's@,@S@'`
|
|
STOPLEVELS=`echo $STOPLEVELS`
|
|
local SYS_DEP_SERVICES="\$local_fs \$network"
|
|
if is_redhat; then
|
|
SYS_DEP_SERVICES="$SYS_DEP_SERVICES \$NetworkManager"
|
|
fi
|
|
local DEP_SERVICES=`echo $SYS_DEP_SERVICES $DEP_SERVICES | sed 's@ @\n@g' | sort | uniq`
|
|
DEP_SERVICES=`echo $DEP_SERVICES`
|
|
|
|
local PROVIDES=SQLAnywhere_$DBSVC_TYPE_$SERVICENAME
|
|
local DESCRIPTION="Start/Stop $PROVIDES service"
|
|
|
|
echo "#!/bin/bash" >$PREFIX$SERVICENAME;
|
|
echo "" >>$PREFIX$SERVICENAME;
|
|
echo "# In case we are being run from another service, set some stock paths">>$PREFIX$SERVICENAME;
|
|
|
|
echo "PATH=\"/bin:/sbin:/usr/bin:/usr/sbin:/opt/usr/bin:/opt/usr/sbin:/usr/local/bin:/usr/local/sbin\"" >>$PREFIX$SERVICENAME;
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo "# ${CPYRIGHT1}">>$PREFIX$SERVICENAME;
|
|
echo "# ${CPYRIGHT2}">>$PREFIX$SERVICENAME;
|
|
echo "# ${CPYRIGHT3}">>$PREFIX$SERVICENAME;
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
if [ ${HAS_CHKCONFIG:-0} -ne 0 ]; then
|
|
echo "# $PROVIDES $DESCRIPTION" >>$PREFIX$SERVICENAME;
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo "# chkconfig: $RUNLEVEL 20 80" >>$PREFIX$SERVICENAME;
|
|
fi
|
|
echo "### BEGIN INIT INFO " >>$PREFIX$SERVICENAME;
|
|
echo "# Provides: $PROVIDES" >>$PREFIX$SERVICENAME;
|
|
echo "# Required-Start: $DEP_SERVICES" >>$PREFIX$SERVICENAME;
|
|
echo "# Required-Stop: $DEP_SERVICES" >>$PREFIX$SERVICENAME;
|
|
echo "# Default-Start: $RUNLEVELS" >>$PREFIX$SERVICENAME;
|
|
echo "# Default-Stop: $STOPLEVELS" >>$PREFIX$SERVICENAME;
|
|
echo "# Description: $DESCRIPTION" >>$PREFIX$SERVICENAME;
|
|
echo "### END INIT INFO " >>$PREFIX$SERVICENAME;
|
|
echo "" >>$PREFIX$SERVICENAME;
|
|
echo "# Source function library.">>$PREFIX$SERVICENAME;
|
|
echo ". $INIT_FUNCS">>$PREFIX$SERVICENAME;
|
|
echo "" >>$PREFIX$SERVICENAME;
|
|
|
|
chmod u+x $PREFIX$SERVICENAME
|
|
if [ "$STARTUP" = "Automatic" ]; then
|
|
enableservice
|
|
fi
|
|
}
|
|
|
|
enableservice()
|
|
###############
|
|
{
|
|
dbsvc_iface_installsvc
|
|
}
|
|
|
|
disableservice()
|
|
################
|
|
{
|
|
dbsvc_iface_uninstallsvc
|
|
}
|
|
|
|
createservice()
|
|
###############
|
|
{
|
|
echobanner
|
|
if [ -r $PREFIX$SERVICENAME ] ; then
|
|
if not cui_ask_y_n "${PRMPT_OVERWRITE}" "N" ; then
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
output_msg ${INF_CREATING} # $SERVICENAME $PREFIX$SERVICENAME
|
|
|
|
rm -f $PREFIX$SERVICENAME
|
|
|
|
# write service header
|
|
echoconfiginfo
|
|
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo "# Set up SQL Anywhere environment (PATH, LIBPATH, etc.)" >>$PREFIX$SERVICENAME;
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo ". $SQLANYDIR/$BIN/sa_config.sh >/dev/null 2>&1" >>$PREFIX$SERVICENAME;
|
|
echo "" >>$PREFIX$SERVICENAME;
|
|
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo "# Set up script variables" >>$PREFIX$SERVICENAME;
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo "unset SATMP" >>$PREFIX$SERVICENAME;
|
|
echo "[ -z \"\$TMP\" ] && TMP=/tmp/.SQLAnywhere" >>$PREFIX$SERVICENAME;
|
|
echo "ACCOUNT=$ACCOUNT" >>$PREFIX$SERVICENAME;
|
|
echo "BIN=$BIN" >>$PREFIX$SERVICENAME;
|
|
echo "BITNESS=$BITNESS" >>$PREFIX$SERVICENAME;
|
|
echo "DBSVC_TYPE=$DBSVC_TYPE" >>$PREFIX$SERVICENAME;
|
|
echo "INPUTCMD=\"dbsvc $INPUTCMD\"">>$PREFIX$SERVICENAME
|
|
echo "PIDFILE=$PIDFILE" >>$PREFIX$SERVICENAME;
|
|
echo "PRIORITY=$PRIORITY" >>$PREFIX$SERVICENAME;
|
|
echo "RUNLEVEL=$RUNLEVEL" >>$PREFIX$SERVICENAME;
|
|
echo "SERVICENAME=$SERVICENAME" >>$PREFIX$SERVICENAME;
|
|
echo "SQLANYDIR=$SQLANYDIR" >>$PREFIX$SERVICENAME;
|
|
echo "STARTUP=$STARTUP" >>$PREFIX$SERVICENAME;
|
|
echo "SVC_TOOL_CMDLINE=\"$SVC_TOOL_CMDLINE\" " >>$PREFIX$SERVICENAME;
|
|
echo "ODBCINI=$ODINI" >>$PREFIX$SERVICENAME;
|
|
|
|
if svc_t_has_servername; then
|
|
echo "SERVERNAME=$SERVERNAME">>$PREFIX$SERVICENAME
|
|
fi
|
|
|
|
echo "" >>$PREFIX$SERVICENAME;
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo "# get implementation of start/stop/status/restart from dbsvc" >>$PREFIX$SERVICENAME;
|
|
echo "#" >>$PREFIX$SERVICENAME;
|
|
echo "" >>$PREFIX$SERVICENAME;
|
|
echo ". $SQLANYDIR/$BIN/dbsvc RUNSERVICECMD \$*" >>$PREFIX$SERVICENAME;
|
|
chmod 755 $PREFIX$SERVICENAME
|
|
}
|
|
|
|
resolve_pidfilen()
|
|
##################
|
|
{
|
|
# compute pid file name to be used based on defined PIDFILE value
|
|
if [ "$PIDFILE" = ".use.default." ]; then
|
|
PIDFILEN=/var/run/${SVCNAME_PFX}${SERVICENAME}.pid
|
|
else
|
|
PIDFILEN=$PIDFILE
|
|
fi
|
|
}
|
|
|
|
parse_cl_options_utility()
|
|
##########################
|
|
{
|
|
if [ "F$1" = "F-?" ]; then
|
|
usage $1
|
|
fi
|
|
PIDFILE=.use.default.
|
|
INPUTCMD=$*
|
|
DONE=0
|
|
while [ $DONE -eq 0 ] && [ ! -z "$1" ]; do
|
|
case $1 in
|
|
#
|
|
# Modifier options
|
|
#
|
|
|
|
# quiet mode
|
|
-q | -quiet )
|
|
QUIET=1
|
|
;;
|
|
# display creation command
|
|
-cm )
|
|
LISTCMD=TRUE
|
|
;;
|
|
# automatically answer "yes" to overwrites/delete
|
|
-y )
|
|
AUTOYES=1
|
|
;;
|
|
|
|
#
|
|
# Major options
|
|
#
|
|
|
|
# delete service
|
|
-delete | -d )
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=deleteservice
|
|
DONE=1
|
|
|
|
# validation
|
|
if [ ! -w "${SVCDIR}" ]; then
|
|
output_fatal_error "${ERR_PERMMOD}"
|
|
fi
|
|
if [ "$SERVICENAME" = "" ]; then
|
|
output_usage_error "${ERR_NOSERVICENAME}"
|
|
fi
|
|
;;
|
|
|
|
# print details on a service
|
|
-details | -g )
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=detailservice
|
|
DONE=1
|
|
|
|
# validation
|
|
if [ "$SERVICENAME" = "" ]; then
|
|
output_usage_error "${ERR_NOSERVICENAME}"
|
|
fi
|
|
;;
|
|
|
|
# directory of services
|
|
-list | -l )
|
|
ACTION=listservices
|
|
;;
|
|
|
|
# create a service
|
|
-w | -write )
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=createservice
|
|
DONE=1
|
|
|
|
# validation
|
|
if [ "$SERVICENAME" = "" ]; then
|
|
output_usage_error "${ERR_NOSERVICENAME}"
|
|
fi
|
|
if [ "$ACCOUNT" = "" ]; then
|
|
output_usage_error "${ERR_NOACCOUNT}"
|
|
fi
|
|
if [ ! -w "${SVCDIR}" ]; then
|
|
output_fatal_error "${ERR_PERMMOD}"
|
|
fi
|
|
CHKDSH=`echo F$SERVICENAME | grep "F-"`
|
|
if [ "$CHKDSH" != "" ]; then
|
|
output_msg "${INF_WARNSVCWITHDASH}"
|
|
fi
|
|
|
|
shift
|
|
SVC_DETAILS=$*
|
|
;;
|
|
|
|
#Start SQL Anywhere Service
|
|
-u | -start)
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=startservice
|
|
DONE=1
|
|
|
|
# validation
|
|
[ ! -w "${SVCDIR}" ] && output_fatal_error "${ERR_PERMMOD}"
|
|
[ -z "$SERVICENAME" ] && output_usage_error "${ERR_NOSERVICENAME}"
|
|
;;
|
|
|
|
# Stop SQL Anywhere Service
|
|
-x | -stop )
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=stopservice
|
|
DONE=1
|
|
|
|
# validation
|
|
[ ! -w "${SVCDIR}" ] && output_fatal_error "${ERR_PERMMOD}"
|
|
;;
|
|
|
|
# status of Service
|
|
-status )
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=statusservice
|
|
DONE=1
|
|
|
|
# validation
|
|
[ -z "$SERVICENAME" ] && output_usage_error "${ERR_NOSERVICENAME}"
|
|
;;
|
|
|
|
# disable service
|
|
-disable )
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=disableservice
|
|
DONE=1
|
|
|
|
# validation
|
|
[ -z "$SERVICENAME" ] && output_usage_error "${ERR_NOSERVICENAME}"
|
|
;;
|
|
|
|
# enable service
|
|
-enable )
|
|
shift
|
|
SERVICENAME=$1
|
|
ACTION=enableservice
|
|
DONE=1
|
|
|
|
# validation
|
|
[ -z "$SERVICENAME" ] && output_usage_error "${ERR_NOSERVICENAME}"
|
|
;;
|
|
|
|
#
|
|
# Creation options
|
|
#
|
|
|
|
# local daemon account
|
|
-as )
|
|
ACCOUNT="daemon"
|
|
;;
|
|
|
|
# Run service as user account
|
|
-a | -account )
|
|
shift
|
|
ACCOUNT=$1
|
|
|
|
# validation
|
|
CHKUSER=`awk -F : '{ print $1 }' /etc/passwd | grep $ACCOUNT`
|
|
[ -z "$CHKUSER" ] && output_msg "${INF_NOUSER}"
|
|
;;
|
|
|
|
# Startup Type "Disabled does not make sense here"
|
|
# Currently not documented but is in the usage message
|
|
-startup | -s )
|
|
shift
|
|
case `tolower $1` in
|
|
auto | automatic )
|
|
STARTUP="Automatic"
|
|
;;
|
|
man | manual )
|
|
STARTUP="Manual"
|
|
RUNLEVEL=""
|
|
;;
|
|
* )
|
|
output_usage_error "${ERR_INVALIDSTARTUP}"
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
# Type could be one of the following:
|
|
# Network, Personal, DBRemote, MobiLink, DBMLSync
|
|
-t | -type )
|
|
shift
|
|
case `tolower $1` in
|
|
personal | standalone | dbeng )
|
|
DBSVC_TYPE="Personal"
|
|
;;
|
|
network | dbsrv )
|
|
DBSVC_TYPE="Network"
|
|
;;
|
|
mobilink | mlsrv )
|
|
DBSVC_TYPE="MobiLink"
|
|
;;
|
|
dbmlsync | mlsync )
|
|
DBSVC_TYPE="DBMLsync"
|
|
;;
|
|
dbremote )
|
|
DBSVC_TYPE="DBRemote"
|
|
;;
|
|
*)
|
|
if [ -r "${DBSVC_DIR}/dbsvc_scripts/svc_t_`tolower $1`" ] && [ "$1" != "common" ]; then
|
|
DBSVC_TYPE="$1"
|
|
else
|
|
output_usage_error "${ERR_INVALIDTYPE}"
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
#
|
|
# Linux-specific options
|
|
#
|
|
|
|
#Set nice priority of service
|
|
-pr | -priority )
|
|
shift
|
|
PRIORITY=$1
|
|
;;
|
|
|
|
#ODBCINI specification
|
|
-od | -odbcini )
|
|
shift
|
|
ODINI=$1
|
|
;;
|
|
|
|
# Specify run level for service upon start up.
|
|
-rl | -runlevel )
|
|
shift
|
|
RUNLEVEL=$1
|
|
;;
|
|
|
|
# Groups may not make sense here daemon does not seem to support it.
|
|
# set dependencies
|
|
# "$DEP_SERVICES" is echoed out in the Required-Start line
|
|
# NOTE: must specify 1 dependent service per -rs switch (not a list)
|
|
-rs )
|
|
shift
|
|
DEP_SERVICE=$1
|
|
|
|
# validation
|
|
[ -z "$DEP_SERVICE" ] && output_usage_error "${ERR_NOSERVICENAME}"
|
|
if [ ! -r "$SVCDIR/$DEPSVC" ]; then
|
|
local TDEPSVC=$PREFIX$DEPSVC
|
|
if [ ! -r "$SVCDIR/$TDEPSVC" ]; then
|
|
output_msg "${INF_WARNINGDEPENDENT}"
|
|
else
|
|
DEP_SERVICE=$TDEPSVC
|
|
fi
|
|
fi
|
|
|
|
# old way to check for dependent service
|
|
# CWD=`pwd`
|
|
# cd $SVCDIR
|
|
# FIND_DEPSVC=`grep "#" $DEP_SERVICE`
|
|
# [ -z "$FIND_DEPSVC" ] && output_msg "${INF_WARNINGDEPENDENT}"
|
|
# cd $CWD
|
|
|
|
# put a '$' before (looks like each) service name
|
|
# "$" before a service name refers to a group of services that comprise the pseudo name. These are defined in /etc/insserv.conf.
|
|
# See http://www.novell.com/support/kb/doc.php?id=7002295
|
|
DEP_SERVICE="\$"`echo $DEP_SERVICE`
|
|
DEP_SERVICES=`echo $DEP_SERVICES $DEP_SERVICE | sed 's@ @\n@g' | sort | uniq`
|
|
DEP_SERVICES=`echo $DEP_SERVICES`
|
|
;;
|
|
|
|
# pidfile specification
|
|
-pf | -pidfile )
|
|
PIDFILE=.use.default.
|
|
;;
|
|
|
|
-pfn | -pidfilename )
|
|
shift
|
|
PIDFILE=$1
|
|
;;
|
|
|
|
-pf- | -pidfile- )
|
|
PIDFILE=
|
|
;;
|
|
|
|
# All else is an error
|
|
* )
|
|
echo "${ERR_UNRECOGNIZED_OPTION}" $1
|
|
usage
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
# some validation of ODINI here, now that we know $ACCOUNT too
|
|
if [ "$ACTION" = "createservice" ]; then
|
|
# check if they specified a DSN
|
|
local hasDSN=`echo $INPUTCMD | grep -i dsn=`
|
|
if [ "$hasDSN" != "" ]; then
|
|
if [ -z "$ODINI" ]; then
|
|
ODINI=`grep -e ^$ACCOUNT /etc/passwd | awk -F : '{print $6"/.odbc.ini"}'`
|
|
fi
|
|
[ ! -r "$ODINI" ] && output_msg "${INF_NOODBCINIEXIST}"
|
|
fi
|
|
fi
|
|
|
|
resolve_pidfilen
|
|
}
|
|
|
|
#
|
|
#
|
|
# mainline
|
|
#
|
|
#
|
|
|
|
# Determine whether we are being called from a service script ("svc" mode)
|
|
# or whether we are being run to manage services ("utility" mode)
|
|
init
|
|
if [ "$1" = "RUNSERVICECMD" ]; then
|
|
MODE=svc
|
|
shift
|
|
resolve_pidfilen
|
|
else
|
|
MODE=utility
|
|
fi
|
|
init_${MODE}
|
|
|
|
# validate that we found the SQLANYDIR; otherwise, we can't load our language
|
|
# resources, scripts, etc.
|
|
if [ -z "$SQLANYDIR" ]; then
|
|
echo "Error: SQL Anywhere environment \$SQLANY16 not set."
|
|
exit 1
|
|
fi
|
|
|
|
. "${DBSVC_DIR}/dbsvc_scripts/distro.sh"
|
|
. "${DBSVC_DIR}/dbsvc_scripts/utility.sh"
|
|
. "${DBSVC_DIR}/dbsvc_scripts/dbsvc_iface"
|
|
. "${DBSVC_DIR}/dbsvc_scripts/svc_t_common"
|
|
. "${DBSVC_DIR}/dbsvc_scripts/svc_functions"
|
|
|
|
load_language_file
|
|
check_os_requirements # test that service functions are available
|
|
check_tool_requirements # sed, grep, awk, tr, tail, etc.
|
|
|
|
# Pull in the LSB init functions
|
|
. $INIT_FUNCS
|
|
|
|
# This call will figure out which service interface we are using with the OS (lsb, rh, suse)
|
|
# can override by passing a parameter lsb|rh|suse
|
|
dbsvc_iface_init
|
|
|
|
# The following sets the following global variables:
|
|
# * means that they are written out to the service script as well
|
|
# *ACCOUNT (daemon, or user account)
|
|
# *DBSVC_TYPE (Personal, Network, etc...)
|
|
# *INPUTCMD (original cmd line sent to dbsvc)
|
|
# *PIDFILE (full pathname to pidfile if requested, empty otherwise)
|
|
# *ODINI (ODBCINI specification)
|
|
# *PRIORITY (nice priority of service)
|
|
# *RUNLEVEL (Specify run level for service upon start up)
|
|
# *SERVICENAME (name of service being operated on)
|
|
# *STARTUP (Manual|Automatic)
|
|
# ACTION (action to take)
|
|
# DEP_SERVICES (echoed out in the Required-Start line)
|
|
# LISTCMD (display creation command TRUE|FALSE)
|
|
# AUTOYES (pre-confirm overwrite/delete 1|0)
|
|
# QUIET (quiet mode 1|0)
|
|
# SVC_DETAILS (when creating a service, the command line to be passed to the tool)
|
|
#
|
|
# Note that the following are written out to the service script as well
|
|
# *SVC_TOOL_CMDLINE
|
|
# *SERVERNAME (if applicable)
|
|
# *SQLANYDIR
|
|
# *ODBCINI (exported)
|
|
|
|
parse_cl_options_${MODE} $*
|
|
|
|
# some validation here
|
|
[ -z "$ACTION" ] && output_usage_error "${INF_NOACTION}"
|
|
|
|
# get interface to tool based on DBSVC_TYPE, and initialize it
|
|
svc_t_iface_init ${DBSVC_TYPE}
|
|
|
|
if [ "$MODE" = "utility" ] && [ "$ACTION" = "createservice" ]; then
|
|
# Warn if the tool is not found
|
|
svc_t_checkbinary
|
|
|
|
# give a hook for the tools to modify their cmdline at creation time
|
|
# (eg. for SA, add -ud if not there)
|
|
SVC_TOOL_CMDLINE=`svc_t_process_cmdline $SVC_DETAILS` ## from svc_t_<tool> script above
|
|
|
|
# some tools have the concept of a server name - if so set $SERVERNAME
|
|
if svc_t_has_servername; then
|
|
SERVERNAME=`svc_t_process_servername $SVC_DETAILS`
|
|
fi
|
|
fi
|
|
|
|
# call the appropriate function to do the work
|
|
$ACTION
|
|
|