1#!/usr/bin/perl -w 2# 3# CDDL HEADER START 4# 5# The contents of this file are subject to the terms of the 6# Common Development and Distribution License (the "License"). 7# You may not use this file except in compliance with the License. 8# 9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10# or http://www.opensolaris.org/os/licensing. 11# See the License for the specific language governing permissions 12# and limitations under the License. 13# 14# When distributing Covered Code, include this CDDL HEADER in each 15# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16# If applicable, add the following below this CDDL HEADER, with the 17# fields enclosed by brackets "[]" replaced with your own identifying 18# information: Portions Copyright [yyyy] [name of copyright owner] 19# 20# CDDL HEADER END 21# 22 23# 24# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 25# Use is subject to license terms. 26# 27 28# 29# RCM script to allow/deny removal of miscellaneous virtual devices 30# from an LDoms domain. 31# 32# Currently, the only device in this category is vcc 33# (virtual-console-concentrator). 34# 35 36use strict; 37 38my $vcc_path_prefix = "/devices/virtual-devices\@100/channel-devices\@200/"; 39my $vcc_leaf_node = "virtual-console-concentrator"; 40 41my $cmd; 42my %dispatch; 43 44 45sub do_scriptinfo 46{ 47 print "rcm_log_debug=do_scriptinfo\n"; 48 49 print "rcm_script_version=1\n"; 50 print "rcm_script_func_info=VIO DR (VCC)\n"; 51 52 exit (0); 53} 54 55sub do_resourceinfo 56{ 57 print "rcm_log_debug=do_resourceinfo\n"; 58 print "rcm_resource_usage_info=" . 59 "in use by virtual console service (vntsd)\n"; 60 61 exit (0); 62} 63 64sub do_register 65{ 66 print "rcm_log_debug=do_register\n"; 67 68 # 69 # Identify any vcc devices in the system. Vntsd always keeps the 70 # ":ctl" node open as a way to create or remove console ports, so 71 # use that as a proxy for the entire device. 72 # 73 my $path = $vcc_path_prefix . $vcc_leaf_node . "\*ctl"; 74 my @devs = glob $path; 75 my $consdev; 76 77 # 78 # Tell the RCM framework to notify us if there is a request to 79 # remove a vcc device. 80 # 81 printf "rcm_log_debug=do_register: %d devices\n", scalar(@devs); 82 foreach $consdev(@devs) { 83 print "rcm_resource_name=$consdev\n"; 84 } 85 86 exit (0); 87} 88 89sub do_queryremove 90{ 91 my $rsrc = shift(@ARGV); 92 93 print "rcm_log_debug=do_queryremove: '$rsrc'\n"; 94 95 # 96 # fuser(8) sends to stdout the pids of any processes using the 97 # device. Some other information always appears on stderr and 98 # must be discarded to avoid invalidating the test. 99 # 100 my $str = `/usr/sbin/fuser $rsrc 2>/dev/null`; 101 102 if ($? != 0) { 103 printf "rcm_log_err=do_queryremove: " . 104 "fuser failed (status %d)\n", $?; 105 print "rcm_failure_reason=helper command (fuser) failed\n"; 106 exit (1); 107 } 108 109 my @words = split(/ /, $str); 110 111 # Allow the operation if device not opened by any processes. 112 if (scalar(@words) != 0) { 113 print "rcm_log_debug=BLOCKED\n"; 114 print "rcm_failure_reason=device " . 115 "in use by virtual console service (vntsd)\n"; 116 exit (3); 117 } 118 119 exit (0); 120} 121 122$cmd = shift(@ARGV); 123 124# dispatch table for RCM commands 125%dispatch = ( 126 "scriptinfo" => \&do_scriptinfo, 127 "resourceinfo" => \&do_resourceinfo, 128 "register" => \&do_register, 129 "queryremove" => \&do_queryremove 130); 131 132if (defined($dispatch{$cmd})) { 133 &{$dispatch{$cmd}}; 134} else { 135 exit (2); 136} 137