Example #1
0
    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()
Example #2
0
 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()
Example #3
0
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