def clientSendCmd(commPipes, cmd): '''Send a request using named pipes to the projectInterface for handling. This allows a separate client process to make requests of the projectInterface process. It writes the request on fd_out and recieves the reply on fd_in. ''' data = None savedError = None incomplete = True while incomplete: commPipes.fd_out.write(json.dumps(cmd) + os.linesep) msg = commPipes.fd_in.readline() if len(msg) == 0: # fifo closed raise StateError('commPipe closed') response = json.loads(msg) status = response.get('status', -1) if status != 200: raise RequestError( 'clientSendCmd: Cmd: {} status {}: error {}'.format( cmd.get('cmd'), status, response.get('error'))) if 'data' in response: try: data = unpackDataMessage(response) except Exception as err: # The call may be incomplete, save the error and keep receiving as needed logging.error('clientSendCmd: {}'.format(err)) if savedError is None: savedError = err cmd['callId'] = response.get('callId', -1) # Check if need to continue to get more parts incomplete = response.get('incomplete', False) if savedError: raise RequestError('clientSendCmd: {}'.format(savedError)) retVals = StructDict() retVals.statusCode = response.get('status', -1) if 'filename' in response: retVals.filename = response['filename'] if 'fileList' in response: retVals.fileList = response['fileList'] if 'fileTypes' in response: retVals.fileTypes = response['fileTypes'] if data: retVals.data = data if retVals.filename is None: raise StateError('clientSendCmd: filename field is None') return retVals
def processPyScriptRequest(request): if 'cmd' not in request: raise StateError('handleFifoRequests: cmd field not in request: {}'.format(request)) cmd = request['cmd'] route = request.get('route') localtimeout = request.get('timeout', 10) + 5 response = StructDict({'status': 200}) if route == 'dataserver': try: response = Web.sendDataMsgFromThread(request, timeout=localtimeout) 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)) Web.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} Web.setUserError(errStr) logging.error('handleFifo Excpetion: {}'.format(errStr)) raise err else: if cmd == 'webCommonDir': response.filename = CommonOutputDir elif cmd == 'resultValue': try: # forward to bioFeedback Display Web.sendBiofeedbackMsgFromThread(json.dumps(request)) # forward to main browser window Web.sendUserMsgFromThread(json.dumps(request)) # Accumulate results locally to resend to browser as needed Web.addResultValue(request) except Exception as err: errStr = 'SendClassification Exception type {}: error {}:'.format(type(err), str(err)) response = {'status': 400, 'error': errStr} Web.setUserError(errStr) logging.error('handleFifo Excpetion: {}'.format(errStr)) raise err elif cmd == 'subjectDisplay': logging.info('subjectDisplay projectInterface Callback') return response