def run_init_hooks(self): """ Called every server start """ from src.objects.models import ObjectDB #from src.players.models import PlayerDB #update eventual changed defaults self.update_defaults() #print "run_init_hooks:", ObjectDB.get_all_cached_instances() [(o.typeclass, o.at_init()) for o in ObjectDB.get_all_cached_instances()] [(p.typeclass, p.at_init()) for p in PlayerDB.get_all_cached_instances()] with open(SERVER_RESTART, 'r') as f: mode = f.read() if mode in ('True', 'reload'): from src.server.oobhandler import OOB_HANDLER OOB_HANDLER.restore() from src.scripts.tickerhandler import TICKER_HANDLER TICKER_HANDLER.restore() if SERVER_STARTSTOP_MODULE: # call correct server hook based on start file value if mode in ('True', 'reload'): # True was the old reload flag, kept for compatibilty SERVER_STARTSTOP_MODULE.at_server_reload_start() elif mode in ('reset', 'shutdown'): SERVER_STARTSTOP_MODULE.at_server_cold_start() # clear eventual lingering session storages ObjectDB.objects.clear_all_sessids() # always call this regardless of start type SERVER_STARTSTOP_MODULE.at_server_start()
def shutdown(self, mode=None, _reactor_stopping=False): """ Shuts down the server from inside it. mode - sets the server restart mode. 'reload' - server restarts, no "persistent" scripts are stopped, at_reload hooks called. 'reset' - server restarts, non-persistent scripts stopped, at_shutdown hooks called. 'shutdown' - like reset, but server will not auto-restart. None - keep currently set flag from flag file. _reactor_stopping - this is set if server is stopped by a kill command OR this method was already called once - in both cases the reactor is dead/stopping already. """ if _reactor_stopping and hasattr(self, "shutdown_complete"): # this means we have already passed through this method # once; we don't need to run the shutdown procedure again. defer.returnValue(None) mode = self.set_restart_mode(mode) # call shutdown hooks on all cached objects from src.objects.models import ObjectDB #from src.players.models import PlayerDB from src.server.models import ServerConfig if mode == 'reload': # call restart hooks yield [(o.typeclass, o.at_server_reload()) for o in ObjectDB.get_all_cached_instances()] yield [(p.typeclass, p.at_server_reload()) for p in PlayerDB.get_all_cached_instances()] yield [(s.typeclass, s.pause(), s.at_server_reload()) for s in ScriptDB.get_all_cached_instances()] yield self.sessions.all_sessions_portal_sync() ServerConfig.objects.conf("server_restart_mode", "reload") from src.server.oobhandler import OOB_HANDLER OOB_HANDLER.save() from src.scripts.tickerhandler import TICKER_HANDLER TICKER_HANDLER.save() if SERVER_STARTSTOP_MODULE: SERVER_STARTSTOP_MODULE.at_server_reload_stop() else: if mode == 'reset': # don't unset the is_connected flag on reset, otherwise # same as shutdown yield [(o.typeclass, o.at_server_shutdown()) for o in ObjectDB.get_all_cached_instances()] yield [(p.typeclass, p.at_server_shutdown()) for p in PlayerDB.get_all_cached_instances()] else: # shutdown yield [_SA(p, "is_connected", False) for p in PlayerDB.get_all_cached_instances()] yield [(o.typeclass, o.at_server_shutdown()) for o in ObjectDB.get_all_cached_instances()] yield [(p.typeclass, p.unpuppet_all(), p.at_server_shutdown()) for p in PlayerDB.get_all_cached_instances()] yield [(s.typeclass, s.at_server_shutdown()) for s in ScriptDB.get_all_cached_instances()] yield ObjectDB.objects.clear_all_sessids() ServerConfig.objects.conf("server_restart_mode", "reset") if SERVER_STARTSTOP_MODULE: SERVER_STARTSTOP_MODULE.at_server_cold_stop() # stopping time from src.utils import gametime gametime.save() if SERVER_STARTSTOP_MODULE: SERVER_STARTSTOP_MODULE.at_server_stop() # if _reactor_stopping is true, reactor does not need to # be stopped again. if os.name == 'nt' and os.path.exists(SERVER_PIDFILE): # for Windows we need to remove pid files manually os.remove(SERVER_PIDFILE) if not _reactor_stopping: # this will also send a reactor.stop signal, so we set a # flag to avoid loops. self.shutdown_complete = True reactor.callLater(0, reactor.stop)