1 | #!/bin/ksh |
---|
2 | # IBM_PROLOG_BEGIN_TAG |
---|
3 | # This is an automatically generated prolog. |
---|
4 | # |
---|
5 | # |
---|
6 | # |
---|
7 | # Licensed Materials - Property of IBM |
---|
8 | # |
---|
9 | # (C) COPYRIGHT International Business Machines Corp. 1997,2006 |
---|
10 | # All Rights Reserved |
---|
11 | # |
---|
12 | # US Government Users Restricted Rights - Use, duplication or |
---|
13 | # disclosure restricted by GSA ADP Schedule Contract with IBM Corp. |
---|
14 | # |
---|
15 | # IBM_PROLOG_END_TAG |
---|
16 | # @(#)76 1.83.1.177 src/avs/fs/mmfs/ts/admin/mmcommon.sh, mmfs, avs_rgpfs24, rgpfs24s008a 11/8/06 12:34:03 |
---|
17 | ############################################################################# |
---|
18 | # |
---|
19 | # Usage: mmcommon keyword <arguments> |
---|
20 | # |
---|
21 | ############################################################################# |
---|
22 | |
---|
23 | # Include global declarations and service routines. |
---|
24 | . /usr/lpp/mmfs/bin/mmglobfuncs |
---|
25 | . /usr/lpp/mmfs/bin/mmsdrfsdef |
---|
26 | . /usr/lpp/mmfs/bin/mmfsfuncs |
---|
27 | |
---|
28 | sourceFile="mmcommon.sh" |
---|
29 | [[ -n $DEBUG || -n $DEBUGmmcommon ]] && set -x |
---|
30 | $mmTRACE_ENTER "$*" |
---|
31 | |
---|
32 | # Local work files. Names should be of the form: |
---|
33 | # fn=${tmpDir}fn.${mmcmd}.$$ |
---|
34 | |
---|
35 | LOCAL_FILES=" " |
---|
36 | |
---|
37 | |
---|
38 | # Local variables |
---|
39 | typeset -l kword_lc |
---|
40 | typeset -l arg3_lc |
---|
41 | integer n |
---|
42 | rc=0 |
---|
43 | |
---|
44 | # Local functions |
---|
45 | |
---|
46 | ##################################################################### |
---|
47 | # |
---|
48 | # Function: Runs the specified command on the first active node |
---|
49 | # (i.e., node on which the GPFS daemon is running) |
---|
50 | # it finds in the list of nodes provided by the caller. |
---|
51 | # |
---|
52 | # Input: $1 - name of the node to try first, or 0 |
---|
53 | # $2 - file with reliable node names |
---|
54 | # $3 - file to copy on the remote node, or _NO_FILE_COPY_ |
---|
55 | # $4 - file system that cannot be mounted, or _NO_MOUNT_CHECK_ |
---|
56 | # $5 - scope of mount checking |
---|
57 | # $6 - symbolic link indicator: _LINK_ or _NO_LINK_ |
---|
58 | # $7 - command to execute; must be mmremote or tsxxxxxxx |
---|
59 | # $8 - argument list for the remote command |
---|
60 | # |
---|
61 | # Output: Depends on the particular remote command |
---|
62 | # |
---|
63 | # Returns: 0 - command completed successfully |
---|
64 | # return code from the remote command |
---|
65 | # |
---|
66 | ##################################################################### |
---|
67 | function runRemoteCommand # <preferredNode> <nodeFile> <fileToCopy> |
---|
68 | # <fsToCheck> <symLink> <scope> <command> <args> |
---|
69 | { |
---|
70 | typeset sourceFile="mmcommon.sh" |
---|
71 | [[ -n $DEBUG || -n $DEBUGrunRemoteCommand ]] && set -x |
---|
72 | $mmTRACE_ENTER "$*" |
---|
73 | typeset preferredNode=$1 |
---|
74 | typeset nodeFile=$2 |
---|
75 | typeset fileToCopy=$3 |
---|
76 | typeset fsToCheck=$4 |
---|
77 | typeset scope=$5 |
---|
78 | typeset symLink=$6 |
---|
79 | typeset command=$7 |
---|
80 | typeset args=$8 |
---|
81 | |
---|
82 | typeset rc=0 |
---|
83 | typeset nodeName rcInfo lsrc |
---|
84 | |
---|
85 | # If this is a single node environment, assure that |
---|
86 | # the command will be executed locally. |
---|
87 | [[ $MMMODE = single ]] && preferredNode=$ourNodeName |
---|
88 | |
---|
89 | # If there is no preferred node, see if the local node is in the list. |
---|
90 | [[ $preferredNode = "0" ]] && \ |
---|
91 | preferredNode=$($grep -w $ourNodeName $nodeFile) |
---|
92 | |
---|
93 | # Try the nodes one by one until the command is executed somewhere. |
---|
94 | # Always start with the local node first, if it is in the list. |
---|
95 | [[ -z $preferredNode ]] && preferredNode="$BLANKchar" |
---|
96 | for nodeName in $(print -- "$preferredNode" ; $grep -v -w "$preferredNode" $nodeFile) |
---|
97 | do |
---|
98 | # If nodeName refers to the node that we are running on, |
---|
99 | # try to execute the command locally. |
---|
100 | if [[ $nodeName = $ourNodeName ]] |
---|
101 | then |
---|
102 | runLocalCommand $fsToCheck $scope $symLink $command "$args" |
---|
103 | rc=$? |
---|
104 | # If this is a single node environment, there is nothing more to do. |
---|
105 | [[ $MMMODE = single ]] && break |
---|
106 | |
---|
107 | # If acceptable error (daemon not up or waiting for quorum), |
---|
108 | # try to find some other node to run the command. Otherwise, |
---|
109 | # the command was executed and either succeeded or failed. |
---|
110 | # Either way, pass the result to the caller. |
---|
111 | if [[ $rc -eq $MM_DaemonDown || $rc -eq $MM_QuorumWait ]] |
---|
112 | then |
---|
113 | continue |
---|
114 | else |
---|
115 | return $rc |
---|
116 | fi |
---|
117 | fi # end of if [[ $nodeName = $ourNodeName ]] |
---|
118 | |
---|
119 | # Invoke mmdsh to run the command on the remote node. |
---|
120 | $rm -f $tmpDir$command$$.* |
---|
121 | $mmdsh -svL $nodeName $mmremote onbehalf $ourNodeName $command$$ \ |
---|
122 | $MMMODE $fileToCopy $fsToCheck $scope $symLink $command "$args" |
---|
123 | rc=$? |
---|
124 | |
---|
125 | #---------------------------------------------------------------------- |
---|
126 | # |
---|
127 | # Determine the return code from the remote command. |
---|
128 | # |
---|
129 | # This is not an easy task because rsh and different versions of |
---|
130 | # ssh treat the return codes from the remote command differently. |
---|
131 | # For example, rsh does not propagate back the return code, while |
---|
132 | # at least some of the ssh versions pass back the return code. |
---|
133 | # This also makes it very difficult to distinguish between failures |
---|
134 | # of rsh/ssh itself and failures of the remote command. |
---|
135 | # |
---|
136 | # Our solution is to pass back the return code by creating a special |
---|
137 | # file that has the return code appended at the end of its name. |
---|
138 | # If we do not see this file on our side, we will assume that mmdsh |
---|
139 | # returned the return code from the remote command. Although this is |
---|
140 | # not necessarily always the case (there could have been a problem |
---|
141 | # with the touch command that creates the special file) it is the best |
---|
142 | # we can do under the circumstances. |
---|
143 | #---------------------------------------------------------------------- |
---|
144 | |
---|
145 | # Look for the return code to be encoded in a special file name. |
---|
146 | rcInfo=$($ls $tmpDir$command$$.* 2> /dev/null) |
---|
147 | $rm -f $tmpDir$command$$.* |
---|
148 | if [[ -n $rcInfo ]] |
---|
149 | then |
---|
150 | # The return code was passed back via the empty file mechanism. |
---|
151 | # Extract the return code from the file name. |
---|
152 | rc=${rcInfo#$tmpDir$command$$\.} |
---|
153 | |
---|
154 | # If acceptable error (daemon not up or waiting for quorum), |
---|
155 | # try to find some other node to run the command. Otherwise, |
---|
156 | # the command was executed and either succeeded or failed. |
---|
157 | # Either way, pass the result to the caller. |
---|
158 | if [[ $rc -eq $MM_DaemonDown || $rc -eq $MM_QuorumWait ]] |
---|
159 | then |
---|
160 | continue |
---|
161 | else |
---|
162 | return $rc |
---|
163 | fi |
---|
164 | fi # end if [[ -n $rcInfo ]] |
---|
165 | |
---|
166 | # Assume mmdsh returned the return code from the remote command. |
---|
167 | if [[ $rc -eq $MM_DaemonDown || |
---|
168 | $rc -eq $MM_QuorumWait || |
---|
169 | $rc -eq $MM_HostDown || |
---|
170 | $rc -eq $MM_ConnectTimeout ]] |
---|
171 | then |
---|
172 | # If the daemon is not up, if it is waiting for quorum, or if mmdsh |
---|
173 | # could not get to the node, try another node to run the command. |
---|
174 | continue |
---|
175 | fi |
---|
176 | |
---|
177 | if [[ $rc -ne 0 ]] |
---|
178 | then |
---|
179 | # The command failed. |
---|
180 | printErrorMsg 104 "runRemoteCommand" "$nodeName: $command $args" |
---|
181 | fi |
---|
182 | |
---|
183 | # Whether the command executed successfully or not, |
---|
184 | # return to the caller with the return code. |
---|
185 | return $rc |
---|
186 | |
---|
187 | done # end for nodeName in $(print -- "$preferredNode" ; $cat $nodeFile) |
---|
188 | |
---|
189 | if [[ $MMMODE = single && |
---|
190 | $rc -ne $MM_DaemonDown && |
---|
191 | $rc -ne $MM_QuorumWait ]] |
---|
192 | then |
---|
193 | return $rc |
---|
194 | fi |
---|
195 | |
---|
196 | # If we ever get here, all nodes were tried, but the command could not be |
---|
197 | # executed. Either all nodes are down, or the daemon is down on all nodes. |
---|
198 | [[ $command != $MOUNT_CHECK_ONLY ]] && \ |
---|
199 | printErrorMsg 312 $mmcmd $command |
---|
200 | rc=$MM_DaemonDown |
---|
201 | |
---|
202 | return $rc |
---|
203 | |
---|
204 | } #----- end of function runRemoteCommand ----------------------- |
---|
205 | |
---|
206 | |
---|
207 | ############################################################################# |
---|
208 | # |
---|
209 | # Function: Generate a list of all disk devices known to this node. |
---|
210 | # |
---|
211 | # Input: None. |
---|
212 | # |
---|
213 | # Output: For each device, a line is generated containing the following: |
---|
214 | # device_name device_type |
---|
215 | # |
---|
216 | # Returns: Always zero. Errors are ignored. |
---|
217 | # |
---|
218 | ############################################################################# |
---|
219 | function getDiskDevices # |
---|
220 | { |
---|
221 | typeset sourceFile="mmcommon.sh" |
---|
222 | [[ -n $DEBUG || -n $DEBUGgetDiskDevices ]] && set -x |
---|
223 | $mmTRACE_ENTER "$*" |
---|
224 | |
---|
225 | # Get the names of all disks, vpaths, etc. |
---|
226 | if [[ $osName = AIX ]] |
---|
227 | then |
---|
228 | LC_ALL=C $getlvodm -F 2>/dev/null | \ |
---|
229 | $awk ' \ |
---|
230 | /hdiskpower/ { print $1 " powerdisk" ; next } \ |
---|
231 | /dlmfdrv/ { print $1 " dlmfdrv" ; next } \ |
---|
232 | /vpath/ { print $1 " vpath" ; next } \ |
---|
233 | /hdisk/ { print $1 " hdisk" ; next } \ |
---|
234 | ' |
---|
235 | |
---|
236 | elif [[ $osName = Linux ]] |
---|
237 | then |
---|
238 | $awk ' \ |
---|
239 | /emcpower/ { if (NF > 3 && $3 > 1) print $4 " powerdisk" ; next } \ |
---|
240 | /vpath/ { if (NF > 3 && $3 > 1) print $4 " vpath" ; next } \ |
---|
241 | /[sh]d/ { if (NF > 3 && $3 > 1) print $4 " generic" ; next } \ |
---|
242 | ' /proc/partitions 2>/dev/null |
---|
243 | |
---|
244 | else |
---|
245 | print -u2 " Unknown operating system $osName " |
---|
246 | cleanupAndExit |
---|
247 | fi |
---|
248 | |
---|
249 | return 0 |
---|
250 | |
---|
251 | } #----- end of function getDiskDevices ------------------------ |
---|
252 | |
---|
253 | |
---|
254 | ############################################################################# |
---|
255 | # |
---|
256 | # Function: Generate a file correlating node numbers, IP addresses, |
---|
257 | # and reliable node names for nodes in the cluster. |
---|
258 | # The values are obtained from the latest mmsdrfs file. |
---|
259 | # |
---|
260 | # Input: $1 - name of the node data file to create |
---|
261 | # $2 - (optional) nodeset for which to return information. |
---|
262 | # If missing, or if GLOBAL_ID specified, return all |
---|
263 | # nodes in the cluster. |
---|
264 | # |
---|
265 | # Output: Each record of the output file consists of the following |
---|
266 | # fields (separated with a single blank character): |
---|
267 | # |
---|
268 | # node_number ip_address adapter_type reliable_hostname \ |
---|
269 | # switch_node_number adapter_type hags_node_number |
---|
270 | # |
---|
271 | # Returns: 0 - file created successfully |
---|
272 | # If an error is encountered, this function invokes the |
---|
273 | # cleanupAndExit routine which terminates execution. |
---|
274 | # |
---|
275 | ############################################################################# |
---|
276 | function getNodeDataFromSdrfs # <fileName> [<nodesetId>] |
---|
277 | { |
---|
278 | typeset sourceFile="mmcommon.sh" |
---|
279 | [[ -n $DEBUG || -n $DEBUGgetNodeDataFromSdrfs ]] && set -x |
---|
280 | $mmTRACE_ENTER "$*" |
---|
281 | typeset outfile=$1 |
---|
282 | typeset nodesetId=$2 |
---|
283 | |
---|
284 | typeset gpfsInitOutput |
---|
285 | |
---|
286 | [[ -z $outfile ]] && \ |
---|
287 | checkForErrors "getNodeDataFromSdrfs - Missing output file parameter" 1 |
---|
288 | |
---|
289 | # Ensure the GPFS system data is up to date. |
---|
290 | gpfsInitOutput=$(gpfsInit nolock) |
---|
291 | setGlobalVar $? $gpfsInitOutput |
---|
292 | |
---|
293 | [[ ! -f $mmsdrfsFile ]] && return 0 |
---|
294 | |
---|
295 | # If a nodeset id is not specified, or if the global id is specified, |
---|
296 | # clear the variable so that we can look at all MEMBER_NODE lines. |
---|
297 | # Otherwise, prepend the '^' char to ensure a correct nodesetId match. |
---|
298 | [[ $nodesetId = "." ]] && nodesetId="$nsId" |
---|
299 | [[ $nodesetId = 0 ]] && return 0 |
---|
300 | [[ $nodesetId = $GLOBAL_ID ]] && nodesetId="" |
---|
301 | [[ -n $nodesetId ]] && nodesetId="^$nodesetId" |
---|
302 | |
---|
303 | # Generate a list with the requested node information. |
---|
304 | $rm -f $outfile |
---|
305 | $awk -F: ' \ |
---|
306 | /'$nodesetId:$MEMBER_NODE:'/ { \ |
---|
307 | # If this is an older cluster, the value for the \ |
---|
308 | # HAGS number may not be in the mmsdrfs file yet. \ |
---|
309 | if ( $'$GS_NODE_NUMBER_Field' == "" ) { \ |
---|
310 | { gsNodeNumber = $'$NODE_NUMBER_Field' } \ |
---|
311 | } else { \ |
---|
312 | { gsNodeNumber = $'$GS_NODE_NUMBER_Field' } \ |
---|
313 | } \ |
---|
314 | # Write the information to the specified file. \ |
---|
315 | { print $'$NODE_NUMBER_Field' " " \ |
---|
316 | $'$IPA_Field' " " \ |
---|
317 | $'$ADAPTER_TYPE_Field' " " \ |
---|
318 | $'$REL_HOSTNAME_Field' " " \ |
---|
319 | $'$SWITCH_NODE_NUMBER_Field' " " \ |
---|
320 | $'$ADAPTER_TYPE_Field' " " \ |
---|
321 | gsNodeNumber >> "'$outfile'" } \ |
---|
322 | } \ |
---|
323 | ' $mmsdrfsFile |
---|
324 | checkForErrors awk $? |
---|
325 | |
---|
326 | return 0 |
---|
327 | |
---|
328 | } #----- end of function getNodeDataFromSdrfs -------------------- |
---|
329 | |
---|
330 | |
---|
331 | ############################################################################# |
---|
332 | # |
---|
333 | # Function: Generate a node list file showing the node number, IP address, |
---|
334 | # node name, and attributes (quorum/nonquorum, manager/client, |
---|
335 | # new) for all nodes in the cluster. |
---|
336 | # The values are obtained from the latest mmsdrfs file. |
---|
337 | # Since this routine is used by the daemon to obtain node data, |
---|
338 | # the node name returned is the one used by the GPFS daemons, |
---|
339 | # not the one used by the admin commands, although these are |
---|
340 | # usually the same. |
---|
341 | # |
---|
342 | # Input: $1 - name of the node data file to create |
---|
343 | # $2 - (optional) assume cached data is current |
---|
344 | # |
---|
345 | # Output: Each record of the output file consists of the following |
---|
346 | # fields (separated with a single blank character): |
---|
347 | # |
---|
348 | # node_number ip_address nodename attributes... |
---|
349 | # |
---|
350 | # where "attributes..." is a string containing a set of |
---|
351 | # comma-separated attribute values. |
---|
352 | # |
---|
353 | # Returns: 0 - file created successfully |
---|
354 | # If an error is encountered, this function invokes the |
---|
355 | # cleanupAndExit routine which terminates execution. |
---|
356 | # |
---|
357 | ############################################################################# |
---|
358 | function getNodeListFromSdrfs # <fileName> [norefresh] |
---|
359 | { |
---|
360 | typeset sourceFile="mmcommon.sh" |
---|
361 | [[ -n $DEBUG || -n $DEBUGgetNodeListFromSdrfs ]] && set -x |
---|
362 | $mmTRACE_ENTER "$*" |
---|
363 | typeset outfile=$1 |
---|
364 | typeset -l refreshArg=$2 |
---|
365 | |
---|
366 | typeset gpfsInitOutput |
---|
367 | |
---|
368 | [[ -z $outfile ]] && \ |
---|
369 | checkForErrors "getNodeListFromSdrfs - Missing output file parameter" 1 |
---|
370 | |
---|
371 | # Ensure the GPFS system data is up to date. |
---|
372 | if [[ $refreshArg != "norefresh" ]] |
---|
373 | then |
---|
374 | gpfsInitOutput=$(gpfsInit nolock) |
---|
375 | setGlobalVar $? $gpfsInitOutput |
---|
376 | fi |
---|
377 | |
---|
378 | [[ ! -f $mmsdrfsFile ]] && \ |
---|
379 | checkForErrors "getNodeListFromSdrfs - Missing /var/mmfs/gen/mmsdrfs" 1 |
---|
380 | |
---|
381 | # Generate a file with the requested node information. |
---|
382 | $rm -f $outfile |
---|
383 | $awk -F: ' \ |
---|
384 | BEGIN { separator = "," } \ |
---|
385 | /'$HOME_CLUSTER:$MEMBER_NODE:'/ { \ |
---|
386 | # Collect all attributes for this node. \ |
---|
387 | { attrs = $'$DESIGNATION_Field' } \ |
---|
388 | if ( $'$CORE_QUORUM_Field' == "'$quorumNode'" ) { \ |
---|
389 | { attrs = attrs separator "'$QUORUM'" } \ |
---|
390 | } \ |
---|
391 | if ( $'$ADDNODE_STATE_Field' != "" ) { \ |
---|
392 | { attrs = attrs separator $'$ADDNODE_STATE_Field' } \ |
---|
393 | } \ |
---|
394 | if ( $'$DAEMON_NODENAME_Field' == "" ) { \ |
---|
395 | { nodename = $'$REL_HOSTNAME_Field' } \ |
---|
396 | } else { \ |
---|
397 | { nodename = $'$DAEMON_NODENAME_Field' } \ |
---|
398 | } \ |
---|
399 | # Write the information to the specified file. \ |
---|
400 | { print $'$NODE_NUMBER_Field' " " \ |
---|
401 | $'$IPA_Field' " " \ |
---|
402 | nodename " " attrs >> "'$outfile'" } \ |
---|
403 | } \ |
---|
404 | ' $mmsdrfsFile |
---|
405 | checkForErrors awk $? |
---|
406 | |
---|
407 | return 0 |
---|
408 | |
---|
409 | } #----- end of function getNodeListFromSdrfs -------------------- |
---|
410 | |
---|
411 | |
---|
412 | ####################################################################### |
---|
413 | # |
---|
414 | # Function: Generate a file with the global group names and size of |
---|
415 | # all known VSDs, as well as their primary and secondary |
---|
416 | # servers and recovery state. |
---|
417 | # |
---|
418 | # Input: $1 - name of file for the VSD information |
---|
419 | # |
---|
420 | # Output: Each record of the output file consists of the following |
---|
421 | # colon-separated fields: |
---|
422 | # |
---|
423 | # group_name:vsd_name:size:primary_node:secondary_node:recovery:vgname |
---|
424 | # |
---|
425 | # Returns: 0 - file created successfully |
---|
426 | # If error is encountered, this function invokes the |
---|
427 | # cleanupAndExit routine which terminates execution. |
---|
428 | # |
---|
429 | ####################################################################### |
---|
430 | function getVSDdataSDR |
---|
431 | { |
---|
432 | typeset sourceFile="mmcommon.sh" |
---|
433 | [[ -n $DEBUG || -n $DEBUGgetVSDdataSDR ]] && set -x |
---|
434 | $mmTRACE_ENTER "$*" |
---|
435 | typeset joinedFile=$1 |
---|
436 | |
---|
437 | # Get the name, size, and global group name of all VSDs. |
---|
438 | $SDRGetObjects -d ':' -x VSD_Table \ |
---|
439 | global_group_name VSD_name size_in_MB >$vsdNamesFile |
---|
440 | checkForErrors SDRGetObjects $? |
---|
441 | |
---|
442 | # Sort the output. |
---|
443 | $sort -t: -k 1,1 $vsdNamesFile -o $vsdNamesFile |
---|
444 | checkForErrors sort $? |
---|
445 | |
---|
446 | # Get the primary and secondary nodes for the global group names. |
---|
447 | $SDRGetObjects -d ':' -x VSD_Global_Volume_Group global_group_name \ |
---|
448 | primary_node secondary_node recovery local_group_name >$volGroupFile |
---|
449 | checkForErrors SDRGetObjects $? |
---|
450 | |
---|
451 | # Sort the output. |
---|
452 | $sort -t: -k 1,1 $volGroupFile -o $volGroupFile |
---|
453 | checkForErrors sort $? |
---|
454 | |
---|
455 | # Create one common file with all of the information. |
---|
456 | $join -t: $vsdNamesFile $volGroupFile >$joinedFile |
---|
457 | checkForErrors join $? |
---|
458 | |
---|
459 | $rm -f $vsdNamesFile $volGroupFile |
---|
460 | return 0 |
---|
461 | |
---|
462 | } #----- end of function getVSDdataSDR -------------------------- |
---|
463 | |
---|
464 | |
---|
465 | ########################################################################## |
---|
466 | # |
---|
467 | # Function: Generate a file with the global group names and size of |
---|
468 | # all known VSDs, as well as their primary and secondary |
---|
469 | # servers and recovery state. |
---|
470 | # |
---|
471 | # Input: $1 - name of file for the VSD information |
---|
472 | # |
---|
473 | # Output: Each record of the output file consists of the following |
---|
474 | # colon-separated fields: |
---|
475 | # |
---|
476 | # group_name:vsd_name:size:primary_node:secondary_node:recovery:vgname |
---|
477 | # |
---|
478 | # Returns: 0 - file created successfully |
---|
479 | # If error is encountered, this function invokes the |
---|
480 | # cleanupAndExit routine which terminates execution. |
---|
481 | # |
---|
482 | ########################################################################## |
---|
483 | function getVSDdataRPD |
---|
484 | { |
---|
485 | typeset sourceFile="mmcommon.sh" |
---|
486 | [[ -n $DEBUG || -n $DEBUGgetVSDdataRPD ]] && set -x |
---|
487 | $mmTRACE_ENTER "$*" |
---|
488 | typeset joinedFile=$1 |
---|
489 | |
---|
490 | # Get the name, size, and global group name of all VSDs. |
---|
491 | $lsrsrcapi -o "IBM.vsdtable::::::VSD_name::global_group_name::logical_volume_name::size_in_MB" >$vsdNamesFile |
---|
492 | checkForErrors "getVSDdataRPD: lsrsrc-api -o IBM.vsdtable::::::VSD_name::global_group_name::logical_volume_name::size_in_MB" $? |
---|
493 | |
---|
494 | # Sort the output |
---|
495 | $sort -t: -k 3,3 $vsdNamesFile -o $vsdNamesFile |
---|
496 | checkForErrors sort $? |
---|
497 | |
---|
498 | # Get the primary and secondary nodes for the global group names. |
---|
499 | $lsrsrcapi -o "IBM.vsdgvg::::::global_group_name::local_group_name::primary_node::secondary_node::recovery" >$volGroupFile |
---|
500 | checkForErrors "getVSDdataRPD: lsrsrc-api -o IBM.vsdgvg::::::global_group_name::local_group_name::primary_node::secondary_node::recovery" $? |
---|
501 | |
---|
502 | # Sort the output. |
---|
503 | $sort -t: -k 1,1 $volGroupFile -o $volGroupFile |
---|
504 | checkForErrors sort $? |
---|
505 | |
---|
506 | # Create one common file with all of the information. |
---|
507 | $join -t: -1 3 -2 1 -o 1.3,1.1,1.7,2.5,2.7,2.9,2.3 $vsdNamesFile $volGroupFile >$joinedFile |
---|
508 | checkForErrors join $? |
---|
509 | |
---|
510 | $rm -f $vsdNamesFile $volGroupFile |
---|
511 | return 0 |
---|
512 | |
---|
513 | } #----- end of function getVSDdataRPD --------------------------- |
---|
514 | |
---|
515 | |
---|
516 | ######################################################################### |
---|
517 | # |
---|
518 | # Function: Generate a file with the node number and node name for |
---|
519 | # all known VSD nodes. |
---|
520 | # |
---|
521 | # Input: $1 - name of the file for storing the VSD node information |
---|
522 | # |
---|
523 | # Output: Each record of the output file consists of the following |
---|
524 | # colon-separated fields: |
---|
525 | # |
---|
526 | # node_number:node_name |
---|
527 | # |
---|
528 | # Returns: 0 - file created successfully |
---|
529 | # If an error is encountered, this function invokes the |
---|
530 | # cleanupAndExit routine which terminates execution. |
---|
531 | # |
---|
532 | ######################################################################### |
---|
533 | function getVsdNodeDataSDR |
---|
534 | { |
---|
535 | typeset sourceFile="mmcommon.sh" |
---|
536 | [[ -n $DEBUG || -n $DEBUGgetVsdNodeDataSDR ]] && set -x |
---|
537 | $mmTRACE_ENTER "$*" |
---|
538 | typeset outputFile=$1 |
---|
539 | |
---|
540 | # Get the number and name of each of the VSD nodes. |
---|
541 | $SDRGetObjects -d ':' -x Node node_number reliable_hostname >$outputFile |
---|
542 | checkForErrors "getVsdNodeDataSDR: SDRGetObjects" $? |
---|
543 | |
---|
544 | # Sort the output. |
---|
545 | $sort -t: -k 1,1 $outputFile -o $outputFile |
---|
546 | checkForErrors sort $? |
---|
547 | |
---|
548 | return 0 |
---|
549 | |
---|
550 | } #----- end of function getVsdNodeDataSDR --------------------- |
---|
551 | |
---|
552 | |
---|
553 | ######################################################################## |
---|
554 | # |
---|
555 | # Function: Generate a file with the node number and node name for |
---|
556 | # all known VSD nodes. |
---|
557 | # |
---|
558 | # Input: $1 - name of the file for storing the VSD node information |
---|
559 | # |
---|
560 | # Output: Each record of the output file consists of the following |
---|
561 | # colon-separated fields: |
---|
562 | # |
---|
563 | # node_number:node_name |
---|
564 | # |
---|
565 | # Returns: 0 - file created successfully |
---|
566 | # If an error is encountered, this function invokes the |
---|
567 | # cleanupAndExit routine which terminates execution. |
---|
568 | # |
---|
569 | ######################################################################## |
---|
570 | function getVsdNodeDataRPD |
---|
571 | { |
---|
572 | typeset sourceFile="mmcommon.sh" |
---|
573 | [[ -n $DEBUG || -n $DEBUGgetVsdNodeDataRPD ]] && set -x |
---|
574 | $mmTRACE_ENTER "$*" |
---|
575 | typeset outputFile=$1 |
---|
576 | |
---|
577 | # Get the number and name of each of the VSD nodes. |
---|
578 | $lsrsrcapi -D ":" -o "IBM.vsdnode::::::VSD_nodenum::NodeNameList" | \ |
---|
579 | $sed -e 's/{//g' | $sed -e 's/}//g' >$outputFile |
---|
580 | checkForErrors "getVsdNodeDataRPD: lsrsrc-api -o IBM.vsdnode::::::VSD_nodenum::NodeNameList" $? |
---|
581 | |
---|
582 | # Sort the output. |
---|
583 | $sort -t: -k 1,1 $outputFile -o $outputFile |
---|
584 | checkForErrors sort $? |
---|
585 | |
---|
586 | return 0 |
---|
587 | |
---|
588 | } #----- end of function getVsdNodeDataRPD ----------------------- |
---|
589 | |
---|
590 | |
---|
591 | ############################################################################### |
---|
592 | # |
---|
593 | # Function: Correlate GPFS node numbers with the corresponding RSCT |
---|
594 | # node numbers (if any). |
---|
595 | # |
---|
596 | # Input: None. |
---|
597 | # |
---|
598 | # Output: For each node in the cluster that can access VSD disks, |
---|
599 | # the following two fields (colon-separated, one pair per line) |
---|
600 | # are displayed on stdout: |
---|
601 | # |
---|
602 | # GPFSnodeNumber:RSCTnodeNumber |
---|
603 | # |
---|
604 | # Notes: GPFS nodes that are not part of the RSCT peer domain are omitted. |
---|
605 | # |
---|
606 | # Returns: 0 - no errors encountered. |
---|
607 | # If an error is encountered, this function invokes the |
---|
608 | # cleanupAndExit routine which terminates execution. |
---|
609 | # |
---|
610 | ############################################################################### |
---|
611 | function getVsdNodeNumbers # |
---|
612 | { |
---|
613 | typeset sourceFile="mmcommon.sh" |
---|
614 | [[ -n $DEBUG || -n $DEBUGgetVsdNodeNumbers ]] && set -x |
---|
615 | $mmTRACE_ENTER "$*" |
---|
616 | |
---|
617 | typeset gpfsNumbers=$tmpfile |
---|
618 | typeset vsdNumbers=$tmpfile2 |
---|
619 | typeset vsdPath |
---|
620 | |
---|
621 | # This function makes no sense on Linux. |
---|
622 | [[ $osName = Linux ]] && return 1 |
---|
623 | |
---|
624 | # Processing depends on which type of VSD code (PSSP or RSCT) is in use. |
---|
625 | vsdPath=$(LC_ALL=C $ls -l $vsdatalst 2>/dev/null) |
---|
626 | if [[ $vsdPath = *${vsdatalstPSSP}* && -x $vsdatalstPSSP ]] |
---|
627 | then |
---|
628 | # Find the PSSP node numbers and map them to the GPFS nodes. |
---|
629 | |
---|
630 | # Get the PSSP node numbers and IP addresses. |
---|
631 | $SDRGetObjects -d ':' -x Adapter node_number netaddr > $adfile |
---|
632 | checkForErrors "getPSSPvsdNumbers: SDRGetObjects Adapter" $? |
---|
633 | |
---|
634 | # Add multi-link adapters information from the Aggregate_IP class. |
---|
635 | # If the class does not exist, ignore the error. |
---|
636 | $SDRGetObjects -d ':' -x Aggregate_IP node_number ip_address >> $adfile 2>/dev/null |
---|
637 | [[ ! -s $adfile ]] && \ |
---|
638 | checkForErrors "getVsdNodeNumbers: invalid SDR Adapter data; check SDR" 1 |
---|
639 | |
---|
640 | # Sort the output based on the IP address. |
---|
641 | $sort -t: -k 2,2 $adfile -o $vsdNumbers |
---|
642 | checkForErrors "getPSSPvsdNumbers: sort" $? |
---|
643 | |
---|
644 | elif [[ $vsdPath = *${vsdatalstRSCT}* && -x $vsdatalstRSCT ]] |
---|
645 | then |
---|
646 | # Find the RSCT peer domain node numbers and map them to the GPFS nodes. |
---|
647 | |
---|
648 | # Create a file correlating RSCT node identifiers with IP addresses. |
---|
649 | $lsrsrcapi -o \ |
---|
650 | "IBM.NetworkInterface::::::NodeIDs::IPAddress::" > $adfile 2> /dev/null |
---|
651 | checkForErrors "getVsdNodeNumbers: lsrsrc-api -o IBM.NetworkInterface::::::NodeIDs::IPAddress::" $? |
---|
652 | [[ ! -s $adfile ]] && \ |
---|
653 | checkForErrors "getVsdNodeNumbers: invalid IBM.NetworkInterface data; check RSCT Peer Domain" 1 |
---|
654 | |
---|
655 | # Sort the output based on the NodeID values. |
---|
656 | $sort -b -k 1,1 $adfile -o $adfile |
---|
657 | checkForErrors "getVsdNodeNumbers: sort" $? |
---|
658 | |
---|
659 | # Create a file correlating RSCT node identifiers with RSCT node numbers. |
---|
660 | $lsrsrcapi -o "IBM.PeerNode::::::NodeIDs::NodeList" > $rnfile 2> /dev/null |
---|
661 | checkForErrors "getVsdNodeNumbers: lsrsrc-api -o IBM.PeerNode::::::NodeIDs::NodeList " $? |
---|
662 | [[ ! -s $rnfile ]] && \ |
---|
663 | checkForErrors "getVsdNodeNumbers: invalid IBM.PeerNode output; check RSCT Peer Domain" 1 |
---|
664 | |
---|
665 | # Sort the output based on the NodeID values. |
---|
666 | $sort -b -k 1,1 $rnfile -o $rnfile |
---|
667 | checkForErrors "getVsdNodeNumbers: sort" $? |
---|
668 | |
---|
669 | # Create one common file correlating IP addresses with RSCT node numbers. |
---|
670 | $join -1 1 -2 1 -t : -o 2.3,1.3 $adfile $rnfile > $vsdNumbers |
---|
671 | checkForErrors "getVsdNodeNumbers: join" $? |
---|
672 | |
---|
673 | # Sort the output based on the IP address. |
---|
674 | $sort -t: -k 2,2 $vsdNumbers -o $vsdNumbers |
---|
675 | checkForErrors "getVsdNodeNumbers: sort" $? |
---|
676 | |
---|
677 | else |
---|
678 | # VSD not installed. |
---|
679 | printErrorMsg 320 "getVSDdata" |
---|
680 | cleanupAndExit |
---|
681 | fi # end of if [[ $? = 0 && -x $vsdatalstPSSP ]] |
---|
682 | |
---|
683 | # Create a file correlating GPFS node numbers with IP addresses. |
---|
684 | $awk -F: ' \ |
---|
685 | /':$MEMBER_NODE:'/ { \ |
---|
686 | { print $'$NODE_NUMBER_Field' ":" $'$IPA_Field' } \ |
---|
687 | } \ |
---|
688 | ' $mmsdrfsFile | $sort -t: -b -k 2,2 -o $gpfsNumbers |
---|
689 | checkForErrors "getVsdNodeNumbers: awk_sort" $? |
---|
690 | |
---|
691 | # Correlate the GPFS and RSCT node numbers, sort and display them on stdout. |
---|
692 | $join -1 2 -2 2 -t : -o 1.1,2.1 $gpfsNumbers $vsdNumbers | $sort -t: -k 1,1n |
---|
693 | |
---|
694 | return 0 |
---|
695 | |
---|
696 | } #----- end of function getVsdNodeNumbers ----------------------- |
---|
697 | |
---|
698 | |
---|
699 | ############################################################################# |
---|
700 | # |
---|
701 | # Function: get NSD data for the caller |
---|
702 | # |
---|
703 | # Input: $1 - file system name |
---|
704 | # (if $GLOBAL_ID or not specified, return data for all NSDs) |
---|
705 | # |
---|
706 | # Output: For each NSD satisfying the input criteria, a colon-delimited |
---|
707 | # line of output of the following format is printed: |
---|
708 | # |
---|
709 | # diskName:pvid:nsdSubtype:nsdSubtypeDiskname:primaryServer:backupServer |
---|
710 | # |
---|
711 | # Note: Since this data is for the daemon, the server node names returned |
---|
712 | # are the node adapter names used by the daemon, not the admin ones. |
---|
713 | # |
---|
714 | # Returns: 0 |
---|
715 | # |
---|
716 | ############################################################################# |
---|
717 | function getNsdData # <fsname> |
---|
718 | { |
---|
719 | typeset sourceFile="mmcommon.sh" |
---|
720 | [[ -n $DEBUG || -n $DEBUGgetNsdData ]] && set -x |
---|
721 | $mmTRACE_ENTER "$*" |
---|
722 | typeset fsname=$1 |
---|
723 | |
---|
724 | typeset deviceName nsdSubtype server backup |
---|
725 | typeset needToDetermineDaemonNames=no |
---|
726 | |
---|
727 | # If a file system was passed, calculate the device name value. |
---|
728 | [[ -n $fsname && $fsname != $GLOBAL_ID ]] && \ |
---|
729 | deviceName=${fsname##+(/)dev+(/)} |
---|
730 | |
---|
731 | # Loop through the mmsdrfs file to obtain the NSD data for the caller. |
---|
732 | $rm -f $tmpfile |
---|
733 | IFS=":" |
---|
734 | exec 3<&- |
---|
735 | exec 3< $mmsdrfsFile |
---|
736 | while read -u3 sdrfsLine |
---|
737 | do |
---|
738 | # Parse the line. |
---|
739 | set -f ; set -A v -- - $sdrfsLine ; set +f |
---|
740 | IFS="$IFS_sv" |
---|
741 | |
---|
742 | case ${v[$LINE_TYPE_Field]} in |
---|
743 | |
---|
744 | $SG_DISKS ) # This line describes a disk. |
---|
745 | # Is this an NSD with a valid PVID value? |
---|
746 | if [[ ${v[$DISK_TYPE_Field]} = nsd && -n ${v[$PVID_Field]} ]] |
---|
747 | then |
---|
748 | # Is this a disk in which we are interested? |
---|
749 | if [[ -z $fsname || $fsname = $GLOBAL_ID || |
---|
750 | $deviceName = ${v[$DEV_NAME_Field]} ]] |
---|
751 | then |
---|
752 | # Determine the nsd subtype value. |
---|
753 | if [[ -z ${v[$NSD_SUBTYPE_Field]} ]] |
---|
754 | then |
---|
755 | nsdSubtype="generic" |
---|
756 | else |
---|
757 | nsdSubtype=${v[$NSD_SUBTYPE_Field]} |
---|
758 | fi |
---|
759 | |
---|
760 | # Check whether the daemon node name has been recorded for |
---|
761 | # each NSD server. If not, set a flag and exit the loop. |
---|
762 | if [[ ( -n ${v[$NSD_PRIMARY_NODE_Field]} && \ |
---|
763 | -z ${v[$DAEMON_NSD_PRIMARY_Field]} ) || \ |
---|
764 | ( -n ${v[$NSD_BACKUP_NODE_Field]} && \ |
---|
765 | -z ${v[$DAEMON_NSD_BACKUP_Field]} ) ]] |
---|
766 | then |
---|
767 | needToDetermineDaemonNames=yes |
---|
768 | break |
---|
769 | fi |
---|
770 | |
---|
771 | # Output the data for this NSD. |
---|
772 | print -- ${v[$DISK_NAME_Field]}:${v[$PVID_Field]}:$nsdSubtype:${v[$NSD_SUBTYPE_DISKNAME_Field]}:${v[$DAEMON_NSD_PRIMARY_Field]}:${v[$DAEMON_NSD_BACKUP_Field]} >> $tmpfile |
---|
773 | |
---|
774 | fi # end of if [[ -z $fsname || $fsname = $GLOBAL_ID || ... ]] |
---|
775 | |
---|
776 | fi # end of if (v[$DISK_TYPE_Field] == "nsd" && -n v[$PVID_Field]) |
---|
777 | ;; |
---|
778 | |
---|
779 | * ) # We are not interested in any other lines. |
---|
780 | ;; |
---|
781 | |
---|
782 | esac # end of case ${v[$LINE_TYPE_Field]} in |
---|
783 | |
---|
784 | IFS=":" # Change the separator back to ":" for the next iteration. |
---|
785 | |
---|
786 | done # end of while read -u3 sdrfsLine do |
---|
787 | |
---|
788 | IFS="$IFS_sv" # Restore the default IFS setting. |
---|
789 | |
---|
790 | # If all of the NSD servers had daemon names, we are done; |
---|
791 | # output the data and return to the caller. |
---|
792 | if [[ $needToDetermineDaemonNames = no ]] |
---|
793 | then |
---|
794 | [[ -s $tmpfile ]] && $cat $tmpfile |
---|
795 | return 0 |
---|
796 | fi |
---|
797 | |
---|
798 | # If we get here, at least one of the NSD servers did not have a |
---|
799 | # daemon node name. This is probably because the cluster migrated |
---|
800 | # from an earlier level of GPFS in which they did not exist, |
---|
801 | # and no one has issued mmchconfig release=LATEST to update the |
---|
802 | # mmsdrfs file. We can still get the NSD data, but it will require |
---|
803 | # more time, since we must look at the MEMBER_NODE lines of the |
---|
804 | # mmsdrfs file as well as the SG_DISKS lines. |
---|
805 | # The mmsdrfs file will be updated with the daemon node names for |
---|
806 | # the NSD servers when the user issues mmchconfig release=LATEST; |
---|
807 | # it cannot be done in this code path. |
---|
808 | |
---|
809 | # Go through the current mmsdrfs file to obtain the NSD data. |
---|
810 | IFS=":" |
---|
811 | exec 3<&- |
---|
812 | exec 3< $mmsdrfsFile |
---|
813 | while read -u3 sdrfsLine |
---|
814 | do |
---|
815 | # Parse the line. |
---|
816 | set -f ; set -A v -- - $sdrfsLine ; set +f |
---|
817 | IFS="$IFS_sv" |
---|
818 | |
---|
819 | case ${v[$LINE_TYPE_Field]} in |
---|
820 | |
---|
821 | $SG_DISKS ) # This line describes a disk. |
---|
822 | # Is this an NSD with a valid PVID value? |
---|
823 | if [[ ${v[$DISK_TYPE_Field]} = nsd && -n ${v[$PVID_Field]} ]] |
---|
824 | then |
---|
825 | # If a file system was passed, calculate the device name value. |
---|
826 | [[ -n $fsname && $fsname != $GLOBAL_ID ]] && \ |
---|
827 | deviceName=${fsname##+(/)dev+(/)} |
---|
828 | |
---|
829 | # Is this a disk in which we are interested? |
---|
830 | if [[ -z $fsname || $fsname = $GLOBAL_ID || |
---|
831 | $deviceName = ${v[$DEV_NAME_Field]} ]] |
---|
832 | then |
---|
833 | # Determine the nsd subtype value. |
---|
834 | if [[ -z ${v[$NSD_SUBTYPE_Field]} ]] |
---|
835 | then |
---|
836 | nsdSubtype="generic" |
---|
837 | else |
---|
838 | nsdSubtype=${v[$NSD_SUBTYPE_Field]} |
---|
839 | fi |
---|
840 | |
---|
841 | # If a server node was specified, check that it is valid |
---|
842 | # and convert it if necessary to a daemon adapter name. |
---|
843 | server=${v[$NSD_PRIMARY_NODE_Field]} |
---|
844 | if [[ -n $server ]] |
---|
845 | then |
---|
846 | server=$(checkAndConvertNodeValue $server $DAEMON_NODENAME_Field) |
---|
847 | fi |
---|
848 | backup=${v[$NSD_BACKUP_NODE_Field]} |
---|
849 | if [[ -n $backup ]] |
---|
850 | then |
---|
851 | backup=$(checkAndConvertNodeValue $backup $DAEMON_NODENAME_Field) |
---|
852 | fi |
---|
853 | |
---|
854 | # Output the data for this NSD. |
---|
855 | print -- ${v[$DISK_NAME_Field]}:${v[$PVID_Field]}:$nsdSubtype:${v[NSD_SUBTYPE_DISKNAME_Field]}:$server:$backup |
---|
856 | |
---|
857 | fi # end of if [[ -z $fsname || $fsname = $GLOBAL_ID || ... ]] |
---|
858 | |
---|
859 | fi # end of if (v[$DISK_TYPE_Field] == "nsd" && -n v[$PVID_Field]) |
---|
860 | ;; |
---|
861 | |
---|
862 | * ) # We are not interested in any other lines. |
---|
863 | ;; |
---|
864 | |
---|
865 | esac # end of case ${v[$LINE_TYPE_Field]} in |
---|
866 | |
---|
867 | IFS=":" # Change the separator back to ":" for the next iteration. |
---|
868 | |
---|
869 | done # end of while read -u3 sdrfsLine |
---|
870 | |
---|
871 | IFS="$IFS_sv" # Restore the default IFS setting. |
---|
872 | |
---|
873 | return 0 |
---|
874 | |
---|
875 | } #----- end of function getNsdData ---------------------------- |
---|
876 | |
---|
877 | |
---|
878 | ########################################################################### |
---|
879 | # |
---|
880 | # Function: Determine whether a given cluster is authorized |
---|
881 | # to access the specified file system. |
---|
882 | # |
---|
883 | # Input: $1 - cluster name |
---|
884 | # $2 - file system device name |
---|
885 | # |
---|
886 | # Output: accessType [rootSquash=uid:gid] |
---|
887 | # |
---|
888 | # Returns: 0 - access level determined successfully |
---|
889 | # 2 (ENOENT) - cluster not defined (not allowed to connect) |
---|
890 | # 13 (EACCES) - access denied |
---|
891 | # 19 (ENODEV) - device not found |
---|
892 | # 22 (EINVAL) - device name is not valid |
---|
893 | # 93 (EREMOTE) - device name is for a remote fs |
---|
894 | # other unexpected errors |
---|
895 | # |
---|
896 | ########################################################################### |
---|
897 | function checkAuth # <clusterName> <device> [norefresh] |
---|
898 | { |
---|
899 | typeset sourceFile="mmcommon.sh" |
---|
900 | [[ -n $DEBUG || -n $DEBUGcheckAuth ]] && set -x |
---|
901 | $mmTRACE_ENTER "$*" |
---|
902 | typeset clusterName=$1 |
---|
903 | typeset device=$2 |
---|
904 | typeset refreshArg=$3 |
---|
905 | |
---|
906 | typeset deviceName accessType allowRemoteConnections |
---|
907 | typeset accessTypeString rsquashUid rsquashGid |
---|
908 | typeset rsquashOption="" |
---|
909 | typeset rc=0 |
---|
910 | |
---|
911 | [[ ! -f $mmsdrfsFile ]] && \ |
---|
912 | checkForErrors "checkAuth - Missing /var/mmfs/gen/mmsdrfs" 1 |
---|
913 | |
---|
914 | # Strip away any /dev/ prefix from the device id. |
---|
915 | deviceName=${device##+(/)dev+(/)} |
---|
916 | |
---|
917 | # Verify the device name. |
---|
918 | if [[ $deviceName = /* ]] |
---|
919 | then |
---|
920 | printErrorMsg 169 $mmcmd "$device" |
---|
921 | rc=$MM_InvalidName |
---|
922 | return $rc |
---|
923 | elif [[ $deviceName = */* ]] |
---|
924 | then |
---|
925 | printErrorMsg 170 $mmcmd "$device" |
---|
926 | rc=$MM_InvalidName |
---|
927 | return $rc |
---|
928 | fi |
---|
929 | |
---|
930 | # Ensure the GPFS system data is up to date. |
---|
931 | if [[ $refreshArg != "norefresh" ]] |
---|
932 | then |
---|
933 | gpfsInitOutput=$(gpfsInit nolock) |
---|
934 | setGlobalVar $? $gpfsInitOutput |
---|
935 | fi |
---|
936 | |
---|
937 | # If the cluster does not utilize secure connections, |
---|
938 | # rw access is allowed to all of its file systems. |
---|
939 | allowRemoteConnections=$(showCfgValue allowRemoteConnections) |
---|
940 | if [[ $allowRemoteConnections = yes ]] |
---|
941 | then |
---|
942 | print -- "rw" |
---|
943 | return 0 |
---|
944 | fi |
---|
945 | |
---|
946 | # Find out the maximum allowed access for the file system. |
---|
947 | accessTypeString=$($awk -F: ' \ |
---|
948 | BEGIN { \ |
---|
949 | # Assume the file system does not exist. \ |
---|
950 | { fsNotFound = 1 } \ |
---|
951 | # Assume "mmauth add" was not issued for the cluster. \ |
---|
952 | { remoteClusterNotFound = 1 } \ |
---|
953 | # Assume file system access not allowed (EACCES). \ |
---|
954 | { rc = '$MM_AccessDenied' } \ |
---|
955 | } \ |
---|
956 | \ |
---|
957 | $'$LINE_TYPE_Field' == "'$VERSION_LINE'" { \ |
---|
958 | # If the request is for the local cluster, \ |
---|
959 | # access is granted by default to all file systems. \ |
---|
960 | if ( $'$CLUSTER_NAME_Field' == "'$clusterName'" || \ |
---|
961 | "'$clusterName'" == "." ) { \ |
---|
962 | { print "rw:::" } \ |
---|
963 | { remoteClusterNotFound = 0 } \ |
---|
964 | { fsNotFound = 0 } \ |
---|
965 | { rc = 0 } \ |
---|
966 | { exit } \ |
---|
967 | } \ |
---|
968 | } \ |
---|
969 | \ |
---|
970 | $'$NODESETID_Field' == "'$clusterName'" && \ |
---|
971 | $'$LINE_TYPE_Field' == "'$AUTHORIZED_CLUSTER'" { \ |
---|
972 | # This is the overall authorization record for \ |
---|
973 | # the desired cluster (created by "mmauth add"). \ |
---|
974 | { remoteClusterNotFound = 0 } \ |
---|
975 | } \ |
---|
976 | \ |
---|
977 | $'$LINE_TYPE_Field' == "'$SG_HEADR'" && \ |
---|
978 | $'$DEV_NAME_Field' == "'$deviceName'" { \ |
---|
979 | # This is the header line for the file system. \ |
---|
980 | if ( $'$FS_TYPE_Field' == "'$remotefs'" ) { \ |
---|
981 | # If it is a remote file system, return an error. \ |
---|
982 | { rc = '$MM_Remotefs' } \ |
---|
983 | { exit } \ |
---|
984 | } else { \ |
---|
985 | # Otherwise, keep looking for an AUTHORIZED_FS line. \ |
---|
986 | # Note that it is OK for such a record not to exist. \ |
---|
987 | # All that means is that the given cluster cannot \ |
---|
988 | # access the file system. \ |
---|
989 | { fsNotFound = 0 } \ |
---|
990 | } \ |
---|
991 | } \ |
---|
992 | \ |
---|
993 | $'$NODESETID_Field' == "'$clusterName'" && \ |
---|
994 | $'$LINE_TYPE_Field' == "'$AUTHORIZED_FS'" && \ |
---|
995 | $'$DEV_NAME_Field' == "'$deviceName'" { \ |
---|
996 | # This is the auth record for the desired cluster and \ |
---|
997 | # file system. Return the max allowed level of access. \ |
---|
998 | { print $'$ACCESS_TYPE_Field' ":" \ |
---|
999 | $'$ROOTSQUASH_UID_Field' ":" \ |
---|
1000 | $'$ROOTSQUASH_GID_Field' ":" } \ |
---|
1001 | { rc = 0 } \ |
---|
1002 | { exit } \ |
---|
1003 | } \ |
---|
1004 | \ |
---|
1005 | END { \ |
---|
1006 | if ( fsNotFound ) { \ |
---|
1007 | { rc = '$MM_FsNotFound' } \ |
---|
1008 | } \ |
---|
1009 | if ( remoteClusterNotFound ) { \ |
---|
1010 | { rc = '$MM_RemoteNotFound' } \ |
---|
1011 | } \ |
---|
1012 | { exit rc } \ |
---|
1013 | } \ |
---|
1014 | ' $mmsdrfsFile) |
---|
1015 | rc=$? |
---|
1016 | if [[ $rc -ne 0 && $rc -ne $MM_AccessDenied ]] |
---|
1017 | then |
---|
1018 | if [[ $rc -eq $MM_FsNotFound ]] |
---|
1019 | then |
---|
1020 | # File system not found. |
---|
1021 | printErrorMsg 288 $mmcmd "$device" |
---|
1022 | elif [[ $rc -eq $MM_RemoteNotFound ]] |
---|
1023 | then |
---|
1024 | # The remote cluster is not authorized to access this cluster. |
---|
1025 | printErrorMsg 259 $mmcmd $clusterName |
---|
1026 | elif [[ $rc -eq $MM_Remotefs ]] |
---|
1027 | then |
---|
1028 | # Command is not allowed for remote file systems. |
---|
1029 | printErrorMsg 238 $mmcmd |
---|
1030 | else |
---|
1031 | # Unexpected error. |
---|
1032 | checkForErrors awk $rc |
---|
1033 | fi |
---|
1034 | return $rc |
---|
1035 | fi |
---|
1036 | |
---|
1037 | # Parse the result. |
---|
1038 | IFS=":" |
---|
1039 | set -f ; set -- $accessTypeString ; set +f |
---|
1040 | accessType=$1 |
---|
1041 | rsquashUid=$2 |
---|
1042 | rsquashGid=$3 |
---|
1043 | IFS="$IFS_sv" |
---|
1044 | |
---|
1045 | [[ -n $rsquashUid ]] && rsquashOption=" rootSquash=${rsquashUid}:${rsquashGid}" |
---|
1046 | [[ -z $accessType ]] && accessType="none" |
---|
1047 | |
---|
1048 | # Put out the result and return. |
---|
1049 | print -- "${accessType}${rsquashOption}" |
---|
1050 | return $rc |
---|
1051 | |
---|
1052 | } #----- end of function checkAuth ----------------------------- |
---|
1053 | |
---|
1054 | |
---|
1055 | ###################################################################### |
---|
1056 | # |
---|
1057 | # Function: Generate a /etc/filesystems type options line. |
---|
1058 | # |
---|
1059 | # Input: $1 - file system device name |
---|
1060 | # $2 - skipMountPointCheck or doMountPointCheck |
---|
1061 | # |
---|
1062 | # Output: The first line contains a comma-separated list of |
---|
1063 | # mount options and the names of up to 50 disks. |
---|
1064 | # The second line contains the mount point. |
---|
1065 | # |
---|
1066 | # Returns: 0 - options line generated successfully |
---|
1067 | # 19 (ENODEV) - options line not found |
---|
1068 | # 22 (EINVAL) - device name is not valid |
---|
1069 | # 1 - some other unexpected error |
---|
1070 | # |
---|
1071 | ###################################################################### |
---|
1072 | function getEFOptions # <device> <checkMountPointOpt> |
---|
1073 | { |
---|
1074 | typeset sourceFile="mmcommon.sh" |
---|
1075 | [[ -n $DEBUG || -n $DEBUGgetEFOptions ]] && set -x |
---|
1076 | $mmTRACE_ENTER "$*" |
---|
1077 | typeset device=$1 |
---|
1078 | typeset checkMountPointOpt=$2 |
---|
1079 | |
---|
1080 | typeset rc=0 |
---|
1081 | typeset fsLine efOptions minorNumber nodesetId mountPoint fsType |
---|
1082 | typeset fsType fsHomeCluster |
---|
1083 | |
---|
1084 | [[ ! -f $mmsdrfsFile ]] && \ |
---|
1085 | checkForErrors "getEFOptions - Missing /var/mmfs/gen/mmsdrfs" 1 |
---|
1086 | |
---|
1087 | # Strip away any /dev/ prefix from the device id. |
---|
1088 | deviceName=${device##+(/)dev+(/)} |
---|
1089 | |
---|
1090 | # Verify the device name. |
---|
1091 | if [[ $deviceName = /* ]] |
---|
1092 | then |
---|
1093 | printErrorMsg 169 $mmcmd "$device" |
---|
1094 | rc=$MM_InvalidName |
---|
1095 | return $rc |
---|
1096 | elif [[ $deviceName = */* ]] |
---|
1097 | then |
---|
1098 | printErrorMsg 170 $mmcmd "$device" |
---|
1099 | rc=$MM_InvalidName |
---|
1100 | return $rc |
---|
1101 | fi |
---|
1102 | |
---|
1103 | # Make sure the mmsdrfs file is current. To avoid undesired side effects, |
---|
1104 | # tell gpfsInit to restrict mount point checking to only the file system |
---|
1105 | # that is subject to the current getEFOptions call. This is done only if |
---|
1106 | # the checkMountPointOpt parameter is set to "doMountPointCheck" or "yes". |
---|
1107 | [[ $checkMountPointOpt = "doMountPointCheck" || $checkMountPointOpt = "yes" ]] && \ |
---|
1108 | export MOUNT_POINT_CHECK="$deviceName" |
---|
1109 | gpfsInit nolock >/dev/null |
---|
1110 | checkForErrors gpfsInit $? |
---|
1111 | unset MOUNT_POINT_CHECK |
---|
1112 | |
---|
1113 | # The script looks for the SG_MOUNT line for the file system. |
---|
1114 | # It examines the individual fields and if they have a value, |
---|
1115 | # adds the value to the list. The fields are comma-separated. |
---|
1116 | # After the mount options are processed, the script looks for |
---|
1117 | # SG_DISKS lines and puts out the names of the first 50 disks. |
---|
1118 | # Disks that are excluded from SG descr operations are skipped. |
---|
1119 | # At the end, if a SG_MOUNT line was found, the script returns 0. |
---|
1120 | # Otherwise, the return code is set to 19 (ENODEV). |
---|
1121 | fsLine=$($awk -F: ' \ |
---|
1122 | BEGIN { \ |
---|
1123 | { n = 0 } \ |
---|
1124 | { mountPoint = "" } \ |
---|
1125 | { fsType = "" } \ |
---|
1126 | { exclOption = "" } \ |
---|
1127 | } \ |
---|
1128 | \ |
---|
1129 | $'$LINE_TYPE_Field' == "'$SG_HEADR'" && \ |
---|
1130 | $'$DEV_NAME_Field' == "'$deviceName'" { \ |
---|
1131 | { printf $'$NODESETID_Field' " " } \ |
---|
1132 | if ( $'$DEV_MINOR_Field' != "" ) { \ |
---|
1133 | { printf $'$DEV_MINOR_Field' " " } \ |
---|
1134 | } \ |
---|
1135 | else { \ |
---|
1136 | { printf "NULL " } \ |
---|
1137 | } \ |
---|
1138 | if ( $'$FS_TYPE_Field' == "'$remotefs'" ) { \ |
---|
1139 | { fsType = "remotefs" } \ |
---|
1140 | { remoteDevName = $'$REMOTE_DEV_NAME_Field' } \ |
---|
1141 | } \ |
---|
1142 | else { \ |
---|
1143 | { fsType = "localfs" } \ |
---|
1144 | } \ |
---|
1145 | { printf fsType " " } \ |
---|
1146 | } \ |
---|
1147 | \ |
---|
1148 | $'$LINE_TYPE_Field' == "'$SG_ETCFS'" && \ |
---|
1149 | $'$DEV_NAME_Field' == "'$deviceName'" && \ |
---|
1150 | $'$LINE_NUMBER_Field' == "'$MOUNT_POINT_Line'" { \ |
---|
1151 | { mountPoint = $'$ETCFS_TEXT_Field'":" } \ |
---|
1152 | } \ |
---|
1153 | \ |
---|
1154 | $'$LINE_TYPE_Field' == "'$SG_MOUNT'" && \ |
---|
1155 | $'$DEV_NAME_Field' == "'$deviceName'" { \ |
---|
1156 | { printf $'$RW_OPT_Field' } \ |
---|
1157 | if ( $'$MTIME_OPT_Field' != "" ) { \ |
---|
1158 | { printf ","$'$MTIME_OPT_Field' } \ |
---|
1159 | } \ |
---|
1160 | if ( $'$ATIME_OPT_Field' != "" ) { \ |
---|
1161 | { printf ","$'$ATIME_OPT_Field' } \ |
---|
1162 | } \ |
---|
1163 | if ( $'$OTHER_OPT_Field' != "" ) { \ |
---|
1164 | { printf ","$'$OTHER_OPT_Field' } \ |
---|
1165 | } \ |
---|
1166 | if ( $'$QUOTA_OPT_Field' != "" ) { \ |
---|
1167 | { printf ",quota="$'$QUOTA_OPT_Field' } \ |
---|
1168 | } \ |
---|
1169 | if ( fsType == "remotefs" ) { \ |
---|
1170 | { printf ",dev="$'$NODESETID_Field'":"remoteDevName } \ |
---|
1171 | { printf ",ldev='$deviceName'" } \ |
---|
1172 | } \ |
---|
1173 | { next } \ |
---|
1174 | } \ |
---|
1175 | \ |
---|
1176 | $'$LINE_TYPE_Field' == "'$SG_DISKS'" && \ |
---|
1177 | $'$DEV_NAME_Field' == "'$deviceName'" { \ |
---|
1178 | if ( $'$EXCLUDE_Field' == "'$excludedDisk'") { \ |
---|
1179 | { exclOption = ",exclDisks=yes" } \ |
---|
1180 | } \ |
---|
1181 | else if ( $'$DISK_STATUS_Field' == "" || \ |
---|
1182 | $'$DISK_STATUS_Field' == "ready" ) { \ |
---|
1183 | { diskType = $'$DISK_TYPE_Field' } \ |
---|
1184 | # Map certain disk types to the default GPFS driver type. \ |
---|
1185 | if ( diskType == "lv" || diskType == "vsd" ) { \ |
---|
1186 | { diskType = "" } \ |
---|
1187 | } \ |
---|
1188 | if ( n == 0 ) { \ |
---|
1189 | { printf ",disks="$'$DISK_NAME_Field'":"diskType } \ |
---|
1190 | { n = n + 1 } \ |
---|
1191 | { next } \ |
---|
1192 | } \ |
---|
1193 | else if ( n < 50 ) { \ |
---|
1194 | { printf ";"$'$DISK_NAME_Field'":"diskType } \ |
---|
1195 | { n = n + 1 } \ |
---|
1196 | { next } \ |
---|
1197 | } \ |
---|
1198 | else { \ |
---|
1199 | { exit } \ |
---|
1200 | } \ |
---|
1201 | } \ |
---|
1202 | } \ |
---|
1203 | \ |
---|
1204 | END { \ |
---|
1205 | if ( fsType == "" ) { \ |
---|
1206 | # Filesystem not found. Return ENODEV. \ |
---|
1207 | { exit '$MM_FsNotFound' } \ |
---|
1208 | } \ |
---|
1209 | else { \ |
---|
1210 | if ( exclOption != "" ) { \ |
---|
1211 | { printf exclOption } \ |
---|
1212 | } \ |
---|
1213 | # Filesystem found. Add the mount point to the output. \ |
---|
1214 | { printf " " mountPoint "\n" } \ |
---|
1215 | { exit 0 } \ |
---|
1216 | } \ |
---|
1217 | } \ |
---|
1218 | ' $mmsdrfsFile) |
---|
1219 | rc=$? |
---|
1220 | if [[ $rc -ne 0 || -z $fsLine ]] |
---|
1221 | then |
---|
1222 | [[ $rc -eq 0 ]] && rc=1 |
---|
1223 | if [[ $rc -eq $MM_FsNotFound ]] |
---|
1224 | then |
---|
1225 | # File system not found. |
---|
1226 | printErrorMsg 288 $mmcmd "$device" |
---|
1227 | else |
---|
1228 | # Unexpected error. |
---|
1229 | checkForErrors awk $rc |
---|
1230 | fi |
---|
1231 | return $rc |
---|
1232 | fi |
---|
1233 | |
---|
1234 | # Parse the result. |
---|
1235 | set -f ; set -- $fsLine ; set +f |
---|
1236 | fsHomeCluster=$1 |
---|
1237 | minorNumber=$2 |
---|
1238 | fsType=$3 |
---|
1239 | efOptions=$4 |
---|
1240 | mountPoint=$5 |
---|
1241 | |
---|
1242 | # Exit with a message if invoked for a remote file system. |
---|
1243 | if [[ $fsType = remotefs ]] |
---|
1244 | then |
---|
1245 | # Command is not allowed for remote file systems. |
---|
1246 | printErrorMsg 106 $mmcmd "$device" $fsHomeCluster |
---|
1247 | return $MM_Remotefs |
---|
1248 | fi |
---|
1249 | |
---|
1250 | # Make sure the /dev entry looks good. Do this only if the |
---|
1251 | # checkMountPointOpt parameter is set to "doMountPointCheck". |
---|
1252 | if [[ $checkMountPointOpt = "doMountPointCheck" || $checkMountPointOpt = "yes" ]] |
---|
1253 | then |
---|
1254 | [[ $osName = Linux ]] && checkVfsNumber |
---|
1255 | confirmMajorMinor mount /dev/$deviceName $neededMajorNumber $minorNumber |
---|
1256 | rc=$? |
---|
1257 | if [[ $rc -ne 0 ]] |
---|
1258 | then |
---|
1259 | # /dev entry not created by GPFS. |
---|
1260 | printErrorMsg 462 "$mmcmd" "/dev/$deviceName" |
---|
1261 | # Pretend everything is OK and let the daemon |
---|
1262 | # decide whether it can mount the file system. |
---|
1263 | rc=0 |
---|
1264 | fi |
---|
1265 | fi # end of if [[ $checkMountPointOpt = "doMountPointCheck" ]] |
---|
1266 | |
---|
1267 | # Ensure the output does not overrun the daemon input buffers. |
---|
1268 | # If necessary, take out one or more disks from the efOptions string. |
---|
1269 | while [[ ${#efOptions} -gt 1023 ]] |
---|
1270 | do |
---|
1271 | efOptions="${efOptions%;*}" |
---|
1272 | done |
---|
1273 | |
---|
1274 | # Put out the result and return. |
---|
1275 | print -- "$efOptions" |
---|
1276 | print -- "$mountPoint" |
---|
1277 | return $rc |
---|
1278 | |
---|
1279 | } #----- end of function getEFOptions -------------------------- |
---|
1280 | |
---|
1281 | |
---|
1282 | ##################################################################### |
---|
1283 | # |
---|
1284 | # Function: Retrieve the mount point for a file system. |
---|
1285 | # |
---|
1286 | # Input: $1 - file system device name |
---|
1287 | # |
---|
1288 | # Output: The mount point for the file system. |
---|
1289 | # |
---|
1290 | # Returns: 0 - mount point generated successfully |
---|
1291 | # 19 (ENODEV) - file system not found |
---|
1292 | # 22 (EINVAL) - device name is not valid |
---|
1293 | # 1 - some other unexpected error |
---|
1294 | # |
---|
1295 | ##################################################################### |
---|
1296 | function getMountPoint # <device> |
---|
1297 | { |
---|
1298 | typeset sourceFile="mmcommon.sh" |
---|
1299 | [[ -n $DEBUG || -n $DEBUGgetMountPoint ]] && set -x |
---|
1300 | $mmTRACE_ENTER "$*" |
---|
1301 | typeset device=$1 |
---|
1302 | # typeset checkMountPointOpt=$2 |
---|
1303 | |
---|
1304 | typeset rc=0 |
---|
1305 | typeset mountPoint deviceName |
---|
1306 | |
---|
1307 | [[ ! -f $mmsdrfsFile ]] && \ |
---|
1308 | checkForErrors "getMountPoint - Missing /var/mmfs/gen/mmsdrfs" 1 |
---|
1309 | |
---|
1310 | # Strip away any /dev/ prefix from the device id. |
---|
1311 | deviceName=${device##+(/)dev+(/)} |
---|
1312 | |
---|
1313 | # Verify the device name. |
---|
1314 | if [[ $deviceName = /* ]] |
---|
1315 | then |
---|
1316 | printErrorMsg 169 $mmcmd "$device" |
---|
1317 | rc=$MM_InvalidName |
---|
1318 | return $rc |
---|
1319 | elif [[ $deviceName = */* ]] |
---|
1320 | then |
---|
1321 | printErrorMsg 170 $mmcmd "$device" |
---|
1322 | rc=$MM_InvalidName |
---|
1323 | return $rc |
---|
1324 | fi |
---|
1325 | |
---|
1326 | # Note: We will assume that at the point this function is invoked, |
---|
1327 | # the /etc/filesystems information in general, and the mount |
---|
1328 | # point in particular, are up-to date. Therefore, we will skip |
---|
1329 | # the call to gpfsInit. If this assumption turns out to be |
---|
1330 | # inaccurate, the sections of code that deal with gpfsInit |
---|
1331 | # and confirmMajorMinor will have to activated. |
---|
1332 | |
---|
1333 | # Make sure the mmsdrfs file is current. To avoid undesired side effects, |
---|
1334 | # tell gpfsInit to restrict mount point checking to only the file system |
---|
1335 | # that is subject to the current getMountPoint call. This is done only if |
---|
1336 | # the checkMountPointOpt parameter is set to "doMountPointCheck" or "yes". |
---|
1337 | # [[ $checkMountPointOpt = "doMountPointCheck" || $checkMountPointOpt = "yes" ]] && \ |
---|
1338 | # export MOUNT_POINT_CHECK="$deviceName" |
---|
1339 | # gpfsInit nolock >/dev/null |
---|
1340 | # checkForErrors gpfsInit $? |
---|
1341 | # unset MOUNT_POINT_CHECK |
---|
1342 | |
---|
1343 | # The script looks for the first SG_ETCFS line for the |
---|
1344 | # file system and prints the value of the mount point. |
---|
1345 | # If the line was found, the script returns 0. |
---|
1346 | # Otherwise, the return code is set to 19 (ENODEV). |
---|
1347 | mountPoint=$($awk -F: ' \ |
---|
1348 | $'$LINE_TYPE_Field' == "'$SG_ETCFS'" && \ |
---|
1349 | $'$DEV_NAME_Field' == "'$deviceName'" && \ |
---|
1350 | $'$LINE_NUMBER_Field' == "'$MOUNT_POINT_Line'" { \ |
---|
1351 | { mountPoint = $'$ETCFS_TEXT_Field'":" } \ |
---|
1352 | { exit } \ |
---|
1353 | } \ |
---|
1354 | END { \ |
---|
1355 | if ( mountPoint == "" ) { \ |
---|
1356 | # Filesystem not found. Return ENODEV. \ |
---|
1357 | { exit '$MM_FsNotFound' } \ |
---|
1358 | } \ |
---|
1359 | else { \ |
---|
1360 | # Filesystem found. Return the mount point. \ |
---|
1361 | { print mountPoint } \ |
---|
1362 | { exit 0 } \ |
---|
1363 | } \ |
---|
1364 | } \ |
---|
1365 | ' $mmsdrfsFile) |
---|
1366 | rc=$? |
---|
1367 | if [[ $rc -ne 0 || -z $mountPoint ]] |
---|
1368 | then |
---|
1369 | [[ $rc -eq 0 ]] && rc=1 |
---|
1370 | if [[ $rc -eq $MM_FsNotFound ]] |
---|
1371 | then |
---|
1372 | # File system not found. |
---|
1373 | printErrorMsg 288 $mmcmd "$device" |
---|
1374 | else |
---|
1375 | # Unexpected error. |
---|
1376 | checkForErrors awk $rc |
---|
1377 | fi |
---|
1378 | return $rc |
---|
1379 | fi |
---|
1380 | |
---|
1381 | # Make sure the /dev entry looks good. Do this only if the |
---|
1382 | # checkMountPointOpt parameter is set to "doMountPointCheck". |
---|
1383 | # if [[ $checkMountPointOpt = "doMountPointCheck" || $checkMountPointOpt = "yes" ]] |
---|
1384 | # then |
---|
1385 | # [[ $osName = Linux ]] && checkVfsNumber |
---|
1386 | # confirmMajorMinor mount /dev/$deviceName $neededMajorNumber $minorNumber |
---|
1387 | # rc=$? |
---|
1388 | # if [[ $rc -ne 0 ]] |
---|
1389 | # then |
---|
1390 | # # /dev entry not created by GPFS. |
---|
1391 | # printErrorMsg 462 "$mmcmd" "/dev/$deviceName" |
---|
1392 | # # Pretend everything is OK and let the daemon |
---|
1393 | # # decide whether it can mount the file system. |
---|
1394 | # rc=0 |
---|
1395 | # fi |
---|
1396 | # fi # end of if [[ $checkMountPointOpt = "doMountPointCheck" ]] |
---|
1397 | |
---|
1398 | # Put out the result and return. |
---|
1399 | print -- "$mountPoint" |
---|
1400 | return $rc |
---|
1401 | |
---|
1402 | } #----- end of function getMountPoint ------------------------- |
---|
1403 | |
---|
1404 | |
---|
1405 | ##################################################################### |
---|
1406 | # |
---|
1407 | # Function: This function is called by the mmfsd daemon during |
---|
1408 | # initialization, before it runs recovery for any VFS |
---|
1409 | # mount points that may already be mounted. The only |
---|
1410 | # thing that this function presently does is to invoke |
---|
1411 | # the /var/mmfs/etc/gpfsready user exit. |
---|
1412 | # |
---|
1413 | # Note: The daemon will wait until this script returns. |
---|
1414 | # Do not invoke long running commands synchronously |
---|
1415 | # from this function. Specifically, do not start |
---|
1416 | # mount commands here and do not do anything that |
---|
1417 | # assumes a mounted GPFS file system. |
---|
1418 | # |
---|
1419 | # Input: None |
---|
1420 | # |
---|
1421 | # Output: None |
---|
1422 | # |
---|
1423 | # Returns: 0 - no errors encountered |
---|
1424 | # 1 - unexpected error |
---|
1425 | # |
---|
1426 | ##################################################################### |
---|
1427 | function gpfsready # |
---|
1428 | { |
---|
1429 | typeset sourceFile="mmcommon.sh" |
---|
1430 | [[ -n $DEBUG || -n $DEBUGgpfsready ]] && set -x |
---|
1431 | $mmTRACE_ENTER "$*" |
---|
1432 | |
---|
1433 | print "$(date): mmcommon gpfsready invoked" |
---|
1434 | |
---|
1435 | ##################################################### |
---|
1436 | # Invoke the user exit, if it is properly installed. |
---|
1437 | ##################################################### |
---|
1438 | if [[ -x ${mmfscfgDir}gpfsready ]] |
---|
1439 | then |
---|
1440 | print "$(date): ${mmfscfgDir}gpfsready invoked" |
---|
1441 | ${mmfscfgDir}gpfsready |
---|
1442 | fi |
---|
1443 | |
---|
1444 | return 0 |
---|
1445 | |
---|
1446 | } #----- end of function gpfsready ------------------------- |
---|
1447 | |
---|
1448 | |
---|
1449 | ##################################################################### |
---|
1450 | # |
---|
1451 | # Function: This function is called by the mmfsd daemon when it is |
---|
1452 | # up and ready for sessions. It mounts all file systems |
---|
1453 | # that have to be mounted at daemon startup time and then |
---|
1454 | # invokes the /var/mmfs/etc/mmfsup user exit. |
---|
1455 | # |
---|
1456 | # Input: $1 - IP address of this node |
---|
1457 | # $2 - IP address of the config manager node |
---|
1458 | # |
---|
1459 | # Output: None |
---|
1460 | # |
---|
1461 | # Returns: 0 - no errors encountered |
---|
1462 | # 1 - unexpected error |
---|
1463 | # |
---|
1464 | ##################################################################### |
---|
1465 | function mmfsup # <localIPaddr> <ccMgrIPaddr> |
---|
1466 | { |
---|
1467 | typeset sourceFile="mmcommon.sh" |
---|
1468 | [[ -n $DEBUG || -n $DEBUGmmfsup ]] && set -x |
---|
1469 | $mmTRACE_ENTER "$*" |
---|
1470 | typeset localIPaddr=$1 |
---|
1471 | typeset ccMgrIPaddr=$2 |
---|
1472 | |
---|
1473 | typeset mountedFileSystems device mountOptions |
---|
1474 | |
---|
1475 | print "$(date): mmcommon mmfsup invoked" |
---|
1476 | |
---|
1477 | ############################################################## |
---|
1478 | # Mount all GPFS file systems for which -A yes was specified. |
---|
1479 | # If there are such file systems, their device names are put |
---|
1480 | # in file /var/mmfs/gen/automount. The device names in this |
---|
1481 | # file are ordered to avoid simultaneous mounting of the same |
---|
1482 | # file system from all nodes in the cluster. |
---|
1483 | ############################################################## |
---|
1484 | if [[ -s $startupMountFile && ! -f $ignoreStartupMount ]] |
---|
1485 | then |
---|
1486 | # Create a list of the currently mounted file systems on this node. |
---|
1487 | if [[ $osName = AIX ]] |
---|
1488 | then |
---|
1489 | $mount >$tmpfile 2>/dev/null |
---|
1490 | mountedFileSystems=$tmpfile |
---|
1491 | elif [[ $osName = Linux ]] |
---|
1492 | then |
---|
1493 | mountedFileSystems=/proc/mounts |
---|
1494 | else |
---|
1495 | # Should never get here. |
---|
1496 | printErrorMsg 171 "$mmcmd" "mmfsup: unsupported OS $osName" 1 |
---|
1497 | return 1 |
---|
1498 | fi # end of if [[ $osName = AIX ]] |
---|
1499 | |
---|
1500 | # Process the list of file systems. |
---|
1501 | exec 3< $startupMountFile |
---|
1502 | while read -u3 device |
---|
1503 | do |
---|
1504 | # If file ignoreStartupMount exists for this file system, |
---|
1505 | # do not attempt to mount it. |
---|
1506 | [[ -s ${ignoreStartupMount}.${device#/dev/} ]] && \ |
---|
1507 | continue |
---|
1508 | |
---|
1509 | # See if there are local override mount options for this file system. |
---|
1510 | if [[ -s ${localMountOptions}.${device#/dev/} ]] |
---|
1511 | then |
---|
1512 | mountOptions="-o $($tail -n -1 ${localMountOptions}.${device#/dev/} 2>/dev/null)" |
---|
1513 | else |
---|
1514 | mountOptions="" |
---|
1515 | fi |
---|
1516 | |
---|
1517 | # See if this file system is already mounted. |
---|
1518 | $grep -qw $device $tmpfile > /dev/null 2>&1 |
---|
1519 | if [[ $? -ne 0 ]] |
---|
1520 | then |
---|
1521 | # The file system is not mounted. Do it now. |
---|
1522 | print -- "$(date): mounting $device" |
---|
1523 | $mount $mountOptions $device 2>&1 | $grep -i -v "already mounted" |
---|
1524 | print -- "$(date): finished mounting $device" |
---|
1525 | fi |
---|
1526 | done |
---|
1527 | fi # end of if [[ -s $startupMountFile ]] |
---|
1528 | |
---|
1529 | ##################################################### |
---|
1530 | # Invoke the user exit, if it is properly installed. |
---|
1531 | ##################################################### |
---|
1532 | if [[ -x ${mmfscfgDir}mmfsup ]] |
---|
1533 | then |
---|
1534 | print "$(date): ${mmfscfgDir}mmfsup invoked" |
---|
1535 | ${mmfscfgDir}mmfsup $localIPaddr $ccMgrIPaddr |
---|
1536 | elif [[ -x ${mmfscfgDir}mmfsup.scr ]] |
---|
1537 | then |
---|
1538 | print "$(date): ${mmfscfgDir}mmfsup.scr invoked" |
---|
1539 | ${mmfscfgDir}mmfsup.scr $localIPaddr $ccMgrIPaddr |
---|
1540 | fi |
---|
1541 | |
---|
1542 | return 0 |
---|
1543 | |
---|
1544 | } #----- end of function mmfsup ------------------------- |
---|
1545 | |
---|
1546 | |
---|
1547 | ##################################################################### |
---|
1548 | # |
---|
1549 | # Function: This function is called by the mmfsd daemon during |
---|
1550 | # normal and abnormal sutdown processing. A number of |
---|
1551 | # cleanup tasks are performed and then the function |
---|
1552 | # invokes the /var/mmfs/etc/mmfsdown user exit. |
---|
1553 | # |
---|
1554 | # Input: None |
---|
1555 | # |
---|
1556 | # Output: None |
---|
1557 | # |
---|
1558 | # Returns: 0 - no errors encountered |
---|
1559 | # 1 - unexpected error |
---|
1560 | # |
---|
1561 | ##################################################################### |
---|
1562 | function mmfsdown # |
---|
1563 | { |
---|
1564 | typeset sourceFile="mmcommon.sh" |
---|
1565 | [[ -n $DEBUG || -n $DEBUGmmfsdown ]] && set -x |
---|
1566 | $mmTRACE_ENTER "$*" |
---|
1567 | |
---|
1568 | typeset pid status |
---|
1569 | |
---|
1570 | ############################################ |
---|
1571 | # Determine whether GPFS will be restarted. |
---|
1572 | ############################################ |
---|
1573 | pid=$($ps -eo "pid args" | $awk '/\/runmmfs/ && !/this process/ {print $1}') |
---|
1574 | if [[ -n $pid && -f $rerunmmfsFile ]] |
---|
1575 | then |
---|
1576 | status=active |
---|
1577 | else |
---|
1578 | status=down |
---|
1579 | fi |
---|
1580 | |
---|
1581 | print "$(date): mmcommon mmfsdown invoked. Subsystem: mmfs Status: $status" |
---|
1582 | ######################## |
---|
1583 | # Do the cleanup tasks. |
---|
1584 | ######################## |
---|
1585 | if [[ $status = active ]] |
---|
1586 | then |
---|
1587 | #--------------------------------------------- |
---|
1588 | # The GPFS daemon died but will be restarted. |
---|
1589 | #--------------------------------------------- |
---|
1590 | if [[ -n "$MMTRACE" ]] |
---|
1591 | then |
---|
1592 | # If the MMTRACE environment variable is set, |
---|
1593 | # stop tracing on this node. |
---|
1594 | $mmtrace stop |
---|
1595 | |
---|
1596 | if [[ $MMTRACE = global ]] |
---|
1597 | then |
---|
1598 | # If tracing was started on all nodes, cut trace |
---|
1599 | # records on all of the nodes in the cluster. |
---|
1600 | getNodeList $REL_HOSTNAME_Field $GLOBAL_ID $mmsdrfsFile > $nodefile |
---|
1601 | $mmcommon onall $nodefile $unreachedNodes adminCmd mmtrace |
---|
1602 | fi |
---|
1603 | fi # end of if [[ -n "$MMTRACE" ]] |
---|
1604 | |
---|
1605 | else |
---|
1606 | #----------------------------------- |
---|
1607 | # The GPFS daemon is shutting down. |
---|
1608 | #----------------------------------- |
---|
1609 | if [[ -n "$MMTRACE" ]] |
---|
1610 | then |
---|
1611 | # If the MMTRACE environment variable is set, |
---|
1612 | # stop tracing on this node. |
---|
1613 | $mmtrace stop |
---|
1614 | fi |
---|
1615 | |
---|
1616 | # Force unmount of all gpfs file systems. |
---|
1617 | printInfoMsg 426 "$(date)" $mmcmd |
---|
1618 | if [[ $osName = AIX ]] |
---|
1619 | then |
---|
1620 | unmountFileSystems all -f 2>/dev/null |
---|
1621 | elif [[ $osName = Linux ]] |
---|
1622 | then |
---|
1623 | # Note: Do not redirect stderr on Linux umount. |
---|
1624 | unmountFileSystems all -f |
---|
1625 | else |
---|
1626 | # Should never get here. |
---|
1627 | printErrorMsg 171 "$mmcmd" "mmfsdown: unsupported OS $osName" 1 |
---|
1628 | return 1 |
---|
1629 | fi |
---|
1630 | |
---|
1631 | # Remove the respawn file since the daemon will not be restarted. |
---|
1632 | $rm -f $respawnlog |
---|
1633 | |
---|
1634 | fi # end of if [[ $status = active ]] |
---|
1635 | |
---|
1636 | ##################################################### |
---|
1637 | # Invoke the user exit, if it is properly installed. |
---|
1638 | ##################################################### |
---|
1639 | if [[ -x ${mmfscfgDir}mmfsdown ]] |
---|
1640 | then |
---|
1641 | print "$(date): ${mmfscfgDir}mmfsdown invoked" |
---|
1642 | ${mmfscfgDir}mmfsdown $status |
---|
1643 | elif [[ -x ${mmfscfgDir}mmfsdown.scr ]] |
---|
1644 | then |
---|
1645 | print "$(date): ${mmfscfgDir}mmfsdown.scr invoked" |
---|
1646 | ${mmfscfgDir}mmfsdown.scr $status |
---|
1647 | fi |
---|
1648 | |
---|
1649 | return 0 |
---|
1650 | |
---|
1651 | } #----- end of function mmfsdown ------------------------- |
---|
1652 | |
---|
1653 | |
---|
1654 | ##################################################################### |
---|
1655 | # |
---|
1656 | # Function: This function is called prior to unmounting a file system |
---|
1657 | # in response to an explicit mmumount or mmshutdown command. |
---|
1658 | # The function is also invoked by the mmfsd daemon during |
---|
1659 | # normal and abnormal shutdown processing. |
---|
1660 | # |
---|
1661 | # Input: $1 - file system device name or all |
---|
1662 | # $2 - reason: umount or cleanup |
---|
1663 | # |
---|
1664 | # Output: None |
---|
1665 | # |
---|
1666 | # Returns: 0 - no errors encountered |
---|
1667 | # 1 - unexpected error |
---|
1668 | # |
---|
1669 | ##################################################################### |
---|
1670 | function preunmount # <device> <reason> |
---|
1671 | { |
---|
1672 | typeset sourceFile="mmcommon.sh" |
---|
1673 | [[ -n $DEBUG || -n $DEBUGpreunmount ]] && set -x |
---|
1674 | $mmTRACE_ENTER "$*" |
---|
1675 | typeset device=$1 |
---|
1676 | typeset reason=$2 |
---|
1677 | |
---|
1678 | typeset timeout=5 |
---|
1679 | typeset waited=0 |
---|
1680 | typeset retrydelay=1 |
---|
1681 | typeset pid |
---|
1682 | |
---|
1683 | |
---|
1684 | ################################################################### |
---|
1685 | # If the reason for the call is daemon cleanup, determine if this |
---|
1686 | # is a normal or abnormal shutdown. If normal shutdown, the exit |
---|
1687 | # must have already been invoked by mmremote shutdownDaemon. |
---|
1688 | ################################################################### |
---|
1689 | if [[ -x ${mmfscfgDir}preunmount ]] |
---|
1690 | then |
---|
1691 | print "$(date): mmcommon preunmount invoked. File system: $device Reason: $reason" |
---|
1692 | fi |
---|
1693 | if [[ $reason = cleanup ]] |
---|
1694 | then |
---|
1695 | # Determine whether GPFS will be restarted. |
---|
1696 | pid=$($ps -eo "pid args" | $awk '/\/runmmfs/ && !/this process/ {print $1}') |
---|
1697 | if [[ -n $pid && -f $rerunmmfsFile ]] |
---|
1698 | then |
---|
1699 | # This is abnormal shutdown; the daemon will be restarted. |
---|
1700 | : # keep going with the rest of the code. |
---|
1701 | else |
---|
1702 | # This is normal shutdown; the daemon will not be restarted. |
---|
1703 | # This function must have already been invoked by mmremote shutdownDaemon. |
---|
1704 | return 0 |
---|
1705 | fi |
---|
1706 | fi # end of if [[ $reason = cleanup ]] |
---|
1707 | |
---|
1708 | ############################################################# |
---|
1709 | # Invoke the user exit, if it is properly installed. |
---|
1710 | # Allow no more than 5 seconds for the user code to finish. |
---|
1711 | # If the user process does not return within this time, |
---|
1712 | # the function will return. This is intended to prevent |
---|
1713 | # GPFS recovery from hanging. |
---|
1714 | ############################################################# |
---|
1715 | if [[ -x ${mmfscfgDir}preunmount ]] |
---|
1716 | then |
---|
1717 | print "$(date): ${mmfscfgDir}preunmount invoked" |
---|
1718 | ${mmfscfgDir}preunmount $device $reason & |
---|
1719 | pid=$! |
---|
1720 | |
---|
1721 | # Wait until the user exit finishes or the timeout expires. |
---|
1722 | while [[ $waited -lt $timeout ]] |
---|
1723 | do |
---|
1724 | $sleep $retrydelay |
---|
1725 | (( waited = waited + retrydelay )) |
---|
1726 | |
---|
1727 | if ! kill -0 $pid 2>/dev/null |
---|
1728 | then |
---|
1729 | # The user process finished. |
---|
1730 | waited=-1 |
---|
1731 | break |
---|
1732 | fi |
---|
1733 | done # while [[ $waited -lt $timeout ]] |
---|
1734 | |
---|
1735 | # Inform the user if the exit did not finish in the alloted time. |
---|
1736 | if [[ $waited -gt 0 ]] |
---|
1737 | then |
---|
1738 | print "$(date): ${mmfscfgDir}preunmount not finished after $waited seconds." |
---|
1739 | print " The process is left to run in the background." |
---|
1740 | fi |
---|
1741 | fi # end of if [[ -x ${mmfscfgDir}preunmount ]] |
---|
1742 | |
---|
1743 | return 0 |
---|
1744 | |
---|
1745 | } #------------ end of function preunmount ------------------------- |
---|
1746 | |
---|
1747 | |
---|
1748 | ##################################################################### |
---|
1749 | # |
---|
1750 | # Function: This function is called by the mmfsd daemon during |
---|
1751 | # node failure recovery before any distributed locks |
---|
1752 | # held by failed nodes are released. This script is |
---|
1753 | # invoked once for each file system on all nodes on |
---|
1754 | # which the file system is mounted or otherwise in use. |
---|
1755 | # The only thing that this function presently does is |
---|
1756 | # to invoke the /var/mmfs/etc/gpfsrecover user exit. |
---|
1757 | # |
---|
1758 | # Note: The daemon will wait until this script returns. |
---|
1759 | # Do not invoke long running commands synchronously |
---|
1760 | # from this function. Specifically, do not start |
---|
1761 | # mount commands here and do not attempt to access |
---|
1762 | # any GPFS files or directories. |
---|
1763 | # |
---|
1764 | # Input: $1 - file system name |
---|
1765 | # $2 - recovery phase (always 0) |
---|
1766 | # $3, $4, ... - node numbers of the failed nodes. |
---|
1767 | # |
---|
1768 | # Output: None |
---|
1769 | # |
---|
1770 | # Returns: 0 - no errors encountered |
---|
1771 | # 1 - unexpected error |
---|
1772 | # |
---|
1773 | ##################################################################### |
---|
1774 | function gpfsrecover # |
---|
1775 | { |
---|
1776 | typeset sourceFile="mmcommon.sh" |
---|
1777 | [[ -n $DEBUG || -n $DEBUGgpfsrecover ]] && set -x |
---|
1778 | $mmTRACE_ENTER "$*" |
---|
1779 | typeset fsname=$1 |
---|
1780 | typeset phase=$2 |
---|
1781 | shift 2 |
---|
1782 | typeset failedNodes=$* |
---|
1783 | |
---|
1784 | print "$(date): mmcommon gpfsrecover invoked:" |
---|
1785 | print " fsname=$fsname phase=$phase failed nodes=\"$failedNodes\"" |
---|
1786 | |
---|
1787 | ##################################################### |
---|
1788 | # Invoke the user exit, if it is properly installed. |
---|
1789 | ##################################################### |
---|
1790 | if [[ -x ${mmfscfgDir}gpfsrecover ]] |
---|
1791 | then |
---|
1792 | print "$(date): ${mmfscfgDir}gpfsrecover invoked" |
---|
1793 | ${mmfscfgDir}gpfsrecover $fsname $phase $failedNodes |
---|
1794 | elif [[ -x ${mmfscfgDir}gpfsrecover.scr ]] |
---|
1795 | then |
---|
1796 | print "$(date): ${mmfscfgDir}gpfsrecover.scr invoked" |
---|
1797 | ${mmfscfgDir}gpfsrecover.scr $fsname $phase $failedNodes |
---|
1798 | fi |
---|
1799 | |
---|
1800 | return 0 |
---|
1801 | |
---|
1802 | } #----- end of function gpfsrecover ------------------------- |
---|
1803 | |
---|
1804 | |
---|
1805 | ##################################################################### |
---|
1806 | # |
---|
1807 | # Function: Reconcile the mmsdrfs file with the GPFS daemon's data |
---|
1808 | # for the passed filesystem. |
---|
1809 | # |
---|
1810 | # Input: fsname |
---|
1811 | # |
---|
1812 | # Output: The mmsdrfs file is brought into sync with the |
---|
1813 | # GPFS daemon's view of the passed filesystem. |
---|
1814 | # |
---|
1815 | # Returns: 0 - no errors encountered |
---|
1816 | # 1 - unexpected error |
---|
1817 | # |
---|
1818 | ##################################################################### |
---|
1819 | function recoverfs # <fsname> |
---|
1820 | { |
---|
1821 | typeset sourceFile="mmcommon.sh" |
---|
1822 | [[ -n $DEBUG || -n $DEBUGrecoverfs ]] && set -x |
---|
1823 | $mmTRACE_ENTER "$*" |
---|
1824 | |
---|
1825 | typeset fsname=$1 |
---|
1826 | typeset nodeCount versionLine rc oddState |
---|
1827 | typeset findFSoutput fqDeviceName deviceName fsHomeCluster |
---|
1828 | integer newGenNumber |
---|
1829 | |
---|
1830 | # Set up trap exception handling and call the gpfsInit function. |
---|
1831 | # It will ensure that the local copy of the mmsdrfs and the rest of the |
---|
1832 | # GPFS system files are up-to-date and it will also obtain the sdr lock. |
---|
1833 | trap pretrap HUP INT QUIT KILL |
---|
1834 | gpfsInitOutput=$(gpfsInit $lockId) |
---|
1835 | setGlobalVar $? $gpfsInitOutput |
---|
1836 | |
---|
1837 | findFSoutput=$(findFS "$fsname" $mmsdrfsFile) |
---|
1838 | [[ -z $findFSoutput ]] && cleanupAndExit |
---|
1839 | |
---|
1840 | # Parse the output from the findFS function. |
---|
1841 | set -f ; set -- $findFSoutput ; set +f |
---|
1842 | fqDeviceName=$1 |
---|
1843 | deviceName=$2 |
---|
1844 | fsHomeCluster=$3 |
---|
1845 | |
---|
1846 | # Exit with a message if the command was invoked for a remote file system. |
---|
1847 | if [[ $fsHomeCluster != $HOME_CLUSTER ]] |
---|
1848 | then |
---|
1849 | # Command is not allowed for remote file systems. |
---|
1850 | printErrorMsg 106 $mmcmd $fsname $fsHomeCluster |
---|
1851 | cleanupAndExit |
---|
1852 | fi |
---|
1853 | |
---|
1854 | # Create a file with the reliable names of the nodes that belong to |
---|
1855 | # the nodeset to which the specified file system belongs. |
---|
1856 | $rm -f $nodefile |
---|
1857 | nodeCount=$(getNodeFile $REL_HOSTNAME_Field $fsHomeCluster $mmsdrfsFile $nodefile) |
---|
1858 | if [[ $nodeCount -eq 0 ]] |
---|
1859 | then |
---|
1860 | # The nodeset is empty; there is nobody to run the command. |
---|
1861 | printErrorMsg 171 $mmcmd "getNodeFile (nodeCount=0)" 1 |
---|
1862 | cleanupAndExit |
---|
1863 | fi |
---|
1864 | |
---|
1865 | # Copy the sdrfs file to a temporary file. |
---|
1866 | $cp $mmsdrfsFile $tmpsdrfs |
---|
1867 | |
---|
1868 | # Reconcile the sdrfs file with the GPFS daemon's view of the filesystem. |
---|
1869 | oddState=$(reconcileSdrfsWithDaemon $deviceName $tmpsdrfs) |
---|
1870 | rc=$? |
---|
1871 | if [[ $rc -ne 0 ]] |
---|
1872 | then |
---|
1873 | # reconcileSdrfsWithDaemon failed. |
---|
1874 | printErrorMsg 171 $mmcmd reconcileSdrfsWithDaemon $rc |
---|
1875 | cleanupAndExit |
---|
1876 | fi |
---|
1877 | |
---|
1878 | # Obtain the generation number from the version line of the new sdrfs file. |
---|
1879 | versionLine=$($head -1 $tmpsdrfs) |
---|
1880 | IFS=':' |
---|
1881 | set -f ; set -- $versionLine ; set +f |
---|
1882 | newGenNumber=$6 |
---|
1883 | IFS="$IFS_sv" |
---|
1884 | |
---|
1885 | # Commit the new mmsdrfs file. |
---|
1886 | trap "" HUP INT QUIT KILL # Disable interrupts until the commit is done. |
---|
1887 | gpfsObjectInfo=$(commitChanges \ |
---|
1888 | $GLOBAL_ID $fsHomeCluster $gpfsObjectInfo $newGenNumber $tmpsdrfs $primaryServer) |
---|
1889 | rc=$? |
---|
1890 | if [[ $rc -ne 0 ]] |
---|
1891 | then |
---|
1892 | # The commit step failed. |
---|
1893 | printErrorMsg 381 $mmcmd |
---|
1894 | # Tell the user what to do. |
---|
1895 | printErrorMsg 190 $mmcmd $fsname $fsname |
---|
1896 | cleanupAndExit |
---|
1897 | fi |
---|
1898 | |
---|
1899 | # Unlock the sdr. |
---|
1900 | [[ $sdrLocked = yes ]] && \ |
---|
1901 | freeLockOnServer $primaryServer $ourNodeNumber > /dev/null |
---|
1902 | sdrLocked=no |
---|
1903 | trap posttrap HUP INT QUIT KILL # Enable interrupts again. |
---|
1904 | |
---|
1905 | # Propagate the changes to all affected nodes. |
---|
1906 | propagateSdrfsFile async $nodefile $mmsdrfsFile $newGenNumber |
---|
1907 | |
---|
1908 | # If installed, invoke the syncfsconfig user exit. |
---|
1909 | if [[ -x $syncfsconfig ]] |
---|
1910 | then |
---|
1911 | print -- "$mmcmd: Starting $syncfsconfig ..." |
---|
1912 | $syncfsconfig |
---|
1913 | print -- "$mmcmd: $syncfsconfig finished." |
---|
1914 | fi |
---|
1915 | |
---|
1916 | cleanupAndExit 0 |
---|
1917 | |
---|
1918 | } #----- end of function recoverfs ------------------------------ |
---|
1919 | |
---|
1920 | |
---|
1921 | ##################################################################### |
---|
1922 | # |
---|
1923 | # Function: Reset the starting integer for NSD names generation. |
---|
1924 | # This is a service-only command. |
---|
1925 | # |
---|
1926 | # Input: $1 - nsdBaseNumber |
---|
1927 | # |
---|
1928 | # Output: None |
---|
1929 | # |
---|
1930 | # Returns: 0 - no errors encountered |
---|
1931 | # 1 - unexpected error |
---|
1932 | # |
---|
1933 | ##################################################################### |
---|
1934 | function resetNsdNumber # <nsdBaseNumber> |
---|
1935 | { |
---|
1936 | typeset sourceFile="mmcommon.sh" |
---|
1937 | [[ -n $DEBUG || -n $DEBUGresetNsdNumber ]] && set -x |
---|
1938 | $mmTRACE_ENTER "$*" |
---|
1939 | typeset nsdBaseNumber=$1 |
---|
1940 | |
---|
1941 | typeset gpfsInitOutput sdrfsLine newGenNumber |
---|
1942 | typeset rc |
---|
1943 | |
---|
1944 | ####################################################################### |
---|
1945 | # Set up trap exception handling and call the gpfsInit function. |
---|
1946 | # It will ensure that the local copy of the mmsdrfs and the rest of |
---|
1947 | # the GPFS system files are up-to-date and will obtain the sdr lock. |
---|
1948 | ####################################################################### |
---|
1949 | trap pretrap HUP INT QUIT KILL |
---|
1950 | gpfsInitOutput=$(gpfsInit $lockId) |
---|
1951 | setGlobalVar $? $gpfsInitOutput |
---|
1952 | |
---|
1953 | ######################################################################## |
---|
1954 | # Go through the current mmsdrfs file. Increment the generation |
---|
1955 | # number and build the node name lists that will be needed later. |
---|
1956 | # Set HIGHEST_GPFS_DISK_NBR_Field to the specified value. |
---|
1957 | ######################################################################## |
---|
1958 | $rm -f $newsdrfs $nodefile |
---|
1959 | IFS=":" |
---|
1960 | exec 3<&- |
---|
1961 | exec 3< $mmsdrfsFile |
---|
1962 | while read -u3 sdrfsLine |
---|
1963 | do |
---|
1964 | # Parse the line. |
---|
1965 | set -f ; set -A v -- - $sdrfsLine ; set +f |
---|
1966 | IFS="$IFS_sv" |
---|
1967 | |
---|
1968 | case ${v[$LINE_TYPE_Field]} in |
---|
1969 | |
---|
1970 | $VERSION_LINE ) # this is the global header line |
---|
1971 | # Increment the generation number |
---|
1972 | newGenNumber=${v[$SDRFS_GENNUM_Field]}+1 |
---|
1973 | v[$SDRFS_GENNUM_Field]=$newGenNumber |
---|
1974 | v[$HIGHEST_GPFS_DISK_NBR_Field]=$nsdBaseNumber |
---|
1975 | ;; |
---|
1976 | |
---|
1977 | $MEMBER_NODE ) # this line describes a node |
---|
1978 | # Collect the reliable names of all nodes in the cluster. |
---|
1979 | print -- "${v[$REL_HOSTNAME_Field]}" >> $nodefile |
---|
1980 | checkForErrors "writing to file $nodefile" $? |
---|
1981 | ;; |
---|
1982 | |
---|
1983 | $SG_DISKS ) # this line describes a disk |
---|
1984 | print -u2 "$mmcmd: There are disks in the cluster." |
---|
1985 | print -u2 "$mmcmd: The base number for naming disks cannot be changed." |
---|
1986 | cleanupAndExit |
---|
1987 | ;; |
---|
1988 | |
---|
1989 | * ) # We are not interested in any other lines. |
---|
1990 | ;; |
---|
1991 | |
---|
1992 | esac # end Change some of the fields |
---|
1993 | |
---|
1994 | # Build and write the line to the new mmsdrfs file. |
---|
1995 | print_newLine >> $newsdrfs |
---|
1996 | checkForErrors "writing to file $newsdrfs" $? |
---|
1997 | |
---|
1998 | IFS=":" # Change the separator back to ":" for the next iteration. |
---|
1999 | |
---|
2000 | done # end while read -u3 |
---|
2001 | |
---|
2002 | IFS="$IFS_sv" # Restore the default IFS settings. |
---|
2003 | |
---|
2004 | ####################### |
---|
2005 | # Commit the changes. |
---|
2006 | ####################### |
---|
2007 | trap "" HUP INT QUIT KILL |
---|
2008 | gpfsObjectInfo=$(commitChanges \ |
---|
2009 | $nsId $nsId $gpfsObjectInfo $newGenNumber $newsdrfs $primaryServer) |
---|
2010 | rc=$? |
---|
2011 | if [[ $rc -ne 0 ]] |
---|
2012 | then |
---|
2013 | # The commit step failed |
---|
2014 | printErrorMsg 381 $mmcmd |
---|
2015 | cleanupAndExit |
---|
2016 | fi |
---|
2017 | |
---|
2018 | ################## |
---|
2019 | # Unlock the sdr. |
---|
2020 | ################## |
---|
2021 | [[ $sdrLocked = yes ]] && \ |
---|
2022 | freeLockOnServer $primaryServer $ourNodeNumber > /dev/null |
---|
2023 | sdrLocked=no |
---|
2024 | trap posttrap HUP INT QUIT KILL |
---|
2025 | |
---|
2026 | ############################################### |
---|
2027 | # Propagate the changes to all affected nodes. |
---|
2028 | ############################################### |
---|
2029 | propagateSdrfsFile async $nodefile $newsdrfs $newGenNumber |
---|
2030 | |
---|
2031 | cleanupAndExit 0 |
---|
2032 | |
---|
2033 | } #----- end of function resetNsdNumber -------------------------- |
---|
2034 | |
---|
2035 | |
---|
2036 | ###################################################################### |
---|
2037 | # |
---|
2038 | # Function: Save the specified file on both the primary and backup |
---|
2039 | # server nodes. Used in conjunction with tspreparedisk to |
---|
2040 | # create backup copy of the SG descriptor being migrated. |
---|
2041 | # The information is stored in /var/mmfs/tmp/mmimportfs |
---|
2042 | # The file name has the following format: |
---|
2043 | # tspreparedisk.diskDesc.<diskName>.<checksum>.<timestamp> |
---|
2044 | # |
---|
2045 | # Input: $1 - file name with the following format: |
---|
2046 | # /var/mmfs/tmp/tspreparedisk.diskDesc.<diskName> |
---|
2047 | # |
---|
2048 | # Output: None |
---|
2049 | # |
---|
2050 | # Returns: 0 - no errors encountered |
---|
2051 | # non-zero - error encounterred |
---|
2052 | # |
---|
2053 | ###################################################################### |
---|
2054 | function saveSGDescFile # <sgDescFile> |
---|
2055 | { |
---|
2056 | typeset sourceFile="mmcommon.sh" |
---|
2057 | [[ -n $DEBUG || -n $DEBUGsaveSGDescFile ]] && set -x |
---|
2058 | $mmTRACE_ENTER "$*" |
---|
2059 | typeset sgDescFile=$1 |
---|
2060 | |
---|
2061 | typeset sumOutput checksum timeStamp targetName serverNode |
---|
2062 | typeset mvResult keyword status errorCode |
---|
2063 | |
---|
2064 | if [[ $MMMODE != lc && $MMMODE != single ]] |
---|
2065 | then |
---|
2066 | # Command not supported. |
---|
2067 | printErrorMsg 376 "$mmcmd:saveSGDescFile" $MMMODE |
---|
2068 | cleanupAndExit |
---|
2069 | fi |
---|
2070 | |
---|
2071 | # Return ENOENT if file is not there or if it is empty. |
---|
2072 | [[ ! -s $sgDescFile ]] && \ |
---|
2073 | return 2 |
---|
2074 | |
---|
2075 | # Calculate the checksum for the source file. |
---|
2076 | sumOutput=$($sum $sgDescFile) |
---|
2077 | checkForErrors "sum $sgDescFile" $? |
---|
2078 | set -f ; set -- $sumOutput ; set +f |
---|
2079 | checksum=$1 |
---|
2080 | |
---|
2081 | # Get a current timestamp. |
---|
2082 | timeStamp=$($perl -e 'print time') |
---|
2083 | |
---|
2084 | # Generate the name under which the file will be stored |
---|
2085 | # on the primary and backup configuration servers. |
---|
2086 | targetName=${tmpDir}mmimportfs/${sgDescFile##*/}.${checksum}.${timeStamp} |
---|
2087 | |
---|
2088 | # Commit the file to the server nodes. |
---|
2089 | [[ -z $primaryServer ]] && determineMode |
---|
2090 | for serverNode in $(print -- "$primaryServer $backupServer") |
---|
2091 | do |
---|
2092 | if [[ $serverNode = $ourNodeName ]] |
---|
2093 | then |
---|
2094 | mvResult=$($mmremote mvSGDescFile \ |
---|
2095 | $sgDescFile $targetName $checksum $ourNodeName) |
---|
2096 | rc=$? |
---|
2097 | else |
---|
2098 | mvResult=$(run onNode $serverNode mvSGDescFile \ |
---|
2099 | $sgDescFile $targetName $checksum $ourNodeName) |
---|
2100 | rc=$? |
---|
2101 | fi |
---|
2102 | |
---|
2103 | # Parse the result. |
---|
2104 | IFS=":" |
---|
2105 | set -f ; set -- $mvResult ; set +f |
---|
2106 | keyword=$1 |
---|
2107 | status=$2 |
---|
2108 | errorCode=$3 |
---|
2109 | IFS="$IFS_sv" |
---|
2110 | |
---|
2111 | if [[ $keyword != mvSGDescFile ]] |
---|
2112 | then |
---|
2113 | # Unexpected error from mmremote or mmdsh. |
---|
2114 | printErrorMsg 171 $mmcmd "mmremote mvSGDescFile" 1 |
---|
2115 | return 1 |
---|
2116 | fi |
---|
2117 | |
---|
2118 | if [[ $status != success ]] |
---|
2119 | then |
---|
2120 | if [[ $errorCode = copyfile || $errorCode = checksum ]] |
---|
2121 | then |
---|
2122 | # Error retrieving data from client. |
---|
2123 | printErrorMsg 379 $mmcmd $ourNodeName $serverNode |
---|
2124 | else |
---|
2125 | # Unexpected error from mmremote or mmdsh. |
---|
2126 | printErrorMsg 171 $mmcmd "mmremote mvSGDescFile" 1 |
---|
2127 | fi |
---|
2128 | return 1 |
---|
2129 | fi # end of if [[ $status != success ]] |
---|
2130 | |
---|
2131 | done # for serverNode in $(print -- "$primaryServer $backupServer") |
---|
2132 | |
---|
2133 | |
---|
2134 | # Everything seems to have worked fine. |
---|
2135 | # Remove the source file and return. |
---|
2136 | $rm -f $sgDescFile |
---|
2137 | return 0 |
---|
2138 | |
---|
2139 | } #----- end of function saveSGDescFile ------------------------- |
---|
2140 | |
---|
2141 | |
---|
2142 | |
---|
2143 | ####################### |
---|
2144 | # Mainline processing |
---|
2145 | ####################### |
---|
2146 | |
---|
2147 | kword=$arg1 |
---|
2148 | kword_lc=$arg1 |
---|
2149 | arg3_lc=$arg3 |
---|
2150 | |
---|
2151 | if [[ -z $kword ]] |
---|
2152 | then |
---|
2153 | # Missing keyword |
---|
2154 | printErrorMsg 133 mmcommon NULL |
---|
2155 | cleanupAndExit |
---|
2156 | fi |
---|
2157 | |
---|
2158 | # Set up silent trap exception handling. |
---|
2159 | trap pretrap3 HUP INT QUIT KILL |
---|
2160 | |
---|
2161 | # Determine the execution environment and set needed global variables. |
---|
2162 | if [[ $arg3_lc = checknewclusternode* || |
---|
2163 | $arg3_lc = removefromclustercr || |
---|
2164 | $kword_lc = getdiskdevices ]] |
---|
2165 | then |
---|
2166 | # If the node is not yet a member of the GPFS cluster, |
---|
2167 | # the functions to determine the local data do not work. |
---|
2168 | [[ -z $ourNodeName ]] && ourNodeName=$($hostname) |
---|
2169 | else |
---|
2170 | # In all other cases, file mmsdrfs should already exist |
---|
2171 | # and we can use it as a starting point. |
---|
2172 | [[ -z $MMMODE || -z $environmentType ]] && determineMode |
---|
2173 | getLocalNodeData |
---|
2174 | fi |
---|
2175 | |
---|
2176 | # Make sure we have the proper credentials. |
---|
2177 | [[ $getCredCalled = no ]] && getCred |
---|
2178 | |
---|
2179 | # Reset the remote commands if necessary. |
---|
2180 | [[ -n $GPFS_rshPath ]] && rsh=$GPFS_rshPath |
---|
2181 | [[ -n $GPFS_rcpPath ]] && rcp=$GPFS_rcpPath |
---|
2182 | |
---|
2183 | # Perform the action requested by the keyword. |
---|
2184 | case $kword_lc in |
---|
2185 | |
---|
2186 | #---------------------------------------- |
---|
2187 | init) # mmcommon init <lockid | nolock> |
---|
2188 | #---------------------------------------- |
---|
2189 | if [[ $argc -ne 2 ]] |
---|
2190 | then |
---|
2191 | operands="<lockid | nolock>" |
---|
2192 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2193 | cleanupAndExit |
---|
2194 | fi |
---|
2195 | |
---|
2196 | # Update local system files; lock the sdr if requested. |
---|
2197 | gpfsInit $arg2 |
---|
2198 | rc=$? |
---|
2199 | ;; |
---|
2200 | |
---|
2201 | #---------------------------------------- |
---|
2202 | getlocalnodename) # mmcommon getLocalNodeName |
---|
2203 | #---------------------------------------- |
---|
2204 | print -- "$ourNodeName" |
---|
2205 | rc=0 |
---|
2206 | ;; |
---|
2207 | |
---|
2208 | #---------------------------------------- |
---|
2209 | getclusternodes) # mmcommon getClusterNodes |
---|
2210 | #---------------------------------------- |
---|
2211 | # Return the reliable hostnames of all nodes in the cluster. |
---|
2212 | getNodeList $REL_HOSTNAME_Field $GLOBAL_ID $mmsdrfsFile |
---|
2213 | rc=$? |
---|
2214 | ;; |
---|
2215 | |
---|
2216 | #---------------------------------------- |
---|
2217 | getnodedatafordaemon) # mmcommon getNodeDataForDaemon <clType> |
---|
2218 | #---------------------------------------- |
---|
2219 | # Set MMMODE from the passed cluster type parameter. |
---|
2220 | [[ -n $arg2 ]] && export MMMODE=$arg2 |
---|
2221 | |
---|
2222 | # Get the data from the mmsdrfs file. |
---|
2223 | getNodeDataFromSdrfs $sdrNodeFile "." |
---|
2224 | rc=$? |
---|
2225 | |
---|
2226 | # Return the result to the caller via standard output. |
---|
2227 | [[ $rc -eq 0 ]] && $cat $sdrNodeFile |
---|
2228 | ;; |
---|
2229 | |
---|
2230 | #---------------------------------------- |
---|
2231 | getnodelist) # mmcommon getNodeList [norefresh] |
---|
2232 | #---------------------------------------- |
---|
2233 | # Get the data from the mmsdrfs file. |
---|
2234 | getNodeListFromSdrfs $sdrNodeFile $arg2 |
---|
2235 | rc=$? |
---|
2236 | |
---|
2237 | # Return the result to the caller via standard output. |
---|
2238 | [[ $rc -eq 0 ]] && $cat $sdrNodeFile |
---|
2239 | ;; |
---|
2240 | |
---|
2241 | #------------------------ |
---|
2242 | getdiskdevices) # mmcommon getDiskDevices |
---|
2243 | #------------------------ |
---|
2244 | # Generate a list of all disk devices known to this node. |
---|
2245 | getDiskDevices |
---|
2246 | rc=$? |
---|
2247 | ;; |
---|
2248 | |
---|
2249 | #--------------------------------------- |
---|
2250 | getvsdrpdnodedata) # mmcommon getVsdRpdNodeData <filename> |
---|
2251 | #--------------------------------------- |
---|
2252 | if [[ $argc -ne 2 ]] |
---|
2253 | then |
---|
2254 | operands="<filename>" |
---|
2255 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2256 | cleanupAndExit |
---|
2257 | fi |
---|
2258 | |
---|
2259 | # Obtain node-related data from the peer domain. |
---|
2260 | getVsdRpdNodeData $arg2 |
---|
2261 | rc=$? |
---|
2262 | ;; |
---|
2263 | |
---|
2264 | #---------------------------------------- |
---|
2265 | getvsddata) # mmcommon getVSDdata <filename> |
---|
2266 | #---------------------------------------- |
---|
2267 | if [[ $argc -ne 2 ]] |
---|
2268 | then |
---|
2269 | operands="<filename>" |
---|
2270 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2271 | cleanupAndExit |
---|
2272 | fi |
---|
2273 | |
---|
2274 | # Call routine to extract vsd information based on |
---|
2275 | # which type of VSD code (PSSP or RSCT) is in use. |
---|
2276 | vsdPath=$(LC_ALL=C $ls -l $vsdatalst 2>/dev/null) |
---|
2277 | if [[ $vsdPath = *${vsdatalstRSCT}* && -x $vsdatalstRSCT ]] |
---|
2278 | then |
---|
2279 | # Extract VSD-related data from the RPD. |
---|
2280 | getVSDdataRPD $arg2 |
---|
2281 | rc=$? |
---|
2282 | elif [[ $vsdPath = *${vsdatalstPSSP}* && -x $vsdatalstPSSP ]] |
---|
2283 | then |
---|
2284 | # Extract VSD-related data from the SDR. |
---|
2285 | getVSDdataSDR $arg2 |
---|
2286 | rc=$? |
---|
2287 | else |
---|
2288 | printErrorMsg 320 "getVSDdata" |
---|
2289 | cleanupAndExit |
---|
2290 | fi |
---|
2291 | ;; |
---|
2292 | |
---|
2293 | #------------------------------------ |
---|
2294 | getvsdnodedata) # mmcommon getVsdNodeData <filename> |
---|
2295 | #------------------------------------ |
---|
2296 | if [[ $argc -ne 2 ]] |
---|
2297 | then |
---|
2298 | operands="<filename>" |
---|
2299 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2300 | cleanupAndExit |
---|
2301 | fi |
---|
2302 | |
---|
2303 | # Call routine to extract vsd information based on |
---|
2304 | # which type of VSD code (PSSP or RSCT) is in use. |
---|
2305 | vsdPath=$(LC_ALL=C $ls -l $vsdatalst 2>/dev/null) |
---|
2306 | if [[ $vsdPath = *${vsdatalstRSCT}* && -x $vsdatalstRSCT ]] |
---|
2307 | then |
---|
2308 | # Extract VSD-related data from the RPD. |
---|
2309 | getVsdNodeDataRPD $arg2 |
---|
2310 | rc=$? |
---|
2311 | elif [[ $vsdPath = *${vsdatalstPSSP}* && -x $vsdatalstPSSP ]] |
---|
2312 | then |
---|
2313 | # Extract VSD-related data from the SDR. |
---|
2314 | getVsdNodeDataSDR $arg2 |
---|
2315 | rc=$? |
---|
2316 | else |
---|
2317 | printErrorMsg 320 "getVsdNodeData" |
---|
2318 | cleanupAndExit |
---|
2319 | fi |
---|
2320 | ;; |
---|
2321 | |
---|
2322 | #---------------------------------------- |
---|
2323 | getvsdnodenumbers) # mmcommon getVsdNodeNumbers |
---|
2324 | #---------------------------------------- |
---|
2325 | # Create mapping of the GPFS to VSD node numbers. |
---|
2326 | getVsdNodeNumbers |
---|
2327 | rc=$? |
---|
2328 | ;; |
---|
2329 | |
---|
2330 | #--------------------------------------------------------- |
---|
2331 | checkauth) # mmcommon checkAuth <clusterName> <sgDevice> [norefresh] |
---|
2332 | #--------------------------------------------------------- |
---|
2333 | if [[ $argc -lt 3 ]] |
---|
2334 | then |
---|
2335 | operands="<clusterName> <deviceName> [norefresh]" |
---|
2336 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2337 | cleanupAndExit |
---|
2338 | fi |
---|
2339 | |
---|
2340 | # Check the authorization. |
---|
2341 | checkAuth $arg2 "$arg3" $arg4 |
---|
2342 | rc=$? |
---|
2343 | ;; |
---|
2344 | |
---|
2345 | #-------------------- |
---|
2346 | gpfsready) # mmcommon gpfsready |
---|
2347 | #-------------------- |
---|
2348 | # Invoke the gpfsready exit. |
---|
2349 | gpfsready |
---|
2350 | rc=$? |
---|
2351 | ;; |
---|
2352 | |
---|
2353 | #----------------- |
---|
2354 | mmfsup) # mmcommon mmfsup |
---|
2355 | #----------------- |
---|
2356 | # Invoke the mmfsup exit. |
---|
2357 | mmfsup $arg2 $arg3 |
---|
2358 | rc=$? |
---|
2359 | ;; |
---|
2360 | |
---|
2361 | #------------------- |
---|
2362 | mmfsdown) # mmcommon mmfsdown |
---|
2363 | #------------------- |
---|
2364 | # Invoke the mmfsdown exit. |
---|
2365 | mmfsdown |
---|
2366 | rc=$? |
---|
2367 | ;; |
---|
2368 | |
---|
2369 | #--------------------------------------- |
---|
2370 | preunmount) # mmcommon preunmount <device> <reason> |
---|
2371 | #--------------------------------------- |
---|
2372 | if [[ $argc -lt 3 ]] |
---|
2373 | then |
---|
2374 | operands="<deviceName|all> <reason>" |
---|
2375 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2376 | cleanupAndExit |
---|
2377 | fi |
---|
2378 | |
---|
2379 | # Invoke the preunmount exit. |
---|
2380 | preunmount $arg2 $arg3 |
---|
2381 | rc=$? |
---|
2382 | ;; |
---|
2383 | |
---|
2384 | #---------------------------------------------------- |
---|
2385 | gpfsrecover) # mmcommon gpfsrecover <sgDevice> <phase> <nodeList> |
---|
2386 | #---------------------------------------------------- |
---|
2387 | if [[ $argc -lt 4 ]] |
---|
2388 | then |
---|
2389 | operands="<deviceName> <pahse> <nodeNumber> [<nodeNumber> ... ]" |
---|
2390 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2391 | cleanupAndExit |
---|
2392 | fi |
---|
2393 | |
---|
2394 | # Shift past the positional parameters and get the node list. |
---|
2395 | shift 3 |
---|
2396 | nodeList=$* |
---|
2397 | |
---|
2398 | # Invoke the gpfsrecover exit. |
---|
2399 | gpfsrecover $arg2 $arg3 $nodeList |
---|
2400 | rc=$? |
---|
2401 | ;; |
---|
2402 | |
---|
2403 | #------------------------------------------------------- |
---|
2404 | getefoptions) # mmcommon getEFOptions <sgDevice> <checkMountPointOpt> |
---|
2405 | #------------------------------------------------------- |
---|
2406 | if [[ $argc -ne 3 ]] |
---|
2407 | then |
---|
2408 | operands="<deviceName> <checkMountPointOpt>" |
---|
2409 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2410 | cleanupAndExit |
---|
2411 | fi |
---|
2412 | |
---|
2413 | # Generate the options line. |
---|
2414 | getEFOptions "$arg2" $arg3 |
---|
2415 | rc=$? |
---|
2416 | ;; |
---|
2417 | |
---|
2418 | #------------------------------------ |
---|
2419 | getmountpoint) # mmcommon getMountPoint <sgDevice> |
---|
2420 | #------------------------------------ |
---|
2421 | if [[ $argc -ne 2 ]] |
---|
2422 | then |
---|
2423 | operands="<deviceName>" |
---|
2424 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2425 | cleanupAndExit |
---|
2426 | fi |
---|
2427 | |
---|
2428 | # Generate the options line. |
---|
2429 | getMountPoint "$arg2" $arg3 |
---|
2430 | rc=$? |
---|
2431 | ;; |
---|
2432 | |
---|
2433 | #------------------------------------------ |
---|
2434 | getcontactnodes) # mmcommon getContactNodes <remoteCluster> |
---|
2435 | #------------------------------------------ |
---|
2436 | if [[ $argc -ne 2 ]] |
---|
2437 | then |
---|
2438 | operands="<remoteCluster>" |
---|
2439 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2440 | cleanupAndExit |
---|
2441 | fi |
---|
2442 | |
---|
2443 | # If an user exit is installed, try it first. If we get |
---|
2444 | # a result, consider this to be the definitive answer. |
---|
2445 | contactList="" |
---|
2446 | if [[ -x $remoteclusternodes ]] |
---|
2447 | then |
---|
2448 | contactList=$($remoteclusternodes $arg2) |
---|
2449 | rc=$? |
---|
2450 | # Tell the daemon where does the data come from. |
---|
2451 | [[ -n $contactList ]] && \ |
---|
2452 | contactList="${contactList},refreshMethod=1" |
---|
2453 | fi |
---|
2454 | |
---|
2455 | # If an user exit is not activated, or if it did not return |
---|
2456 | # anything, look for the contact nodes in the mmsdrfs file. |
---|
2457 | if [[ -z $contactList ]] |
---|
2458 | then |
---|
2459 | gpfsInit nolock >/dev/null |
---|
2460 | checkForErrors gpfsInit $? |
---|
2461 | contactList=$($grep -e "^$arg2:$REM_CLUSTER:" $mmsdrfsFile | \ |
---|
2462 | $GETVALUE $CONTACT_NODES_Field) |
---|
2463 | # # Tell the daemon where does the data come from. |
---|
2464 | # [[ -n $contactList ]] && \ |
---|
2465 | # contactList="${contactList},refreshMethod=0" |
---|
2466 | fi |
---|
2467 | |
---|
2468 | # Put out the result. |
---|
2469 | if [[ -n $contactList ]] |
---|
2470 | then |
---|
2471 | print -- "$contactList" |
---|
2472 | rc=0 |
---|
2473 | else |
---|
2474 | [[ $rc -eq 0 ]] && rc=19 # ENODEV |
---|
2475 | fi |
---|
2476 | ;; |
---|
2477 | |
---|
2478 | #---------------------------------------- |
---|
2479 | getfsnames) # mmcommon getFSNames |
---|
2480 | #---------------------------------------- |
---|
2481 | |
---|
2482 | # Return the names of the file systems in the nodeset to which |
---|
2483 | # this node belongs. The environment is assumed to be up to date. |
---|
2484 | # All errors are ignored. |
---|
2485 | # |
---|
2486 | # Because this function is used by the daemon and can be invoked |
---|
2487 | # during recovery, there should be no locking and/or initializing |
---|
2488 | # of the GPFS environment. Otherwise, there can be a deadlock. |
---|
2489 | # |
---|
2490 | $awk -F: ' \ |
---|
2491 | BEGIN { nodesetId = "" } \ |
---|
2492 | $'$LINE_TYPE_Field' == "'$MEMBER_NODE'" && \ |
---|
2493 | $'$NODE_NUMBER_Field' == "'$ourNodeNumber'" { \ |
---|
2494 | { nodesetId = $'$NODESETID_Field' } \ |
---|
2495 | { next } \ |
---|
2496 | } \ |
---|
2497 | $'$LINE_TYPE_Field' == "'$SG_HEADR'" && \ |
---|
2498 | $'$NODESETID_Field' == nodesetId { \ |
---|
2499 | { print "/dev/"$'$DEV_NAME_Field' } \ |
---|
2500 | } \ |
---|
2501 | ' $mmsdrfsFile 2>/dev/null |
---|
2502 | rc=0 |
---|
2503 | ;; |
---|
2504 | |
---|
2505 | #------------------------------------------ |
---|
2506 | getquotaenabledfs) # mmcommon getQuotaEnabledFS [<nodesetId>] |
---|
2507 | #------------------------------------------ |
---|
2508 | |
---|
2509 | # Make sure the mmsdrfs file is current. |
---|
2510 | gpfsInitOutput=$(gpfsInit nolock) |
---|
2511 | setGlobalVar $? $gpfsInitOutput |
---|
2512 | |
---|
2513 | # If the nodeset is set to the global id, clear the variable |
---|
2514 | # so that we can look at all SG_MOUNT records in the sdrfs. |
---|
2515 | # Otherwise, prepend the '^' char to ensure correct match. |
---|
2516 | [[ -n $arg2 ]] && nsId="$arg2" |
---|
2517 | [[ $arg2 = $GLOBAL_ID ]] && nsId="" |
---|
2518 | [[ -n $nsId ]] && nsId="^$nsId" |
---|
2519 | |
---|
2520 | # Put out the names of all file systems that have non-null quota options. |
---|
2521 | $awk -F: ' \ |
---|
2522 | /'$nsId:$SG_MOUNT:'/ { \ |
---|
2523 | if ( $'$QUOTA_OPT_Field' != "" ) { \ |
---|
2524 | { print $'$DEV_NAME_Field' } \ |
---|
2525 | } \ |
---|
2526 | } \ |
---|
2527 | ' $mmsdrfsFile |
---|
2528 | checkForErrors awk $? |
---|
2529 | rc=0 |
---|
2530 | ;; |
---|
2531 | |
---|
2532 | #---------------------------------------- |
---|
2533 | getdisknames) # mmcommon getDiskNames [<SGname>] [<nodesetId>] |
---|
2534 | #---------------------------------------- |
---|
2535 | |
---|
2536 | # Make sure the mmsdrfs file is current. |
---|
2537 | gpfsInitOutput=$(gpfsInit nolock) |
---|
2538 | setGlobalVar $? $gpfsInitOutput |
---|
2539 | |
---|
2540 | # Make sure that the file system name, if specified, |
---|
2541 | # is stripped from any /dev/ prefix. |
---|
2542 | deviceName="" |
---|
2543 | [[ -n $arg2 ]] && deviceName="${arg2##+(/)dev+(/)}:" |
---|
2544 | |
---|
2545 | # If the nodeset is set to the global id, clear the variable |
---|
2546 | # so that we can look at all SG_DISKS records in the sdrfs. |
---|
2547 | # Otherwise, prepend the '^' char to ensure correct match. |
---|
2548 | [[ -n $arg3 ]] && nsId="$arg3" |
---|
2549 | [[ $arg3 = $GLOBAL_ID ]] && nsId="" |
---|
2550 | [[ -n $nsId ]] && nsId="^$nsId" |
---|
2551 | |
---|
2552 | # Put out the names of all file system disks. |
---|
2553 | $awk -F: ' \ |
---|
2554 | /'$nsId:$SG_DISKS:$deviceName'/ { print $'$DISK_NAME_Field' } \ |
---|
2555 | ' $mmsdrfsFile |
---|
2556 | checkForErrors awk $? |
---|
2557 | rc=0 |
---|
2558 | ;; |
---|
2559 | |
---|
2560 | #---------------------------------------- |
---|
2561 | getsgdevice) # mmcommon getSGDevice <diskname> |
---|
2562 | #---------------------------------------- |
---|
2563 | # Make sure the mmsdrfs file is current. |
---|
2564 | gpfsInitOutput=$(gpfsInit nolock) |
---|
2565 | setGlobalVar $? $gpfsInitOutput |
---|
2566 | |
---|
2567 | # Find the file system to which the disk belongs. |
---|
2568 | findFSforDisk "$arg2" $mmsdrfsFile |
---|
2569 | rc=0 |
---|
2570 | ;; |
---|
2571 | |
---|
2572 | #---------------------------------------- |
---|
2573 | recoverfs) # mmcommon recoverfs <fsname> |
---|
2574 | #---------------------------------------- |
---|
2575 | if [[ $argc -lt 2 ]] |
---|
2576 | then |
---|
2577 | operands="<fsname>" |
---|
2578 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2579 | cleanupAndExit |
---|
2580 | fi |
---|
2581 | |
---|
2582 | # Make sure the mmsdrfs file matches the GPFS daemon's data |
---|
2583 | # for the specified filesystem. |
---|
2584 | recoverfs "$arg2" |
---|
2585 | rc=$? |
---|
2586 | ;; |
---|
2587 | |
---|
2588 | #---------------------------------------- |
---|
2589 | getnsddata) # mmcommon getNsdData [<fsname>] |
---|
2590 | #---------------------------------------- |
---|
2591 | # Make sure the mmsdrfs file is current. |
---|
2592 | gpfsInitOutput=$(gpfsInit nolock) |
---|
2593 | setGlobalVar $? $gpfsInitOutput |
---|
2594 | |
---|
2595 | # Retrieve the NSD data. |
---|
2596 | getNsdData $arg2 |
---|
2597 | rc=0 |
---|
2598 | ;; |
---|
2599 | |
---|
2600 | #--------------------------------------------------- |
---|
2601 | restoremmfscfg ) # mmcommon restoreMmfscfg <nodesetId> |
---|
2602 | #--------------------------------------------------- |
---|
2603 | if [[ $argc -lt 2 ]] |
---|
2604 | then |
---|
2605 | operands=" <nodesetId> " |
---|
2606 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2607 | cleanupAndExit |
---|
2608 | fi |
---|
2609 | |
---|
2610 | # Retrieve the mmfs.cfg data. |
---|
2611 | restoreMmfscfg $arg2 |
---|
2612 | rc=$? |
---|
2613 | ;; |
---|
2614 | |
---|
2615 | #--------------------------------------------------- |
---|
2616 | resetnsdnumber ) # mmcommon resetNsdNumber <nn> |
---|
2617 | #--------------------------------------------------- |
---|
2618 | if [[ $argc -lt 2 ]] |
---|
2619 | then |
---|
2620 | operands=" <nodesetId> " |
---|
2621 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2622 | cleanupAndExit |
---|
2623 | fi |
---|
2624 | |
---|
2625 | # Change the starting number for NSD names. |
---|
2626 | resetNsdNumber $arg2 |
---|
2627 | rc=$? |
---|
2628 | ;; |
---|
2629 | |
---|
2630 | #------------------------------------------------------- |
---|
2631 | on1 | on1long ) # mmcommon on1 <hostname> <remoteCommand> [<arg ... >] |
---|
2632 | #------------------------------------------------------- |
---|
2633 | if [[ $argc -lt 3 ]] |
---|
2634 | then |
---|
2635 | operands="<hostname> <remoteCommand> [<arg ... >] " |
---|
2636 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2637 | cleanupAndExit |
---|
2638 | fi |
---|
2639 | |
---|
2640 | target=$arg2 |
---|
2641 | |
---|
2642 | # Shift past the hostname and get the command to execute and its args. |
---|
2643 | shift 2 |
---|
2644 | remoteCommand=$* |
---|
2645 | remoteVerb=$1 |
---|
2646 | |
---|
2647 | if [[ $target = $ourNodeName || $MMMODE = single ]] |
---|
2648 | then |
---|
2649 | # If we happen to be the target node, run the command locally. |
---|
2650 | $mmremote $remoteCommand |
---|
2651 | rc=$? |
---|
2652 | |
---|
2653 | else |
---|
2654 | # Invoke mmdsh to execute command on remote system, |
---|
2655 | # suppressing prepending of the hostname to the output lines. |
---|
2656 | $rm -f $tmpDir$remoteVerb$$.* |
---|
2657 | $mmdsh -svL $target $mmremote onbehalf2 $ourNodeName $remoteVerb$$ \ |
---|
2658 | $MMMODE $NO_LINK mmremote $remoteCommand |
---|
2659 | rc=$? |
---|
2660 | |
---|
2661 | # Determine the return code. The goal is to pass back the return code |
---|
2662 | # from the mmremote command. Because rsh and different versions of ssh |
---|
2663 | # handle the return code differently (e.g., rsh does not propagate |
---|
2664 | # it back), mmremote onbehalf creates a special file that has the |
---|
2665 | # return code appended at the end of its name. If we do not see this |
---|
2666 | # file on our side, we assume that mmdsh returned the return code from |
---|
2667 | # the remote command. Although this is not necessarily always the case |
---|
2668 | # (there could have been a problem with the touch command that creates |
---|
2669 | # the special file) it is the best we can do under the circumstances. |
---|
2670 | rcInfo=$($ls $tmpDir$remoteVerb$$.* 2> /dev/null) |
---|
2671 | $rm -f $tmpDir$remoteVerb$$.* |
---|
2672 | if [[ -n $rcInfo ]] |
---|
2673 | then |
---|
2674 | # The return code was passed back via the empty file mechanism. |
---|
2675 | # Extract the return code from the file name. |
---|
2676 | rc=${rcInfo#$tmpDir$remoteVerb$$\.} |
---|
2677 | #esjx else |
---|
2678 | #esjx # The special file was not found. |
---|
2679 | #esjx # Override the rc from mmdsh if necessary. |
---|
2680 | #esjx [[ $rc -eq 0 ]] && rc=1 |
---|
2681 | fi |
---|
2682 | fi |
---|
2683 | ;; |
---|
2684 | |
---|
2685 | #--------------------------------------------------- |
---|
2686 | onall) # mmcommon onall <relNameFile> <unreachedNodesFile> |
---|
2687 | # <remoteCommand> [<arg ... >] |
---|
2688 | #--------------------------------------------------- |
---|
2689 | if [[ $argc -lt 4 ]] |
---|
2690 | then |
---|
2691 | operands="<relNameFile> <unreachedNodesFile> <remoteCommand> [<arg ... >]" |
---|
2692 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2693 | cleanupAndExit |
---|
2694 | fi |
---|
2695 | |
---|
2696 | # Shift past the reliable names file and the report file |
---|
2697 | # and get the command to execute and its args. |
---|
2698 | shift 3 |
---|
2699 | remoteCommand=$* |
---|
2700 | |
---|
2701 | if [[ $MMMODE = single ]] |
---|
2702 | then |
---|
2703 | # Execute the command locally. |
---|
2704 | $mmremote $remoteCommand |
---|
2705 | rc=$? |
---|
2706 | else |
---|
2707 | # Invoke mmdsh to execute command on remote systems. |
---|
2708 | $mmdsh -vF $arg2 -R $arg3 $mmremote $remoteCommand |
---|
2709 | rc=$? |
---|
2710 | fi |
---|
2711 | ;; |
---|
2712 | |
---|
2713 | #---------------------------------------------------------------- |
---|
2714 | onall_async) # mmcommon onall_async <relNameFile> <remoteCommand> [<arg ... >] |
---|
2715 | #---------------------------------------------------------------- |
---|
2716 | if [[ $argc -lt 3 ]] |
---|
2717 | then |
---|
2718 | operands="<relNameFile> <remoteCommand> [<arg ... >] " |
---|
2719 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2720 | cleanupAndExit |
---|
2721 | fi |
---|
2722 | |
---|
2723 | # Shift past the file name and get the command to execute and its args. |
---|
2724 | shift 2 |
---|
2725 | remoteCommand=$* |
---|
2726 | |
---|
2727 | if [[ $MMMODE = single ]] |
---|
2728 | then |
---|
2729 | # Execute the command locally. |
---|
2730 | $mmremote $remoteCommand |
---|
2731 | rc=$? |
---|
2732 | else |
---|
2733 | # Invoke mmdsh to execute command on remote systems. |
---|
2734 | #esjdbg # Show msgs during development and testing only. |
---|
2735 | #esjdbg $mmdsh -vF $arg2 $mmremote $remoteCommand |
---|
2736 | $mmdsh -vF $arg2 $mmremote $remoteCommand >/dev/null 2>&1 |
---|
2737 | rc=$? |
---|
2738 | fi |
---|
2739 | |
---|
2740 | # Remove the node names file. The caller is gone by now. |
---|
2741 | $rm -f $arg2 |
---|
2742 | ;; |
---|
2743 | |
---|
2744 | #---------------------------------------------- |
---|
2745 | pushsdr | pushsdr_async ) # mmcommon pushSdr <relNameFile> <fileToCopy> |
---|
2746 | # <checksum> [<options>] |
---|
2747 | #---------------------------------------------- |
---|
2748 | if [[ $argc -lt 4 ]] |
---|
2749 | then |
---|
2750 | operands="<relNameFile> <fileToCopy> <checksum> [<options>]" |
---|
2751 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2752 | cleanupAndExit |
---|
2753 | fi |
---|
2754 | |
---|
2755 | if [[ $kword_lc = pushsdr_async ]] |
---|
2756 | then |
---|
2757 | async_call=yes |
---|
2758 | #esjdbg # Show msgs during development and testing only. |
---|
2759 | #esjdbg print -u2 "$(date): mmcommon $kword: mmsdrfs propagation started" |
---|
2760 | fi |
---|
2761 | |
---|
2762 | # Shift past all positional parameters and collect the command arguments. |
---|
2763 | shift 4 |
---|
2764 | opt="$@" |
---|
2765 | |
---|
2766 | if [[ $MMMODE = single ]] |
---|
2767 | then |
---|
2768 | # This function is a no-op for single clusters. |
---|
2769 | rc=0 |
---|
2770 | else |
---|
2771 | #esjdbg # Show msgs during development and testing only. |
---|
2772 | #esjdbg $mmdsh -vF $arg2 -I $arg3 $mmremote upgradeSystemFiles $arg3 $arg4 "$opt" |
---|
2773 | $mmdsh -vF $arg2 -I $arg3 \ |
---|
2774 | $mmremote upgradeSystemFiles $arg3 $arg4 "$opt" >/dev/null 2>&1 |
---|
2775 | rc=$? |
---|
2776 | fi |
---|
2777 | |
---|
2778 | if [[ $async_call = yes ]] |
---|
2779 | then |
---|
2780 | # Cleanup files that were left behind by the main process. |
---|
2781 | $rm -f $arg2 $arg3 |
---|
2782 | #esjdbg # Show msgs during development and testing only. |
---|
2783 | #esjdbg print -u2 "$(date): mmcommon $kword: mmsdrfs propagation completed; mmdsh rc=$rc" |
---|
2784 | fi |
---|
2785 | ;; |
---|
2786 | |
---|
2787 | #------------------------------------------------ |
---|
2788 | pushkey | pushkey_async ) # mmcommon pushKey <nodeFile> <sdrfsFile> |
---|
2789 | # <sdrfsChecksum> |
---|
2790 | # <keyFile> <keyChecksum> |
---|
2791 | # [<options>] |
---|
2792 | #------------------------------------------------ |
---|
2793 | if [[ $argc -lt 6 ]] |
---|
2794 | then |
---|
2795 | operands="<nodeFile> <sdrfsFile> <sdrfsChecksum> <keyFile> <keyChecksum> [<options>]" |
---|
2796 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2797 | cleanupAndExit |
---|
2798 | fi |
---|
2799 | |
---|
2800 | if [[ $kword_lc = pushkey_async ]] |
---|
2801 | then |
---|
2802 | async_call=yes |
---|
2803 | #esjdbg # Show msgs during development and testing only. |
---|
2804 | #esjdbg print -u2 "$(date): mmcommon $kword: mmsdrfs propagation started" |
---|
2805 | fi |
---|
2806 | |
---|
2807 | # Shift past all positional parameters and collect the command arguments. |
---|
2808 | shift 6 |
---|
2809 | opt="$@" |
---|
2810 | |
---|
2811 | if [[ $MMMODE = single ]] |
---|
2812 | then |
---|
2813 | # This function is a no-op for single clusters. |
---|
2814 | rc=0 |
---|
2815 | else |
---|
2816 | #esjdbg # Show msgs during development and testing only. |
---|
2817 | #esjdbg $mmdsh -vF $arg2 -I $arg3 -I $arg5 \ |
---|
2818 | #esjdbg $mmremote upgradeSystemFiles2 $arg3 $arg4 $arg5 $arg6 "$opt" |
---|
2819 | $mmdsh -vF $arg2 -I $arg3 -I $arg5 \ |
---|
2820 | $mmremote upgradeSystemFiles2 $arg3 $arg4 $arg5 $arg6 "$opt" >/dev/null 2>&1 |
---|
2821 | rc=$? |
---|
2822 | fi |
---|
2823 | |
---|
2824 | if [[ $async_call = yes ]] |
---|
2825 | then |
---|
2826 | # Cleanup files that were left behind by the main process. |
---|
2827 | $rm -f $arg2 $arg3 |
---|
2828 | [[ $arg5 != ${genkeyData}* ]] && $rm -f $arg5 |
---|
2829 | #esjdbg # Show msgs during development and testing only. |
---|
2830 | #esjdbg print -u2 "$(date): mmcommon $kword: mmsdrfs propagation completed; mmdsh rc=$rc" |
---|
2831 | fi |
---|
2832 | ;; |
---|
2833 | |
---|
2834 | onactive | onactive_async ) |
---|
2835 | #------------------------------------------------------------------ |
---|
2836 | # mmcommon onactive <preferredNode> <relNameFile> <fileToCopy> |
---|
2837 | # <fsToCheck> <scope> <link> <remoteCommand> [<arg ... >] |
---|
2838 | #------------------------------------------------------------------ |
---|
2839 | if [[ $argc -lt 8 ]] |
---|
2840 | then |
---|
2841 | operands="<preferredNode> <relNameFile> <fileToCopy>" |
---|
2842 | operands="$operands <fsToCheck> <scope> <link> <remoteCommand> [<arg ... >] " |
---|
2843 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2844 | cleanupAndExit |
---|
2845 | fi |
---|
2846 | |
---|
2847 | # If async call, mark the relNameFile for deletion. |
---|
2848 | [[ $kword_lc = onactive_async ]] && async_call=yes |
---|
2849 | |
---|
2850 | # Shift past all positional parameters and collect the command arguments. |
---|
2851 | shift 8 |
---|
2852 | arguments="$@" |
---|
2853 | |
---|
2854 | # Find an active node and execute the command. |
---|
2855 | runRemoteCommand $arg2 $arg3 $arg4 $arg5 $arg6 $arg7 $arg8 "$arguments" |
---|
2856 | rc=$? |
---|
2857 | |
---|
2858 | # Remove the file with node names. |
---|
2859 | [[ $async_call = yes ]] && $rm -f $arg3 |
---|
2860 | ;; |
---|
2861 | |
---|
2862 | #------------------------------------------------------- |
---|
2863 | linkcommand) # mmcommon linkCommand <preferredNode> <relNameFile> |
---|
2864 | # <remoteCommand> [<arg ... >] |
---|
2865 | #------------------------------------------------------- |
---|
2866 | if [[ $argc -lt 4 ]] |
---|
2867 | then |
---|
2868 | operands="<preferredNode> <relNameFile> <remoteCommand> [<arg ... >] " |
---|
2869 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2870 | cleanupAndExit |
---|
2871 | fi |
---|
2872 | |
---|
2873 | # Shift past all positional parameters and collect the command arguments. |
---|
2874 | shift 4 |
---|
2875 | arguments="$@" |
---|
2876 | |
---|
2877 | # Find an active node and execute the command. |
---|
2878 | runRemoteCommand $arg2 $arg3 \ |
---|
2879 | $NO_FILE_COPY $NO_MOUNT_CHECK NULL $LINK $arg4 "$arguments" |
---|
2880 | rc=$? |
---|
2881 | ;; |
---|
2882 | |
---|
2883 | #------------------------------------------- |
---|
2884 | run) # mmcommon run <function> [arg ... ] |
---|
2885 | # Note: Intended for use by SMIT mostly |
---|
2886 | #------------------------------------------- |
---|
2887 | if [[ $argc -lt 2 ]] |
---|
2888 | then |
---|
2889 | operands="<function> [arg ... ]" |
---|
2890 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2891 | cleanupAndExit |
---|
2892 | fi |
---|
2893 | |
---|
2894 | shift 1 # Skip past the keyword "run". |
---|
2895 | $@ # Execute the requested function. |
---|
2896 | rc=$? |
---|
2897 | ;; |
---|
2898 | |
---|
2899 | #------------------------------------------- |
---|
2900 | freelocks) # mmcommon freeLocks |
---|
2901 | #------------------------------------------- |
---|
2902 | primaryServer=$($head -1 $mmsdrfsFile | $GETVALUE $PRIMARY_SERVER_Field) |
---|
2903 | setRunningCommand null $primaryServer > /dev/null 2>&1 |
---|
2904 | freeLockOnServer $primaryServer > /dev/null 2>&1 |
---|
2905 | freeEnvLock > /dev/null 2>&1 |
---|
2906 | ;; |
---|
2907 | |
---|
2908 | #--------------------------- |
---|
2909 | startautomounter ) # mmcommon startAutomounter |
---|
2910 | #--------------------------- |
---|
2911 | # Make sure that the local mmfs.cfg file is up-to-date. |
---|
2912 | gpfsInitOutput=$(gpfsInit nolock) |
---|
2913 | checkForErrors gpfsInit $? |
---|
2914 | |
---|
2915 | # Find out the value of the automountDir config parameter. |
---|
2916 | automountDir=$(showCfgValue automountDir) |
---|
2917 | [[ -z $automountDir ]] && automountDir=$defaultAutomountDir |
---|
2918 | |
---|
2919 | # Run the OS automount command. |
---|
2920 | startAutomounter $automountDir |
---|
2921 | rc=$? |
---|
2922 | ;; |
---|
2923 | |
---|
2924 | #-------------------------------------- |
---|
2925 | savesgdescfile ) # mmcommon saveSGDescFile <sgDescFile> |
---|
2926 | #-------------------------------------- |
---|
2927 | if [[ $argc -lt 2 ]] |
---|
2928 | then |
---|
2929 | operands="<sgDescFile>" |
---|
2930 | printErrorMsg 260 mmcommon $kword "$operands" |
---|
2931 | cleanupAndExit |
---|
2932 | fi |
---|
2933 | |
---|
2934 | # Store the file on the config server nodes. |
---|
2935 | saveSGDescFile $arg2 |
---|
2936 | rc=$? |
---|
2937 | ;; |
---|
2938 | |
---|
2939 | #------------------------------------------------------ |
---|
2940 | expirationdatacleanup) # mmcommon expirationDataCleanup <expData> <lockAction> |
---|
2941 | #------------------------------------------------------ |
---|
2942 | expirationDataCleanup $arg2 $arg3 |
---|
2943 | rc=0 |
---|
2944 | ;; |
---|
2945 | |
---|
2946 | #----------------------- |
---|
2947 | killsdrserv) # mmcommon killSdrServ |
---|
2948 | #----------------------- |
---|
2949 | killSdrServ |
---|
2950 | rc=$? |
---|
2951 | ;; |
---|
2952 | |
---|
2953 | #---------------------------------------- |
---|
2954 | * ) # Unknown action requested |
---|
2955 | #---------------------------------------- |
---|
2956 | # Invalid keyword |
---|
2957 | printErrorMsg 133 mmcommon $kword |
---|
2958 | cleanupAndExit |
---|
2959 | ;; |
---|
2960 | |
---|
2961 | esac # end case $kword_lc in |
---|
2962 | |
---|
2963 | cleanupAndExit $rc doNotUnlock |
---|
2964 | |
---|