コード例 #1
0
ファイル: flrd_client_ui.py プロジェクト: chenziliang/src
    def __init__(self, name, cfg_parser):
        wx.Frame.__init__(self, None, -1, name, pos=(50, 50), size=(800, 600),
                          style=wx.DEFAULT_FRAME_STYLE, name='FLR Scanner Client')
        self.CreateStatusBar()
        self.AddMenuBar()

        self._cfg_parser = cfg_parser
        self._site_list = None
        self._file_server_list = None
        self._export_root_list = None
        self._scan_info = {} 

        #self._guard = threading.Condition(threading.Lock())
        #th = threading.Thread(target=self._GetScanInfo)
        #th.start()

        self._split_win = wx.SplitterWindow(self, -1)
        top_panel = wx.Panel(self._split_win, -1, size=(800, 500), style=wx.WANTS_CHARS)
        self._CreateTopListCtrls(top_panel)
        bottom_panel = wx.Panel(self._split_win, -1, size=(800, 100), style=wx.WANTS_CHARS)
        self._CreateBottomButton(bottom_panel)
        self._split_win.SplitHorizontally(top_panel, bottom_panel, 480)
        self.Centre()
        self.Show(True)
        #th.join()
        self._uid_map = {}
        self._file_server_uid_to_site_uid = {}
        self._GetScanInfo()
        self._PopulateSiteList()
        self._selected_scans = {} 
        self._scanner = FLRDClient(self._cfg_parser)
        self.Bind(wx.EVT_CLOSE, self.Quit)
