xref: /titanic_51/usr/src/lib/libshell/common/scripts/svcproptree1.sh (revision 3e14f97f673e8a630f076077de35afdd43dc1587)
17c2fbfb3SApril Chin#!/usr/bin/ksh93
27c2fbfb3SApril Chin
37c2fbfb3SApril Chin#
47c2fbfb3SApril Chin# CDDL HEADER START
57c2fbfb3SApril Chin#
67c2fbfb3SApril Chin# The contents of this file are subject to the terms of the
77c2fbfb3SApril Chin# Common Development and Distribution License (the "License").
87c2fbfb3SApril Chin# You may not use this file except in compliance with the License.
97c2fbfb3SApril Chin#
107c2fbfb3SApril Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
117c2fbfb3SApril Chin# or http://www.opensolaris.org/os/licensing.
127c2fbfb3SApril Chin# See the License for the specific language governing permissions
137c2fbfb3SApril Chin# and limitations under the License.
147c2fbfb3SApril Chin#
157c2fbfb3SApril Chin# When distributing Covered Code, include this CDDL HEADER in each
167c2fbfb3SApril Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
177c2fbfb3SApril Chin# If applicable, add the following below this CDDL HEADER, with the
187c2fbfb3SApril Chin# fields enclosed by brackets "[]" replaced with your own identifying
197c2fbfb3SApril Chin# information: Portions Copyright [yyyy] [name of copyright owner]
207c2fbfb3SApril Chin#
217c2fbfb3SApril Chin# CDDL HEADER END
227c2fbfb3SApril Chin#
237c2fbfb3SApril Chin
247c2fbfb3SApril Chin#
25*3e14f97fSRoger A. Faulkner# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
267c2fbfb3SApril Chin#
277c2fbfb3SApril Chin
287c2fbfb3SApril Chin# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant
297c2fbfb3SApril Chinexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin
307c2fbfb3SApril Chin
317c2fbfb3SApril Chin# Make sure all math stuff runs in the "C" locale to avoid problems
327c2fbfb3SApril Chin# with alternative # radix point representations (e.g. ',' instead of
337c2fbfb3SApril Chin# '.' in de_DE.*-locales). This needs to be set _before_ any
347c2fbfb3SApril Chin# floating-point constants are defined in this script).
357c2fbfb3SApril Chinif [[ "${LC_ALL}" != "" ]] ; then
367c2fbfb3SApril Chin    export \
377c2fbfb3SApril Chin        LC_MONETARY="${LC_ALL}" \
387c2fbfb3SApril Chin        LC_MESSAGES="${LC_ALL}" \
397c2fbfb3SApril Chin        LC_COLLATE="${LC_ALL}" \
407c2fbfb3SApril Chin        LC_CTYPE="${LC_ALL}"
417c2fbfb3SApril Chin        unset LC_ALL
427c2fbfb3SApril Chinfi
437c2fbfb3SApril Chinexport LC_NUMERIC=C
447c2fbfb3SApril Chin
457c2fbfb3SApril Chinfunction fatal_error
467c2fbfb3SApril Chin{
477c2fbfb3SApril Chin	print -u2 "${progname}: $*"
487c2fbfb3SApril Chin	exit 1
497c2fbfb3SApril Chin}
507c2fbfb3SApril Chin
517c2fbfb3SApril Chin
527c2fbfb3SApril Chinfunction svcproptovartree
537c2fbfb3SApril Chin{
547c2fbfb3SApril Chin	nameref tree=$1
557c2fbfb3SApril Chin
567c2fbfb3SApril Chin	typeset name
577c2fbfb3SApril Chin	typeset servicename
587c2fbfb3SApril Chin	typeset propname
597c2fbfb3SApril Chin
607c2fbfb3SApril Chin	typeset datatype
617c2fbfb3SApril Chin
627c2fbfb3SApril Chin	typeset -a fields
637c2fbfb3SApril Chin	integer num_fields
647c2fbfb3SApril Chin	integer i
657c2fbfb3SApril Chin
667c2fbfb3SApril Chin	while IFS=' ' read -A fields ; do
677c2fbfb3SApril Chin		num_fields=${#fields[*]}
687c2fbfb3SApril Chin
697c2fbfb3SApril Chin		name="${fields[0]}"
707c2fbfb3SApril Chin		datatype="${fields[1]}"
717c2fbfb3SApril Chin		# parse service/property name
727c2fbfb3SApril Chin		servicename="${name%~(Er):properties/.*}"
737c2fbfb3SApril Chin		servicename="${servicename/~(El)svc:\//}" # strip "svc:/"
747c2fbfb3SApril Chin		propname="${name#~(El).*:properties/}"
757c2fbfb3SApril Chin
76*3e14f97fSRoger A. Faulkner		[[ "${ typeset +p "tree[${servicename}].properties" ; }" == "" ]] && compound -A tree[${servicename}].properties
777c2fbfb3SApril Chin
7834f9b3eeSRoland Mainz		nameref node=tree[${servicename}].properties[${propname}]
797c2fbfb3SApril Chin
807c2fbfb3SApril Chin		node=(
817c2fbfb3SApril Chin			typeset datatype="${datatype}"
827c2fbfb3SApril Chin			typeset valuelist="true"
837c2fbfb3SApril Chin			typeset -a values
847c2fbfb3SApril Chin		)
857c2fbfb3SApril Chin
867c2fbfb3SApril Chin		for (( i=2 ; i < num_fields ; i++ )) ; do
877c2fbfb3SApril Chin			node.values+=( "${fields[i]}" )
887c2fbfb3SApril Chin		done
897c2fbfb3SApril Chin	done
907c2fbfb3SApril Chin
917c2fbfb3SApril Chin	return 0
927c2fbfb3SApril Chin}
937c2fbfb3SApril Chin
947c2fbfb3SApril Chinfunction usage
957c2fbfb3SApril Chin{
967c2fbfb3SApril Chin	OPTIND=0
977c2fbfb3SApril Chin	getopts -a "${progname}" "${svcproptree1_usage}" OPT '-?'
987c2fbfb3SApril Chin	exit 2
997c2fbfb3SApril Chin}
1007c2fbfb3SApril Chin
1017c2fbfb3SApril Chin# program start
1027c2fbfb3SApril Chinbuiltin basename
1037c2fbfb3SApril Chinbuiltin cat
1047c2fbfb3SApril Chinbuiltin date
1057c2fbfb3SApril Chinbuiltin uname
1067c2fbfb3SApril Chin
1077c2fbfb3SApril Chintypeset progname="${ basename "${0}" ; }"
1087c2fbfb3SApril Chin
1097c2fbfb3SApril Chintypeset -r svcproptree1_usage=$'+
110*3e14f97fSRoger A. Faulkner[-?\n@(#)\$Id: svcproptree1 (Roland Mainz) 2010-04-02 \$\n]
1117c2fbfb3SApril Chin[-author?Roland Mainz <roland.mainz@nrubsig.org>]
1127c2fbfb3SApril Chin[+NAME?svcproptree1 - SMF tree demo]
1137c2fbfb3SApril Chin[+DESCRIPTION?\bsvcproptree1\b is a small ksh93 compound variable demo
1147c2fbfb3SApril Chin	which reads accepts a SMF service pattern name input file,
1157c2fbfb3SApril Chin	reads the matching service properties and converts them into an internal
1167c2fbfb3SApril Chin	variable tree representation and outputs it in the format
11734f9b3eeSRoland Mainz	specified by viewmode (either "list", "namelist", "tree" or "compacttree")..]
1187c2fbfb3SApril Chin
1197c2fbfb3SApril Chinpattern viewmode
1207c2fbfb3SApril Chin
1217c2fbfb3SApril Chin[+SEE ALSO?\bksh93\b(1), \bsvcprop\b(1)]
1227c2fbfb3SApril Chin'
1237c2fbfb3SApril Chin
1247c2fbfb3SApril Chinwhile getopts -a "${progname}" "${svcproptree1_usage}" OPT ; do
1257c2fbfb3SApril Chin#	printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
1267c2fbfb3SApril Chin	case ${OPT} in
1277c2fbfb3SApril Chin		*)	usage ;;
1287c2fbfb3SApril Chin	esac
1297c2fbfb3SApril Chindone
1307c2fbfb3SApril Chinshift $((OPTIND-1))
1317c2fbfb3SApril Chin
1327c2fbfb3SApril Chintypeset svcpattern="$1"
1337c2fbfb3SApril Chintypeset viewmode="$2"
1347c2fbfb3SApril Chin
13534f9b3eeSRoland Mainzif [[ "${viewmode}" != ~(Elr)(list|namelist|tree|compacttree) ]] ; then
1367c2fbfb3SApril Chin	fatal_error $"Invalid view mode \"${viewmode}\"."
1377c2fbfb3SApril Chinfi
1387c2fbfb3SApril Chin
13934f9b3eeSRoland Mainzcompound svc=(
1407c2fbfb3SApril Chin	typeset -A proptree
1417c2fbfb3SApril Chin)
1427c2fbfb3SApril Chin
1437c2fbfb3SApril Chintypeset s
1447c2fbfb3SApril Chin
1457c2fbfb3SApril Chins="$(/usr/bin/svcprop -f "${svcpattern}")" || fatal_error $"svcprop failed with exit code $?."
1467c2fbfb3SApril Chinprint -u2 $"#loading completed."
1477c2fbfb3SApril Chin
1487c2fbfb3SApril Chinprint -r -- "$s" | svcproptovartree svc.proptree
1497c2fbfb3SApril Chinprint -u2 $"#parsing completed."
1507c2fbfb3SApril Chin
1517c2fbfb3SApril Chincase "${viewmode}" in
1527c2fbfb3SApril Chin	list)
1537c2fbfb3SApril Chin		set | egrep "^svc.proptree\[" | fgrep -v ']=$'
1547c2fbfb3SApril Chin		;;
1557c2fbfb3SApril Chin	namelist)
1567c2fbfb3SApril Chin		typeset + | egrep "^svc.proptree\["
1577c2fbfb3SApril Chin		;;
1587c2fbfb3SApril Chin	tree)
15934f9b3eeSRoland Mainz		print -v svc
16034f9b3eeSRoland Mainz		;;
16134f9b3eeSRoland Mainz	compacttree)
16234f9b3eeSRoland Mainz		print -C svc
1637c2fbfb3SApril Chin		;;
1647c2fbfb3SApril Chin	*)
1657c2fbfb3SApril Chin		fatal_error $"Invalid view mode \"${viewmode}\"."
1667c2fbfb3SApril Chin		;;
1677c2fbfb3SApril Chinesac
1687c2fbfb3SApril Chin
1697c2fbfb3SApril Chinprint -u2 $"#done."
1707c2fbfb3SApril Chin
1717c2fbfb3SApril Chinexit 0
1727c2fbfb3SApril Chin# EOF.
173