#! /usr/bin/env python
# $Id: dpm-sql-usage-by-vo-user,v 1.1 2009/01/23 15:20:41 gcowan Exp $
# This file is released under the BSD licence.

__author__ = 'Samuel C Skipsey'
__date__ = 'June 2009'
__version = 0.7

'''Per DN, per VO, du-like listing for DPM, using MySQL db'''


import sys
import os
from optparse import OptionParser
import string
#shouldn need the two below, thanks to gridpp_dpm
import getpass
import MySQLdb
import gridpp_dpm

import time

def main():
	parser = OptionParser(
		usage = 'usage: %prog [-s][--si][--vo][--es]')
	parser.add_option('-s','--si',dest='si',action='store_true',
                      help='Use powers of 1000, not 1024.')
#    parser.add_option('--host',dest='host',default='localhost',
#                      help='Specify host of DPM MySQL DB')
#    parser.add_option('--user',dest='user',default='dpminfo',
#                      help='Specify user for MySQL DB')
#    parser.add_option('--silent', dest='silent', action='store_true', default=False,
#                      help='Silence password prompt')
	parser.add_option('--vo', dest='vo',default='',
                      help='Specify a VO matching string to limit query')
	parser.add_option('--es', dest='electricsheep', action='store_true',
	                  help='Machine-readable output for per-user accounting')

	(options, args) = parser.parse_args()
   
	if len(args) > 1:
		parser.error("incorrect number of arguments")
    #get passwd on prompt
#    passreqstr = ''
 #   if (not options.silent):
  #      passreqstr =  'Enter password for user ' + options.user +":"
  #  pwd = getpass.getpass(passreqstr)
  #  pwd = pwd.strip()

	(c,cc) = gridpp_dpm.MySQLConnect()
	options.vo += '%'
	try:
		if not options.electricsheep:	
			(uiddict,giddict,gidquery) = gridpp_dpm.vouser_lookupquery(cc,vo=options.vo)
			cc.execute('''SELECT gid, owner_uid, SUM(filesize) AS size FROM Cns_file_metadata %s GROUP BY gid, owner_uid ORDER BY gid, owner_uid''' % (gidquery))
		else:
			cc.execute('''SELECT gid, owner_uid, SUM(filesize) AS size FROM Cns_file_metadata GROUP BY gid, owner_uid ORDER BY gid, owner_uid''')
		results = cc.fetchall()
	except MySQLdb.Error, e:
		print "Error %d: $s" % (e.args[0], e.args[1])
		sys.exit(1)
	cc.close()
	c.close()
	if options.electricsheep:
		try:
			#c = MySQLdb.connect(host=h, user=u, passwd=p, db='user_accounting')
			#cc = c.cursor()
			#output stuff to accounting db
			dpmdb = ''
			(c,cc,dpmdb) = gridpp_dpm.MySQLConnect(True)
			cc.executemany('''INSERT INTO user_accounting.accounts (entry_date, gid, uid, filesize) VALUES(NOW(), %s, %s, %s)''', results) 
		except MySQLdb.Error, e:
			print "Error %d: %s" % (e.args[0], e.args[1])
			sys.exit(1)
	cc.close()
	c.close()
	vo = ''
	s = 0
	ss = 0
#	if options.electricsheep:
#		print time.time() 
#		for item in results:
#			print item[0], '\t' ,item[1], '\t' , item[2]
#	else:
	for item in results:
		if (not item[0]==vo):
			if (not vo == ''):
				print '\tTotal VO Filesize: ', gridpp_dpm.parse_size(s,options.si)
				ss += s
				s = 0
			vo = item[0]
			print '\tVO: ', giddict[item[0]]
		print '\t\tUser DN: ', uiddict[item[1]]
		print '\t\tFilesize: ', gridpp_dpm.parse_size(item[2], options.si)
		s += item[2]
	print '\tTotal VO Filesize: ', gridpp_dpm.parse_size(s, options.si)
	ss += s
	print 'Total Filesize: ', gridpp_dpm.parse_size(ss,options.si)

if __name__ == '__main__':
	main()
 
