summaryrefslogtreecommitdiffstats
path: root/gearman/controllerWorker
diff options
context:
space:
mode:
Diffstat (limited to 'gearman/controllerWorker')
-rw-r--r--gearman/controllerWorker/ControllerWorker/Boot.java176
-rw-r--r--gearman/controllerWorker/ControllerWorker/BootWorker.java49
-rwxr-xr-xgearman/controllerWorker/ControllerWorker/ControllerWorkerMain.java19
-rw-r--r--gearman/controllerWorker/ControllerWorker/SomePingWorker.java95
-rw-r--r--gearman/controllerWorker/ControllerWorker/StatusWorker.java29
-rw-r--r--gearman/controllerWorker/library/gearman-java-0.04-javadocs.jarbin0 -> 306527 bytes
-rwxr-xr-xgearman/controllerWorker/library/gearman-java-0.04.jarbin0 -> 92460 bytes
-rw-r--r--gearman/controllerWorker/library/json-simple-1.1.jarbin0 -> 16046 bytes
8 files changed, 368 insertions, 0 deletions
diff --git a/gearman/controllerWorker/ControllerWorker/Boot.java b/gearman/controllerWorker/ControllerWorker/Boot.java
new file mode 100644
index 0000000..70d8540
--- /dev/null
+++ b/gearman/controllerWorker/ControllerWorker/Boot.java
@@ -0,0 +1,176 @@
+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 (pingJob != null) {
+ 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 (wolJob != null) {
+ 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/controllerWorker/ControllerWorker/BootWorker.java b/gearman/controllerWorker/ControllerWorker/BootWorker.java
new file mode 100644
index 0000000..1c909eb
--- /dev/null
+++ b/gearman/controllerWorker/ControllerWorker/BootWorker.java
@@ -0,0 +1,49 @@
+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);
+
+ for (Object clientObj : jsonArray) {
+ JSONObject clientJsonObj = (JSONObject) clientObj;
+ HashMap<String, String> clientMap = new HashMap<String, String>();
+ clientMap.put("id", clientJsonObj.get("id").toString());
+ clientMap.put("ip", clientJsonObj.get("ip").toString());
+ clientMap.put("mac", clientJsonObj.get("mac").toString());
+ clients.add(clientMap);
+ }
+
+ 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/controllerWorker/ControllerWorker/ControllerWorkerMain.java b/gearman/controllerWorker/ControllerWorker/ControllerWorkerMain.java
new file mode 100755
index 0000000..15df890
--- /dev/null
+++ b/gearman/controllerWorker/ControllerWorker/ControllerWorkerMain.java
@@ -0,0 +1,19 @@
+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.registerFunction(SomePingWorker.class);
+ bootWorker.registerFunction(StatusWorker.class);
+ bootWorker.addServer(connection);
+ bootWorker.work();
+ }
+} \ No newline at end of file
diff --git a/gearman/controllerWorker/ControllerWorker/SomePingWorker.java b/gearman/controllerWorker/ControllerWorker/SomePingWorker.java
new file mode 100644
index 0000000..d37745c
--- /dev/null
+++ b/gearman/controllerWorker/ControllerWorker/SomePingWorker.java
@@ -0,0 +1,95 @@
+package ControllerWorker;
+
+import java.util.*;
+import java.util.concurrent.ExecutionException;
+
+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 = "";
+
+ List<GearmanJob> jobs = new ArrayList<GearmanJob>();
+
+ for (Object ipObj : jsonArray) {
+ String ip = ipObj.toString();
+ System.out.println("Ping " + ip);
+ GearmanJob job = GearmanJobImpl.createJob("ping", ip.getBytes(),
+ "pingJob");
+ client.submit(job);
+ jobs.add(job);
+ count++;
+ }
+
+ Boolean exit=false;
+ while (!exit) {
+ ListIterator<GearmanJob> it = jobs.listIterator();
+ while (it.hasNext()) {
+
+ GearmanJob j = it.next();
+ if (j.isDone()) {
+ System.out.println("job done..");
+ GearmanJobResult jobRes;
+ try {
+ jobRes = j.get();
+ if (count == 0) {
+ res += ByteUtils.fromUTF8Bytes(jobRes.getResults());
+ } else {
+ res += "; " + ByteUtils.fromUTF8Bytes(jobRes.getResults());
+ }
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ } else {
+ System.out.println("job not yet done ....");
+ }
+/* try {
+ GearmanJobResult jobRes = j.get();
+ if (count == 0) {
+ res += ByteUtils.fromUTF8Bytes(jobRes.getResults());
+ } else {
+ res += "; " + ByteUtils.fromUTF8Bytes(jobRes.getResults());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }*/
+ }
+ }
+ 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/controllerWorker/ControllerWorker/StatusWorker.java b/gearman/controllerWorker/ControllerWorker/StatusWorker.java
new file mode 100644
index 0000000..deb6531
--- /dev/null
+++ b/gearman/controllerWorker/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/controllerWorker/library/gearman-java-0.04-javadocs.jar b/gearman/controllerWorker/library/gearman-java-0.04-javadocs.jar
new file mode 100644
index 0000000..f98b8b9
--- /dev/null
+++ b/gearman/controllerWorker/library/gearman-java-0.04-javadocs.jar
Binary files differ
diff --git a/gearman/controllerWorker/library/gearman-java-0.04.jar b/gearman/controllerWorker/library/gearman-java-0.04.jar
new file mode 100755
index 0000000..5db9a94
--- /dev/null
+++ b/gearman/controllerWorker/library/gearman-java-0.04.jar
Binary files differ
diff --git a/gearman/controllerWorker/library/json-simple-1.1.jar b/gearman/controllerWorker/library/json-simple-1.1.jar
new file mode 100644
index 0000000..f395f41
--- /dev/null
+++ b/gearman/controllerWorker/library/json-simple-1.1.jar
Binary files differ