summaryrefslogblamecommitdiffstats
path: root/gearman/controllerWorker/ControllerWorker/Boot.java
blob: cd43fb6162b320d72d91358ca3314ab56688b5e5 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16















                                               
                                           
































































                                                                                           
                                                      

















                                                                                                             


                                                         









                                                                           
                                                     










                                                                                                                   

                                                 

























                                                                                       
                                                               









                                                                                      
                                                       




                                                       
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.client.GearmanJobStatus;
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) {
					GearmanJobStatus jobStatus = gearmanClient
							.getJobStatus(pingJob);
					if (!jobStatus.isKnown() && pingJob.isDone()) {
						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);
							}
						}
					}
				}
				break;
			case 2:
				ssh(client);
				break;
			case 3:
				wakeOnLan(client);
				break;
			case 4:
				GearmanJob wolJob = WOL_JOBS.get(clientID);
				if (wolJob != null) {
					GearmanJobStatus jobStatus = gearmanClient
							.getJobStatus(wolJob);
					if (!jobStatus.isKnown() && wolJob.isDone()) {
						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);
						}
					}
				}
				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);
	}
}