From 64911e7fc0d67337379b649f0677d07c33c6dc8e Mon Sep 17 00:00:00 2001
From: shinedday <shinedday@gmail.com>
Date: Wed, 11 May 2022 13:36:12 +0200
Subject: [PATCH] iotAmak v1

---
 .gitignore                                 |   4 +-
 README.md                                  |   3 +
 dist/iotAmak-0.0.1-py3-none-any.whl        | Bin 0 -> 10793 bytes
 ihm.py                                     | 145 ------------------
 __init__.py => iotAmak/__init__.py         |   0
 agent.py => iotAmak/agent.py               |   7 +-
 amas.py => iotAmak/amas.py                 |  11 +-
 environment.py => iotAmak/environment.py   |   6 +-
 iotAmak/ihm.py                             | 163 +++++++++++++++++++++
 scheduler.py => iotAmak/scheduler.py       |  16 +-
 {philosophers => iotAmak/tool}/__init__.py |   0
 {tool => iotAmak/tool}/confi_reader.py     |   5 +-
 {tool => iotAmak/tool}/mqtt_client.py      |   0
 {tool => iotAmak/tool}/remote_client.py    |   0
 {tool => iotAmak/tool}/schedulable.py      |   7 +-
 {tool => iotAmak/tool}/ssh_client.py       |  12 +-
 philosophers/agent.py                      | 100 -------------
 philosophers/amas.py                       |  22 ---
 philosophers/env.py                        |  69 ---------
 philosophers/fork.py                       |  16 --
 requirements.txt                           |   3 +
 setup.py                                   |  10 ++
 tool/__init__.py                           |   0
 tool/config.json                           |  25 ----
 24 files changed, 225 insertions(+), 399 deletions(-)
 create mode 100644 dist/iotAmak-0.0.1-py3-none-any.whl
 delete mode 100644 ihm.py
 rename __init__.py => iotAmak/__init__.py (100%)
 rename agent.py => iotAmak/agent.py (95%)
 rename amas.py => iotAmak/amas.py (94%)
 rename environment.py => iotAmak/environment.py (90%)
 create mode 100644 iotAmak/ihm.py
 rename scheduler.py => iotAmak/scheduler.py (94%)
 rename {philosophers => iotAmak/tool}/__init__.py (100%)
 rename {tool => iotAmak/tool}/confi_reader.py (91%)
 rename {tool => iotAmak/tool}/mqtt_client.py (100%)
 rename {tool => iotAmak/tool}/remote_client.py (100%)
 rename {tool => iotAmak/tool}/schedulable.py (95%)
 rename {tool => iotAmak/tool}/ssh_client.py (98%)
 delete mode 100644 philosophers/agent.py
 delete mode 100644 philosophers/amas.py
 delete mode 100644 philosophers/env.py
 delete mode 100644 philosophers/fork.py
 create mode 100644 requirements.txt
 create mode 100644 setup.py
 delete mode 100644 tool/__init__.py
 delete mode 100644 tool/config.json

diff --git a/.gitignore b/.gitignore
index 5cc30b1..af6a8da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,6 @@ desktop.ini
 .idea
 venv
 *.bat
-__pycache__/
\ No newline at end of file
+__pycache__/
+build/
+iotAmak.egg-info/
diff --git a/README.md b/README.md
index 4ad75c4..b327709 100644
--- a/README.md
+++ b/README.md
@@ -183,6 +183,9 @@ if __name__ == '__main__':
 
 Pour ajouter des attributs a l'initialisation aux agents il suffit de rajouter des `type(sys.argv[x])`.
 
+**A AJOUTER**
+un .config dans les experience avec la version du coeur
+
 # Topics
 
 ## Agent
diff --git a/dist/iotAmak-0.0.1-py3-none-any.whl b/dist/iotAmak-0.0.1-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..e38251787425c0cad929d37ca11b93eef2c65cae
GIT binary patch
literal 10793
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

literal 0
HcmV?d00001

