From e55164216ca2027ed5d09300f0b416e5b33eff71 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Tue, 9 Aug 2011 10:55:08 +0200 Subject: new worker files --- gearman/shutdownWorker.py | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 gearman/shutdownWorker.py (limited to 'gearman/shutdownWorker.py') 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 -- cgit v1.2.3-55-g7522