def ensure_server_available(self):
        udpactive = self.udpEndpoint.check_heartbeat()
        if udpactive and self.tcpEndpoint.connectionStatus is NetworkEndpoint.PIPE_DISCONNECTED and not \
                self.tcpEndpoint.hangup:
            Log.network("Heartbeat found! Reconnecting TCP to " +
                        str(self.tcpEndpoint.remoteAddr))

            if self.tcpEndpoint.connect():
                self.inputSockets[self.tcpEndpoint.socket] = self.tcpEndpoint
                self.outputSockets[self.tcpEndpoint.socket] = self.tcpEndpoint
                Log.network("TCP connection established. Socket is %s" %
                            self.tcpEndpoint.socket)
            else:
                Log.warn("TCP not up yet!")

        if not udpactive and self.tcpEndpoint.connectionStatus >= NetworkEndpoint.PIPE_CONNECTED:
            Log.network("Heartbeat lost. Closing TCP")
            self.tcpEndpoint.close()
            try:
                del self.inputSockets[self.tcpEndpoint.socket]
                del self.outputSockets[self.tcpEndpoint.socket]
            except KeyError:
                Log.error("TCP already removed from pollable sockets")

        if self.tcpEndpoint.connectionStatus == NetworkEndpoint.PIPE_CONNECTED:
            self.tcpEndpoint.send_handshake()
예제 #2
0
 def event_received(self, event):
     self.requestLock = True  # Lock the request loop
     Log.info("Received method " + event.subject[2:])
     Log.info("Args are:" + str(event.msg))
     try:
         self.incomingActions[event.subject](event.msg)
     except KeyError:
         Log.error("Nothing registered for incoming action " + event.subject)
 def event_received(self, event):
     self.requestLock = True  # Lock the request loop
     Log.info("Received method " + event.subject[2:])
     Log.info("Args are:" + str(event.msg))
     try:
         self.incomingActions[event.subject](event.msg)
     except KeyError:
         Log.error("Nothing registered for incoming action " +
                   event.subject)
예제 #4
0
 def validate_same_day_duty(self, preacher_id, duty_date):
     Log.info("\nValidating Duties for Preacher ID: " + str(preacher_id) + " for date: " + str(duty_date))
     duty_date_list = []
     for roaster_obj in roaster_list:
         if roaster_obj.preacher_id == preacher_id and roaster_obj.duty_date == duty_date:
             duty_date_list.append(roaster_obj.duty_date)
     if len(duty_date_list) != 1:
         Log.error("\t Test failed, the preacher has been allotted " + len(duty_date_list) + " duties on date: " +  str(duty_date))
     else:
         Log.info("\t Validation successful, the preacher has been allotted only one duty for date: " +  str(duty_date))
예제 #5
0
 def execute_query(self, query, use_parameter="false", param="0"):
     cursor = None
     try:
         cursor = self.get_connection().cursor()
         Log.debug("\tExecuting the query: " + query)
         if use_parameter == "true":
             cursor.execute(query, param)
         else:
             cursor.execute(query)
         Log.debug('\tQuery was executed successfully')
     except Exception as ex:
         Log.error(ex)
     return cursor
예제 #6
0
 def validate_preacher_details(self, roaster_obj):
     Log.info("\nValidating Preacher Details for Preacher ID: " + str(roaster_obj.preacher_id) + " , language: " + roaster_obj.language)
     db_conn = DBBase()
     cursor = db_conn.execute_query((DBConstants.PREACHER_LANGUAGE).replace('$preacher_id', str(roaster_obj.preacher_id)).replace('$language', roaster_obj.language))
     preacher_obj = None
     if cursor is not None:
         row = cursor.fetchone()
         db_conn.close(cursor)
         if row is not None:
             preacher_obj = PreacherDTO(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]) 
             self.match_values('Active', preacher_obj.status, "ensuring the preacher assigned is in active status")
             self.match_values(roaster_obj.sewadar_name, preacher_obj.sewadar_name, "for sewadar name in roaster duty and preacher details")
         else:
             Log.error("Test failed, the preacher at id: " + str(roaster_obj.preacher_id) + " doesn't use the language: " + roaster_obj.language)
     else:
         Log.error("Unable to Open cursor")
