Support in-game server-control commands
This commit is contained in:
parent
5133034b4b
commit
3bec3a3512
5 changed files with 20 additions and 18 deletions
|
|
@ -119,7 +119,6 @@ class CmdShutdown(COMMAND_DEFAULT_CLASS):
|
||||||
announcement += "%s\n" % self.args
|
announcement += "%s\n" % self.args
|
||||||
logger.log_info('Server shutdown by %s.' % self.caller.name)
|
logger.log_info('Server shutdown by %s.' % self.caller.name)
|
||||||
SESSIONS.announce_all(announcement)
|
SESSIONS.announce_all(announcement)
|
||||||
SESSIONS.server.shutdown(mode='shutdown')
|
|
||||||
SESSIONS.portal_shutdown()
|
SESSIONS.portal_shutdown()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ class AMPClientFactory(protocol.ReconnectingClientFactory):
|
||||||
reason (str): Eventual text describing why connection was lost.
|
reason (str): Eventual text describing why connection was lost.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
logger.log_info("Server lost connection to the Portal. Reconnecting ...")
|
logger.log_info("Server disconnected from the portal.")
|
||||||
protocol.ReconnectingClientFactory.clientConnectionLost(self, connector, reason)
|
protocol.ReconnectingClientFactory.clientConnectionLost(self, connector, reason)
|
||||||
|
|
||||||
def clientConnectionFailed(self, connector, reason):
|
def clientConnectionFailed(self, connector, reason):
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,19 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
|
||||||
Protocol subclass for the AMP-server run by the Portal.
|
Protocol subclass for the AMP-server run by the Portal.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def connectionLost(self, reason):
|
||||||
|
"""
|
||||||
|
Set up a simple callback mechanism to let the amp-server wait for a connection to close.
|
||||||
|
|
||||||
|
"""
|
||||||
|
callback, args, kwargs = self.factory.disconnect_callbacks.pop(self, (None, None, None))
|
||||||
|
if callback:
|
||||||
|
try:
|
||||||
|
callback(*args, **kwargs)
|
||||||
|
except Exception:
|
||||||
|
logger.log_trace()
|
||||||
|
|
||||||
def start_server(self, server_twistd_cmd):
|
def start_server(self, server_twistd_cmd):
|
||||||
"""
|
"""
|
||||||
(Re-)Launch the Evennia server.
|
(Re-)Launch the Evennia server.
|
||||||
|
|
@ -98,18 +111,6 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
|
||||||
self.factory.portal.server_twistd_cmd = server_twistd_cmd
|
self.factory.portal.server_twistd_cmd = server_twistd_cmd
|
||||||
return process.pid
|
return process.pid
|
||||||
|
|
||||||
def connectionLost(self, reason):
|
|
||||||
"""
|
|
||||||
Set up a simple callback mechanism to let the amp-server wait for a connection to close.
|
|
||||||
|
|
||||||
"""
|
|
||||||
callback, args, kwargs = self.factory.disconnect_callbacks.pop(self, (None, None, None))
|
|
||||||
if callback:
|
|
||||||
try:
|
|
||||||
callback(*args, **kwargs)
|
|
||||||
except Exception:
|
|
||||||
logger.log_trace()
|
|
||||||
|
|
||||||
def wait_for_disconnect(self, callback, *args, **kwargs):
|
def wait_for_disconnect(self, callback, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Add a callback for when this connection is lost.
|
Add a callback for when this connection is lost.
|
||||||
|
|
@ -319,20 +320,21 @@ class AMPServerProtocol(amp.AMPMultiConnectionProtocol):
|
||||||
|
|
||||||
elif operation == amp.SRELOAD: # server reload
|
elif operation == amp.SRELOAD: # server reload
|
||||||
self.factory.server_connection.wait_for_disconnect(
|
self.factory.server_connection.wait_for_disconnect(
|
||||||
self.start_server, self.factory.portal.server_twisted_cmd)
|
self.start_server, self.factory.portal.server_twistd_cmd)
|
||||||
self.stop_server(mode='reload')
|
self.stop_server(mode='reload')
|
||||||
|
|
||||||
elif operation == amp.SRESET: # server reset
|
elif operation == amp.SRESET: # server reset
|
||||||
self.factory.server_connection.wait_for_disconnect(
|
self.factory.server_connection.wait_for_disconnect(
|
||||||
self.start_server, self.factory.portal.server_twisted_cmd)
|
self.start_server, self.factory.portal.server_twistd_cmd)
|
||||||
self.stop_server(mode='reset')
|
self.stop_server(mode='reset')
|
||||||
|
|
||||||
elif operation == amp.SSHUTD: # server-only shutdown
|
elif operation == amp.SSHUTD: # server-only shutdown
|
||||||
self.stop_server(mode='shutdown')
|
self.stop_server(mode='shutdown')
|
||||||
|
|
||||||
elif operation == amp.PSHUTD: # full server+server shutdown
|
elif operation == amp.PSHUTD: # full server+server shutdown
|
||||||
|
self.factory.server_connection.wait_for_disconnect(
|
||||||
|
self.factory.portal.shutdown, restart=False)
|
||||||
self.stop_server(mode='shutdown')
|
self.stop_server(mode='shutdown')
|
||||||
self.factory.portal.shutdown()
|
|
||||||
|
|
||||||
elif operation == amp.PSYNC: # portal sync
|
elif operation == amp.PSYNC: # portal sync
|
||||||
# Server has (re-)connected and wants the session data from portal
|
# Server has (re-)connected and wants the session data from portal
|
||||||
|
|
|
||||||
|
|
@ -148,6 +148,7 @@ class Portal(object):
|
||||||
case it always needs to be restarted manually.
|
case it always needs to be restarted manually.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
print("portal.shutdown: restart=", restart)
|
||||||
if _reactor_stopping and hasattr(self, "shutdown_complete"):
|
if _reactor_stopping and hasattr(self, "shutdown_complete"):
|
||||||
# we get here due to us calling reactor.stop below. No need
|
# we get here due to us calling reactor.stop below. No need
|
||||||
# to do the shutdown procedure again.
|
# to do the shutdown procedure again.
|
||||||
|
|
|
||||||
|
|
@ -459,7 +459,7 @@ class ServerSessionHandler(SessionHandler):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION,
|
self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION,
|
||||||
operation=SSHUTD)
|
operation=PSHUTD)
|
||||||
|
|
||||||
def login(self, session, account, force=False, testmode=False):
|
def login(self, session, account, force=False, testmode=False):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue