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