8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / man / man4 / rcmscript.4
blobc8142136fb6519bf55f8c991e30dc693026d085c
1 '\" te
2 .\" Copyright (c) 2003, Sun Microsystems, Inc. All Rights Reserved.
3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
4 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
5 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
6 .TH RCMSCRIPT 4 "Feb 18, 2003"
7 .SH NAME
8 rcmscript \- script interface specification for the Reconfiguration and
9 Coordination Manager
10 .SH SYNOPSIS
11 .LP
12 .nf
13 \fB\fIrcm_scriptname\fR scriptinfo\fR
14 .fi
16 .LP
17 .nf
18 \fB\fIrcm_scriptname\fR register\fR
19 .fi
21 .LP
22 .nf
23 \fB\fIrcm_scriptname\fR resourceinfo \fIresourcename\fR\fR
24 .fi
26 .LP
27 .nf
28 \fB\fIrcm_scriptname\fR queryremove \fIresourcename\fR\fR
29 .fi
31 .LP
32 .nf
33 \fB\fIrcm_scriptname\fR preremove \fIresourcename\fR\fR
34 .fi
36 .LP
37 .nf
38 \fB\fIrcm_scriptname\fR postremove \fIresourcename\fR\fR
39 .fi
41 .LP
42 .nf
43 \fB\fIrcm_scriptname\fR undoremove \fIresourcename\fR\fR
44 .fi
46 .SH DESCRIPTION
47 .LP
48 Reconfiguration and Coordination Manager (RCM) is a framework designed to
49 coordinate device consumers during Solaris Dynamic Reconfiguration (DR). The
50 interfaces specified in this man page allow device consumers, such as
51 application vendors or site administrators, to act before and after DR
52 operations take place by providing RCM scripts. You can write your own RCM
53 scripts to shut down your applications, or to cleanly release the devices from
54 your applications during dynamic remove operations.
55 .sp
56 .LP
57 An RCM script is an executable perl script, a shell script or a binary. Perl is
58 the recommended language. Each script is run in its own address space using the
59 user-id of the script file owner.
60 .sp
61 .LP
62 An RCM script is invoked on demand in response to DR as follows:
63 .sp
64 .in +2
65 .nf
66 \fI<scriptname>\fR \fI<command>\fR [\fIargs\fR ...]
67 .fi
68 .in -2
69 .sp
71 .sp
72 .LP
73 Every script must implement the following RCM commands:
74 .sp
75 .ne 2
76 .na
77 \fB\fBscriptinfo\fR\fR
78 .ad
79 .RS 16n
80 Get script information.
81 .RE
83 .sp
84 .ne 2
85 .na
86 \fB\fBregister\fR\fR
87 .ad
88 .RS 16n
89 Register devices the script handles.
90 .RE
92 .sp
93 .ne 2
94 .na
95 \fB\fBresourceinfo\fR\fR
96 .ad
97 .RS 16n
98 Get resource information.
99 .RE
103 A script might include some or all the of the following commands:
105 .ne 2
107 \fB\fBqueryremove\fR\fR
109 .RS 15n
110 Queries whether the resource can be released.
114 .ne 2
116 \fB\fBpreremove\fR\fR
118 .RS 15n
119 Releases the resource.
123 .ne 2
125 \fB\fBpostremove\fR\fR
127 .RS 15n
128 Provides post-resource removal notification.
132 .ne 2
134 \fB\fBundoremove\fR\fR
136 .RS 15n
137 Undo the actions done in preremove.
142 When a script's \fBregister\fR command is run, the script should supply, in
143 return data, all resource names the script or its application handles that
144 could potentially be removed by DR. A resource name refers to a name in
145 \fB/dev\fR path name.
148 Below is a high-level overview of the sequence of script invocations that
149 occurs when dynamic removal of a script's registered resource is attempted. See
150 the COMMANDS section for a detailed description of the commands.
151 .RS +4
154 Prior to removing the resource from the system during DR, the script's
155 \fBqueryremove\fR command is run:
157 .in +2
159 \fI<scriptname>\fR queryremove \fI<resourcename>\fR
161 .in -2
164 The script should check for obvious reasons why the resource can not be removed
165 from the perspective of its service or application.
167 .RS +4
170 If the script indicates that the resource can be removed in the
171 \fBqueryremove\fR command. The script's \fBpreremove\fR command is run:
173 .in +2
175 \fI<scriptname>\fR preremove \fI<resourcename>\fR
177 .in -2
180 The script releases the resource from the service or application represented by
181 the script and prepares for the resource removal. Releasing the resource
182 includes closing the resource if the resource is currently opened by its
183 application.
185 .RS +4
188 The system then proceeds to remove the resource.
190 .RS +4
193 If the system has removed the resource successfully the script's
194 \fBpostremove\fR command is run:
196 .in +2
198 \fI<scriptname>\fR postremove \fI<resourcename>\fR
200 .in -2
203 Otherwise the script's \fBundoremove\fR command is run:
205 .in +2
207 \fI<scriptname>\fR undoremove \fI<resourcename>\fR
209 .in -2
215 For any commands the script does not implement, it must exit with exit status
216 of 2. RCM silently returns success for the script's unimplemented commands.
219 A script performs the following basic steps:
220 .RS +4
222 .ie t \(bu
223 .el o
224 Takes RCM command and additional arguments from the command line and
225 environment parameters.
227 .RS +4
229 .ie t \(bu
230 .el o
231 Processes the command.
233 .RS +4
235 .ie t \(bu
236 .el o
237 Writes the expected return data to stdout as \fIname=value\fR pairs delimited
238 by newlines, where \fIname\fR is the name of the return data item that RCM
239 expects and \fIvalue\fR is the value associated with the data item.
241 .SS "Environment"
243 The initial environment of RCM scripts is set as follows:
244 .RS +4
246 .ie t \(bu
247 .el o
248 Process UID is set to the UID of the script.
250 .RS +4
252 .ie t \(bu
253 .el o
254 Process GID is set to the GID of the script.
256 .RS +4
258 .ie t \(bu
259 .el o
260 \fBPATH\fR variable is set to \fB/usr/sbin:/usr/bin\fR.
262 .RS +4
264 .ie t \(bu
265 .el o
266 Current working directory is set to:
267 .RS +4
269 .ie t \(bu
270 .el o
271 \fB/var/run\fR for scripts owned by root
273 .RS +4
275 .ie t \(bu
276 .el o
277 \fB/tmp\fR for scripts not owned by root
280 .RS +4
282 .ie t \(bu
283 .el o
284 File descriptor 0 (stdin) is set to \fB/dev/null\fR
286 .RS +4
288 .ie t \(bu
289 .el o
290 Environment variable \fBRCM_ENV_DEBUG_LEVEL\fR is set to the debug level.
291 Logging is discussed below.
293 .RS +4
295 .ie t \(bu
296 .el o
297  The following environment variables are also set where possible:
298 .RS +4
300 .ie t \(bu
301 .el o
302 \fBLANG\fR
304 .RS +4
306 .ie t \(bu
307 .el o
308 \fBLC_COLLATE\fR
310 .RS +4
312 .ie t \(bu
313 .el o
314 \fBLC_CTYPE\fR
316 .RS +4
318 .ie t \(bu
319 .el o
320 \fBLC_MESSAGES\fR
322 .RS +4
324 .ie t \(bu
325 .el o
326 \fBLC_MONETARY\fR
328 .RS +4
330 .ie t \(bu
331 .el o
332 \fBLC_NUMERIC\fR
334 .RS +4
336 .ie t \(bu
337 .el o
338 \fBLC_TIME\fR
340 .RS +4
342 .ie t \(bu
343 .el o
344 \fBLC_ALL\fR
346 .RS +4
348 .ie t \(bu
349 .el o
350 \fBTZ\fR
352 See \fBenviron\fR(5) for a description of these variables. See \fBgettext\fR(1)
353 for details on retrieving localized messages.
357 All environment variable names beginning with \fBRCM_ENV_\fR are reserved for
358 use by the RCM.
361 The character encoding used by the RCM and RCM scripts to exchange RCM
362 commands, environment parameters, and name-value pairs is ASCII unless the
363 controlling environment variables are specified otherwise.
364 .SS "Commands"
365 .SS "\fBscriptinfo\fR"
367 The \fBscriptinfo\fR command is invoked to gather information about the script.
369 .ne 2
371 \fBReturn data:\fR
373 .RS 16n
374 If successful, the script must write the following name-value pairs to stdout
375 and exit with status 0:
376 .RS +4
378 .ie t \(bu
379 .el o
380 \fBrcm_script_version=1\fR
382 .RS +4
384 .ie t \(bu
385 .el o
386 \fBrcm_script_func_info=\fR\fIscript_func_info\fR
388 .RS +4
390 .ie t \(bu
391 .el o
392 \fBrcm_cmd_timeout=\fR\fIcommand_timeout_value\fR
394 where \fIscript_func_info\fR is a localized human-readable message describing
395 the functionality of the script.
397 The RCM monitors the execution time of RCM commands by RCM scripts.
398 \fIcommand_timeout_value\fR is the maximum time in seconds the script is
399 expected to take to process any RCM command except the \fBscriptinfo\fR command
400 itself. If an RCM script does not process the RCM command and exit within this
401 time, RCM sends a \fBSIGABRT\fR signal to the script process. RCM then waits
402 for a few seconds for the script to finish the processing of the current RCM
403 command and exit. If the script does not exit within this time, RCM sends a
404 \fBSIGKILL\fR signal to the script.
406 The \fBrcm_cmd_timeout\fR name-value pair is optional. It is only needed if the
407 script is expected to take more than a few seconds to process any RCM command.
408 Setting this name to a value of 0 (zero) disables the timer. If this name-value
409 pair is not supplied, a default value is assigned by the RCM.
411 Upon failure, the script must specify the failure reason using the name-value
412 pair \fBrcm_failure_reason\fR and exit with status 1.
415 .SS "\fBregister\fR"
417 The \fBregister\fR command is invoked to allow a script to specify the
418 resources that it or its application handles that could potentially be removed
419 by DR. The script has to supply all its resource names to RCM using the
420 name-value pair \fBrcm_resource_name\fR.
422 .ne 2
424 \fBReturn Data:\fR
426 .RS 16n
427 If successful, the script must write the following name-value pairs to stdout
428 and exit with status 0:
430 .in +2
432 rcm_resource_name=\fIresourcename\fR
433 rcm_resource_name=\fIresourcename\fR
434            .
435            .
436            .
438 .in -2
441 where \fIresourcename\fR is the name of the resource the script is interested
444 Upon failure, the script must specify the failure reason using the name-value
445 pair \fBrcm_failure_reason\fR and exit with status 1.
448 .SS "\fBresourceinfo\fR \fIresourcename\fR"
450 The \fBresourceinfo\fR command is invoked to get the usage information about
451 \fIresourcename\fR.
453 .ne 2
455 \fBReturn Data:\fR
457 .RS 16n
458 If successful, the script must write the following name-value pair to stdout
459 and exit with status 0:
461 .in +2
463 rcm_resource_usage_info=\fIresource_usage\fR
465 .in -2
468 where \fIresource_usage\fR is a localized human readable message describing the
469 usage of the resource by the script.
471 Upon failure, the script must specify the failure reason using the name-value
472 pair \fBrcm_failure_reason\fR and exit with status 1.
475 .SS "\fBqueryremove\fR \fIresourcename\fR"
477 Prior to removing the resource from the system, the \fBqueryremove\fR command
478 is invoked to query the script to determine whether the script can release the
479 given resource successfully from the service or application it represents. The
480 script does not actually release the resource. The script might indicate that
481 it is not able to release the resource if the resource is critical for its
482 service or application.
485 Additional environment parameter:
487 .ne 2
489 \fB\fBRCM_ENV_FORCE\fR\fR
491 .RS 17n
492 Can be one of:
494 .ne 2
496 \fB\fBFALSE\fR\fR
498 .RS 9n
499 Normal request.
503 .ne 2
505 \fB\fBTRUE\fR\fR
507 .RS 9n
508 Request is urgent. The script should check whether the resource can be released
509 successfully by force, such as by using the force option to unmount a file
510 system.
516 .ne 2
518 \fBReturn Data:\fR
520 .RS 16n
521 If the command succeeds, the script must return no data and exit with status 0.
523 If the script would not be able to release the resource, it must specify the
524 reason using the name-value pair \fBrcm_failure_reason\fR and exit with status
527 Upon any other failure, the script must specify the failure reason using the
528 name-value pair \fBrcm_failure_reason\fR and exit with status 1.
531 .SS "\fBpreremove\fR \fIresourcename\fR"
533 The \fBpreremove\fR command is invoked prior to an attempt to remove the given
534 \fIresourcename\fR. In response to this command the script can either release
535 the resource (including closing the device if the device is currently opened)
536 from the service or application it represents or indicate that it can not
537 release the resource if the resource is critical for its service or
538 application.
541 Additional environment parameter:
543 .ne 2
545 \fB\fBRCM_ENV_FORCE\fR\fR
547 .RS 17n
548 Can be one of:
550 .ne 2
552 \fB\fBFALSE\fR\fR
554 .RS 9n
555 Normal request.
559 .ne 2
561 \fB\fBTRUE\fR\fR
563 .RS 9n
564 Request is urgent. The script should make extra effort to release the resource,
565 such as by using the force option to unmount a file system.
571 .ne 2
573 \fBReturn Data:\fR
575 .RS 16n
576 If the command succeeds, the script must return no data and exit with status 0.
578 If the script cannot release the resource, it must specify the reason using the
579 name-value pair \fBrcm_failure_reason\fR and exit with status 3.
581 Upon any other failure, the script must specify the failure reason using the
582 name-value pair \fBrcm_failure_reason\fR and exit with status 1.
585 .SS "\fBpostremove\fR \fIresourcename\fR"
587 The \fBpostremove\fR command is invoked after the given \fIresourcename\fR has
588 been removed.
590 .ne 2
592 \fBReturn Data:\fR
594 .RS 16n
595 If the command succeeds, the script must return no data and exit with status 0.
597 Upon failure, the script must specify the failure reason using the name-value
598 pair \fBrcm_failure_reason\fR and exit with status 1.
603 \fBundoremove\fR \fIresourcename\fR
606 The \fBundoremove\fR command is invoked to undo what was done in the previous
607 \fBpreremove\fR command for the given \fIresourcename\fR. The script can bring
608 the state of the resource to the same state it was in when the script received
609 the \fBpreremove\fR command for that resource.
611 .ne 2
613 \fBReturn Data:\fR
615 .RS 16n
616 If the command succeeds, the script must return no data and exit with status 0.
618 Upon failure, the script must specify the failure reason using the name-value
619 pair \fBrcm_failure_reason\fR and exit with status 1.
622 .SS "Logging"
624 A script must log all error and debug messages by writing to stdout the
625 name-value pairs listed below. The logged messages go to \fBsyslogd\fR(1M) with
626 the \fBsyslog\fR facility of \fBLOG_DAEMON\fR. See \fBsyslog.conf\fR(4).
628 .ne 2
630 \fB\fBrcm_log_err=\fR\fImessage\fR\fR
632 .RS 25n
633 Logs the \fImessage\fR with the syslog level of \fBLOG_ERR\fR.
637 .ne 2
639 \fB\fBrcm_log_warn=\fR\fImessage\fR\fR
641 .RS 25n
642 Logs the \fImessage\fR with the syslog level of \fBLOG_WARNING\fR.
646 .ne 2
648 \fB\fBrcm_log_info=\fR\fImessage\fR\fR
650 .RS 25n
651 Logs the \fImessage\fR with the syslog level of \fBLOG_INFO\fR.
655 .ne 2
657 \fB\fBrcm_log_debug=\fR\fImessage\fR\fR
659 .RS 25n
660 Logs the \fImessage\fR with the syslog level of \fBLOG_DEBUG\fR.
665 A script can use the environment variable \fBRCM_ENV_DEBUG_LEVEL\fR to control
666 the amount of information to log. \fBRCM_ENV_DEBUG_LEVEL\fR is a numeric value
667 ranging from 0 to 9, with 0 meaning log the least amount of information and 9
668 meaning log the most.
669 .SS "Installing or Removing RCM Scripts"
671 You must use the following format to name a script:
673 .in +2
675 \fIvendor\fR,\fIservice\fR
677 .in -2
682 where \fIvendor\fR is the stock symbol (or any distinctive name) of the vendor
683 providing the script and \fIservice\fR is the name of service the script
684 represents.
687 You must be a superuser (root) to install or remove an RCM script.
690 Select one of the following directories where you want to place the script:
692 .ne 2
694 \fB\fB/etc/rcm/scripts\fR\fR
696 .sp .6
697 .RS 4n
698 Scripts for specific systems
702 .ne 2
704 \fB\fB/usr/platform/`uname -i`/lib/rcm/scripts\fR\fR
706 .sp .6
707 .RS 4n
708 Scripts for specific hardware implementation
712 .ne 2
714 \fB\fB/usr/platform/`uname -m`/lib/rcm/scripts\fR\fR
716 .sp .6
717 .RS 4n
718 Scripts for specific hardware class
722 .ne 2
724 \fB\fB/usr/lib/rcm/scripts\fR\fR
726 .sp .6
727 .RS 4n
728 Scripts for any hardware
731 .SS "Installing a Script"
733 To install a script, copy the script to the appropriate directory from the list
734 above, change the userid and the groupid of the script to the desired values,
735 and send \fBSIGHUP\fR to \fBrcm_daemon\fR. For example:
737 .in +2
739 # cp SUNW,sample.pl /usr/lib/rcm/scripts
740 # chown user[:group] /usr/lib/rcm/scripts/SUNW,sample.pl
741 # pkill -HUP -x -u root rcm_daemon
743 .in -2
746 .SS "Removing a script"
748 Remove the script from the appropriate directory from the list above and send
749 \fBSIGHUP\fR to \fBrcm_daemon\fR. For example:
751 .in +2
753 # rm /usr/lib/rcm/scripts/SUNW,sample.pl
754 # pkill -HUP -x -u root rcm_daemon
756 .in -2
759 .SH EXAMPLES
761 \fBExample 1 \fRSite Customization RCM Script
763 .in +2
765 #! /usr/bin/perl -w
768 # A sample site customization RCM script for a tape backup application.
770 # This script registers all tape drives in the system with RCM.
771 # When the system attempts to remove a tape drive by DR the script
772 # does the following:
773 #   - if the tape drive is not being used for backup, it allows the
774 #     DR to continue.
775 #   - if the tape drive is being used for backup, and when DR is not
776 #     forced (RCM_ENV_FORCE=FALSE) it indicates that it cannot release
777 #     the tape drive with appropriate error message. When forced
778 #     (RCM_ENV_FORCE=TRUE) it kills the tape backup application in
779 #     order to allow the DR to continue.
781 # This script does not implement the postremove and undoremove commands
782 # since there is nothing to cleanup after DR remove operation is
783 # completed or failed. If any cleanup is needed after the DR removal
784 # completed, postremove command needs to implemented. If any cleanup is
785 # needed in the event of DR removal failure, undoremove command needs
786 # to be implemented.
789 use strict;
791 my ($cmd, %dispatch);
793 $cmd = shift(@ARGV);
795 # dispatch table for RCM commands
796 %dispatch = (
797     "scriptinfo"    =>      \&do_scriptinfo,
798     "register"      =>      \&do_register,
799     "resourceinfo"  =>      \&do_resourceinfo,
800     "queryremove"   =>      \&do_preremove,
801     "preremove"     =>      \&do_preremove
804 if (defined($dispatch{$cmd})) {
805     &{$dispatch{$cmd}};
806 } else {
807     exit (2);
810 sub do_scriptinfo
812     print "rcm_script_version=1\en";
813     print "rcm_script_func_info=Tape backup appl script for DR\en";
814     exit (0);
817 sub do_register
819     my ($dir, $f, $errmsg);
821     $dir = opendir(RMT, "/dev/rmt");
822     if (!$dir) {
823         $errmsg = "Unable to open /dev/rmt directory: $!";
824         print "rcm_failure_reason=$errmsg\en";
825         exit (1);
826     }
828     while ($f = readdir(RMT)) {
829         # ignore hidden files and multiple names for the same device
830         if (($f !~ /^\./) && ($f =~ /^[0-9]+$/)) {
831             print "rcm_resource_name=/dev/rmt/$f\en";
832         }
834     }
836     closedir(RMT);
837     exit (0);
840 sub do_resourceinfo
842     my ($rsrc, $unit);
844     $rsrc = shift(@ARGV);
845     if ($rsrc =~ /^\e/dev\e/rmt\e/([0-9]+)$/) {
846         $unit = $1;
847         print "rcm_resource_usage_info=Backup Tape Unit Number $unit\en";
848         exit (0);
849     } else {
850         print "rcm_failure_reason=Unknown tape device!\en";
851         exit (1);
852     }
855 sub do_preremove
857     my ($rsrc);
859     $rsrc = shift(@ARGV);
861     # check if backup application is using this resource
862     # if (the backup application is not running on $rsrc) {
863     # allow the DR to continue
864     #        exit (0);
865     #}
866     #
867     # If RCM_ENV_FORCE is FALSE deny the operation.
868     # If RCM_ENV_FORCE is TRUE kill the backup application in order
869     # to allow the DR operation to proceed
870     #
871     if ($ENV{RCM_ENV_FORCE} eq 'TRUE') {
872         if ($cmd eq 'preremove') {
873             # kill the tape backup application
874         }
875         exit (0);
876     } else {
877         #
878         # indicate that the tape drive can not be released
879         # since the device is being used for backup by the
880         # tape backup application
881         #
882         print "rcm_failure_reason=tape backup in progress pid=...\en";
883         exit (3);
885     }
888 .in -2
890 .SH EXIT STATUS
892 A script must exit with following exit status values:
894 .ne 2
896 \fB\fB0\fR\fR
898 .RS 5n
899 Operation specified by the given RCM command has been executed successfully by
900 the script. For \fBqueryremove\fR command it also means that the script can
901 successfully release the resource.
905 .ne 2
907 \fB\fB1\fR\fR
909 .RS 5n
910 An error occurred while processing the RCM command. The script should provide
911 the error message to RCM using the name-value pair \fBrcm_failure_reason\fR
912 before exiting.
916 .ne 2
918 \fB\fB2\fR\fR
920 .RS 5n
921 The script does not support the given RCM command. A script must exit with this
922 status if it cannot understand the given RCM command.
926 .ne 2
928 \fB\fB3\fR\fR
930 .RS 5n
931 Indicates that the script cannot release the resource for \fBpreremove\fR and
932 \fBqueryremove\fR commands. The script should provide a message to RCM
933 specifying the reason for not being able to release the resource using the
934 name-value pair \fBrcm_failure_reason\fR before exiting.
937 .SH ERRORS
939 If a script cannot successfully process an RCM command, it must supply to the
940 RCM a message indicating the reason for failure by writing a name-value pair,
941 in the form shown below, to stdout and exiting with the appropriate exit
942 status.
944 .in +2
946 rcm_failure_reason=\fIfailure_reason\fR
948 .in -2
953 where \fIfailure_reason\fR is a localized human readable message describing the
954 reason for failure of the RCM command.
955 .SH ATTRIBUTES
957 See \fBattributes\fR(5) for descriptions of the following attributes:
962 box;
963 c | c
964 l | l .
965 ATTRIBUTE TYPE  ATTRIBUTE VALUE
967 Interface Stability     Evolving
970 .SH SEE ALSO
972 \fBgettext\fR(1), \fBcfgadm\fR(1M), \fBcfgadm_scsi\fR(1M),
973 \fBcfgadm_pci\fR(1M), \fBsyslog\fR(3C), \fBsignal.h\fR(3HEAD),
974 \fBsyslog.conf\fR(4), \fBattributes\fR(5), \fBenviron\fR(5)
975 .SH NOTES
977 RCM scripts are expected to properly handle all RCM commands that the script
978 implements and to log all errors. Only root has permission to add or remove an
979 RCM script. An ill-behaved RCM script can cause unexpected DR failures.
982 RCM commands are invoked only for the resources whose subsystems participate
983 within the RCM framework. Currently, not all subsystems participate within the
984 RCM framework.