#!/bin/sh
-# (c) 2010 Quest Software, Inc. All rights reserved
-pp_revision="300"
+# (c) 2011 Quest Software, Inc. All rights reserved
+pp_revision="301"
# Copyright 2010 Quest Software, Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
test -n "$pp_services" &&
for _svc in $pp_services; do
pp_load_service_vars $_svc
+ pp_solaris_smf $_svc
pp_solaris_make_service $_svc
pp_solaris_install_service $_svc | pp_prepend $pp_wrkdir/postinstall
- pp_prepend $pp_wrkdir/preremove <<-.
- /etc/init.d/$_svc stop >/dev/null 2>/dev/null
- # Remove the service from SMF if present
- if [ "x${PKG_INSTALL_ROOT}" = 'x' ]; then
- if [ -x /usr/sbin/svcadm ] ; then
- # Likely un-needed, but just in case.
- /usr/sbin/svcadm disable -s $_svc 2>/dev/null
- /usr/sbin/svccfg delete $_svc 2>/dev/null
- fi
- fi
-.
+ pp_solaris_remove_service $_svc | pp_prepend $pp_wrkdir/preremove
+ unset pp_svc_xml_file
done
test -n "$pp_service_groups" &&
}
pp_backend_solaris_init_svc_vars () {
- pp_solaris_smf_category=
+ _smf_category=${pp_solaris_smf_category:-application}
+ _smf_method_envvar_name=${smf_method_envvar_name:-"PP_SMF_SERVICE"}
pp_solaris_service_shell=/sbin/sh
}
pp_solaris_init_svc () {
- smf_category=${pp_solaris_smf_category:-application}
smf_version=1
smf_type=service
solaris_user=
}
pp_solaris_smf () {
- typeset f
- f=/var/svc/manifest/$smf_category/$1
+ typeset f _pp_solaris_service_script svc _pp_solaris_manpage
+
+ pp_solaris_name=${pp_solaris_name:-$name}
+ pp_solaris_manpath=${pp_solaris_manpath:-"/usr/share/man"}
+ smf_start_timeout=${smf_start_timeout:-60}
+ smf_stop_timeout=${smf_stop_timeout:-60}
+ smf_restart_timeout=${smf_restart_timeout:-60}
+
+ svc=${pp_solaris_smf_service_name:-$1}
+ _pp_solaris_service_script=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
+ _pp_solaris_manpage=${pp_solaris_manpage:-$pp_solaris_smf_service_name}
+
+ if [ -z $pp_svc_xml_file ]; then
+ pp_svc_xml_file="/var/svc/manifest/$_smf_category/$svc.xml"
+ echo "## Generating the smf service manifest file for $pp_svc_xml_file"
+ else
+ echo "## SMF service manifest file already defined at $pp_svc_xml_file"
+ if [ -z $pp_solaris_smf_service_name ] || [ -z $pp_solaris_smf_category ] || [ -z $pp_solaris_service_script ] || [ -z $smf_method_envvar_name ]; then
+ pp_error "All required variables are not set.\n"\
+ "When using a custom manifest file all of the following variables must be set:\n"\
+ "pp_solaris_smf_service_name, pp_solaris_smf_category, pp_solaris_service_script and smf_method_envvar_name.\n\n"\
+ "Example:\n"\
+ " \$pp_solaris_smf_category=application\n"\
+ " \$pp_solaris_smf_service_name=pp\n\n"\
+ " <service name='application/pp' type='service' version='1'>\n\n"\
+ "Example:\n"\
+ " \$pp_solaris_service_script=/etc/init.d/pp\n\n"\
+ " <exec_method type='method' name='start' exec='/etc/init.d/pp' />\n\n"\
+ "Example:\n"\
+ " \$smf_method_envvar_name=PP_SMF_SERVICE\n\n"\
+ " <method_environment>\n"\
+ " <envvar name='PP_SMF_SERVICE' value='1'/>\n"\
+ " </method_environment>\n"
+
+ return 1
+ fi
+ return 0
+ fi
+
+ f=$pp_svc_xml_file
pp_add_file_if_missing $f ||
return 0
- cat <<-. >$pp_destdir$f
- <?xml version="1.0"?>
- <!--
- $copyright
- Generated by PolyPackage $pp_version
- -->
-
- <service name='$smf_category/$1'
- type='$smf_type'
- version='$smf_version'>
-
- <single_instance />
-
- <exec_method type='method' name='start'
- exec=''
- timeout_seconds='60'>
- <method_context>
- <method_credential user='${solaris_user:-$user}' />
- </method_context>
- </exec>
-
- <exec_method type='method' name='stop'
- exec=':kill -${solaris_stop_signal:-$stop_signal}'>
- <method_context>
- <method_credential user='${solaris_user:-$user}' />
- </method_context>
- </exec>
+ _pp_solaris_smf_dependencies="
+ <dependency name='pp_local_filesystems'
+ grouping='require_all'
+ restart_on='none'
+ type='service'>
+ <service_fmri value='svc:/system/filesystem/local'/>
+ </dependency>
+
+ <dependency name='pp_single-user'
+ grouping='require_all'
+ restart_on='none'
+ type='service'>
+ <service_fmri value='svc:/milestone/single-user' />
+ </dependency>
+"
+ _pp_solaris_smf_dependencies=${pp_solaris_smf_dependencies:-$_pp_solaris_smf_dependencies}
+ cat <<-. >$pp_destdir$f
+<?xml version="1.0"?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ $copyright
+ Generated by PolyPackage $pp_version
+-->
+
+ <service_bundle type='manifest' name='${pp_solaris_name}:${svc}' >
+ <service name='$_smf_category/$svc'
+ type='$smf_type'
+ version='$smf_version'>
+
+ <create_default_instance enabled='false'/>
+
+ <single_instance />
+
+ $_pp_solaris_smf_dependencies
+
+ $pp_solaris_smf_additional_dependencies
+
+ <method_context>
+ <method_credential user='${solaris_user:-$user}' />
+ <method_environment>
+ <envvar name='$_smf_method_envvar_name' value='1'/>
+ </method_environment>
+ </method_context>
+
+ <exec_method type='method' name='start'
+ exec='$_pp_solaris_service_script start'
+ timeout_seconds='$smf_start_timeout' />
+
+ <exec_method type='method' name='stop'
+ exec='$_pp_solaris_service_script stop'
+ timeout_seconds='$smf_stop_timeout' />
+
+ <exec_method type='method' name='restart'
+ exec='$_pp_solaris_service_script restart'
+ timeout_seconds='$smf_restart_timeout' />
+
+ <template>
+ <common_name>
+ <loctext xml:lang='C'>$description</loctext>
+ </common_name>
+ <documentation>
+ <manpage title='$pp_solaris_manpage' section='1' manpath='$pp_solaris_manpath'/>
+ </documentation>
+ </template>
</service>
+ </service_bundle>
.
}
.
}
-
pp_solaris_make_service () {
typeset file out _cmd svc
- svc="$1"
- file="/etc/init.d/$svc"
+ svc="${pp_solaris_smf_service_name:-$1}"
+ file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
out="$pp_destdir$file"
-
#-- return if we don't need to create the init script
pp_add_file_if_missing "$file" run 755 ||
return 0
#-- Start SMF integration.
if [ -n "$pp_svc_xml_file" ] ; then
cat <<_EOF >>$out
-if [ -x /usr/sbin/svcadm ] && [ "x\$1" != "xstatus" ] && [ "t\$QUEST_SMF_SERVICE" = "t" ] ; then
+if [ -x /usr/sbin/svcadm ] && [ "x\$1" != "xstatus" ] && [ "t\$$_smf_method_envvar_name" = "t" ] ; then
case "\$1" in
start)
echo "starting $svc"
- /usr/sbin/svcadm clear svc:/quest/$svc:default >/dev/null 2>&1
- /usr/sbin/svcadm enable -s quest/$svc
+ /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
+ /usr/sbin/svcadm enable -s $_smf_category/$svc
RESULT=\$?
if [ "\$RESULT" -ne 0 ] ; then
echo "Error \$RESULT starting $svc"
;;
stop)
echo "stopping $svc"
- /usr/sbin/svcadm disable -ts quest/$svc
+ /usr/sbin/svcadm disable -ts $_smf_category/$svc
;;
restart)
echo "restarting $svc"
- /usr/sbin/svcadm disable -ts quest/$svc
- /usr/sbin/svcadm clear svc:/quest/$svc:default >/dev/null 2>&1
- /usr/sbin/svcadm enable -s quest/$svc
+ /usr/sbin/svcadm disable -ts $_smf_category/$svc
+ /usr/sbin/svcadm clear svc:/$_smf_category/$svc:default >/dev/null 2>&1
+ /usr/sbin/svcadm enable -s $_smf_category/$svc
RESULT=\$?
if [ "\$RESULT" -ne 0 ] ; then
echo "Error \$RESULT starting $svc"
fi
;;
*)
- echo "Usage: /etc/init.d/$svc {start|stop|restart|status}"
+ echo "Usage: $file {start|stop|restart|status}"
exit 1
esac
exit 0
.
}
+pp_solaris_remove_service () {
+ typeset file svc
+
+ svc="${pp_solaris_smf_service_name:-$1}"
+ file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
+
+ echo '
+'$file' stop >/dev/null 2>/dev/null
+if [ "x${PKG_INSTALL_ROOT}" = 'x' ]; then
+ if [ -x /usr/sbin/svcadm ] ; then
+ # Likely un-needed, but just in case.
+ /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
+ /usr/sbin/svccfg delete '$svc' 2>/dev/null
+ fi
+fi
+ '
+}
pp_solaris_install_service () {
- typeset s k l
- s="${solaris_sysv_init_start}$1"
- k="${solaris_sysv_init_kill}$1"
+ typeset s k l file svc
+
+ svc="${pp_solaris_smf_service_name:-$1}"
+ file=${pp_solaris_service_script:-"/etc/init.d/${pp_solaris_service_script_name:-$svc}"}
+
+ s="${solaris_sysv_init_start}$svc"
+ k="${solaris_sysv_init_kill}$svc"
echo '
if [ "x${PKG_INSTALL_ROOT}" != "x" ]; then
for state in ${solaris_sysv_init_start_states}; do
l="/etc/rc$state.d/$s"
echo "echo '$l'"
- echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+ echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
pp_solaris_space /etc/rc$state.d 0 1
done
test -n "${solaris_sysv_init_kill_states}" &&
for state in ${solaris_sysv_init_kill_states}; do
l="/etc/rc$state.d/$k"
echo "echo '$l'"
- echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+ echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
pp_solaris_space /etc/rc$state.d 0 1
done
echo '
fi
else
if [ -x /usr/sbin/svcadm ]; then
- echo "Registering '$1' with SMF"
- /usr/sbin/svcadm disable -s '$1' 2>/dev/null
- /usr/sbin/svccfg delete '$1' 2>/dev/null
- /usr/sbin/svccfg import '$pp_svc_xml_file' 2>/dev/null
+ echo "Registering '$svc' with SMF"
+ /usr/sbin/svcadm disable -s '$svc' 2>/dev/null
+ /usr/sbin/svccfg delete '$svc' 2>/dev/null
+ /usr/sbin/svccfg import '$pp_svc_xml_file'
else'
test -n "${solaris_sysv_init_start_states}" &&
for state in ${solaris_sysv_init_start_states}; do
l="/etc/rc$state.d/$s"
echo "echo '$l'"
- echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+ echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
pp_solaris_space /etc/rc$state.d 0 1
done
test -n "${solaris_sysv_init_kill_states}" &&
for state in ${solaris_sysv_init_kill_states}; do
l="/etc/rc$state.d/$k"
echo "echo '$l'"
- echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=../init.d/$1 s"
+ echo "installf -c run \$PKGINST \$PKG_INSTALL_ROOT$l=$file s"
pp_solaris_space /etc/rc$state.d 0 1
done
echo '