summaryrefslogtreecommitdiff
path: root/src/pmns/pmnsadd
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmns/pmnsadd')
-rwxr-xr-xsrc/pmns/pmnsadd125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/pmns/pmnsadd b/src/pmns/pmnsadd
new file mode 100755
index 0000000..a14e4ad
--- /dev/null
+++ b/src/pmns/pmnsadd
@@ -0,0 +1,125 @@
+#!/bin/sh
+#
+# Copyright (c) 1997-2001 Silicon Graphics, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# Add a subtree of new names into the namespace in the current directory
+#
+
+# source the PCP configuration environment variables
+. $PCP_DIR/etc/pcp.env
+
+umask 22 # anything else is pretty silly
+exitsts=1
+tmp=`mktemp -d $PCP_TMPFILE_DIR/pcp.XXXXXXXXX` || exit 1
+prog=`basename $0`
+trap "rm -rf $tmp; exit \$exitsts" 0 1 2 3 15
+
+_usage()
+{
+ echo "Usage: pmnsadd [-d] [-n namespace] file"
+}
+
+namespace=${PMNS_DEFAULT-$PCP_VAR_DIR/pmns/root}
+dupok=""
+
+while getopts dn:\? c
+do
+ case $c
+ in
+ d) dupok="-d"
+ ;;
+ n) namespace=$OPTARG
+ ;;
+ \?) _usage
+ exitsts=0
+ exit
+ ;;
+ esac
+done
+shift `expr $OPTIND - 1`
+
+if [ $# -ne 1 ]
+then
+ _usage
+ exit
+fi
+
+if [ ! -f $namespace ]
+then
+ echo "$prog: cannot find PMNS file \"$root\""
+ exit
+fi
+
+if [ ! -w $namespace ]
+then
+ echo "$prog: cannot open PMNS file \"$root\" for writing"
+ exit
+fi
+
+if [ ! -f "$1" ]
+then
+ echo "$prog: cannot find input file \"$1\""
+ exit
+fi
+
+if grep '^root {' "$1" >/dev/null
+then
+ # Special case ... if the PMDA only supplies metrics at the root of
+ # the PMNS, e.g. the MMV PMDA with all dynamic metrics, the input
+ # PMNS contains 'root {' already, so just use that without any need
+ # to construct the upper levels of the PMNS
+ #
+ cp "$1" $tmp/tmp
+else
+ # Normal case ... find PMNS pathname for base of new subtree
+ # (subroot), construct upper levels of PMNS as required and hand-off
+ # to pmnsmerge
+ #
+ subroot=`$PCP_AWK_PROG <"$1" 'NF >= 2 && $2 == "{" { print $1 ; exit }'`
+ echo 'root {' >$tmp/tmp
+ path=""
+ for name in `echo "$subroot" | tr '.' ' '`
+ do
+ [ ! -z "$path" ] && echo "$path {" >>$tmp/tmp
+ echo " $name" >>$tmp/tmp
+ echo "}" >>$tmp/tmp
+ if [ -z "$path" ]
+ then
+ path="$name"
+ else
+ path="$path.$name"
+ fi
+ done
+ cat "$1" >>$tmp/tmp
+fi
+
+# try to preserve mode, owner and group for the new output files
+#
+rm -f $namespace.new
+[ -f $namespace ] && cp -p $namespace $namespace.new
+
+$PCP_BINADM_DIR/pmnsmerge -f $dupok $namespace $tmp/tmp $namespace.new
+exitsts=$?
+
+# from here on, ignore SIGINT, SIGHUP and SIGTERM to protect
+# the integrity of the new ouput files
+#
+trap "" 1 2 15
+
+if [ $exitsts = 0 ]
+then
+ mv $namespace.new $namespace
+else
+ echo "$prog: No changes have been made to the PMNS file \"$namespace\""
+ rm -f $namespace.new
+fi