Ejemplo n.º 1
0
def start_deleter():
    """Launch the deleter process as a daemon this ensure that the deleter
    process will end on parent process termination"""
    pm = ProcessManager.get_instance()
    thread = Process(target=deleter, daemon=True)
    pm.add_process('deleter', thread)
    pm.start_process('deleter')
def solve_hdd():
    pm = ProcessManager.get_instance()
    if not sessions.check_session():
        return {"text": "No ambiguities data available execute a full analysis first"}, 400
    if not session['ambiguities']:
        queue = pm.get_queue(session['id'])
        if not queue:
            return {"text": "No ambiguities data available execute a full analysis first"}, 400
        else: 
            session['ambiguities'] = queue.get()
    payload = {}
    file_path = session['model']
    if os.path.isfile(file_path):
        dis = Disambiguator.from_file(file_path)
        dis.remove_transitions(session['ambiguities']['dead'])
        dis.solve_hidden_deadlocks(session['ambiguities']['hidden'])
        pm.delete_queue(session['id'])
        graph = graphviz.Graph(dis.get_graph())
        payload['mts'] = graph.get_mts()
        payload['text'] = "Removed hidden deadlocks and dead transitions"
        payload['graph'] = graph.get_graph()
        payload['edges'], payload['nodes'] = graph.get_graph_number()
        graph.draw_graph(session['graph'])
        return payload, 200
    return {"text": 'File not found'}, 400
def stop_process():
    pm = ProcessManager.get_instance()
    session.pop('position', None)
    if 'id' in session and session['id']:
        pm.end_process(session['id'])
    sessions.delete_output_file()
    session.pop('id', None)
    session.pop('ambiguities', None)
    return {"text":'Stopped process'}, 200
Ejemplo n.º 4
0
def update_session_timeout():
    """Updates timeout for valid sessions and updates last modification
    time for existing files related to the session"""
    pm = ProcessManager.get_instance()
    if 'id' in session:
        lock = pm.get_lock(session['id'])
        if lock:
            with lock:
                return update()
    return update()
Ejemplo n.º 5
0
def get_output():
    pm = ProcessManager.get_instance()
    if not sessions.check_session():
        sessions.delete_output_file()
        return {"text": '\nSession timed-out'}, 404
    elif not 'id' in session or not pm.process_exists(session['id']):
        sessions.delete_output_file()
        return {"text": ''}, 404
    else:
        if pm.is_alive(session['id']):
            with open(session['output']) as out:
                out.seek(session['position'])
                result = out.read(4096)
                session['position'] = out.tell()
            return {"text": result}, 206
        else:
            with open(session['output']) as out:
                out.seek(session['position'])
                result = out.read()
            os.remove(session['output'])
            queue = pm.get_queue(session['id'])
            payload = {}
            payload['text'] = result
            graph = graphviz.Graph.from_file(session['model'])
            payload['edges'], payload['nodes'] = graph.get_graph_number()
            payload['mts'] = graph.get_mts()
            if (queue):
                tmp = queue.get()['ambiguities']
                session['ambiguities'] = tmp
                payload['ambiguities'] = tmp
                ProcessManager.get_instance().delete_queue(session['id'])
                try:
                    dis = Disambiguator.from_file(session['model'])
                    dis.highlight_ambiguities(tmp['dead'], tmp['false'],
                                              tmp['hidden'])
                    payload['graph'] = dis.get_graph()
                    graphviz.Graph(dis.get_graph()).draw_graph(
                        session['graph'])
                    return payload, 200
                except:
                    return payload, 200
            return payload, 200
Ejemplo n.º 6
0
def check_session():
    """Check if the current session is still valid by verifying if the
    timeout value is still bigger than the current time."""
    pm = ProcessManager.get_instance()
    if 'id' in session:
        lock = pm.get_lock(session['id'])
        if lock:
            with lock:
                return ('timeout' in session and session['timeout'] is not None
                        and session['timeout'] > time.time())
    else:
        return ('timeout' in session and session['timeout'] is not None
                and session['timeout'] > time.time())
Ejemplo n.º 7
0
def close_session():
    """Closes a session by deleting all of its related files and by freeing
    the related session dictionary."""
    pm = ProcessManager.get_instance()
    session.pop('timeout', None)
    session.pop('position', None)
    if 'id' in session and session['id']:
        pm.end_process(session['id'])
        pm.delete_lock(session['id'])
    delete_output_file(True)
    session.pop('id', None)
    session.pop('output', None)
    session.pop('ambiguities', None)
    session.pop('graph', None)
    session.pop('counter_graph', None)
    session.pop('model', None)
