Esempio n. 1
0
def start_server():
    """ Main entry point for the application """
    locale.set_default_locale("en_US")
    locale.load_translations("locale")
    if options.autostart_game:
        app.settings["game_started"] = True
        app.settings["history_callback"].start()
        if options.use_bots:
            app.settings["score_bots_callback"].start()
    # Setup server object
    if options.ssl:
        server = HTTPServer(
            app,
            ssl_options={"certfile": options.certfile, "keyfile": options.keyfile},
            xheaders=options.x_headers,
        )
    else:
        server = HTTPServer(app, xheaders=options.x_headers)
    try:
        sockets = netutil.bind_sockets(options.listen_port, options.listen_interface)
    except (OSError, IOError) as err:
        logging.error("Problem binding socket to port %s", str(options.listen_port))
        if err.errno == 13:
            pypath = sys.executable
            if os_path.islink(pypath):
                pypath = os_path.realpath(pypath)
            logging.error(
                "Possible Fix: sudo setcap CAP_NET_BIND_SERVICE=+eip %s", pypath
            )
        elif err.errno == 98:
            logging.error(
                "The port may be in use by an existing service.  RTB already running?"
            )
        else:
            logging.error(err)
        sys.exit()
    server.add_sockets(sockets)
    if options.debug:
        logging.warn(
            "%sDebug mode is enabled; DO NOT USE THIS IN PRODUCTION%s" % (bold + R, W)
        )
    if options.autostart_game:
        logging.info("The game is about to begin, good hunting!")
    try:
        Scoreboard.update_gamestate(app)
    except OperationalError as err:
        if "Table definition has changed" in str(err):
            logging.info("Table definitions have changed -restarting RootTheBox.")
            return "restart"
        else:
            logging.error("There was a problem starting RootTheBox. Error: " + str(err))
    try:
        io_loop.start()
    except KeyboardInterrupt:
        sys.stdout.write("\r" + WARN + "Shutdown Everything!\n")
    except:
        logging.exception("Main i/o loop threw exception")
    finally:
        io_loop.stop()
        _exit(0)
Esempio n. 2
0
    def create_team(self):
        """ Admins can create teams manually """
        try:
            name = self.get_argument("team_name", "")
            if Team.by_name(name) is not None:
                raise ValidationError("Team already exists")
            team = Team()
            team.name = self.get_argument("team_name", "")
            team.motto = self.get_argument("motto", "")
            if not self.config.banking:
                team.money = 0
            level_0 = GameLevel.by_number(0)
            if not level_0:
                level_0 = GameLevel.all()[0]
            team.game_levels.append(level_0)
            self.dbsession.add(team)
            self.dbsession.commit()

            # Avatar
            avatar_select = self.get_argument("team_avatar_select", "")
            if avatar_select and len(avatar_select) > 0:
                team._avatar = avatar_select
            elif hasattr(self.request, "files") and "avatar" in self.request.files:
                team.avatar = self.request.files["avatar"][0]["body"]
            self.dbsession.add(team)
            self.dbsession.commit()
            Scoreboard.update_gamestate(self)
            self.redirect("/admin/users")
        except ValidationError as error:
            self.render("admin/create/team.html", errors=[str(error)])
Esempio n. 3
0
 def on_message(self, message):
     """ We ignore messages if there are more than 1 every 3 seconds """
     if self.application.settings["freeze_scoreboard"]:
         self.write_message("pause")
     elif datetime.now() - self.last_message > timedelta(seconds=3):
         self.last_message = datetime.now()
         Scoreboard.update_gamestate(self)
         self.write_message(Scoreboard.now(self))
Esempio n. 4
0
 def get(self, *args, **kargs):
     user = self.get_current_user()
     if scoreboard_visible(user):
         Scoreboard.update_gamestate(self)
         self.render("scoreboard/summary.html", timer=self.timer())
     elif not user:
         self.redirect("/login")
     else:
         self.render("public/404.html")
Esempio n. 5
0
    def create_user(self):
        """ Add user to the database """
        if User.by_handle(self.get_argument("handle", "")) is not None:
            raise ValidationError("This handle is already registered")
        if self.get_argument("pass1", "") != self.get_argument("pass2", ""):
            raise ValidationError("Passwords do not match")
        user = User()
        user.handle = self.get_argument("handle", "")
        user.password = self.get_argument("pass1", "")
        user.bank_password = self.get_argument("bpass", "")
        user.name = self.get_argument("playername", "")
        user.email = self.get_argument("email", "")
        team = self.get_team()
        self.dbsession.add(user)
        self.dbsession.add(team)
        self.dbsession.commit()

        # Avatar
        avatar_select = self.get_argument("user_avatar_select", "")
        if avatar_select and len(avatar_select) > 0:
            user._avatar = avatar_select
        elif hasattr(self.request, "files") and "avatar" in self.request.files:
            user.avatar = self.request.files["avatar"][0]["body"]
        team.members.append(user)
        if not options.teams:
            if avatar_select and len(avatar_select) > 0:
                team._avatar = avatar_select
            elif hasattr(self.request, "files") and "avatar" in self.request.files:
                team.avatar = self.request.files["avatar"][0]["body"]
        self.dbsession.add(user)
        self.dbsession.add(team)
        self.dbsession.commit()
        Scoreboard.update_gamestate(self)
        self.event_manager.user_joined_team(user)

        # Chat
        if self.chatsession:
            self.chatsession.create_user(user, self.get_argument("pass1", ""))

        return user
Esempio n. 6
0
 def get(self, *args, **kargs):
     user = self.get_current_user()
     try:
         page = int(self.get_argument("page", 1))
         display = int(self.get_argument("count", 50))
     except ValueError:
         page = 1
         display = 50
     if scoreboard_visible(user):
         teamcount = Scoreboard.update_gamestate(self)
         self.render(
             "scoreboard/summary.html",
             timer=self.timer(),
             hide_scoreboard=self.application.settings["hide_scoreboard"],
             page=page,
             display=display,
             teamcount=teamcount,
         )
     elif not user:
         self.redirect("/login")
     else:
         self.render("public/404.html")