コード例 #2
0
ファイル: flrd_client_ui.py プロジェクト: chenziliang/src
class ScannerFrame(wx.Frame):
    def __init__(self, name, cfg_parser):
        wx.Frame.__init__(self, None, -1, name, pos=(50, 50), size=(800, 600),
                          style=wx.DEFAULT_FRAME_STYLE, name='FLR Scanner Client')
        self.CreateStatusBar()
        self.AddMenuBar()

        self._cfg_parser = cfg_parser
        self._site_list = None
        self._file_server_list = None
        self._export_root_list = None
        self._scan_info = {} 

        #self._guard = threading.Condition(threading.Lock())
        #th = threading.Thread(target=self._GetScanInfo)
        #th.start()

        self._split_win = wx.SplitterWindow(self, -1)
        top_panel = wx.Panel(self._split_win, -1, size=(800, 500), style=wx.WANTS_CHARS)
        self._CreateTopListCtrls(top_panel)
        bottom_panel = wx.Panel(self._split_win, -1, size=(800, 100), style=wx.WANTS_CHARS)
        self._CreateBottomButton(bottom_panel)
        self._split_win.SplitHorizontally(top_panel, bottom_panel, 480)
        self.Centre()
        self.Show(True)
        #th.join()
        self._uid_map = {}
        self._file_server_uid_to_site_uid = {}
        self._GetScanInfo()
        self._PopulateSiteList()
        self._selected_scans = {} 
        self._scanner = FLRDClient(self._cfg_parser)
        self.Bind(wx.EVT_CLOSE, self.Quit)

    def _CreateTopListCtrls(self, panel):
        top_h_box = wx.BoxSizer(wx.HORIZONTAL)
        lists = []
        for col_name in ('Site', 'File Server', 'File System Export Root'):
            lists.append(self._DoCreateListCtrl(col_name, col_name=='Site' and 1 or 2, panel, top_h_box))

        self._site_list, self._file_server_list, self._export_root_list = lists[0], lists[1], lists[2]
        panel.SetSizer(top_h_box)
        panel.SetAutoLayout(True)

    def _DoCreateListCtrl(self, col_name, proportion, panel, h_box):
        list_ctrl = ScannerListCtrl(panel, 
                                    style=wx.LC_REPORT
                                    | wx.BORDER_NONE
                                    | wx.LC_EDIT_LABELS
                                    | wx.LC_SORT_ASCENDING)
        list_ctrl.InsertColumn(0, col_name)
        list_ctrl.SetColumnWidth(0, wx.LIST_AUTOSIZE)
        list_ctrl.itemDataMap = {}
        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, list_ctrl)
        self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, list_ctrl)
        list_box = wx.BoxSizer(wx.VERTICAL)
        list_box.Add(list_ctrl, proportion=1, flag=wx.EXPAND)
        h_box.Add(list_box, proportion, flag=wx.EXPAND, border=2)
        return list_ctrl

    def _PopulateSiteList(self):
        for site in self._scan_info:
            idx = self._site_list.InsertStringItem(sys.maxint, site) 
            self._site_list.SetItemData(idx, self._scan_info[site][0]) 

    def _CreateBottomButton(self, bottom_panel):         
        self._start_btn = wx.Button(bottom_panel, -1, 'Start Scan')
        self.Bind(wx.EVT_BUTTON, self._StartScan, self._start_btn)
        self._start_btn.SetSize(self._start_btn.GetBestSize())
        bottom_h_box = wx.BoxSizer(wx.HORIZONTAL)
        bottom_h_box.Add((700, 0))
        bottom_h_box.Add(self._start_btn, proportion=0, flag=wx.BOTTOM|wx.LEFT, border=0)
        bottom_panel.SetSizer(bottom_h_box)
        bottom_panel.SetAutoLayout(True)

    def OnItemSelected(self, evt):
        evt_list = evt.GetEventObject()
        if evt_list == self._site_list:
            self._HandleSiteListSelection(evt)
        elif evt_list == self._file_server_list:
            self._HandleFileServerListSelection(evt)
        elif evt_list == self._export_root_list:
            self._HandleExportRootListSelection(evt)
        else:
            assert None

    def OnItemDeselected(self, evt):
        evt_list = evt.GetEventObject()
        if  evt_list == self._site_list:
            self._HandleSiteListDeselection(evt)
        elif evt_list == self._file_server_list:
            self._HandleFileServerListDeselection(evt)
        elif evt_list == self._export_root_list:
            self._HandleExportRootListDeselection(evt)
        else:
            assert None

    def Quit(self, evt):
        self._scanner.quit()
        self.Destroy()

    def _HandleSiteListSelection(self, evt):
        site = evt.GetItem().GetText()
        site_uid = evt.GetItem().GetData()
        logging.info('selecting site = %s' %(site))
        self._selected_scans[site] = {}
        for file_server in self._scan_info[site][-1]:
            idx = self._file_server_list.InsertStringItem(sys.maxint, file_server) 
            self._file_server_list.SetItemData(idx, site_uid)

    def _HandleFileServerListSelection(self, evt):
        site_uid = evt.GetItem().GetData()
        site = self._uid_map[site_uid]
        file_server = evt.GetItem().GetText()
        logging.info('selecting site = %s file_server = %s' %(site, file_server))
        assert site in self._selected_scans
        self._selected_scans[site][file_server] = []
        for export_root in self._scan_info[site][-1][file_server][-1]:
            idx = self._export_root_list.InsertStringItem(sys.maxint, export_root)
            self._export_root_list.SetItemData(idx, self._scan_info[site][-1][file_server][0])

    def _HandleExportRootListSelection(self, evt):
        file_server_uid = evt.GetItem().GetData()
        site_uid = self._file_server_uid_to_site_uid[file_server_uid]
        file_server = self._uid_map[file_server_uid]
        site = self._uid_map[site_uid]
        assert site in self._selected_scans
        assert file_server in self._selected_scans[site]
        export_root = evt.GetItem().GetText()
        logging.info('selecting site = %s file_server = %s export_root = %s' %(site, file_server, export_root))
        self._selected_scans[site][file_server].append(export_root) 

    def _HandleSiteListDeselection(self, evt):
        site = evt.GetItem().GetText()
        site_uid = evt.GetItem().GetData()
        logging.info('deselecting site = %s' %(site))

        while True:
            idx = self._file_server_list.FindItemData(-1, site_uid)
            if idx < 0:
                break
            self._file_server_list.DeleteItem(idx)
        self._selected_scans.pop(site)

    def _HandleFileServerListDeselection(self, evt):
        file_server = evt.GetItem().GetText()
        site_uid = evt.GetItem().GetData()
        site = self._uid_map[site_uid]
        file_server_uid = self._scan_info[site][-1][file_server][0]
        logging.info('deselecting site = %s, file_server = %s' %(site, file_server))
        while True:
            idx = self._export_root_list.FindItemData(-1, file_server_uid)
            if idx < 0:
                break
            self._export_root_list.DeleteItem(idx)
        self._selected_scans[site].pop(file_server, None)

    def _HandleExportRootListDeselection(self, evt):
        export_root = evt.GetItem().GetText()
        file_server_uid = evt.GetItem().GetData()
        site_uid = self._file_server_uid_to_site_uid[file_server_uid]
        site = self._uid_map[site_uid]
        file_server = self._uid_map[file_server_uid] 
        logging.info('deselecting site = %s file_server = %s export_root = %s' %(site, file_server, export_root))
        self._selected_scans[site].pop(file_server, None)

    def _CreateDbConnection(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('Create DB Connection encounting error %s' 
                          %(''.join(format_exception(exc_type, exc_value, exc_traceback))))
        return db_conn 

    def _GetScanInfo(self):
        db_conn = self._CreateDbConnection()
        if db_conn is None:
            return
        
        scan_info_tbl = self._cfg_parser.get('DATABASE', 'scan_info_tbl')
        db_cursor = db_conn.cursor()
        db_cursor.execute('SELECT site, file_server, export_root FROM %s' %scan_info_tbl)
        uid = 1
        # rec: [site, file_server, export_root]
        for rec in db_cursor.fetchall():
            site, file_server, export_root = rec
            if not site in self._scan_info:
                self._scan_info[site] = (uid, {})
                self._uid_map[uid] = site 
                uid += 1

            if not file_server in self._scan_info[site][-1]:
                self._scan_info[site][-1][file_server] = (uid, []) 
                self._uid_map[uid] = file_server 
                self._file_server_uid_to_site_uid[uid] = self._scan_info[site][0]
                uid += 1
            
            self._scan_info[site][-1][file_server][-1].append(export_root)
        db_cursor.close()

    def AddMenuBar(self):
        menu_bar = wx.MenuBar()
        menu = wx.Menu()
        start_item = menu.Append(1, 'Start\tCtrl-S', 'Start scanning the selected file systems')
        exit_item = menu.Append(2, 'E&xit\tCtrl-Q', 'Exit FLR Scanner')
        menu_bar.Append(menu, '&File')
        self.SetMenuBar(menu_bar)

        self.Bind(wx.EVT_MENU, self.OnStartScan, id=1)
        self.Bind(wx.EVT_MENU, self.OnCloseFrame, id=2)

    def OnStartScan(self, evt):
        self._StartScan(evt)

    def OnCloseFrame(self, evt):
        # trigger wx.EVT_CLOSE event which will be caught by self.Quit handler.
        self.Close(True) 

    def _StartScan(self, evt):
        self._scanner.start(self._selected_scans)