Commit e7370ebe1fe55b935a935a62c353452aa792c093

Authored by Antoine Duquenoy
1 parent 51db1937

Backend - Configuration du réseau

* Quelques modifications front sur la page /registration
* La page /update a été mise à jour et contient maintenant la nouvelle méthode pour modifier le réseau
* La configuration est envoyée en JSON
* Le tableau des noeuds fait maintenant la distinction avec les capteurs
@@ -35,6 +35,10 @@ @@ -35,6 +35,10 @@
35 <version>1.21</version> 35 <version>1.21</version>
36 </dependency> 36 </dependency>
37 <dependency> 37 <dependency>
  38 + <groupId>com.fasterxml.jackson.core</groupId>
  39 + <artifactId>jackson-databind</artifactId>
  40 + </dependency>
  41 + <dependency>
38 <groupId>org.springframework.boot</groupId> 42 <groupId>org.springframework.boot</groupId>
39 <artifactId>spring-boot-starter-web</artifactId> 43 <artifactId>spring-boot-starter-web</artifactId>
40 </dependency> 44 </dependency>
PFE06/src/main/java/com/PFE/ServerManager/ConfigNodes.java deleted
@@ -1,16 +0,0 @@ @@ -1,16 +0,0 @@
1 -package com.PFE.ServerManager;  
2 -  
3 -import java.util.List;  
4 -  
5 -public class ConfigNodes {  
6 -  
7 - private List<NodeYAML> nodes;  
8 -  
9 - public List<NodeYAML> getNodes() {  
10 - return nodes;  
11 - }  
12 -  
13 - public void setNodes(List<NodeYAML> nodes) {  
14 - this.nodes = nodes;  
15 - }  
16 -}  
PFE06/src/main/java/com/PFE/ServerManager/MainController.java
1 package com.PFE.ServerManager; 1 package com.PFE.ServerManager;
2 2
3 import org.springframework.beans.factory.annotation.Autowired; 3 import org.springframework.beans.factory.annotation.Autowired;
4 -import org.springframework.data.repository.query.Param; 4 +import org.springframework.http.HttpEntity;
5 import org.springframework.http.HttpStatus; 5 import org.springframework.http.HttpStatus;
6 import org.springframework.stereotype.Controller; 6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.*; 7 import org.springframework.web.bind.annotation.*;
@@ -19,6 +19,7 @@ import org.yaml.snakeyaml.Yaml; @@ -19,6 +19,7 @@ import org.yaml.snakeyaml.Yaml;
19 import org.yaml.snakeyaml.constructor.Constructor; 19 import org.yaml.snakeyaml.constructor.Constructor;
20 20
21 import javax.servlet.annotation.MultipartConfig; 21 import javax.servlet.annotation.MultipartConfig;
  22 +import com.fasterxml.jackson.databind.ObjectMapper;
22 23
23 @Controller 24 @Controller
24 @MultipartConfig(fileSizeThreshold = 20971520) //à changer, taille max des fichiers 25 @MultipartConfig(fileSizeThreshold = 20971520) //à changer, taille max des fichiers
@@ -198,35 +199,40 @@ public class MainController { @@ -198,35 +199,40 @@ public class MainController {
198 } 199 }
199 } 200 }
200 201
201 - @RequestMapping(value = "/config", method = RequestMethod.POST) 202 + @RequestMapping(value = "/updatenodes", method = RequestMethod.POST)
202 @ResponseStatus(value = HttpStatus.OK) 203 @ResponseStatus(value = HttpStatus.OK)
203 - public void submitConfig(@RequestParam MultipartFile file) { 204 + public void submitConfig(HttpEntity<String> httpEntity) {
204 205
205 - Authentication auth = SecurityContextHolder.getContext().getAuthentication();  
206 - Customer customer = customerRepository.findByEmail(auth.getName());  
207 - InputStream inputStream = null; 206 + nodeRepository.deleteAll();
  207 + String json = httpEntity.getBody();
  208 + ObjectMapper objectMapper = new ObjectMapper();
  209 + NodeJSON[] nodes = null;
208 try { 210 try {
209 - inputStream = file.getInputStream();  
210 - }  
211 - catch (IOException e) { 211 + nodes = objectMapper.readValue(json, NodeJSON[].class);
  212 + } catch (IOException e) {
212 e.printStackTrace(); 213 e.printStackTrace();
213 } 214 }
214 215
215 - nodeRepository.deleteAll();  
216 - Yaml yaml = new Yaml(new Constructor(ConfigNodes.class));  
217 - ConfigNodes conf = yaml.load(inputStream);  
218 -  
219 - Iterator<NodeYAML> iter = conf.getNodes().iterator();  
220 - while (iter.hasNext()) {  
221 - NodeYAML element = iter.next(); 216 + for (NodeJSON n : nodes) {
222 Node node = new Node(); 217 Node node = new Node();
223 - node.setName(element.getName());  
224 - node.setArch(element.getArch());  
225 - node.setIp(element.getIp()); 218 + node.setName(n.getName());
  219 + node.setArch(n.getArch());
  220 + node.setIp(n.getIp());
  221 + List<SensorJSON> sensors = n.getSensors();
  222 + Set<Sensor> sensorsReal = new HashSet<Sensor>();
  223 + for(SensorJSON s : sensors)
  224 + {
  225 + Sensor ss = new Sensor();
  226 + ss.setName(s.getName());
  227 + sensorsReal.add(ss);
  228 + }
  229 + node.setSensors(sensorsReal);
226 nodeRepository.save(node); 230 nodeRepository.save(node);
227 } 231 }
  232 +
228 } 233 }
229 234
  235 +
