From 6b48c89d0b54a0430e612997f932886c6ee9905a Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Mon, 17 Oct 2011 14:46:27 +0200 Subject: ls job implemented --- .../controllerWorker/ControllerWorker/Boot.java | 73 +++++++++++++++++++++- .../ControllerWorker/ClientJob.java | 1 + .../ControllerWorker/ClientState.java | 42 +++++++------ .../ControllerWorker/Shutdown.java | 64 +++++++++++++++++++ gearman/lsWorker.py | 2 +- 5 files changed, 158 insertions(+), 24 deletions(-) (limited to 'gearman') diff --git a/gearman/controllerWorker/ControllerWorker/Boot.java b/gearman/controllerWorker/ControllerWorker/Boot.java index bac42e1..77b31a6 100755 --- a/gearman/controllerWorker/ControllerWorker/Boot.java +++ b/gearman/controllerWorker/ControllerWorker/Boot.java @@ -33,6 +33,7 @@ public class Boot extends Thread { private long waitTime; // private Vector psWhitelist; private Vector psBlacklist; + private String scsavPID; private final GearmanJobServerConnection gearmanConnection; private GearmanClient gearmanClient; @@ -176,6 +177,16 @@ 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: restart(client); @@ -658,9 +669,11 @@ 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); client.removeJob(whoJob); @@ -712,6 +725,7 @@ public class Boot extends Thread { JSONObject resultObj = (JSONObject) JSONValue.parse(result); if (!resultObj.containsKey("err")) { JSONArray ps = (JSONArray) resultObj.get("ps"); + scsavPID = resultObj.get("pid").toString(); // boolean whitelistFound = false; boolean blacklistFound = false; @@ -735,11 +749,13 @@ public class Boot extends Thread { * client.removeClientJob(job); } else { */ logger.info(client.getIp() + " is working"); + //client.setState(ClientState.USERPROCESSES_ARE_RUNNING, client.setState(ClientState.USER_IS_WORKING, gearmanClient); client.removeJob(psJob); // } } else { + logger.info(client.getIp() + " is not working"); // user is not working, doing restart client.setState(ClientState.RESTART_CLIENT, gearmanClient); @@ -760,6 +776,57 @@ public class Boot extends Thread { } } } + + // screensaver check + private void ls(Client client) { + GearmanJob job = GearmanJobImpl.createJob("ls", client.getIp() + .getBytes(), "ls" + client.getId()); + gearmanClient.submit(job); + client.setState(ClientState.CHECK_LS_PROGRESS, gearmanClient); + client.addJob(ClientJob.LSJOB, job); + logger.info("ls " + client.getIp()); + } + + private void checkLsProgress(Client client) throws Exception, IOException { + GearmanJob lsJob = client.getJob(ClientJob.LSJOB); + + if (lsJob != null) { + GearmanJobStatus jobStatus = gearmanClient.getJobStatus(lsJob); + + if (!jobStatus.isKnown() && lsJob.isDone()) { + GearmanJobResult psJobRes = lsJob.get(); + String result = ByteUtils.fromUTF8Bytes(psJobRes.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) { + client.setState(ClientState.USER_IS_WORKING, gearmanClient); + client.removeJob(lsJob); + } else { + 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); + } + } + } + } + //------------------ private void restart(Client client) { GearmanJob job = GearmanJobImpl.createJob("restart", client.getIp() diff --git a/gearman/controllerWorker/ControllerWorker/ClientJob.java b/gearman/controllerWorker/ControllerWorker/ClientJob.java index c4aa1e8..2b0bf16 100755 --- a/gearman/controllerWorker/ControllerWorker/ClientJob.java +++ b/gearman/controllerWorker/ControllerWorker/ClientJob.java @@ -10,6 +10,7 @@ public class ClientJob { public static int PSJOB = 4; public static int RESTARTJOB = 5; public static int SHUTDOWNJOB = 6; + public static int LSJOB = 7; private int JobType; private GearmanJob gearmanJob; diff --git a/gearman/controllerWorker/ControllerWorker/ClientState.java b/gearman/controllerWorker/ControllerWorker/ClientState.java index 14e0eea..37aebca 100755 --- a/gearman/controllerWorker/ControllerWorker/ClientState.java +++ b/gearman/controllerWorker/ControllerWorker/ClientState.java @@ -16,30 +16,32 @@ public enum ClientState { CHECK_RESTART_PROGRESS(10), CHECK_PING_RESTART_SHUTDOWN_PROGRESS(11), CHECK_PING_RESTART_BOOT_PROGRESS(12), + CHECK_LS_PROGRESS(13), //job states - CLIENT_IS_ALIVE(13), - SHUTDOWN_CLIENT(14), - SHUTDOWN_COMMAND_SENT(15), - PING_SHUTDOWN_AGAIN(16), - USER_IS_LOGGED_IN(17), - USER_IS_WORKING(18), - CLIENT_NOT_ALIVE(19), - MAGIC_PACKET_SENT(20), - PING_WOL_AGAIN(21), - WRONG_OS(22), - A_USER_IS_LOGGED_IN(23), - RESTART_CLIENT(24), - RESTART_COMMAND_SENT(25), - PING_RESTART_SHUTDOWN_AGAIN(26), - CLIENT_IS_DOWN(27), - PING_RESTART_BOOT_AGAIN(28), + CLIENT_IS_ALIVE(14), + SHUTDOWN_CLIENT(15), + SHUTDOWN_COMMAND_SENT(16), + PING_SHUTDOWN_AGAIN(17), + USER_IS_LOGGED_IN(18), + USER_IS_WORKING(19), + CLIENT_NOT_ALIVE(20), + MAGIC_PACKET_SENT(21), + PING_WOL_AGAIN(22), + WRONG_OS(23), + A_USER_IS_LOGGED_IN(24), + RESTART_CLIENT(25), + RESTART_COMMAND_SENT(26), + PING_RESTART_SHUTDOWN_AGAIN(27), + CLIENT_IS_DOWN(28), + PING_RESTART_BOOT_AGAIN(29), + USERPROCESSES_ARE_RUNNING(30), //final states - BOOT_SUCCESS(29), - BOOT_ERROR(30), - SHUTDOWN_SUCCESS(31), - SHUTDOWN_ERROR(32); + BOOT_SUCCESS(31), + BOOT_ERROR(32), + SHUTDOWN_SUCCESS(33), + SHUTDOWN_ERROR(34); ClientState(int state) { this.state = state; diff --git a/gearman/controllerWorker/ControllerWorker/Shutdown.java b/gearman/controllerWorker/ControllerWorker/Shutdown.java index 63ecd42..fda54e0 100755 --- a/gearman/controllerWorker/ControllerWorker/Shutdown.java +++ b/gearman/controllerWorker/ControllerWorker/Shutdown.java @@ -32,6 +32,7 @@ public class Shutdown extends Thread { private long waitTime; // private Vector psWhitelist; private Vector psBlacklist; + private String scsavPID; private final GearmanJobServerConnection gearmanConnection; private GearmanClient gearmanClient; @@ -161,6 +162,16 @@ public class Shutdown extends Thread { checkPsProgress(client); break; + + case USERPROCESSES_ARE_RUNNING: + ls(client); + + break; + + case CHECK_LS_PROGRESS: + checkLsProgress(client); + + break; case USER_IS_WORKING: logger.error(client.getIp() + " User has been working"); @@ -494,6 +505,8 @@ public class Shutdown extends Thread { * * } else { */ + logger.info(client.getIp() + " is working"); + //client.setState(ClientState.USERPROCESSES_ARE_RUNNING, client.setState(ClientState.USER_IS_WORKING, gearmanClient); client.removeJob(psJob); @@ -521,6 +534,57 @@ public class Shutdown extends Thread { } } } + + // screensaver check + private void ls(Client client) { + GearmanJob job = GearmanJobImpl.createJob("ls", client.getIp() + .getBytes(), "ls" + client.getId()); + gearmanClient.submit(job); + client.setState(ClientState.CHECK_LS_PROGRESS, gearmanClient); + client.addJob(ClientJob.LSJOB, job); + logger.info("ls " + client.getIp()); + } + + private void checkLsProgress(Client client) throws Exception, IOException { + GearmanJob lsJob = client.getJob(ClientJob.LSJOB); + + if (lsJob != null) { + GearmanJobStatus jobStatus = gearmanClient.getJobStatus(lsJob); + + if (!jobStatus.isKnown() && lsJob.isDone()) { + GearmanJobResult psJobRes = lsJob.get(); + String result = ByteUtils.fromUTF8Bytes(psJobRes.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) { + client.setState(ClientState.USER_IS_WORKING, gearmanClient); + client.removeJob(lsJob); + } else { + 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); + } + } + } + } + //------------------ public Boolean isFinished() { return finished && !error; diff --git a/gearman/lsWorker.py b/gearman/lsWorker.py index b619fb1..93c72e9 100644 --- a/gearman/lsWorker.py +++ b/gearman/lsWorker.py @@ -22,7 +22,7 @@ def lsWorker(worker, job): user = "root" sshopts = "-o PasswordAuthentication=no -a" keyfile = "/etc/systemd/workers.ssh/id_rsa" - remotecmd = "ls -al" + remotecmd = "ls -al /proc/" cmd = "ssh -p {p} -l {l} -i {i} {o} {h} {r}".format(p=port, l=user, i=keyfile, o=sshopts, h=host, r=remotecmd) print cmd -- cgit v1.2.3-55-g7522