コード例 #1
0
def client_accept(client_handle_socket, app_name):
    try:
        while True:
            private_socket = None
            (client_socket, client_address) = client_handle_socket.accept()
            logging.info(str(client_address) + ' Connected')
            logging.debug('accept client: ' + str(client_address))
            c_address = json.loads(json.dumps(client_address))
            client_address_element = {'client_address': c_address, 'client_socket': client_socket}
            CLIENT_ADDRESS_TABLE.append(client_address_element)
            # private_socket_element = {'app_name': app_name, 'private_socket': private_socket}
            # PRIVATE_SOCKET_TABLE.append(private_socket_element)
            for element in PRIVATE_SOCKET_TABLE:
                logging.debug(element)
                if app_name == element['app_name']:
                    private_socket = element['private_socket']
            build_connect_packet = json.dumps(packet.packet(op_enum.OP_BUILD_CONNECTION, op_enum.DES_BUILD_CONNECTION, '', app_name, client_address))
            if private_socket != None:
                core_transmit.send_operation(private_socket, build_connect_packet)
                client_to_private_thread = Thread(target=client_to_private, args=(client_socket, client_address, private_socket, app_name), daemon=False, name=app_name + str(client_address))
                client_to_private_thread.start()
    except Exception as err:
        logging.debug(err)
        client_handle_socket.shutdown(socket.SHUT_RDWR)
        client_handle_socket.close()
コード例 #2
0
def register_app(app_name=None,
                 app_address=None,
                 app_port=None,
                 public_server_port=None):
    if app_name == None or app_address == None or app_port == None or public_server_port == None:
        return 'url must be \"/register_app/<app_name>/<app_address>/<app_port>/<public_server_port>\"'
    for app in REGISTERED_APPS:
        if app_name == app['app_name']:
            return 'This app name has been registered.'
        if app_address == app['app_address'] and app_port == app['app_port']:
            return 'This port has been registered.'
    register_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    register_socket.connect((PUBLIC_SERVER_ADDRESS, OP_PORT))
    register_operation = packet.packet(op_enum.OP_REGISTER_APP,
                                       op_enum.DES_REGISTER_APP,
                                       str(public_server_port), app_name, None)
    core_transmit.send_operation(register_socket,
                                 json.dumps(register_operation))
    public_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    public_socket.connect((PUBLIC_SERVER_ADDRESS, PROXY_PORT))
    public_socket_element = {
        'public_socket': public_socket,
        'app_name': app_name
    }
    PUBLIC_SOCKET_TABLE.append(public_socket_element)
    app_get_op_thread = Thread(target=get_operation,
                               args=(public_socket, ),
                               daemon=False,
                               name='get_operation:' + str(app_name))
    app_get_op_thread.start()
    register_app = {}
    register_app['app_name'] = app_name
    register_app['app_address'] = app_address
    register_app['app_port'] = app_port
    register_app['public_port'] = public_server_port
    register_app['public_socket'] = public_socket
    waiting_register_app = {
        'register_app_name': register_app['app_name'],
        'status': None,
        'msg': ''
    }
    REGISTER_IN_WAIT.append(waiting_register_app)
    waitcount = 200
    while waiting_register_app['status'] == None:
        time.sleep(0.1)
        waitcount -= 1
        if waitcount < 0:
            waiting_register_app['status'] = False
            waiting_register_app['msg'] = 'time out'
        # logging.debug('waiting for register')
    logging.debug(waiting_register_app)
    if waiting_register_app['status'] == True:
        REGISTER_IN_WAIT.remove(waiting_register_app)
    elif waiting_register_app['status'] == False:
        REGISTER_IN_WAIT.remove(waiting_register_app)
        return 'Register failed because of \"' + waiting_register_app[
            'msg'] + '\"'
    REGISTERED_APPS.append(register_app)
    return 'Register success'
コード例 #3
0
def unregister_app(app_name=None):
    if app_name == None:
        return 'url must be \"unregister_app/<app_name>\"'
    for app in REGISTERED_APPS:
        if app_name == app['app_name']:
            public_socket = app['public_socket']
            public_socket_address = public_socket.getsockname()
            unregister_op = json.dumps(
                packet.packet(op_enum.OP_UNREGISTER_APP,
                              op_enum.DES_UNREGISTER_APP,
                              str(public_socket_address), app_name, None))
            core_transmit.send_operation(public_socket, unregister_op)
            REGISTERED_APPS.remove(app)
            return 'Unregister success'
    return 'There is no app named \"' + app_name + '\"'
