summaryrefslogtreecommitdiffstats
path: root/gearman/topWorker.py
diff options
context:
space:
mode:
authorSebastian Wagner2011-08-12 13:49:51 +0200
committerSebastian Wagner2011-08-12 13:49:51 +0200
commit462d75ba6da4f35b439e91f074804a69484134af (patch)
treede7a12752361b22e6386741e41534a2b7d8cfd81 /gearman/topWorker.py
parentfehler behoben (diff)
downloadpoolctrl-462d75ba6da4f35b439e91f074804a69484134af.tar.gz
poolctrl-462d75ba6da4f35b439e91f074804a69484134af.tar.xz
poolctrl-462d75ba6da4f35b439e91f074804a69484134af.zip
some worker changes
Diffstat (limited to 'gearman/topWorker.py')
-rw-r--r--gearman/topWorker.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/gearman/topWorker.py b/gearman/topWorker.py
new file mode 100644
index 0000000..6a61c10
--- /dev/null
+++ b/gearman/topWorker.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+
+from gearman import GearmanWorker
+import subprocess
+import json
+import time
+import re
+
+def topWorker(worker, job):
+ ret = {"rawoutput": "", "rc": -1}
+ target = job.data.strip()
+
+ validIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
+ validHostnameRegex = "^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$"
+ if not (re.match(validIpAddressRegex, target) or re.match(validHostnameRegex, target)):
+ print 'malformed request'
+ return json.dumps({"error":"invalid parameter - must be ip or host address", "alive":False}) + "\n"
+
+
+ host = target
+ port = 22
+ user = "root"
+ sshopts = "-o PasswordAuthentication=no -a"
+ keyfile = "/etc/systemd/workers.ssh/id_rsa"
+ remotecmd = "top"
+
+ 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
+
+
+ sshCommand = subprocess.Popen(["sh", "-c", "%s" % cmd],
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+
+ while sshCommand.returncode == None:
+ out = sshCommand.stdout.readline()
+ if out != "":
+ ret['rawoutput'] += out
+ time.sleep(0.05)
+ sshCommand.poll()
+
+ while True:
+ out = sshCommand.stdout.readline()
+ if out != "":
+ ret['rawoutput'] += out
+ else:
+ break
+
+ ret['rawoutput'] = ret['rawoutput'].strip() # get rid of newlines
+ rc = ret['rc'] = sshCommand.returncode
+
+ if rc == 0:
+ lines = ret['rawoutput'].splitlines()
+ ret['top'] = []
+ for l in xrange(len(lines)):
+ rowentries = lines[l].split()
+#-------------------------------------------#
+# Hier noch die Daten des Top-Command ändern#
+#-------------------------------------------#
+# if len(rowentries) == 7:
+# (user, tty, login_date, login_time, foo ,pid, display ) = rowentries
+# if len(rowentries) == 6:
+# (user, tty, login_date, login_time, foo ,pid ) = rowentries
+# data = {'user': user, 'tty': tty, 'login_date':login_date, 'login_time':login_time, 'pid':pid, 'display':display}
+#-------------------------------------------#
+ ret['top'].append(data)
+ print 'remote command successful.'
+ return json.dumps(ret) + "\n"
+ else:
+ ret['err'] = ""
+ while True:
+ out = sshCommand.stderr.readline()
+ if out != "":
+ ret['err'] += out
+ else:
+ break
+ print 'remote command failed'
+ return json.dumps(ret) + "\n"
+
+
+worker = GearmanWorker(["127.0.0.1"])
+worker.register_task('top', topWorker)
+worker.work() \ No newline at end of file