mirror of
https://github.com/evennia/evennia.git
synced 2026-04-03 22:47:16 +02:00
cleaned up and rewritten to make it easier to add new protocols in the future - all new protocols need to inherit from server.session.Session, whi ch implements a set of hooks that Evennia uses to communicate. The current web client protocol is functional but does not implement any of rcaskey 's suggestions as of yet - it uses a separate data object passed through msg() to communicate between the server and the various protocols. Also the client itself could probably need cleanup and 'prettification'. The fact that the system runs a hybrid of Django and Twisted, getting the best of both worlds should allow for many possibilities in the future. /Griatch
203 lines
7.2 KiB
Python
Executable file
203 lines
7.2 KiB
Python
Executable file
#!/usr/bin/env python
|
|
"""
|
|
EVENNIA SERVER STARTUP SCRIPT
|
|
|
|
Sets the appropriate environmental variables and launches the server
|
|
process. Run the script with the -h flag to see usage information.
|
|
"""
|
|
import os
|
|
import sys
|
|
import signal
|
|
from optparse import OptionParser
|
|
from subprocess import Popen, call
|
|
|
|
# Set the Python path up so we can get to settings.py from here.
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'game.settings'
|
|
|
|
if not os.path.exists('settings.py'):
|
|
# make sure we have a settings.py file.
|
|
print " No settings.py file found. Launching manage.py ..."
|
|
|
|
import game.manage
|
|
|
|
print """
|
|
Now configure Evennia by editing your new settings.py file.
|
|
If you haven't already, you should also create/configure the
|
|
database with 'python manage.py syncdb' before continuing.
|
|
|
|
When you are ready, run this program again to start the server."""
|
|
sys.exit()
|
|
|
|
# Get the settings
|
|
from django.conf import settings
|
|
|
|
# Setup the launch of twisted depending on which operating system we use
|
|
if os.name == 'nt':
|
|
|
|
try:
|
|
# Test for for win32api
|
|
import win32api
|
|
except ImportError:
|
|
print """
|
|
ERROR: Unable to import win32api, which Twisted requires to run.
|
|
You may download it from:
|
|
|
|
http://sourceforge.net/projects/pywin32
|
|
or
|
|
http://starship.python.net/crew/mhammond/win32/Downloads.html"""
|
|
sys.exit()
|
|
|
|
if not os.path.exists('twistd.bat'):
|
|
# Test for executable twisted batch file. This calls the twistd.py
|
|
# executable that is usually not found on the path in Windows.
|
|
# It's not enough to locate scripts.twistd, what we want is the
|
|
# executable script C:\PythonXX/Scripts/twistd.py. Alas we cannot
|
|
# hardcode this location since we don't know if user has Python
|
|
# in a non-standard location, so we try to figure it out.
|
|
from twisted.scripts import twistd
|
|
twistd_path = os.path.abspath(
|
|
os.path.join(os.path.dirname(twistd.__file__),
|
|
os.pardir, os.pardir, os.pardir, os.pardir,
|
|
'scripts', 'twistd.py'))
|
|
bat_file = open('twistd.bat','w')
|
|
bat_file.write("@\"%s\" \"%s\" %%*" % (sys.executable, twistd_path))
|
|
bat_file.close()
|
|
print """
|
|
INFO: Since you are running Windows, a file 'twistd.bat' was
|
|
created for you. This is a simple batch file that tries to call
|
|
the twisted executable. Evennia determined this to be:
|
|
|
|
%s
|
|
|
|
If you run into errors at startup you might need to edit
|
|
twistd.bat to point to the actual location of the Twisted
|
|
executable (usually called twistd.py) on your machine.
|
|
|
|
This procedure is only done once. Run evennia.py again when you
|
|
are ready to start the server.
|
|
""" % twistd_path
|
|
sys.exit()
|
|
|
|
TWISTED_BINARY = 'twistd.bat'
|
|
else:
|
|
TWISTED_BINARY = 'twistd'
|
|
|
|
# Setup access of the evennia server itself
|
|
SERVER_PY_FILE = os.path.join(settings.SRC_DIR, 'server/server.py')
|
|
|
|
# Add this to the environmental variable for the 'twistd' command.
|
|
thispath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
if 'PYTHONPATH' in os.environ:
|
|
os.environ['PYTHONPATH'] += (":%s" % thispath)
|
|
else:
|
|
os.environ['PYTHONPATH'] = thispath
|
|
|
|
def cycle_logfile():
|
|
"""
|
|
Move the old log file to evennia.log.old (by default).
|
|
|
|
"""
|
|
logfile = settings.DEFAULT_LOG_FILE.strip()
|
|
logfile_old = logfile + '.old'
|
|
if os.path.exists(logfile):
|
|
# Cycle the old logfiles to *.old
|
|
if os.path.exists(logfile_old):
|
|
# E.g. Windows don't support rename-replace
|
|
os.remove(logfile_old)
|
|
os.rename(logfile, logfile_old)
|
|
|
|
logfile = settings.HTTP_LOG_FILE.strip()
|
|
logfile_old = logfile + '.old'
|
|
if os.path.exists(logfile):
|
|
# Cycle the old logfiles to *.old
|
|
if os.path.exists(logfile_old):
|
|
# E.g. Windows don't support rename-replace
|
|
os.remove(logfile_old)
|
|
os.rename(logfile, logfile_old)
|
|
|
|
def start_daemon(parser, options, args):
|
|
"""
|
|
Start the server in daemon mode. This means that all logging output will
|
|
be directed to logs/evennia.log by default, and the process will be
|
|
backgrounded.
|
|
"""
|
|
if os.path.exists('twistd.pid'):
|
|
print "A twistd.pid file exists in the current directory, which suggests that the server is already running."
|
|
sys.exit()
|
|
|
|
print '\nStarting Evennia server in daemon mode ...'
|
|
print 'Logging to: %s.' % settings.DEFAULT_LOG_FILE
|
|
|
|
# Move the old evennia.log file out of the way.
|
|
cycle_logfile()
|
|
|
|
# Start it up
|
|
Popen([TWISTED_BINARY,
|
|
'--logfile=%s' % settings.DEFAULT_LOG_FILE,
|
|
'--python=%s' % SERVER_PY_FILE])
|
|
|
|
def start_interactive(parser, options, args):
|
|
"""
|
|
Start in interactive mode, which means the process is foregrounded and
|
|
all logging output is directed to stdout.
|
|
"""
|
|
print '\nStarting Evennia server in interactive mode (stop with keyboard interrupt) ...'
|
|
print 'Logging to: Standard output.'
|
|
|
|
# we cycle logfiles (this will at most put all files to *.old)
|
|
# to handle html request logging files.
|
|
cycle_logfile()
|
|
try:
|
|
call([TWISTED_BINARY,
|
|
'-n',
|
|
'--python=%s' % SERVER_PY_FILE])
|
|
except KeyboardInterrupt:
|
|
pass
|
|
|
|
def stop_server(parser, options, args):
|
|
"""
|
|
Gracefully stop the server process.
|
|
"""
|
|
if os.name == 'posix':
|
|
if os.path.exists('twistd.pid'):
|
|
print 'Stopping the Evennia server...'
|
|
f = open('twistd.pid', 'r')
|
|
pid = f.read()
|
|
os.kill(int(pid), signal.SIGINT)
|
|
print 'Server stopped.'
|
|
else:
|
|
print "No twistd.pid file exists, the server doesn't appear to be running."
|
|
elif os.name == 'nt':
|
|
print '\n\rStopping cannot be done safely under this operating system.'
|
|
print 'Kill server using the task manager or shut it down from inside the game.'
|
|
else:
|
|
print '\n\rUnknown OS detected, can not stop. '
|
|
|
|
def main():
|
|
"""
|
|
Beginning of the program logic.
|
|
"""
|
|
parser = OptionParser(usage="%prog [options] <start|stop>",
|
|
description="This command starts or stops the Evennia game server. Note that you have to setup the database by running 'manage.py syncdb' before starting the server for the first time.")
|
|
parser.add_option('-i', '--interactive', action='store_true',
|
|
dest='interactive', default=False,
|
|
help='Start in interactive mode')
|
|
parser.add_option('-d', '--daemon', action='store_false',
|
|
dest='interactive',
|
|
help='Start in daemon mode (default)')
|
|
(options, args) = parser.parse_args()
|
|
|
|
if "start" in args:
|
|
if options.interactive:
|
|
start_interactive(parser, options, args)
|
|
else:
|
|
start_daemon(parser, options, args)
|
|
elif "stop" in args:
|
|
stop_server(parser, options, args)
|
|
else:
|
|
parser.print_help()
|
|
if __name__ == '__main__':
|
|
from src.utils.utils import check_evennia_dependencies
|
|
if check_evennia_dependencies():
|
|
main()
|