summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRefik Hadzialic2011-09-11 16:33:24 +0200
committerRefik Hadzialic2011-09-11 16:33:24 +0200
commit3c64da529af1e9be2bfa04bca8aec2b5a9fd52d3 (patch)
tree85ec6171877b9082f8e07ccf77f318adfccceadb
parentWorked on the look of the web site! (diff)
downloadgsm-selftest-3c64da529af1e9be2bfa04bca8aec2b5a9fd52d3.tar.gz
gsm-selftest-3c64da529af1e9be2bfa04bca8aec2b5a9fd52d3.tar.xz
gsm-selftest-3c64da529af1e9be2bfa04bca8aec2b5a9fd52d3.zip
Added a special server class socket class which supports also timeout in waiting for a connection. This way I can avoid a deadlock if the web site doesn't connect to the testing software it will automatically close itself
-rw-r--r--notFinishedCode/ServerClassSoftware.py162
-rw-r--r--notFinishedCode/web/ServerClassSoftware.py162
-rw-r--r--notFinishedCode/web/server1.py28
3 files changed, 348 insertions, 4 deletions
diff --git a/notFinishedCode/ServerClassSoftware.py b/notFinishedCode/ServerClassSoftware.py
new file mode 100644
index 0000000..206411e
--- /dev/null
+++ b/notFinishedCode/ServerClassSoftware.py
@@ -0,0 +1,162 @@
+import socket
+import sys
+import os
+import string
+import signal
+
+class TimeoutException(Exception):
+ pass
+
+class ServerHandlerSoftware:
+
+ def __init__(self,p):
+ self.port = p
+ self.host = None #symbolic name meaning all available interfaces
+ self.s = None
+ self.connected = 0
+ self.address = "127.0.0.1" #address of the main controller
+ self.onceConnected = 0
+ self.error = 'No error'
+
+ self.debugMode = 0
+
+ def openSocket(self, timeoutVar):
+ self.error = 'No error'
+ for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC,
+ socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
+ af, socktype, proto, canonname, sa = res
+
+
+ try:
+
+ self.s = socket.socket(af, socktype, proto)
+ self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets
+ self.s.settimeout(timeoutVar)
+
+ except socket.error, msg:
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+
+ try:
+ self.s.bind(sa)
+ self.s.listen(1)
+
+ except socket.error, msg:
+ self.s.close()
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+
+ break
+
+ if self.s is None:
+ self.connected = 0
+ return 0
+ else: #accept the connection
+ try:
+ self.connection, self.address = self.s.accept()
+ self.s.settimeout(0)
+ self.connected = 1
+ self.onceConnected = 1
+ return 1
+ except socket.timeout:
+ return 'TIMEOUT'
+
+ def connectedTo(self):
+ return self.address
+
+ def receiveData(self, timeout):
+ if self.connected == 1:
+
+ def timeout_handler(signum, frame):
+ raise TimeoutException()
+
+ try:
+
+ old_handler = signal.signal(signal.SIGALRM, timeout_handler)
+ signal.alarm(timeout) #start the timeout alarm, for timeout seconds
+
+ data = self.connection.recv(1024)
+
+ #stop the timeout function
+ signal.signal(signal.SIGALRM, old_handler)
+ signal.alarm(0)
+
+ if not data:
+ self.connected = 0
+ return 'NO DATA'
+ else:
+ return data
+
+ except TimeoutException:
+ #timeout happened
+ signal.signal(signal.SIGALRM, old_handler)
+ signal.alarm(0)
+ return 'TIMEOUT'
+
+ except Exception, e:
+ #stop the timeout timer
+ signal.signal(signal.SIGALRM, old_handler)
+ signal.alarm(0)
+
+ if self.debugMode == 1:
+ import traceback
+ print traceback.format_exc()
+ print e
+ self.connected = 0
+ if error[0:11] == '[Errno 104]':
+ return 3 #the other side reset the connection,[Errno 104] Connection reset by peer
+
+ return 2
+ else:
+ return 0
+
+ def sendData(self, data):
+ if self.connected == 1:
+ try:
+ self.connection.send(data)
+ return 1
+
+ except Exception, e:
+ if self.debugMode == 1:
+ import traceback
+ print traceback.format_exc()
+ print e
+ self.connecected = 0
+ return 2
+ else:
+ return 0
+
+ def closeConnection(self):
+ if self.onceConnected == 1:
+ try:
+ self.connected = 0
+ SHUT_RDWR = 2
+ self.connection.shutdown(SHUT_RDWR)
+ self.connection.close()
+ return 1
+ except Exception, e:
+ self.connected = 0
+ error = str(e)
+ if self.debugMode == 1:
+ import traceback
+ print traceback.format_exc()
+ print e
+ if error[0:11] == '[Errno 107]':
+ return 3 #the other side closed the connection before us [Errno 107] Transport endpoint is not connected
+ return 2
+ else:
+ return 0
+
+ def killPort(self):
+ killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read()
+ killResult = killResult.replace('\n','')
+ print killResult
+ if killResult!='':
+ print killResult
+ killPort = os.popen("kill -9 " + killResult).read()
+ return 1
+ return 0
diff --git a/notFinishedCode/web/ServerClassSoftware.py b/notFinishedCode/web/ServerClassSoftware.py
new file mode 100644
index 0000000..206411e
--- /dev/null
+++ b/notFinishedCode/web/ServerClassSoftware.py
@@ -0,0 +1,162 @@
+import socket
+import sys
+import os
+import string
+import signal
+
+class TimeoutException(Exception):
+ pass
+
+class ServerHandlerSoftware:
+
+ def __init__(self,p):
+ self.port = p
+ self.host = None #symbolic name meaning all available interfaces
+ self.s = None
+ self.connected = 0
+ self.address = "127.0.0.1" #address of the main controller
+ self.onceConnected = 0
+ self.error = 'No error'
+
+ self.debugMode = 0
+
+ def openSocket(self, timeoutVar):
+ self.error = 'No error'
+ for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC,
+ socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
+ af, socktype, proto, canonname, sa = res
+
+
+ try:
+
+ self.s = socket.socket(af, socktype, proto)
+ self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets
+ self.s.settimeout(timeoutVar)
+
+ except socket.error, msg:
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+
+ try:
+ self.s.bind(sa)
+ self.s.listen(1)
+
+ except socket.error, msg:
+ self.s.close()
+ self.s = None
+ self.connected = 0
+ self.error = str(msg)
+ continue
+
+ break
+
+ if self.s is None:
+ self.connected = 0
+ return 0
+ else: #accept the connection
+ try:
+ self.connection, self.address = self.s.accept()
+ self.s.settimeout(0)
+ self.connected = 1
+ self.onceConnected = 1
+ return 1
+ except socket.timeout:
+ return 'TIMEOUT'
+
+ def connectedTo(self):
+ return self.address
+
+ def receiveData(self, timeout):
+ if self.connected == 1:
+
+ def timeout_handler(signum, frame):
+ raise TimeoutException()
+
+ try:
+
+ old_handler = signal.signal(signal.SIGALRM, timeout_handler)
+ signal.alarm(timeout) #start the timeout alarm, for timeout seconds
+
+ data = self.connection.recv(1024)
+
+ #stop the timeout function
+ signal.signal(signal.SIGALRM, old_handler)
+ signal.alarm(0)
+
+ if not data:
+ self.connected = 0
+ return 'NO DATA'
+ else:
+ return data
+
+ except TimeoutException:
+ #timeout happened
+ signal.signal(signal.SIGALRM, old_handler)
+ signal.alarm(0)
+ return 'TIMEOUT'
+
+ except Exception, e:
+ #stop the timeout timer
+ signal.signal(signal.SIGALRM, old_handler)
+ signal.alarm(0)
+
+ if self.debugMode == 1:
+ import traceback
+ print traceback.format_exc()
+ print e
+ self.connected = 0
+ if error[0:11] == '[Errno 104]':
+ return 3 #the other side reset the connection,[Errno 104] Connection reset by peer
+
+ return 2
+ else:
+ return 0
+
+ def sendData(self, data):
+ if self.connected == 1:
+ try:
+ self.connection.send(data)
+ return 1
+
+ except Exception, e:
+ if self.debugMode == 1:
+ import traceback
+ print traceback.format_exc()
+ print e
+ self.connecected = 0
+ return 2
+ else:
+ return 0
+
+ def closeConnection(self):
+ if self.onceConnected == 1:
+ try:
+ self.connected = 0
+ SHUT_RDWR = 2
+ self.connection.shutdown(SHUT_RDWR)
+ self.connection.close()
+ return 1
+ except Exception, e:
+ self.connected = 0
+ error = str(e)
+ if self.debugMode == 1:
+ import traceback
+ print traceback.format_exc()
+ print e
+ if error[0:11] == '[Errno 107]':
+ return 3 #the other side closed the connection before us [Errno 107] Transport endpoint is not connected
+ return 2
+ else:
+ return 0
+
+ def killPort(self):
+ killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read()
+ killResult = killResult.replace('\n','')
+ print killResult
+ if killResult!='':
+ print killResult
+ killPort = os.popen("kill -9 " + killResult).read()
+ return 1
+ return 0
diff --git a/notFinishedCode/web/server1.py b/notFinishedCode/web/server1.py
index 00c4347..42cc376 100644
--- a/notFinishedCode/web/server1.py
+++ b/notFinishedCode/web/server1.py
@@ -1,7 +1,9 @@
-import ServerClass
+import ServerClassSoftware
import random
from time import sleep
import dbClass
+import sys
+
##########
#from Tkinter import *
@@ -26,22 +28,38 @@ xy = dbClass.DBMySQLConnection(user, passw, host, dbname)
print "connected to the DB ", xy.connectDB()
print 'mutex says' , xy.lockMutex(100)
-server = ServerClass.ServerHandler(34500) #define the port
-tried = server.openSocket()
+server = ServerClassSoftware.ServerHandlerSoftware(34500) #define the port
+tried = server.openSocket(2)
+
+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 tried == 'TIMEOUT':
+ closeFunction(xy,server)
test = server.receiveData(2)
+if test == 'TIMEOUT':
+ closeFunction(xy,server)
+
print test
if test == 'START TEST':
server.sendData('CONFIRM\n')
print 'TEST STARTED'
rndNum = random.randint(3,7)
for x in range(0,rndNum):
- sleep(2)
+ sleep(5)
print x
if server.sendData('SOME TEST WAS OK ' + str(x) + chr(10)) == 1:
print 'data sent successfully'
test = server.receiveData(2)
+ if test == 'TIMEOUT':
+ closeFunction(xy,server)
print test
if test == 'CONTINUE':
print 'continue test'
@@ -49,6 +67,8 @@ for x in range(0,rndNum):
if server.connected == 1:
server.sendData('TEST DONE\n')
test = server.receiveData(2)
+if test == 'TIMEOUT':
+ closeFunction(xy,server)
if test == 'DISCONNECT':
close = server.closeConnection()