230 @GetMapping(path="/login") 236 @GetMapping(path="/login")
231 public ModelAndView login() { 237 public ModelAndView login() {
232 ModelAndView modelAndView = new ModelAndView(); 238 ModelAndView modelAndView = new ModelAndView();
@@ -290,7 +296,7 @@ public class MainController { @@ -290,7 +296,7 @@ public class MainController {
290 Yaml yaml = new Yaml(); 296 Yaml yaml = new Yaml();
291 FileWriter writer = null; 297 FileWriter writer = null;
292 try { 298 try {
293 - writer = new FileWriter("toflash/" + customer.getEmail().split("@")[0] + "_" + update_c.getUpdate() + ".yaml"); 299 + writer = new FileWriter("toflash/" + customer.getEmail().split("@")[0] + "_" + update_c.getUpdate() + ".yml");
294 } catch (IOException e) { 300 } catch (IOException e) {
295 e.printStackTrace(); 301 e.printStackTrace();
296 } 302 }
@@ -313,21 +319,11 @@ public class MainController { @@ -313,21 +319,11 @@ public class MainController {
313 Yaml yaml = new Yaml(); 319 Yaml yaml = new Yaml();
314 FileWriter writer = null; 320 FileWriter writer = null;
315 try { 321 try {
316 - writer = new FileWriter("toflash/" + customer.getEmail().split("@")[0] + "_" + update.getUpdate() + ".yaml"); 322 + writer = new FileWriter("toflash/" + customer.getEmail().split("@")[0] + "_" + update.getUpdate() + ".yml");
317 } catch (IOException e) { 323 } catch (IOException e) {
318 e.printStackTrace(); 324 e.printStackTrace();
319 } 325 }
320 yaml.dump(data, writer); 326 yaml.dump(data, writer);
321 } 327 }
322 328
323 - @GetMapping(value="/nodesconf")  
324 - public ModelAndView nodesconf() {  
325 - ModelAndView modelAndView = new ModelAndView();  
326 - Authentication auth = SecurityContextHolder.getContext().getAuthentication();  
327 - Customer customer = customerRepository.findByEmail(auth.getName());  
328 - modelAndView.addObject("customerName", customer.getEmail().split("@")[0]);  
329 - modelAndView.addObject("customerRole", customer.getRole());  
330 - modelAndView.setViewName("nodesconf");  
331 - return modelAndView;  
332 - }  
333 } 329 }
334 \ No newline at end of file 330 \ No newline at end of file
PFE06/src/main/java/com/PFE/ServerManager/Node.java
1 package com.PFE.ServerManager; 1 package com.PFE.ServerManager;
2 2
3 import javax.persistence.*; 3 import javax.persistence.*;
  4 +import java.util.Set;
4 5
5 @Entity 6 @Entity
6 @Table(name = "node") 7 @Table(name = "node")
@@ -19,6 +20,14 @@ public class Node { @@ -19,6 +20,14 @@ public class Node {
19 @Column(name = "arch") 20 @Column(name = "arch")
20 private String arch; 21 private String arch;
21 22
  23 + @ManyToMany(cascade = CascadeType.ALL)
  24 + @JoinTable(name = "nodes_sensor", joinColumns = @JoinColumn(name = "node_id"), inverseJoinColumns = @JoinColumn(name = "sensorId"))
  25 + private Set<Sensor> sensors;
  26 +
  27 + public void setSensors(Set<Sensor> sensors) {
  28 + this.sensors = sensors;
  29 + }
  30 +
22 public void setNode_id(Integer node_id) { 31 public void setNode_id(Integer node_id) {
23 this.node_id = node_id; 32 this.node_id = node_id;
24 } 33 }
@@ -51,4 +60,8 @@ public class Node { @@ -51,4 +60,8 @@ public class Node {
51 return arch; 60 return arch;
52 } 61 }
53 62
  63 + public Set<Sensor> getSensors() {
  64 + return sensors;
  65 + }
  66 +
54 } 67 }
PFE06/src/main/java/com/PFE/ServerManager/NodeYAML.java renamed to PFE06/src/main/java/com/PFE/ServerManager/NodeJSON.java
1 package com.PFE.ServerManager; 1 package com.PFE.ServerManager;
2 2
3 -public class NodeYAML { 3 +import java.util.List;
  4 +
  5 +public class NodeJSON {
4 6
5 private String name; 7 private String name;
6 private String ip; 8 private String ip;
7 private String arch; 9 private String arch;
  10 + private List<SensorJSON> sensors;
8 11
9 public void setName(String name) { 12 public void setName(String name) {
10 this.name = name; 13 this.name = name;
@@ -18,6 +21,8 @@ public class NodeYAML { @@ -18,6 +21,8 @@ public class NodeYAML {
18 this.arch = arch; 21 this.arch = arch;
19 } 22 }
20 23
  24 + public void setSensors(List<SensorJSON> sensors) { this.sensors = sensors; }
  25 +
21 public String getName() { 26 public String getName() {
22 return name; 27 return name;
23 } 28 }
@@ -30,4 +35,6 @@ public class NodeYAML { @@ -30,4 +35,6 @@ public class NodeYAML {
30 return arch; 35 return arch;
31 } 36 }
32 37
  38 + public List<SensorJSON> getSensors() { return sensors; }
  39 +
33 } 40 }
PFE06/src/main/java/com/PFE/ServerManager/NodesJSON.java 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +package com.PFE.ServerManager;
  2 +
  3 +import java.util.List;
  4 +
  5 +public class NodesJSON {
  6 + private List<NodeJSON> nodes;
  7 +
  8 + public void setNodes(List<NodeJSON> nodes) { this.nodes = nodes; }
  9 +
  10 + public List<NodeJSON> getNodes() { return nodes; }
  11 +
  12 +}
PFE06/src/main/java/com/PFE/ServerManager/Sensor.java 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +package com.PFE.ServerManager;
  2 +
  3 +import javax.persistence.*;
  4 +
  5 +@Entity
  6 +@Table(name = "sensor")
  7 +public class Sensor {
  8 + @Id
  9 + @Column(name = "sensorId", columnDefinition = "serial")
  10 + @GeneratedValue(strategy = GenerationType.AUTO)
  11 + private Integer sensorId;
  12 +
  13 + @Column(name = "name")
  14 + private String name;
  15 +
  16 + public void setSensorId(Integer sensorId) { this.sensorId = sensorId; }
  17 + public Integer getSensorId() { return sensorId; }
  18 +
  19 + public void setName(String name) {
  20 + this.name = name;
  21 + }
  22 + public String getName() { return name; }
  23 +}
PFE06/src/main/java/com/PFE/ServerManager/SensorJSON.java 0 → 100644
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +package com.PFE.ServerManager;
  2 +
  3 +
  4 +public class SensorJSON {
  5 + private String name;
  6 +
  7 + public void setName(String name) {
  8 + this.name = name;
  9 + }
  10 +
  11 + public String getName() {
  12 + return name;
  13 + }
  14 +}
PFE06/src/main/resources/static/js/nodes.js
@@ -74,7 +74,18 @@ function clearAll() { @@ -74,7 +74,18 @@ function clearAll() {
74 74
75 allDone.addEventListener('click', function() { 75 allDone.addEventListener('click', function() {
76 if(nodes.length !== 0) { 76 if(nodes.length !== 0) {
77 - console.log(JSON.stringify(nodes)); 77 + var xhr = new XMLHttpRequest();
  78 + var url = "/updatenodes";
  79 + xhr.open("POST", url, true);
  80 + xhr.setRequestHeader("Content-Type", "application/json");
  81 + xhr.onreadystatechange = function () {
  82 + if (xhr.readyState === 4 && xhr.status === 200) {
  83 + location.reload();
  84 + }
  85 + };
  86 + var data = JSON.stringify(nodes);
  87 + console.log(data);
  88 + xhr.send(data);
78 } 89 }
79 }) 90 })
80 91
PFE06/src/main/resources/static/js/update.js
@@ -37,6 +37,13 @@ $(document).ready(function() { @@ -37,6 +37,13 @@ $(document).ready(function() {
37 37
38 /********** Configuration file ***********/ 38 /********** Configuration file ***********/
39 39
  40 +
  41 +
  42 +
  43 +
  44 +
  45 +
  46 + /*
40 var configName = document.getElementById("config_name"); 47 var configName = document.getElementById("config_name");
41 var configSend = document.getElementById("config_send"); 48 var configSend = document.getElementById("config_send");
42 var file = document.getElementById("configInputFile"); 49 var file = document.getElementById("configInputFile");
@@ -81,6 +88,8 @@ $(document).ready(function() { @@ -81,6 +88,8 @@ $(document).ready(function() {
81 }) 88 })
82 } 89 }
83 90
  91 +*/
  92 +
84 /********** Tableau **********/ 93 /********** Tableau **********/
85 94
86 var tableNodes = $('#nodes-table').DataTable( { 95 var tableNodes = $('#nodes-table').DataTable( {
@@ -94,12 +103,15 @@ $(document).ready(function() { @@ -94,12 +103,15 @@ $(document).ready(function() {
94 103
95 tableNodes.on('select', function (e, dt, type, indexes) { 104 tableNodes.on('select', function (e, dt, type, indexes) {
96 var rowData = tableNodes.rows(indexes).data().toArray()[0]; 105 var rowData = tableNodes.rows(indexes).data().toArray()[0];
97 - nodeSet.add(rowData[0]); 106 + console.log(rowData);
  107 + nodeSet.add(rowData[0] + "@" + rowData[3]);
  108 + console.log(nodeSet);
98 } ); 109 } );
99 110
100 tableNodes.on('deselect', function (e, dt, type, indexes) { 111 tableNodes.on('deselect', function (e, dt, type, indexes) {
101 var rowData = tableNodes.rows(indexes).data().toArray()[0]; 112 var rowData = tableNodes.rows(indexes).data().toArray()[0];
102 - nodeSet.delete(rowData[0]); 113 + nodeSet.delete(rowData[0] + "@" + rowData[3]);
  114 + console.log(nodeSet);
103 } ); 115 } );
104 116
105 var sendInfoMaj = function(action) { 117 var sendInfoMaj = function(action) {
PFE06/src/main/resources/templates/all.html
@@ -63,7 +63,7 @@ @@ -63,7 +63,7 @@
63 <th scope="col">Nom</th> 63 <th scope="col">Nom</th>
64 <th scope="col">ID</th> 64 <th scope="col">ID</th>
65 <th scope="col">Utilisateurs</th> 65 <th scope="col">Utilisateurs</th>
66 - <th scope="col">Mises à jours</th> 66 + <th scope="col">Mises à jour</th>
67 </tr> 67 </tr>
68 <tr th:each="prod : ${team}"> 68 <tr th:each="prod : ${team}">
69 <td th:text="${prod.getTeam()}">Team</td> 69 <td th:text="${prod.getTeam()}">Team</td>
PFE06/src/main/resources/templates/nodesconf.html deleted
@@ -1,129 +0,0 @@ @@ -1,129 +0,0 @@
1 -<!DOCTYPE html>  
2 -<html xmlns:th="http://www.thymeleaf.org">  
3 -<head>  
4 - <meta charset="utf-8">  
5 - <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">  
6 - <link rel="stylesheet" th:href="@{/css/all.css}">  
7 - <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">  
8 - <title>Configuration des noeuds</title>  
9 -</head>  
10 -<body>  
11 -<!-- NAV BAR -->  
12 -<nav class="navbar navbar-expand-lg navbar-dark bg-dark">  
13 - <div class="container">  
14 - <a th:href="@{/home}"><span class="navbar-brand"><img style="max-width:32px;" src="/pfelogo.png"></span></a>  
15 - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">  
16 - <span class="navbar-toggler-icon"></span>  
17 - </button>  
18 - <div class="collapse navbar-collapse" id="navbarNavAltMarkup">  
19 - <div class="navbar-nav mr-auto">  
20 - <a class="nav-item nav-link" th:href="@{/upload}">Uploader un fichier</a>  
21 - <div th:remove="tag" th:switch="${customerRole}">  
22 - <div th:remove="tag" th:case="'ADMIN'">  
23 - <a class="nav-item nav-link" th:href="@{/registration}">Enregistrer des utilisateurs</a>  
24 - <a class="nav-item nav-link" th:href="@{/all}">Liste des utilisateurs</a>  
25 - <a class="nav-item nav-link" th:href="@{/update}">Paramétrer une mise à jour</a>  
26 - </div>  
27 - <div th:remove="tag" th:case="'USER'">  
28 - <a class="nav-item nav-link" th:href="@{/update}">Paramétrer une mise à jour</a>  
29 - </div>  
30 - </div>  
31 - </div>  
32 - </div>  
33 - <div class="collapse navbar-collapse ml-3" id="navbarNavAltMarkup2" >  
34 - <div class="navbar-nav ml-auto">  
35 - <a class="nav-item nav-link btn btn-danger active" th:href="@{/logout}">Déconnexion</a>  
36 - </div>  
37 - </div>  
38 - </div>  
39 -</nav>  
40 -  
41 -  
42 -<!-- TABLE PART -->  
43 -<div class="container">  
44 - <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Configuration des noeuds</h1>  
45 -  
46 - <div class="input-group mb-3">  
47 - <div class="input-group-prepend">  
48 - <span class="input-group-text">Nom</span>  
49 - </div>  
50 - <input id="nodeName" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">  
51 - </div>  
52 -  
53 - <div class="input-group mb-3">  
54 - <div class="input-group-prepend">  
55 - <span class="input-group-text">IP</span>  
56 - </div>  
57 - <input id="nodeIP" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">  
58 - </div>  
59 -  
60 - <div class="input-group mb-3">  
61 - <div class="input-group-prepend">  
62 - <span class="input-group-text">Architecture</span>  
63 - </div>  
64 - <input id="nodeArch" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">  
65 - </div>  
66 -  
67 - <h3>Capteurs</h3><br/>  
68 -  
69 - <div class="input-group mb-3">  
70 - <div class="input-group-prepend">  
71 - <span class="input-group-text">Nom</span>  
72 - </div>  
73 - <input id="sensorName" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">  
74 - </div>  
75 -  
76 - <button id="addSensor" type="button" class="btn btn-primary" style="margin-bottom:50px;">Ajouter un capteur</button>  
77 -  
78 - <table id="sensorsTable" class="table" style="margin-bottom:50px;">  
79 - </table>  
80 -  
81 - <button id="addNode" type="button" class="btn btn-success" style="margin-bottom:50px;">Ajouter ce noeud</button>  
82 - <button id="editNode" type="button" class="btn btn-warning" style="margin-bottom:50px;">Modifier ce noeud</button>  
83 - <button id="delNode" type="button" class="btn btn-danger" style="margin-bottom:50px;">Supprimer ce noeud</button>  
84 -  
85 - <div class="container">  
86 - <div class="row">  
87 - <div class="col-sm" style="text-align:left;">  
88 - <button id="prevNode" type="button" class="btn btn-secondary"><</button>  
89 - </div>  
90 - <div class="col-sm" style="text-align:center;">  
91 - <button id="allDone" type="button" class="btn btn-primary btn-lg btn-block">Terminer</button>  
92 - </div>  
93 - <div class="col-sm" style="text-align:right">  
94 - <button id="nextNode" type="button" class="btn btn-secondary">></button>  
95 - </div>  
96 - </div>  
97 - </div>  
98 -  
99 -  
100 -</div>  
101 -  
102 -  
103 -<div class="modal fade" id="warningConf" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">  
104 - <div class="modal-dialog modal-dialog-centered" role="document">  
105 - <div class="modal-content">  
106 - <div class="modal-header">  
107 - <h5 class="modal-title" id="modal-title">Attention</h5>  
108 - <button type="button" class="close" data-dismiss="modal" aria-label="Close">  
109 - <span aria-hidden="true">&times;</span>  
110 - </button>  
111 - </div>  
112 - <div id="modal-content" class="modal-body">  
113 - Certains champs sont vides !  
114 - </div>  
115 - <div class="modal-footer">  
116 - <button id="modal-button" type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>  
117 - </div>  
118 - </div>  
119 - </div>  
120 -</div>  
121 -  
122 -  
123 -<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>  
124 -<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>  
125 -<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>  
126 -<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>  
127 -<script th:src="@{/js/nodes.js}"></script>  
128 -</body>  
129 -</html>  
PFE06/src/main/resources/templates/registration.html
@@ -4,11 +4,10 @@ @@ -4,11 +4,10 @@
4 <head> 4 <head>
5 <meta charset="utf-8"> 5 <meta charset="utf-8">
6 <meta name="viewport" content="width=device-width, initial-scale=0.8, shrink-to-fit=no"> 6 <meta name="viewport" content="width=device-width, initial-scale=0.8, shrink-to-fit=no">
7 - <link rel="stylesheet" th:href="@{/css/registration.css}">  
8 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> 7 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
9 <title>Enregistrement de nouveaux utilisateurs</title> 8 <title>Enregistrement de nouveaux utilisateurs</title>
10 </head> 9 </head>
11 -<body> 10 +
12 <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> 11 <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
13 <div class="container"> 12 <div class="container">
14 <a th:href="@{/home}"><span class="navbar-brand"><img style="max-width:32px;" src="/pfelogo.png"></span></a> 13 <a th:href="@{/home}"><span class="navbar-brand"><img style="max-width:32px;" src="/pfelogo.png"></span></a>
@@ -39,11 +38,21 @@ @@ -39,11 +38,21 @@
39 </nav> 38 </nav>
40 39
41 <div class="container"> 40 <div class="container">
  41 +
  42 + <div th:if="${succeed == 1}">
  43 + <div class="alert alert-success" style="margin-top:50px" role="alert">
  44 + <span th:utext="${message + ' a été ajouté'}"></span>
  45 + </div>
  46 + </div>
  47 +
  48 + <div th:if="${succeed == -1}">
  49 + <div class="alert alert-danger" style="margin-top:50px" role="alert">
  50 + <span th:utext="${message + ' existe déjà'}"></span>
  51 + </div>
  52 + </div>
  53 +
42 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Formulaire d'ajout d'un utilisateur</h1> 54 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Formulaire d'ajout d'un utilisateur</h1>
43 - <p>Merci d'entrer le login et le mot de passe du nouvel utilisateur</p>  
44 - </div>  
45 - <div class="login-form">  
46 - <div class="main-div"> 55 + <div class="login-form">
47 <form id="Login" th:action="@{/addUser}" method="POST"> 56 <form id="Login" th:action="@{/addUser}" method="POST">
48 <div class="form-team"> 57 <div class="form-team">
49 <input type="email" class="form-control" id="username" placeholder="Entrer l'email" name="email" minlength="6" required> 58 <input type="email" class="form-control" id="username" placeholder="Entrer l'email" name="email" minlength="6" required>
@@ -70,35 +79,16 @@ @@ -70,35 +79,16 @@
70 <button @click.prevent="registration" type="submit" class="btn btn-primary">Ajouter</button> 79 <button @click.prevent="registration" type="submit" class="btn btn-primary">Ajouter</button>
71 </form> 80 </form>
72 </div> 81 </div>
73 - </div>  
74 - <div style="max-width:38%; margin:50px auto; padding:10px 70px 10px 71px">  
75 - <div th:if="${succeed == 1}">  
76 - <div class="alert alert-success" role="alert">  
77 - <span th:utext="${message + ' a été ajouté'}"></span>  
78 - </div>  
79 - </div>  
80 -  
81 - <div th:if="${succeed == -1}">  
82 - <div class="alert alert-danger" role="alert">  
83 - <span th:utext="${message + ' existe déjà'}"></span>  
84 - </div>  
85 - </div>  
86 - </div>  
87 82
88 - <div class="container">  
89 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Formulaire d'ajout d'un groupe de travail</h1> 83 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Formulaire d'ajout d'un groupe de travail</h1>
90 - <p>Merci d'entrer le nom du nouveau groupe</p>  
91 - </div>  
92 - <div class="login-form">  
93 - <div class="main-div">  
94 - <form id="addTeam" th:action="@{/addTeam}" method="POST">  
95 - <div class="form-team">  
96 - <input type="text" class="form-control" id="teamName" placeholder="Entrer le nom du groupe" name="teamName" required>  
97 - </div>  
98 - <br/>  
99 - <button @click.prevent="registration" type="submit" class="btn btn-primary">Ajouter</button>  
100 - </form>  
101 - </div> 84 + <div class="login-form">
  85 + <form id="addTeam" th:action="@{/addTeam}" method="POST">
  86 + <div class="form-team">
  87 + <input type="text" class="form-control" id="teamName" placeholder="Entrer le nom du groupe" name="teamName" required>
  88 + </div>
  89 + <br/>
  90 + <button @click.prevent="registration" type="submit" class="btn btn-primary">Ajouter</button>
  91 + </form>
102 </div> 92 </div>
103 </div> 93 </div>
104 94
PFE06/src/main/resources/templates/update.html
@@ -45,6 +45,8 @@ @@ -45,6 +45,8 @@
45 45
46 <div class="container" style="padding-bottom: 50px;"> 46 <div class="container" style="padding-bottom: 50px;">
47 47
  48 + <!--
  49 +
48 <div th:remove="tag" th:if="${customerRole} == 'ADMIN'"> 50 <div th:remove="tag" th:if="${customerRole} == 'ADMIN'">
49 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Changer la configuration réseau</h1> 51 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Changer la configuration réseau</h1>
50 <div class="input-team mb-3"> 52 <div class="input-team mb-3">
@@ -74,6 +76,57 @@ nodes: @@ -74,6 +76,57 @@ nodes:
74 </div> 76 </div>
75 </div> 77 </div>
76 78
  79 + -->
  80 +
  81 + <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Paramétrer le réseau</h1>
  82 +
  83 + <div class="input-group mb-3">
  84 + <div class="input-group-prepend">
  85 + <span class="input-group-text">Nom</span>
  86 + </div>
  87 + <input id="nodeName" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">
  88 + </div>
  89 +
  90 + <div class="input-group mb-3">
  91 + <div class="input-group-prepend">
  92 + <span class="input-group-text">IP</span>
  93 + </div>
  94 + <input id="nodeIP" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">
  95 + </div>
  96 +
  97 + <div class="input-group mb-3">
  98 + <div class="input-group-prepend">
  99 + <span class="input-group-text">Architecture</span>
  100 + </div>
  101 + <input id="nodeArch" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">
  102 + </div>
  103 +
  104 + <h3>Capteurs</h3><br/>
  105 +
  106 + <div class="input-group mb-3">
  107 + <div class="input-group-prepend">
  108 + <span class="input-group-text">Nom</span>
  109 + </div>
  110 + <input id="sensorName" type="text" class="form-control" aria-label="Sizing example input" aria-describedby="inputGroup-sizing-default">
  111 + </div>
  112 +
  113 + <button id="addSensor" type="button" class="btn btn-primary" style="margin-bottom:50px;">Ajouter un capteur</button>
  114 +
  115 + <table id="sensorsTable" class="table" style="margin-bottom:50px;">
  116 + </table>
  117 +
  118 + <button id="addNode" type="button" class="btn btn-success" style="margin-bottom:50px;">Ajouter ce noeud</button>
  119 + <button id="editNode" type="button" class="btn btn-warning" style="margin-bottom:50px;">Modifier ce noeud</button>
  120 + <button id="delNode" type="button" class="btn btn-danger" style="margin-bottom:50px;">Supprimer ce noeud</button>
  121 +
  122 + <br/>
  123 +
  124 + <button id="prevNode" type="button" class="btn btn-secondary"><</button>
  125 + <button id="allDone" type="button" class="btn btn-primary">Terminer</button>
  126 + <button id="nextNode" type="button" class="btn btn-secondary">></button>
  127 +
  128 +
  129 +
77 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Relancer une mise à jour</h1> 130 <h1 style="margin-bottom:50px; margin-top:50px; border-bottom:1px solid #CCC; padding-bottom:20px;">Relancer une mise à jour</h1>
78 <div class="form-team"> 131 <div class="form-team">
79 <select multiple id="maj_name" class="form-control"> 132 <select multiple id="maj_name" class="form-control">
@@ -90,22 +143,28 @@ nodes: @@ -90,22 +143,28 @@ nodes:
90 <th>Nom</th> 143 <th>Nom</th>
91 <th>IP</th> 144 <th>IP</th>
92 <th>Architecture</th> 145 <th>Architecture</th>
  146 + <th>Capteur</th>
93 </tr> 147 </tr>
94 </thead> 148 </thead>
95 <tbody> 149 <tbody>
96 - <tr th:each="node : ${nodes}">  
97 - <td th:text="${node.getName()}">name</td>  
98 - <td th:text="${node.getIp()}">ip</td>  
99 - <td th:text="${node.getArch()}">arch</td>  
100 - </tr> 150 + <div th:each="node : ${nodes}">
  151 + <tr th:each="sensor : ${node.getSensors()}">
  152 + <td th:text="${node.getName()}">name</td>
  153 + <td th:text="${node.getIp()}">ip</td>
  154 + <td th:text="${node.getArch()}">arch</td>
  155 + <td th:text="${sensor.getName()}">sensor</td>
  156 + </tr>
  157 + </div>
101 </tbody> 158 </tbody>
102 </table> 159 </table>
103 <div class="form-team"> 160 <div class="form-team">
104 <input type="text" class="form-control" id="majName" placeholder="Nom de la update" name="update" style="margin-top:20px;"> 161 <input type="text" class="form-control" id="majName" placeholder="Nom de la update" name="update" style="margin-top:20px;">
105 </div> 162 </div>
  163 + <br/>
106 <div class="form-team"> 164 <div class="form-team">
107 <input type="date" class="form-control" id="majDate" placeholder="Date de la mise à jour" name="date"> 165 <input type="date" class="form-control" id="majDate" placeholder="Date de la mise à jour" name="date">
108 </div> 166 </div>
  167 + <br/>
109 <select multiple class="form-control" style="margin-bottom:20px;" id="file_choice"> 168 <select multiple class="form-control" style="margin-bottom:20px;" id="file_choice">
110 <option value="--">--</option> 169 <option value="--">--</option>
111 <option th:each="file : ${customerFiles}" th:value="${file}" th:utext="${file}"/> 170 <option th:each="file : ${customerFiles}" th:value="${file}" th:utext="${file}"/>
@@ -133,13 +192,34 @@ nodes: @@ -133,13 +192,34 @@ nodes:
133 </div> 192 </div>
134 </div> 193 </div>
135 194
136 -<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>  
137 -<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>  
138 -<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>  
139 -<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js" charset="utf-8"></script>  
140 -<script src="https://cdn.datatables.net/select/1.2.7/js/dataTables.select.min.js" charset="utf-8"></script>  
141 -<script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js" charset="utf-8"></script>  
142 -<script src="https://cdn.datatables.net/responsive/2.2.3/js/dataTables.responsive.min.js" charset="utf-8"></script>  
143 -<script th:src="@{/js/update.js}"></script> 195 + <div class="modal fade" id="warningConf" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
  196 + <div class="modal-dialog modal-dialog-centered" role="document">
  197 + <div class="modal-content">
  198 + <div class="modal-header">
  199 + <h5 class="modal-title" id="modal-title">Attention</h5>
  200 + <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  201 + <span aria-hidden="true">&times;</span>
  202 + </button>
  203 + </div>
  204 + <div id="modal-content" class="modal-body">
  205 + Certains champs sont vides !
  206 + </div>
  207 + <div class="modal-footer">
  208 + <button id="modal-button" type="button" class="btn btn-secondary" data-dismiss="modal">Fermer</button>
  209 + </div>
  210 + </div>
  211 + </div>
  212 + </div>
  213 +
  214 + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
  215 + <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
  216 + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
  217 + <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js" charset="utf-8"></script>
  218 + <script src="https://cdn.datatables.net/select/1.2.7/js/dataTables.select.min.js" charset="utf-8"></script>
  219 + <script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js" charset="utf-8"></script>
  220 + <script src="https://cdn.datatables.net/responsive/2.2.3/js/dataTables.responsive.min.js" charset="utf-8"></script>
  221 + <script th:src="@{/js/update.js}"></script>
  222 + <script th:src="@{/js/nodes.js}"></script>
  223 +
144 </body> 224 </body>
145 </html> 225 </html>
PFE06/toflash/pfe_admin_maj.yaml deleted
@@ -1,4 +0,0 @@ @@ -1,4 +0,0 @@
1 -date: '2222-02-22'  
2 -file: pfelogo.png  
3 -nodes: [AT-001, ATTTT-008]  
4 -name: admin_maj  
PFE06/toflash/pfe_coucou.yaml deleted
@@ -1,4 +0,0 @@ @@ -1,4 +0,0 @@
1 -date: '0022-02-22'  
2 -file: pfelogo.png  
3 -nodes: [AT-001, AT-002, AT-003, ATTTT-008]  
4 -name: coucou  
PFE06/toflash/pfe_test.yml 0 → 100644
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +date: '1212-12-12'
  2 +file: pfelogo.png
  3 +nodes: [nom1@c2, nom2@aaaaaaaaaaaaaaaaaaaaaaa, nom2@aa]
  4 +name: test