def test_retrieve_projects_data_update_after_scan_loop(self): pm.create_project("my_awesome_project", "beauty isn't it ?", 30, "3280x2464") data = pm.get_projects_data() self.assertEqual(1, len(data)) project = data[0] self.assertEqual('my_awesome_project', project["name"]) self.assertIsNotNone(project["preview_data"]) self.assertEqual('beauty isn\'t it ?', project['description']) self.assertEqual(30, project['pict_per_rotation']) self.assertEqual('3280x2464', project['pict_res']) self.assertEqual(0, project['size']) scanner = Scanner() scanner.loop_capture(project['name']) data = pm.get_projects_data() self.assertEqual(1, len(data)) project_after = data[0] self.assertNotEqual(project_after['size'], project['size']) self.assertNotEqual(project_after['preview_data'], project['preview_data']) # Data's are updated pm.__remove_all_projects__()
def _scanTargets(self): print "\n[+] Start scanning (%s threads)" % self.getOption('threads') threads = [] queue = self._getTargetsQueue() for i in range(min(self.getOption('threads'), len(self.targets))): t = Scanner(self, queue) t.setDaemon(True) threads.append(t) t.start() # Little hack to kill threads on SIGINT while True: try: if queue.empty() is True: break sys.stderr.write("\r |- Remaining urls: %s " % queue.qsize()) sys.stderr.flush() except KeyboardInterrupt: print "\r |- " + colored.yellow("INTERRUPT!") + " Killing threads..." queue = Queue.Queue() break queue.join() # Harvest results results = [] errors = {} for t in threads: for r in t.results: results.append(r) # errors for ek, ev in t.errors.iteritems(): if errors.has_key(ek): errors[ek] += ev else: errors[ek] = ev # Add results to engine for r in results: self.results.append(r) if errors: print " |--[+] " + colored.red("SCAN ERRORS!") for ek, ev in errors.iteritems(): print " | |- %sx: %s" % (len(ev), ek)
def start(): # 这里可能会配置log options.parse_command_line() #if options.port is None: # logger.info("Start server fail, port is null") # return # 必须先scan trace # 会载入所有根目录service目录下文件中 # 使用@set_trace包裹的函数 # 会验证trace名字的唯一性 # 不通过验证会生成异常 Scanner.scan_trace(TRACE_SERVICE_PATH) # 加载所有的 instruct # 会对所有instruct以及subtask的trace进行合法性验证 # 会对所有重复的instruct名字进行验证 # 不通过验证会生成异常 Scanner.scan_instruct(INSTRUCT_TASK_PATH) # 生成golbal config 对象 # 将扫描到的任务和trace全部加载到返回的配置对象中 golbal_config = get_global_config(Scanner) host = '' port = int(SOCKET_PORT) core = Dispatcher.get_dispatcher(golbal_config) load_web('templates',WEB_PORT) # 这里参考tornado的手册 # 可以换成http服务器 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setblocking(0) sock.bind((host, port)) sock.listen(128) io_loop = tornado.ioloop.IOLoop.current() # 将dispatcher赋给事件处理函数 callback = functools.partial(connection_ready, sock,core) io_loop.add_handler(sock.fileno(), callback, io_loop.READ) logger.info("Socket server start, take port is: %s", port) logger.info("Web server start, take port is: %s", WEB_PORT) io_loop.start()
def __init__(self, reportAttachment=lambda atchs: None, parent=None, id=-1, title='PypMsg: New Message', show=False): self.scanner = Scanner(Scanner.CLIENT) self.client = Client(reportAttachment) self.userList = [] wx.Frame.__init__(self, parent, id, title, size=(450,300)) panel = wx.Panel(self, -1) #self.hostCtrl = wx.TextCtrl(panel) self.messCtrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.VSCROLL) fgs = wx.FlexGridSizer(rows = 2, cols = 2, vgap = 7, hgap = 15) fgs.AddMany([ # (wx.StaticText(panel, label='Host IP')), # (self.hostCtrl, 1, wx.EXPAND), (wx.StaticText(panel, label='Message')), (self.messCtrl, 1, wx.EXPAND) ]) #fgs.AddGrowableRow(1, 1) fgs.AddGrowableCol(1, 1) self.atchList = wx.ListCtrl(panel, style=wx.LC_LIST) dp = AttachmentDropTarget(self.onDropFiles) self.atchList.SetDropTarget(dp) remAtchBtn = wx.Button(panel, label='&Remove') remAtchBtn.Bind(wx.EVT_BUTTON, self.remAttachment) sendBtn = wx.Button(panel, label='&Send') sendBtn.Bind(wx.EVT_BUTTON, self.sendMsg) refreshBtn = wx.Button(panel, label='Re&fresh') refreshBtn.Bind(wx.EVT_BUTTON, lambda event: self.reloadMembers()) self.memList = lists.PListCtrl(panel) self.memList.InsertColumn(0, 'User Name') self.memList.InsertColumn(1, 'Address') vbox2 = wx.BoxSizer(wx.VERTICAL) vbox2.Add(self.memList, 1, wx.EXPAND) vbox2.Add(fgs, 0, wx.EXPAND | wx.TOP, 10) vbox1 = wx.BoxSizer(wx.VERTICAL) vbox1.Add(wx.StaticText(panel, label='Attachments:'), 0, wx.EXPAND | wx.BOTTOM, 5) vbox1.Add(self.atchList, 1, wx.EXPAND | wx.ALL) vbox1.Add(remAtchBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(refreshBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(sendBtn, 0, wx.EXPAND | wx.TOP, 10) hbox = wx.BoxSizer() hbox.Add(vbox2, 1, wx.EXPAND | wx.ALL, 15) hbox.Add(vbox1, .2, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 15) panel.SetSizer(hbox) if show: self.Show() self.reloadMembers()
def _scanTargets(self): print "\n[+] Start scanning (%s threads)" % self.getOption('threads') threads = [] queue = self._getTargetsQueue() for i in range(min(self.getOption('threads'), len(self.targets))): t = Scanner(self, queue) t.setDaemon(True) threads.append(t) t.start() # Little hack to kill threads on SIGINT while True: try: if queue.empty() is True: break sys.stderr.write("\r |- Remaining urls: %s " % queue.qsize()) sys.stderr.flush() except KeyboardInterrupt: print "\r |- " + colored.yellow( "INTERRUPT!") + " Killing threads..." queue = Queue.Queue() break queue.join() # Harvest results results = [] errors = {} for t in threads: for r in t.results: results.append(r) # errors for ek, ev in t.errors.iteritems(): if errors.has_key(ek): errors[ek] += ev else: errors[ek] = ev # Add results to engine for r in results: self.results.append(r) if errors: print " |--[+] " + colored.red("SCAN ERRORS!") for ek, ev in errors.iteritems(): print " | |- %sx: %s" % (len(ev), ek)
def __init__(self, reportAttachment=lambda atchs: None, parent=None, id=-1, title='PypMsg: New Message', show=False): self.scanner = Scanner(Scanner.CLIENT) self.client = Client(reportAttachment) self.userList = [] wx.Frame.__init__(self, parent, id, title, size=(450, 300)) panel = wx.Panel(self, -1) #self.hostCtrl = wx.TextCtrl(panel) self.messCtrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.VSCROLL) fgs = wx.FlexGridSizer(rows=2, cols=2, vgap=7, hgap=15) fgs.AddMany([ # (wx.StaticText(panel, label='Host IP')), # (self.hostCtrl, 1, wx.EXPAND), (wx.StaticText(panel, label='Message')), (self.messCtrl, 1, wx.EXPAND) ]) #fgs.AddGrowableRow(1, 1) fgs.AddGrowableCol(1, 1) self.atchList = wx.ListCtrl(panel, style=wx.LC_LIST) dp = AttachmentDropTarget(self.onDropFiles) self.atchList.SetDropTarget(dp) remAtchBtn = wx.Button(panel, label='&Remove') remAtchBtn.Bind(wx.EVT_BUTTON, self.remAttachment) sendBtn = wx.Button(panel, label='&Send') sendBtn.Bind(wx.EVT_BUTTON, self.sendMsg) refreshBtn = wx.Button(panel, label='Re&fresh') refreshBtn.Bind(wx.EVT_BUTTON, lambda event: self.reloadMembers()) self.memList = lists.PListCtrl(panel) self.memList.InsertColumn(0, 'User Name') self.memList.InsertColumn(1, 'Address') vbox2 = wx.BoxSizer(wx.VERTICAL) vbox2.Add(self.memList, 1, wx.EXPAND) vbox2.Add(fgs, 0, wx.EXPAND | wx.TOP, 10) vbox1 = wx.BoxSizer(wx.VERTICAL) vbox1.Add(wx.StaticText(panel, label='Attachments:'), 0, wx.EXPAND | wx.BOTTOM, 5) vbox1.Add(self.atchList, 1, wx.EXPAND | wx.ALL) vbox1.Add(remAtchBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(refreshBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(sendBtn, 0, wx.EXPAND | wx.TOP, 10) hbox = wx.BoxSizer() hbox.Add(vbox2, 1, wx.EXPAND | wx.ALL, 15) hbox.Add(vbox1, .2, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 15) panel.SetSizer(hbox) if show: self.Show() self.reloadMembers()
class ClientWin(wx.Frame): def __init__(self, reportAttachment=lambda atchs: None, parent=None, id=-1, title='PypMsg: New Message', show=False): self.scanner = Scanner(Scanner.CLIENT) self.client = Client(reportAttachment) self.userList = [] wx.Frame.__init__(self, parent, id, title, size=(450, 300)) panel = wx.Panel(self, -1) #self.hostCtrl = wx.TextCtrl(panel) self.messCtrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.VSCROLL) fgs = wx.FlexGridSizer(rows=2, cols=2, vgap=7, hgap=15) fgs.AddMany([ # (wx.StaticText(panel, label='Host IP')), # (self.hostCtrl, 1, wx.EXPAND), (wx.StaticText(panel, label='Message')), (self.messCtrl, 1, wx.EXPAND) ]) #fgs.AddGrowableRow(1, 1) fgs.AddGrowableCol(1, 1) self.atchList = wx.ListCtrl(panel, style=wx.LC_LIST) dp = AttachmentDropTarget(self.onDropFiles) self.atchList.SetDropTarget(dp) remAtchBtn = wx.Button(panel, label='&Remove') remAtchBtn.Bind(wx.EVT_BUTTON, self.remAttachment) sendBtn = wx.Button(panel, label='&Send') sendBtn.Bind(wx.EVT_BUTTON, self.sendMsg) refreshBtn = wx.Button(panel, label='Re&fresh') refreshBtn.Bind(wx.EVT_BUTTON, lambda event: self.reloadMembers()) self.memList = lists.PListCtrl(panel) self.memList.InsertColumn(0, 'User Name') self.memList.InsertColumn(1, 'Address') vbox2 = wx.BoxSizer(wx.VERTICAL) vbox2.Add(self.memList, 1, wx.EXPAND) vbox2.Add(fgs, 0, wx.EXPAND | wx.TOP, 10) vbox1 = wx.BoxSizer(wx.VERTICAL) vbox1.Add(wx.StaticText(panel, label='Attachments:'), 0, wx.EXPAND | wx.BOTTOM, 5) vbox1.Add(self.atchList, 1, wx.EXPAND | wx.ALL) vbox1.Add(remAtchBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(refreshBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(sendBtn, 0, wx.EXPAND | wx.TOP, 10) hbox = wx.BoxSizer() hbox.Add(vbox2, 1, wx.EXPAND | wx.ALL, 15) hbox.Add(vbox1, .2, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 15) panel.SetSizer(hbox) if show: self.Show() self.reloadMembers() def sendMsg(self, event): if not self.memList.GetSelectedItemCount(): wx.MessageDialog( None, 'Please select recipient user(s) from the user list', 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() return nextSel = self.memList.GetNextSelected(-1) while nextSel != -1: self.client.sendMsg( self.memList.GetItem(nextSel, col=1).GetText(), self.messCtrl.GetValue()) nextSel = self.memList.GetNextSelected(nextSel) self.Close() def reloadMembers(self): print 'reloading members in the list' self.memList.DeleteAllItems() self.scanner.scan(self.userHandler) def onDropFiles(self, filenames): for file in filenames: self.addAttachment(file) def addAttachment(self, atch): atchStatus = self.client.addAttachment(atch) if 'Success' in atchStatus: self.atchList.Append([atch]) else: wx.MessageDialog(None, atchStatus, 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() def remAttachment(self, event): atch = self.atchList.GetNextSelected(-1) if not atch >= 0: wx.MessageDialog( None, 'Please select an attachment from the list to be removed.', 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() return remStatus = self.client.remAttachment(self.atchList.GetItemText(atch)) if 'Success' in remStatus: self.atchList.DeleteItem(atch) else: wx.MessageDialog(None, remStatus, 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() def userHandler(self, username, address): self.memList.Append([username, address])
ed.warning( "Single url mode ." ) docrawl = False if docrawl == True: ed.status( "Starting crawling process on %s ..." % o.url ) parser = Parser( root, o, ed ) targets = [] parser.parse( GetRequest( root ) ) for req in parser.requests: if req.fields != {} or req.url.params != {}: targets.append(req) ed.status( "Found %d targets ." % len(targets) ) else: ed.warning( "Skipping crawling process ." ) targets = [ GetRequest(root) ] try: scanner = Scanner( kb, o, targets, ed ) ed.status( "Running vulnerability scanner ..." ) scanner.start() ed.stopped(o.url) except KeyboardInterrupt: ed.warning( "Stopping the scanner ..." ) scanner.stop() ed.stopped(o.url)
# Author: Abubakar Nur Khalil # License: MIT # Purpose: Appropriate parsed output from Parser from utils.tokens import TokenType from core.scanner import Scanner from core.parser import Parser from tools.custom_syntax import Scanner as _Virgil from tools.custom_syntax import Parser as _Dante # Remember we always need to generate the KSL first and pass it over KSL = _Dante(_Virgil('').scan()).parse() source = """ var name = "ank"; 77.67 * (8 // 2); """ print('Source code:') print(source) tks = Scanner(source, KSL[0]).scan() pr = Parser(tks, KSL[1]) print("\nFirst Token is variable (VAR):", pr.check(TokenType.VAR)) # True
class ServerWin(wx.Frame): def __init__(self, parent=None, id=-1, title="PypMsg: Main Window", show=False): self.clients = [] # self.server = Server(self.reloadMessages) self.server = Server() self.scanner = Scanner(Scanner.SERVER) self.scanner.listen() self.atchQueue = Queue.Queue() wx.Frame.__init__(self, parent, id, title, size=(600, 400)) wx.EVT_CLOSE(self, self.OnClose) # panel = wx.Panel(self, -1) splitter = wx.SplitterWindow(self) leftPanel = wx.Panel(splitter) rightPanel = wx.Panel(splitter) self.msgList = lists.PListCtrl(leftPanel) self.msgList.InsertColumn(0, "User Name", width=100) self.msgList.InsertColumn(2, "Message") self.msgList.InsertColumn(1, "Address", width=80) self.msgList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.showFileList) self.msgList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.showMessage) # ipAddrCtrl = wx.StaticText(leftPanel, label='My IP Address: ') msgVbox = wx.BoxSizer(wx.VERTICAL) # msgVbox.Add(ipAddrCtrl, 0, wx.EXPAND) msgVbox.Add(self.msgList, 1, wx.EXPAND | wx.TOP, 10) self.filList = wx.ListCtrl(rightPanel, style=wx.LC_LIST) self.filList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.downloadAttachment) msgBtn = wx.Button(rightPanel, label="&New Message") msgBtn.Bind(wx.EVT_BUTTON, self.newMessageWin) relBtn = wx.Button(rightPanel, label="&Refresh") relBtn.Bind(wx.EVT_BUTTON, self.reloadMessages) clrBtn = wx.Button(rightPanel, label="&Clear") clrBtn.Bind(wx.EVT_BUTTON, self.clearMessages) btnVbox = wx.BoxSizer(wx.VERTICAL) btnVbox.Add(wx.StaticText(rightPanel, label="Attachments:\n(Double-Click to download)"), 0, wx.TOP) btnVbox.Add(self.filList, 1, wx.EXPAND) btnVbox.Add(msgBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(relBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(clrBtn, 0, wx.EXPAND | wx.TOP, 10) leftPanel.SetSizer(msgVbox) rightPanel.SetSizer(btnVbox) splitter.SplitVertically(leftPanel, rightPanel, -150) if not self.server.startServing(): wx.MessageDialog( None, "An Instance of PypMsg is already running. Please close that before opening a new one. \ The current version of PypMsg does not support multiple-instances. Thank you.", "Already Running", wx.OK | wx.ICON_ERROR | wx.CENTRE, ).ShowModal() raise SystemExit(1) self.reloadMessages() if show: self.Show() def addAttachment(self, atch): self.server.sentAttachments[atch[0]] = atch[1] def downloadAttachment(self, event): loc = wx.DirSelector(message="Select location to save attachment", parent=self) if not loc: return downloadStatus = self.server.downloadAttachment( self.msgList.GetNextSelected(-1), event.GetIndex(), loc, self.downloadComplete ) def downloadComplete(self, atch, downloadStatus): if downloadStatus[:5] != "ERROR": wx.MessageDialog( None, atch + ": " + downloadStatus, "Download", wx.OK | wx.ICON_INFORMATION | wx.CENTRE ).ShowModal() else: self.server wx.MessageDialog( None, atch + ": " + downloadStatus, "Attachment", wx.OK | wx.ICON_ERROR | wx.CENTRE ).ShowModal() def OnClose(self, event): self.server.stopServing() self.Destroy() def clearMessages(self, evt=None): self.msgList.DeleteAllItems() self.filList.DeleteAllItems() self.server.clearMessageQueue() def reloadMessages(self, evt=None): """Currently removing all the messages in the list and repopulating it. This method gets really slow with large nos of messages. Remedy: 1. Limit the no. of messages to may be 100? 2. Handle large no. of messages through some kind of optimisations 3. Eliminate this system, everytime reload is called, only the new messages shoule be appended to the list. """ self.filList.DeleteAllItems() self.msgList.DeleteAllItems() for (uname, addr, msg) in [(rec["USER"], rec["host"], rec["MSG"]) for rec in self.server.msgQue]: self.msgList.Append([uname, addr, msg]) # arch = self.server.msgQue[-1] # self.msgList.Append([arch['host'], arch['MSG']]) print "reloading messages done" def newMessageWin(self, event=None): self.clients.append(ClientWin(reportAttachment=self.addAttachment, parent=self, show=True)) def showFileList(self, event=None): self.filList.DeleteAllItems() for uid, atch in self.server.msgQue[event.GetIndex()]["atchs"]: self.filList.Append([atch]) def showMessage(self, event=None): message = self.server.msgQue[event.GetIndex()]["MSG"] display = ( """From: %(USER)s Address: %(host)s Message: %(MSG)s""" % self.server.msgQue[event.GetIndex()] ) wx.MessageDialog(None, display, "Details", wx.OK | wx.ICON_INFORMATION | wx.CENTRE).ShowModal() return
def __init__(self, parent=None, id=-1, title="PypMsg: Main Window", show=False): self.clients = [] # self.server = Server(self.reloadMessages) self.server = Server() self.scanner = Scanner(Scanner.SERVER) self.scanner.listen() self.atchQueue = Queue.Queue() wx.Frame.__init__(self, parent, id, title, size=(600, 400)) wx.EVT_CLOSE(self, self.OnClose) # panel = wx.Panel(self, -1) splitter = wx.SplitterWindow(self) leftPanel = wx.Panel(splitter) rightPanel = wx.Panel(splitter) self.msgList = lists.PListCtrl(leftPanel) self.msgList.InsertColumn(0, "User Name", width=100) self.msgList.InsertColumn(2, "Message") self.msgList.InsertColumn(1, "Address", width=80) self.msgList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.showFileList) self.msgList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.showMessage) # ipAddrCtrl = wx.StaticText(leftPanel, label='My IP Address: ') msgVbox = wx.BoxSizer(wx.VERTICAL) # msgVbox.Add(ipAddrCtrl, 0, wx.EXPAND) msgVbox.Add(self.msgList, 1, wx.EXPAND | wx.TOP, 10) self.filList = wx.ListCtrl(rightPanel, style=wx.LC_LIST) self.filList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.downloadAttachment) msgBtn = wx.Button(rightPanel, label="&New Message") msgBtn.Bind(wx.EVT_BUTTON, self.newMessageWin) relBtn = wx.Button(rightPanel, label="&Refresh") relBtn.Bind(wx.EVT_BUTTON, self.reloadMessages) clrBtn = wx.Button(rightPanel, label="&Clear") clrBtn.Bind(wx.EVT_BUTTON, self.clearMessages) btnVbox = wx.BoxSizer(wx.VERTICAL) btnVbox.Add(wx.StaticText(rightPanel, label="Attachments:\n(Double-Click to download)"), 0, wx.TOP) btnVbox.Add(self.filList, 1, wx.EXPAND) btnVbox.Add(msgBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(relBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(clrBtn, 0, wx.EXPAND | wx.TOP, 10) leftPanel.SetSizer(msgVbox) rightPanel.SetSizer(btnVbox) splitter.SplitVertically(leftPanel, rightPanel, -150) if not self.server.startServing(): wx.MessageDialog( None, "An Instance of PypMsg is already running. Please close that before opening a new one. \ The current version of PypMsg does not support multiple-instances. Thank you.", "Already Running", wx.OK | wx.ICON_ERROR | wx.CENTRE, ).ShowModal() raise SystemExit(1) self.reloadMessages() if show: self.Show()
#!/usr/bin/env python3 import asyncio import json import websockets import subprocess from util import logger from core.scanner import Scanner from util import project_manager as pm from util import upload as upload from util import raspi_state as raspi APP_PATH = '/home/pi/.wcscanner' USERS = set() scanner = Scanner() logger = logger.logger async def send_state_data(): """ Send complete list of projects data """ if USERS: data = dict() data['type'] = 'state_data' data['project_data'] = pm.get_projects_data() data['disk_usage_data'] = raspi.get_disk_info() await asyncio.wait([user.send(json.dumps(data)) for user in USERS])
class ServerWin(wx.Frame): def __init__(self, parent=None, id=-1, title='PypMsg: Main Window', show=False): self.clients = [] #self.server = Server(self.reloadMessages) self.server = Server() self.scanner = Scanner(Scanner.SERVER) self.scanner.listen() self.atchQueue = Queue.Queue() wx.Frame.__init__(self, parent, id, title, size=(600, 400)) wx.EVT_CLOSE(self, self.OnClose) #panel = wx.Panel(self, -1) splitter = wx.SplitterWindow(self) leftPanel = wx.Panel(splitter) rightPanel = wx.Panel(splitter) self.msgList = lists.PListCtrl(leftPanel) self.msgList.InsertColumn(0, 'User Name', width=100) self.msgList.InsertColumn(2, 'Message') self.msgList.InsertColumn(1, 'Address', width=80) self.msgList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.showFileList) self.msgList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.showMessage) #ipAddrCtrl = wx.StaticText(leftPanel, label='My IP Address: ') msgVbox = wx.BoxSizer(wx.VERTICAL) #msgVbox.Add(ipAddrCtrl, 0, wx.EXPAND) msgVbox.Add(self.msgList, 1, wx.EXPAND | wx.TOP, 10) self.filList = wx.ListCtrl(rightPanel, style=wx.LC_LIST) self.filList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.downloadAttachment) msgBtn = wx.Button(rightPanel, label='&New Message') msgBtn.Bind(wx.EVT_BUTTON, self.newMessageWin) relBtn = wx.Button(rightPanel, label="&Refresh") relBtn.Bind(wx.EVT_BUTTON, self.reloadMessages) clrBtn = wx.Button(rightPanel, label="&Clear") clrBtn.Bind(wx.EVT_BUTTON, self.clearMessages) btnVbox = wx.BoxSizer(wx.VERTICAL) btnVbox.Add( wx.StaticText(rightPanel, label='Attachments:\n(Double-Click to download)'), 0, wx.TOP) btnVbox.Add(self.filList, 1, wx.EXPAND) btnVbox.Add(msgBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(relBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(clrBtn, 0, wx.EXPAND | wx.TOP, 10) leftPanel.SetSizer(msgVbox) rightPanel.SetSizer(btnVbox) splitter.SplitVertically(leftPanel, rightPanel, -150) if not self.server.startServing(): wx.MessageDialog( None, 'An Instance of PypMsg is already running. Please close that before opening a new one. \ The current version of PypMsg does not support multiple-instances. Thank you.', 'Already Running', wx.OK | wx.ICON_ERROR | wx.CENTRE).ShowModal() raise SystemExit(1) self.reloadMessages() if show: self.Show() def addAttachment(self, atch): self.server.sentAttachments[atch[0]] = atch[1] def downloadAttachment(self, event): loc = wx.DirSelector(message='Select location to save attachment', parent=self) if not loc: return downloadStatus = self.server.downloadAttachment( self.msgList.GetNextSelected(-1), event.GetIndex(), loc, self.downloadComplete) def downloadComplete(self, atch, downloadStatus): if downloadStatus[:5] != 'ERROR': wx.MessageDialog(None, atch + ': ' + downloadStatus, 'Download', wx.OK | wx.ICON_INFORMATION | wx.CENTRE).ShowModal() else: self.server wx.MessageDialog(None, atch + ': ' + downloadStatus, 'Attachment', wx.OK | wx.ICON_ERROR | wx.CENTRE).ShowModal() def OnClose(self, event): self.server.stopServing() self.Destroy() def clearMessages(self, evt=None): self.msgList.DeleteAllItems() self.filList.DeleteAllItems() self.server.clearMessageQueue() def reloadMessages(self, evt=None): '''Currently removing all the messages in the list and repopulating it. This method gets really slow with large nos of messages. Remedy: 1. Limit the no. of messages to may be 100? 2. Handle large no. of messages through some kind of optimisations 3. Eliminate this system, everytime reload is called, only the new messages shoule be appended to the list. ''' self.filList.DeleteAllItems() self.msgList.DeleteAllItems() for (uname, addr, msg) in [(rec['USER'], rec['host'], rec['MSG']) for rec in self.server.msgQue]: self.msgList.Append([uname, addr, msg]) #arch = self.server.msgQue[-1] #self.msgList.Append([arch['host'], arch['MSG']]) print 'reloading messages done' def newMessageWin(self, event=None): self.clients.append( ClientWin(reportAttachment=self.addAttachment, parent=self, show=True)) def showFileList(self, event=None): self.filList.DeleteAllItems() for uid, atch in self.server.msgQue[event.GetIndex()]['atchs']: self.filList.Append([atch]) def showMessage(self, event=None): message = self.server.msgQue[event.GetIndex()]['MSG'] display = '''From: %(USER)s Address: %(host)s Message: %(MSG)s''' % self.server.msgQue[event.GetIndex()] wx.MessageDialog(None, display, "Details", wx.OK | wx.ICON_INFORMATION | wx.CENTRE).ShowModal() return
def __init__(self, parent=None, id=-1, title='PypMsg: Main Window', show=False): self.clients = [] #self.server = Server(self.reloadMessages) self.server = Server() self.scanner = Scanner(Scanner.SERVER) self.scanner.listen() self.atchQueue = Queue.Queue() wx.Frame.__init__(self, parent, id, title, size=(600, 400)) wx.EVT_CLOSE(self, self.OnClose) #panel = wx.Panel(self, -1) splitter = wx.SplitterWindow(self) leftPanel = wx.Panel(splitter) rightPanel = wx.Panel(splitter) self.msgList = lists.PListCtrl(leftPanel) self.msgList.InsertColumn(0, 'User Name', width=100) self.msgList.InsertColumn(2, 'Message') self.msgList.InsertColumn(1, 'Address', width=80) self.msgList.Bind(wx.EVT_LIST_ITEM_SELECTED, self.showFileList) self.msgList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.showMessage) #ipAddrCtrl = wx.StaticText(leftPanel, label='My IP Address: ') msgVbox = wx.BoxSizer(wx.VERTICAL) #msgVbox.Add(ipAddrCtrl, 0, wx.EXPAND) msgVbox.Add(self.msgList, 1, wx.EXPAND | wx.TOP, 10) self.filList = wx.ListCtrl(rightPanel, style=wx.LC_LIST) self.filList.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.downloadAttachment) msgBtn = wx.Button(rightPanel, label='&New Message') msgBtn.Bind(wx.EVT_BUTTON, self.newMessageWin) relBtn = wx.Button(rightPanel, label="&Refresh") relBtn.Bind(wx.EVT_BUTTON, self.reloadMessages) clrBtn = wx.Button(rightPanel, label="&Clear") clrBtn.Bind(wx.EVT_BUTTON, self.clearMessages) btnVbox = wx.BoxSizer(wx.VERTICAL) btnVbox.Add( wx.StaticText(rightPanel, label='Attachments:\n(Double-Click to download)'), 0, wx.TOP) btnVbox.Add(self.filList, 1, wx.EXPAND) btnVbox.Add(msgBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(relBtn, 0, wx.EXPAND | wx.TOP, 10) btnVbox.Add(clrBtn, 0, wx.EXPAND | wx.TOP, 10) leftPanel.SetSizer(msgVbox) rightPanel.SetSizer(btnVbox) splitter.SplitVertically(leftPanel, rightPanel, -150) if not self.server.startServing(): wx.MessageDialog( None, 'An Instance of PypMsg is already running. Please close that before opening a new one. \ The current version of PypMsg does not support multiple-instances. Thank you.', 'Already Running', wx.OK | wx.ICON_ERROR | wx.CENTRE).ShowModal() raise SystemExit(1) self.reloadMessages() if show: self.Show()
def test_scannerordinalclean_match(self): self.assertEqual(Scanner.ordinal_clean('12341234123412\x03'), '12341234123412')
self.dockArea.addDock(self.logViewDock) self.analysisDock = AnalysisDock(name='Analysis', size=(1, 1), globalSession=self.globalSession) self.dockArea.addDock(self.analysisDock, 'right') if __name__ == "__main__": # add freeze support freeze_support() # application variables title = "CRISTAL Logbook Viewer" app = QtGui.QApplication(sys.argv) captures = {} settings = SessionSettings() scanner = Scanner(settings) globalSession = GlobalSession(captures, scanner, settings) globalSession.stopProgram = True #this is not an acquisition program, so prevent threads to be spawned mainWindow = MainWindow(parent = None,\ globalSession = globalSession) mainWindow.setWindowTitle('CRISTAL Logbook Viewer') mainWindow.setObjectName(title) mainWindow.showMaximized() sys.exit(app.exec_())
class ClientWin(wx.Frame): def __init__(self, reportAttachment=lambda atchs: None, parent=None, id=-1, title='PypMsg: New Message', show=False): self.scanner = Scanner(Scanner.CLIENT) self.client = Client(reportAttachment) self.userList = [] wx.Frame.__init__(self, parent, id, title, size=(450,300)) panel = wx.Panel(self, -1) #self.hostCtrl = wx.TextCtrl(panel) self.messCtrl = wx.TextCtrl(panel, style=wx.TE_MULTILINE | wx.VSCROLL) fgs = wx.FlexGridSizer(rows = 2, cols = 2, vgap = 7, hgap = 15) fgs.AddMany([ # (wx.StaticText(panel, label='Host IP')), # (self.hostCtrl, 1, wx.EXPAND), (wx.StaticText(panel, label='Message')), (self.messCtrl, 1, wx.EXPAND) ]) #fgs.AddGrowableRow(1, 1) fgs.AddGrowableCol(1, 1) self.atchList = wx.ListCtrl(panel, style=wx.LC_LIST) dp = AttachmentDropTarget(self.onDropFiles) self.atchList.SetDropTarget(dp) remAtchBtn = wx.Button(panel, label='&Remove') remAtchBtn.Bind(wx.EVT_BUTTON, self.remAttachment) sendBtn = wx.Button(panel, label='&Send') sendBtn.Bind(wx.EVT_BUTTON, self.sendMsg) refreshBtn = wx.Button(panel, label='Re&fresh') refreshBtn.Bind(wx.EVT_BUTTON, lambda event: self.reloadMembers()) self.memList = lists.PListCtrl(panel) self.memList.InsertColumn(0, 'User Name') self.memList.InsertColumn(1, 'Address') vbox2 = wx.BoxSizer(wx.VERTICAL) vbox2.Add(self.memList, 1, wx.EXPAND) vbox2.Add(fgs, 0, wx.EXPAND | wx.TOP, 10) vbox1 = wx.BoxSizer(wx.VERTICAL) vbox1.Add(wx.StaticText(panel, label='Attachments:'), 0, wx.EXPAND | wx.BOTTOM, 5) vbox1.Add(self.atchList, 1, wx.EXPAND | wx.ALL) vbox1.Add(remAtchBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(refreshBtn, 0, wx.EXPAND | wx.TOP, 10) vbox1.Add(sendBtn, 0, wx.EXPAND | wx.TOP, 10) hbox = wx.BoxSizer() hbox.Add(vbox2, 1, wx.EXPAND | wx.ALL, 15) hbox.Add(vbox1, .2, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.RIGHT, 15) panel.SetSizer(hbox) if show: self.Show() self.reloadMembers() def sendMsg(self, event): if not self.memList.GetSelectedItemCount(): wx.MessageDialog(None, 'Please select recipient user(s) from the user list', 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() return nextSel = self.memList.GetNextSelected(-1) while nextSel != -1: self.client.sendMsg(self.memList.GetItem(nextSel, col=1).GetText(), self.messCtrl.GetValue()) nextSel = self.memList.GetNextSelected(nextSel) self.Close() def reloadMembers(self): print 'reloading members in the list' self.memList.DeleteAllItems() self.scanner.scan(self.userHandler) def onDropFiles(self, filenames): for file in filenames: self.addAttachment(file) def addAttachment(self, atch): atchStatus = self.client.addAttachment(atch) if 'Success' in atchStatus: self.atchList.Append([atch]) else: wx.MessageDialog(None, atchStatus, 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() def remAttachment(self, event): atch = self.atchList.GetNextSelected(-1) if not atch >= 0: wx.MessageDialog(None, 'Please select an attachment from the list to be removed.', 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() return remStatus = self.client.remAttachment(self.atchList.GetItemText(atch)) if 'Success' in remStatus: self.atchList.DeleteItem(atch) else: wx.MessageDialog(None, remStatus, 'Attachment', wx.OK | wx.ICON_EXCLAMATION | wx.CENTRE).ShowModal() def userHandler(self, username, address): self.memList.Append([username, address])
def launch(self): self.setSettings() self.disableAll() if self.settings.laser == 'CW Laser Voltage Scan Without Wavemeter' : totalProc = 3 else: totalProc = 4 if not self.settings.cristalMode: totalProc = 1 # application variables title = "cristal - Data Acquisition for CRIS" self.progress = 0 self.progressBar = QtGui.QProgressBar(\ format = 'Work package %v out of %m complete') self.progressBar.setStyleSheet(""" QProgressBar { border: 2px solid grey; border-radius: 5px; text-align: center; } QProgressBar::chunk { background-color: #52bdec; width: 20px; } """) self.progressBar.setRange(0,totalProc) self.layout.addWidget(self.progressBar,20,0,1,2) self.progressEdit = QtGui.QTextEdit() self.progressEdit.setReadOnly(True) self.progressEdit.setMinimumHeight(60) self.layout.addWidget(self.progressEdit,21,0,1,2) QtGui.QApplication.processEvents() captures = {} scanner = Scanner(self.settings) globalSession = GlobalSession(captures,scanner,self.settings) scanner.startProcesses() QtGui.QApplication.processEvents() while self.progress < totalProc: try: message = scanner.messageQueue.get_nowait() if message[0]: self.progress = self.progress + 1 self.updateProgressBar(message[1]) else: self.updateProgressBar(message[1]) except: time.sleep(0.005) QtGui.QApplication.processEvents() self.progressEdit.setHtml('Launching CRISTAL...') self.launched.emit(globalSession)
def launch(self): self.setSettings() self.disableAll() if self.settings.laser == 'CW Laser Voltage Scan Without Wavemeter': totalProc = 3 else: totalProc = 4 if not self.settings.cristalMode: totalProc = 1 # application variables title = "cristal - Data Acquisition for CRIS" self.progress = 0 self.progressBar = QtGui.QProgressBar(\ format = 'Work package %v out of %m complete') self.progressBar.setStyleSheet(""" QProgressBar { border: 2px solid grey; border-radius: 5px; text-align: center; } QProgressBar::chunk { background-color: #52bdec; width: 20px; } """) self.progressBar.setRange(0, totalProc) self.layout.addWidget(self.progressBar, 20, 0, 1, 2) self.progressEdit = QtGui.QTextEdit() self.progressEdit.setReadOnly(True) self.progressEdit.setMinimumHeight(60) self.layout.addWidget(self.progressEdit, 21, 0, 1, 2) QtGui.QApplication.processEvents() captures = {} scanner = Scanner(self.settings) globalSession = GlobalSession(captures, scanner, self.settings) scanner.startProcesses() QtGui.QApplication.processEvents() while self.progress < totalProc: try: message = scanner.messageQueue.get_nowait() if message[0]: self.progress = self.progress + 1 self.updateProgressBar(message[1]) else: self.updateProgressBar(message[1]) except: time.sleep(0.005) QtGui.QApplication.processEvents() self.progressEdit.setHtml('Launching CRISTAL...') self.launched.emit(globalSession)