def run(self):
        self.reload_boards()
        for api in self.authModules:
            try:
                api.refresh_database()
            except Exception as e:
                logger.error(
                    f"Failed to refresh database, module: {api.__module__}, e: {e}"
                )
        while self._run:
            try:
                r = self._inqueue.get(block=True, timeout=60)
            except Empty:
                #  Do our AWS checks
                for api in self.authModules:
                    try:
                        api.refresh_database()
                    except Exception as e:
                        logger.error(
                            f"Failed to refresh database, module: {api.__module__}, e: {e}"
                        )
                continue

            if type(r) == tuple:
                if r[0] == 'unlock':
                    (c, board, relay, duration, credential) = r
                    self.boards[board].Unlock(relay, duration, credential)
                elif r[0] == "lock":
                    (a, board, relay, credential) = r
                    self.boards[board].Lock(relay, credential)
                elif r[0] == 'aws':
                    for api in self.authModules:
                        api.refresh_database()
                elif r[0] == "status":
                    fv: Facility
                    # def facilityStatus(f : Facility):
                    #    return self.boards[f.board].relaystatus[f.relay]
                    status = dict(
                        (f.name, self.boards[f.board].relaystatus[f.relay])
                        for f in Config.Facilities.values())
                    # status = list(map(facilityStatus,Config.Facilities.values()))
                    self._outqueue.put(status)
                elif r[0] == "query":
                    response = []
                    bv: ReaderBoard
                    for bn, bv in self.boards.items():
                        response.append(bv.__repr__())
                    for bv in query_devices(
                            ignored_devices=self.boards.values()):
                        response.append(bv)
                    self._outqueue.put(response)
                elif r[0] == "reload":
                    # We have to do this here, even though it's also done in the webpanel, because
                    # Config is different here vs webpanel due to multiprocessing
                    Config.Reload()
                    self.reload_boards()
                    for api in self.authModules:
                        api.on_close()
                    self.authModules = self.load_authorizations()
                    self._outqueue.put("OK")
Esempio n. 2
0
def update_config():
    try:
        newconfig = request.form['config']
        cc = Configuration(newconfig)
        with open(Config.FileName,'w') as out:
            out.write(newconfig)
        Config.Reload()
        q: Queue = webpanel.config['squeue']
        w: Queue = webpanel.config['wqueue']
        q.put(("reload",))
        try:
            w.get(True, 3.00) #wait for a response before doing anything else
        except Empty: #TODO
            pass
        return redirect("/config")
    except ConfigurationException as ce:
        return jsonify({'result':'failed', "message" : str(ce) })