--- /dev/null
+#!/usr/bin/env python
+# Copyright 2007 James Bunton <jamesbunton@fastmail.fm>
+# Modified by Greg Darke <gdar9540@usyd.edu.au> (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()