From e3b9fc1383e50fdb2e6aecf6ad57108d50625956 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Tue, 2 Feb 2021 21:36:08 +0100 Subject: [PATCH] =?UTF-8?q?Feat:=20Ajout=20de=20la=20description=20des=20t?= =?UTF-8?q?opologies=20et=20des=20sc=C3=A9narios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SNT/03_Internet/Simulation/build.py | 83 +++-- SNT/03_Internet/Simulation/config.yml | 328 ++++++++++++++++++ SNT/03_Internet/Simulation/role.css | 9 +- SNT/03_Internet/Simulation/role.svg | 164 --------- .../Simulation/{role.html => role.tpl.html} | 8 +- SNT/03_Internet/Simulation/roles.yml | 297 ---------------- SNT/03_Internet/Simulation/topo.tpl.html | 37 ++ 7 files changed, 433 insertions(+), 493 deletions(-) create mode 100644 SNT/03_Internet/Simulation/config.yml delete mode 100644 SNT/03_Internet/Simulation/role.svg rename SNT/03_Internet/Simulation/{role.html => role.tpl.html} (87%) delete mode 100644 SNT/03_Internet/Simulation/roles.yml create mode 100644 SNT/03_Internet/Simulation/topo.tpl.html diff --git a/SNT/03_Internet/Simulation/build.py b/SNT/03_Internet/Simulation/build.py index fd07463..01db63b 100644 --- a/SNT/03_Internet/Simulation/build.py +++ b/SNT/03_Internet/Simulation/build.py @@ -1,5 +1,4 @@ import yaml -#import cairosvg from weasyprint import HTML, CSS import jinja2 from pathlib import Path @@ -15,45 +14,77 @@ def graph(roles): g.add_edge(str(role["num"]), str(list(lien.keys())[0])) return g -def build_topo(topo, roles): - plt.figure(figsize=(2,2)) + +def topo_logo(topo, roles): + plt.figure(figsize=(2, 2)) ax = plt.gca() - #ax.set_title(f"Forme du réseau: {topo}") + # ax.set_title(f"Forme du réseau: {topo}") g = graph(roles) - nx.draw(g, - with_labels=True, - node_color='white', - node_size=100, - ax=ax) - _ = ax.axis('off') + nx.draw(g, node_color="white", node_size=100, ax=ax) + _ = ax.axis("off") plt.margins(0.2) plt.subplots_adjust(left=0, right=1, top=1, bottom=0) - plt.savefig(f"{topo}/forme.png", - transparent=True, - ) + plt.savefig( + f"{topo}/logo.png", + transparent=True, + ) plt.cla() -def role_card(role, topo, template, css): + plt.figure(figsize=(4, 4)) + ax = plt.gca() + # ax.set_title(f"Forme du réseau: {topo}") + g = graph(roles) + nx.draw( + g, + with_labels=True, + font_color="#fff", + font_size=20, + font_weight="bold", + node_color="#333", + node_size=1000, + ax=ax, + ) + _ = ax.axis("off") + plt.margins(0.2) + plt.subplots_adjust(left=0, right=1, top=1, bottom=0) + plt.savefig( + f"{topo}/shape.png", + transparent=True, + ) + plt.cla() + + +def topo_card(topo="", description="", scenarios=[], template="", css=[], **kwrds): + card = template.render(topo=topo, description=description, scenarios=scenarios) + dest = f"{topo}/topo.html" + with open(dest, "w") as f: + f.write(card) + HTML(dest).write_pdf(dest.replace("html", "pdf"), stylesheets=css) + + +def role_card(role, topo, template, css=[], **kwrds): card = template.render(topo=topo, **role) dest = f"{topo}/role{role['num']}.html" with open(dest, "w") as f: f.write(card) - #cairosvg.svg2pdf(url=dest, write_to=dest.replace("svg", "pdf")) - HTML(dest).write_pdf(dest.replace("html", "pdf"), stylesheets=[css]) + HTML(dest).write_pdf(dest.replace("html", "pdf"), stylesheets=css) -with open("roles.yml", "r") as f: - topos = yaml.load(f, Loader=yaml.SafeLoader) -with open("role.html", "r") as f: - template = jinja2.Template(f.read(), undefined=jinja2.StrictUndefined) -css = CSS("role.css") +with open("config.yml", "r") as f: + config = yaml.load(f, Loader=yaml.SafeLoader) -for topo, desc in topos.items(): +css = [CSS(config["css"])] +templates = {} +for name, template_file in config["templates"].items(): + with open(template_file, "r") as f: + templates[name] = jinja2.Template(f.read(), undefined=jinja2.StrictUndefined) + + +for topo, desc in config["levels"].items(): Path(topo).mkdir(exist_ok=True) - - build_topo(topo, desc["roles"]) + topo_logo(topo, desc["roles"]) + topo_card(**desc, topo=topo, template=templates["topo"], css=css) for role in desc["roles"]: - role_card(role, topo, template, css) - + role_card(role=role, topo=topo, template=templates["roles"], css=css) diff --git a/SNT/03_Internet/Simulation/config.yml b/SNT/03_Internet/Simulation/config.yml new file mode 100644 index 0000000..0d2cbaa --- /dev/null +++ b/SNT/03_Internet/Simulation/config.yml @@ -0,0 +1,328 @@ +--- +css: role.css + +templates: + roles: role.tpl.html + topo: topo.tpl.html + +levels: + linéaire: + description: Les routeurs forment une chaine où chacun connait ses deux voisins. + scenarios: + - 1: Envoyer des messages. + - 2: Sommes nous tous fiables. + roles: + - num: 1 + IP: 192.168.0.1 + objectifs: + - Envoyer un message à 192.168.3.1 + particularites: + liens: + - 2: 192.168.1.1 + - num: 2 + IP: 192.168.1.1 + objectifs: + - Envoyer un message à 192.168.3.1 + particularites: + - 2: Ne marche plus après avoir transmis 3 messages + liens: + - 1: 192.168.0.1 + - 3: 192.168.2.1 + - num: 3 + IP: 192.168.2.1 + objectifs: + - Envoyer un message à 192.168.0.1 + particularites: + liens: + - 2: 192.168.1.1 + - 4: 192.168.3.1 + - num: 4 + IP: 192.168.3.1 + objectifs: + - Envoyer un message à 192.168.5.1 + particularites: + liens: + - 3: 192.168.2.1 + - 5: 192.168.4.1 + - num: 5 + IP: 192.168.4.1 + objectifs: + - Envoyer un message à 192.168.1.1 + particularites: + liens: + - 4: 192.168.3.1 + - 6: 192.168.5.1 + - num: 6 + IP: 192.168.5.1 + objectifs: + - Envoyer un message à 192.168.2.1 + particularites: + - 2: Ne marche plus après avoir transmis 3 messages + liens: + - 5: 192.168.4.1 + + anneau: + description: Les routeurs forment une cercle où chacun connait ses deux voisins. + scenarios: + - 1: Envoyer des messages et enregistré ce que l'on transmet. + - 2: Sommes nous tous fiables? + roles: + - num: 1 + IP: 10.10.0.1 + objectifs: + - Envoyer un message à 10.10.3.1 + particularites: + - Tiens un tableau où les IP des messages transmis sont notés. + liens: + - 6: 10.10.5.1 + - 2: 10.10.1.1 + - num: 2 + IP: 10.10.1.1 + objectifs: + - Envoyer un message à 10.10.5.1 + particularites: + - Tiens un tableau où les IP des messages transmis sont notés. + liens: + - 1: 10.10.0.1 + - 3: 10.10.2.1 + - num: 3 + IP: 10.10.2.1 + objectifs: + - Envoyer un message à 10.10.4.1 + particularites: + - Tiens un tableau où les IP des messages transmis sont notés. + - 2: Ne marche plus après avoir transmis 5 messages + liens: + - 2: 10.10.1.1 + - 4: 10.10.3.1 + - num: 4 + IP: 10.10.3.1 + objectifs: + - Envoyer un message à 10.10.0.1 + particularites: + - Tiens un tableau où les IP des messages transmis sont notés. + liens: + - 3: 10.10.2.1 + - 5: 10.10.4.1 + - num: 5 + IP: 10.10.4.1 + objectifs: + - Envoyer un message à 10.10.1.1 + particularites: + - Tiens un tableau où les IP des messages transmis sont notés. + liens: + - 4: 10.10.3.1 + - 6: 10.10.5.1 + - num: 6 + IP: 10.10.5.1 + objectifs: + - Envoyer un message à 10.10.3.1 + particularites: + - Tiens un tableau où les IP des messages transmis sont notés. + liens: + - 5: 10.10.4.1 + - 1: 10.10.0.1 + + étoile: + description: Les terminaux sont reliés à un seul routeur. + scenarios: + - 1: Le routeur tente de survivre. + - 2: Le routeur espion. + roles: + - num: 1 + IP: 77.82.0.1 + objectifs: + particularites: + - Après 10 transmissions, ne marche plus. + - 2: Ouvrir et noter tous les messages transmis. + liens: + - 2: 77.82.1.1 + - 3: 77.82.2.1 + - 4: 77.82.3.1 + - 5: 77.82.4.1 + - 6: 77.82.5.1 + - num: 2 + IP: 77.82.1.1 + objectifs: + - Envoyer un message à 77.82.10.1 + - Envoyer un message à 77.82.5.1 et demander une réponse + particularites: + liens: + - 1: 77.82.0.1 + - num: 3 + IP: 77.82.2.1 + objectifs: + - Envoyer un message à 77.82.3.1 + particularites: + liens: + - 1: 77.82.0.1 + - num: 4 + IP: 77.82.3.1 + objectifs: + - Envoyer un message à 77.82.4.1 + - Envoyer un message à 77.82.2.1 et demander une réponse + particularites: + liens: + - 1: 77.82.0.1 + - num: 5 + IP: 77.82.4.1 + objectifs: + - Envoyer un message à 77.82.5.1 + particularites: + liens: + - 1: 77.82.0.1 + - num: 6 + IP: 77.82.5.1 + objectifs: + - Envoyer un message à 77.82.1.1 + - Envoyer un message à 77.82.4.1 et demander une réponse + particularites: + liens: + - 1: 77.82.0.1 + + mesh: + description: Les terminaux sont reliés à un seul routeur et les routeurs sont connectés à plusieurs routeurs. + scenarios: + - 1: Les messages doivent trouver leur destinataire. Aurons-nous une réponse? + - 2: Sommes nous tous fiables. + roles: + - num: 1 + IP: 77.82.1.1 + objectifs: + particularites: + - Envoyer message à 131.240.1.1 et demander une réponse. + liens: + - 2: 77.82.0.1 + - num: 2 + IP: 77.82.0.1 + objectifs: + particularites: + - 2: À partir du 2e message transmis, ouvre les messages, barre ce qui est écrit et écrit quelque chose d'autre. + liens: + - 1: 77.82.1.1 + - 3: 131.240.0.1 + - 7: 51.12.0.1 + - num: 3 + IP: 131.240.0.1 + objectifs: + - Après 5 messages transmis, arrête de transmettre les messages. + particularites: + liens: + - 4: 131.240.1.1 + - 2: 77.82.0.1 + - 5: 151.10.0.1 + - 7: 51.12.0.1 + - num: 4 + IP: 131.240.1.1 + objectifs: + - Envoyer message à 151.10.1.1 et demander une réponse. + particularites: + liens: + - 3: 131.240.0.1 + - num: 5 + IP: 151.10.0.1 + objectifs: + particularites: + liens: + - 6: 151.10.1.1 + - 3: 131.240.0.1 + - 7: 51.12.0.1 + - num: 6 + IP: 151.10.1.1 + objectifs: + - Envoyer message à 51.12.1.1 et demander une réponse. + particularites: + liens: + - 5: 151.10.0.1 + - num: 7 + IP: 51.12.0.1 + objectifs: + particularites: + - Après 3 messages transmis, enregistre tous les messages qu'il transmet. + liens: + - 8: 51.12.1.1 + - 2: 77.82.0.1 + - 3: 131.240.0.1 + - 5: 151.10.0.1 + - num: 8 + IP: 51.12.1.1 + objectifs: + - Envoyer message à 77.81.1.1 et demander une réponse. + particularites: + liens: + - 7: 51.12.0.1 + + mesh_dns: + description: Un réseau mesh pour faire du web. + scenarios: + - 1: Utilisation du serveur DNS pour accéder aux pages HTML. + roles: + - num: 1 + IP: 77.82.1.1 + objectifs: + - Se connecter à 2gt1.stex pour demander la page HTML + particularites: + - Utilisateur du web. + - Connaît le serveur DNS à l'adresse 131.82.0.1 + liens: + - 2: 77.82.0.1 + - num: 2 + IP: 77.82.0.1 + objectifs: + particularites: + liens: + - 1: 77.82.1.1 + - 3: 131.240.0.1 + - 7: 51.12.0.1 + - num: 3 + IP: 131.240.0.1 + objectifs: + particularites: + liens: + - 4: 131.240.1.1 + - 2: 77.82.0.1 + - 5: 151.10.0.1 + - 7: 51.12.0.1 + - num: 4 + IP: 131.240.1.1 + objectifs: + - Répondre aux requêtes DNS. + particularites: + - Serveur DNS, connait les noms de domaine suivants + - SNT.stex à l'adresse 131..240.1.1 + - 2gt1.stex à l'adresse 151.10.1.1 + liens: + - 3: 131.240.0.1 + - num: 5 + IP: 151.10.0.1 + objectifs: + particularites: + liens: + - 6: 151.10.1.1 + - 3: 131.240.0.1 + - 7: 51.12.0.1 + - num: 6 + IP: 151.10.1.1 + objectifs: + - Renvoyer une page HTML quand on nous le demande. + particularites: + - Serveur Web connu sous le nom de domaine 2gt1.stex + liens: + - 5: 151.10.0.1 + - num: 7 + IP: 51.12.0.1 + objectifs: + particularites: + liens: + - 8: 51.12.1.1 + - 2: 77.82.0.1 + - 3: 131.240.0.1 + - 5: 151.10.0.1 + - num: 8 + IP: 51.12.1.1 + objectifs: + - Renvoyer une page HTML quand on nous le demande. + particularites: + - Serveur Web connu sous le nom de domaine SNT.stex + liens: + - 7: 51.12.0.1 diff --git a/SNT/03_Internet/Simulation/role.css b/SNT/03_Internet/Simulation/role.css index 762b2a5..9d3ee1e 100644 --- a/SNT/03_Internet/Simulation/role.css +++ b/SNT/03_Internet/Simulation/role.css @@ -36,7 +36,7 @@ header > * { min-width: 100%; vertical-align: middle; } -#ip { +#title { font-size: 2em; display: flex; justify-content: center; @@ -67,4 +67,9 @@ main > * { border-width: medium 0 medium 0; } - +#description > img{ + display: block; + margin: auto; + height: 200px; + width: 200px; +} diff --git a/SNT/03_Internet/Simulation/role.svg b/SNT/03_Internet/Simulation/role.svg deleted file mode 100644 index 82e86c6..0000000 --- a/SNT/03_Internet/Simulation/role.svg +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - IP = {{IP}} - - #{{num}} - Objectifs: -{{objectifs}} - Particularités: -{{particularites}} - - Lié à : -{{liens}} - - - diff --git a/SNT/03_Internet/Simulation/role.html b/SNT/03_Internet/Simulation/role.tpl.html similarity index 87% rename from SNT/03_Internet/Simulation/role.html rename to SNT/03_Internet/Simulation/role.tpl.html index c0e4621..f4ad4a0 100644 --- a/SNT/03_Internet/Simulation/role.html +++ b/SNT/03_Internet/Simulation/role.tpl.html @@ -10,9 +10,9 @@
- + - +

IP: {{IP}}

@@ -35,7 +35,7 @@ {% if particularites %}
    {% for p in particularites %} -
  • {{ p }}
  • +
  • {{ p | replace("{", "") | replace("}", "") | replace("'", "")}}
  • {% endfor %}
{% else %} @@ -47,7 +47,7 @@ {% if liens %}
    {% for l in liens %} -
  • {{ l | replace("{", "") | replace("}", "")}}
  • +
  • {{ l | replace("{", "") | replace("}", "") | replace("'", "")}}
  • {% endfor %}
{% endif %} diff --git a/SNT/03_Internet/Simulation/roles.yml b/SNT/03_Internet/Simulation/roles.yml deleted file mode 100644 index bdb5e5b..0000000 --- a/SNT/03_Internet/Simulation/roles.yml +++ /dev/null @@ -1,297 +0,0 @@ ---- -linéaire: - roles: - - num: 1 - IP: 192.168.0.1 - objectifs: - - Envoyer un message à 192.168.3.1 - particularites: - liens: - - 2: 192.168.1.1 - - num: 2 - IP: 192.168.1.1 - objectifs: - - Envoyer un message à 192.168.3.1 - particularites: - - Ne marche plus après avoir transmis 3 messages - liens: - - 1: 192.168.0.1 - - 3: 192.168.2.1 - - num: 3 - IP: 192.168.2.1 - objectifs: - - Envoyer un message à 192.168.0.1 - particularites: - liens: - - 2: 192.168.1.1 - - 4: 192.168.3.1 - - num: 4 - IP: 192.168.3.1 - objectifs: - - Envoyer un message à 192.168.5.1 - particularites: - liens: - - 3: 192.168.2.1 - - 5: 192.168.4.1 - - num: 5 - IP: 192.168.4.1 - objectifs: - - Envoyer un message à 192.168.1.1 - particularites: - liens: - - 4: 192.168.3.1 - - 6: 192.168.5.1 - - num: 6 - IP: 192.168.5.1 - objectifs: - - Envoyer un message à 192.168.2.1 - particularites: - - Ne marche plus après avoir transmis 3 messages - liens: - - 5: 192.168.4.1 - -anneau: - roles: - - num: 1 - IP: 10.10.0.1 - objectifs: - - Envoyer un message à 10.10.3.1 - particularites: - liens: - - 6: 10.10.5.1 - - 2: 10.10.1.1 - - num: 2 - IP: 10.10.1.1 - objectifs: - - Envoyer un message à 10.10.5.1 - particularites: - liens: - - 1: 10.10.0.1 - - 3: 10.10.2.1 - - num: 3 - IP: 10.10.2.1 - objectifs: - - Envoyer un message à 10.10.4.1 - particularites: - - Ne marche plus après avoir transmis 5 messages - liens: - - 2: 10.10.1.1 - - 4: 10.10.3.1 - - num: 4 - IP: 10.10.3.1 - objectifs: - - Envoyer un message à 10.10.0.1 - particularites: - liens: - - 3: 10.10.2.1 - - 5: 10.10.4.1 - - num: 5 - IP: 10.10.4.1 - objectifs: - - Envoyer un message à 10.10.1.1 - particularites: - liens: - - 4: 10.10.3.1 - - 6: 10.10.5.1 - - num: 6 - IP: 10.10.5.1 - objectifs: - - Envoyer un message à 10.10.3.1 - particularites: - liens: - - 5: 10.10.4.1 - - 1: 10.10.0.1 - -étoile: - roles: - - num: 1 - IP: 77.82.0.1 - objectifs: - particularites: - - Après 10 transmissions, ne marche plus. - - (*) Ouvrir et noter tous les messages transmis. - liens: - - 2: 77.82.1.1 - - 3: 77.82.2.1 - - 4: 77.82.3.1 - - 5: 77.82.4.1 - - 6: 77.82.5.1 - - num: 2 - IP: 77.82.1.1 - objectifs: - - Envoyer un message à 77.82.10.1 - - Envoyer un message à 77.82.5.1 et demander une réponse - particularites: - liens: - - 1: 77.82.0.1 - - num: 3 - IP: 77.82.2.1 - objectifs: - - Envoyer un message à 77.82.3.1 - particularites: - liens: - - 1: 77.82.0.1 - - num: 4 - IP: 77.82.3.1 - objectifs: - - Envoyer un message à 77.82.4.1 - - Envoyer un message à 77.82.2.1 et demander une réponse - particularites: - liens: - - 1: 77.82.0.1 - - num: 5 - IP: 77.82.4.1 - objectifs: - - Envoyer un message à 77.82.5.1 - particularites: - liens: - - 1: 77.82.0.1 - - num: 6 - IP: 77.82.5.1 - objectifs: - - Envoyer un message à 77.82.1.1 - - Envoyer un message à 77.82.4.1 et demander une réponse - particularites: - liens: - - 1: 77.82.0.1 - - -mesh: - roles: - - num: 1 - IP: 77.82.1.1 - objectifs: - particularites: - - Envoyer message à 131.240.1.1 et demander une réponse. - liens: - - 2: 77.82.0.1 - - num: 2 - IP: 77.82.0.1 - objectifs: - particularites: - - À partir du 2e message transmis, ouvre les messages, barre ce qui est écrit et écrit quelque chose d'autre. - liens: - - 1: 77.82.1.1 - - 3: 131.240.0.1 - - 7: 51.12.0.1 - - num: 3 - IP: 131.240.0.1 - objectifs: - - Après 5 messages transmis, arrête de transmettre les messages. - particularites: - liens: - - 4: 131.240.1.1 - - 2: 77.82.0.1 - - 5: 151.10.0.1 - - 7: 51.12.0.1 - - num: 4 - IP: 131.240.1.1 - objectifs: - - Envoyer message à 151.10.1.1 et demander une réponse. - particularites: - liens: - - 3: 131.240.0.1 - - num: 5 - IP: 151.10.0.1 - objectifs: - particularites: - liens: - - 6: 151.10.1.1 - - 3: 131.240.0.1 - - 7: 51.12.0.1 - - num: 6 - IP: 151.10.1.1 - objectifs: - - Envoyer message à 51.12.1.1 et demander une réponse. - particularites: - liens: - - 5: 151.10.0.1 - - num: 7 - IP: 51.12.0.1 - objectifs: - - Après 3 messages transmis, enregistre tous les messages qu'il transmet. - particularites: - liens: - - 8: 51.12.1.1 - - 2: 77.82.0.1 - - 3: 131.240.0.1 - - 5: 151.10.0.1 - - num: 8 - IP: 51.12.1.1 - objectifs: - - Envoyer message à 77.81.1.1 et demander une réponse. - particularites: - liens: - - 7: 51.12.0.1 - -mesh_dns: - roles: - - num: 1 - IP: 77.82.1.1 - objectifs: - - Se connecter à 2gt1.stex pour demander la page HTML - particularites: - - Utilisateur du web. - - Connaît le serveur DNS à l'adresse 131.82.0.1 - liens: - - 2: 77.82.0.1 - - num: 2 - IP: 77.82.0.1 - objectifs: - particularites: - liens: - - 1: 77.82.1.1 - - 3: 131.240.0.1 - - 7: 51.12.0.1 - - num: 3 - IP: 131.240.0.1 - objectifs: - particularites: - liens: - - 4: 131.240.1.1 - - 2: 77.82.0.1 - - 5: 151.10.0.1 - - 7: 51.12.0.1 - - num: 4 - IP: 131.240.1.1 - objectifs: - - Répondre aux requêtes DNS. - particularites: - - Serveur DNS, connait les noms de domaine suivants - - SNT.stex à l'adresse 131..240.1.1 - - 2gt1.stex à l'adresse 151.10.1.1 - liens: - - 3: 131.240.0.1 - - num: 5 - IP: 151.10.0.1 - objectifs: - particularites: - liens: - - 6: 151.10.1.1 - - 3: 131.240.0.1 - - 7: 51.12.0.1 - - num: 6 - IP: 151.10.1.1 - objectifs: - - Renvoyer une page HTML quand on nous le demande. - particularites: - - Serveur Web connu sous le nom de domaine 2gt1.stex - liens: - - 5: 151.10.0.1 - - num: 7 - IP: 51.12.0.1 - objectifs: - particularites: - liens: - - 8: 51.12.1.1 - - 2: 77.82.0.1 - - 3: 131.240.0.1 - - 5: 151.10.0.1 - - num: 8 - IP: 51.12.1.1 - objectifs: - - Renvoyer une page HTML quand on nous le demande. - particularites: - - Serveur Web connu sous le nom de domaine SNT.stex - liens: - - 7: 51.12.0.1 diff --git a/SNT/03_Internet/Simulation/topo.tpl.html b/SNT/03_Internet/Simulation/topo.tpl.html new file mode 100644 index 0000000..522a04e --- /dev/null +++ b/SNT/03_Internet/Simulation/topo.tpl.html @@ -0,0 +1,37 @@ + + + + + + {{ topo }} + + + + +
+ + + + +

Réseau: {{ topo }}

+
+ + +
+
+
+

Description:

+

{{ description }}

+

Mise en place

+

Distribuez les rôles, positionnez vous puis reliez vous pour former le réseau suivant

+ +

Scénarios:

+
    + {% for s in scenarios %} +
  • {{ s | replace("{", "") | replace("}", "") | replace("'", "")}}
  • + {% endfor %} +
+
+
+ +