コード例 #4
0
def private_to_public(private_app_socket, client_address, app_name):
    try:
        public_socket = None
        for element in PUBLIC_SOCKET_TABLE:
            if app_name == element['app_name']:
                public_socket = element['public_socket']
        while True:
            msg = core_transmit.get_data(private_app_socket)
            if msg == '':
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                logging.debug(
                    'DETECT \'\'!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
                break
            # After receive data
            data_packet = packet.packet(op_enum.OP_TRANSMIT_DATA,
                                        op_enum.DES_TRANSMIT_DATA, msg,
                                        app_name, client_address)
            data_packet_json = json.dumps(data_packet)
            logging.debug('generate: ' + str(data_packet_json))
            core_transmit.send_operation(public_socket, data_packet_json)
    except Exception as err:
        logging.debug(err)
    finally:
        private_app_socket.shutdown(socket.SHUT_RDWR)
        private_app_socket.close()
        disconn_packet = packet.packet(op_enum.OP_DISCONNECTED,
                                       op_enum.DES_DISCONNECTED, '', app_name,
                                       client_address)
        disconn_json = json.dumps(disconn_packet)
        logging.debug('generate: ' + str(disconn_json))
        core_transmit.send_operation(public_socket, disconn_json)
        for element in PRIVATE_SOCKET_TABLE:
            if client_address == element['client_address']:
                PRIVATE_SOCKET_TABLE.remove(element)
コード例 #5
0
def client_to_private(c_sock, c_address, pri_sock, app_name):
    try:
        while True:
            msg = core_transmit.get_data(c_sock)
            if msg == '':
                break
            # After receive data
            data_packet = packet.packet(op_enum.OP_TRANSMIT_DATA, op_enum.DES_TRANSMIT_DATA, msg, app_name, c_address)
            data_packet_json = json.dumps(data_packet)
            logging.debug('generate: ' + str(data_packet_json))
            core_transmit.send_operation(pri_sock, data_packet_json)
    except Exception as err:
        logging.debug(err)
    finally:
        logging.info('Client disconnected')
        c_sock.shutdown(socket.SHUT_RDWR)
        c_sock.close()
        disconn_packet = packet.packet(op_enum.OP_DISCONNECTED, op_enum.DES_DISCONNECTED, '', app_name, c_address)
        disconn_json = json.dumps(disconn_packet)
        logging.debug('generate: ' + str(disconn_json))
        core_transmit.send_operation(pri_sock, disconn_json)
        for element in CLIENT_ADDRESS_TABLE:
            if c_address == element['client_address']:
                CLIENT_ADDRESS_TABLE.remove(element)
コード例 #6
0
def register_app(app_name=None, bind_port=None):
    app_name_failed_op = None
    if app_name in BIND_APP:
        app_name_failed_op = json.dumps(packet.packet(op_enum.OP_REGISTER_FAILED, op_enum.DES_REGISTER_FAILED, 'APP \"' + app_name + '\" has already exist', app_name, None))
    if app_name_failed_op == None:
        BIND_APP[app_name] = bind_port
    try:
        (private_socket, private_address) = PROXY_SOCKET.accept()
        logging.debug('accept address: ' + str(private_address))
        private_socket_element = {'app_name': app_name, 'private_socket': private_socket}
        PRIVATE_SOCKET_TABLE.append(private_socket_element)
        get_op_thread = Thread(target=get_operation, args=(private_socket,), daemon=False, name='get_operation: ' + app_name)
        get_op_thread.start()
        if app_name_failed_op != None:
            core_transmit.send_operation(private_socket, app_name_failed_op)
            private_socket.shutdown(socket.SHUT_RDWR)
            private_socket.close()
        # If register failed, do not start client_handle_socket
        client_handle_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_handle_socket.bind((PROXY_ADDRESS, bind_port))
        client_handle_socket.listen(20)
        client_handle_element = {'app_name': app_name, 'client_handle_socket': client_handle_socket}
        CLIENT_HANDLE_TABLE.append(client_handle_element)
        logging.debug(BIND_APP)
        logging.debug(PRIVATE_SOCKET_TABLE)
        client_accept_thread = Thread(target=client_accept, args=(client_handle_socket, app_name, ), daemon=False, name='client_accept_thread: ' + app_name)
        client_accept_thread.start()
        success_op = json.dumps(packet.packet(op_enum.OP_REGISTER_SUCCESS, op_enum.DES_REGISTER_SUCCESS, 'APP \"' + app_name + '\" created', app_name, None))
        core_transmit.send_operation(private_socket, success_op)
    except Exception as err:
        failed_op = json.dumps(packet.packet(op_enum.OP_REGISTER_FAILED, op_enum.DES_REGISTER_FAILED, str(err), app_name, None))
        core_transmit.send_operation(private_socket, failed_op)
        del BIND_APP[app_name]
        private_socket.shutdown(socket.SHUT_RDWR)
        private_socket.close()
        client_handle_socket.close()
コード例 #7
0
def handle_operation():
    while True:
        operation = OP_QUEUE.get()
        omatted_json = json.dumps(json.loads(operation), indent=4)
        logging.debug(omatted_json)
        operation_packet = json.loads(operation)
        op_code = operation_packet['op_code']
        op_describe = operation_packet['op_describe']
        msg = operation_packet['msg']
        app_name = operation_packet['app_name']
        client_address = operation_packet['client_address']
        private_socket = None
        public_socket = None
        for public_socket_element in PUBLIC_SOCKET_TABLE:
            if app_name == public_socket_element['app_name']:
                public_socket = public_socket_element['public_socket']
        '''
        proceduce operation
        '''
        if op_code == op_enum.OP_BUILD_CONNECTION:
            tmp_private_socket = socket.socket(socket.AF_INET,
                                               socket.SOCK_STREAM)
            for app in REGISTERED_APPS:
                if app_name == app['app_name']:
                    app_address = app['app_address']
                    app_port = app['app_port']
            if app_name == None or app_port == None:
                response = json.dumps(
                    packet.packet(op_enum.OP_FAILED, op_enum.DES_FAILED,
                                  'No such app', app_name, client_address))
                logging.debug(response)
                core_transmit.send_operation(public_socket, response)
            try:
                tmp_private_socket.connect((app_address, app_port))
            except Exception as err:
                failed_op = json.dumps(
                    packet.packet(op_enum.OP_BUILD_CONNECTION_FAILED,
                                  op_enum.DES_BUILD_CONNECTION_FAILED,
                                  str(err), app_name, client_address))
                core_transmit.send_operation(public_socket, failed_op)
                unregister_app(app_name)
                continue
            private_socket_element = {
                'client_address': client_address,
                'private_socket': tmp_private_socket
            }
            PRIVATE_SOCKET_TABLE.append(private_socket_element)
            private_to_public_thread = Thread(
                target=private_to_public,
                args=(tmp_private_socket, client_address, app_name),
                daemon=False,
                name='private_to_public:' + str(client_address))
            private_to_public_thread.start()
        elif op_code == op_enum.OP_SUCCESS:
            logging.debug(
                packet.packet(op_code, op_describe, msg, app_name,
                              client_address))
        elif op_code == op_enum.OP_TRANSMIT_DATA:
            for element in PRIVATE_SOCKET_TABLE:
                if client_address == element['client_address']:
                    private_socket = element['private_socket']
            if private_socket != None:
                core_transmit.send_data(private_socket, msg)
        # if client disconnected, close private socket of this client
        elif op_code == op_enum.OP_DISCONNECTED:
            logging.debug(str(op_describe) + ':' + str(client_address))
            for element in PRIVATE_SOCKET_TABLE:
                if client_address == element['client_address']:
                    private_socket = element['private_socket']
                    private_socket.shutdown(socket.SHUT_RDWR)
                    private_socket.close()
                    for element in PRIVATE_SOCKET_TABLE:
                        if client_address == element['client_address']:
                            PRIVATE_SOCKET_TABLE.remove(element)
        elif op_code == op_enum.OP_REGISTER_SUCCESS:
            for in_wait in REGISTER_IN_WAIT:
                if app_name == in_wait['register_app_name']:
                    in_wait['status'] = True
        elif op_code == op_enum.OP_REGISTER_FAILED:
            for in_wait in REGISTER_IN_WAIT:
                if app_name == in_wait['register_app_name']:
                    in_wait['status'] = False
                    in_wait['msg'] = msg