def hdead_analyser():
    pm = ProcessManager.get_instance()
    queue = Queue()
    lock = Lock()
    sessions.update_session_timeout()
    file_path = session['model']
    if os.path.isfile(file_path):
        thread = Process(target=hdead_analysis_worker,
                args=[file_path, session['output'], queue])
        session['id'] = str(thread.name)
        pm.add_process(key=session['id'], process=thread)
        pm.add_queue(session['id'], queue)
        pm.start_process(session['id'])
        pm.add_lock(session['id'], lock)
        session['position'] = 0
        return "Processing data..."
    return {"text": 'File not found'}, 400
Ejemplo n.º 9
0
def run_vmc():
    pm = ProcessManager.get_instance()
    if not session['ambiguities']:
        queue = pm.get_queue(session['id'])
        if not queue:
            raise VmcException(
                "No ambiguities data available execute a full analysis first")
        else:
            session['ambiguities'] = queue.get()
    if (len(session['ambiguities']['hidden']) != 0):
        raise VmcException(
            "Hidden deadlocks detected. It is necessary to remove them before checking the property"
        )

    folder = session['output'].split('-output')[0]
    model = os.path.join(folder, 'model.txt')
    properties = os.path.join(folder, 'properties.txt')

    try:
        if sys.platform.startswith('linux'):
            vmc = VmcController(app.config['VMC_LINUX'])
        elif sys.platform.startswith('win'):
            vmc = VmcController(app.config['VMC_WINDOWS'])
        elif sys.platform.startswith('cygwin'):
            vmc = VmcController(app.config['VMC_WINDOWS'])
        elif sys.platform.startswith('darwin'):
            vmc = VmcController(app.config['VMC_MAC'])
        else:
            raise VmcException(
                "VMC is not compatible with your operating system")
        vmc.run_vmc(model, properties)
    except ValueError as ve:
        err = str(ve).strip()
        if os.path.isdir(folder):
            shutil.rmtree(folder)
        if err == 'Invalid vmc_path':
            raise VmcException("Unable to locate VMC executable")
        if err == 'Invalid model file':
            raise VmcException('Invalid model file')
        if err == 'Invalid properties file':
            raise VmcException('Invalid properties file')
    except:
        shutil.rmtree(folder)
        raise VmcException('An error occured')
    shutil.rmtree(folder)
    return vmc
Ejemplo n.º 10
0
def translate_model():
    pm = ProcessManager.get_instance()
    if not session['ambiguities']:
        queue = pm.get_queue(session['id'])
        if not queue:
            raise VmcException(
                "No ambiguities data available execute a full analysis first")
        else:
            session['ambiguities'] = queue.get()
    if (len(session['ambiguities']['hidden']) != 0):
        raise VmcException(
            "Hidden deadlocks detected. It is necessary to remove them before checking the property"
        )

    fpath = session['model']
    actl_property = request.form['property']
    if (len(actl_property) == 0):
        raise VmcException('Missing property to be verified')

    if os.path.isfile(fpath):
        translator = Translator()
        translator.load_model(fpath)
        translator.translate()
        folder = session['output'].split('-output')[0]
        try:
            os.mkdir(folder)
        except FileExistsError:
            #if the directory is already present continue
            pass

        model = os.path.join(folder, 'model.txt')
        properties = os.path.join(folder, 'properties.txt')
        with open(model, "w") as mts:
            mts.write(translator.get_output())
            mts.flush()
        with open(properties, "w") as prop_file:
            prop_file.write(actl_property)
            prop_file.flush()
    else:
        raise VmcException('Unable to translate, FTS model not found.')
Ejemplo n.º 11
0
 def test_add_not_a_queue(self):
     pm = ProcessManager.get_instance()
     with pytest.raises(Exception, match=r'queue must be instance of'):
         pm.add_queue('add_queue', "NOT A QUEUE")
Ejemplo n.º 12
0
 def test_delete_queue(self):
     pm = ProcessManager.get_instance()
     pm.delete_queue('add_queue')
     assert pm.get_queue('add_queue') == None
Ejemplo n.º 13
0
 def test_start_non_existing_process(self):
     pm = ProcessManager.get_instance()
     with pytest.raises(KeyError, match=r'nothing'):
         pm.start_process('nothing')
Ejemplo n.º 14
0
 def test_add_queue(self, queue):
     pm = ProcessManager.get_instance()
     pm.add_queue('add_queue', queue)
     assert len(pm.queue) == 1
Ejemplo n.º 15
0
 def test_get_instance_error(self):
     pm1 = ProcessManager.get_instance()
     with pytest.raises(Exception,
                        match=r"A ProcessManager instance already exists"):
         pm2 = ProcessManager()
Ejemplo n.º 16
0
 def test_add_non_existing_process(self):
     pm = ProcessManager.get_instance()
     assert not pm.process_exists('nothing')
