bdi-network-resilience

Role Refactoring

9/3/2014 7:26:16 PM

Changes

network-resilience/src/br/ufrgs/inf/bdinetr/capability/FlowExporterCapability.java 31(+0 -31)

network-resilience/src/br/ufrgs/inf/bdinetr/domain/AbstractPReSETRole.java 35(+0 -35)

network-resilience/src/br/ufrgs/inf/bdinetr/domain/FlowExporter.java 36(+0 -36)

Details

diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
index d9e3677..97aac4d 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
@@ -22,6 +22,7 @@
 package br.ufrgs.inf.bdinetr;
 
 import jade.BootProfileImpl;
+import jade.core.Agent;
 import jade.core.ProfileImpl;
 import jade.wrapper.AgentContainer;
 import jade.wrapper.AgentController;
@@ -31,21 +32,13 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Random;
-import java.util.Timer;
-import java.util.TimerTask;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.log4j.PropertyConfigurator;
 
-import bdi4jade.core.AbstractBDIAgent;
-import bdi4jade.examples.BDI4JADEExamplesPanel;
+import br.ufrgs.inf.bdinetr.agent.RouterAgent;
 import br.ufrgs.inf.bdinetr.domain.IpAddress;
-import br.ufrgs.inf.bdinetr.domain.Link;
-import br.ufrgs.inf.bdinetr.domain.LinkMonitor;
-import br.ufrgs.inf.bdinetr.domain.Network;
-import br.ufrgs.inf.bdinetr.domain.PReSETRole;
 import br.ufrgs.inf.bdinetr.domain.PReSETRouter;
 
 /**
@@ -53,71 +46,29 @@ import br.ufrgs.inf.bdinetr.domain.PReSETRouter;
  */
 public class BDINetRApp {
 
-	class LinkUsageUpdater extends TimerTask {
-		private static final double OVER_USAGE_PROBABILITY = 0.3;
-
-		@Override
-		public void run() {
-			Map<Link, Boolean> overUsage = new HashMap<>();
-			Random random = new Random(System.currentTimeMillis());
-			for (Link link : NETWORK.getLinks()) {
-				double d = random.nextDouble();
-				overUsage.put(link, d < OVER_USAGE_PROBABILITY);
-			}
-			log.info("Updating link usage");
-			for (PReSETRouter router : NETWORK.getRouters()) {
-				if (router.hasRole(PReSETRole.LINK_MONITOR)) {
-					LinkMonitor lm = (LinkMonitor) router
-							.getRole(PReSETRole.LINK_MONITOR);
-					for (Link link : overUsage.keySet()) {
-						lm.setOverUsage(link, overUsage.get(link));
-					}
-				}
-			}
-			log.info("Restarting agents");
-			for (AbstractBDIAgent agent : AGENTS.values()) {
-				agent.restart();
-			}
-		}
-	}
-
-	private static final Map<IpAddress, AbstractBDIAgent> AGENTS;
-
-	private static final Network NETWORK;
+	private static final Map<IpAddress, Agent> AGENTS;
 
 	static {
 		PropertyConfigurator.configure(BDINetRApp.class
 				.getResource("log4j.properties"));
 
-		NETWORK = new Network();
-		PReSETRouter firewall = new PReSETRouter(new IpAddress("Firewall 1"),
-				PReSETRole.RATE_LIMITER.getId());
-		NETWORK.addRouter(firewall);
-		PReSETRouter linkMonitor = new PReSETRouter(new IpAddress(
-				"Rate Limiter 1"), PReSETRole.LINK_MONITOR.getId());
-		NETWORK.addRouter(linkMonitor);
-
-		NETWORK.addLink(new Link("F1_RL1"));
-
 		AGENTS = new HashMap<>();
-		AGENTS.put(firewall.getIp(), new BDINetRAgent(firewall));
-		AGENTS.put(linkMonitor.getIp(), new BDINetRAgent(linkMonitor));
-
+		for (PReSETRouter router : Network.NETWORK.getRouters()) {
+			AGENTS.put(router.getIp(), new RouterAgent(router));
+		}
 	}
 
 	public static void main(String[] args) {
-		new BDINetRApp().run();
+		new BDINetRApp();
+		Network.NETWORK.run();
 	}
 
 	private ProfileImpl bootProfile;
 	private final Log log;
 	private jade.core.Runtime runtime;
 
-	private Timer timer;
-
 	public BDINetRApp() {
 		this.log = LogFactory.getLog(this.getClass());
-		this.timer = new Timer();
 
 		List<String> params = new ArrayList<String>();
 		params.add("-gui");
@@ -143,13 +94,4 @@ public class BDINetRApp {
 		}
 	}
 
-	/**
-	 * Creates and shows a GUI whose content pane is an
-	 * {@link BDI4JADEExamplesPanel}.
-	 */
-	public void run() {
-		int interval = 10 * 1000;
-		this.timer.schedule(new LinkUsageUpdater(), interval, interval);
-	}
-
 }
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java
index b5f5fcc..0fe161a 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/AnomalyDetection.java
@@ -21,6 +21,9 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * ids
  * 
