def _do_recover(self, **kwargs): db_conn = self._create_db_conn() db_cursor = db_conn.cursor() # replay outstanding request if there are any statement = "SELECT req_id, request, req_time FROM flr_request WHERE site = '%s'" % self._site db_cursor.execute(statement) requests = db_cursor.fetchall() request_sender = FLRRequestSender() request_sender.set_message_callback(self._on_response_from_flrd) request_sender.set_request_done_callback(self._on_done) for req in requests: # the last app component status for this request statement = ( "SELECT app_component, status, message FROM flr_app_status a, (SELECT site, appname, max(msg_time) msg_time FROM flr_app_status GROUP BY site, appname) b WHERE a.appname = 'flrd' AND a.appname = b.appname AND a.site = '%s' AND a.site = b.site AND a.req_id = %d and a.msg_time = b.msg_time" % (self._site, req[0]) ) db_cursor.execute(statement) last_app_status = db_cursor.fetchall() if last_app_status: self._do_recover_for(last_app_status[0][0], last_app_status[0][1], req, request_sender) else: self._do_recover_for("", 0, req, request_sender) db_cursor.close() db_conn.close()
def __init__(self, cfg_parser): self._cfg_parser = cfg_parser self._db_conn = self._create_db_conn() self._db_cursor = self._db_conn.cursor() self._scan_servers = self._get_scan_servers() self._sender = FLRRequestSender()
class FLRDClient(object): def __init__(self, cfg_parser): self._cfg_parser = cfg_parser self._db_conn = self._create_db_conn() self._db_cursor = self._db_conn.cursor() self._scan_servers = self._get_scan_servers() self._sender = FLRRequestSender() def start(self, scan_filters): jobs = self._get_jobs(scan_filters) for job in jobs: job_elem = ElementTree.Element('job', {'name':'scan', 'site': job[-1]}) job_elem.text = '\n%s\n' % job[1] job_xml = '<?xml version="1.0"?>\n%s' % ElementTree.tostring(job_elem) job[1] = job_xml self._sender.send_requests(jobs) def quit(self): self._sender.quit() def _get_scan_servers(self): statement = 'SELECT site, ip FROM %s' %(self._cfg_parser.get('DATABASE', 'scan_server_tbl')) self._db_cursor.execute(statement) return dict(self._db_cursor.fetchall()) def _get_jobs(self, scan_filters): # dispatch jobs among the scan server accoring to user's selection scan_info_tbl = self._cfg_parser.get('DATABASE', 'scan_info_tbl') # [scan_server, scan_info, site] jobs = [] if not scan_filters: statement = "SELECT site, string_agg(scan_info, E'\n') FROM %s GROUP BY site" %(scan_info_tbl) self._db_cursor.execute(statement) for r in self._db_cursor.fetchall(): site, scan_info = r if site and scan_info: jobs.append([self._scan_servers[site], scan_info + '\n', site]) else: where_states = [] for site in scan_filters: statement = "SELECT site, scan_info FROM %s " %(scan_info_tbl) del where_states[:] if not scan_filters[site]: where_states.append("(site = '%s')" %(site)) else: for file_server in scan_filters[site]: if not scan_filters[site][file_server]: where_states.append("(site = '%s' and file_server = '%s')" %(site, file_server)) else: for export_root in scan_filters[site][file_server]: where_states.append("(site = '%s' and file_server = '%s' and export_root = '%s')" %(site, file_server, export_root)) statement = '%s WHERE %s' %(statement, ' or '.join(where_states)) logging.info('execute query %s' %(statement)) self._db_cursor.execute(statement) scan_list = '\n'.join([r[1] for r in self._db_cursor.fetchall() if r[1]]) if scan_list: jobs.append([self._scan_servers[site], scan_list, site]) return jobs def _create_db_conn(self): db_section = 'DATABASE' db_conn = None try: db_conn = ZDbConn.create_db_connection(self._cfg_parser.get(db_section, 'type'), self._cfg_parser.get(db_section, 'host'), self._cfg_parser.get(db_section, 'user'), self._cfg_parser.get(db_section, 'password'), self._cfg_parser.get(db_section, 'db')) except Exception as e: exc_type, exc_value, exc_traceback = sys.exc_info() logging.error('FLRDClient._create_db_conn encounting error %s' %(''.join(format_exception(exc_type, exc_value, exc_traceback)))) return db_conn