#!/usr/bin/python
# -*- coding: utf-8 -*-
from toughbt import choosereactor
choosereactor.install_optimal_reactor(False)
from twisted.internet import reactor
from twisted.internet import utils
from twisted.python import log
import argparse,sys,os,signal
sys.path.insert(0,os.path.split(__file__)[0])
from toughbt import auth_master,auth_worker,mputils

class Logger:

    def info(self,msg):
        print msg

    def error(self, msg):
        print msg

def reactor_run():
    def ExitHandler(signum, stackframe):
        print "Got signal: %s" % signum
        reactor.callFromThread(reactor.stop)
    signal.signal(signal.SIGKILL, ExitHandler)
    reactor.run()

def exit(parser,status, msg=''):
    print (msg)
    parser.print_help()
    sys.exit(1)

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-auth', '--auth', action='store_true', default=False, dest='auth', 
        help='Run radius auth test')
    parser.add_argument('-acct', '--acct', action='store_true', default=False, dest='acct', 
        help='Run radius acct test')
    parser.add_argument('-m', '--master', action='store_true', default=False, dest='master', 
        help='Run benchmark master')
    parser.add_argument('-w', '--worker', action='store_true', default=False, dest='worker', 
        help='Run benchmark worker')
    parser.add_argument('-s', '--server', type=str, default='127.0.0.1', dest='server', 
        help='Radius server address')
    parser.add_argument('-P', '--port', type=int, default=1812, dest='port', 
        help='Radius server auth port or acct port')
    parser.add_argument('-e', '--secret', type=str, default='secret', dest='secret', 
        help='Radius testing share secret')
    parser.add_argument('-u', '--username', type=str, default='bmtest', dest='username', 
        help='Radius testing username')
    parser.add_argument('-p', '--password', type=str, default='123456', dest='password', 
        help='Radius testing password')
    parser.add_argument('-n', '--requests', type=int, default=100, dest='requests', 
        help='Number of requests to perform')
    parser.add_argument('-c', '--concurrency', type=int, default=10, dest='concurrency', 
        help='Number of multiple requests to make at a time')
    parser.add_argument('-v', '--verbosity', action='store_true', default=False, dest='verbosity', 
        help='How much troubleshooting info to print')
    parser.add_argument('-t', '--timeout', type=int, default=600, dest='timeout', 
        help='Seconds to max. wait for all response')    
    parser.add_argument('-f', '--fork', type=int, default=1, dest='fork', 
        help='Fork worker process nums, default 1')    
    parser.add_argument('-i', '--interval', type=int, default=2, dest='interval', 
        help='Stat data interval, default 2 sec')    
    parser.add_argument('-r', '--rate', type=int, default=5000, dest='rate', 
        help='Max send message rate , default 5000 per process')
    parser.add_argument('-conf', '--conf', type=str, default='', dest='conf', help='Radius testing config file')
    args = parser.parse_args(sys.argv[1:])
    if args.auth:
        if args.master:
            mp = mputils.MP(Logger(),args.verbosity)
            total_requests = (args.requests/args.fork)*args.fork
            per_requests = args.requests/args.fork
            auth_master.BenchmarkMaster(args.server,args.port,args.secret,
                total_requests,args.concurrency, args.username,args.password,
                args.verbosity,args.timeout,args.fork,args.interval,args.rate)
            cmd = sys.executable
            path = os.path.dirname(__file__)
            _args = [
                cmd,__file__,
                '--auth','-w',
                '-s',args.server,
                '-p',str(args.port),
                '-e',args.secret,
                '-u',args.username,
                '-p',args.password,
                '-n',str(per_requests),
                '-c',str(args.concurrency),
                '-t',str(args.timeout)
            ]
            for i in range(args.fork):
                mp.spawn("worker",cmd,_args,path=path, env={"LOGID":str(i)})

        elif args.worker:
            log.startLogging(sys.stdout)
            auth_worker.BenchmarkWorker(args.server,args.port,args.secret,
                args.requests,args.concurrency, args.username,
                args.password,args.verbosity,args.timeout,args.rate)
        
        def shutdown():
            mp.killall()

        reactor.addSystemEventTrigger('before', 'shutdown', shutdown)
        reactor_run()

        
    else:
        parser.print_help()


if __name__ == '__main__':
    main()

        

    
    
    