예제 #7
0
    def send_message(self, message, args):
        args = args if args else {}
        retries = 5
        success = False
        Log.info("Publishing message " + str(message))

        while retries > 0:
            try:
                self.publish(message, args)
                success = True
            except Pyro.errors.ConnectionClosedError, e:
                Log.error(e)
                Log.error(
                    "Rebinding to server. {0} retries left.".format(str(retries)))
                self.adapter.rebindURI()
                retries -= 1
            if success:
                break
예제 #8
0
 def validate_centre_schedule(self, roaster_obj):
     Log.info("\nValidating Centre details for Centre ID: " + str(roaster_obj.centre_id) + " , week: " + roaster_obj.week + " , weekday: " + roaster_obj.weekday)
     db_conn = DBBase()
     query = (DBConstants.CENTRE_ID_QUERY).replace('$centre_id', str(roaster_obj.centre_id)).replace('$weeknum', roaster_obj.week).replace('$weekday', roaster_obj.weekday)
     cursor = db_conn.execute_query(query)
     if cursor is not None:
         row = cursor.fetchone()
         db_conn.close(cursor)
         if row is not None:
             centre_obj = CentreDTO(row[0], row[1], row[2], row[3], row[4], row[5]) 
             self.match_values('Active', centre_obj.status, "ensuring the details of centre are in active status")
             self.match_values(roaster_obj.centre_name, centre_obj.centre_name, "for centre name in roaster duty and centre schedule")
             self.match_values(roaster_obj.time, centre_obj.time, "for time details in roaster duty and centre schedule")
             self.match_values(roaster_obj.language, centre_obj.language, "for language in roaster duty and centre schedule")
         else:
             Log.error("Test failed, the language of centre and scheduled roaster for mentioned week, weekday and time doesn't match")
     else:
         Log.error("Unable to Open cursor")
예제 #9
0
 def __init__(self):
     """ Virtually private constructor. """
     if Browser.__instance != None:
         raise Exception("This class is a singleton!")
     else:
         try:
             command_executor = os.getenv(constants.EXECUTOR, "")
             chrome_options = webdriver.ChromeOptions()
             chrome_options.add_argument('--no-sandbox')
             chrome_options.add_argument('--disable-gpu')
             Browser.__instance = webdriver.Remote(
                 command_executor=command_executor,
                 desired_capabilities=chrome_options.to_capabilities())
         except WebDriverException as e:
             s = "%s" % e
             Log.error("Got exception %s" % s)
             Log.error("%s" % dir(s))
             if "Empty pool of VM for setup Capabilities" not in s:
                 raise
예제 #10
0
 def validate_preacher_leaves(self, roaster_obj):
     duty_date = roaster_obj.duty_date
     Log.info("\nValidating Preacher Leaves for Preacher ID: " + str(roaster_obj.preacher_id) + " for duty date: " + str(duty_date))
     db_conn = DBBase()
     cursor = db_conn.execute_query((DBConstants.PREACHER_LEAVES).replace('$preacher_id', str(roaster_obj.preacher_id)))
     i = 0
     if cursor is not None:
         for row in cursor.fetchall():
             i = i + 1
             from_date = row[1]
             till_date = row[2]
             Log.info("\tPreacher is on leave from date: " + str(from_date) + " till date: " + str(till_date))
             if from_date<=duty_date and duty_date<=till_date:
                 Log.error("The Duty date: " + duty_date + " is during preacher leave period from date: " + str(from_date) + " till date: " + str(till_date))
             else:
                 Log.info("The duty date doesn't fall under the leave period from date: " + str(from_date) + " till date: " + str(till_date))
         db_conn.close(cursor)
         if i==0 :   
             Log.info("Validation not needed, the preacher has not applied for any leaves")
     else:
         Log.error("Unable to Open cursor")                
