From 90f8df96afcf7139d44f1568a58f7a3d6d8db0da Mon Sep 17 00:00:00 2001 From: Cedric RICARD Date: Sat, 9 Feb 2008 10:40:49 +0000 Subject: [PATCH] Removed _CXM_DOMAIN_STORE_NAME for security reason (was an old and no more used message). Added generic client code --- calexium_lib/CXM_message_constants.anubis | 4 ++-- calexium_lib/net_services/CXM_generic_client.anubis | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 calexium_lib/net_services/CXM_generic_client.anubis diff --git a/calexium_lib/CXM_message_constants.anubis b/calexium_lib/CXM_message_constants.anubis index 484a7a6..c170843 100644 --- a/calexium_lib/CXM_message_constants.anubis +++ b/calexium_lib/CXM_message_constants.anubis @@ -54,7 +54,7 @@ public define Int32 _CXM_LOGGER_LOG = 0x33771802. // MF <-> DomainManager public define Int32 _CXM_DOMAIN_SERVICE_MSG_BASIS = 0x33771C00. // public define Int32 _CXM_DOMAIN_SERVICE_ID = 0x33771C01. -public define Int32 _CXM_DOMAIN_STORE_NAME = 0x33771C02. +//public define Int32 _CXM_DOMAIN_STORE_NAME = 0x33771C02. // No more used (security hole public define Int32 _CXM_DOMAIN_GET_NAME = 0x33771C03. public define Int32 _CXM_DOMAIN_GET_MY_IP = 0x33771C04. public define Int32 _CXM_DOMAIN_PUBLISH_MY_IP = 0x33771C05. @@ -69,4 +69,4 @@ public define Int32 _CXM_GANDI_CREATE_CONTACT = 0x33771D02. // 'CLASS' (S // --> CXM_ACK with 'CONTACT_HANDLE' (String): Created handle for this contact public define Int32 _CXM_GANDI_CREATE_DOMAIN = 0x33771D03. // 'DOMAIN' (String): Domain full name // 'OWNER' (String): Owner handle - // --> CXM_ACK + // --> CXM_ACK with 'DOMAIN_HANDLE' (String): Created handle for this domain diff --git a/calexium_lib/net_services/CXM_generic_client.anubis b/calexium_lib/net_services/CXM_generic_client.anubis new file mode 100644 index 0000000..b8b51e8 --- /dev/null +++ b/calexium_lib/net_services/CXM_generic_client.anubis @@ -0,0 +1,156 @@ +/* + * Created by PyramIDE. + * User: ricard + * Date: 02/02/2008 + * Time: 11:47 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + + +read tools/basis.anubis +read system/muscle.anubis +read system/data_io.anubis +read system/convert.anubis +read system/string.anubis +read system/message_queue.anubis +read system/message_transceiver.anubis + +read calexium_lib/CXM_message_constants.anubis +read calexium_lib/net_services/CXM_net_services.anubis +read calexium_lib/net_services/CXM_generic_protocol.anubis + +// --Generic types--------------------------------------------------------------------- +public type NetServiceAnswer: + netservice_error (Int32 cmd, + Int32 result_code, + String result_string), + netservice_ok (Int32 cmd, + Maybe(Message) result_msg). + +// --Generic functions--------------------------------------------------------------------- + + +public define Maybe(NetServiceAnswer) + generic_send_message + ( + MessageQueue queue, + Message msg_to_send, + Int32 timeout, + (String) -> One logger + )= + queue.add_Message_to_send(msg_to_send); + if queue.get_next_received_Message(timeout) is + { + timeout then logger("["+queue.get_name(unique)+"]: receive timeout");failure, + closed then logger("["+queue.get_name(unique)+"]: socket closed");failure, + msg(msg) then + if find_int32(msg, "CMD") is + { + failure then logger("["+queue.get_name(unique)+"]: CMD field not found"); failure, + success(cmd) then + if find_int32(msg, "STATUS") is + { + failure then logger("["+queue.get_name(unique)+"]: STATUS field not found"); failure, + success(v) then + if v = _CXM_OK then + success(netservice_ok(cmd, find_message(msg, "RESULT"))) + else + with error_string = if find_string(msg, "STATUS_STR") is success(s) then s else "", + success(netservice_error(cmd, v, error_string)) + } + } + }. + +define Maybe($T) + generic_handler + ( + MessageQueue queue, + Message msg_to_send, + (Message) -> Maybe($T) handler, + (String) -> One logger + )= + queue.add_Message_to_send(msg_to_send); + if queue.get_next_received_Message(10) is + { + timeout then logger("["+queue.get_name(unique)+"]: receive timeout");failure, + closed then logger("["+queue.get_name(unique)+"]: socket closed");failure, + msg(msg) then + if find_int32(msg, "STATUS") is + { + failure then logger("["+queue.get_name(unique)+"]: status not found");failure, + success(v) then + if v = _CXM_OK then + //println("generic_handler("+queue.get_name(unique)+"): message status ok"); + if find_message(msg, "RESULT") is + { + failure then logger("["+queue.get_name(unique)+"]: can't find RESULT");failure, + success(result) then handler(result) + } + else + logger("["+queue.get_name(unique)+"]: message status ERROR");failure + } + }. + +public define (MessageQueue) -> Maybe($T) + make_generic_handler + ( + Message msg_to_send, + (Message) -> Maybe($T) handler, + (String) -> One logger + ) = + (MessageQueue queue) |-> + generic_handler(queue, msg_to_send, handler, logger). + +define Maybe($T) + generic_request_for_service + ( + MessageQueue queue, + Int32 service_id, + Int32 service_version, + (MessageQueue) -> Maybe($T) handler, + (String) -> One logger + )= + with test_msg = message(_CXM_REQUEST_FOR_SERVICE), + forget(add_int32(test_msg, "service", service_id)); + forget(add_int32(test_msg, "version", service_version)); + queue.add_Message_to_send(test_msg); + if queue.get_next_received_Message(10) is + { + timeout then logger("["+queue.get_name(unique)+"]: requesting service receive timeout");failure, + closed then logger("["+queue.get_name(unique)+"]: requesting service socket closed");failure, + msg(msg) then + if find_int32(msg, "STATUS") is + { + failure then logger("["+queue.get_name(unique)+"]: requesting service status not found");failure, + success(v) then + if v = _CXM_OK then + handler(queue) + else + logger("["+queue.get_name(unique)+"]: requested service started won't start");failure + } + }. + +public define Maybe($T) + generic_connect_to_net_service + ( + String queue_name, + Int32 server, + Int32 port, + Int32 service_id, + Int32 service_version, + (MessageQueue) -> Maybe($T) handler, + (String) -> One logger + ) + = + if connect( server, port) is + { + error(_) then logger(queue_name + ": Can't connect to domain manager ["+ip_addr_to_string(server)+":"+port+"]");failure, + ok(conn) then + with queue = create_MessageQueue(queue_name), + message_transceiver(conn, queue); + with result = generic_request_for_service(queue, service_id, service_version, handler, logger), + queue.quit(unique); + //logInfo(debug_log,"domain_manager client quit"); + result + }. -- libgit2 0.21.4