def webPipeCallback(request):
     if 'cmd' not in request:
         raise StateError('handleFifoRequests: cmd field not in request: {}'.format(request))
     cmd = request['cmd']
     route = request.get('route')
     response = StructDict({'status': 200})
     if route == 'dataserver':
         try:
             response = RtAttenWeb.webServer.sendDataMsgFromThread(request, timeout=10)
             if response is None:
                 raise StateError('handleFifoRequests: Response None from sendDataMessage')
             if 'status' not in response:
                 raise StateError('handleFifoRequests: status field missing from response: {}'.format(response))
             if response['status'] not in (200, 408):
                 if 'error' not in response:
                     raise StateError('handleFifoRequests: error field missing from response: {}'.format(response))
                 RtAttenWeb.webServer.setUserError(response['error'])
                 logging.error('handleFifo status {}: {}'.format(response['status'], response['error']))
         except Exception as err:
             errStr = 'SendDataMessage Exception type {}: error {}:'.format(type(err), str(err))
             response = {'status': 400, 'error': errStr}
             RtAttenWeb.webServer.setUserError(errStr)
             logging.error('handleFifo Excpetion: {}'.format(errStr))
             raise err
     else:
         if cmd == 'webCommonDir':
             response.filename = CommonOutputDir
         elif cmd == 'classificationResult':
             try:
                 predict = request['value']
                 runId = request.get('runId')
                 # predict has {'catsep': val, 'vol': val}
                 catsep = predict.get('catsep')
                 vol = predict.get('vol')
                 # Test for NaN by comparing value to itself, if not equal then it is NaN
                 if catsep is not None and catsep == catsep:
                     image_b64Str = RtAttenWeb.createFeedbackImage(vol, catsep)
                     cmd = {'cmd': 'subjectDisplay', 'data': image_b64Str}
                     RtAttenWeb.webServer.sendSubjMsgFromThread(json.dumps(cmd))
                     # also update clinician window
                     # change classification value range to 0 to 1 instead of -1 to 1
                     # classVal = (catsep + 1) / 2
                     cmd = {'cmd': 'classificationResult', 'classVal': catsep, 'vol': vol, 'runId': runId}
                     RtAttenWeb.webServer.sendUserMsgFromThread(json.dumps(cmd))
             except Exception as err:
                 errStr = 'SendClassification Exception type {}: error {}:'.format(type(err), str(err))
                 response = {'status': 400, 'error': errStr}
                 RtAttenWeb.webServer.setUserError(errStr)
                 logging.error('handleFifo Excpetion: {}'.format(errStr))
                 raise err
         elif cmd == 'subjectDisplay':
             # forward to subject window
             color = request.get('bgcolor')
             if color is not None:
                 image_b64Str = RtAttenWeb.createSolidColorImage(color)
                 cmd = {'cmd': 'subjectDisplay', 'data': image_b64Str}
                 RtAttenWeb.webServer.sendSubjMsgFromThread(json.dumps(cmd))
             else:
                 RtAttenWeb.webServer.sendSubjMsgFromThread(request)
     return response
Exemple #2
0
def clientWebpipeCmd(webpipes, cmd):
    '''Send a web request using named pipes to the web server for handling.
    This allows a separate client process to make requests of the web server process.
    It writes the request on fd_out and recieves the reply on fd_in.
    '''
    webpipes.fd_out.write(json.dumps(cmd) + os.linesep)
    msg = webpipes.fd_in.readline()
    if len(msg) == 0:
        # fifo closed
        raise StateError('WebPipe closed')
    response = json.loads(msg)
    retVals = StructDict()
    decodedData = None
    if 'status' not in response:
        raise StateError(
            'clientWebpipeCmd: status not in response: {}'.format(response))
    retVals.statusCode = response['status']
    if retVals.statusCode == 200:  # success
        if 'filename' in response:
            retVals.filename = response['filename']
        if 'data' in response:
            decodedData = b64decode(response['data'])
            if retVals.filename is None:
                raise StateError('clientWebpipeCmd: filename field is None')
            retVals.data = formatFileData(retVals.filename, decodedData)
    elif retVals.statusCode not in (200, 408):
        raise RequestError('WebRequest error: status {}: {}'.format(
            retVals.statusCode, response['error']))
    return retVals
Exemple #3
0
 def retrieveFile(self, filename):
     print("Retrieving data for {}... ".format(filename), end='')
     fileInfo = StructDict()
     fileInfo.subjectNum = self.id_fields.subjectNum
     fileInfo.subjectDay = self.id_fields.subjectDay
     fileInfo.filename = filename
     stime = time.time()
     replyId = self.rtatten.RetrieveData.remote(fileInfo)
     reply = ray.get(replyId)
     assert reply.success is True
     print("took {:.2f} secs".format(time.time() - stime))
     clientFile = os.path.join(self.dirs.dataDir, filename)
     writeFile(clientFile, reply.data)
     serverFile = os.path.join(self.dirs.serverDataDir, filename)
     if not os.path.exists(serverFile):
         try:
             os.symlink(clientFile, serverFile)
         except OSError:
             print("Unable to link file %s", serverFile)
 def retrieveFile(self, filename):
     fileInfo = StructDict()
     fileInfo.subjectNum = self.id_fields.subjectNum
     fileInfo.subjectDay = self.id_fields.subjectDay
     fileInfo.filename = filename
     if self.cfg.session.useSessionTimestamp is True:
         fileInfo.findNewestPattern = re.sub(r'T\d{6}', 'T*', filename)
         print("Retrieving newest file for {}... ".format(
             fileInfo.findNewestPattern),
               end='')
     else:
         print("Retrieving file {}... ".format(filename), end='')
     stime = time.time()
     reply = self.sendCmdExpectSuccess(MsgEvent.RetrieveData, fileInfo)
     retFilename = reply.fields.filename
     print("took {:.2f} secs".format(time.time() - stime))
     clientFile = os.path.join(self.dirs.dataDir, retFilename)
     writeFile(clientFile, reply.data)
     serverFile = os.path.join(self.dirs.serverDataDir, retFilename)
     if not os.path.exists(serverFile):
         try:
             os.symlink(clientFile, serverFile)
         except OSError:
             logging.error("Unable to link file %s", serverFile)