@@ -32,10 +35,15 @@ package br.ufrgs.inf.bdinetr.domain;
  * 
  * @author Ingrid Nunes
  */
-public class AnomalyDetection extends AbstractPReSETRole {
+public class AnomalyDetection extends PReSETRole {
 
 	public AnomalyDetection(PReSETRouter router) {
 		super(router);
 	}
 
+	public Set<IpAddress> detectIntrusion(Link link) {
+		// FIXME
+		return new HashSet<>();
+	}
+
 }
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
index 8a864ed..dfcd40b 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Classifier.java
@@ -21,7 +21,12 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.domain;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
+ * flowexporter addOperation: "victim:flow:idle:" remoteName: "setthreshold".
+ * 
  * event at:
  * 
  * "classification" put: (factory/event create: #( "value_name" "value_source"
@@ -29,10 +34,19 @@ package br.ufrgs.inf.bdinetr.domain;
  * 
  * @author Ingrid Nunes
  */
-public class Classifier extends AbstractPReSETRole {
+public class Classifier extends PReSETRole {
 
 	public Classifier(PReSETRouter router) {
 		super(router);
 	}
 
+	public Set<Flow> classifyFlows(IpAddress ip) {
+		// FIXME
+		return new HashSet<>();
+	}
+
+	public void turnFlowExporterOn() {
+
+	}
+
 }
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
index ed7dcd0..f1fa114 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Flow.java
@@ -26,27 +26,14 @@ package br.ufrgs.inf.bdinetr.domain;
  */
 public class Flow {
 
-	private static long id_counter = 0;
-
 	private IpAddress dstIp;
 	private int dstPort;
-	private final Long id;
 	private String protocol;
 	private IpAddress srcIp;
 	private int srcPort;
 
 	public Flow(IpAddress srcIp, int srcPort, IpAddress dstIp, int dstPort,
 			String protocol) {
-		this(++id_counter);
-	}
-
-	public Flow(Long id) {
-		this.id = id;
-	}
-
-	public Flow(Long id, IpAddress srcIp, int srcPort, IpAddress dstIp,
-			int dstPort, String protocol) {
-		this.id = id;
 		this.srcIp = srcIp;
 		this.srcPort = srcPort;
 		this.dstIp = dstIp;
@@ -56,11 +43,33 @@ public class Flow {
 
 	@Override
 	public boolean equals(Object obj) {
-		if (obj instanceof Flow) {
-			Flow f = (Flow) obj;
-			return this.id.equals(f.id);
-		}
-		return false;
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (!(obj instanceof Flow))
+			return false;
+		Flow other = (Flow) obj;
+		if (dstIp == null) {
+			if (other.dstIp != null)
+				return false;
+		} else if (!dstIp.equals(other.dstIp))
+			return false;
+		if (dstPort != other.dstPort)
+			return false;
+		if (protocol == null) {
+			if (other.protocol != null)
+				return false;
+		} else if (!protocol.equals(other.protocol))
+			return false;
+		if (srcIp == null) {
+			if (other.srcIp != null)
+				return false;
+		} else if (!srcIp.equals(other.srcIp))
+			return false;
+		if (srcPort != other.srcPort)
+			return false;
+		return true;
 	}
 
 	public IpAddress getDstIp() {
@@ -71,10 +80,6 @@ public class Flow {
 		return dstPort;
 	}
 
-	public Long getId() {
-		return id;
-	}
-
 	public String getProtocol() {
 		return protocol;
 	}
@@ -89,7 +94,15 @@ public class Flow {
 
 	@Override
 	public int hashCode() {
-		return id == null ? 0 : id.hashCode();
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((dstIp == null) ? 0 : dstIp.hashCode());
+		result = prime * result + dstPort;
+		result = prime * result
+				+ ((protocol == null) ? 0 : protocol.hashCode());
+		result = prime * result + ((srcIp == null) ? 0 : srcIp.hashCode());
+		result = prime * result + srcPort;
+		return result;
 	}
 
 	public void setDstIp(IpAddress dstIp) {
@@ -114,7 +127,11 @@ public class Flow {
 
 	@Override
 	public String toString() {
-		return id.toString();
+		StringBuffer sb = new StringBuffer();
+		sb.append("<src=").append(srcIp).append(":").append(srcPort);
+		sb.append(", dst=").append(dstIp).append(":").append(dstPort);
+		sb.append(", protocol=").append(protocol).append(">");
+		return sb.toString();
 	}
 
 }
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java
index ff2d55b..8332e45 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/LinkMonitor.java
@@ -22,25 +22,36 @@
 package br.ufrgs.inf.bdinetr.domain;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * event at:
  * 
  * "load" put: (factory/event create: #( "value_name" "value_index" ));
  * 
- * --> value_name: ???
- * --> value_index: id do link
+ * --> value_name: ??? --> value_index: id do link
  * 
  * @author Ingrid Nunes
  */
-public class LinkMonitor extends AbstractPReSETRole {
+public class LinkMonitor extends PReSETRole {
 
+	private final Set<Observer> observers;
 	private final Map<Link, Boolean> overUsageLinks;
 
 	public LinkMonitor(PReSETRouter router) {
 		super(router);
 		this.overUsageLinks = new HashMap<>();
+		this.observers = new HashSet<>();
+	}
+
+	public void attachObserver(Observer observer) {
+		this.observers.add(observer);
+	}
+
+	public Set<Link> getLinks() {
+		return overUsageLinks.keySet();
 	}
 
 	public boolean isOverUsage(Link link) {
@@ -50,8 +61,15 @@ public class LinkMonitor extends AbstractPReSETRole {
 		return overUsage;
 	}
 
+	private void notifyObservers(Object arg) {
+		for (Observer observer : observers) {
+			observer.update(this, arg);
+		}
+	}
+
 	public void setOverUsage(Link link, boolean overUsage) {
 		this.overUsageLinks.put(link, overUsage);
+		notifyObservers(link);
 	}
 
 }
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Observer.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Observer.java
new file mode 100644
index 0000000..80b87a4
--- /dev/null
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/Observer.java
@@ -0,0 +1,7 @@
+package br.ufrgs.inf.bdinetr.domain;
+
+public interface Observer {
+
+	public void update(Object o, Object arg);
+
+}
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
index 38674b2..6839503 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRole.java
@@ -24,23 +24,32 @@ package br.ufrgs.inf.bdinetr.domain;
 /**
  * @author Ingrid Nunes
  */
-public enum PReSETRole {
+public abstract class PReSETRole {
 
-	ANOMALY_DETECTION(1), CLASSIFIER(2), FLOW_EXPORTER(4), LINK_MONITOR(8), RATE_LIMITER(
-			16);
+	public enum RoleType {
 
-	private final int id;
+		ANOMALY_DETECTION(1), CLASSIFIER(2), LINK_MONITOR(4), RATE_LIMITER(8);
 
-	private PReSETRole(int id) {
-		this.id = id;
-	}
+		private final int id;
+
+		private RoleType(int id) {
+			this.id = id;
+		}
+
+		public int getId() {
+			return id;
+		}
+
+		public boolean isPresent(int roles) {
+			return (roles & id) != 0;
+		}
 
-	public int getId() {
-		return id;
 	}
 
-	public boolean isPresent(int roles) {
-		return (roles & id) != 0;
+	protected final PReSETRouter router;
+
+	public PReSETRole(PReSETRouter router) {
+		this.router = router;
 	}
 
 }
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
index e1364cc..0ee6a16 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/PReSETRouter.java
@@ -24,28 +24,28 @@ package br.ufrgs.inf.bdinetr.domain;
 import java.util.HashMap;
 import java.util.Map;
 
+import br.ufrgs.inf.bdinetr.domain.PReSETRole.RoleType;
+
 /**
  * @author Ingrid Nunes
  */
 public class PReSETRouter {
 
 	private final IpAddress ip;
-	private final Map<PReSETRole, AbstractPReSETRole> roles;
+	private final Map<RoleType, PReSETRole> roles;
 
 	public PReSETRouter(final IpAddress id, int roles) {
 		this.ip = id;
 		this.roles = new HashMap<>();
-		if (PReSETRole.LINK_MONITOR.isPresent(roles)) {
-			this.roles.put(PReSETRole.LINK_MONITOR, new LinkMonitor(this));
-		} else if (PReSETRole.ANOMALY_DETECTION.isPresent(roles)) {
-			this.roles.put(PReSETRole.ANOMALY_DETECTION, new AnomalyDetection(
+		if (RoleType.LINK_MONITOR.isPresent(roles)) {
+			this.roles.put(RoleType.LINK_MONITOR, new LinkMonitor(this));
+		} else if (RoleType.ANOMALY_DETECTION.isPresent(roles)) {
+			this.roles.put(RoleType.ANOMALY_DETECTION, new AnomalyDetection(
 					this));
-		} else if (PReSETRole.RATE_LIMITER.isPresent(roles)) {
-			this.roles.put(PReSETRole.RATE_LIMITER, new RateLimiter(this));
-		} else if (PReSETRole.FLOW_EXPORTER.isPresent(roles)) {
-			this.roles.put(PReSETRole.FLOW_EXPORTER, new FlowExporter(this));
-		} else if (PReSETRole.CLASSIFIER.isPresent(roles)) {
-			this.roles.put(PReSETRole.CLASSIFIER, new Classifier(this));
+		} else if (RoleType.RATE_LIMITER.isPresent(roles)) {
+			this.roles.put(RoleType.RATE_LIMITER, new RateLimiter(this));
+		} else if (RoleType.CLASSIFIER.isPresent(roles)) {
+			this.roles.put(RoleType.CLASSIFIER, new Classifier(this));
 		}
 	}
 
@@ -62,7 +62,7 @@ public class PReSETRouter {
 		return ip;
 	}
 
-	public AbstractPReSETRole getRole(PReSETRole role) {
+	public PReSETRole getRole(RoleType role) {
 		return roles.get(role);
 	}
 
@@ -71,7 +71,7 @@ public class PReSETRouter {
 		return ip == null ? 0 : ip.hashCode();
 	}
 
-	public boolean hasRole(PReSETRole role) {
+	public boolean hasRole(RoleType role) {
 		return roles.containsKey(role);
 	}
 
diff --git a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java
index f3b60d4..3a989f6 100644
--- a/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java
+++ b/network-resilience/src/br/ufrgs/inf/bdinetr/domain/RateLimiter.java
@@ -36,7 +36,7 @@ import java.util.Map;
  * 
  * @author Ingrid Nunes
  */
-public class RateLimiter extends AbstractPReSETRole {
+public class RateLimiter extends PReSETRole {
 
 	private final Map<Flow, Double> rateLimitedflows;
 	private final Map<IpAddress, Double> rateLimitedIps;