예제 #11
0
 def get_connection(self):
     if self.db_connection is not None:
         Log.debug('\tDB Connection Successful')
         return self.db_connection
     else:
         try:
             driver = pyodbc.drivers()[0]
             Log.debug("\tConnecting to DB Using Driver: " + driver)
             username = os.getenv("DB_USERNAME", "dev")
             password = os.getenv("DB_PASSWORD", "dera@54321")
             db_connection = pyodbc.connect('DRIVER={' + driver + '};' +
                                            'SERVER=' + DBConstants.SERVER +
                                            ';' + 'PORT=' +
                                            DBConstants.DEFAULT_PORT + ';' +
                                            'DATABASE=' +
                                            DBConstants.DATABASE + ';' +
                                            'UID=' + username + ';' +
                                            'PWD=' + password)
             Log.debug('\tDB Connection Successful')
             return db_connection
         except Exception as ex:
             Log.error(ex)
             raise Exception('ERROR: Not able to establish a DB Connection')
예제 #12
0
    def ensure_server_available(self):
        udpactive = self.udpEndpoint.check_heartbeat()
        if udpactive and self.tcpEndpoint.connectionStatus is NetworkEndpoint.PIPE_DISCONNECTED and not \
                self.tcpEndpoint.hangup:
            Log.network("Heartbeat found! Reconnecting TCP to " + str(self.tcpEndpoint.remoteAddr))

            if self.tcpEndpoint.connect():
                self.inputSockets[self.tcpEndpoint.socket] = self.tcpEndpoint
                self.outputSockets[self.tcpEndpoint.socket] = self.tcpEndpoint
                Log.network("TCP connection established. Socket is %s" % self.tcpEndpoint.socket)
            else:
                Log.warn("TCP not up yet!")

        if not udpactive and self.tcpEndpoint.connectionStatus >= NetworkEndpoint.PIPE_CONNECTED:
            Log.network("Heartbeat lost. Closing TCP")
            self.tcpEndpoint.close()
            try:
                del self.inputSockets[self.tcpEndpoint.socket]
                del self.outputSockets[self.tcpEndpoint.socket]
            except KeyError:
                Log.error("TCP already removed from pollable sockets")

        if self.tcpEndpoint.connectionStatus == NetworkEndpoint.PIPE_CONNECTED:
            self.tcpEndpoint.send_handshake()
    def poll(self):
        self.ensure_server_available()

        # Loop through all messages in the socket till it's empty
        # If the lock is active, then the queue is not empty
        requestcounter = 0
        while self.requestLock:
            self.requestLock = False
            badsockets = []
            inputready = None
            outputready = None

            try:
                inputready, outputready, exceptready = select.select(
                    self.inputSockets.keys(), self.outputSockets.keys(),
                    badsockets, 0)
            except socket.error, e:
                if e[0] == NetworkErrors.EBADF:
                    Log.error(
                        "Bad file descriptor! Probably a dead socket passed to select"
                    )
                    Log.debug(self.inputSockets.keys())
                    Log.debug(self.outputSockets.keys())

            if badsockets:
                Log.error("Bad sockets: %s" % badsockets)

            if inputready:
                for s in inputready:
                    endpoint = self.inputSockets[s]
                    try:
                        endpoint.recv_msg()
                    except (ReadError, RuntimeError), e:
                        Log.error(
                            "Socket receive error! Closing %s. Reason: %s" %
                            (endpoint, e))
                        endpoint.close()
                        try:
                            del self.inputSockets[endpoint.socket]
                            del self.outputSockets[endpoint.socket]
                            try:
                                outputready.remove(endpoint.socket)
                            except ValueError:
                                pass
                        except KeyError:
                            Log.network("Socket missing. In input hangup")
                        continue
