summaryrefslogtreecommitdiffstats
path: root/gearman/shutdownWorker.py
diff options
context:
space:
mode:
authorSebastian Wagner2011-08-09 10:55:08 +0200
committerSebastian Wagner2011-08-09 10:55:08 +0200
commite55164216ca2027ed5d09300f0b416e5b33eff71 (patch)
tree10a5f4fcc04fa0d10992ec64fcfdd67386bdce68 /gearman/shutdownWorker.py
parentACL hinzugefĆ¼gt (diff)
downloadpoolctrl-e55164216ca2027ed5d09300f0b416e5b33eff71.tar.gz
poolctrl-e55164216ca2027ed5d09300f0b416e5b33eff71.tar.xz
poolctrl-e55164216ca2027ed5d09300f0b416e5b33eff71.zip
new worker files
Diffstat (limited to 'gearman/shutdownWorker.py')
-rw-r--r--gearman/shutdownWorker.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/gearman/shutdownWorker.py b/gearman/shutdownWorker.py
new file mode 100644
index 0000000..d73a0bd
--- /dev/null
+++ b/gearman/shutdownWorker.py
@@ -0,0 +1,69 @@
+#!/usr/bin/python
+
+from gearman import GearmanWorker
+import subprocess
+import json
+import time
+import re
+
+def shutdownWorker(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 = "shutdown -h now"
+
+ 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:
+ 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('shutdown', shutdownWorker)
+worker.work() \ No newline at end of file