Ejemplo n.º 1
0
    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__()
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
    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()
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
    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()
Ejemplo n.º 7
0
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])
Ejemplo n.º 8
0
	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)
Ejemplo n.º 9
0
# 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
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
    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()
Ejemplo n.º 12
0
#!/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])

Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
    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()
Ejemplo n.º 15
0
 def test_scannerordinalclean_match(self):
     self.assertEqual(Scanner.ordinal_clean('12341234123412\x03'),
                      '12341234123412')
Ejemplo n.º 16
0
        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_())
Ejemplo n.º 17
0
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])
Ejemplo n.º 18
0
    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)
Ejemplo n.º 19
0
    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)