#!/usr/bin/env python
# Copyright (c) 2004-2009, The Regents of the University of California,
# through Lawrence Berkeley National Laboratory (subject to receipt of 
# any required approvals from the U.S. Dept. of Energy).
# All rights reserved.
"""
Generate Best-Practices format GridFTP logs that
have the same format and semantics as the output
from the nl_parser run on GridFTP's "FTP_INFO" logs.
"""
__author__ = "Dan Gunter <dkgunter@lbl.gov>"
__rcsid__ = "$Id: nl_gridftp_log_gen 26511 2010-09-24 13:39:21Z dang $"

import random
import sys
import time
import uuid
from optparse import OptionParser

TEMPLATE = """ts=%(ts)s event=FTP_INFO level=Info code=226 end=%(end)s dest=%(destip)s stripes=%(stripes)d volume=/ buffer=0 host=%(hostip)s streams=%(streams)d user=%(user)s file=%(file)s prog=globus-gridftp-server dur=%(dur)lf guid=%(guid)s type=%(op)s block=262144 nbytes=%(size)s
"""

DATE_FMT = "%04d-%02d-%02dT%02d:%02d:%02d"

def utcFormatISO(sec):
    """Format 'sec' seconds since the epoch as a UTC ISO8601 date,
    in the UTC (GMT) timezone.
    Use the format: "YYYY-MM-DDThh:mm:ss.fffffffZ"
    """
    tm = time.gmtime(sec)
    usec = int((sec - int(sec)) * 1e6)
    iso_date = "%s.%06dZ" % (DATE_FMT % tm[0:6], usec)
    return iso_date

def generate(ofile, n=None, eps=None):
    """Generate gridftp events to 'ofile'.
    """
    filechars = list("hellothere")
    guids = [uuid.uuid1().get_hex() for i in range(4)]
    for i in xrange(n):
        random.shuffle(filechars)
        values = dict(ts = time.time(),
                      end = time.time() + random.random() * 100,
                      stripes = 1,
                      streams = pow(2, random.randint(0, 3)),
                      hostip = '111.222.333.%d' % random.randint(200, 209),
                      destip = '111.222.333.%d' % random.randint(200, 209),
                      user = 'dang', 
                      file = ''.join(filechars),
                      op = ("STOR", "RECV")[random.randint(0,1)],
                      size = random.randint(1,1000) * 1024, 
                      guid = guids[random.randrange(0,len(guids))],
                      )
        values['dur'] = values['end'] - values['ts']
        for key in 'ts', 'end':
            values[key] = utcFormatISO(values[key])
        event = TEMPLATE % values
        ofile.write(event)
        if eps > 0:
            time.sleep(1.0/eps)

def main():
    desc = ' '.join(__doc__.split())
    parser = OptionParser(description=desc)
    parser.add_option("-n", "--num", action="store", type="int",
                      dest="num_events", metavar="N", default=100,
                      help="Number of events to generate (default=%default)")
    parser.add_option("-r", "--rate", action="store", type="float",
                      dest="events_per_sec", metavar="EPS", default=1,
                      help="Number of events per second (default=%default)")
    options, args = parser.parse_args()
    generate(sys.stdout, n=options.num_events, eps=options.events_per_sec)
    return 0

if __name__ == '__main__':
   sys.exit(main())
