167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| #
 | |
| # CircleMUD autorun script
 | |
| # Contributions by Fred Merkel, Stuart Lamble, and Jeremy Elson
 | |
| # New log rotating code contributed by Peter Ajamian
 | |
| # Copyright (c) 1996 The Trustees of The Johns Hopkins University
 | |
| # All Rights Reserved
 | |
| # See license.doc for more information
 | |
| #
 | |
| #############################################################################
 | |
| #
 | |
| # This script can be used to run CircleMUD over and over again (i.e., have it
 | |
| # automatically reboot if it crashes).  It will run the game, and copy some
 | |
| # of the more useful information from the system logs to the 'log' directory
 | |
| # for safe keeping.
 | |
| #
 | |
| # You can control the operation of this script by creating and deleting files
 | |
| # in Circle's root directory, either manually or by using the 'shutdown'
 | |
| # command from within the MUD.
 | |
| #
 | |
| # Creating a file called .fastboot makes the script wait only 5 seconds
 | |
| # between reboot attempts instead of the usual 60.  If you want a quick
 | |
| # reboot, use the "shutdown reboot" command from within the MUD.
 | |
| #
 | |
| # Creating a file called .killscript makes the script terminate (i.e., stop
 | |
| # rebooting the MUD).  If you want to shut down the MUD and make it stay
 | |
| # shut down, use the "shutdown die" command from within the MUD.
 | |
| #
 | |
| # Finally, if a file called pause exists, the script will not reboot the MUD
 | |
| # again until pause is removed.  This is useful if you want to turn the MUD
 | |
| # off for a couple of minutes and then bring it back up without killing the
 | |
| # script.  Type "shutdown pause" from within the MUD to activate this feature.
 | |
| #
 | |
| 
 | |
| # The port on which to run the MUD
 | |
| PORT=4000
 | |
| 
 | |
| # Default flags to pass to the MUD server (see admin.txt for a description
 | |
| # of all flags).
 | |
| FLAGS='-q'
 | |
| 
 | |
| # Number of syslog.# files to keep in the log directory.
 | |
| BACKLOGS=6
 | |
| 
 | |
| # Each record in the following variable contains information for one log file.
 | |
| # The fields are filename:maxlines:pattern where filename is the name of the
 | |
| # log file, maxlines is the maximum number of lines in the file (0 for
 | |
| # unlimited) and pattern is a pattern which must be matched for a line to get
 | |
| # copied from syslog to this log file.
 | |
| LOGFILES='
 | |
| delete:0:self-delete
 | |
| dts:0:death trap
 | |
| rip:0:killed
 | |
| restarts:0:Running
 | |
| levels:0:advanced
 | |
| rentgone:0:equipment lost
 | |
| usage:0:usage
 | |
| newplayers:0:new player
 | |
| errors:0:SYSERR
 | |
| godcmds:0:(GC)
 | |
| badpws:0:Bad PW
 | |
| '
 | |
| 
 | |
| # The following is the number of lines in syslog.CRASH.  Set to 0 to disable
 | |
| # crashlogs.
 | |
| LEN_CRASHLOG=30
 | |
| 
 | |
| #############################################################################
 | |
| 
 | |
| #############
 | |
| # Functions #
 | |
| #############
 | |
| 
 | |
| # The proc_syslog function will grep the logs for the various different info
 | |
| # and rotate the logs in the log directory.
 | |
| proc_syslog () {
 | |
|   # Return if there's no syslog
 | |
|   if ! [ -s syslog ]; then return; fi
 | |
| 
 | |
|   # Create the crashlog
 | |
|   if [ -n "$LEN_CRASHLOG" -a "$LEN_CRASHLOG" -gt 0 ]; then
 | |
|     tail -n $LEN_CRASHLOG syslog > syslog.CRASH
 | |
|   fi
 | |
| 
 | |
|   # Append to the specialty logfiles and truncate to maximum length if
 | |
|   # applicable
 | |
|   OLD_IFS=$IFS
 | |
|   IFS='
 | |
| '
 | |
|   for rec in $LOGFILES; do
 | |
|     name=log/`echo $rec|cut -f 1 -d:`
 | |
|     len=`echo $rec|cut -f 2 -d:`
 | |
|     pattern=`echo $rec|cut -f 3- -d:`
 | |
| 
 | |
|     fgrep $pattern syslog >> $name
 | |
|     if [ $len -gt 0 ]; then
 | |
|       temp=`mktemp $name.XXXXXX`
 | |
|       tail -n $len $name > $temp
 | |
|       mv -f $temp $name
 | |
|     fi
 | |
|   done
 | |
|   IFS=$OLD_IFS
 | |
| 
 | |
|   # Find the # to set the new log file to.
 | |
|   if [ -s log/syslog.$BACKLOGS ]; then
 | |
|     declare -i newlog=$BACKLOGS+1
 | |
|   else
 | |
|     declare -i newlog=1
 | |
|     while [ -s log/syslog.$newlog ]; do newlog=$newlog+1; done
 | |
|   fi
 | |
| 
 | |
|   # Rotate the logs.
 | |
|   declare -i y=2
 | |
|   while [ $y -lt $newlog ]; do
 | |
|     declare -i x=$y-1
 | |
|     mv -f log/syslog.$y log/syslog.$x
 | |
|     y=$y+1
 | |
|   done
 | |
|   mv -f syslog log/syslog.$newlog
 | |
| }
 | |
| 
 | |
| 
 | |
| ########
 | |
| # Main #
 | |
| ########
 | |
| 
 | |
| # Check to see if there is a syslog which would indicate that autorun
 | |
| # was improperly killed (ie maybe the system was rebooted or ?).
 | |
| if [ -s syslog ]; then
 | |
|   echo Improper shutdown of autorun detected, rotating syslogs before startup. >> syslog
 | |
|   proc_syslog
 | |
| fi
 | |
| 
 | |
| # The main loop
 | |
| while ( : ) do
 | |
| 
 | |
|   DATE=`date`
 | |
|   echo "autorun starting game $DATE" > syslog
 | |
|   echo "running bin/circle $FLAGS $PORT" >> syslog
 | |
| 
 | |
|   # On Cygwin, you may need to precede this next line with './' for
 | |
|   # './bin/circle' as the command.
 | |
|   bin/circle $FLAGS $PORT >> syslog 2>&1
 | |
| 
 | |
|   if [ -r .killscript ]; then
 | |
|     DATE=`date`;
 | |
|     echo "autoscript killed $DATE"  >> syslog
 | |
|     rm .killscript
 | |
|     proc_syslog
 | |
|     exit
 | |
|   fi
 | |
| 
 | |
|   if [ ! -r .fastboot ]; then
 | |
|     sleep 60
 | |
|   else
 | |
|     rm .fastboot
 | |
|   fi
 | |
| 
 | |
|   while [ -r pause ]; do
 | |
|     sleep 60
 | |
|   done
 | |
| 
 | |
|   proc_syslog
 | |
|   sleep 5
 | |
| 
 | |
| done
 |