|
- from servicethread import OneShotServiceThread
- import subprocess
-
- import shutil
- from project_reader import ProjectReader
-
- global_variables = {}
-
- class ExecutorThread(OneShotServiceThread):
- def __init__(self, ip, port, clientsocket, **kwargs):
- super().__init__(ip, port, clientsocket)
- self.projects = kwargs['projects'] if 'projects' in kwargs else None
-
- def execute(self):
- projects = self.projects
- if project is None:
- reader = ProjectReader()
- projects = {sc.get_project_label(): sc for sc in reader.get_project_classes()}
- print('Warning: need to research the projects.')
- else:
- print('Already have projects')
-
- data = self.protocol.get_data()
- self.protocol.please_assert(data)
- self.protocol.please_assert('project' in data)
- self.protocol.please_assert(data['project'] in projects)
- self.protocol.send_ack()
-
- # Get the project
- project = projects[data['project']]
-
- # Make the compilation
- if False:
- print('Compiling binary...')
-
- # Adapt the project source
- with open('binaries/Frodo/frodo-base.c', 'r') as _src_file:
- content = _src_file.read()
- with open('binaries/Frodo/frodo.c', 'w') as _dst_file:
- _dst_file.write(content.replace('%NEED_TO_FILL%', str(n)))
-
- # Compile the project
- make_directory = 'projects/{}/{}'.format(project.get_project_directory(), project.get_make_directory())
- process = subprocess.Popen('make', shell=True, cwd=make_directory, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- output, error = process.communicate()
- if error and ('error' in error.decode('latin-1')):
- print("Error to compile")
- print(error)
- raise Exception()
-
- # Save last compilation data
- global_variables[project_name] = {
- 'last_n': n,
- }
-
- # Generate the trace by launching ELMO
- command = './elmo ../projects/{}/{}'.format(project.get_project_directory(), project.get_binary())
- process = subprocess.Popen(command, shell=True, cwd='elmo_online/elmo/', executable='/bin/bash', stdout=subprocess.PIPE)
- output, error = process.communicate()
-
- # Send results
- self.protocol.send_data({
- 'output': output.decode('latin-1') if output else None,
- 'error': error.decode('latin-1') if error else None,
- })
- self.protocol.close()
|