~ubuntu-branches/ubuntu/utopic/gridengine/utopic

« back to all changes in this revision

Viewing changes to source/dist/util/sgeSMF/sge_smf_support.sh

  • Committer: Bazaar Package Importer
  • Author(s): Mark Hymers
  • Date: 2008-06-25 22:36:13 UTC
  • Revision ID: james.westby@ubuntu.com-20080625223613-tvd9xlhuoct9kyhm
Tags: upstream-6.2~beta2
ImportĀ upstreamĀ versionĀ 6.2~beta2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh
 
2
#
 
3
# Sun Grid Engine SMF support script
 
4
#
 
5
#___INFO__MARK_BEGIN__
 
6
##########################################################################
 
7
#
 
8
#  The Contents of this file are made available subject to the terms of
 
9
#  the Sun Industry Standards Source License Version 1.2
 
10
#
 
11
#  Sun Microsystems Inc., March, 2001
 
12
#
 
13
#
 
14
#  Sun Industry Standards Source License Version 1.2
 
15
#  =================================================
 
16
#  The contents of this file are subject to the Sun Industry Standards
 
17
#  Source License Version 1.2 (the "License"); You may not use this file
 
18
#  except in compliance with the License. You may obtain a copy of the
 
19
#  License at http://gridengine.sunsource.net/Gridengine_SISSL_license.html
 
20
#
 
21
#  Software provided under this License is provided on an "AS IS" basis,
 
22
#  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 
23
#  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 
24
#  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 
25
#  See the License for the specific provisions governing your rights and
 
26
#  obligations concerning the Software.
 
27
#
 
28
#  The Initial Developer of the Original Code is: Sun Microsystems, Inc.
 
29
#
 
30
#  Copyright: 2001 by Sun Microsystems, Inc.
 
31
#
 
32
#  All Rights Reserved.
 
33
#
 
34
##########################################################################
 
35
#___INFO__MARK_END__
 
36
 
 
37
#TODO:
 
38
#1 - Do not match case QMaster = qmaster
 
39
#2 - Need to get the host where we will install the service. Problem root on remote host?
 
40
 
 
41
#---------------------------------------------------------------------------
 
42
# This script requires the that $SGE_ROOT and $SGE_CELL be set
 
43
#
 
44
 
 
45
SVCADM="/usr/sbin/svcadm"
 
46
SVCCFG="/usr/sbin/svccfg"
 
47
SVCS="/usr/bin/svcs"
 
48
CAT=cat
 
49
SED=sed
 
50
 
 
51
SGE_SMF_SUPPORT_SOURCED=true
 
52
 
 
53
if [ -z "$SGE_ROOT" -o -z "$SGE_CELL" ]; then
 
54
   if [ -z "$INFOTEXT" ]; then
 
55
      INFOTEXT=echo
 
56
   fi
 
57
   $INFOTEXT "\$SGE_ROOT and \$SGE_CELL must be set!"
 
58
   exit 2
 
59
fi
 
60
 
 
61
#Standalone setup (Warning: Overwrites inst_sge settings)
 
62
if [ -z "$QMASTER" -a -z "$EXECD" -a -z "$SHADOW" -a -z "$BERKELEY" -a -z "$DBWRITER" ]; then
 
63
   MKDIR=mkdir
 
64
   TOUCH=touch
 
65
   CHMOD=chmod
 
66
   RM="rm -f"
 
67
        
 
68
   SGE_ARCH=`$SGE_ROOT/util/arch`
 
69
   SGE_UTILBIN="$SGE_ROOT/utilbin/$SGE_ARCH"
 
70
        
 
71
   . $SGE_ROOT/util/install_modules/inst_common.sh
 
72
        
 
73
   GetAdminUser
 
74
   #Setup INFOTEXT
 
75
   if [ -z "$INFOTEXT" ]; then
 
76
      INFOTEXT=$SGE_ROOT/utilbin/$SGE_ARCH/infotext
 
77
      if [ ! -x $INFOTEXT ]; then
 
78
         echo "Error: Can't find binary \"$INFOTEXT\""
 
79
         echo "Please verify your setup and restart this script. Exit."
 
80
         exit 2
 
81
      fi
 
82
 
 
83
      # Test the infotext binary
 
84
      tmp=`$INFOTEXT test 2>&1`
 
85
      if [ $? -ne 0 ]; then
 
86
         echo "Error: Execution of $INFOTEXT failed: $tmp"
 
87
         echo "Please verify your setup and restart this script. Exit."
 
88
         exit 2
 
89
      fi
 
90
      SGE_INFOTEXT_MAX_COLUMN=5000; export SGE_INFOTEXT_MAX_COLUMN
 
