Пример #1
0
    def __process_server(self):
        try:
            stats = self.interface.do_query()
            logginghelper.log_debug('Received stats from ' + self.interface.server.name)
            if stats is None:
                return
        except Exception as ex:
            logginghelper.log_error("Error trying to query server " + self.interface.server.name + ": " + ex.message)
            return

        try:
            with self.database.connect() as db_session:
                db_session.begin()
                restore_point = self.state.copy()
                try:
                    self.state.update(db_session, stats)
                    db_session.commit()
                    logginghelper.log_debug('Updated database for ' + self.interface.server.name)
                except Exception as ex:
                    db_session.rollback()
                    logginghelper.log_error("Error updating database from query " + self.interface.server.name + ": " + ex.message)

                    JsonHelper.to_json_file({
                        'error': traceback.format_exc(),
                        'company_info': self.state.last_snapshot.company_info,
                        'game_info': self.state.last_snapshot.game_info,
                        'client_info': self.state.last_snapshot.client_info
                    }, "ERROR_" +datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S") + "_snapshot_sid" + str(self.state.server_id) + ".json")

                    self.state.restore(restore_point)
        except Exception as ex:
            logginghelper.log_error("Error connecting to db while trying to update " + self.interface.server.name + ": " + ex.message)
Пример #2
0
 def search_read(self, model, fields=False, offset=0, limit=False, domain=None, sort=None, groupby=None, api_key=None):
     try:
         if not verify_api_key(api_key):
             return JsonHelper.make_jsondata("AccessError: Verify your api_key", 1)    
         if groupby:
             return self.do_search_read_group(model, fields, offset,limit, domain, sort, groupby)
         return JsonHelper.make_jsondata("Sucessful", 0, self.do_search_read(model, fields, offset, limit, domain, sort))
     except AccessError:
         return JsonHelper.make_jsondata("AccessError: You don't have permission to get data", 1)
     except:
         return JsonHelper.make_jsondata("ValidationError: ... ", 2)
Пример #3
0
    def do_query(self):

        url = self.server.url
        post_data = JsonHelper.to_json({
            'payload': {
                'action': 'get'
            },
            'password': self.server.password
        })

        try:
            resp = requests.post(url, post_data)
        except requests.exceptions.Timeout:
            logginghelper.log_warning("Timeout while trying to contact " + self.server.name)
            return None
        except requests.exceptions.ConnectionException:
            logginghelper.log_warning("Error while contacting " + self.server.name)
            return None

        if not resp.status_code is 200:
            logginghelper.log_warning("Http Error " + str(resp.status_code) + " while connecting to " + self.server.name)
            return None

        resp_dict = JsonHelper.from_json(resp.text)

        if not 'status' in resp_dict:
            logginghelper.log_warning("Invalid response - no status - from " + self.server.name)
            return None

        if not resp_dict['status'] is 0:
            if 'error' in resp_dict:
                logginghelper.log_warning("Error received from Poxy on " + self.server.name +": '" + resp_dict['error'] + "'")
            else:
                logginghelper.log_warning("Unspecified error response from " + self.server.name)
            return None

        if not 'payload' in resp_dict:
            logginghelper.log_warning("Invalid response - no payload - from " + self.server.name)
        else:
            if not 'stats' in resp_dict['payload']:
                logginghelper.log_warning("Empty stats from " + self.server.name)
            else:
                stats = resp_dict['payload']['stats']

                ottd_stats = OpenTTDStats()
                ottd_stats.client_info = stats['client_info']
                ottd_stats.game_info = stats['game_info']
                ottd_stats.company_info = stats['company_info']

                return ottd_stats


        return None
Пример #4
0
    def get_fields(self, tname, api_key=None):

        try:
            if not verify_api_key(api_key):
                return JsonHelper.make_jsonresponse("AccessError: Verify your api_key", 1)
            Objects = get_object(tname)
            if not Objects:
                return JsonHelper.make_jsondata("Invalid URL",1)
            
            Model = request.env[Objects.model]
            record = Model.fields_get([])
            return JsonHelper.make_jsonresponse("Sucessful", 0, record)
        except:
            return JsonHelper.make_jsondata("AccessError: You dont' have permission to get fields of record!",1)
Пример #5
0
    def __process_server(self):
        try:
            stats = self.interface.do_query()
            logginghelper.log_debug('Received stats from ' +
                                    self.interface.server.name)
            if stats is None:
                return
        except Exception as ex:
            logginghelper.log_error("Error trying to query server " +
                                    self.interface.server.name + ": " +
                                    ex.message)
            return

        try:
            with self.database.connect() as db_session:
                db_session.begin()
                restore_point = self.state.copy()
                try:
                    self.state.update(db_session, stats)
                    db_session.commit()
                    logginghelper.log_debug('Updated database for ' +
                                            self.interface.server.name)
                except Exception as ex:
                    db_session.rollback()
                    logginghelper.log_error(
                        "Error updating database from query " +
                        self.interface.server.name + ": " + ex.message)

                    JsonHelper.to_json_file(
                        {
                            'error': traceback.format_exc(),
                            'company_info':
                            self.state.last_snapshot.company_info,
                            'game_info': self.state.last_snapshot.game_info,
                            'client_info': self.state.last_snapshot.client_info
                        }, "ERROR_" +
                        datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S") +
                        "_snapshot_sid" + str(self.state.server_id) + ".json")

                    self.state.restore(restore_point)
        except Exception as ex:
            logginghelper.log_error(
                "Error connecting to db while trying to update " +
                self.interface.server.name + ": " + ex.message)
Пример #6
0
    def load(self, db):
        db.execute("SELECT * FROM state WHERE server_id = %(server_id)s",
                   {'server_id': self.server_id})
        state = db.fetch_results()
        cols = db.columns()

        if len(state) == 1:
            state = state[0]
            snapshot = JsonHelper.from_json(state[cols['last_snapshot']])

            self.last_snapshot = OpenTTDStats()
            self.last_snapshot.company_info = snapshot['company_info']
            self.last_snapshot.game_info = snapshot['game_info']
            self.last_snapshot.client_info = snapshot['client_info']

            self.last_snapshot_time = state[cols['last_snapshot_time']]
            self.current_game_id = state[cols['game_id']]

            assert self.current_game_id > -1

            if self.current_game_id > -1:
                db.execute(
                    "SELECT * FROM game_company WHERE game_id = %(game_id)s AND end IS NULL",
                    {'game_id': self.current_game_id})
                companies = db.fetch_results()
                if len(companies) > 0:
                    cols = db.columns()
                    for company in companies:
                        company_id = company[cols['company_id']]
                        self.current_companies[company_id] = {
                            'id': company[cols['id']],
                            'game_id': company[cols['game_id']],
                            'company_id': company_id,
                            'start': company[cols['start']],
                            'color': company[cols['color']],
                            'manager': company[cols['manager']],
                            'name': company[cols['name']],
                            'clients': {}
                        }

                        # load clients...
                        db.execute(
                            "SELECT * FROM game_company_client WHERE game_id = %(game_id)s AND "
                            "company_id = %(company_id)s", {
                                'game_id': self.current_game_id,
                                'company_id': company[cols['id']]
                            })
                        clients = db.fetch_results()
                        client_cols = db.columns()
                        if len(clients) > 0:
                            for client in clients:
                                key = client[
                                    client_cols['name']] + '|' + client[
                                        client_cols['hostname']]
                                self.current_companies[company_id]['clients'][
                                    key] = client[client_cols['client_id']]
Пример #7
0
    def create(self, tname, record, api_key=None):
        logging.warning("assssssssssss")
        try:
            if not verify_api_key(api_key):
                return JsonHelper.make_jsondata("AccessError: Verify your api_key", 1)
            Objects = get_object(tname)
            if not Objects:
                return JsonHelper.make_jsondata("Invalid URL", 1)
            logging.warning("vvvvvvvvvvvvvvvvvvvvvv")
            logging.warning(record['value_ids'])
            # if(tname == )
            record['value_ids'] = [(4,record['value_ids'],0)]
            # record['value_ids'] = json.dumps(record['value_ids'])
            logging.warning(record['value_ids'])

            Model = request.session.model(Objects.model)
            model = Model.create(record)
            return JsonHelper.make_jsondata("Create Successful", 0) 
        except ValueError:
            logging.warning(ValueError)
            return JsonHelper.make_jsondata("AccessError: You dont' have permission to create a record!", 1)
Пример #8
0
 def get(self, tname,id=None, api_key=None):
     try:
         if not verify_api_key(api_key):
             return JsonHelper.make_jsonresponse("AccessError: Verify your api_key", 1)
         Objects = get_object(tname)
         if not Objects:
             return JsonHelper.make_jsonresponse("Invalid URL", 1)
         
         model = Objects.model
         fields = string_to_fields(Objects.field)
         offset = Objects.offset
         limit = Objects.limit
         domain = string_to_domain(Objects.domain)
         if id:
             domain.append(['id','=', id])
         sort = string_to_sort(Objects.sort)
         
         if Objects.groupby is not False:
             return JsonHelper.make_jsonresponse("Sucessful", 0, self.do_search_read_group(model, fields, offset,limit, domain, sort, Objects.groupby))
         else:
             return JsonHelper.make_jsonresponse("Sucessful", 0, self.do_search_read(model, fields, offset, limit, domain, sort))
     except :
         return JsonHelper.make_jsonresponse("AccessError: You don't have permission to get data", 1)
Пример #9
0
    def load(self, db):
        db.execute("SELECT * FROM state WHERE server_id = %(server_id)s", {'server_id': self.server_id})
        state = db.fetch_results()
        cols = db.columns()

        if len(state) == 1:
            state = state[0]
            snapshot = JsonHelper.from_json(state[cols['last_snapshot']])

            self.last_snapshot = OpenTTDStats()
            self.last_snapshot.company_info = snapshot['company_info']
            self.last_snapshot.game_info = snapshot['game_info']
            self.last_snapshot.client_info = snapshot['client_info']

            self.last_snapshot_time = state[cols['last_snapshot_time']]
            self.current_game_id = state[cols['game_id']]

            assert self.current_game_id > -1

            if self.current_game_id > -1:
                db.execute("SELECT * FROM game_company WHERE game_id = %(game_id)s AND end IS NULL",
                           {'game_id': self.current_game_id})
                companies = db.fetch_results()
                if len(companies) > 0:
                    cols = db.columns()
                    for company in companies:
                        company_id = company[cols['company_id']]
                        self.current_companies[company_id]= {
                                'id': company[cols['id']],
                                'game_id': company[cols['game_id']],
                                'company_id': company_id,
                                'start': company[cols['start']],
                                'color': company[cols['color']],
                                'manager': company[cols['manager']],
                                'name': company[cols['name']],
                                'clients': {}
                            }

                        # load clients...
                        db.execute("SELECT * FROM game_company_client WHERE game_id = %(game_id)s AND "
                                   "company_id = %(company_id)s",  {'game_id': self.current_game_id, 'company_id': company[cols['id']]})
                        clients = db.fetch_results()
                        client_cols = db.columns()
                        if len(clients) > 0:
                            for client in clients:
                                key = client[client_cols['name']] + '|' + client[client_cols['hostname']]
                                self.current_companies[company_id]['clients'][key] = client[client_cols['client_id']]
Пример #10
0
 def update_delete(self, tname, id, record=None,api_key=None):
     try:
         if not verify_api_key(api_key):
             return JsonHelper.make_jsondata("AccessError: Verify your api_key", 1)
         Objects = get_object(tname)
         if not Objects:
             return JsonHelper.make_jsondata("Invalid URL",1)
         
         Model = request.session.model(Objects.model)
         model = Model.browse([id])
         if not model.exists():
             return JsonHelper.make_jsondata("Record id = " + str(id) +" is not exists", 1)
         if request.httprequest.method == 'PUT':
             model.write(record)
             return JsonHelper.make_jsondata("UPDATE Successful",0)
         if request.httprequest.method == 'DELETE':
             model.unlink()
             return JsonHelper.make_jsondata("DELETE Successful",0)
             
     except:
         return JsonHelper.make_jsondata("AccessError: You dont' have permission to update a record!",1)
Пример #11
0
    def do_query(self):

        connection = AdminConnection()

        connection.configure(
                name="ottdstats",
                password=self.server.password,
                host=self.server.host,
                port=self.server.port
        )

        if not connection.connect():
            logging.warning("Could not connect to " + self.server.name)
            return None

        # The order is important here - since the first poll (game_info) should return version / welcome
        stats = OpenTTDStats()
        stats.game_info = self.__poll_game_info(connection)
        stats.company_info = self.__poll_admin_array_info(connection, UpdateType.COMPANY_INFO, ServerCompanyInfo.packetID)
        stats.client_info = self.__poll_admin_array_info(connection, UpdateType.CLIENT_INFO, ServerClientInfo.packetID)
        company_stats = self.__poll_admin_array_info(connection, UpdateType.COMPANY_STATS, ServerCompanyStats.packetID)
        company_economy = self.__poll_admin_array_info(connection, UpdateType.COMPANY_ECONOMY, ServerCompanyEconomy.packetID)

        if company_stats:
            self.__match_company_stats(stats.company_info, company_stats)
        if company_economy:
            self.__match_company_economy(stats.company_info, company_economy)

        connection.disconnect()

        # normalize values (convert to unicode)
        stats.game_info = JsonHelper.from_json(JsonHelper.to_json(stats.game_info))
        stats.company_info = JsonHelper.from_json(JsonHelper.to_json(stats.company_info))
        stats.client_info = JsonHelper.from_json(JsonHelper.to_json(stats.client_info))

        return stats
Пример #12
0
 def save(self):
     try:
         JsonHelper.to_json_file(self.config, Config.__full_path)
     except IOError:
         pass
Пример #13
0
 def load(self):
     try:
         self.config = JsonHelper.from_json_file(Config.__full_path)
         return True
     except IOError:
         return False
Пример #14
0
 def get_json(self):
     return JsonHelper.to_json({
         'company_info': self.company_info,
         'game_info': self.game_info,
         'client_info': self.client_info
     })
Пример #15
0
 def save(self):
     try:
         JsonHelper.to_json_file(self.config, Config.__full_path)
     except IOError:
         pass
Пример #16
0
 def load(self):
     try:
         self.config = JsonHelper.from_json_file(Config.__full_path)
         return True
     except IOError:
         return False