summaryrefslogtreecommitdiffstats
path: root/gearman/controllerWorker/ControllerWorker/Boot.java
diff options
context:
space:
mode:
Diffstat (limited to 'gearman/controllerWorker/ControllerWorker/Boot.java')
-rwxr-xr-xgearman/controllerWorker/ControllerWorker/Boot.java189
1 files changed, 131 insertions, 58 deletions
diff --git a/gearman/controllerWorker/ControllerWorker/Boot.java b/gearman/controllerWorker/ControllerWorker/Boot.java
index a560c80..6731e28 100755
--- a/gearman/controllerWorker/ControllerWorker/Boot.java
+++ b/gearman/controllerWorker/ControllerWorker/Boot.java
@@ -2,7 +2,9 @@ package ControllerWorker;
import java.io.IOException;
import java.lang.Thread;
+import java.text.SimpleDateFormat;
import java.util.Date;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.StringTokenizer;
import java.util.Vector;
@@ -32,9 +34,8 @@ public class Boot extends Thread {
private final int updateRate;
private long waitTime;
private long scsavTime;
- // private Vector<String> psWhitelist;
+ private Vector<String> psWhitelist;
private Vector<String> psBlacklist;
- private String scsavPID;
private final GearmanJobServerConnection gearmanConnection;
private GearmanClient gearmanClient;
@@ -42,16 +43,16 @@ public class Boot extends Thread {
private Boolean error;
public Boot(String eventName, Vector<Client> clients, String bootOS,
- int updateRate, long waitTime, long scsavTime, Vector<String> psWhitelist,
- Vector<String> psBlacklist, String gearmanServerAddress,
- int gearmanServerPort) {
+ int updateRate, long waitTime, long scsavTime,
+ Vector<String> psWhitelist, Vector<String> psBlacklist,
+ String gearmanServerAddress, int gearmanServerPort) {
this.eventName = eventName;
this.clients = clients;
this.bootOS = bootOS;
this.waitTime = waitTime * 1000;
this.scsavTime = scsavTime * 1000;
this.updateRate = updateRate; // updates per second
- // this.psWhitelist = psWhitelist;
+ this.psWhitelist = psWhitelist;
this.psBlacklist = psBlacklist;
gearmanConnection = new GearmanNIOJobServerConnection(
gearmanServerAddress, gearmanServerPort);
@@ -179,15 +180,15 @@ public class Boot extends Thread {
checkPsProgress(client);
break;
-
+
case USERPROCESSES_ARE_RUNNING:
ls(client);
-
+
break;
-
+
case CHECK_LS_PROGRESS:
checkLsProgress(client);
-
+
break;
case RESTART_CLIENT:
@@ -671,10 +672,9 @@ public class Boot extends Thread {
if (user.isEmpty()) {
logger.info(client.getIp()
+ " no user is logged in -CHECK PS-");
- /*
- * no user is logged in, doing restart
- * -----
- * didn´t work in test-pool, check ps
+ /*
+ * no user is logged in, doing restart ----- didn´t
+ * work in test-pool, check ps
*/
client.setState(ClientState.A_USER_IS_LOGGED_IN,
gearmanClient);
@@ -727,35 +727,62 @@ public class Boot extends Thread {
JSONObject resultObj = (JSONObject) JSONValue.parse(result);
if (!resultObj.containsKey("err")) {
JSONArray ps = (JSONArray) resultObj.get("ps");
- //int scsavPID = Integer.parseInt(resultObj.get("pid").toString());
- // boolean whitelistFound = false;
+ HashMap<String, HashMap<String, Integer>> psMap = new HashMap<String, HashMap<String, Integer>>();
+
+ for (Object obj : ps) {
+ HashMap<String, Integer> psEntry = new HashMap<String, Integer>();
+ JSONObject psLine = (JSONObject) obj;
+ String cmd = psLine.get("cmd").toString();
+ int pid = Integer.parseInt(psLine.get("pid")
+ .toString());
+ int ppid = Integer.parseInt(psLine.get("ppid")
+ .toString());
+ psEntry.put("pid", pid);
+ psEntry.put("ppid", ppid);
+ psMap.put(cmd, psEntry);
+ }
+
+ boolean whitelistFound = false;
boolean blacklistFound = false;
for (String blackEntry : psBlacklist) {
- if (ps.toString().contains(blackEntry)) {
+ if (psMap.containsKey(blackEntry)) {
blacklistFound = true;
+ break;
}
}
- /*
- * for (String whiteEntry : psWhitelist) { if
- * (ps.toString().contains(whiteEntry)) { whitelistFound
- * = true; } }
- */
+ for (String whiteEntry : psWhitelist) {
+ if (psMap.containsKey(whiteEntry)) {
+ HashMap<String, Integer> psEntry = psMap
+ .get(whiteEntry);
+ if (whiteEntry.equals("gnome-screensav")) {
+ if (psEntry.get("ppid") != 1) {
+ client.setScsavPID(psEntry.get("pid"));
+ whitelistFound = true;
+ break;
+ }
+ } else {
+ client.setScsavPID(psEntry.get("pid"));
+ whitelistFound = true;
+ break;
+ }
+ }
+ }
if (blacklistFound) {
- /*
- * if (whitelistFound) { logger.info(client.getIp()
- * + " is not working"); // is not working
- * status.put(client.getId(), 13);
- * client.removeClientJob(job); } else {
- */
- logger.info(client.getIp() + " is working");
- //client.setState(ClientState.USERPROCESSES_ARE_RUNNING,
- client.setState(ClientState.USER_IS_WORKING,
- gearmanClient);
+ if (whitelistFound) {
+ logger.info(client.getIp()
+ + " processes are running");
+ client.setState(
+ ClientState.USERPROCESSES_ARE_RUNNING,
+ gearmanClient);
+ } else {
+ logger.info(client.getIp() + " is working");
+ client.setState(ClientState.USER_IS_WORKING,
+ gearmanClient);
+ }
client.removeJob(psJob);
- // }
} else {
logger.info(client.getIp() + " is not working");
// user is not working, doing restart
@@ -774,11 +801,21 @@ public class Boot extends Thread {
client.setState(ClientState.BOOT_ERROR, gearmanClient);
client.removeJob(psJob);
}
+ } else {
+ logger.error(client.getIp()
+ + " Cannot check if user is working.");
+ client
+ .setError("The check if a user is working has been failed.");
+ /*
+ * cannot check if user is working, go in errorState
+ */
+ client.setState(ClientState.BOOT_ERROR, gearmanClient);
+ client.removeJob(psJob);
}
}
}
}
-
+
// screensaver check
private void ls(Client client) {
GearmanJob job = GearmanJobImpl.createJob("ls", client.getIp()
@@ -788,7 +825,7 @@ public class Boot extends Thread {
client.addJob(ClientJob.LSJOB, job);
logger.info("ls " + client.getIp());
}
-
+
private void checkLsProgress(Client client) throws Exception, IOException {
GearmanJob lsJob = client.getJob(ClientJob.LSJOB);
@@ -796,40 +833,76 @@ public class Boot extends Thread {
GearmanJobStatus jobStatus = gearmanClient.getJobStatus(lsJob);
if (!jobStatus.isKnown() && lsJob.isDone()) {
- GearmanJobResult psJobRes = lsJob.get();
- String result = ByteUtils.fromUTF8Bytes(psJobRes.getResults());
+ GearmanJobResult lsJobRes = lsJob.get();
+ String result = ByteUtils.fromUTF8Bytes(lsJobRes.getResults());
if (!result.isEmpty()) {
JSONObject resultObj = (JSONObject) JSONValue.parse(result);
if (!resultObj.containsKey("err")) {
-
- String clientScreenSaver = resultObj.get(scsavPID)
- .toString()
- + " " + resultObj.get("date").toString();
- /*
- //check screensaver has been running longer than 30min/1h
- if(clientScreenSaver < 30) {
- logger.info(client.getIp() + " screensaver has been running shorter than " + scsavTime/(1000*60) + " minutes.");
- client.setState(ClientState.USER_IS_WORKING, gearmanClient);
+ JSONArray ls = (JSONArray) resultObj.get("ls");
+ HashMap<String, Long> lsMap = new HashMap<String, Long>();
+
+ for (Object obj : ls) {
+ JSONObject lsLine = (JSONObject) obj;
+ String name = lsLine.get("name").toString();
+ SimpleDateFormat df = new SimpleDateFormat(
+ "y-M-d H:m");
+ Date date = df.parse(lsLine.get("date").toString()
+ + " " + lsLine.get("time").toString());
+ long timestamp = date.getTime();
+ lsMap.put(name, timestamp);
+ }
+
+ String scsavPID = Integer
+ .toString(client.getScsavPID());
+ long scsavTimestamp = lsMap.get(scsavPID);
+ Date date = new Date();
+ long currentTimestamp = date.getTime();
+ long beetweenTimestamp = currentTimestamp
+ - scsavTimestamp;
+
+ if (beetweenTimestamp < scsavTime) {
+ logger
+ .info(client.getIp()
+ + " screensaver has been running shorter than "
+ + scsavTime / (1000 * 60)
+ + " minutes, user is working.");
+ client.setState(ClientState.USER_IS_WORKING,
+ gearmanClient);
client.removeJob(lsJob);
} else {
- logger.info(client.getIp() + " screensaver has been running longer than " + scsavTime/(1000*60) + " minutes.");
- client.setState(ClientState.RESTART_CLIENT, gearmanClient);
+ logger
+ .info(client.getIp()
+ + " screensaver has been running longer than "
+ + scsavTime / (1000 * 60)
+ + " minutes, user is not working.");
+ client.setState(ClientState.RESTART_CLIENT,
+ gearmanClient);
client.removeJob(lsJob);
- }*/
+ }
+ } else {
+ logger.error(client.getIp()
+ + " Cannot check 'ls -al' of /proc/");
+ client
+ .setError("The check for screensaver has been failed.");
+ // cannot check ls, go in errorState
+ client.setState(ClientState.BOOT_ERROR, gearmanClient);
+ client.removeJob(lsJob);
}
- } else {
- logger.error(client.getIp() + " Cannot check 'ls -al' of /proc/");
- client
- .setError("The check for screensaver has been failed.");
- // cannot check ls, go in errorState
- client.setState(ClientState.BOOT_ERROR, gearmanClient);
- client.removeJob(lsJob);
- }
+ } else {
+ logger.error(client.getIp()
+ + " Cannot check 'ls -al' of /proc/");
+ client
+ .setError("The check for screensaver has been failed.");
+ // cannot check ls, go in errorState
+ client.setState(ClientState.BOOT_ERROR, gearmanClient);
+ client.removeJob(lsJob);
+ }
}
}
}
- //------------------
+
+ // ------------------
private void restart(Client client) {
GearmanJob job = GearmanJobImpl.createJob("restart", client.getIp()