91
   fi
 
92
fi
 
93
 
 
94
#---------------------------------------------------------------------------
 
95
# Show the usage of the standalone command
 
96
SMFusage()
 
97
{
 
98
   $INFOTEXT "Usage: sge_smf <command>"
 
99
   $INFOTEXT ""
 
100
   $INFOTEXT "Commands:"
 
101
   $INFOTEXT "   register      qmaster|shadowd|execd|bdb|dbwriter [SGE_CLUSTER_NAME]"
 
102
   $INFOTEXT "                 ... register SGE as SMF service"
 
103
   $INFOTEXT "   unregister    qmaster|shadowd|execd|bdb|dbwriter [SGE_CLUSTER_NAME]"
 
104
   $INFOTEXT "                 ... unregister SGE SMF service"
 
105
   $INFOTEXT "   supported     ... check if the SMF can be used on current host"
 
106
   $INFOTEXT "   help          ... this help"
 
107
   $INFOTEXT "\n"
 
108
   $INFOTEXT "SGE_CLUSTER_NAME ... name of this cluster (installation), used as instance name in SMF"
 
109
   $INFOTEXT "                     CAN be omitted if defined as an environment variable"
 
110
   $INFOTEXT "                     MUST be the same as you entered during the installation"
 
111
}
 
112
 
 
113
#-------------------------------------------------------------------------
 
114
# SMFImportService: Import service descriptor
 
115
#
 
116
SMFImportService() 
 
117
{
 
118
   file="$1"
 
119
   SMFValidateContent $file
 
120
   res="$?"
 
121
   if [ "$res" != 0 ]; then
 
122
      $INFOTEXT "Service descriptor %s is corrupted, exiting!" $file
 
123
      return 1
 
124
   fi
 
125
   #Strangely svccfg import does not return non-zero exit code if there was 
 
126
   #an error such as permission denied
 
127
   res=`$SVCCFG import $file 2>&1 | head -1`
 
128
   if [ -n "$res" ]; then      
 
129
      $INFOTEXT "%s" $res
 
130
      $INFOTEXT "Importing service was NOT successful!"
 
131
      return 1
 
132
   fi
 
133
}
 
134
 
 
135
#-------------------------------------------------------------------------
 
136
# SMFValidateContent: Validate service descriptor
 
137
#
 
138
SMFValidateContent()
 
139
{
 
140
   return `$SVCCFG validate "$1"`
 
141
}
 
142
 
 
143
#-------------------------------------------------------------------------
 
144
# SMFReplaceXMLTemplateValues: replace variables
 
145
#
 
146
SMFReplaceXMLTemplateValues()
 
147
{
 
148
   file="$1"
 
149
   ExecuteAsAdmin $TOUCH $file.tmp
 
150
   ExecuteAsAdmin $CHMOD 666 $file.tmp
 
151
   $CAT $template_file > $file.tmp
 
152
   #Replace SGE_ROOT
 
153
   $SED -e "s|@@@CLUSTER_NAME@@@|$SGE_CLUSTER_NAME|g" \
 
154
        -e "s|@@@SGE_ROOT@@@|$SGE_ROOT|g" \
 
155
        -e "s|@@@SGE_CELL@@@|$SGE_CELL|g" \
 
156
        -e "s|@@@SGE_QMASTER_PORT@@@|$SGE_QMASTER_PORT|g" \
 
157
        -e "s|@@@SGE_EXECD_PORT@@@|$SGE_EXECD_PORT|g" \
 
158
        -e "s|@@@BDB_DEPENDENCY@@@|$BDB_DEPENDENCY|g" $file.tmp > $file
 
159
   #Delete tmp file
 
160
   ExecuteAsAdmin $RM $file.tmp
 
161
}
 
162
 
 
163
#---------------------------------------------------------------------------
 
164
# ServiceAlreadyExists - sets service to a mask maching the name
 
165
#                        SGE_CLUSTER_NAME must be set
 
166
# $1 ... name
 
167
# return 0  if does not exist
 
168
#        1  if service exists
 
169
#
 
170
ServiceAlreadyExists()
 
171
{
 
172
   case "$1" in
 
173
      master)
 
174
         service_name="svc:/application/sge/qmaster:$SGE_CLUSTER_NAME"
 
175
         ;;
 
176
      *)
 
177
         service_name="svc:/application/sge/$1:$SGE_CLUSTER_NAME"
 
178
         ;;
 
179
   esac
 
180
   #Check if service exists
 
181
   $SVCS $service_name > /dev/null 2>&1
 
182
   if [ $? -ne 0 ]; then
 
183
      return 0
 
184
   else
 
185
      return 1
 
186
   fi
 
187
}
 
