1 /*******************************************************************************
2 * Copyright (c) 2017 Politecnico di Torino and others.
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Apache License, Version 2.0
6 * which accompanies this distribution, and is available at
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *******************************************************************************/
9 package it.polito.verigraph.solver;
11 import java.io.IOException;
12 import java.math.BigInteger;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.LinkedHashMap;
16 import java.util.List;
18 import java.util.regex.Matcher;
19 import java.util.regex.Pattern;
20 import com.fasterxml.jackson.core.JsonGenerationException;
21 import com.fasterxml.jackson.databind.JsonMappingException;
22 import com.fasterxml.jackson.databind.JsonNode;
23 import com.fasterxml.jackson.databind.ObjectMapper;
24 import it.polito.verigraph.exception.DataNotFoundException;
25 import it.polito.verigraph.model.Graph;
26 import it.polito.verigraph.model.Node;
27 import it.polito.verigraph.service.VerigraphLogger;
29 public class Scenario {
31 List<String> path=new ArrayList<String>();
32 public static VerigraphLogger vlogger = VerigraphLogger.getVerigraphlogger();
33 Map<String, Map<String, String>> chn=new HashMap<String, Map<String, String>>();
34 Map<String, Map<String, String>> routing=new HashMap<String, Map<String, String>>();
35 //configurations node:
36 Map<String, Map<String, String>> config_obj=new HashMap<String, Map<String, String>>();
37 Map<String,List<String>> config_array=new HashMap<String, List<String>>();
38 //utility for netcontext:
39 List<String> nodes_names=new ArrayList<String>();
40 List<String> nodes_types=new ArrayList<String>();
41 List<String> nodes_addresses=new ArrayList<String>();
43 public Scenario(Graph graph, List<String> s) {
49 @SuppressWarnings("unchecked")
50 public void createScenario() {
51 List<Node> nodes=new ArrayList<Node>();
55 Node n=graph.searchNodeByName(s);
57 vlogger.logger.info("The node "+n.getName()+" is not present in the graph");
58 //System.out.println("The node "+n.getName()+" is not present in the graph");
65 //for each node a map is created in order to insert the map in chn
66 for(int i=0; i<nodes.size(); i++){
67 String name=nodes.get(i).getName();
68 nodes_names.add(name);
69 String type=nodes.get(i).getFunctional_type().toLowerCase();
70 nodes_types.add(type);
71 nodes_addresses.add("ip_"+name);
72 JsonNode configuration=nodes.get(i).getConfiguration().getConfiguration();
74 Map<String, String> nodo=new HashMap<String, String>();
75 nodo.put("address", "ip_" + name);
76 nodo.put("functional_type", type);
79 Map<String, String> route=new HashMap<String, String>();
80 for(int k=i-1; ; k--){
84 String ip_dest="ip_"+nodes.get(k).getName();
85 String next_hop=nodes.get(i-1).getName();
86 route.put(ip_dest, next_hop);
89 for(int j=i+1; j<nodes.size(); j++){
90 String ip_dest="ip_"+nodes.get(j).getName();
91 String next_hop=nodes.get(i+1).getName();
92 route.put(ip_dest, next_hop);
94 routing.put(name, route);
96 setConfiguration(name, type, configuration, config_obj, config_array);
100 @SuppressWarnings("unchecked")
101 private void setConfiguration(String name, String type, JsonNode configuration,
102 Map<String, Map<String, String>> config_obj2, Map<String, List<String>> config_array2) {
104 switch(type.toUpperCase()){
106 Map<String, String> map=new LinkedHashMap();
108 if(!configuration.toString().equals(empty)){
109 ObjectMapper mapper=new ObjectMapper();
110 Map<String, String> map_tmp=new LinkedHashMap();
112 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
114 input=matcher.group(1);
116 input=configuration.toString();
117 Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}");
118 List<String> list = new ArrayList<String>();
119 Matcher match= pattern.matcher(input);
120 while (match.find()) {
121 list.add(match.group());
124 for(String string : list){
125 map.putAll(mapper.readValue(string, LinkedHashMap.class));
128 }catch(JsonGenerationException e) {
130 } catch (JsonMappingException e) {
132 } catch (IOException e) {
137 vlogger.logger.info("Firewall "+name+" empty");
139 config_obj.put(name, map);
143 List<String> source=new ArrayList<String>();
145 if(!configuration.toString().equals(empty)){
146 ObjectMapper mapper=new ObjectMapper();
148 source = mapper.readValue(configuration.toString(), ArrayList.class);
149 } catch (JsonGenerationException e) {
151 } catch (JsonMappingException e) {
153 } catch (IOException e) {
158 vlogger.logger.info("Antispam "+name+" empty");
160 config_array.put(name, source);
164 List<String> resource=new ArrayList<String>();
165 if(!configuration.toString().equals(empty)){
166 ObjectMapper mapper=new ObjectMapper();
168 List<String> list_tmp=new ArrayList<String>();
169 list_tmp = mapper.readValue(configuration.toString(), ArrayList.class);
171 for(String s : list_tmp){
172 resource.add("ip_"+s);
175 } catch (JsonGenerationException e) {
177 } catch (JsonMappingException e) {
179 } catch (IOException e) {
184 vlogger.logger.info("Cache "+name+ " empty");
186 config_array.put(name, resource);
190 List<String> notAllowed=new ArrayList<String>();
192 if(!configuration.toString().equals(empty)){
193 ObjectMapper mapper=new ObjectMapper();
195 notAllowed = mapper.readValue(configuration.toString(), ArrayList.class);
196 } catch (JsonGenerationException e) {
198 } catch (JsonMappingException e) {
200 } catch (IOException e) {
205 vlogger.logger.info("Dpi "+name+ " empty");
207 config_array.put(name, notAllowed);
211 Map<String, String> map=new LinkedHashMap();
212 if(!configuration.toString().equals(empty)){
213 ObjectMapper mapper=new ObjectMapper();
214 Map<String, String> map_tmp=new LinkedHashMap();
216 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
218 input=matcher.group(1);
220 input=configuration.toString();
222 map=mapper.readValue(input, java.util.LinkedHashMap.class);
223 String ip=map.get("destination");
225 map.put("destination", "ip_"+ip);
227 }catch(JsonGenerationException e) {
229 } catch (JsonMappingException e) {
231 } catch (IOException e) {
236 vlogger.logger.info("Endhost "+name+ " empty");
238 config_obj.put(name, map);
242 Map<String, String> map=new LinkedHashMap();
243 config_obj.put(name, map);
246 case "FIELDMODIFIER":{
247 Map<String, String> map=new LinkedHashMap();
249 if(!configuration.toString().equals(empty)){
250 ObjectMapper mapper=new ObjectMapper();
252 if(!configuration.toString().isEmpty()){
254 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
256 input=matcher.group(1);
258 input=configuration.toString();
260 Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}");
261 List<String> list = new ArrayList<String>();
262 Matcher match= pattern.matcher(input);
263 while (match.find()) {
264 list.add(match.group());
268 for(String string : list){
269 map.putAll(mapper.readValue(string, LinkedHashMap.class));
271 }catch(JsonGenerationException e) {
273 } catch (JsonMappingException e) {
275 } catch (IOException e) {
281 vlogger.logger.info("Fieldmodifier "+name+ " empty");
283 config_obj.put(name, map);
287 Map<String, String> map=new LinkedHashMap();
288 ObjectMapper mapper=new ObjectMapper();
290 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
292 input=matcher.group(1);
294 input=configuration.toString();
295 Map<String, String> map_tmp=new LinkedHashMap();
296 Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}");
297 List<String> list = new ArrayList<String>();
298 Matcher match= pattern.matcher(input);
299 while (match.find()) {
300 list.add(match.group());
303 for(String string : list){
304 map.putAll(mapper.readValue(string, LinkedHashMap.class));
306 String ip=map.get("mailserver");
308 map.put("mailserver", "ip_"+ip);
309 if(!path.contains(ip)){
310 if(!nodes_addresses.contains("ip_"+ip))
311 nodes_addresses.add("ip_"+ip);
314 }catch(JsonGenerationException e) {
316 } catch (JsonMappingException e) {
318 } catch (IOException e) {
321 config_obj.put(name, map);
325 Map<String, String> map=new LinkedHashMap();
326 if(!configuration.toString().equals(empty)){
327 ObjectMapper mapper=new ObjectMapper();
329 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
331 input=matcher.group(1);
333 input=configuration.toString();
335 Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}");
336 List<String> list = new ArrayList<String>();
337 Matcher match= pattern.matcher(input);
338 while (match.find()) {
339 list.add(match.group());
342 for(String string : list){
344 map.putAll(mapper.readValue(string, LinkedHashMap.class));
346 }catch(JsonGenerationException e) {
348 } catch (JsonMappingException e) {
350 } catch (IOException e) {
355 vlogger.logger.info("Mailserver "+name+ " empty");
357 config_obj.put(name, map);
361 List<String> source=new ArrayList<String>();
362 if(!configuration.toString().equals(empty)){
363 ObjectMapper mapper=new ObjectMapper();
364 List<String> list=new ArrayList<String>();
366 list = mapper.readValue(configuration.toString(), ArrayList.class);
368 for(String s : list){
372 } catch (JsonGenerationException e) {
374 } catch (JsonMappingException e) {
376 } catch (IOException e) {
381 vlogger.logger.info("Nat "+name+ " empty");
383 config_array.put(name, source);
387 ObjectMapper mapper=new ObjectMapper();
388 Map<String, String> map=new LinkedHashMap();
390 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
392 input=matcher.group(1);
394 input=configuration.toString();
395 Map<String, String> map_tmp=new LinkedHashMap();
396 Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}");
397 List<String> list = new ArrayList<String>();
398 Matcher match= pattern.matcher(input);
399 while (match.find()) {
400 list.add(match.group());
403 for(String string : list){
404 map.putAll(mapper.readValue(string, LinkedHashMap.class));
406 String ip=map.get("vpnexit");
408 map.put("vpnexit", "ip_"+ip);
409 if(!path.contains(ip)){
410 if(!nodes_addresses.contains("ip_"+ip))
411 nodes_addresses.add("ip_"+ip);
414 }catch(JsonGenerationException e) {
416 } catch (JsonMappingException e) {
418 } catch (IOException e) {
421 config_obj.put(name, map);
425 ObjectMapper mapper=new ObjectMapper();
426 Map<String, String> map=new LinkedHashMap();
428 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
430 input=matcher.group(1);
432 input=configuration.toString();
433 Map<String, String> map_tmp=new LinkedHashMap();
434 Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}");
435 List<String> list = new ArrayList<String>();
436 Matcher match= pattern.matcher(input);
437 while (match.find()) {
438 list.add(match.group());
441 for(String string : list){
443 map_tmp.putAll(mapper.readValue(string, LinkedHashMap.class));
445 String ip=map.get("vpnaccess");
447 map.put("vpnaccess", "ip_"+ip);
448 if(!path.contains(ip)){
449 if(!nodes_addresses.contains("ip_"+ip))
450 nodes_addresses.add("ip_"+ip);
453 }catch(JsonGenerationException e) {
455 } catch (JsonMappingException e) {
457 } catch (IOException e) {
460 config_obj.put(name, map);
464 Map<String, String> map=new LinkedHashMap();
465 ObjectMapper mapper=new ObjectMapper();
467 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
469 input=matcher.group(1);
471 input=configuration.toString();
473 Pattern pattern=Pattern.compile("\\{([^\\}]*)\\}");
474 List<String> list = new ArrayList<String>();
475 Matcher match= pattern.matcher(input);
476 while (match.find()) {
477 list.add(match.group());
480 for(String string : list){
482 map.putAll(mapper.readValue(string, LinkedHashMap.class));
484 }catch(JsonGenerationException e) {
486 } catch (JsonMappingException e) {
488 } catch (IOException e) {
491 config_obj.put(name, map);
495 Map<String, String> map=new LinkedHashMap();
496 if(!configuration.toString().equals(empty)){
497 ObjectMapper mapper=new ObjectMapper();
498 if(configuration.toString().equals(empty)){
502 Matcher matcher = Pattern.compile("\\[([^\\]]*)\\]").matcher(configuration.toString());
504 input=matcher.group(1);
506 input=configuration.toString();
508 /*readValue reads only 1 value of 1 object*/
509 map=mapper.readValue(input, java.util.LinkedHashMap.class);
510 }catch(JsonGenerationException e) {
512 } catch (JsonMappingException e) {
514 } catch (IOException e) {
520 vlogger.logger.info("Webserver "+name+ " empty");
522 config_obj.put(name, map);
526 throw new DataNotFoundException("The type "+type+ " is not valid");
531 private void checkConfiguration(List<String> source) {
532 for(int i=0; i<source.size(); i++){
533 if(!path.contains(source.get(i))){
534 if(!nodes_addresses.contains("ip_"+source.get(i)))
535 nodes_addresses.add("ip_"+source.get(i));
540 private void checkConfiguration(Map<String, String> map) {
541 Map<String, String> m=new HashMap<String, String>();
542 for(Map.Entry<String, String> a : map.entrySet()){
543 if(a.getKey()!=null){
544 if(!path.contains(a.getKey())){
545 if(!nodes_addresses.contains("ip_"+a.getKey()))
546 nodes_addresses.add("ip_"+a.getKey());
549 if(a.getValue()!=null){
550 if(!path.contains(a.getValue())){
551 if(!nodes_addresses.contains("ip_"+a.getValue()))
552 nodes_addresses.add("ip_"+a.getValue());