${cmds_run_clipped}...
\n";
}
# show buttons to enable/disable etc
#
# Parameters:
#
sub print_state_buttons()
{
print ";
close(TEMPLATE);
foreach $find_replace_expr (@$find_replace_arrayref) {
@tdata = @template_data;
# split find/replace into components...
$find_replace_expr =~ /([^\/]*)\/(.*)/;
$find = $1;
$replace = $2;
$linenum = 0;
foreach $line (@tdata) {
if ($line =~ s/$find/$replace/) {
$replace_data[$linenum] =
"$replace_data[$linenum]$line\n";
}
$linenum++;
}
}
# now append to target file
if (-e $target) {
open(TARGET, ">>$target");
} else {
open(TARGET, ">$target");
}
for ($i = 0; $i < @template_data; $i++) {
# if we have a "replace" line, write it, otherwise write original
# template line
if ($replace_data[$i] =~ /.+/) {
print TARGET "$replace_data[$i]";
} else {
print TARGET "$template_data[$i]";
}
}
close(TARGET);
}
# subroutines used in properties page
#
# subroutines used by dep_viewer page
#
# Builds dependency/dependent tree starting from fmri.
# Uses hash with fmris as keys to contain tree info. This way,
# we don't expand a particular branch multiple times when we recurse...
#
# Parameters: dependency_or_dependent, tree_ref, fmri, level, expand_listref
#
sub build_dep_tree()
{
local ($dependency_or_dependent, $tree_ref, $fmri, $level,
$expand_listref, $state, $grouping, $allow_expand, $expand_fmri, $deps,
@dep_info, $dep_inf, $dep_fmri, $dep_state, $parent, $child,
$dep_grouping);
($dependency_or_dependent, $tree_ref, $fmri, $level, $expand_listref,
$state, $grouping) = @_;
$allow_expand = 0;
# if fmri is on expand list passed in, we allow expansion.
foreach $expand_fmri (@$expand_listref) {
if ($expand_fmri eq $fmri) {
$allow_expand = 1;
break;
}
}
if ($tree_ref->{"$fmri"}->{'exists'} != 1) {
# new hash element
$tree_ref->{"$fmri"}->{'exists'} = 1;
# state information, if passed in...
if ($state =~ /.+/) {
$tree_ref->{"$fmri"}->{'state'} = $state;
}
if ($grouping =~ /.+/) {
$tree_ref->{"$fmri"}->{'grouping'} = $grouping;
}
# do we expand tree here (i.e. recurse?)
$tree_ref->{"$fmri"}->{'expand'} = $allow_expand;
@{$tree_ref->{"$fmri"}->{'children'}} = ();
$tree_ref->{"$fmri"}->{'haschildren'} = 0;
$deps = &svc_dep_cmd($dependency_or_dependent, $fmri);
@dep_info = split(/\n/, $deps);
foreach $dep_inf (@dep_info) {
# dependency info consists of fmri and state
$dep_inf =~ /(\S+)\s+(\S+)/;
$dep_fmri = $1;
$dep_state = $2;
# we need to find out what grouping is (using svcs -l).
# for dep'y we call svcs -l $fmri, looking for line
# specifying $dep_fmri. for dep't we call svcs -l
# $dep_fmri, looking for line specifying $fmri.
if ($dependency_or_dependent eq "dependency") {
$parent = $fmri;
$child = $dep_fmri;
} else {
$parent = $dep_fmri;
$child = $fmri;
}
$dep_grouping = &svc_grouping_cmd($parent, $child);
# we need to determine if dep has children, in order
# to disable the expand button if not. however, we
# don't recurse if it does unless it was on expand list
$tree_ref->{"$fmri"}->{'haschildren'} = 1;
chomp($dep_fmri);
push(@{$tree_ref->{"$fmri"}->{'children'}},
$dep_fmri);
if ($allow_expand == 1) {
&build_dep_tree($dependency_or_dependent, $tree_ref,
$dep_fmri, $level + 1, $expand_listref,
$dep_state, $dep_grouping);
}
}
}
}
# Displays dependency/dependent tree using depth-first recursion:
# get fmris children, the print each childs children etc.
# However, if a fmri has expand == 0, we don`t recurse for it.
# For expanded fmris, we show the contract (-) button, and for
# unexpanded, we show the expand button (if they have children).
#
# Parameters: dependency_or_dependent, tree_ref, fmri, level
#
sub print_dep_tree()
{
local ($dependency_or_dependent, $tree_ref, $fmri, $level, $fmriinfo,
$indent, $child_fmri, $tab, $i, $color);
($dependency_or_dependent, $tree_ref, $fmri, $level) = @_;
$fmriinfo = $fmri;
# indent according to level of tree
$indent = 8*$level;
$tab = "";
for ($i = 0; $i < $indent; $i++) {
$tab="$tab ";
}
print "$tab";
if ($tree_ref->{"$fmri"}->{'expand'} == 1) {
$fmriinfo = &contractbutton($dependency_or_dependent, $tree_ref,
$fmri);
} else {
$fmriinfo = &expandbutton($dependency_or_dependent, $tree_ref,
$fmri);
}
# show expand/contract button...
if ($level > 0) {
print "$fmriinfo";
}
# apply-to checkbox
print " \n";
# fmri, link to state editor page for fmri
print " $fmri";
if ($tree_ref->{"$fmri"}->{'state'} =~ /.+/) {
$color = "$state_colors{$tree_ref->{$fmri}->{'state'}}";
print
" $tree_ref->{$fmri}->{'state'}";
}
if ($tree_ref->{"$fmri"}->{'grouping'} =~ /.+/) {
print " ($tree_ref->{$fmri}->{'grouping'})";
}
print "
\n";
if ($tree_ref->{"$fmri"}->{'expand'} == 1) {
# we can expand
foreach $child_fmri (@{$tree_ref->{"$fmri"}->{'children'}}) {
&print_dep_tree($dependency_or_dependent, $tree_ref,
$child_fmri, $level + 1);
}
}
}
sub contractbutton()
{
local ($dependency_or_dependent, $tree_ref, $fmri, $disable);
($dependency_or_dependent, $tree_ref, $fmri) = @_;
$disable = "";
# for elements with no children, disable button...
if ($tree_ref->{"$fmri"}->{'haschildren'} == 0) {
$disable = "disabled=\"disabled\"";
}
return "";
}
sub expandbutton()
{
local ($dependency_or_dependent, $tree_ref, $fmri, $disable);
($dependency_or_dependent, $tree_ref, $fmri) = @_;
$disable = "";
if ($tree_ref->{"$fmri"}->{'haschildren'} == 0) {
$disable = "disabled=\"disabled\"";
}
return "";
}