예제 #14
0
    def poll(self):
        self.ensure_server_available()

        # Loop through all messages in the socket till it's empty
        # If the lock is active, then the queue is not empty
        requestcounter = 0
        while self.requestLock:
            self.requestLock = False
            badsockets = []
            inputready = None
            outputready = None

            try:
                inputready, outputready, exceptready = select.select(
                        self.inputSockets.keys(),
                        self.outputSockets.keys(),
                        badsockets, 0)
            except socket.error, e:
                if e[0] == NetworkErrors.EBADF:
                    Log.error("Bad file descriptor! Probably a dead socket passed to select")
                    Log.debug(self.inputSockets.keys())
                    Log.debug(self.outputSockets.keys())

            if badsockets:
                Log.error("Bad sockets: %s" % badsockets)

            if inputready:
                for s in inputready:
                    endpoint = self.inputSockets[s]
                    try:
                        endpoint.recv_msg()
                    except (ReadError, RuntimeError), e:
                        Log.error("Socket receive error! Closing %s. Reason: %s" % (endpoint, e))
                        endpoint.close()
                        try:
                            del self.inputSockets[endpoint.socket]
                            del self.outputSockets[endpoint.socket]
                            try:
                                outputready.remove(endpoint.socket)
                            except ValueError:
                                pass
                        except KeyError:
                            Log.network("Socket missing. In input hangup")
                        continue
예제 #15
0
 def connect(self):
     self.create_socket()
     status = 0
     retries = 5
     while retries > 0:
         try:
             status = self.socket.connect(self.remoteAddr)
         except socket.error, e:
             if e[0] == NetworkErrors.EISCONN:
                 Log.network("...TCP connected!")
                 self.connectionStatus = NetworkEndpoint.PIPE_CONNECTED
                 break
             elif e[0] == NetworkErrors.EAGAIN:
                 Log.network("TCP connecting...")
                 retries -= 1
             elif e[0] == socket.timeout:
                 Log.error("Timed out")
                 self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED
             else:
                 Log.error("Connection failed!")
                 Log.error("Reason: " + str(e))
                 self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED
                 break
예제 #16
0
class TCPEndpoint(NetworkEndpoint):
    """Network endpoint using TCP"""
    def __init__(self, localport, remoteport, threaded=True, isserversocket=True, existingsocket=None):
        self.serverSocket = isserversocket
        self.hangup = False
        self.clientHandshakeCallbacks = set()
        self.handshakeAckCallbacks = set()
        if existingsocket:
            self.socket = existingsocket
        NetworkEndpoint.__init__(self, localport, remoteport, threaded)

    def close(self):
        self.hangup = True
        NetworkEndpoint.close(self)

    def create_socket(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.settimeout(5)

        if self.serverSocket:
            self.socket.bind(self.localAddr)
            self.socket.listen(2)

        if not self.threaded:
            self.socket.setblocking(0)
        else:
            self.socket.setblocking(1)

    def connect(self):
        self.create_socket()
        status = 0
        retries = 5
        while retries > 0:
            try:
                status = self.socket.connect(self.remoteAddr)
            except socket.error, e:
                if e[0] == NetworkErrors.EISCONN:
                    Log.network("...TCP connected!")
                    self.connectionStatus = NetworkEndpoint.PIPE_CONNECTED
                    break
                elif e[0] == NetworkErrors.EAGAIN:
                    Log.network("TCP connecting...")
                    retries -= 1
                elif e[0] == socket.timeout:
                    Log.error("Timed out")
                    self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED
                else:
                    Log.error("Connection failed!")
                    Log.error("Reason: " + str(e))
                    self.connectionStatus = NetworkEndpoint.PIPE_DISCONNECTED
                    break

        if status == 0:
            self.connectionStatus = NetworkEndpoint.PIPE_CONNECTED
        else:
            Log.error("Connection failed with error %s" % status)
        
        return self.connectionStatus
예제 #17
0
 def match_values(self, expected_value, actual_value, msg=""):
     if not actual_value == expected_value:
         message = "EXPECTED VALUE " + msg + " IS: " + expected_value + " HOWEVER ACTUAL VALUE IS: " + actual_value
         Log.error(message)
     else:
         Log.info("\tThe expected value and actual value matches "+ msg + " : " + actual_value)