summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Geiger2011-07-21 16:53:53 +0200
committerBjörn Geiger2011-07-21 16:53:53 +0200
commit5a7a66831bcea58ec6791a284026700582bd240e (patch)
treeadb958c9163b34e120aa54b750b44b9db2988121
parentGearmanController übergibt nun JSON (diff)
downloadpoolctrl-5a7a66831bcea58ec6791a284026700582bd240e.tar.gz
poolctrl-5a7a66831bcea58ec6791a284026700582bd240e.tar.xz
poolctrl-5a7a66831bcea58ec6791a284026700582bd240e.zip
Controller Worker nun mit 'GameLoop'
-rw-r--r--gearman/java/ControllerWorker/Boot.java172
-rw-r--r--gearman/java/ControllerWorker/BootWorker.java52
-rwxr-xr-xgearman/java/ControllerWorker/ControllerWorkerMain.java17
-rw-r--r--gearman/java/ControllerWorker/SomePingWorker.java60
-rw-r--r--gearman/java/ControllerWorker/StatusWorker.java29
-rw-r--r--gearman/java/library/json-simple-1.1.jarbin0 -> 16046 bytes
6 files changed, 330 insertions, 0 deletions
diff --git a/gearman/java/ControllerWorker/Boot.java b/gearman/java/ControllerWorker/Boot.java
new file mode 100644
index 0000000..7a61279
--- /dev/null
+++ b/gearman/java/ControllerWorker/Boot.java
@@ -0,0 +1,172 @@
+package ControllerWorker;
+
+import java.io.IOException;
+import java.lang.Thread;
+import java.util.HashMap;
+import java.util.Vector;
+import java.util.concurrent.ExecutionException;
+
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+
+import org.gearman.client.GearmanClient;
+import org.gearman.client.GearmanClientImpl;
+import org.gearman.client.GearmanJob;
+import org.gearman.client.GearmanJobImpl;
+import org.gearman.client.GearmanJobResult;
+import org.gearman.common.GearmanJobServerConnection;
+import org.gearman.common.GearmanNIOJobServerConnection;
+import org.gearman.util.ByteUtils;
+
+public class Boot extends Thread {
+ private Vector<HashMap<String, String>> clients;
+ private GearmanClient gearmanClient;
+ private final GearmanJobServerConnection gearmanConnection;
+ private long beginTime;
+ private long timeTaken;
+ private long timeLeft;
+
+ static HashMap<Integer, GearmanJob> PING_JOBS = new HashMap<Integer, GearmanJob>();
+ static HashMap<Integer, GearmanJob> WOL_JOBS = new HashMap<Integer, GearmanJob>();
+ static HashMap<Integer, GearmanJob> SSH_JOBS = new HashMap<Integer, GearmanJob>();
+ static HashMap<Integer, Integer> STATUS = new HashMap<Integer, Integer>();
+ static final int UPDATE_RATE = 1; // updates per second
+ static final long UPDATE_PERIOD = 1000000000L / UPDATE_RATE; // nanoseconds
+
+ public Boot(String serverAddress, int port,
+ Vector<HashMap<String, String>> clients) {
+ this.gearmanConnection = new GearmanNIOJobServerConnection(
+ serverAddress, port);
+ this.gearmanClient = new GearmanClientImpl();
+ gearmanClient.addJobServer(this.gearmanConnection);
+ this.clients = clients;
+ for (HashMap<String, String> client : clients) {
+ int clientID = Integer.parseInt(client.get("id"));
+ STATUS.put(clientID, 0); // no work
+ }
+ }
+
+ public void run() {
+ workerLoop();
+ }
+
+ private void workerLoop() {
+ while (true) {
+ try {
+ beginTime = System.nanoTime();
+ update();
+ timeTaken = System.nanoTime() - beginTime;
+ timeLeft = (UPDATE_PERIOD - timeTaken) / 1000000;
+ if (timeLeft < 10)
+ timeLeft = 10;
+ Thread.sleep(timeLeft);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void update() throws IllegalStateException, IOException,
+ InterruptedException, ExecutionException {
+ for (HashMap<String, String> client : clients) {
+ String ipAddress = client.get("ip");
+ String macAddress = client.get("mac");
+ int clientID = Integer.parseInt(client.get("id"));
+ int status = STATUS.get(clientID);
+ switch (status) {
+ case 0:
+ ping(client);
+ break;
+ case 1:
+ GearmanJob pingJob = PING_JOBS.get(clientID);
+ if (!gearmanClient.getJobStatus(pingJob).isKnown()) {
+ if (!gearmanClient.getJobStatus(pingJob).isRunning()) {
+ GearmanJobResult pingJobRes = pingJob.get();
+ String result = ByteUtils.fromUTF8Bytes(pingJobRes
+ .getResults());
+ if (result != "") {
+ JSONObject resultObj = (JSONObject) JSONValue
+ .parse(result);
+ String alive = resultObj.get("alive").toString();
+ if (alive == "true") {
+ System.out.println(ipAddress + " alive");
+ STATUS.put(clientID, 2); // alive
+ PING_JOBS.remove(clientID);
+ } else {
+ System.out.println(ipAddress + " not alive");
+ STATUS.put(clientID, 3); // not alive
+ PING_JOBS.remove(clientID);
+ }
+ }
+ }
+ } else {
+ PING_JOBS.remove(clientID);
+ }
+ break;
+ case 2:
+ ssh(client);
+ break;
+ case 3:
+ wakeOnLan(client);
+ break;
+ case 4:
+ GearmanJob wolJob = WOL_JOBS.get(clientID);
+ if (!gearmanClient.getJobStatus(wolJob).isKnown()) {
+ if (!gearmanClient.getJobStatus(wolJob).isRunning()) {
+ GearmanJobResult wolJobRes = wolJob.get();
+ String result = ByteUtils.fromUTF8Bytes(wolJobRes
+ .getResults());
+ if (result == "Magic packet send.") {
+ System.out
+ .println(macAddress + "Magic packet send");
+ STATUS.put(clientID, 5); // magic
+ // packet
+ // send
+ WOL_JOBS.remove(clientID);
+ }
+ }
+ } else {
+ WOL_JOBS.remove(clientID);
+ }
+ break;
+ case 5:
+ break;
+ case 6:
+ break;
+ }
+ }
+ }
+
+ private void ping(HashMap<String, String> client) {
+ String ipAddress = client.get("ip");
+ int clientID = Integer.parseInt(client.get("id"));
+ GearmanJob job = GearmanJobImpl.createJob("ping", ipAddress.getBytes(),
+ "ping" + clientID);
+ STATUS.put(clientID, 1); // ping started
+ gearmanClient.submit(job);
+ PING_JOBS.put(clientID, job);
+ System.out.println("ping " + ipAddress);
+ }
+
+ private void wakeOnLan(HashMap<String, String> client) {
+ String macAddress = client.get("mac");
+ int clientID = Integer.parseInt(client.get("id"));
+ GearmanJob job = GearmanJobImpl.createJob("wol", macAddress.getBytes(),
+ "wol" + clientID);
+ STATUS.put(clientID, 4); // wake on lan started //
+ gearmanClient.submit(job);
+ WOL_JOBS.put(clientID, job);
+ System.out.println("wake on lan " + macAddress);
+ }
+
+ private void ssh(HashMap<String, String> client) {
+ String ipAddress = client.get("ip");
+ int clientID = Integer.parseInt(client.get("id"));
+ GearmanJob job = GearmanJobImpl.createJob("ssh", ipAddress.getBytes(),
+ "ssh" + clientID);
+ STATUS.put(clientID, 6); // ssh started //
+ gearmanClient.submit(job);
+ SSH_JOBS.put(clientID, job);
+ System.out.println("ssh " + ipAddress);
+ }
+}
diff --git a/gearman/java/ControllerWorker/BootWorker.java b/gearman/java/ControllerWorker/BootWorker.java
new file mode 100644
index 0000000..09adedd
--- /dev/null
+++ b/gearman/java/ControllerWorker/BootWorker.java
@@ -0,0 +1,52 @@
+package ControllerWorker;
+
+import java.util.HashMap;
+import java.util.Vector;
+
+import org.gearman.client.GearmanJobResult;
+import org.gearman.client.GearmanJobResultImpl;
+import org.gearman.util.ByteUtils;
+import org.gearman.worker.AbstractGearmanFunction;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+
+public class BootWorker extends AbstractGearmanFunction {
+ @Override
+ public String getName() {
+ return "boot";
+ }
+
+ @Override
+ public GearmanJobResult executeFunction() {
+ String data = ByteUtils.fromUTF8Bytes((byte[]) this.data);
+ Vector<HashMap<String, String>> clients = new Vector<HashMap<String, String>>();
+ JSONArray jsonArray = (JSONArray) JSONValue.parse(data);
+
+ int count = 0;
+
+ for (Object clientObj : jsonArray) {
+ JSONObject clientJsonObj = (JSONObject) clientObj;
+ HashMap<String, String> clientMap = new HashMap<String, String>();
+ clientMap.put("id", Integer.toString(count));
+ clientMap.put("ip", clientJsonObj.get("ip").toString());
+ clientMap.put("mac", clientJsonObj.get("mac").toString());
+ clients.add(clientMap);
+ count++;
+ }
+
+ Boot boot = new Boot("127.0.0.1", 4730, clients);
+ boot.start();
+ System.out.println("Booting started");
+ String res = "Booting started";
+
+ byte[] warnings = new byte[0];
+ byte[] exceptions = new byte[0];
+ int numerator = 0;
+ int denominator = 0;
+ GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true,
+ res.getBytes(), warnings, exceptions, numerator, denominator);
+ return gjr;
+ }
+} \ No newline at end of file
diff --git a/gearman/java/ControllerWorker/ControllerWorkerMain.java b/gearman/java/ControllerWorker/ControllerWorkerMain.java
new file mode 100755
index 0000000..5415be9
--- /dev/null
+++ b/gearman/java/ControllerWorker/ControllerWorkerMain.java
@@ -0,0 +1,17 @@
+package ControllerWorker;
+
+import org.gearman.common.GearmanJobServerConnection;
+import org.gearman.common.GearmanNIOJobServerConnection;
+import org.gearman.worker.GearmanWorker;
+import org.gearman.worker.GearmanWorkerImpl;
+
+public class ControllerWorkerMain {
+ public static void main(String[] args) {
+ final GearmanJobServerConnection connection = new GearmanNIOJobServerConnection(
+ "127.0.0.1", 4730);
+ GearmanWorker bootWorker = new GearmanWorkerImpl();
+ bootWorker.registerFunction(BootWorker.class);
+ bootWorker.addServer(connection);
+ bootWorker.work();
+ }
+} \ No newline at end of file
diff --git a/gearman/java/ControllerWorker/SomePingWorker.java b/gearman/java/ControllerWorker/SomePingWorker.java
new file mode 100644
index 0000000..45e8dcf
--- /dev/null
+++ b/gearman/java/ControllerWorker/SomePingWorker.java
@@ -0,0 +1,60 @@
+package ControllerWorker;
+
+import org.gearman.client.GearmanClient;
+import org.gearman.client.GearmanClientImpl;
+import org.gearman.client.GearmanJob;
+import org.gearman.client.GearmanJobImpl;
+import org.gearman.client.GearmanJobResult;
+import org.gearman.client.GearmanJobResultImpl;
+import org.gearman.common.GearmanJobServerConnection;
+import org.gearman.common.GearmanNIOJobServerConnection;
+import org.gearman.util.ByteUtils;
+import org.gearman.worker.AbstractGearmanFunction;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONValue;
+
+public class SomePingWorker extends AbstractGearmanFunction {
+ @Override
+ public String getName() {
+ return "somePing";
+ }
+
+ @Override
+ public GearmanJobResult executeFunction() {
+ final GearmanJobServerConnection connection = new GearmanNIOJobServerConnection(
+ "127.0.0.1", 4730);
+ GearmanClient client = new GearmanClientImpl();
+ client.addJobServer(connection);
+ String data = ByteUtils.fromUTF8Bytes((byte[]) this.data);
+ JSONArray jsonArray = (JSONArray) JSONValue.parse(data);
+ int count = 0;
+ String res = "";
+
+ for (Object ipObj : jsonArray) {
+ String ip = ipObj.toString();
+ System.out.println("Ping " + ip);
+ GearmanJob job = GearmanJobImpl.createJob("ping", ip.getBytes(),
+ "pingJob");
+ client.submit(job);
+ try {
+ GearmanJobResult jobRes = job.get();
+ if (count == 0) {
+ res += ByteUtils.fromUTF8Bytes(jobRes.getResults());
+ } else {
+ res += "; " + ByteUtils.fromUTF8Bytes(jobRes.getResults());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ count++;
+ }
+ byte[] warnings = new byte[0];
+ byte[] exceptions = new byte[0];
+ int numerator = 0;
+ int denominator = 0;
+ GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true,
+ res.getBytes(), warnings, exceptions, numerator, denominator);
+ return gjr;
+ }
+} \ No newline at end of file
diff --git a/gearman/java/ControllerWorker/StatusWorker.java b/gearman/java/ControllerWorker/StatusWorker.java
new file mode 100644
index 0000000..deb6531
--- /dev/null
+++ b/gearman/java/ControllerWorker/StatusWorker.java
@@ -0,0 +1,29 @@
+package ControllerWorker;
+
+import org.gearman.client.GearmanJobResult;
+import org.gearman.client.GearmanJobResultImpl;
+import org.gearman.worker.AbstractGearmanFunction;
+
+public class StatusWorker extends AbstractGearmanFunction {
+ @Override
+ public String getName() {
+ return "status";
+ }
+
+ @Override
+ public GearmanJobResult executeFunction() {
+ // String data = ByteUtils.fromUTF8Bytes((byte[]) this.data);
+
+ // HashMap<Integer, Integer> status = Boot.STATUS;
+
+ String res = "Status Update";
+
+ byte[] warnings = new byte[0];
+ byte[] exceptions = new byte[0];
+ int numerator = 0;
+ int denominator = 0;
+ GearmanJobResult gjr = new GearmanJobResultImpl(this.jobHandle, true,
+ res.getBytes(), warnings, exceptions, numerator, denominator);
+ return gjr;
+ }
+} \ No newline at end of file
diff --git a/gearman/java/library/json-simple-1.1.jar b/gearman/java/library/json-simple-1.1.jar
new file mode 100644
index 0000000..f395f41
--- /dev/null
+++ b/gearman/java/library/json-simple-1.1.jar
Binary files differ