#!/home/tariq/opt/stackless/bin/python

#/* copyright Tariq Rashid, 21-04-04, all rights reserved  */
#/* latest current GPL licence applied, unless overriden by author */

import threading
import time
import pyrad.packet
import pyrad.client
import pyrad.dictionary
import sys

tsize = 0

###########


class WorkerThread(threading.Thread):

    def __init__ (self, btime, interval):
        threading.Thread.__init__(self)
        self.btime = btime
        self.interval = interval
        # initialise radius client
        self.srv = pyrad.client.Client(server="1.2.3.4", authport=1645, secret="secret_pass", dict=pyrad.dictionary.Dictionary("./dictionary"))
        self.srv.retries = 1
        self.srv.timeout = 60
        self.req = self.srv.CreateAuthPacket(code=pyrad.packet.AccessRequest, User_Name="nadiatest1@dsl3.easynet.co.uk")
        self.req["User-Password"] = self.req.PwCrypt("t3st1ng");
        pass

    def run(self):
        global tsize
        # the work that the thread does ...

        # time radius query
        t1 = time.time()
        try:            
            # do the query itself
            self.reply = self.srv.SendPacket(self.req)
            
            if self.reply.code==pyrad.packet.AccessAccept:
                print "access accepted"
                pass
            else:
                print "access denied"
                pass
            
            t2 = time.time()
            dt = t2 - t1
            print "------ time taken = %0.8f" %(dt)
            tsize = tsize - 1
            print "------ tsize = ", tsize
            # to stderr
            print >> sys.stderr, "%0.8f %0.8f %0.8f" %(t1-self.btime, dt, self.interval)
                    
        except pyrad.client.Timeout:
            print "-1"
            print >> sys.stderr, "%0.8f -1" %(time.time() - t1)
            pass

        pass
            
    # end of work that the thread does ...
    pass
    
#######

max_threads = int(sys.argv[1])
interval = float(sys.argv[2])
stress_time = float(sys.argv[3])
interval_decrement = float(sys.argv[4])

first_time = time.time()
base_time = first_time

while (interval > 0):
    
    # only create new threads if max_threads is not reached
    if (tsize < max_threads):
        print "interval = ", interval
        WorkerThread(first_time, interval).start()
        tsize = tsize + 1
        time.sleep(interval)
    else:
        print "max_threads reached, -1"
        # print >> sys.stderr, "-2"
        pass

    # does the interval need to be changed?
    if ( (time.time() - base_time) > stress_time ):
        base_time = time.time()
        interval = interval - interval_decrement
        print "*** new interval:", interval
        pass
    
    pass
