From 1c009430af80260d67c47652783931414989c75d Mon Sep 17 00:00:00 2001 From: gsmselftest Date: Wed, 9 Nov 2011 16:41:00 +0100 Subject: Final folder team project --- Code/Server-Code/gsmselftest.py | 765 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 765 insertions(+) create mode 100755 Code/Server-Code/gsmselftest.py (limited to 'Code/Server-Code/gsmselftest.py') diff --git a/Code/Server-Code/gsmselftest.py b/Code/Server-Code/gsmselftest.py new file mode 100755 index 0000000..3bda2c5 --- /dev/null +++ b/Code/Server-Code/gsmselftest.py @@ -0,0 +1,765 @@ +#! /usr/bin/env python +from serial import * #serial port library +import sys +import ControllerClass +import DbClass +import PingClass +import trueTableClass +import initTestClass +import usbDetectClass +import ServerClassSoftware +import signal +import random +from time import sleep + +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + + def disable(self): + self.HEADER = '' + self.OKBLUE = '' + self.OKGREEN = '' + self.WARNING = '' + self.FAIL = '' + self.ENDC = '' +class TimeoutException(Exception): + pass + +global resultsList +resultsList = list() +global taskNo +dbStatus = None +global caller +global callee + +def timeout_handler(signum, frame): + raise TimeoutException() + +def allPing(): #ping all existing devices + + global sipGate + global sipServer + global unisip + global gsmBox1 + global gsmBox2 + + serverAdd = db.deviceAddress(str('landline')) + server = PingClass.Ping(str(serverAdd[4])) + sipGate = server.ping(1) + + serverAdd = db.deviceAddress(str('sip')) + server = PingClass.Ping(str(serverAdd[4])) + sipServer = server.ping(1) + + serverAdd = db.deviceAddress(str('unisip')) + server = PingClass.Ping(str(serverAdd[4])) + unisip = server.ping(1) + + serverAdd = db.deviceAddress(str('GSMRZ2')) + server = PingClass.Ping(str(serverAdd[4])) + gsmBox1 = server.ping(1) + + serverAdd = db.deviceAddress(str('GSMRZ3')) + server = PingClass.Ping(str(serverAdd[4])) + gsmBox2 = server.ping(1) + +def initDB(): # function for connection database + global dbStatus + global db + if dbStatus != 1: + db = DbClass.DBMySQLConnection('root', 'randompasswordSQL', 'localhost', 'gsmselftesting') + db.connectDB() + dbStatus = db.connectDB() + if dbStatus == 1: + print 'Lock the mutex: ' + str(db.lockMutex(600)) + +def initTrueTable(x): + initResult = trueTableClass.trueTable(x) + initResult.initTrueTable() + + print '\n' + openBSC = None + asterikServer = None + finalResult = list() + for x in initResult.nanoBts: + + name = x[0] + if x[1] == True: + openBSC = True + asterikServer = True + print bcolors.OKGREEN +name+ ' Working'+ bcolors.ENDC + + else: + if int(x[1]) == 486: + print bcolors.FAIL+name+ ' not Working' + bcolors.ENDC + elif int(x[1]) == 200: + print bcolors.OKGREEN +name+ ' Working' + asterikServer = True + elif int(x[1]) == 402: + print bcolors.WARNING +name+ ' not Working need top up the credit' + asterikServer = True + elif int(x[1]) == 998 or int(x[1]) == 999: + print bcolors.FAIL+name+ ' not Working, handler error'+ bcolors.ENDC + elif int(x[1]) == 801 or int(x[1]) == 802: + print bcolors.FAIL+name+ ' Device Error, Check the device'+ bcolors.ENDC + else: + print bcolors.OKGREEN +name+ ' not Working'+ bcolors.ENDC + + print '' + if openBSC != None: + if openBSC == True: + print bcolors.OKGREEN +'openBSC working'+ bcolors.ENDC + else: + print bcolors.FAIL+'openBSC doesnt work'+ bcolors.ENDC + print '' + + if initResult.asteriskServer == True or asterikServer == True: + print bcolors.OKGREEN +'asterik server is working'+ bcolors.ENDC + print '' + + if initResult.outGoingRZ == True: + print bcolors.OKGREEN +'Outgoing call from RZ is working'+ bcolors.ENDC + elif initResult.outGoingRZ == False: + print bcolors.FAIL+'Outgoing call from RZ is not working'+ bcolors.ENDC + + if initResult.incomingRZ == True: + print bcolors.OKGREEN +'incoming call from outside RZ to GSM RZ is working'+ bcolors.ENDC + elif initResult.incomingRZ == False: + print bcolors.FAIL+'incoming call from outside RZ to GSM RZ is not working'+ bcolors.ENDC + print '\n' + +def errorCodes(callFrom, callTo, result): + message = '|' + str(callFrom) + '|' + str(callTo) + '|' + str(result) + '|' + str(db.errorCode(result)) + print message + sendResultWebsite(message) + + # function to search in the list +def isThere(keyword,lists): + x = 0 + for item in lists: + + if item == keyword: + return 1 + else: + x = x+1 + +def testDest(callFrom, callTo, tried): + + makeTest.initTest(callFrom,callTo)#xxxx + db.insertTask(taskNum,callFrom,callTo) + smartResultList.append([callFrom,callTo, makeTest.result,tried]) + taskID = db.maxTaskID() + db.addResult(taskID, makeTest.result) + if WebStatus == True: + errorCodes(callFrom, callTo, makeTest.result) + +def smartTest(): + global smartResultList + smartResultList = list() + deviceLists = db.deviceList() + gsmList = list() + gsmRZList = list() + sipList = list() + destList = list() + rem = list() + item = list() + + cpgsmRZList = list() + + for lists in deviceLists: #define category of the device + device = lists[0] + if device[0:5] == 'GSMRZ': + gsmRZList.append(device) + cpgsmRZList.append(device) + elif device[0:5] == 'GSMEx': + gsmList.append(device) + else: + sipList.append(device) + + if device[0:5] == 'GSMRZ' or device[0:5] == 'GSMEx' or device == 'sip': + destList.append(device) + + #first test from university telphone network to random GSM RZ avaliable + i = random.randint(0, len(gsmRZList)-1) + callTo = gsmRZList[i] + callFrom = 'unisip' + testDest(callFrom, callTo, 1) + gsmRZList.remove(callTo) + destList.remove(callTo) + + + + for callFrom in gsmRZList: + i = random.randint(0, len(destList)-1) #Check whether the caller and dest are same + callTo = destList[i] + if callFrom == callTo: #Check whether the caller and dest are same + if i == 0: + i = i+1 # if it in the first list, change to be the second list else, just back on step. + else: + i = i-1 + callTo = destList[i] + + destList.remove(callTo) + destList.remove(callFrom) + gsmRZList.remove(callFrom) + testDest(callFrom, callTo, 1) + + + # test incoming call from outside rz network to gsm rz + i = random.randint(0, len(gsmRZList)-1) # + callTo = gsmRZList[i] + callFrom = 'landline' + + if isThere(callTo,destList) == 1: # Checking whether caller at gsmrz list in the destination list, if yes delete it. + destList.remove(callTo) + testDest(callFrom, callTo, 1) + + for callTo in destList: + callFrom = 'sip' + if callFrom != callTo: + testDest(callFrom, callTo, 1) + + #checking unsuccess call, to make sure that destination are really unreachable + for dest in smartResultList: + #check unsuccess call and did the test have already tried, 2 means has been check + if int(dest[2]) == 486 or int(dest[2]) == 999 or int(dest[2]) == 998 or int(dest[2]) == 801 or int(dest[2]) == 802: + if int(dest[3]) != 2 and dest[1] != 'sip': + testDestination = True + founds = False + testCaller = True + # make sure that destination have not tested by another part and give success result. + for test in smartResultList: + if test[1] == dest[1] or test[0] == dest[1]: + if int(test[2]) == 200: + testDestination = False + if test[1] == dest[0] or test[0] == dest[0]: + if int(test[2]) == 200: + testCaller = False + #if destination have not tested by other part. try to test from RZ GSM + if int(test[2]) == 200: + for caller in cpgsmRZList: + if caller == test[0] or caller == test[1]: + callFrom = caller + founds = True + + if dest[0] != 'sip': + founds = False + + if testDestination == True: + if founds != True: + callFrom = 'sip' + callTo = dest[1] + if dest[0] != 'sip': + testDest(callFrom, callTo, 2) + rem.append(dest) + + #check unsuccess call because caller handler having problem + #destination handler having problem, we should make test also to the caller + if int(dest[2]) == 998 or int(dest[2]) == 802 or int(dest[2]) == 486: + if testCaller == True: + if founds != True: + callFrom = 'sip' + callTo = dest[0] + testDest(callFrom, callTo, 2) + rem.append(dest) + + + caller = dest[0] # to test nanobts if the test come from RZ GSM but fehler + if caller[0:5] == 'GSMRZ' and int(dest[3]) != 2 and dest[1] != 'sip': + if int(dest[2]) == 486 or int(dest[2]) == 402: + callFrom = 'sip' + testDest(callFrom, dest[0], 2) + rem.append(dest) + + # test to make sure nanoBTS working or not. sice probably that nanotbts seems error but actually not. + for RZ in cpgsmRZList: + repeat = False + for gsmrzResult in smartResultList: + if gsmrzResult[0] == RZ or gsmrzResult[1] == RZ: + if int(gsmrzResult[2]) == 486 or int(gsmrzResult[2]) == 801 or int(gsmrzResult[2]) == 802: + repeat = True + From = gsmrzResult[0] + To = gsmrzResult[1] + result = gsmrzResult[2] + if int(gsmrzResult[2]) == 200: + repeat = False + if gsmrzResult[1] == RZ and int(gsmrzResult[2]) == 998: + try: + cpgsmRZList.remove(RZ) + except ValueError: + message = 'Error' + if gsmrzResult[0] == RZ and int(gsmrzResult[2]) == 999: + try: + cpgsmRZList.remove(RZ) + except ValueError: + message = 'Error' + + if len(cpgsmRZList) > 1: + if repeat == True: + i = random.randint(0, len(cpgsmRZList)-1) # + if i == 0: + x = i+1 + else: + x = i-1 + testDest(cpgsmRZList[x], cpgsmRZList[i], 2) + item = '['+str(From)+','+str(callTo)+','+str(result)+','+str(1)+']' + rem.append(item) + + for remov in rem: + for x in smartResultList: + if x == remov: + try: + smartResultList.remove(x) + except ValueError: + message = 'Error' + return smartResultList + +def doSmartTest(status): + global taskNum + global WebStatus + initDB() + taskNum = db.maxTaskNo() + global makeTest + if status == True: + WebStatus = True + else: + WebStatus = False + makeTest = initTestClass.initTesting() + result = smartTest() + initTrueTable(result) + if status == True: + sendFinishMessage() + + +def doSipTest(): + + #destList = ['gsmr1','gsmr2', 'gsmr3', 'landline', 'unisip', 'GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm' ] + destList = ['landline', 'unisip'] + doTest = initTestClass.initTesting() + for callTo in destList: + + callFrom = 'sip' + doTest.initTest(callFrom,callTo) + resultsList.append([callFrom, callTo, doTest.result]) + initTrueTable(resultsList) +def doIncomingTest(): #incoming call to RZ network + + destList = ['GSMRZ1','unisip', 'GSMRZ2','GSMRZ3'] + doTest = initTestClass.initTesting() + for callTo in destList: + callFrom = 'landline' + doTest.initTest(callFrom,callTo) + resultsList.append([callFrom, callTo, doTest.result]) + initTrueTable(resultsList) + +def doGsmrzTest(): + + destList = ['GSMRZ1','GSMRZ2', 'GSMRZ3'] + callList = ['sip'] + doTest = initTestClass.initTesting() + + for callFrom in callList: + for callTo in destList: + doTest.initTest(callFrom,callTo) + resultsList.append([callFrom, callTo, doTest.result]) + initTrueTable(resultsList) + +def doGsmExtTest(): + + destList = ['GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm'] + callList = ['sip'] + + doTest = initTestClass.initTesting() + + for callFrom in callList: + for callTo in destList: + doTest.initTest(callFrom,callTo) + resultsList.append([callFrom, callTo, doTest.result]) + initTrueTable(resultsList) + +def doAllTest(): + + doSipTest() + doIncomingTest() + doGsmrzTest() + doGsmExtTest() + + +def sendResultWebsite(message): + if server.sendData(message+ chr(10)) == 1: + print 'data sent successfully' + test = server.receiveData(5) + if test == 'TIMEOUT': + closeFunction(db,server) + sys.exit(2) + if test == 'CONTINUE': + print 'continue' + +def sendFinishMessage(): + if server.connected == 1: + server.sendData('TEST DONE\n') + test = server.receiveData(5) + if test == 'TIMEOUT': + closeFunction(db,server) + if test == 'DISCONNECT': + close = server.closeConnection() + if close == 1: + print 'Closed connection successfully' + + print 'release mutex says ', db.releaseMutex() + +def withDB(x): + + initDB() + + if x == False: + deviceLists = db.deviceList() + callerFound = False + calleeFound = False + for device in deviceLists: + if caller == device[0]: + callerFound = True + break + + for device in deviceLists: + if callee == device[0]: + calleeFound = True + break + if callerFound != True or calleeFound != True: + if callerFound != True: + print 'No device with name', caller + db.closeDBConn() + sys.exit(1) + if calleeFound != True: + print 'No device with name', callee + db.closeDBConn() + sys.exit(1) + if callerFound == True and calleeFound == True: + taskNumber = db.maxTaskNo() + db.insertTaskIn2(caller, callee, taskNumber) + resultsList = list() + if dbStatus == 1: # Checking connection to database + if db.anyTasksToDo() == 1: # Checking task on the table + + allPing() + i=0 + makeTest = initTestClass.initTesting() + + for item in db.tasksList: + + taskID = item[0] + taskNo = item[1] + callFrom = item[2] + callTo = item[3] + + if i == 0: + db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) + print '\n' + print 'Task ID :', taskID + print 'Calling From :', callFrom + print 'To :', callTo + + + makeTest.initTest(callFrom,callTo) + + db.addResult(taskID, makeTest.result) + + resultsList.append([callFrom, callTo, makeTest.result]) + + db.errorCode(makeTest.result) + + if int(makeTest.result) == 200: + print bcolors.OKGREEN +'Result : ' +str(makeTest.result)+ ' ' +db.errCode + bcolors.ENDC + else: + print bcolors.FAIL+'Result : ' +str(makeTest.result)+ ' ' +db.errCode + bcolors.ENDC + + if x == True: # if x = True means that this function call by website + + message = '|' + str(callFrom) + '|' + str(callTo) + '|' + str(makeTest.result) + '|' + str(db.errCode) + sendResultWebsite(message) # send result to website + + db.deleteTempTask(taskID) + i = i+1 + + db.cleanTasksList() + + if x == True: + sendFinishMessage() #send finish message to website and close the connection + + print '\n' + + initTrueTable(resultsList) # fetch result list and make adjustment about the result + db.closeDBConn() + else: + print bcolors.FAIL+"--- No job at all ---" + bcolors.ENDC + db.closeDBConn() + else: + print bcolors.FAIL+'Cant connect to database'+ bcolors.ENDC + sys.exit(1) + +def findPort(portName): # take information in existing usb port + global connect + global prefix + global num + global IMEI + global portClass + sleep(0.5) + portLog = os.popen('dmesg | grep \'pl2303 converter now attached to '+portName+'\'').read() + sleep(0.5) + if portLog != '': + connect = 1 + portClass = usbDetectClass.serialPort(portName) + portClass.findNumber() + portClass.findIMEI() + IMEI = portClass.IMEI + num = portClass.number + number = portClass.number + prefix = number[0:4] + else: + connect = 0 + +def initDevice(deviceName): + print 'Device Name :',deviceName + print ' Device IMEI : ', + imei = sys.stdin.readline().rstrip("\r\n") + print 'Phone number : ', + number = sys.stdin.readline().rstrip("\r\n") + print 'Port Name : /dev/', + portName = sys.stdin.readline().rstrip("\r\n") + print '' + + if imei == '' or portName == '': + print bcolors.FAIL+' == cant save device configuration, please fill IMEI / port name of the device =='+ bcolors.ENDC + else: + findPort(portName) + if connect == 1: + if str(IMEI) != str(imei) and str(num) != str(number): + print bcolors.FAIL+'== error, device not found =='+ bcolors.ENDC + elif str(IMEI) == str(imei): + portClass.initUpdate(deviceName, portName, number) + print bcolors.OKGREEN +'== Device succeced added =='+ bcolors.ENDC + elif str(num) == str(number) and str(IMEI) != str(imei): + portClass.initUpdate(deviceName, portName, number) + print bcolors.WARNING+'== Device succeced added, but have different IMEI =='+ bcolors.ENDC + else: + print bcolors.FAIL+'== error, no device connected =='+ bcolors.ENDC + +def autoUpdateDevice(status): + initDB() + GSMListPrefix = list() + GSMListPrefix = db.GSMPrefix() + i = 0 + x = 0 + count = 0 + while i !=10: + portName ='ttyUSB'+str(i) #checking usb connection + + i=i+1 + old_handler = signal.signal(signal.SIGALRM, timeout_handler) + signal.alarm(15) + try: + findPort(portName) + signal.signal(signal.SIGALRM, old_handler) + signal.alarm(0) + if connect == 1: + for listNum in GSMListPrefix: + if prefix == listNum[1]: + print 'Device Name :',listNum[0] + print 'IMEI :',IMEI + print 'Phone Number :',num + print 'Port Name : /dev/'+portName + x=x+1 + newPortName = '/dev/'+portName + portClass.initUpdate(listNum[0], newPortName, num) + print '\n' + except TimeoutException: + signal.signal(signal.SIGALRM, old_handler) + signal.alarm(0) + count = count + 1 + message = "Timeout" + if status == True: + sendFinishMessage() + else: + + print '== FINISH ==' + print 'Found '+str(x)+' devices' + +def updateDevice(): #update port name list of device on DB + quit = False + while quit != True: + print '' + print "Mobile device configuration" + print "Menu: a = automatic device configuration, m = Manual configuration, q = quit : ", + input = sys.stdin.readline().rstrip("\r\n") + print '' + if input == 'm': # manual configuration + + while True: + print '' + print "Mobile device name: " + print " 1. GSM O2" + print " 2. GSM Vodafone" + print " 3. GSM Eplus" + print " 4. GSM T-Mobile" + print " 5. GSM RZ 1" + print " 6. Back to menu" + print "" + print "your choise : ", + input = sys.stdin.readline().rstrip("\r\n") + + if input == '6': + break + elif input == '1': + initDevice('GSMExt.O2') + elif input == '2': + initDevice('GSMExt.Voda') + elif input == '3': + initDevice('GSMExt.Eplus') + elif input == '4': + initDevice('GSMExt.Tm') + elif input == '5': + initDevice('GSMRZ1') + else: + print 'please choose between 1-6' + + if input == 'a': #automatic configuration + autoUpdateDevice(False) + + if input == "q": + break + sys.exit() + +def closeFunction(dbConn,serverSocket): + print 'Release the mutex: ' + str(dbConn.releaseMutex()) + print 'Close the DB Connection: ' + str(dbConn.closeDBConn()) + del dbConn + del serverSocket + sys.exit() + +if len(sys.argv) > 1: + + command = sys.argv[1] + + print ' ' + + if command == '--all': + resultsList = list() + doAllTest() + + elif command == '--sip': + resultsList = list() + doSipTest() + + elif command == '--gsmrz': + resultsList = list() + doGsmrzTest() + + elif command == '--gsmext': + resultsList = list() + doGsmExtTest() + + elif command == '--incoming': + resultsList = list() + doIncomingTest() + + elif command == '--smart': + initDB() + resultsList = list() + allPing() + taskNo = db.maxTaskNo() + db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) + doSmartTest(False) + + elif command == '--devconf': + updateDevice() + + elif command == '--db': + if len(sys.argv) > 2: + try: + caller = sys.argv[2] + callee = sys.argv[3] + except ValueError: + print "Error given caller and destination. Type '--help' for more information." + else: + print "Error given caller and destination. Type '--help' for more information." + sys.exit() + resultsList = list() + withDB(False) + + elif command == '--help': + file = open('help.txt', 'r') + print file.read() + + else: + print "command not found, Type '--help' for more information." + print '\n' +else: + global server + global tried + + + initDB() # should put db condition + server = ServerClassSoftware.ServerHandlerSoftware(34500) #define the port + tried = server.openSocket(10) + + if tried == 'TIMEOUT': + closeFunction(db,server) + + test = server.receiveData(10) + if test == 'TIMEOUT': + closeFunction(db,server) + + if test == 'START TEST': + server.sendData('CONFIRM\n') + print 'TEST STARTED' + withDB(True) + + if test == 'SMART TEST': + allPing() + taskNo = db.maxTaskNo() + db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) + server.sendData('CONFIRM\n') + print 'SMART TEST STARTED' + resultsList = list() + doSmartTest(True) + #regularTest(True) + + if test == 'UPDATE DEVICE': + server.sendData('CONFIRM\n') + print 'UPDATE DEVICE STARTED' + autoUpdateDevice(True) + else: + sys.exit('WE DIDN\'T RECEIVE THE CONFIRMATION') + + db.closeDBConn() + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3-55-g7522