#!/usr/bin/perl ######################################################################### # boot.pl Version 1.2 # ######################################################################### # 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. # # You probably should stop using startup as a script and delete it. # Here's how to do it... # # 1) Make sure to edit the boot.pl file and insert your values at # the top. # # 2) Edit your crontab file, type crontab -e, it's a vi editor. # # 3) Put the following line as your crontab script: # # */6 * * * * /home/user/1stMud/bin/boot.pl # # 4) Make sure to change the directory in the above line as needed. # ######################################################################### # CHANGES AND HISTORY # # # # v 1.0, Jun 28, 1997 Written by Jared Proudfoot # # <jproudfo@footprints.net> # # v 1.1, Mar 18, 2001 Customised for Dawn of time - Kalahn # # v 1.2, Jun 14, 2004 Updated for 1stMud - Markanth # ######################################################################### ######################################################################### # Define the important vars # # # # Define the host and port number where the mud resides. # $server = "localhost"; $port = "4000"; # $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 = ".+"; # 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. # $home = "/home/user/1stMud"; $exec = "$home/bin/1stMud"; # Path where you want the mud logs to be kept. $logdir = "$home/log"; # Path where we should start the mud from. # $startPath = "$home/area"; # Shutdown file, use to disable starting up. $shutdown = "$home/data/shutdown.txt"; # 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 ( -e $shutdown ) { exit 1; } else { 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(); chdir $startPath; system ("$exec --startup-script $port > $logdir/$timet.log 2>&1 &"); return; } #########################################################################