diff --git a/.gitignore b/.gitignore index 5cc30b11118c1d1ed582f34035c76b420c5805eb..af6a8dadb2a10907ee13594ae070bbbb6ae8b44c 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 4ad75c4ce928bba3885a75e30292662934553002..b3277092045634590f128fd35acb8cc17dbd21eb 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 Binary files /dev/null and b/dist/iotAmak-0.0.1-py3-none-any.whl differ diff --git a/ihm.py b/ihm.py deleted file mode 100644 index 6e520c416e0c322cbab9435aa23ee5f7d8a585d5..0000000000000000000000000000000000000000 --- 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 958e026c33e317836d3c47b303ffd6e61aaea5ca..52a1bf3d74af6df508105ee4740f4ba6e483a033 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 e8e97d3932ba2dc5b90fcedf5a095c5de51c5fa9..84248902706f76b68f7cb060fe6ab33893eee64f 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 24ea96e0e699aeb137df3897cbbdd7b5b60e0c8e..9adb3989458c17e086609cb70a2a081da0f48686 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 0000000000000000000000000000000000000000..1347488bef00492a8b281a124ea8250e30911426 --- /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 e42d8cd8af631142a45bb303e88c15e5c9bce4d9..51ecdcc0c2f66ab9fc20dd24374b7919623aecb0 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 66ae9e92f7234850d8292637f0d64b456ecd5e7f..ca9b3448bd0e2015bec66bfdfa067ccd5da25e5a 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 2b6f5aebe0f6fa23aa9b020eb43a0f8a6011c53e..e1e1e717da68d140a43c3b0dc48d5a9899992438 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 ea20d4e7f6826d1091f49ea99727b763c022758f..3f7d2e287c7c41066e9add3ddd73b17d26ac46ea 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 6826aed0abbf3d5133a01d43b99463a825d5e6fb..0000000000000000000000000000000000000000 --- 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 af9eeb2e325dec429df11bdf22d757e0aceff00f..0000000000000000000000000000000000000000 --- 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 8ababf9f5b31509cc982114429d1197fdee1d5aa..0000000000000000000000000000000000000000 --- 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 8e59e66a5067d00f0fc6ba2bfe284dc551240698..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..a48456a278a658364cf08eab0f626369f23a0622 --- /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 0000000000000000000000000000000000000000..c1654f3852c9c7ad3dd054fe260975e19b8a5e33 --- /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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/tool/config.json b/tool/config.json deleted file mode 100644 index 84fb1a9b134349d10e0a750b3ac98d9355c279b5..0000000000000000000000000000000000000000 --- 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