188
 
 
189
#-------------------------------------------------------------------------
 
190
# SMFCreateAndImportServiceFromTemplate: Replaces template values and 
 
191
#                                        imports it to the repository
 
192
#
 
193
SMFCreateAndImportService()
 
194
{
 
195
   if [ "$1" != "dbwriter" ]; then
 
196
      prefix="$SGE_ROOT"
 
197
   else
 
198
      prefix="$SGE_ROOT/dbwriter"
 
199
   fi
 
200
   template_file="$prefix/util/sgeSMF/$1_template.xml"
 
201
   suffix="${SGE_CLUSTER_NAME}"
 
202
   service_file="$SGE_ROOT/$SGE_CELL/tmp_$1_$suffix.xml"
 
203
   if [ ! -f $template_file ]; then
 
204
      $INFOTEXT "%s is missing!" $template_file
 
205
      return 1
 
206
   fi
 
207
   ExecuteAsAdmin $TOUCH $service_file
 
208
   ExecuteAsAdmin $CHMOD 666 $service_file
 
209
   $CAT $template_file > $service_file
 
210
   SMFReplaceXMLTemplateValues $service_file
 
211
   SMFImportService $service_file
 
212
   ret=$?
 
213
   ExecuteAsAdmin $RM $service_file
 
214
   return $ret
 
215
}
 
216
 
 
217
#---------------------------------------------------------------------------
 
218
# Register SMF service
 
219
# return Registered messages or nothing
 
220
SMFRegister()
 
221
{  
 
222
   case "$1" in
 
223
   master | qmaster)
 
224
      if [ "$2" = "true" ]; then
 
225
         ServiceAlreadyExists bdb
 
226
         #Service exists and BDB server was chosen as spooling method
 
227
         if [ $? -eq 1 ]; then
 
228
            BDB_DEPENDENCY="<dependency name='bdb' grouping='require_all' restart_on='none' type='service'><service_fmri value=\'svc:/application/sge/bdb:$SGE_CLUSTER_NAME\' /></dependency>"
 
229
         else
 
230
         #Error we expect BDB to be using SMF as well
 
231
            $INFOTEXT "You chose to install qmaster with SMF and you use Berkley DB server, but bdb \n" \
 
232
                      "SMF service was not found!\n" \
 
233
                      "Either start qmaster installation with -nosmf, or reinstall Berkley DB server \n" \
 
234
                      "to use SMF (do not use -nosmf flag)."
 
235
            return 1
 
236
         fi
 
237
      else
 
238
         BDB_DEPENDENCY=""
 
239
      fi
 
240
      SMFCreateAndImportService "qmaster"
 
241
      ;;
 
242
   shadowd)
 
243
      SMFCreateAndImportService "shadowd"
 
244
      ;;
 
245
   execd)
 
246
      SMFCreateAndImportService "execd"
 
247
      ;;
 
248
   bdb | berkeleydb)
 
249
      SMFCreateAndImportService "bdb"
 
250
      ;;
 
251
   dbwriter)
 
252
      SMFCreateAndImportService "dbwriter"
 
253
      ;;
 
254
   *)
 
255
      $INFOTEXT "Unknown parameter to sge_smf register"
 
256
      return 1
 
257
      ;;
 
258
   esac
 
259
   return $?
 
260
}
 
261
 
 
262
 
 
263
#-------------------------------------------------------------------------
 
264
# SMFHaltAndDeleteService: Stops the service and deletes it
 
265
# arg1 ... SMF service name
 
266
SMFHaltAndDeleteService()
 
267
{  
 
268
   ServiceAlreadyExists $1
 
269
   ret=$?
 
270
   if [ $ret -eq 0 ]; then
 
271
      $INFOTEXT "Service %s does not exists!" $service_name
 
272
      $INFOTEXT "Check existing SGE services with svcs \"*sge*\""
 
273
      return 1
 
274
   fi
 
275
 
 
276
   #Service might be in maintanence
 
277
   #In theory process can still be running after we remove it
 
278
   $SVCADM disable -s "$service_name"
 
279
   if [ "$?" -ne 0 ]; then
 
280
      $INFOTEXT "Could not disable the service %s!" $service_name
 
281
   fi
 
282
 
 
283
   $SVCCFG delete "$service_name"
 
284
   if [ "$?" -ne 0 ]; then
 
285
      $INFOTEXT "Could not delete the service %s!" $service_name
 
286
      return 1
 
287
   fi
 
288
   #Check if we should remove the whole service (no more instances)
 
289
   $SVCCFG export "svc:/application/sge/$1" | grep "<instance " 1>/dev/null 2>&1
 
290
   if [ "$?" -ne 0 ]; then
 
291
      $SVCCFG delete "svc:/application/sge/$1"
 
292
      if [ "$?" -ne 0 ]; then
 
293
         $INFOTEXT "Could not delete empty service %s!" "svc:/application/sge/$1"
 
294
         return 1
 
295
      fi
 
296
   fi
 
297
}
 
