Example #1
0
    def _send_thread(self):

        # Get Messages from DB
        self.msgs.extend(self._get_all())
        logger.info('Total %d messages to send' % len(self.msgs))

        while True:
            if self.stop_flag: 
                self.send_done = True
                break

            while len(self.msgs) > 0:
                msg = self.msgs.pop(0)
                if not self._send_msg(msg):
                    # ERROR, exit thread
                    self.stop_flag = True
                    break

            time.sleep(TIMEOUT)

            if (not self.send_done) and len(self.msgs) == 0:
                # Send SEND_DONE when all messages are sent
                # Thread does not die until recv thread receives SEND_DONE
                logger.debug('SEND_DONE')
                self._send(self.conn_send, SEND_DONE) 
                self.send_done = True


        logger.debug('send_thread exist')
Example #2
0
    def _send_thread(self):

        # Get Messages from DB
        self.msgs.extend(self._get_all())
        logger.info('Total %d messages to send' % len(self.msgs))

        while True:
            if self.stop_flag:
                self.send_done = True
                break

            while len(self.msgs) > 0:
                msg = self.msgs.pop(0)
                if not self._send_msg(msg):
                    # ERROR, exit thread
                    self.stop_flag = True
                    break

            time.sleep(TIMEOUT)

            if (not self.send_done) and len(self.msgs) == 0:
                # Send SEND_DONE when all messages are sent
                # Thread does not die until recv thread receives SEND_DONE
                logger.debug('SEND_DONE')
                self._send(self.conn_send, SEND_DONE)
                self.send_done = True

        logger.debug('send_thread exist')
Example #3
0
    def connect_to_sm(self, ip, port, server_conn=False):
        """ connect to specific IP:PORT
        """
        logger.debug('Try to connect to Site Manager and establish DTN connection')

        conn_send = DTN._tcp_connect(ip, port)

        if conn_send is not None:

            # send information
            conn_send.send('%s %s\n' % (self.sh, self.target))

            data = conn_send.recv(1024) 
            port_recv = 0

            if data == EXIST_ERR:
                logger.debug('DTN connection already exists between these two Site Managers')
                return False

            sh = data.split()[0]
            port_recv = int(data.split()[1])
            tar = ' '.join(data.split()[2:])
            logger.debug('SH: %s, Port: %d, Target: %s' % (sh, port_recv, tar))

            # check if site manager is connected
            if self.dtn.has_key(sh) and self.dtn[sh] is not None:
                conn_send.send(EXIST_ERR)
                logger.debug('DTN connection already exists between these two Site Managers')
                return False
            else:
                conn_send.send(SUCCESS_INFO)

            # connect to ip using another port
            conn_recv = DTN._tcp_connect(ip, port_recv)

            if conn_recv is not None:

                # Ready
                dtn_conn = DTNConnection(conn_send, conn_recv, self.sh, sh, tar, self, server_conn=server_conn)

                self.dtn[sh] = dtn_conn
                if not self.last_hash.has_key(sh):
                    self.last_hash[sh] = ''

                logger.info('New DTN connection established')
                dtn_conn.start()

                return True

        return False
Example #4
0
    def _daemon_thread(self):
        while True:
            #if not self.send_thread.isAlive() and self.recv_done:#not self.recv_thread.isAlive():
            if (self.send_done and self.recv_done) or ((not self.send_thread.isAlive()) and (not
                    self.recv_thread.isAlive())):#not self.recv_thread.isAlive():
                if self.stop_flag:
                    logger.error('Error happended or stop by user')
                break

            time.sleep(5)

        # Work is done, this instance of DTNConnection could be removed
        self.stop_flag = True
        self.send_thread.join()
        self.recv_thread.join()
        self.clean()
        logger.debug('clean done')
        logger.info('job done')
Example #5
0
    def _daemon_thread(self):
        while True:
            #if not self.send_thread.isAlive() and self.recv_done:#not self.recv_thread.isAlive():
            if (self.send_done and self.recv_done) or (
                (not self.send_thread.isAlive()) and
                (not self.recv_thread.isAlive())
            ):  #not self.recv_thread.isAlive():
                if self.stop_flag:
                    logger.error('Error happended or stop by user')
                break

            time.sleep(5)

        # Work is done, this instance of DTNConnection could be removed
        self.stop_flag = True
        self.send_thread.join()
        self.recv_thread.join()
        self.clean()
        logger.debug('clean done')
        logger.info('job done')
Example #6
0
    def bcast(self, bcast_port):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        s.sendto(BCAST_MSG, ('<broadcast>', bcast_port))
        logger.debug('send broadcast')

        s.settimeout(2)

        try:
            buf, addr = s.recvfrom(2048)
            logger.info('Received from %s: %s' % (buf.split()[0], buf.split()[1]))
            s.close()
            return buf.split()[0], int(buf.split()[1])

        except socket.timeout:
            logger.debug('no feedback')
        except :
            logger.debug('bcast socket error')

        s.close()
        return None
Example #7
0
    def bcast(self, bcast_port):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        s.sendto(BCAST_MSG, ('<broadcast>', bcast_port))
        logger.debug('send broadcast')

        s.settimeout(2)

        try:
            buf, addr = s.recvfrom(2048)
            logger.info('Received from %s: %s' %
                        (buf.split()[0], buf.split()[1]))
            s.close()
            return buf.split()[0], int(buf.split()[1])

        except socket.timeout:
            logger.debug('no feedback')
        except:
            logger.debug('bcast socket error')

        s.close()
        return None
