045b72beb2c350d3331f90b3c626be055e6c8b7bjm#!/usr/bin/perl -w
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# CDDL HEADER START
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# The contents of this file are subject to the terms of the
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# Common Development and Distribution License (the "License").
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# You may not use this file except in compliance with the License.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# or http://www.opensolaris.org/os/licensing.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# See the License for the specific language governing permissions
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# and limitations under the License.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# When distributing Covered Code, include this CDDL HEADER in each
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# If applicable, add the following below this CDDL HEADER, with the
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# fields enclosed by brackets "[]" replaced with your own identifying
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# information: Portions Copyright [yyyy] [name of copyright owner]
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# CDDL HEADER END
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# Use is subject to license terms.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#pragma ident "%Z%%M% %I% %E% SMI"
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# RCM script to allow/deny removal of miscellaneous virtual devices
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# from an LDoms domain.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# Currently, the only device in this category is vcc
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# (virtual-console-concentrator).
045b72beb2c350d3331f90b3c626be055e6c8b7bjm#
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmuse strict;
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmmy $vcc_path_prefix = "/devices/virtual-devices\@100/channel-devices\@200/";
045b72beb2c350d3331f90b3c626be055e6c8b7bjmmy $vcc_leaf_node = "virtual-console-concentrator";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmmy $cmd;
045b72beb2c350d3331f90b3c626be055e6c8b7bjmmy %dispatch;
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmsub do_scriptinfo
045b72beb2c350d3331f90b3c626be055e6c8b7bjm{
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_log_debug=do_scriptinfo\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_script_version=1\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_script_func_info=VIO DR (VCC)\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm exit (0);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm}
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmsub do_resourceinfo
045b72beb2c350d3331f90b3c626be055e6c8b7bjm{
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_log_debug=do_resourceinfo\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_resource_usage_info=" .
045b72beb2c350d3331f90b3c626be055e6c8b7bjm "in use by virtual console service (vntsd)\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm exit (0);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm}
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmsub do_register
045b72beb2c350d3331f90b3c626be055e6c8b7bjm{
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_log_debug=do_register\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm #
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # Identify any vcc devices in the system. Vntsd always keeps the
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # ":ctl" node open as a way to create or remove console ports, so
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # use that as a proxy for the entire device.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm #
045b72beb2c350d3331f90b3c626be055e6c8b7bjm my $path = $vcc_path_prefix . $vcc_leaf_node . "\*ctl";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm my @devs = glob $path;
045b72beb2c350d3331f90b3c626be055e6c8b7bjm my $consdev;
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm #
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # Tell the RCM framework to notify us if there is a request to
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # remove a vcc device.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm #
045b72beb2c350d3331f90b3c626be055e6c8b7bjm printf "rcm_log_debug=do_register: %d devices\n", scalar(@devs);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm foreach $consdev(@devs) {
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_resource_name=$consdev\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm }
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm exit (0);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm}
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmsub do_queryremove
045b72beb2c350d3331f90b3c626be055e6c8b7bjm{
045b72beb2c350d3331f90b3c626be055e6c8b7bjm my $rsrc = shift(@ARGV);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_log_debug=do_queryremove: '$rsrc'\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm #
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # fuser(1M) sends to stdout the pids of any processes using the
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # device. Some other information always appears on stderr and
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # must be discarded to avoid invalidating the test.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm #
045b72beb2c350d3331f90b3c626be055e6c8b7bjm my $str = `/usr/sbin/fuser $rsrc 2>/dev/null`;
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm if ($? != 0) {
045b72beb2c350d3331f90b3c626be055e6c8b7bjm printf "rcm_log_err=do_queryremove: " .
045b72beb2c350d3331f90b3c626be055e6c8b7bjm "fuser failed (status %d)\n", $?;
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_failure_reason=helper command (fuser) failed\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm exit (1);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm }
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm my @words = split(/ /, $str);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm # Allow the operation if device not opened by any processes.
045b72beb2c350d3331f90b3c626be055e6c8b7bjm if (scalar(@words) != 0) {
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_log_debug=BLOCKED\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm print "rcm_failure_reason=device " .
045b72beb2c350d3331f90b3c626be055e6c8b7bjm "in use by virtual console service (vntsd)\n";
045b72beb2c350d3331f90b3c626be055e6c8b7bjm exit (3);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm }
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm exit (0);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm}
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm$cmd = shift(@ARGV);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjm# dispatch table for RCM commands
045b72beb2c350d3331f90b3c626be055e6c8b7bjm%dispatch = (
045b72beb2c350d3331f90b3c626be055e6c8b7bjm "scriptinfo" => \&do_scriptinfo,
045b72beb2c350d3331f90b3c626be055e6c8b7bjm "resourceinfo" => \&do_resourceinfo,
045b72beb2c350d3331f90b3c626be055e6c8b7bjm "register" => \&do_register,
045b72beb2c350d3331f90b3c626be055e6c8b7bjm "queryremove" => \&do_queryremove
045b72beb2c350d3331f90b3c626be055e6c8b7bjm);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm
045b72beb2c350d3331f90b3c626be055e6c8b7bjmif (defined($dispatch{$cmd})) {
045b72beb2c350d3331f90b3c626be055e6c8b7bjm &{$dispatch{$cmd}};
045b72beb2c350d3331f90b3c626be055e6c8b7bjm} else {
045b72beb2c350d3331f90b3c626be055e6c8b7bjm exit (2);
045b72beb2c350d3331f90b3c626be055e6c8b7bjm}