def completeTask(messageQueue, IOLock, task, resultData, resultsDirectory): '''unzips resultData in results/taskName, writes task into completedTasks.txt Args: - messageQueue -- queue used for logging - IOLock -- the lock that must be acquired when reading or writing data - task -- the task that was completed - resultData -- a zip file containing the results from the client loaded into memory as a zip file ''' IOLock.acquire() pathToResult = '' try: #write results to file #--------------------- taskName = task.split(',')[0] pathToResult = os.path.join(resultsDirectory,taskName) pathToCompletedTasks = os.path.join(resultsDirectory,'completedTasks.txt') #check if directory already exists, if it does, that means the task name was not unique if os.path.isdir(pathToResult): #add a counter to the task counter = 1 pathToResult = os.path.join(resultsDirectory,taskName+str(counter)) while(os.path.isdir(pathToResult)): #Note that counter will not overflow, as pythons ints are limited by address space, see http://stackoverflow.com/questions/9860588/maximum-value-for-long-integer so there will be other issues long before counter gets to big counter = counter+1; pathToResult = os.path.join(resultsDirectory,taskName+str(counter)) messageQueue.put(UtilityFunctions.createLogEntry('err','The following taskname is not unique: '+taskName+' the taskname was stored as: ' + taskName+str(counter))) #unzip results into pathToResult resultHandle = open('./server/temp/results.zip','w') resultHandle.writelines(resultData) resultHandle.close() os.makedirs(pathToResult) UtilityFunctions.unzipFile('./server/temp/results.zip',pathToResult) os.remove('./server/temp/results.zip') #update the completedTasks.txt file in temp to include the completed task if os.path.isfile(pathToCompletedTasks) and os.path.getsize(pathToCompletedTasks)>0: completedTasksLogHandle = open(pathToCompletedTasks,'a') else: completedTasksLogHandle = open(pathToCompletedTasks,'w') completedTasksLogHandle.write(task+'\n') completedTasksLogHandle.close() messageQueue.put(UtilityFunctions.createLogEntry('inf','Successfuly stored result for task: ' + task)) except: messageQueue.put(UtilityFunctions.createLogEntry('deb','error in ServerSideTaskHandler.completeTask:\n'+traceback.format_exc()+'\ntask' + task)) raise finally: IOLock.release() return pathToResult
def handleClientTask(messageQueue, serverMessage,resultsDirectory): '''Processes a task received by the server Args: - messageQueue -- queue used for logging - serverMessge -- message received from server ''' temporaryDirectory = './client/temp' if serverMessage['messageType'] == 'task': #write task to file clientScript = zlib.decompress(serverMessage['task'])#decompress the clientScriptHandle = open(os.path.join(temporaryDirectory,'clientTask.py'),'w') clientScriptHandle.writelines(clientScript) clientScriptHandle.close() dataDirectory = None #if data exists, write data to file and extract it to ./temp/receivedData if not serverMessage['data'] == None: dataDirectory = os.path.join(temporaryDirectory,'receivedData') os.mkdir(dataDirectory) dataHandle = open(os.path.join(temporaryDirectory,'data.zip'),'w') dataHandle.writelines(serverMessage['data']) dataHandle.close() UtilityFunctions.unzipFile(os.path.join(temporaryDirectory,'data.zip'), dataDirectory) #execute received script subprocess.call(['python',os.path.join(temporaryDirectory,'clientTask.py'),os.path.abspath(dataDirectory) ,os.path.abspath(resultsDirectory),]) #cleanup temp folder UtilityFunctions.deleteContentsOfDirectory(temporaryDirectory) else: raise Exception('received an unknown Message type from the server. The type received was: '+serverMessage['task'])
def handleClientTask(messageQueue, serverMessage, resultsDirectory): '''Processes a task received by the server Args: - messageQueue -- queue used for logging - serverMessge -- message received from server ''' temporaryDirectory = './client/temp' if serverMessage['messageType'] == 'task': #write task to file clientScript = zlib.decompress(serverMessage['task']) #decompress the clientScriptHandle = open( os.path.join(temporaryDirectory, 'clientTask.py'), 'w') clientScriptHandle.writelines(clientScript) clientScriptHandle.close() dataDirectory = None #if data exists, write data to file and extract it to ./temp/receivedData if not serverMessage['data'] == None: dataDirectory = os.path.join(temporaryDirectory, 'receivedData') os.mkdir(dataDirectory) dataHandle = open(os.path.join(temporaryDirectory, 'data.zip'), 'w') dataHandle.writelines(serverMessage['data']) dataHandle.close() UtilityFunctions.unzipFile( os.path.join(temporaryDirectory, 'data.zip'), dataDirectory) #execute received script subprocess.call([ 'python', os.path.join(temporaryDirectory, 'clientTask.py'), os.path.abspath(dataDirectory), os.path.abspath(resultsDirectory), ]) #cleanup temp folder UtilityFunctions.deleteContentsOfDirectory(temporaryDirectory) else: raise Exception( 'received an unknown Message type from the server. The type received was: ' + serverMessage['task'])