Ejemplo n.º 17
0
 def test_kill_process(self, masked_proc):
     pm = ProcessManager.get_instance()
     pm.add_process('kill', masked_proc)
     pm.start_process('kill')
     pm.end_process('kill')
     assert not (pm.is_alive('kill') or pm.process_exists('kill'))
def get_vmc():
    pm = ProcessManager.get_instance()
    if not session['ambiguities']:
        queue = pm.get_queue(session['id'])
        if not queue:
            raise VmcException("No ambiguities data available execute a full analysis first")
        else:
            session['ambiguities'] = queue.get()
    if (len(session['ambiguities']['hidden']) != 0):
        raise VmcException("Hidden deadlocks detected. It is necessary to remove them before checking the property")

    fpath = session['model']
    actl_property = request.form['property']
    if (len(actl_property) == 0):
        raise VmcException('Missing property to be verified')

    if os.path.isfile(fpath):
        translator = Translator()
        translator.load_model(fpath)
        translator.translate()
        session_tmp_folder = session['output'].split('-output')[0]
        try:
            os.mkdir(session_tmp_folder)
        except FileExistsError:
            #if the directory is already present continue
            pass

        session_tmp_model = os.path.join(session_tmp_folder, 'model.txt')
        session_tmp_properties = os.path.join(session_tmp_folder, 'properties.txt')
        with open(session_tmp_model,"w") as vmc_file:
            vmc_file.write(translator.get_output())
        with open(session_tmp_properties,"w") as prop_file:
            prop_file.write(actl_property)

        try:
            if sys.platform.startswith('linux'):
                vmc = VmcController(VMC_LINUX)
            elif sys.platform.startswith('win'):
                vmc = VmcController(VMC_WINDOWS)
            elif sys.platform.startswith('cygwin'):
                vmc = VmcController(VMC_WINDOWS)
            elif sys.platform.startswith('darwin'):
                vmc = VmcController(VMC_MAC)
            else:
                raise VmcException("VMC is not compatible with your operating system")
            vmc.run_vmc(session_tmp_model,session_tmp_properties)
        except ValueError as ve:
            if str(ve) == 'Invalid vmc_path':
                shutil.rmtree(session_tmp_folder)
                raise VmcException("Unable to locate VMC executable")
            if str(ve) == 'Invalid model file':
                shutil.rmtree(session_tmp_folder)
                raise VmcException('Invalid model file')
            if str(ve) == 'Invalid properties file':
                shutil.rmtree(session_tmp_folder)
                raise VmcException('Invalid properties file')
        except:
            shutil.rmtree(session_tmp_folder)
            raise VmcException('An error occured')
        shutil.rmtree(session_tmp_folder)
        return vmc, translator
    raise VmcException('File not found')
Ejemplo n.º 19
0
 def test_is_alive(self):
     pm = ProcessManager.get_instance()
     pm.start_process('add_process')
     assert pm.is_alive('add_process')
Ejemplo n.º 20
0
 def test_end_process(self):
     pm = ProcessManager.get_instance()
     pm.end_process('add_process')
     assert not (pm.is_alive('add_process')
                 or pm.process_exists('add_process'))
Ejemplo n.º 21
0
 def test_delete_non_existing_queue(self):
     pm = ProcessManager.get_instance()
     nqueue = len(pm.queue)
     pm.delete_queue('nothing')
     assert nqueue == len(pm.queue)
Ejemplo n.º 22
0
 def test_add_not_a_process(self):
     pm = ProcessManager.get_instance()
     with pytest.raises(Exception, match=r"process must be instance of"):
         pm.add_process('add_process', "NOT A PROCESS")
Ejemplo n.º 23
0
 def test_add_process(self, process):
     pm = ProcessManager.get_instance()
     pm.add_process('add_process', process)
     assert pm.process_exists('add_process')
Ejemplo n.º 24
0
 def test_get_non_existing_queue(self):
     pm = ProcessManager.get_instance()
     assert pm.get_queue('nothing') == None
Ejemplo n.º 25
0
 def test_process_dont_exists(self):
     pm = ProcessManager.get_instance()
     assert not pm.process_exists('nothing')
Ejemplo n.º 26
0
 def test_get_queue(self):
     pm = ProcessManager.get_instance()
     assert pm.get_queue('add_queue')
Ejemplo n.º 27
0
 def test_end_non_existing_process(self):
     pm = ProcessManager.get_instance()
     nproc = len(pm.proc)
     pm.end_process('nothing')
     assert len(pm.proc) == nproc
Ejemplo n.º 28
0
 def test_is_not_alive(self):
     pm = ProcessManager.get_instance()
     assert not pm.is_alive('add_process')
Ejemplo n.º 29
0
 def test_get_instance(self):
     pm1 = ProcessManager.get_instance()
     pm2 = ProcessManager.get_instance()
     assert pm1 == pm2