dawn/notes/
dawn/src/
dawn/src/docs/
#!/usr/bin/perl
#########################################################################
# bootdawn.pl                       Version 1.1                         #
# Created: Jun 28, 1997             Kalahn @ dawnoftime                 #
# Last Modified: 18 March 2001      http://www.dawnoftime.org/          #
#########################################################################
# 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 bootdawn.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/dawn/bin/bootdawn.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            #
#########################################################################
#########################################################################
# Define the important vars                                             #
#                                                                       #
# Define the host and port number where the mud resides.                #

$server     =   "127.0.0.1";
$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.                                                            #

$exec       =   "ulimit -c unlimited ; /home/dawn/dot/dawn";

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

$logdir     =   "/home/dawn/dot/logs/game";

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

# 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();
        chdir $startPath;
        system ("$exec $port > $logdir/$timet.log 2>&1 &");
        return;
}
#########################################################################