diff options
Diffstat (limited to 'src/pmdas/weblog/Install')
-rw-r--r-- | src/pmdas/weblog/Install | 694 |
1 files changed, 694 insertions, 0 deletions
diff --git a/src/pmdas/weblog/Install b/src/pmdas/weblog/Install new file mode 100644 index 0000000..dcc86a1 --- /dev/null +++ b/src/pmdas/weblog/Install @@ -0,0 +1,694 @@ +#! /bin/sh +# +# Copyright (c) 2000,2003,2004 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. +# +# Install the weblog PMDA and/or PMNS +# + +. $PCP_DIR/etc/pcp.env +. $PCP_SHARE_DIR/lib/pmdaproc.sh + +# Override function from pmdaproc.sh +__choose_mode() +{ + if [ -n "$QUIET_INSTALL" ] ; then + do_pmda=true + else + __def=m + $do_pmda && __def=b + echo \ +'You will need to choose an appropriate configuration for installation of +the "'$iam'" Performance Metrics Domain Agent (PMDA). + + collector collect performance statistics on this system + monitor allow this system to monitor local and/or remote systems + both collector and monitor configuration for this system +' + while true + do + $PCP_ECHO_PROG $PCP_ECHO_N 'Please enter c(ollector) or m(onitor) or b(oth) ['$__def'] '"$PCP_ECHO_C" + read ans + case "$ans" + in + "") break + ;; + c|collector|b|both) + do_pmda=true + break + ;; + m|monitor) + do_pmda=false + break + ;; + *) echo "Sorry, that is not acceptable response ..." + ;; + esac + done + echo + + fi +} + +iam=weblog +pmda_interface=2 +forced_restart=false + +pmdaSetup + +pmns_name=web # metric names differ from PMDA name +daemon_opt=true # can install as daemon +dso_opt=false +pipe_opt=true # pipe IPC - YES +socket_opt=false # socket IPC - NO +socket_inet_def=2080 # default TCP port for Internet socket IPC +check_delay=10 # give the PMDA a chance to set itself up + +# PMDA specific constants +# +configDir=$PCP_VAR_DIR/config/web + +# PMDA variables +# +tmp=`mktemp -d /tmp/pcp.XXXXXXXXX` || exit 1 +trap "rm -rf $tmp; exit" 0 1 2 3 15 + +debugFlag=0 +do_debug=false + +configFile="" +delay=15 +chkDelay=20 +maxserv=80 + + +# --- start functions --- +# +_parseDefaults() +{ + echo "Extracting options from current installation ..." + while getopts D:d:i:l:n:pS:t:u: c + do + case $c in + \?) echo "Warning: Unrecognized option in $PCP_PMCDCONF_PATH" + echo " Remove line for pmdaweblog in $PCP_PMCDCONF_PATH and re-run ./Install" + exit 2;; + D) debugFlag=$OPTARG;; + n) chkDelay=$OPTARG;; + t) delay=$OPTARG;; + S) maxserv=$OPTARG;; + *) # old or boring flags, silently ignore + ;; + esac + done + shift `expr $OPTIND - 1` + if [ $# -eq 1 ] + then + configFile=$1 + elif [ $# -eq 0 ] + then + configFile="" + else + echo "Warning: unrecognized format for old specification in $PCP_PMCDCONF_PATH" + echo " Remove line for pmdaweblog in $PCP_PMCDCONF_PATH and re-run ./Install" + exit 2 + fi +} + +_defaultRegex() +{ + touch $1 + echo ' +# Common regular expressions specifications for parsing access and error logs +# Each regular expression specification should have a name (one word), +# specify the order of regex parameters (method and size), and +# a regular expression. Regular expressions for access logs require two +# arguments to be set while errors logs require only a match. +# +# Set the online HTML Users and Administrators Guide, pmdaweblog(1) and +# regexec(3) for more details. +# + +# pattern for CERN, NCSA, Netscape, Apache etc Access Logs +regex_posix CERN method,size ][ \\]+"([A-Za-z][-A-Za-z]+) [^"]*" [-0-9]+ ([-0-9]+) +# pattern for CERN, NCSA, Netscape etc Error Logs +regex_posix CERN_err - . +# pattern for Proxy Server Extended Log Format +regex_posix NS_PROXY 1,3,2,4 ][ ]+"([A-Za-z][-A-Za-z]+) [^"]*" ([-0-9]+) ([-0-9]+) ([-0-9]+) +# pattern for Squid Cache logs +regex_posix SQUID 4,3,2,1 [0-9]+\.[0-9]+[ ]+[0-9]+ [a-zA-Z0-9\.]+ ([_A-Z]+)\/([0-9]+) ([0-9]+) ([A-Z]+) +# pattern for Netscape SOCKS Server Access logs +regex_posix NS_SOCKS method,size (sockd)\[.*, ([0-9]+) bytes from .* \(http\) +# pattern for Netscape SOCKS Server Error logs +regex_posix NS_SOCKS_err - . +# pattern for FTP through a Netscape SOCKS Server Access log +regex_posix NS_FTP method,size (sockd)\[.*, ([0-9]+) bytes from .* \([0-9]+\) +# pattern for FTP through a Netscape SOCKS Server Error logs +regex_posix NS_FTP_err - . +# pattern for FTP Server access logs (normally in SYSLOG) +regex_posix SYSLOG_FTP method,size ftpd\[.*\]: ([gp][-A-Za-z]+)( ) +# pattern for FTP Server error logs (normally in SYSLOG) +regex_posix SYSLOG_FTP_err - FTP LOGIN FAILED +# pattern for WU_FTP Server access logs (normally in xferlog) +regex_posix WU_FTP size,method :[0-9][0-9] [0-9]+ [0-9]+ .+ ([0-9]+) .+ [ba] .+ ([io]) [arg] +# pattern for WU_FTP Server error logs (normally in SYSLOG/messages) +regex_posix WU_FTP_err - failed login + +# Server specifications. The format of each specification is +# "server" serverName on|off accessRegex accessFile errorRegex errorFile +# +# Set the online HTML Users and Administrators Guide and pmdaweblog(1) +# for more details. +#' >> $1 +} + +_parse_server() +{ + egrep "^server" | $PCP_AWK_PROG ' + { i=index($2, ":"); + if (i == 0) { + name = $2; + port = ""; + } + else { + name = substr($2,1,i-1); + port = sprintf("Port %d", substr($2, i+1, length($2) - i)); + } + printf("Server %s %s\n", name, port); + printf(" Access Log: %s (%s)\n", $5, $4); + printf(" Error Log: %s (%s)\n\n", $7, $6); + }' +} + +_default_config () +{ + rm -f $tmp/conf + touch $tmp/conf + _defaultRegex $tmp/conf + ./server.sh -q -l $tmp/conf + egrep "^server" $tmp/conf > /dev/null 2>&1 + _st=$? + if [ $_st -eq 0 ] + then + ./pmdaweblog -C $tmp/conf >$tmp/out 2>&1 + _st=$? + if [ $_st -eq 0 ] ; then + if [ -z "$configFile" ] + then + configFile=$configDir/$iam.conf + fi + rm -f $configFile + cp $tmp/conf $configFile + args="-D $debugFlag -t $delay -n $chkDelay -S $maxserv $configFile" + socket_opt=false + fi + fi + return $_st +} + +# +# --- end functions --- + +if $do_pmda +then + + [ ! -d $configDir ] && mkdir -p $configDir + + if [ -n "$QUIET_INSTALL" ] ; then + _default_config + if [ $? -eq 0 ] ; then + pmdaInstall + exit $? + else + exit 1 + fi + else + echo "----------------------------------------------------------------" + echo + echo "The default installation of the weblog PMDA will search for known" + echo "Web server configurations on this host and will setup the weblog" + echo "PMDA to monitor all associated Web server log files." + echo + echo "Otherwise, you will be prompted for the required information." + echo + $PCP_ECHO_PROG $PCP_ECHO_N "Do you want a default weblog PMDA installation [y] ""$PCP_ECHO_C" + read ans + echo + if [ "X$ans" = X -o "X$ans" = Xy -o "X$ans" = XY ] + then + _default_config + if [ $? -eq 0 ] ; then + pmdaInstall + exit $? + else + echo + echo "Unable to find any Web servers!" + echo "Reverting to detailed installation..." + fi + fi + + echo "----------------------------------------------------------------" + echo + $PCP_ECHO_PROG $PCP_ECHO_N "Checking for a previous PMDA installation ...""$PCP_ECHO_C" + + # weblogs -> weblog can be removed once all 1.0 betas are known to + # have gone away + ans=`$PCP_AWK_PROG < $PCP_PMCDCONF_PATH ' + $1 == "'$iam'" { + printf "%s",$6 + for (i=7;i<=NF;i++) printf " %s",$i + print "" + }'` + if [ -n "$ans" ] + then + echo " found" + _parseDefaults $ans + else + echo " appears to be a first-time install" + fi + + if [ -n "$configFile" ] + then + if [ -f "$configFile" ] + then + if [ $PCP_PLATFORM = linux ] && \ + egrep '^regex ' $configFile > /dev/null + then + echo "Warning: previous configuration file \"$configFile\"" + echo " appears to be an incompatible version." + $PCP_ECHO_PROG $PCP_ECHO_N "Do you wish to automatically update the configuration file? [y] ""$PCP_ECHO_C" + read ans + if [ "X$ans" = X -o "$ans" = "y" -o "$ans" = "Y" ] + then + ./weblogconv.sh $configFile $tmp/conf + if ./pmdaweblog -C $tmp/conf > /dev/null 2>&1 + then + cp $tmp/conf $configFile + else + echo "Warning: automatic conversion failed." + echo "You can either continue, and use the default configuration file or exit" + echo "this install procedure to manually update your existing configuration." + $PCP_ECHO_PROG $PCP_ECHO_N "Do you wish to continue with the default configuration? [n] ""$PCP_ECHO_C" + read ans + if [ "$ans" = "y" -o "$ans" = "Y" ] + then + configFile="" + else + exit 1 + fi + fi + fi + else + echo "Using previous configuration file \"$configFile\"" + fi + else + echo "Warning: previous configuration file \"$configFile\" no longer" + echo " exists, reverting to default" + configFile="" + fi + fi + + if [ "X$configFile" = X -a -f $configDir/$iam.conf ] + then + configFile=$configDir/$iam.conf + echo "Using previous configuration file \"$configFile\"" + fi + + if [ "X$configFile" != X ] + then + if [ -f $configFile ] + then + echo "The inital configuration file contains the following Web server details:" + echo + cat $configFile | _parse_server | ${PAGER-more} + echo + echo "------------------------------------------------------------------------------" + + if ./pmdaweblog -C $configFile >$tmp/out 2>&1 + then + : + else + echo "Warning: parsing this configuration file produced the following errors," + echo " and this file will be ignored." + + cat $tmp/out + echo + if [ "X$configFile" = "X$tmp/default" ] + then + echo "Arrgh ... this is the default configuration, I cannot recover from here!" + exit 1 + fi + configFile="" + fi + fi + fi + + echo + echo "A configuration file can be automatically generated. This can" + echo "be used to compare or replace an existing configuration file." + echo + + if [ "X$configFile" = X ] + then + $PCP_ECHO_PROG $PCP_ECHO_N "Do you want a configuration file to be automatically generated [y] ""$PCP_ECHO_C" + read ans + if [ "X$ans" = X ] + then + ans="y" + fi + else + $PCP_ECHO_PROG $PCP_ECHO_N "Do you want a configuration file to be automatically generated [n] ""$PCP_ECHO_C" + read ans + if [ "X$ans" = X ] + then + ans="n" + fi + fi + + if [ "X$ans" = "Xy" -o "X$ans" = "XY" ] + then + echo + echo "Now scanning for Web servers ..." + echo + + if [ ! -x ./server.sh ] + then + echo "Unable to scan for Web servers as ./server.sh is missing!" + else + rm -f $tmp/conf + touch $tmp/conf + _defaultRegex $tmp/conf + ./server.sh -l $tmp/conf + if egrep "^server" $tmp/conf > /dev/null 2>&1 + then + echo + echo "This is a possible configuration file for your system:" + echo + cat $tmp/conf | _parse_server | ${PAGER-more} + echo + echo "------------------------------------------------------------------------------" + echo + + if ./pmdaweblog -C $tmp/conf > /dev/null 2>&1 + then + if [ "X$configFile" = X ] + then + $PCP_ECHO_PROG $PCP_ECHO_N "Would you like to use this configuration file [y] ""$PCP_ECHO_C" + read ans + if [ "X$ans" = "Xy" -o "X$ans" = "XY" -o "X$ans" = X ] + then + cp $tmp/conf $configDir/$iam.conf + configFile=$configDir/$iam.conf + fi + else + echo "Would you like to replace your existing configuration file with" + $PCP_ECHO_PROG $PCP_ECHO_N "the generated file [n] ""$PCP_ECHO_C" + read ans + if [ "X$ans" != "Xn" -a "X$and" != "XN" -a "X$ans" != X ] + then + cp $tmp/conf $configFile + fi + fi + else + echo "Automated configuration file generation is broken!" + if [ "X$configFile" = X ] + then + echo "Please consult the manual on how to create a configuration file." + echo "Installation failed." + exit 1 + else + echo "Ignoring this file." + fi + fi + else + echo + echo "I could not find any Web servers." + fi + echo + fi + fi + + echo "------------------------------------------------------------------------------" + + echo + if [ "X$configFile" = X ] + then + $PCP_ECHO_PROG $PCP_ECHO_N "Do you want to specify some Web servers [n]: ""$PCP_ECHO_C" + serverAdded="false" + else + $PCP_ECHO_PROG $PCP_ECHO_N "Do you want to specify some more Web servers [n]: ""$PCP_ECHO_C" + serverAdded="true" + fi + + read ans + while [ "X$ans" = "Xy" -o "X$ans" = "XY" ] + do + if [ "X$configFile" = X ] + then + if [ "X$configFile" = X -a -f $configDir/$iam.conf ] + then + echo "Replacing existing configuration file $configDir/$iam.conf" + rm -f $configDir/$iam.conf + else + echo "Creating configuration file $configDir/$iam.conf" + fi + _defaultRegex $configDir/$iam.conf + configFile="$configDir/$iam.conf" + fi + + echo + serverName=`hostname` + $PCP_ECHO_PROG $PCP_ECHO_N "The name of the Web server [$serverName]: ""$PCP_ECHO_C" + read ans + if [ "X$ans" = X ] + then + serverName=`hostname` + else + serverName=$ans + fi + + echo + accessPath="" + while [ "X$accessPath" = X ] + do + $PCP_ECHO_PROG $PCP_ECHO_N "The path to the access log: + ""$PCP_ECHO_C" + read accessPath + if [ "X$accessPath" != X ] + then + if [ -f $accessPath ] + then + : + else + echo "$accessPath does not exist or is not a regular file" + accessPath="" + fi + fi + done + + echo + errorPath="" + while [ "X$errorPath" = X ] + do + $PCP_ECHO_PROG $PCP_ECHO_N "The path to the error log: + ""$PCP_ECHO_C" + read errorPath + if [ "X$errorPath" != X ] + then + if [ -f $errorPath ] + then + : + else + echo "$errorPath does not exist or is not a regular file" + errorPath="" + fi + fi + done + + echo + echo "The configuration file contains these specifications:" + echo + ${PAGER-more} $configFile + echo + echo "Does the configuration file contain appropriate regular expressions" + $PCP_ECHO_PROG $PCP_ECHO_N "for the \"$serverName\" Web server [y]: ""$PCP_ECHO_C" + read ans + echo + if [ "X$ans" = "Xn" -o "X$ans" = "XN" ] + then + $PCP_ECHO_PROG $PCP_ECHO_N "Do you wish to quit the installation to add new regular expressions [y]: ""$PCP_ECHO_C" + read ans + if [ "$Xans" = "Xy" -o "X$ans" = "XY" -o "X$ans" = X ] + then + echo "Edit $configFile and then rerun this Install script." + exit 1 + echo + echo "Skipping $serverName ..." + fi + else + accessRegex="" + while [ "X$accessRegex" = X ] + do + if egrep "^regex_posix CERN " $configFile > /dev/null 2>&1 + then + $PCP_ECHO_PROG $PCP_ECHO_N "The regex for the access log [CERN]: ""$PCP_ECHO_C" + accessRegex="CERN" + else + $PCP_ECHO_PROG $PCP_ECHO_N "The regex for the access log: ""$PCP_ECHO_C" + accessRegex="" + fi + read ans + if [ "X$ans" != X ] + then + accessRegex=$ans + fi + if [ "X$accessRegex" != X ] + then + if egrep "^regex_posix $accessRegex " $configFile > /dev/null 2>&1 + then + : + else + echo "Could not find $accessRegex in $configFile" + accessRegex="" + fi + fi + done + + echo + errorRegex="" + while [ "X$errorRegex" = X ] + do + if egrep "^regex_posix CERN_err " $configFile > /dev/null 2>&1 + then + $PCP_ECHO_PROG $PCP_ECHO_N "The regex for the error log [CERN_err]: ""$PCP_ECHO_C" + errorRegex="CERN_err" + else + $PCP_ECHO_PROG $PCP_ECHO_N "The regex for the error log: ""$PCP_ECHO_C" + errorRegex="" + fi + read ans + if [ "X$ans" != X ] + then + errorRegex=$ans + fi + if [ "X$errorRegex" != X ] + then + if egrep "^regex_posix $errorRegex " $configFile > /dev/null 2>&1 + then + : + else + echo "Could not find $errorRegex in $configFile" + errorRegex="" + fi + fi + done + + echo + echo "You have specified the following Web server:" + echo + server="server $serverName on $accessRegex $accessPath $errorRegex $errorPath" + echo "$server" + echo + $PCP_ECHO_PROG $PCP_ECHO_N "Is this correct [y]: + ""$PCP_ECHO_C" + read ans + if [ "X$ans" = "Xy" -o "X$ans" = "XY" -o "X$ans" = X ] + then + echo >> $configFile + echo "# User configured server called \"$serverName\"" >> $configFile + echo $server >> $configFile + serverAdded="true" + fi + fi + + echo + $PCP_ECHO_PROG $PCP_ECHO_N "Do you wish to specify another Web Server [n]: ""$PCP_ECHO_C" + read ans + echo + done + + if [ "$serverAdded" = "false" ] + then + rm -f $configFile + configFile="" + fi + + if [ "X$configFile" = X ] + then + echo "Please consult the manual on how to create a configuration file." + echo "Installation failed as no servers were specified." + exit 1 + fi + + echo + echo "You may modify the configuration file by hand and add servers" + echo "that are not currently listed, change their names, etc." + echo + $PCP_ECHO_PROG $PCP_ECHO_N "Do you wish to exit and modify the configuration file [n] ""$PCP_ECHO_C" + read ans + if [ "X$ans" != "Xn" -a "X$ans" != "XN" -a "X$ans" != X ] + then + echo + echo "Edit $configFile and then rerun this Install script." + exit 1 + fi + + echo + echo "------------------------------------------------------------------------------" + + echo + $PCP_ECHO_PROG $PCP_ECHO_N "The delay in seconds between forced reads of the log files [$delay] ""$PCP_ECHO_C" + read ans + if [ "X$ans" != X ] + then + delay=$ans + fi + + echo + $PCP_ECHO_PROG $PCP_ECHO_N "Number of seconds of inactivity before checking for log rotation [$chkDelay] ""$PCP_ECHO_C" + read ans + if [ "X$ans" != X ] + then + chkDelay=$ans + fi + + echo + $PCP_ECHO_PROG $PCP_ECHO_N "The maximum number of servers per agent process [$maxserv] ""$PCP_ECHO_C" + read ans + if [ "X$ans" != X ] + then + maxserv=$ans + fi + + if [ "$do_debug" = true ] + then + echo + $PCP_ECHO_PROG $PCP_ECHO_N "the Debugging Flag (see pmdbg(1)) [$debugFlag] ""$PCP_ECHO_C" + read ans + if [ "X$ans" != X ] + then + debugFlag=$ans + fi + fi + + args="-D $debugFlag -t $delay -n $chkDelay -S $maxserv $configFile" + + echo + echo "------------------------------------------------------------------------------" + echo + fi +fi + +pmdaInstall + +exit 0 + |