#!/usr/bin/python
#
#  Copyright (c) 2001, Sean Reifschneider, tummy.com, ltd.  
#  All Rights Reserved.
#
#  Generate an HTML list of all user logins in the last 7 days, sorted
#  by time of login.
#
#  http://www.tummy.com/radiusContext/
#  ftp://ftp.tummy.com/pub/tummy/radiusContext/

days = 7

import string, re, time, sys, getopt, shelve
try:
	import gdbm
	usedbm = gdbm
except ImportError:
	import anydbm
	usedbm = anydbm

revision = "$Revision: 1.3 $"
rcsid = "$Id: loginlist,v 1.3 2001/12/14 23:26:40 jafo Exp $"

#################################
#  process command-line arguments
shortArgs = "d:hv?"
longArgs = [
		"database=",
		"help",
		"version",
		]
databaseName = "SessionData"

#  process options, retaining program name and non-option arguments
optlist, sys.argv[1:] = getopt.getopt(sys.argv[1:], shortArgs, longArgs)
for arg in optlist:
	if arg[0] == "-d" or arg[0] == "--database":
		databaseName = arg[1]

	if arg[0] == "-h" or arg[0] == "-?" or arg[0] == "--help":
		print "usage: loginlist [<arguments>] <detail file> [...]"
		print
		print "\t[ -d | --database <file> ]       Specify database file name."
		print "\t[ -v | --version  ]              Display program version."
		print "\t[ -h | -? | --help  ]            Display this usage message."
		sys.exit(0)

	if arg[0] == "-v" or arg[0] == "--version":
		print "Version", string.split(revision)[1]
		sys.exit(0)

##################
def strToTimet(s):
	#2001-10-17 14:59:26
	m = re.match(r'(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)', string.strip(s))
	if not m: return(None)
	when = map(int, m.groups()) + [ -1, -1, -1 ]
	return(time.mktime(when))

################################################
#  main code body, read records and process them
sessionData = shelve.open(databaseName)

list = sessionData.keys()
times = {}

#  load sessions that started within the window
minStart = time.time() - (days * 86400)
for key in list:
	user, when = string.split(key, ":", 1)
	if len(user) < 1: user = '00-EmptyUserName'

	sesStart = strToTimet(sessionData[key]['Session-Start-Date'])
	if sesStart < minStart: continue

	#  add this record to the list to be generated
	times[( sesStart, user )] = sessionData[key]

#  start writing the output file
fp = open('index-lastlogins.html', 'w')
fpCsv = open('index-lastlogins.csv', 'w')
title = "All Logins by Date Dial-In Report generated %s" % (
		time.strftime("%A, %B %d, %Y", time.localtime(time.time())) )
fp.write("<HTML>\n<HEAD>\n<TITLE>%s</TITLE>\n</HEAD>\n" % title)
fp.write("<BODY><H1>%s</H1>\n" % title)
fp.write("<TABLE BORDER=1>\n")
fp.write("<TR><TH>User Name</TH><TH>Login Time</TH><TH>Logout Time</TH>"
		"<TH>Session Duration<BR>(HH:MM:SS)</TH></TR>\n")
fpCsv.write('"User Name","Login Time","Logout Time","Session Duration"\n')

#  generate the sorted list
keys = times.keys()
keys.sort()
keys.reverse()
for key in keys:
	data = times[key]
	user = key[1]
	userLink = '<A HREF="%s.html">%s</A>' % ( user, user )

	duration = data['Acct-Session-Time']
	ds = '%02d:' % (duration / 3600)
	duration = duration % 3600
	ds = ds + '%02d:' % (duration / 60)
	duration = duration % 60
	ds = ds + '%02d' % duration
	duration = ds

	fp.write('<TR><TD>%s</TD><TD>%s</TD><TD>%s</TD><TD>%s</TD></TR>\n'
			% ( userLink, data['Session-Start-Date'], data['Session-End-Date'],
			duration ))
	fpCsv.write('"%s","%s","%s","%s"\n'
			% ( user, data['Session-Start-Date'], data['Session-End-Date'],
			duration ))

fp.write("</TABLE>\n")
fp.write("\n<P>Generated by <A HREF=\"http://www.tummy.com/radiusContext/\">"
		"radiusContext</A>\n")
fp.write("</BODY></HTML>\n")
fp.close()
fpCsv.close()
