#!/usr/bin/python from gearman import GearmanWorker import subprocess import json import time import re def whoWorker(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 = "who -u" 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['who'] = [] for l in xrange(len(lines)): rowentries = lines[l].split() 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['who'].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('who', whoWorker) worker.work()