def launch_query(self): """ Prepare the request object's filter stacks """ # The Response object needs to access the Query self.response.load(self) # A minimal integrity check if not self.table: return [] # Ask the cache if this request was already answered under the same # circumstances. (And f not, whether this query is cacheable at all) cacheable, cache_hit, cached_response = self.query_cache.get_cached_query(self.metainfo) if cache_hit: self.columns = cached_response['columns'] self.response.columnheaders = cached_response['columnheaders'] return cached_response['result'] # Make columns unique self.filtercolumns = list(set(self.filtercolumns)) self.prefiltercolumns = list(set(self.prefiltercolumns)) self.stats_columns = list(set(self.stats_columns)) if self.stats_query: if len(self.columns) > 0: # StatsGroupBy is deprecated. Columns: can be used instead self.stats_group_by = self.columns elif len(self.stats_group_by) > 0: self.columns = self.stats_group_by + self.stats_columns #if len(self.stats_columns) > 0 and len(self.columns) == 0: if len(self.stats_columns) > 0: self.columns = self.stats_columns + self.columns else: if len(self.columns) == 0: self.outputcolumns = list_livestatus_attributes(self.table) else: self.outputcolumns = self.columns # Make one big filter where the single filters are anded self.filter_stack.and_elements(self.filter_stack.qsize()) # Get the function which implements the Filter: statements filter_func = self.filter_stack.get_stack() without_filter = len(self.filtercolumns) == 0 cs = LiveStatusConstraints(filter_func, without_filter, self.authuser) try: # Remember the number of stats filters. We need these numbers as columns later. # But we need to ask now, because get_live_data() will empty the stack num_stats_filters = self.stats_filter_stack.qsize() if self.table == 'log': result = self.get_live_data_log(cs) else: # If the pnpgraph_present column is involved, then check # with each request if the pnp perfdata path exists if 'pnpgraph_present' in self.columns + self.filtercolumns + self.prefiltercolumns and self.pnp_path and os.access(self.pnp_path, os.R_OK): self.pnp_path_readable = True else: self.pnp_path_readable = False # Apply the filters on the broker's host/service/etc elements result = self.get_live_data(cs) if self.stats_query: self.columns = range(num_stats_filters) if self.stats_group_by: self.columns = tuple(list(self.stats_group_by) + list(self.columns)) if len(self.aliases) == 0: # If there were Stats: staments without "as", show no column headers at all self.response.columnheaders = 'off' else: self.response.columnheaders = 'on' if self.stats_query: result = self.statsify_result(result) # statsify_result returns a dict with column numers as keys elif self.table == 'columns': # With stats_request set to True, format_output expects result # to be a list of dicts instead a list of objects self.stats_query = True except Exception, e: import traceback print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" print e traceback.print_exc(32) print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" result = []
def launch_query(self): """ Prepare the request object's filter stacks """ # The Response object needs to access the Query self.response.load(self) # A minimal integrity check if not self.table: return [] # Ask the cache if this request was already answered under the same # circumstances. (And f not, whether this query is cacheable at all) cacheable, cache_hit, cached_response = self.query_cache.get_cached_query( self.metainfo) if cache_hit: self.columns = cached_response['columns'] self.response.columnheaders = cached_response['columnheaders'] return cached_response['result'] # Make columns unique self.filtercolumns = list(set(self.filtercolumns)) self.prefiltercolumns = list(set(self.prefiltercolumns)) self.stats_columns = list(set(self.stats_columns)) if self.stats_query: if len(self.columns) > 0: # StatsGroupBy is deprecated. Columns: can be used instead self.stats_group_by = self.columns elif len(self.stats_group_by) > 0: self.columns = self.stats_group_by + self.stats_columns #if len(self.stats_columns) > 0 and len(self.columns) == 0: if len(self.stats_columns) > 0: self.columns = self.stats_columns + self.columns else: if len(self.columns) == 0: self.outputcolumns = list_livestatus_attributes(self.table) else: self.outputcolumns = self.columns # Make one big filter where the single filters are anded self.filter_stack.and_elements(self.filter_stack.qsize()) # Get the function which implements the Filter: statements filter_func = self.filter_stack.get_stack() without_filter = len(self.filtercolumns) == 0 cs = LiveStatusConstraints(filter_func, without_filter, self.authuser) try: # Remember the number of stats filters. We need these numbers as columns later. # But we need to ask now, because get_live_data() will empty the stack num_stats_filters = self.stats_filter_stack.qsize() if self.table == 'log': result = self.get_live_data_log(cs) else: # If the pnpgraph_present column is involved, then check # with each request if the pnp perfdata path exists if 'pnpgraph_present' in self.columns + self.filtercolumns + self.prefiltercolumns and self.pnp_path and os.access( self.pnp_path, os.R_OK): self.pnp_path_readable = True else: self.pnp_path_readable = False # Apply the filters on the broker's host/service/etc elements result = self.get_live_data(cs) if self.stats_query: self.columns = range(num_stats_filters) if self.stats_group_by: self.columns = tuple( list(self.stats_group_by) + list(self.columns)) if len(self.aliases) == 0: # If there were Stats: staments without "as", show no column headers at all self.response.columnheaders = 'off' else: self.response.columnheaders = 'on' if self.stats_query: result = self.statsify_result(result) # statsify_result returns a dict with column numers as keys elif self.table == 'columns': # With stats_request set to True, format_output expects result # to be a list of dicts instead a list of objects self.stats_query = True except Exception, e: import traceback print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" print e traceback.print_exc(32) print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" result = []