import sys import os import re import time import MySQLdb import subprocess from time import sleep from datetime import datetime stop = "False" status = "" dbSStatus = "" #db configuration user = 'root' passw = 'mysqlpassword' host = 'localhost' dbname = 'gsmselftesting' global _from global to #function to ping def FuncPing(ip): global status lifeline = re.compile(r"(\d) received") report = ("No response","Partial Response","Alive") A=1,2,3 for host in A: pingaling = os.popen("ping -q -c2 "+ip,"r") while 1: line = pingaling.readline() if not line: break igot = re.findall(lifeline,line) if igot: status= report[int(igot[0])] # class for database class DBMySQLConnection: def __init__(self, username, password, host, dbname): #initialize at the start all the user parameters self.usern = username self.passw = password self.host = host self.db = dbname self.connectionCreated = 0 self.tasksList = list() global debugMode debugMode = 0 def connectDB(self): try: #try the connection self.datBaseConn=MySQLdb.connect(self.host,self.usern, self.passw,self.db) self.datBaseConn.paramstyle = 'format' self.cur = self.datBaseConn.cursor() #make the cursor, used for sending queries self.connectionCreated = 1 #use it as an indicator that the connection was created return 1 except MySQLdb.Error, e: #if we have an error then try to catch it error=str(e) if error[1:5] == '1045': #wrong username or password return 0 elif error[1:5] == '2002': #can't connect to mysql, mysql shutdown or wrong host return 2 else: if debugMode == 1: print error return 3 def closeDBConn(self): #close the connection to the database here if self.connectionCreated == 1: try: #close the cursor and then the connection to the DB self.cur.close() self.datBaseConn.close() return 1 except MySQLdb.Error, e: #in case of an error if debugMode == 1: error = str(e) print error return 3 else: #I never really had a connection return 0 def anyTasksToDo(self): #see are there any jobs to be executed and make a list out of it if self.connectionCreated == 1: try: self.cur.execute("SELECT * FROM TempTaskTable") output = self.cur.fetchall() #get the mysql response #parse the output from the mysql by creating a list #with lists where each attribue(column) gets independent #element of the list for record in output: columns = list() for entry in record: columns.append(str(entry)) self.tasksList.append(columns) return 1 except MySQLdb.Error, e: error = str(e) if error[1:5] == '1146': return 2 #the table doesn't exist if debugMode == 1: print str(e) return 3 else: return 0 def cleanTasksList(self): if self.connectionCreated == 1: del self.tasksList[:] return 1 else: return 0 def removeTaskFromList(self, taskID): #remove only one task from the task list if self.connectionCreated == 1: for index in range(len(self.tasksList)): item = self.tasksList[index] if item[0] == str(taskID): #self.tasksList.remove(index) #print 'found it' del self.tasksList[index] return 1 #deleted taskID return 2 #didn't find that taskID else: return 0 def deviceAddress(self,deviceName): if self.connectionCreated == 1: try: successful = self.cur.execute("SELECT `deviceIP` FROM DeviceAddress where `deviceName`=%s", deviceName) #self.cur.execute() output = self.cur.fetchall() #get the mysql response #parse the output from the mysql by creating a list #with lists where each attribue(column) gets independent #element of the list deviceAddr = '' for record in output: columns = list() for entry in record: deviceAddr = str(entry) return deviceAddr except MySQLdb.Error, e: error = str(e) if error[1:5] == '1146': return 2 #the table doesn't exist if debugMode == 1: print str(e) return 3 #some error happened else: return 0 #I am not connected def updateTaskResult(self, taskID, status): if self.connectionCreated == 1: try: successful = self.cur.execute("UPDATE TaskTable SET status=%i WHERE taskID=%i"%(int(status), int(taskID))) output = self.cur.fetchone() if debugMode == 1: print output if successful == 0: return 1 #update successful else: return 4 #taskID doesn't exist except MySQLdb.Error, e: if debugMode == 1: print str(e) return 3 else: return 0 def updatePingResult(self, taskNo, sipServer, sipGate, sipLoc, gsmBox1, gsmBox2): if self.connectionCreated == 1: try: successful = self.cur.execute("UPDATE PingResultTable SET sipServer=%i, sipGate=%i, sipLoc=%i, gsmBox1=%i, gsmBox2=%i WHERE taskNo=%i"%(int(sipServer), int(sipGate), int(sipLoc), int(gsmBox1), int(gsmBox2), int(taskNo))) output = self.cur.fetchone() if debugMode == 1: print output if successful == 0: return 1 #ping table updated else: return 4 #the taskNo didn't exist except MySQLdb.Error, e: if debugMode == 1: print str(e) return 3 else: return 0 def deleteTempTask(self, taskID): if self.connectionCreated == 1: try: successful = self.cur.execute("DELETE FROM TempTaskTable WHERE taskID=%i"%(int(taskID))) output = self.cur.fetchone() if debugMode == 1: print output if successful == 1: return 1 #deleted it else: return 4 #that taskID didn't exist or something else except MySQLdb.Error, e: if debugMode == 1: print str(e) return 3 else: return 0 def addResult(self, taskID, result): if self.connectionCreated == 1: try: successful = self.cur.execute("INSERT INTO ResultTable(taskID, result) VALUES ('%i', '%i')"%(int(taskID), int(result))) output = self.cur.fetchone() if debugMode == 1: print output if successful == 1: return 1 #successfully added the result else: return 4 #hmmm except MySQLdb.Error, e: error = str(e) if error[1:5] == '1062': return 2 #duplicate entry for the key if debugMode == 1: print str(e) return 3 else: return 0 # class for socket connection class Connection: def __init__(self, h, p): self.host = h self.port = p self.s = None self.connected = 0 def connect(self): self.s = None for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: self.s = socket.socket(af, socktype, proto) except socket.error, msg: self.s = None self.connected = 0 continue try: self.s.connect(sa) except socket.error, msg: self.s.close() self.connected = 0 self.s = None continue break if self.s is None: self.connected = 0 return '810 General socket layer error: Could not open socket' else: self.connected = 1 return '800 Socket connected' def send_data(self, data): if self.connected == 1: self.s.send(data) def receive_data(self): if self.connected == 1: return self.s.recv(1024) else: return '812 Socket is not connected.' def close_connection(self): if self.connected == 1: self.s.close() self.connected = 0 return 'Closed' # all Test case function # One function for all test case def FuncTest(orig, origadd, dest, destadd): global repeatTest repeatTest = "" #first make test from sip to gsm1 rz try: if dest =="Box1" or dest =="Box2": if dest =="Box1": y = Connection(destadd,50095) if dest =="Box2": y = Connection(destadd,50096) print "GSM handler", y.connect() y.send_data('hello server please wakeup the handler and be') sleep(1) y.send_data('caller') else: # open SIP caller handler command="--command=python " +orig subprocess.Popen(args=["gnome-terminal", command]) sleep(5) if orig=="SIP": x = Connection(origadd,50097) if orig == "landline": x = Connection(origadd,50098) if orig == "LocalSIP": x = Connection(origadd,50099) else: #mean external GSM x = Connection(origadd,50100) print "handler", x.connect() x.send_data('hello Handler') # wait respond from handler while 1: origHandler = x.receive_data() if origHandler <> "": break #think about time out if origHandler == "ready": print "sip handler ready" try: if dest =="Box1" or dest =="Box2": if dest =="Box1": y = Connection(destadd,50101) if dest =="Box2": y = Connection(destadd,50102) print "GSM handler", y.connect() y.send_data('hello server please wakeup the handler and be') sleep(1) y.send_data('receiver') else: command="--command=python " +dest subprocess.Popen(args=["gnome-terminal", command]) sleep(5) if orig=="SIP": x = Connection(origadd,50103) if orig == "landline": x = Connection(origadd,50104) if orig == "LocalSIP": x = Connection(origadd,50105) else: #mean external GSM x = Connection(origadd,50106) print "GSM handler", y.connect() y.send_data('hello Receiver, caller number') #wait respond from gsm handler while 1: destHandler = y.receive_data() if destHandler <> "": break #should have timeout = think about timeout if destHandler == "ready": x.send_data("start")#send message to handler to start the call sleep(2) x.send_data("destination number") #send destination number to sip caller and signal to start the call #wait respond from both of handler while 1: resultOrig = X.receive_data() resultDest = y.receive_data() if resultOrig <> "" or resultDest <> "": break #if failed, try one more time if resultOrig == "failed" or resultDest == "failed": y.send_data('hello Destination Handler') x.send_data("start + destination number") while 1: resultOrig = X.receive_data() resultDest = y.receive_data() if resultOrig <> "" or resultDest <> "": break #if still failed, save to db and update variable gsmRz2Sip == "1", so we make automatic test vice versa if resultOrig == "failed" or resultDest == "failed": db.execute ("update result table") repeatTest="true" else: #save to database, tell handler to terminated db.execute ("update result table") y.send_data("terminated") # signal GSM1 RZ to terminate else: statusTest = "604 General Handler Error: Destination handler no respond" #tell SIP handler to terminate x.send_data("terminated") y.close_connection() except ValueError: print "601 General Handler Error: Could not open Destination handler" else: statusTest = "605 General Handler Error: Origin handler no respond" x.close_connection() except ValueError: print "602 General Handler Error: Could not open Origin handler" # Main software # Check DB connection x = DBMySQLConnection(user, passw, host, dbname) print "connected to the DB ", x.connectDB() if dbStatus = 1: FuncPing("132.230.4.8") sipServerStatus = status FuncPing("132.230.4.8") sipLocalStatus = status FuncPing("132.230.4.8") sipGateStatus = status FuncPing("132.230.4.8") btsBox1Status = status # it will be on building 101 FuncPing("132.230.4.8") btsBox2Status = status # it will be on the building 52 # Fetch The task information from DB print "do i have anything to do", x.anyTasksToDo() for item in x.tasksList: taskID = item[0] callFrom = item[1] callTo = item[2] print "call from to ", taskID , callFrom , callTo if callFrom == "sip" and sipServerStatus <> "No response": if callTo == "gsmrz": if btsBox1Status <> "No response": FuncTest("SIPCall.py", "localhost", "Box1", "132.0.0.2") if repeatTest == "true": #select table, if there are have test from gsmrz to sip then skip #else, update db, put new data to tasktable. from gsmrz to sip if btsBox2Status <> "No response": FuncTest("SIPCall.py", "localhost", "Box2", "132.0.0.3") FuncTest("SIPCall.py", "localhost", "RZ1Receiver.py", "132.0.0.1") if callFrom =="gsmrz": if callTo =="sip" and sipServerStatus <> "No response": if btsBox1Status <> "No response": FuncTest("Box1", "132.0.0.2", "SIPReceiver.py", "localhost") if btsBox2Status <> "No response": FuncTest("Box2", "132.0.0.3", "SIPReceiver.py", "localhost") FuncTest("rz1caller.py", "132.0.0.1", "SIPReceiver.py", "localhost") # will exit if DB connection failed else: sys.exit(5)