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)
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)