zim/area/
zim/bin/
zim/clans/plists/
zim/corefiles/
zim/doc/muddy/
zim/gods/
zim/log/
zim/player/
zim/skill_tree/
zim/tmp/
#!/usr/bin/perl
#########################################################################
# mudcheck.pl				Version 1.1			#
# Created: Jun 28, 1997			Jared Proudfoot			#
# Last Modified: Jun 28, 1997		jproudfo@footprints.net		#
#########################################################################
# README								#
#									#
# This is a pretty simple script that checks to see if a mud is running	#
# properly.  Be sure to change the 'important vars' section.  The best	#
# idea is to run this script from cron every couple of minutes... That	#
# way you can be sure that it stays running.				#
#########################################################################
# CHANGES AND HISTORY							#
#									#
# v 1.0, Jun 28, 1997	Created.  Seems to work fine now.		#
# v 1.1, Feb 11, 2005 Zz - changed log date format, added link          #
#########################################################################
#########################################################################
# Define the important vars						#
#									#
# Define the host and port number where the mud resides.		#

$server		=	"localhost";
$port		=	"9999";
$infoport	=	"9998";

# $string is the string of characters we will look for upon connecting.	#
# If we connect, but don't see this string, we will assume the mud	#
# isn't responding (locked up?) and we'll restart it.  The string	#
# *must* be on the first line after connect.	

# You may enter this as a regexp if you wish.				#

$replyString	=	"^\n";

# How long do we wait before we connect timeout (in seconds)?		#

$timeOut	=	"60";

# What to execute if we need to restart the mud.  Please include the	#
# FULL path.								#
$mudpath	=	"/home/mud/mud";

$exec		=	"$mudpath/src/zim";

# Path where you want the mud logs to be kept.

$logdir		=	"$mudpath/log";

# Path where we should start the mud from.				#
$startPath	=	"$mudpath/";

# That's it.  You shouldn't need to change anything after this line.	#
#########################################################################

# What do we need to use?
use Socket;
require 5.003;



#########################################################################
# Main									#
#########################################################################

if (&connect_server == 0) {
	# If we couldn't connect, try and restart.			#
	print ("Connection to $server on port $port failed or timed out after $timeOut seconds!\n");
	$time = (scalar localtime);
	print ("Attempting to restart the mud on $time...\n");
	# Restart the mud						#
	&restart_mud;
}
else {
	# We connected, but is it working properly?			#
		$readline = (&gl);
		if ($readline =~ /$replyString/) {
			# We found what we were looking for, so exit 	#
			# properly.					#
			&disconnect_server;
			exit 1;
		}
	# After all those searches, we didn't find anything.  The mud	#
	# must be locked up.  Lets kill and restart it.			#
	&disconnect_server;
	print ("The connection was sucessful, but it doesn't seem to be responding\n");
	$time = (scalar localtime);
	print ("Attempting to restart the mud on $time...\n");
	system("killall $exec");
	&restart_mud;
}
	
	


#########################################################################
# Subroutines								#
#########################################################################


sub connect_server {
	# Connect to the server						#
	my ($iaddr, $paddr, $proto);
	$iaddr = inet_aton ($server)
		or die ("ERROR: No host: $server!\n");
	$paddr = sockaddr_in ($port, $iaddr);
	$proto = getprotobyname('tcp');
	socket (SOCK, PF_INET, SOCK_STREAM, $proto)
		or die ("ERROR: Socket error $!\n");
	alarm ($timeOut);
	if (connect (SOCK, $paddr)) {;
		alarm (0);
		return 1;
	}
	else {
		return 0;
	}
}

sub disconnect_server {
	# Disconnect from the server					#
	close (SOCK);
	return;
}

sub sl {
	# Send a line							#
  	my ($line)=@_;
  	print SOCK ("$line")
		or die ("ERROR: Error writing to server: $!\n");
	select SOCK;
  	$|=1;
  	select STDOUT;
  	$|=1;
	return;
}
	
sub gl {
	# Get a line							#
	my ($buffer, @reply);
	$buffer=(<SOCK>);
#	(@reply) = split (/\s/, $buffer);
#	return (@reply);
	return ($buffer);
}

sub restart_mud {
		# Restart the mud					#
		#$timet = time();
		($sec, $min, $hour, $mday, $mon, $year) = localtime;
		$year += 1900;
		$timet = sprintf("%4d%02d%02d-%02d%02d%02d",
			$year, $mon +1, $mday, $hour, $min, $sec);
		$logfile = $timet . ".log";
		chdir $startPath;

		unlink "$logdir/current.log";
		symlink "$logdir/$logfile", "$logdir/current.log";

		system ("$exec -p $port -i $infoport > $logdir/$logfile 2>&1 &");

		return;
}