bdi4jade

goal generation

8/26/2014 7:11:55 PM

Details

diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
index 606a1b2..ca08a1b 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/BDINetRApp.java
@@ -31,12 +31,16 @@ 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.capability.LinkMonitorCapability;
 import br.ufrgs.inf.bdinetr.capability.RateLimiterCapability;
 import br.ufrgs.inf.bdinetr.domain.Device;
@@ -48,7 +52,23 @@ import br.ufrgs.inf.bdinetr.domain.Network;
  */
 public class BDINetRApp {
 
+	class LinkUsageUpdater extends TimerTask {
+		@Override
+		public void run() {
+			Random random = new Random(System.currentTimeMillis());
+			log.info("Updating link usage");
+			for (Link link : NETWORK.getLinks()) {
+				link.setUsedBandwidth(random.nextDouble() * link.getBandwidth());
+			}
+			log.info("Restarting agents");
+			for (AbstractBDIAgent agent : AGENTS.values()) {
+				agent.restart();
+			}
+		}
+	}
+
 	private static final Map<String, AbstractBDIAgent> AGENTS;
+
 	private static final Network NETWORK;
 
 	static {
@@ -96,8 +116,11 @@ public class BDINetRApp {
 	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");
@@ -127,7 +150,8 @@ public class BDINetRApp {
 	 * {@link BDI4JADEExamplesPanel}.
 	 */
 	public void run() {
-
+		int interval = 10 * 1000;
+		this.timer.schedule(new LinkUsageUpdater(), interval, interval);
 	}
 
 }
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java
index e03f228..ac3d5c3 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/AnomalyDetectionCapability.java
@@ -21,13 +21,79 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.capability;
 
+import java.util.Set;
+
+import bdi4jade.belief.Belief;
+import bdi4jade.belief.PropositionalBelief;
 import bdi4jade.core.Capability;
+import bdi4jade.core.GoalUpdateSet;
+import bdi4jade.goal.BeliefGoal;
+import bdi4jade.goal.PropositionalBeliefValueGoal;
+import bdi4jade.reasoning.AbstractReasoningStrategy;
+import bdi4jade.reasoning.OptionGenerationFunction;
+import br.ufrgs.inf.bdinetr.domain.IpPreposition.Anomalous;
+import br.ufrgs.inf.bdinetr.domain.IpPreposition.Benign;
+import br.ufrgs.inf.bdinetr.domain.IpPreposition.Restricted;
 
 /**
  * @author Ingrid Nunes
  */
 public class AnomalyDetectionCapability extends Capability {
 
+	private class ReasoningStrategy extends AbstractReasoningStrategy implements
+			OptionGenerationFunction {
+		@Override
+		public void generateGoals(GoalUpdateSet goalUpdateSet) {
+			Set<Belief<?, ?>> anomalousIpBeliefs = getBeliefBase()
+					.getBeliefsByType(Anomalous.class);
+			for (Belief<?, ?> belief : anomalousIpBeliefs) {
+				PropositionalBelief<Anomalous> anomalous = (PropositionalBelief<Anomalous>) belief;
+				if (anomalous.getValue()) {
+					getMyAgent()
+							.addGoal(
+									AnomalyDetectionCapability.this,
+									new PropositionalBeliefValueGoal<Restricted>(
+											new Restricted(anomalous.getName()
+													.getIp()), Boolean.TRUE));
+					log.debug("goal(restricted(" + anomalous.getName().getIp()
+							+ "))");
+					getMyAgent().addGoal(
+							AnomalyDetectionCapability.this,
+							new BeliefGoal<Benign>(new Benign(anomalous
+									.getName().getIp())));
+					log.debug("goal(?benign(" + anomalous.getName().getIp()
+							+ "))");
+				}
+			}
+
+			Set<Belief<?, ?>> restrictedBeliefs = getBeliefBase()
+					.getBeliefsByType(Restricted.class);
+			for (Belief<?, ?> belief : restrictedBeliefs) {
+				PropositionalBelief<Restricted> restricted = (PropositionalBelief<Restricted>) belief;
+				if (restricted.getValue()) {
+					PropositionalBelief<Anomalous> anomalous = (PropositionalBelief<Anomalous>) getBeliefBase()
+							.getBelief(
+									new Anomalous(restricted.getName().getIp()));
+					if (anomalous != null && !anomalous.getValue()) {
+						getMyAgent().addGoal(
+								AnomalyDetectionCapability.this,
+								new PropositionalBeliefValueGoal<Restricted>(
+										new Restricted(restricted.getName()
+												.getIp()), Boolean.FALSE));
+						log.debug("goal(not restricted("
+								+ restricted.getName().getIp() + "))");
+					}
+
+				}
+			}
+		}
+	}
+
 	private static final long serialVersionUID = -1705728861020677126L;
 
+	public AnomalyDetectionCapability() {
+		ReasoningStrategy strategy = new ReasoningStrategy();
+		setOptionGenerationFunction(strategy);
+	}
+
 }
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java
index 2e36300..150bef6 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/ClassifierCapability.java
@@ -21,13 +21,49 @@
 //----------------------------------------------------------------------------
 package br.ufrgs.inf.bdinetr.capability;
 
+import java.util.Set;
+
+import bdi4jade.belief.Belief;
+import bdi4jade.belief.PropositionalBelief;
 import bdi4jade.core.Capability;
+import bdi4jade.core.GoalUpdateSet;
+import bdi4jade.goal.PropositionalBeliefValueGoal;
+import bdi4jade.reasoning.AbstractReasoningStrategy;
+import bdi4jade.reasoning.OptionGenerationFunction;
+import br.ufrgs.inf.bdinetr.domain.FlowPreposition.Threat;
+import br.ufrgs.inf.bdinetr.domain.FlowPreposition.ThreatResponded;
 
 /**
  * @author Ingrid Nunes
  */
 public class ClassifierCapability extends Capability {
 
+	private class ReasoningStrategy extends AbstractReasoningStrategy implements
+			OptionGenerationFunction {
+		@Override
+		public void generateGoals(GoalUpdateSet goalUpdateSet) {
+			Set<Belief<?, ?>> threatBeliefs = getBeliefBase().getBeliefsByType(
+					Threat.class);
+			for (Belief<?, ?> belief : threatBeliefs) {
+				PropositionalBelief<Threat> threat = (PropositionalBelief<Threat>) belief;
+				if (threat.getValue()) {
+					getMyAgent().addGoal(
+							ClassifierCapability.this,
+							new PropositionalBeliefValueGoal<ThreatResponded>(
+									new ThreatResponded(threat.getName()
+											.getFlow()), Boolean.TRUE));
+					log.debug("goal(threatResponded("
+							+ threat.getName().getFlow() + "))");
+				}
+			}
+		}
+	}
+
 	private static final long serialVersionUID = -1705728861020677126L;
 
+	public ClassifierCapability() {
+		ReasoningStrategy strategy = new ReasoningStrategy();
+		setOptionGenerationFunction(strategy);
+	}
+
 }
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java
index b7fb6a0..7370a56 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/capability/LinkMonitorCapability.java
@@ -38,6 +38,7 @@ import br.ufrgs.inf.bdinetr.BDINetRAgent.RootCapability;
 import br.ufrgs.inf.bdinetr.domain.Device;
 import br.ufrgs.inf.bdinetr.domain.Link;
 import br.ufrgs.inf.bdinetr.domain.LinkProposition.AttackPrevented;
+import br.ufrgs.inf.bdinetr.domain.LinkProposition.FullyOperational;
 import br.ufrgs.inf.bdinetr.domain.LinkProposition.OverUsage;
 import br.ufrgs.inf.bdinetr.domain.LinkProposition.RegularUsage;
 import br.ufrgs.inf.bdinetr.domain.LinkProposition.Usage;
@@ -67,10 +68,36 @@ public class LinkMonitorCapability extends Capability {
 							LinkMonitorCapability.this,
 							new BeliefGoal<RegularUsage>(new RegularUsage(
 									overUsage.getName().getLink())));
-					log.debug("goal(regularUsage("
+					log.debug("goal(?regularUsage("
 							+ overUsage.getName().getLink() + "))");
 				}
 			}
+
+			Set<Belief<?, ?>> fullyOperationalBeliefs = getBeliefBase()
+					.getBeliefsByType(FullyOperational.class);
+			for (Belief<?, ?> belief : fullyOperationalBeliefs) {
+				PropositionalBelief<FullyOperational> fullyOperational = (PropositionalBelief<FullyOperational>) belief;
+				if (!fullyOperational.getValue()) {
+					PropositionalBelief<RegularUsage> regularUsage = (PropositionalBelief<RegularUsage>) getBeliefBase()
+							.getBelief(
+									new RegularUsage(fullyOperational.getName()
+											.getLink()));
+					if (regularUsage != null && regularUsage.getValue()) {
+						getMyAgent()
+								.addGoal(
+										LinkMonitorCapability.this,
+										new PropositionalBeliefValueGoal<FullyOperational>(
+												new FullyOperational(
+														fullyOperational
+																.getName()
+																.getLink()),
+												Boolean.TRUE));
+						log.debug("goal(fullyOperational("
+								+ fullyOperational.getName().getLink() + "))");
+					}
+
+				}
+			}
 		}
 
 		@Override
@@ -79,8 +106,9 @@ public class LinkMonitorCapability extends Capability {
 					.getBeliefsByType(Usage.class);
 			for (Belief<?, ?> belief : linkUsageBeliefs) {
 				Belief<Usage, Double> linkUsage = (Belief<Usage, Double>) belief;
-				double percentageUsed = linkUsage.getValue()
-						/ linkUsage.getName().getLink().getCapacity();
+				double percentageUsed = linkUsage.getName().getLink()
+						.getUsedBandwidthPercentage();
+				linkUsage.setValue(percentageUsed);
 				if (percentageUsed > overUsageThreshold.getValue()) {
 					getBeliefBase()
 							.addOrUpdateBelief(
@@ -126,7 +154,8 @@ public class LinkMonitorCapability extends Capability {
 				.getBelief(RootCapability.DEVICE_BELIEF);
 		for (Link link : device.getValue().getConnectedLinks()) {
 			getBeliefBase().addBelief(
-					new TransientBelief<Usage, Double>(new Usage(link), 0.0));
+					new TransientBelief<Usage, Double>(new Usage(link), link
+							.getUsedBandwidthPercentage()));
 		}
 	}
 
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java
index 191fd13..b1807f6 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/Link.java
@@ -26,18 +26,20 @@ package br.ufrgs.inf.bdinetr.domain;
  */
 public class Link {
 
-	private Double capacity;
+	private Double bandwidth;
 	private final String id;
 	private Device source;
 	private Device target;
+	private Double usedBandwidth;
 
 	public Link(String id) {
 		this.id = id;
 	}
 
-	public Link(String id, Double capacity, Device source, Device target) {
+	public Link(String id, Double bandwidth, Device source, Device target) {
 		this(id);
-		this.capacity = capacity;
+		this.bandwidth = bandwidth;
+		this.usedBandwidth = 0.0;
 		setSource(source);
 		setTarget(target);
 	}
@@ -51,8 +53,8 @@ public class Link {
 		return false;
 	}
 
-	public Double getCapacity() {
-		return capacity;
+	public Double getBandwidth() {
+		return bandwidth;
 	}
 
 	public Device getSource() {
@@ -63,13 +65,21 @@ public class Link {
 		return target;
 	}
 
+	public Double getUsedBandwidth() {
+		return usedBandwidth;
+	}
+
+	public Double getUsedBandwidthPercentage() {
+		return usedBandwidth / bandwidth;
+	}
+
 	@Override
 	public int hashCode() {
 		return id == null ? 0 : id.hashCode();
 	}
 
-	public void setCapacity(Double capacity) {
-		this.capacity = capacity;
+	public void setBandwidth(Double bandwidth) {
+		this.bandwidth = bandwidth;
 	}
 
 	public void setSource(Device source) {
@@ -88,6 +98,10 @@ public class Link {
 		this.target.connectLink(this);
 	}
 
+	public void setUsedBandwidth(Double usedBandwidth) {
+		this.usedBandwidth = usedBandwidth;
+	}
+
 	@Override
 	public String toString() {
 		return id;
diff --git a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java
index e0bea91..ce4bc3f 100644
--- a/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java
+++ b/network-resiliense/src/br/ufrgs/inf/bdinetr/domain/LinkProposition.java
@@ -32,6 +32,12 @@ public class LinkProposition {
 		}
 	}
 
+	public static class FullyOperational extends LinkProposition {
+		public FullyOperational(Link link) {
+			super(link);
+		}
+	}
+
 	public static class OverUsage extends LinkProposition {
 		public OverUsage(Link link) {
 			super(link);