Example #8
0
    def handle_dtn_listen(self, s):

        logger.info('DTN connection request')
        conn_recv, remote = s.accept()

        data = conn_recv.recv(1024)
        sh = data.split()[0]
        tar = ' '.join(data.split()[1:])
        logger.debug('SH: %s, Target: %s' % (sh, tar))

        if self.dtn.has_key(sh):
            logger.debug(self.dtn[sh])

        if self.dtn.has_key(sh) and self.dtn[sh] is not None:
            conn_recv.send(EXIST_ERR)
            logger.debug('DTN connection already exists between these two Site Managers')
            return False

        # Generate a random port for listening
        random_n = 1
        listener = None
        while True:
            try:
                listener = DTN._tcp_listen(self.my_ip, self.dtn_port+random_n)
            except:
                random_n += 1
                continue

            break
        conn_recv.send('%s %d %s' % (self.sh, self.dtn_port+random_n, self.target))
        data = conn_recv.recv(1024)

        if data == EXIST_ERR:
            logger.debug('DTN connection already exists between these two Site Managers')
            return False

        # wait for connection
        listener.settimeout(5)
        try:
            conn_send, remote = listener.accept()
        except socket.timeout:
            logger.debug('timeout')
            return False

        # remote[0] is IP
        # remote[1] is PORT
        #conn_send = DTN._tcp_connect(remote[0], port)

        if conn_send is not None:
            # send my SH info
            #conn_send.send('%s %s' % (self.sh, self.target))

            #data = conn_send.recv(1024) 
            #if data == EXIST_ERR:
                #logger.debug('DTN connection already exists between these two Site Managers')
                #return 
            #else:
                #logger.debug('Good')

            # Ready
            dtn_conn = DTNConnection(conn_send, conn_recv, self.sh, sh, tar, self)
            self.dtn[sh] = dtn_conn
            if not self.last_hash.has_key(sh):
                self.last_hash[sh] = ''
            #if sh == SERVER_SH_INFO:
                #self.server_connected = True
            logger.info('New DTN connection established')
            dtn_conn.start()
            return True

        return False
Example #9
0
    def connect_to_sm(self, ip, port, server_conn=False):
        """ connect to specific IP:PORT
        """
        logger.debug(
            'Try to connect to Site Manager and establish DTN connection')

        conn_send = DTN._tcp_connect(ip, port)

        if conn_send is not None:

            # send information
            conn_send.send('%s %s\n' % (self.sh, self.target))

            data = conn_send.recv(1024)
            port_recv = 0

            if data == EXIST_ERR:
                logger.debug(
                    'DTN connection already exists between these two Site Managers'
                )
                return False

            sh = data.split()[0]
            port_recv = int(data.split()[1])
            tar = ' '.join(data.split()[2:])
            logger.debug('SH: %s, Port: %d, Target: %s' % (sh, port_recv, tar))

            # check if site manager is connected
            if self.dtn.has_key(sh) and self.dtn[sh] is not None:
                conn_send.send(EXIST_ERR)
                logger.debug(
                    'DTN connection already exists between these two Site Managers'
                )
                return False
            else:
                conn_send.send(SUCCESS_INFO)

            # connect to ip using another port
            conn_recv = DTN._tcp_connect(ip, port_recv)

            if conn_recv is not None:

                # Ready
                dtn_conn = DTNConnection(conn_send,
                                         conn_recv,
                                         self.sh,
                                         sh,
                                         tar,
                                         self,
                                         server_conn=server_conn)

                self.dtn[sh] = dtn_conn
                if not self.last_hash.has_key(sh):
                    self.last_hash[sh] = ''

                logger.info('New DTN connection established')
                dtn_conn.start()

                return True

        return False
Example #10
0
    def handle_dtn_listen(self, s):

        logger.info('DTN connection request')
        conn_recv, remote = s.accept()

        data = conn_recv.recv(1024)
        sh = data.split()[0]
        tar = ' '.join(data.split()[1:])
        logger.debug('SH: %s, Target: %s' % (sh, tar))

        if self.dtn.has_key(sh):
            logger.debug(self.dtn[sh])

        if self.dtn.has_key(sh) and self.dtn[sh] is not None:
            conn_recv.send(EXIST_ERR)
            logger.debug(
                'DTN connection already exists between these two Site Managers'
            )
            return False

        # Generate a random port for listening
        random_n = 1
        listener = None
        while True:
            try:
                listener = DTN._tcp_listen(self.my_ip,
                                           self.dtn_port + random_n)
            except:
                random_n += 1
                continue

            break
        conn_recv.send('%s %d %s' %
                       (self.sh, self.dtn_port + random_n, self.target))
        data = conn_recv.recv(1024)

        if data == EXIST_ERR:
            logger.debug(
                'DTN connection already exists between these two Site Managers'
            )
            return False

        # wait for connection
        listener.settimeout(5)
        try:
            conn_send, remote = listener.accept()
        except socket.timeout:
            logger.debug('timeout')
            return False

        # remote[0] is IP
        # remote[1] is PORT
        #conn_send = DTN._tcp_connect(remote[0], port)

        if conn_send is not None:
            # send my SH info
            #conn_send.send('%s %s' % (self.sh, self.target))

            #data = conn_send.recv(1024)
            #if data == EXIST_ERR:
            #logger.debug('DTN connection already exists between these two Site Managers')
            #return
            #else:
            #logger.debug('Good')

            # Ready
            dtn_conn = DTNConnection(conn_send, conn_recv, self.sh, sh, tar,
                                     self)
            self.dtn[sh] = dtn_conn
            if not self.last_hash.has_key(sh):
                self.last_hash[sh] = ''
            #if sh == SERVER_SH_INFO:
            #self.server_connected = True
            logger.info('New DTN connection established')
            dtn_conn.start()
            return True

        return False