298
 
 
299
#---------------------------------------------------------------------------
 
300
# Unregister SMF service
 
301
# return registered or not to stdout
 
302
SMFUnregister()
 
303
{  
 
304
   case "$1" in
 
305
   master | qmaster)
 
306
      SMFHaltAndDeleteService "qmaster"
 
307
      ;;
 
308
   shadowd)
 
309
      SMFHaltAndDeleteService "shadowd"
 
310
      ;;
 
311
   execd)
 
312
      SMFHaltAndDeleteService "execd"
 
313
      ;;
 
314
   bdb | berkeleydb)
 
315
      SMFHaltAndDeleteService "bdb"
 
316
      ;;
 
317
   dbwriter)
 
318
      SMFHaltAndDeleteService "dbwriter"
 
319
      ;;
 
320
   *)
 
321
      $INFOTEXT "Unknown parameter to sge_smf unregister"
 
322
      return 1
 
323
      ;;
 
324
   esac
 
325
   return $?
 
326
}
 
327
 
 
328
 
 
329
#---------------------------------------------------------------------------
 
330
# Main routine
 
331
# PARAMS: $command 
 
332
# return a stdout output
 
333
SMF()
 
334
{   
 
335
   if [ -f /lib/svc/share/smf_include.sh ]; then 
 
336
      . /lib/svc/share/smf_include.sh
 
337
      smf_present
 
338
      hasSMF="$?"
 
339
      if [ $hasSMF -eq 0 ]; then
 
340
         hasSMF=true
 
341
      fi
 
342
   fi
 
343
 
 
344
   if [ "$hasSMF" != "true" ]; then
 
345
      $INFOTEXT "SMF is NOT supported on your system."
 
346
      return 1
 
347
   fi
 
348
 
 
349
   cmd="$1"
 
350
 
 
351
   if [ "$#" -lt 1 -o  "$#" -gt 3 -o "$cmd" = "-h" -o "$cmd" = "help"  -o "$cmd" = "-help" "$cmd" = "--help" ]; then
 
352
      SMFusage
 
353
      return 1
 
354
   fi
 
355
 
 
356
   #Check args
 
357
   if [ "$cmd" = "register" -o "$cmd" = "unregister" ]; then
 
358
      if [ "$#" -lt 2 ]; then
 
359
         $INFOTEXT "Missing an argument!"
 
360
         SMFusage
 
361
         return 1
 
362
      fi
 
363
      opt="$2"
 
364
      #We source the settings if we don't have qmaster or execd port 
 
365
      if [ -z "$SGE_QMASTER_PORT" -o -z "$SGE_EXECD_PORT" ]; then
 
366
         if [ -r $SGE_ROOT/$SGE_CELL/common/settings.sh ]; then
 
367
            . "$SGE_ROOT/$SGE_CELL/common/settings.sh"
 
368
         else
 
369
            $INFOTEXT "Can't read \$SGE_ROOT/\$SGE_CELL/common/settings.sh"
 
370
            $INFOTEXT "Missing SGE_QMASTER_PORT or SGE_EXECD_PORT!"
 
371
            return 1
 
372
         fi
 
373
      fi
 
374
      if [ -z "$SGE_CLUSTER_NAME" -a -z "$3" ]; then
 
375
         $INFOTEXT "Missing SGE_CLUSTER_NAME argument!"
 
376
         SMFusage
 
377
         return 1
 
378
      fi
 
379
      if [ -n "$3" ]; then
 
380
         SGE_CLUSTER_NAME="$3"
 
381
      fi
 
382
   fi
 
383
 
 
384
   #The commands
 
385
   if [ "$cmd" = "supported" ]; then
 
386
      $INFOTEXT "SMF is supported on your system."
 
387
      ret=0
 
388
   elif [ "$cmd" = "register" ]; then
 
389
      SMFRegister $opt
 
390
      ret=$?
 
391
      if [ $ret -ne 0 ]; then
 
392
         $INFOTEXT "Register failed."
 
393
      fi
 
394
   elif [ "$cmd" = "unregister" ]; then
 
395
      SMFUnregister $opt
 
396
      ret=$?
 
397
      if [ $ret -ne 0 ]; then
 
398
         $INFOTEXT "Unregister failed."
 
399
      fi
 
400
   else
 
401
      SMFusage
 
402
      ret=1
 
403
   fi
 
404
   return $ret
 
405
}