OpenSolaris_b135/cmd/svc/profile/listsvcs.pl

#!/usr/bin/perl
#
# CDDL HEADER START
#
# 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.
#
# 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.
#
# 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]
#
# CDDL HEADER END

#
# ident	"%Z%%M%	%I%	%E% SMI"
#
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

#
# listsvcs [-e] profile ...
#
# List all service instances in an SMF profile.
# Options:
#	-e	List enabled instances only
#

use XML::Parser;
use Getopt::Std;
use strict;

my %opts;
my $servicename;	# name attribute of the enclosing service element
my @svcs = ();		# services list under construction

if (!getopts("e", \%opts)) {
	die "Usage: $0 [-e] profile ...\n";
}
my $list_all = !$opts{e};

my $parser = new XML::Parser;
$parser->setHandlers(Start => \&start_handler, End => \&end_handler);

for my $file (@ARGV) {
	$parser->parsefile($file);
}
print join("\n", sort(@svcs)), "\n";

sub start_handler
{
	my ($p, $el, %attrs) = @_;
	my $name;

	return unless ($attrs{"name"});
	$name = $attrs{"name"};

	if ($el eq "service") {
		$servicename = $name;
	} elsif ($el eq "instance" && defined $servicename) {
		push(@svcs, "$servicename:$name")
			if ($list_all || $attrs{"enabled"} eq "true");
	}
}

sub end_handler
{
	my ($p, $el) = @_;

	if ($el eq "service") {
		$servicename = undef;
	}
}