summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gearman/lsWorker.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/gearman/lsWorker.py b/gearman/lsWorker.py
new file mode 100644
index 0000000..b619fb1
--- /dev/null
+++ b/gearman/lsWorker.py
@@ -0,0 +1,78 @@
+#!/usr/bin/python
+
+from gearman import GearmanWorker
+import subprocess
+import json
+import time
+import re
+
+def lsWorker(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({"err":"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 = "ls -al"
+
+ 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
+ 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['ls'] = []
+ for l in xrange(len(lines)):
+ if l == 0:
+ continue
+ rowentries = lines[l].split()
+ if len(rowentries) == 14:
+ (permissions, directories, owner, group, size, date, name) = rowentries
+ data = {'permissions': permissions, 'directories': directories, 'owner': owner, 'group': group, 'size': size, 'date': date, 'name': name}
+ ret['ls'].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('ls', lsWorker)
+worker.work()