Example #1
0
    def __dispatch_data(self, data, allow2other):
        ip_packages = IPProtocolHandler.parse_ip_package(data)
        ip_msg_map = {}

        for package in ip_packages:
            if package[0] == self.__tun_ip:
                send_bytes = self.__tun_connector.send(package[1])
                if send_bytes <= 0:
                    logger.error(
                        "InnerWorker %d trans bytes <=0 change state to CLOSED",
                        self.__id)
                    self.__state = self.State.CLOSED
                    return
            else:
                if not ip_msg_map.has_key(package[0]):
                    ip_msg_map[package[0]] = package[1]
                else:
                    ip_msg_map[package[0]] += package[1]

        if not allow2other:
            return

        for ip, data in ip_msg_map.items():
            trans_data = forward_data.ForwardData(
                forward_data.DATA_TYPE.TRANS_DATA, 0, ip, data)
            trans_data_event = forward_event.TransDataEvent(ip, trans_data)
            self.__north_interface_channel(trans_data_event)
Example #2
0
    def __recv_data(self, event):
        error_happen = False
        if event.fd_event & select.EPOLLIN:
            recv_msg = self._connector.recv()
            if len(recv_msg) > 0:
                # trans data
                # print 'recv outer %d msg:'%(self._worker_id)
                # tools.print_hex_buf(recv_msg)
                try:
                    trans_data = forward_data.ForwardData(
                        forward_data.DATA_TYPE.TRANS_DATA, self._worker_id,
                        self.__inner_ip, self.__inner_port, recv_msg)
                    trans_data_event = forward_event.TransDataEvent(
                        self._worker_id, trans_data)

                    self.__sourth_interface_channel(trans_data_event)
                    self._recv_flow_static.add_flow(len(recv_msg))
                except Exception, e:
                    error_happen = True
                    logger.error(
                        "OuterWorker %d current state:WORKING send data error"
                        % (self._worker_id))
                    logger.debug(traceback.format_exc())
            else:
                if self._connector.con_state != connector.CON_STATE.CON_CONNECTED:
                    error_happen = True
                logger.error(
                    "OuterWorker %d current state:WORKING recv data error" %
                    (self._worker_id))
Example #3
0
 def __handle_data(self):
     datas = self.__data_handler.get_forward_datas(self.__ring_buffer)
     for data in datas:
         if data.data_type in (forward_data.DATA_TYPE.CONNECTION_SUCCESS,
                               forward_data.DATA_TYPE.TRANS_DATA):
             trans_event = forward_event.TransDataEvent(data.id, data)
             self.__north_interface_channel(trans_event)
         elif data.data_type == forward_data.DATA_TYPE.CLOSE_CONNECTION:
             close_event = forward_event.CloseConEvent(data.id)
             self.__north_interface_channel(close_event)
         elif data.data_type == forward_data.DATA_TYPE.HEART_BEAT:
             self.send_heart_beat_reply()
             logger.info("InnerWorker %d send heartbeat reply " %
                         (self._worker_id))
Example #4
0
 def __handle_data(self):
     datas = self.__data_handler.get_forward_datas(self.__ring_buffer)
     for data in datas:
         if data.data_type in (forward_data.DATA_TYPE.NEW_CONNECTION,
                               forward_data.DATA_TYPE.TRANS_DATA):
             trans_event = forward_event.TransDataEvent(data.id, data)
             self.__sourth_interface_channel(trans_event)
         elif data.data_type == forward_data.DATA_TYPE.PRE_WORKING:
             self.__data_handler.send_preworking_reply(self.__connector)
         elif data.data_type == forward_data.DATA_TYPE.CLOSE_CONNECTION:
             close_event = forward_event.CloseConEvent(data.id)
             self.__sourth_interface_channel(close_event)
         elif data.data_type == forward_data.DATA_TYPE.HEART_BEAT:
             logger.debug('OuterWorker recv heartbeat reply')
             self.__last_hear_beat_reply_time = time.time()
Example #5
0
    def __handle_data(self):
        datas = self.__data_handler.get_forward_datas(self.__ring_buffer)

        if len(datas) <= 0:
            return

        if self.__state == self.State.LOGIN:
            for data in datas:
                if data.data_type == forward_data.DATA_TYPE.LOGIN_PUBKEY:
                    pubkey_data = json.loads(str(data.data))
                    pubkey = pubkey_data['public_key']
                    user_info = {
                        'user_name': cfg.CONF.USER_NAME,
                        'password': cfg.CONF.PASSWORD
                    }
                    encode_event = forward_event.RSAEvent(
                        forward_event.RSAEvent.Rsa_type.ENCODE,
                        (pubkey, json.dumps(user_info)))
                    encode_info = self.__sourth_interface_channel(encode_event)
                    self.__data_handler.login_to_server(
                        encode_info, self.__connector)
                elif data.data_type == forward_data.DATA_TYPE.LOGIN_SUCCESS:
                    self.__worker_id = data.id
                    ip_info = json.loads(str(data.data))
                    allocate_ip_event = forward_event.AllocateIPEvent(
                        ip_info['tun_ip'])
                    self.__sourth_interface_channel(allocate_ip_event)
                    self.__state = self.State.WORKING
                    logger.info(
                        'OuterWorker change state from LOGIN to WORKING')
                elif data.data_type == forward_data.DATA_TYPE.LOGIN_FAILED:
                    logger.error(
                        'OuterWorker login to server failed,change state to CLOSED'
                    )
                    self.__state = self.State.CLOSED
        elif self.__state == self.State.WORKING:
            for data in datas:
                if data.data_type == forward_data.DATA_TYPE.TRANS_DATA:
                    trans_event = forward_event.TransDataEvent(data.id, data)
                    self.__sourth_interface_channel(trans_event)
                elif data.data_type == forward_data.DATA_TYPE.HEART_BEAT:
                    logger.debug('OuterWorker recv heartbeat reply')
