]> granicus.if.org Git - sudo/commitdiff
sync with git version
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 14 Jan 2011 19:33:42 +0000 (14:33 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 14 Jan 2011 19:33:42 +0000 (14:33 -0500)
--HG--
branch : 1.7

pp

diff --git a/pp b/pp
index 206d0b1e1c5fa6c95ee9c33860741b81ca700775..6d622d4e1f5d83c04ccfc5e0aa8dc61dca889b49 100755 (executable)
--- a/pp
+++ b/pp
@@ -1,6 +1,6 @@
 #!/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
@@ -3056,19 +3056,11 @@ pp_backend_solaris () {
         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" &&
@@ -3320,12 +3312,12 @@ pp_backend_solaris_function() {
 }
 
 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=
@@ -3343,40 +3335,116 @@ pp_solaris_init_svc () {
 }
 
 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>
 .
 }
 
@@ -3447,15 +3515,13 @@ pp_solaris_make_service_group () {
 .
 }
 
-
 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
@@ -3466,12 +3532,12 @@ pp_solaris_make_service () {
     #-- 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"
@@ -3479,20 +3545,20 @@ if [ -x /usr/sbin/svcadm ] && [ "x\$1" != "xstatus" ] && [ "t\$QUEST_SMF_SERVICE
             ;;
         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
@@ -3601,11 +3667,32 @@ _EOF
 .
 }
 
+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
@@ -3616,37 +3703,37 @@ 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 '