#!/usr/bin/env python # Copyright 2007 James Bunton # Modified by Greg Darke (2007) # Licensed for distribution under the GPL version 2, check COPYING for details # Check to see if people are online... import commands_async, pwd, socket, sys def matchNames(names): def getFullName(gecos_entry): return gecos_entry[: entry.pw_gecos.find(',')] def parsePWDentry(entry): return (entry.pw_name.lower(), getFullName(entry.pw_gecos).lower()) pwall = [parsePWDentry(entry) for entry in pwd.getpwall()] out = [] for name in names: found = False name = name.lower() for entry in pwall: username, realname = entry if username.find(name) >= 0 or realname.find(name) >= 0: found = True out.append((username, realname)) if not found: print "User '%s' not found in /etc/passwd, assuming you gave a username and you are not on the IT machines..." % name out.append((name, "[Not Found in /etc/passwd]")) return out def getSmbStatus(): def halfparse(data): return data.split('\n')[4:] sshcmd = "ssh %s -q -o StrictHostKeyChecking=no -o BatchMode=true '/usr/samba/bin/smbstatus -b'" cmd_async = commands_async.CommandRunner() cmd_async.executeCommand(sshcmd % "ugitsmb.ug.it.usyd.edu.au") cmd_async.executeCommand(sshcmd % "itsmb.ug.it.usyd.edu.au") cmd_async.waitForCompletion() data = [] for cmd, output in cmd_async.getOutputs().items(): data += halfparse(output) out = [] for line in data: line_split = line.strip().split() if not line_split or len(line_split) != 5: continue pid, username, group, _, ip = line_split host = socket.gethostbyaddr(ip[1:-1])[0] out.append((username, host)) return out def getLastStatus(): hosts = ["mono"] hosts += ['congo%d' % i for i in range(1,5)] hosts += ['nlp%d' % i for i in range(0,9)] #hosts += ['userf%d' % i for i in range(1,6)] sshcmd = "ssh %s -q -o StrictHostKeyChecking=no -o BatchMode=true 'last -a -t $(date +%%Y%%m%%d%%H%%M%%S)|grep \"still logged in\"'" ### sshcmd = "rsh -n %s 'last -a -t $(date +%%Y%%m%%d%%H%%M%%S)|grep \"still logged in\"'" cmd_async = commands_async.CommandRunner() for host in hosts: cmd_async.executeCommand(sshcmd % host) cmd_async.waitForCompletion() data = "".join(output for cmd,output in cmd_async.getOutputs().items()) out = [] for line in data.split('\n'): if not line.strip(): continue try: chunk = line.strip().split() username = chunk[0] ip = chunk[-1] except Exception, e: print "Error:", line, e return [] if ip == 'in': # From 'still logged in' host = "unknown" else: try: host = socket.gethostbyaddr(ip)[0] except: host = "unknown" out.append((username, host)) return out def printLocation((username, fullname), smbStatus): # Since we only want to know if they are at a location, and now how many times they are at # the location, we store it in a set locationList = set(ip for username2, ip in smbStatus if username == username2) if locationList: print "Username %s:\n Full name: '%s'\n %s\n" % \ (username, fullname, '\n '.join('Location: %s' % ip for ip in locationList)) def main(): names = matchNames(sys.argv[1:]) smbStatus = getSmbStatus() lastStatus = getLastStatus() status = smbStatus + lastStatus for name in names: printLocation(name, status) if __name__ == "__main__": main()