Introduced get_route, inital sync implementation and shutdown time dumping

This commit is contained in:
Philip Trauner 2016-03-05 17:39:29 +01:00
parent 512f70aa36
commit 86e1174b2e

View file

@ -2,19 +2,20 @@ import Logging
import Routing import Routing
import Config import Config
from Sync import SyncServer
from .AsyncServer import Server from .AsyncServer import Server
from .Broadcast import Broadcast from .Broadcast import Broadcast
from time import strftime from time import strftime
from time import time from time import time
import json
class Info(Routing.ServerRoute): class Info(Routing.ServerRoute):
def setup(self):
self.start_time = strftime("%H:%M:%S")
def run(self, data, handler): def run(self, data, handler):
handler.sock.send("Start time: %s\nConnected ST clients: %d\nConnected Wallabies: %d\nAvaliable routes: %s" % ( handler.sock.send("Start time: %s\nConnected ST clients: %d\nConnected Wallabies: %d\nAvaliable routes: %s" % (
self.start_time, len(handler.broadcast.channels[Handler.Channels.SUBLIME]), handler.start_time, len(handler.broadcast.channels[Handler.Channels.SUBLIME]),
len(handler.broadcast.channels[Handler.Channels.WALLABY]), ", ".join([route for route in list(handler.routes.keys())])), "info") len(handler.broadcast.channels[Handler.Channels.WALLABY]), ", ".join([route for route in list(handler.routes.keys())])), "info")
@ -62,10 +63,12 @@ class Handler(Server.Handler):
SUBLIME = 1 SUBLIME = 1
WALLABY = 2 WALLABY = 2
def setup(self, routes, broadcast): def setup(self, routes, broadcast, last_stop_time):
Logging.info("Handler for '%s:%d' initalised." % (self.sock.address, self.sock.port)) Logging.info("Handler for '%s:%d' initalised." % (self.sock.address, self.sock.port))
self.routes = Routing.create_routes(routes) self.routes = Routing.create_routes(routes)
self.cached_routes = {}
self.broadcast = broadcast self.broadcast = broadcast
self.last_stop_time = last_stop_time
self.channel = None self.channel = None
self.start_time = time() self.start_time = time()
@ -77,13 +80,26 @@ class Handler(Server.Handler):
self.sock.send("Invalid route '%s'" % route, "error_report") self.sock.send("Invalid route '%s'" % route, "error_report")
def get_route(self, route_instance):
if route_instance not in self.cached_routes:
for route in self.routes:
if self.routes[route] is route_instance:
self.cached_routes[route_instance] = route
return route
return None
else:
return self.cached_routes[route_instance]
def finish(self): def finish(self):
if self.channel != None: if self.channel != None:
self.broadcast.remove(self.sock, self.channel) self.broadcast.remove(self.sock, self.channel)
Logging.info("'%s:%d' disconnected." % (self.sock.address, self.sock.port)) Logging.info("'%s:%d' disconnected." % (self.sock.address, self.sock.port))
CONFIG_PATH = "server.cfg" CONFIG_PATH = "server.cfg"
INFO_PATH = "server.info"
config = Config.Config() config = Config.Config()
config.add(Config.Option("server_address", ("127.0.0.1", 3077))) config.add(Config.Option("server_address", ("127.0.0.1", 3077)))
@ -104,10 +120,20 @@ for channel in Handler.Channels.__dict__:
broadcast.add_channel(Handler.Channels.__dict__[channel]) broadcast.add_channel(Handler.Channels.__dict__[channel])
try: try:
Logging.header("fl0w server started.") Logging.header("fl0w server started on '%s:%d'" % (config.server_address[0], config.server_address[1]))
last_stop_time = 0
try:
last_stop_time = json.loads(open(INFO_PATH, "r").read())["last_stop_time"]
except IOError:
Logging.warning("Unable to obtain last shutdown time. (You can ignore this message if it's your first time starting fl0w)")
except (ValueError, KeyError):
Logging.error("%s has been modified an contains invalid information." % CONFIG_PATH)
Logging.info("Last shutdown time: %d" % last_stop_time)
server.run(Handler, server.run(Handler,
{"broadcast" : broadcast, {"broadcast" : broadcast, "last_stop_time" : last_stop_time,
"routes" : {"info" : Info(), "wallaby_control" : WallabyControl(), "set_type" : SetType()}}) "routes" : {"info" : Info(), "wallaby_control" : WallabyControl(), "set_type" : SetType(),
"w_sync" : SyncServer("Wallaby")}})
except KeyboardInterrupt: except KeyboardInterrupt:
server.stop() server.stop()
open(INFO_PATH, "w").write(json.dumps({"last_stop_time" : time()}))
Logging.warning("Gracefully shutting down server.") Logging.warning("Gracefully shutting down server.")