Example #1
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