#!/usr/local/bin/perl
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# 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";
}