diff --git a/ihm.py b/ihm.py
deleted file mode 100644
index 6e520c4..0000000
--- a/ihm.py
+++ /dev/null
@@ -1,145 +0,0 @@
-import pathlib
-import platform  # For getting the operating system name
-import subprocess  # For executing a shell command
-import sys
-from os import path
-from subprocess import Popen
-from time import sleep
-
-from tool.confi_reader import read_ssh, read_broker
-from tool.mqtt_client import MqttClient
-from tool.ssh_client import SSHClient, Cmd
-
-
-class Ihm(MqttClient, SSHClient):
-
-    def __init__(self):
-        self.broker_ip = read_broker(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json")
-        MqttClient.__init__(self, self.broker_ip, "Ihm")
-        SSHClient.__init__(self, read_ssh(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json"))
-
-    def run(self):
-
-        exit_bool = False
-        experiment_folder = ""
-
-        while not exit_bool:
-
-            print("\n")
-            cmd = input(">")
-
-            # Envoie un signal a tout le monde pour exit
-            if cmd.lower() == "exit":
-                self.client.publish("ping/exit")
-                exit_bool = True
-
-            # cherche tout les potentiel agents sur les raspberry et les tuent
-            if cmd.lower() == "kill":
-
-                commands = [
-                    Cmd(
-                        cmd="ps -ef | grep 'python '",
-                        prefix="[BEFORE]"
-                    ),
-                    Cmd(
-                        cmd="for pid in $(ps -ef | grep 'python ' | awk '{print $2}'); do kill $pid; done",
-                        do_print=False
-                    ),
-                    Cmd(
-                        cmd="ps -ef | grep 'python '",
-                        prefix="[AFTER]"
-                    )
-                ]
-
-                for i_client in range(len(self.clients)):
-                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
-                    self.run_cmd(i_client, commands)
-
-            # affiche tout les agents en vie
-            if cmd.lower() == "agent":
-                commands = [
-                    Cmd(
-                        cmd="ps -ef | grep 'python '"
-                    )]
-
-                for i_client in range(len(self.clients)):
-                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
-                    self.run_cmd(i_client, commands)
-
-            # automatise la mise a jour de l'exerience sur les raspberry
-            if cmd.lower() == "update":
-                commands = [
-                    Cmd(
-                        cmd="rm -r Desktop/mqtt_goyon/iotamak-core"
-                    )
-                ]
-                for i_client in range(len(self.clients)):
-                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
-                    self.run_cmd(i_client, commands)
-
-                self.update()
-
-            # charge une experience et verifie le format
-            if cmd.lower() == "load":
-                print("Give Path to experiment folder(relavive)")
-                cmd = input(">")
-                # check if exist
-                print("Check experiment:")
-                print(" | -> folder : ", path.exists(cmd))
-                print(" | -> agent.py : ", path.exists(cmd + "/agent.py"))
-                print(" | -> amas.py : ", path.exists(cmd + "/amas.py"))
-                print(" | -> env.py : ", path.exists(cmd + "/env.py"))
-                if path.exists(cmd) and path.exists(cmd + "/agent.py") and path.exists(
-                        cmd + "/amas.py") and path.exists(cmd + "/env.py"):
-                    experiment_folder = cmd
-                    print("Experiment loaded")
-
-            # Crée les processus amas/env/scheduler de l'experience chargé
-            if cmd.lower() == "start":
-
-                if experiment_folder != "":
-
-                    # choose exec
-                    print("Choose execution mode for the scheduler")
-                    print("0 : step by step, 1 : auto")
-                    while cmd not in ["0", "1"]:
-                        cmd = input(">")
-
-                    # start subprocess scheduler
-                    p1 = Popen([sys.executable, 'scheduler.py', cmd, self.broker_ip])
-                    sleep(1)
-                    # start subprocess amas
-                    send_client = [ c.to_send() for c in self.clients]
-                    p2 = Popen([sys.executable, experiment_folder + '/amas.py', self.broker_ip, str(send_client)])
-                    # start subprocess env
-                    p3 = Popen([sys.executable, experiment_folder + '/env.py', self.broker_ip])
-
-            if cmd.lower() == "pause":
-                self.client.publish("ping/pause")
-
-            if cmd.lower() == "unpause":
-                self.client.publish("ping/unpause")
-
-            if cmd.lower() in ["s", "step"]:
-                self.client.publish("ping/step")
-
-            if cmd.lower() == "ping":
-
-                for client in read_ssh(str(pathlib.Path(__file__).parent.resolve()) + "/tool/config.json"):
-                    param = '-n' if platform.system().lower() == 'windows' else '-c'
-                    command = ['ping', param, '1', client.hostname]
-
-                    result = subprocess.call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
-
-                    print("Hostname :", client.hostname, " Responded : ", result)
-
-            if cmd.lower() == "mode":
-                self.client.publish("ping/mode")
-
-        self.client.publish("ping/step")
-        sleep(2)
-
-
-if __name__ == '__main__':
-    a = Ihm()
-    a.run()
diff --git a/__init__.py b/iotAmak/__init__.py
similarity index 100%
rename from __init__.py
rename to iotAmak/__init__.py
diff --git a/agent.py b/iotAmak/agent.py
similarity index 95%
rename from agent.py
rename to iotAmak/agent.py
index 958e026..52a1bf3 100644
--- a/agent.py
+++ b/iotAmak/agent.py
@@ -4,7 +4,12 @@ Agent class file
 from ast import literal_eval
 from typing import Dict
 
-from tool.schedulable import Schedulable
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.schedulable import Schedulable
 
 
 class Agent(Schedulable):
diff --git a/amas.py b/iotAmak/amas.py
similarity index 94%
rename from amas.py
rename to iotAmak/amas.py
index e8e97d3..8424890 100644
--- a/amas.py
+++ b/iotAmak/amas.py
@@ -4,9 +4,14 @@ Amas class
 from ast import literal_eval
 from typing import List
 
-from tool.remote_client import RemoteClient
-from tool.schedulable import Schedulable
-from tool.ssh_client import SSHClient, Cmd
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.remote_client import RemoteClient
+from iotAmak.tool.schedulable import Schedulable
+from iotAmak.tool.ssh_client import SSHClient, Cmd
 
 
 class Amas(Schedulable, SSHClient):
diff --git a/environment.py b/iotAmak/environment.py
similarity index 90%
rename from environment.py
rename to iotAmak/environment.py
index 24ea96e..9adb398 100644
--- a/environment.py
+++ b/iotAmak/environment.py
@@ -1,8 +1,12 @@
 """
 Environment class
 """
+import sys
+import pathlib
 
-from tool.schedulable import Schedulable
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.schedulable import Schedulable
 
 
 class Environment(Schedulable):
diff --git a/iotAmak/ihm.py b/iotAmak/ihm.py
new file mode 100644
index 0000000..1347488
--- /dev/null
+++ b/iotAmak/ihm.py
@@ -0,0 +1,163 @@
+from os import path
+from subprocess import Popen
+from time import sleep
+
+import platform
+import subprocess
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.confi_reader import read_ssh, read_broker
+from iotAmak.tool.mqtt_client import MqttClient
+from iotAmak.tool.ssh_client import SSHClient, Cmd
+
+
+class Ihm(MqttClient, SSHClient):
+
+    def __init__(self, config_path):
+        self.broker_ip = read_broker(config_path)
+        MqttClient.__init__(self, self.broker_ip, "Ihm")
+        SSHClient.__init__(self, read_ssh(config_path))
+
+        self.experiment_loaded = False
+        self.ping_is_true = False
+
+    def loading(self):
+        print("[LOADING]")
+        print("Check experiment:")
+        print(" | -> agent.py : ", path.exists("./agent.py"))
+        print(" | -> amas.py : ", path.exists("./amas.py"))
+        print(" | -> env.py : ", path.exists("./env.py"))
+        if path.exists("./agent.py") and path.exists("./amas.py") and path.exists("./env.py"):
+            self.experiment_loaded = True
+            print("Experiment loaded")
+        else:
+            print("[WARNING] experiment isn't conform with the expected format, starting won't be possible")
+
+    def ping(self):
+        print("[PING]")
+        print("Checking connection to clients in config.json")
+        res = True
+        for client in self.clients:
+            param = '-n' if platform.system().lower() == 'windows' else '-c'
+            command = ['ping', param, '1', client.hostname]
+
+            result = subprocess.call(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
+            res = res and result
+
+            print("Hostname :", client.hostname, " Responded : ", result)
+        if res:
+            print("Connection established")
+            self.ping_is_true = True
+        else:
+            print("[WARNING] Some client are unavailable, update the config file")
+
+    def agent(self):
+        print("[AGENT]")
+        print("Checking if an experiment is already running")
+
+        commands = [
+            Cmd(
+                cmd="ps -ef | grep 'python '"
+            )]
+
+        for i_client in range(len(self.clients)):
+            print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
+            self.run_cmd(i_client, commands)
+
+        print(
+            "If any agent is currently running, you should" +
+            "kill them before starting the application with the command 'kill'"
+        )
+
+    def run(self):
+
+        exit_bool = False
+
+        self.loading()
+        self.ping()
+        if self.ping_is_true:
+            self.agent()
+
+        while not exit_bool:
+
+            print("\n")
+            cmd = input(">")
+
+            # Envoie un signal a tout le monde pour exit
+            if cmd.lower() == "exit":
+                self.client.publish("ihm/exit")
+                exit_bool = True
+
+            # cherche tout les potentiel agents sur les raspberry et les tuent
+            if cmd.lower() == "kill":
+
+                commands = [
+                    Cmd(
+                        cmd="ps -ef | grep 'python '",
+                        prefix="[BEFORE]"
+                    ),
+                    Cmd(
+                        cmd="for pid in $(ps -ef | grep 'python ' | awk '{print $2}'); do kill $pid; done",
+                        do_print=False
+                    ),
+                    Cmd(
+                        cmd="ps -ef | grep 'python '",
+                        prefix="[AFTER]"
+                    )
+                ]
+
+                for i_client in range(len(self.clients)):
+                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
+                    self.run_cmd(i_client, commands)
+
+            # automatise la mise a jour de l'exerience sur les raspberry
+            if cmd.lower() == "update":
+                commands = [
+                    Cmd(
+                        cmd="rm -r Desktop/mqtt_goyon/iotamak-core"
+                    )
+
+                ]
+                for i_client in range(len(self.clients)):
+                    print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user)
+                    self.run_cmd(i_client, commands)
+
+                self.update()
+
+            # Crée les processus amas/env/scheduler de l'experience chargé
+            if cmd.lower() == "start":
+
+                if self.experiment_loaded and self.ping_is_true:
+
+                    # choose exec
+                    print("Choose execution mode for the scheduler")
+                    print("0 : step by step, 1 : auto")
+                    while cmd not in ["0", "1"]:
+                        cmd = input(">")
+
+                    # start subprocess scheduler
+                    p1 = Popen([sys.executable, './scheduler.py', cmd, self.broker_ip])
+                    sleep(1)
+                    # start subprocess amas
+                    send_client = [c.to_send() for c in self.clients]
+                    p2 = Popen([sys.executable, './amas.py', self.broker_ip, str(send_client)])
+                    # start subprocess env
+                    p3 = Popen([sys.executable, './env.py', self.broker_ip])
+
+            if cmd.lower() == "pause":
+                self.client.publish("ihm/pause")
+
+            if cmd.lower() == "unpause":
+                self.client.publish("ihm/unpause")
+
+            if cmd.lower() in ["s", "step"]:
+                self.client.publish("ihm/step")
+
+            if cmd.lower() == "mode":
+                self.client.publish("ihm/mode")
+
+        self.client.publish("ihm/step")
+        sleep(2)
diff --git a/scheduler.py b/iotAmak/scheduler.py
similarity index 94%
rename from scheduler.py
rename to iotAmak/scheduler.py
index e42d8cd..51ecdcc 100644
--- a/scheduler.py
+++ b/iotAmak/scheduler.py
@@ -1,10 +1,14 @@
 """
 Scheduler class file
 """
-import sys
 from time import sleep
 
-from tool.schedulable import Schedulable
+import sys
+import pathlib
+
+sys.path.insert(0, str(pathlib.Path(__file__).parent))
+
+from iotAmak.tool.schedulable import Schedulable
 
 
 class Scheduler(Schedulable):
@@ -26,10 +30,10 @@ class Scheduler(Schedulable):
         self.subscribe("amas/agent/new", self.update_nbr_agent)
         self.subscribe("amas/action_done", self.update_schedulable)
         self.subscribe("env/action_done", self.update_schedulable)
-        self.subscribe("ping/step", self.step)
-        self.subscribe("ping/pause", self.pause)
-        self.subscribe("ping/unpause", self.unpause)
-        self.subscribe("ping/mode", self.mode)
+        self.subscribe("ihm/step", self.step)
+        self.subscribe("ihm/pause", self.pause)
+        self.subscribe("ihm/unpause", self.unpause)
+        self.subscribe("ihm/mode", self.mode)
 
         self.agent_waiting = 0
         self.schedulable_waiting = 0
diff --git a/philosophers/__init__.py b/iotAmak/tool/__init__.py
similarity index 100%
rename from philosophers/__init__.py
rename to iotAmak/tool/__init__.py
diff --git a/tool/confi_reader.py b/iotAmak/tool/confi_reader.py
similarity index 91%
rename from tool/confi_reader.py
rename to iotAmak/tool/confi_reader.py
index 66ae9e9..ca9b344 100644
--- a/tool/confi_reader.py
+++ b/iotAmak/tool/confi_reader.py
@@ -1,9 +1,10 @@
 import json
-import pathlib
 import sys
+import pathlib
 
 sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-from tool.remote_client import RemoteClient
+
+from iotAmak.tool.remote_client import RemoteClient
 
 
 def read_ssh(path):
diff --git a/tool/mqtt_client.py b/iotAmak/tool/mqtt_client.py
similarity index 100%
rename from tool/mqtt_client.py
rename to iotAmak/tool/mqtt_client.py
diff --git a/tool/remote_client.py b/iotAmak/tool/remote_client.py
similarity index 100%
rename from tool/remote_client.py
rename to iotAmak/tool/remote_client.py
diff --git a/tool/schedulable.py b/iotAmak/tool/schedulable.py
similarity index 95%
rename from tool/schedulable.py
rename to iotAmak/tool/schedulable.py
index 2b6f5ae..e1e1e71 100644
--- a/tool/schedulable.py
+++ b/iotAmak/tool/schedulable.py
@@ -1,13 +1,14 @@
 """
 Tool class that implement basic interaction that help to finish processes
 """
-import pathlib
-import sys
 from time import sleep
 
+import sys
+import pathlib
+
 sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
 
-from tool.mqtt_client import MqttClient
+from iotAmak.tool.mqtt_client import MqttClient
 
 
 class Schedulable(MqttClient):
diff --git a/tool/ssh_client.py b/iotAmak/tool/ssh_client.py
similarity index 98%
rename from tool/ssh_client.py
rename to iotAmak/tool/ssh_client.py
index ea20d4e..3f7d2e2 100644
--- a/tool/ssh_client.py
+++ b/iotAmak/tool/ssh_client.py
@@ -1,14 +1,16 @@
-import os
-import pathlib
-import sys
+
 from typing import List
 
 import paramiko
-from pexpect import pxssh
+import os
+import sys
+import pathlib
 
+from pexpect import pxssh
 
 sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-from tool.remote_client import RemoteClient
+
+from iotAmak.tool.remote_client import RemoteClient
 
 
 class Cmd:
diff --git a/philosophers/agent.py b/philosophers/agent.py
deleted file mode 100644
index 6826aed..0000000
--- a/philosophers/agent.py
+++ /dev/null
@@ -1,100 +0,0 @@
-from ast import literal_eval
-from time import sleep
-
-import sys
-import pathlib
-
-sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-
-from agent import Agent
-from philosophers.fork import Fork
-from random import randrange
-
-
-class PhiAgent(Agent):
-
-    def __init__(self, identifier: int, broker_ip: str, total_agent):
-        self.total_agent = total_agent
-        Agent.__init__(self, identifier, broker_ip)
-
-    def on_initialization(self):
-        # 0: thinking, 1: hungry, 2: eat
-        self.state = 0
-
-        self.subscribe("env/fork/" + str(self.id), self.left_fork_update)
-        self.left_fork = Fork(self.id)
-
-        right_id = (self.id - 1) % self.total_agent
-        self.subscribe("env/fork/" + str(right_id), self.right_fork_update)
-        self.right_fork = Fork(right_id)
-
-        self.fork_wait = True
-
-        self.subscribe("env/agent/" + str(self.id) + "/ask_spoon", self.spoon_response)
-
-    def spoon_response(self, client, userdata, message):
-        res = literal_eval(message.payload.decode("utf-8"))
-        if res.get("response") == "True":
-            if res.get("side") == "right":
-                self.right_fork.taken_by = self.id
-                self.right_fork.state = res.get("state")
-            else:
-                self.left_fork.taken_by = self.id
-                self.left_fork.state = res.get("state")
-        self.fork_wait = False
-
-    def left_fork_update(self, client, userdata, message):
-        res = literal_eval(message.payload.decode("utf-8"))
-        self.left_fork.state = res.get("state")
-        self.left_fork.taken_by = res.get("tanken_by")
-
-    def right_fork_update(self, client, userdata, message):
-        res = literal_eval(message.payload.decode("utf-8"))
-        self.right_fork.state = res.get("state")
-        self.right_fork.taken_by = res.get("tanken_by")
-
-    def ask_spoon(self, left):
-        if left :
-            self.publish("ask_spoon", "left")
-        else :
-            self.publish("ask_spoon", "right")
-        while self.fork_wait:
-            sleep(self.wait_delay)
-        self.fork_wait = True
-
-    def on_decide(self):
-        super().on_decide()
-
-        if self.right_fork.taken_by == -1:
-            self.ask_spoon(False)
-
-        if self.left_fork.taken_by == -1:
-            self.ask_spoon(True)
-
-        if self.state == 1:
-            if self.right_fork.taken_by != self.id:
-                self.ask_spoon(False)
-            if self.left_fork.taken_by != self.id:
-                self.ask_spoon(True)
-
-    def on_act(self):
-        super().on_act()
-
-        if self.state == 0:
-            self.log("Is Thinking")
-            res = randrange(100)
-            if res % 5 == 0:
-                self.state = 1
-        elif self.state == 1:
-            self.log("Is Hungry")
-            if self.left_fork.taken_by == self.right_fork.taken_by == self.id:
-                self.state = 2
-        elif self.state == 2:
-            self.log("Is Eating")
-            self.publish("done_eating", "")
-            self.state = 0
-
-
-if __name__ == '__main__':
-    a = PhiAgent(int(sys.argv[1]), str(sys.argv[2]), int(sys.argv[3]))
-    a.run()
diff --git a/philosophers/amas.py b/philosophers/amas.py
deleted file mode 100644
index af9eeb2..0000000
--- a/philosophers/amas.py
+++ /dev/null
@@ -1,22 +0,0 @@
-import sys
-import pathlib
-
-sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-
-from amas import Amas
-
-
-class PhiAmas(Amas):
-
-    def __init__(self, broker_ip: str, clients, nbr_agent):
-        self.agent_to_create = nbr_agent
-        super().__init__(broker_ip, clients)
-
-    def on_initial_agents_creation(self):
-        for _ in range(self.agent_to_create):
-            self.add_agent("philosophers", [str(self.agent_to_create)])
-
-
-if __name__ == '__main__':
-    s = PhiAmas(str(sys.argv[1]), sys.argv[2], 5)
-    s.run()
diff --git a/philosophers/env.py b/philosophers/env.py
deleted file mode 100644
index 8ababf9..0000000
--- a/philosophers/env.py
+++ /dev/null
@@ -1,69 +0,0 @@
-
-import sys
-import pathlib
-
-sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
-
-from environment import Environment
-from philosophers.fork import Fork
-
-
-class PhiEnv(Environment):
-
-    def __init__(self, broker_ip, nbr_phil):
-        self.nbr_phil = nbr_phil
-        super().__init__(broker_ip)
-
-    def on_initialization(self):
-        self.forks = []
-        for i in range(self.nbr_phil):
-            self.forks.append(Fork(i))
-            self.subscribe("agent/" + str(i) + "/ask_spoon", self.ask_spoon)
-            self.subscribe("agent/" + str(i) + "/done_eating", self.done_eating)
-
-    def ask_spoon(self, client, userdata, message):
-        res = str(message.payload.decode("utf-8"))
-        agent_id = int(str(message.topic).split("/")[1])
-
-        if res == "left":
-            fork_id = agent_id
-        else:
-            fork_id = (agent_id - 1) % self.nbr_phil
-
-        if self.forks[fork_id].state == 1:
-            message = {
-                "response": "False"
-            }
-        elif self.forks[fork_id].taken_by == -1:
-            message = {
-                "response": "True",
-                "side": res,
-                "state": 0
-            }
-            self.forks[fork_id].taken_by = agent_id
-        else:
-            message = {
-                "response": "True",
-                "side": res,
-                "state": 1
-            }
-            self.forks[fork_id].taken_by = agent_id
-            self.forks[fork_id].state = 1
-
-        self.client.publish("env/agent/" + str(agent_id) + "/ask_spoon", str(message))
-
-    def done_eating(self, client, userdata, message):
-        agent_id = int(str(message.topic).split("/")[1])
-
-        for fork_id in [agent_id, (agent_id - 1) % self.nbr_phil]:
-            self.forks[fork_id].state = 0
-
-    def on_cycle_begin(self) -> None:
-        for fork in self.forks:
-            self.client.publish("env/fork/" + str(fork.identifier), str(fork.to_msg()))
-            print("Fork : ", fork.identifier," taken by ", fork.taken_by, " and is :", fork.state)
-
-
-if __name__ == '__main__':
-    s = PhiEnv(str(sys.argv[1]), 5)
-    s.run()
\ No newline at end of file
diff --git a/philosophers/fork.py b/philosophers/fork.py
deleted file mode 100644
index 8e59e66..0000000
--- a/philosophers/fork.py
+++ /dev/null
@@ -1,16 +0,0 @@
-class Fork:
-
-    def __init__(self, identifier):
-
-        self.identifier = identifier
-
-        # 0: dirty, 1: clean
-        self.state = 0
-
-        self.taken_by = -1
-
-    def to_msg(self):
-        return {
-                "state": self.state,
-                "taken_by": self.taken_by
-            }
\ No newline at end of file
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..a48456a
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+paho-mqtt
+paramiko
+pexpect
\ No newline at end of file
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..c1654f3
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,10 @@
+from setuptools import setup, find_packages
+
+setup(
+    name='iotAmak',
+    packages=find_packages(),
+    version='0.0.1',
+    description='AmakFramework in python',
+    author='SMAC - GOYON Sebastien',
+    install_requires=[],
+)
diff --git a/tool/__init__.py b/tool/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/tool/config.json b/tool/config.json
deleted file mode 100644
index 84fb1a9..0000000
--- a/tool/config.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "broker" : "192.168.153.209",
-  "clients_ssh" : [
-    {
-      "hostname" : "192.168.153.18",
-      "user" : "pi",
-      "password" : "raspberry"
-    },
-    {
-      "hostname" : "192.168.153.227",
-      "user" : "pi",
-      "password" : "raspberry"
-    },
-    {
-      "hostname" : "192.168.153.61",
-      "user" : "pi",
-      "password" : "raspberry"
-    },
-    {
-      "hostname" : "192.168.153.75",
-      "user" : "pi",
-      "password" : "raspberry"
-    }
-  ]
-}
\ No newline at end of file
-- 
GitLab