Example #6
0
    def __handle_working_event(self, event):
        error_happen = False
        if event.fd_event & select.EPOLLIN:
            recv_msg = self.__connector.recv()
            if len(recv_msg) > 0:
                # trans data
                try:
                    trans_data = forward_data.ForwardData(forward_data.DATA_TYPE.TRANS_DATA, self.__id,
                                                          self.__inner_ip, self.__inner_port, bytearray(recv_msg))
                    trans_data_event = forward_event.TransDataEvent(self.__id, trans_data)

                    self.__north_interface_channel(trans_data_event)
                except Exception, e:
                    error_happen = True
                    logger.error("InnerWorker %d current state:WORKING send data error" % (self.__id))
                    logger.debug(traceback.format_exc())

            else:
                if self.__connector.con_state != connector.CON_STATE.CON_CONNECTED:
                    error_happen = True
                    logger.error("InnerWorker %d current state:WORKING recv data error" % (self.__id))
Example #7
0
    def __handle_working_event(self, event):
        error_happen = False
        if event.fd_event & select.EPOLLIN:

            recv_msg = self.__tun_connector.recv()
            if len(recv_msg) > 0:
                # trans data
                try:
                    # ip_packages = IPProtocolHandler.parse_ip_package(bytearray(recv_msg))
                    # ip_msg_map = {}
                    # for package in ip_packages:
                    #
                    #     if not ip_msg_map.has_key(package[0]):
                    #         ip_msg_map[package[0]] = package[1]
                    #     else:
                    #         ip_msg_map[package[0]] += package[1]
                    #
                    # for ip,data in ip_msg_map.items():
                    #     trans_data = forward_data.ForwardData(forward_data.DATA_TYPE.TRANS_DATA, 0,ip,data)
                    #     trans_data_event = forward_event.TransDataEvent(ip, trans_data)
                    #     self.__north_interface_channel(trans_data_event)
                    trans_data = forward_data.ForwardData(
                        forward_data.DATA_TYPE.TRANS_DATA, 0, '',
                        bytearray(recv_msg))
                    trans_data_event = forward_event.TransDataEvent(
                        '', trans_data)
                    self.__north_interface_channel(trans_data_event)
                except Exception, e:
                    error_happen = True
                    logger.error(
                        "InnerWorker  current state:WORKING send data error")
                    logger.debug(traceback.format_exc())

            else:
                if self.__tun_connector.con_state != CON_STATE.CON_CONNECTED:
                    error_happen = True
                    logger.error(
                        "InnerWorker  current state:WORKING recv data error")
Example #8
0
                            self.__connector)
                        self.__state = self.State.WORKING
                        logger.info(
                            'OuterWorker %d login success,change state to WORKING'
                            % (self.__worker_id))
                    else:
                        self.__data_handler.send_login_reply(
                            False, self.__worker_id, '', self.__connector)
                        self.__state = self.State.CLOSED
                        logger.info(
                            'OuterWorker %d login failed,change state to CLOSED'
                            % (self.__worker_id))
        elif self.__state == self.State.WORKING:
            for data in datas:
                if data.data_type == forward_data.DATA_TYPE.TRANS_DATA:
                    trans_event = forward_event.TransDataEvent(data.id, data)
                    self.__sourth_interface_channel(trans_event)
                elif data.data_type == forward_data.DATA_TYPE.HEART_BEAT:
                    self.send_heart_beat_reply()
                    logger.debug("OuterWorker %d send heartbeat reply " %
                                 (self.__worker_id))

    def __scheduler_event(self, event):
        if not isinstance(event, forward_event.SchedulerEvent):
            return

        if self.__state == self.State.NONE:
            self.__state = self.State.LOGIN
            self.__login_begin_time = time.time()
            #self.__state = self.State.WORKING
        elif self.__state == self.State.LOGIN:
Example #9
0
    def create_connection(self,forward_id,inner_ip,inner_port,sourth_interface):
        forw_data = forward_data.ForwardData(forward_data.DATA_TYPE.NEW_CONNECTION, forward_id,
                                             inner_ip, inner_port, '')

        forw_event = forward_event.TransDataEvent(forward_id,forw_data)
        sourth_interface(forw_event)
Example #10
0
 def __connecte_success(self):
     connected_data = forward_data.ForwardData(forward_data.DATA_TYPE.CONNECTION_SUCCESS, self.__id,
                                               self.__inner_ip, self.__inner_port, '')
     connected_event = forward_event.TransDataEvent(self.__id, connected_data)
     self.__north_interface_channel(connected_event)
     self.__connector_change_callback(self.__connector, self.handler_event)