Пример #1
0
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
Пример #2
0
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'])
Пример #3
0
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
Пример #4
0
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'])