|  | #!/usr/bin/perl | 
|  | # ==================================================================== | 
|  | # The Apache Software License, Version 1.1 | 
|  | # | 
|  | # Copyright (c) 2000-2001 The Apache Software Foundation.  All rights | 
|  | # reserved. | 
|  | # | 
|  | # Redistribution and use in source and binary forms, with or without | 
|  | # modification, are permitted provided that the following conditions | 
|  | # are met: | 
|  | # | 
|  | # 1. Redistributions of source code must retain the above copyright | 
|  | #    notice, this list of conditions and the following disclaimer. | 
|  | # | 
|  | # 2. Redistributions in binary form must reproduce the above copyright | 
|  | #    notice, this list of conditions and the following disclaimer in | 
|  | #    the documentation and/or other materials provided with the | 
|  | #    distribution. | 
|  | # | 
|  | # 3. The end-user documentation included with the redistribution, | 
|  | #    if any, must include the following acknowledgment: | 
|  | #       "This product includes software developed by the | 
|  | #        Apache Software Foundation (http://www.apache.org/)." | 
|  | #    Alternately, this acknowledgment may appear in the software itself, | 
|  | #    if and wherever such third-party acknowledgments normally appear. | 
|  | # | 
|  | # 4. The names "Apache" and "Apache Software Foundation" must | 
|  | #    not be used to endorse or promote products derived from this | 
|  | #    software without prior written permission. For written | 
|  | #    permission, please contact apache@apache.org. | 
|  | # | 
|  | # 5. Products derived from this software may not be called "Apache", | 
|  | #    nor may "Apache" appear in their name, without prior written | 
|  | #    permission of the Apache Software Foundation. | 
|  | # | 
|  | # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | 
|  | # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
|  | # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
|  | # DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | 
|  | # ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 
|  | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
|  | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | 
|  | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 
|  | # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
|  | # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | 
|  | # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
|  | # SUCH DAMAGE. | 
|  | # ==================================================================== | 
|  | # | 
|  | # This software consists of voluntary contributions made by many | 
|  | # individuals on behalf of the Apache Software Foundation.  For more | 
|  | # information on the Apache Software Foundation, please see | 
|  | # <http://www.apache.org/>. | 
|  | # | 
|  | # Log Server Status | 
|  | # Mark J Cox, UK Web Ltd 1996, mark@ukweb.com | 
|  | # | 
|  | # This script is designed to be run at a frequent interval by something | 
|  | # like cron.  It connects to the server and downloads the status | 
|  | # information.  It reformats the information to a single line and logs | 
|  | # it to a file.  Make sure the directory $wherelog is writable by the | 
|  | # user who runs this script. | 
|  | # | 
|  | require 'sys/socket.ph'; | 
|  |  | 
|  | $wherelog = "/var/log/graph/";  # Logs will be like "/var/log/graph/19960312" | 
|  | $server = "localhost";          # Name of server, could be "www.foo.com" | 
|  | $port = "80";                   # Port on server | 
|  | $request = "/status/?auto";     # Request to send | 
|  |  | 
|  | sub tcp_connect | 
|  | { | 
|  | local($host,$port) =@_; | 
|  | $sockaddr='S n a4 x8'; | 
|  | chop($hostname=`hostname`); | 
|  | $port=(getservbyname($port, 'tcp'))[2]  unless $port =~ /^\d+$/; | 
|  | $me=pack($sockaddr,&AF_INET,0,(gethostbyname($hostname))[4]); | 
|  | $them=pack($sockaddr,&AF_INET,$port,(gethostbyname($host))[4]); | 
|  | socket(S,&PF_INET,&SOCK_STREAM,(getprotobyname('tcp'))[2]) || | 
|  | die "socket: $!"; | 
|  | bind(S,$me) || return "bind: $!"; | 
|  | connect(S,$them) || return "connect: $!"; | 
|  | select(S); | 
|  | $| = 1; | 
|  | select(stdout); | 
|  | return ""; | 
|  | } | 
|  |  | 
|  | ### Main | 
|  |  | 
|  | { | 
|  | $year=`date +%y`; | 
|  | chomp($year); | 
|  | $year += ($year < 70) ? 2000 : 1900; | 
|  | $date = $year . `date +%m%d:%H%M%S`; | 
|  | chomp($date); | 
|  | ($day,$time)=split(/:/,$date); | 
|  | $res=&tcp_connect($server,$port); | 
|  | open(OUT,">>$wherelog$day"); | 
|  | if ($res) { | 
|  | print OUT "$time:-1:-1:-1:-1:$res\n"; | 
|  | exit 1; | 
|  | } | 
|  | print S "GET $request\n"; | 
|  | while (<S>) { | 
|  | $requests=$1 if ( m|^BusyServers:\ (\S+)|); | 
|  | $idle=$1 if ( m|^IdleServers:\ (\S+)|); | 
|  | $number=$1 if ( m|sses:\ (\S+)|); | 
|  | $cpu=$1 if (m|^CPULoad:\ (\S+)|); | 
|  | } | 
|  | print OUT "$time:$requests:$idle:$number:$cpu\n"; | 
|  | } | 
|  |  | 
|  |  |