wmud/macrun.pl
2012-03-03 21:35:30 +01:00

137 lines
4.6 KiB
Perl

#!perl
##############################################################################
# Portions of this script are Copyright 1998 by dean takemori.
#
# This is a MacPerl script which attempts to impliment autorun functionality
# for MacOS. It's a bit of a bastardisation of MacPerl and "standard" unix
# style perl. I won't claim that it's pretty. Parts of it come from the
# Autorun perl script for unix that is distributed with CircleMUD and it is
# therefore subject to the following.
# Copyright (c)1995 Vi'Rage Studios
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
# csh original by Fred C. Merkel, PERL conversion by D. Hall
# .fastboot sleep for only 5 seconds, instead of the default 20
# .killscript script will exit, and mud will not reboot
# .pause pause (sleep 1 minute intervals) until .pause it removed
##############################################################################
use 5.004;
use Mac::MoreFiles;
use Mac::Processes;
# launchContinue() must be set or MacPerl will quit after LaunchApplication().
# The creator code "dtCM" is registered with Apple Computer for CircleMUD.
# However, if you have multiple copies of Circle on disk (a production MUD
# and a testing MUD for example), you may wish to specify by FULL PATH,
# which application to run.
$spec = $Application{'dtCM'};
#$spec = "volume:apps:myapp";
my($app);
$app = new LaunchParam(
'launchControlFlags' => launchContinue(),
'launchAppSpec' => $spec
) or die ($^E);
my($psn, $spec_found);
while (1)
{
LaunchApplication($app) or die($^E);
do
{
# Now, every 60 seconds, scan the running processes for one whose
# AppSpec matches the one we set up earlier.
sleep(60);
$spec_found = 0;
foreach $psn (keys(%Process))
{
if ( $spec eq $Process{$psn}->processAppSpec() )
{
$spec_found = 1;
break; # out of the foreach
}
}
} while ($spec_found == 1);
# If we're here, then the App is no longer running.
# First we open everything
open (SYSLOG, ":syslog") or die($^E);
open (DELETE, ">>:log:delete");
open (DTRAPS, ">>:log:dtraps");
open (DEATHS, ">>:log:deaths");
open (REBOOT, ">>:log:reboots");
open (LEVELS, ">>:log:levels");
open (NORENT, ">>:log:norent");
open (USAGE, ">>:log:usage");
open (NEWPLR, ">>:log:newplrs");
open (SYSERR, ">>:log:errors");
open (GODCMD, ">>:log:godcmds");
open (BADPWS, ">>:log:badpws");
# Then we stash everything
while (<SYSLOG>)
{
print DELETE if /self-delete/;
print DTRAPS if /death trap/;
print DEATHS if /killed/;
print REBOOT if /Running/;
print LEVELS if /advanced/;
print NORENT if /equipment lost/;
print USAGE if /usage/;
print NEWPLR if /new player/;
print SYSERR if /SYSERR/;
print GODCMD if /\(GC\)/;
print BADPWs if /Bad PW/;
}
close (SYSLOG);
# Rotate SYSLOG files
if (-e ":log:syslog.6") { unlink (":log:syslog.6"); }
if (-e ":log:syslog.6") { rename (":log:syslog.5", ":log:syslog.6"); }
if (-e ":log:syslog.6") { rename (":log:syslog.4", ":log:syslog.5"); }
if (-e ":log:syslog.6") { rename (":log:syslog.3", ":log:syslog.4"); }
if (-e ":log:syslog.6") { rename (":log:syslog.2", ":log:syslog.3"); }
if (-e ":log:syslog.6") { rename (":log:syslog.1", ":log:syslog.2"); }
rename (":syslog" , ":log:syslog.1");
# should we stay dead?
if (-r ".killscript")
{
unlink(".killscript");
open (SYSLOG, ">>:log:syslog.1");
print (SYSLOG "autoscript killed ", localtime()); #seconds since epoch
exit;
}
# or just play dead?
while (-r ".pause")
{ sleep(60); }
# or reboot as soon as possible?
if (-r ".fastboot")
{
unlink(".fastboot");
sleep(5);
}
else
{ sleep(20); }
}