Parcourir la source

dmq: added function to broadcast message from config file.

Charles Chance il y a 11 ans
Parent
commit
5e37d0c920
5 fichiers modifiés avec 137 ajouts et 15 suppressions
  1. 34 13
      modules/dmq/README
  2. 8 0
      modules/dmq/dmq.c
  3. 54 1
      modules/dmq/dmq_funcs.c
  4. 2 0
      modules/dmq/dmq_funcs.h
  5. 39 1
      modules/dmq/doc/dmq_admin.xml

+ 34 - 13
modules/dmq/README

@@ -14,9 +14,9 @@ Edited by
 
 
 Charles Chance
 Charles Chance
 
 
-   Copyright © 2011 Marius Bucur
+   Copyright © 2011 Marius Bucur
 
 
-   Copyright © 2013 Charles Chance, Sipcentric Ltd.
+   Copyright © 2013 Charles Chance, Sipcentric Ltd.
      __________________________________________________________________
      __________________________________________________________________
 
 
    Table of Contents
    Table of Contents
@@ -40,6 +40,7 @@ Charles Chance
 
 
               4.1. dmq_handle_message()
               4.1. dmq_handle_message()
               4.2. dmq_send_message(peer, node, body, content_type)
               4.2. dmq_send_message(peer, node, body, content_type)
+              4.3. dmq_bcast_message(peer, body, content_type)
 
 
    2. Developer Guide
    2. Developer Guide
 
 
@@ -61,6 +62,7 @@ Charles Chance
    1.4. Set ping_interval parameter
    1.4. Set ping_interval parameter
    1.5. dmq_handle_message usage
    1.5. dmq_handle_message usage
    1.6. dmq_send_message usage
    1.6. dmq_send_message usage
+   1.7. dmq_bcast_message usage
    2.1. dmq_api_t structure
    2.1. dmq_api_t structure
    2.2. register_dmq_peer usage
    2.2. register_dmq_peer usage
    2.3. bcast_message usage
    2.3. bcast_message usage
@@ -87,6 +89,7 @@ Chapter 1. Admin Guide
 
 
         4.1. dmq_handle_message()
         4.1. dmq_handle_message()
         4.2. dmq_send_message(peer, node, body, content_type)
         4.2. dmq_send_message(peer, node, body, content_type)
+        4.3. dmq_bcast_message(peer, body, content_type)
 
 
 1. Overview
 1. Overview
 
 
@@ -133,7 +136,7 @@ Chapter 1. Admin Guide
    The local server address. This is the interface over which the DMQ
    The local server address. This is the interface over which the DMQ
    engine will send/receive messages.
    engine will send/receive messages.
 
 
-   Default value is "NULL".
+   Default value is “NULL�.
 
 
    Example 1.1. Set server_address parameter
    Example 1.1. Set server_address parameter
 ...
 ...
@@ -145,7 +148,7 @@ modparam("dmq", "server_address", "sip:10.0.0.20:5060")
    The address of another DMQ node from which the local node should
    The address of another DMQ node from which the local node should
    retrieve initial information about all other nodes.
    retrieve initial information about all other nodes.
 
 
-   Default value is "NULL".
+   Default value is “NULL�.
 
 
    Example 1.2. Set notification_address parameter
    Example 1.2. Set notification_address parameter
 ...
 ...
@@ -156,7 +159,7 @@ modparam("dmq", "notification_address", "sip:10.0.0.21:5060")
 
 
    The number of worker threads for sending/receiving messages.
    The number of worker threads for sending/receiving messages.
 
 
-   Default value is "2".
+   Default value is “2�.
 
 
    Example 1.3. Set num_workers parameter
    Example 1.3. Set num_workers parameter
 ...
 ...
@@ -168,7 +171,7 @@ modparam("dmq", "num_threads", 4)
    The number of seconds between node pings (for checking status of other
    The number of seconds between node pings (for checking status of other
    nodes).
    nodes).
 
 
-   Minimum value is "60" (default).
+   Minimum value is “60� (default).
 
 
    Example 1.4. Set ping_interval parameter
    Example 1.4. Set ping_interval parameter
 ...
 ...
@@ -179,8 +182,9 @@ modparam("dmq", "ping_interval", 90)
 
 
    4.1. dmq_handle_message()
    4.1. dmq_handle_message()
    4.2. dmq_send_message(peer, node, body, content_type)
    4.2. dmq_send_message(peer, node, body, content_type)
+   4.3. dmq_bcast_message(peer, body, content_type)
 
 
-4.1. dmq_handle_message()
+4.1.  dmq_handle_message()
 
 
    Handles a DMQ message by passing it to the appropriate local peer
    Handles a DMQ message by passing it to the appropriate local peer
    (module). The peer is identified by the user part of the To header.
    (module). The peer is identified by the user part of the To header.
@@ -195,9 +199,9 @@ modparam("dmq", "ping_interval", 90)
         }
         }
 ...
 ...
 
 
-4.2. dmq_send_message(peer, node, body, content_type)
+4.2.  dmq_send_message(peer, node, body, content_type)
 
 
-   Sends a DMQ message directly from config file.
+   Sends a DMQ message directly from config file to a single node.
 
 
    Meaning of parameters:
    Meaning of parameters:
      * peer - name of peer that should handle the message.
      * peer - name of peer that should handle the message.
@@ -213,6 +217,23 @@ modparam("dmq", "ping_interval", 90)
 text/plain");
 text/plain");
 ...
 ...
 
 
+4.3.  dmq_bcast_message(peer, body, content_type)
+
+   Broadcasts a DMQ message from config file to all active nodes (except
+   self).
+
+   Meaning of parameters:
+     * peer - name of peer that should handle the message.
+     * body - the message body.
+     * content_type - the MIME type of the message body.
+
+   This function can be used from any route.
+
+   Example 1.7. dmq_bcast_message usage
+...
+        dmq_bcast_message("peer_name", "Message body...", "text/plain");
+...
+
 Chapter 2. Developer Guide
 Chapter 2. Developer Guide
 
 
    Table of Contents
    Table of Contents
@@ -230,7 +251,7 @@ Chapter 2. Developer Guide
    The module provides the following functions that can be used in other
    The module provides the following functions that can be used in other
    Kamailio modules.
    Kamailio modules.
 
 
-1. dmq_load_api(dmq_api_t* api)
+1.  dmq_load_api(dmq_api_t* api)
 
 
    This function binds the DMQ module and fills the structure with the
    This function binds the DMQ module and fills the structure with the
    exported functions below.
    exported functions below.
@@ -244,7 +265,7 @@ typedef struct dmq_api {
 } dmq_api_t;
 } dmq_api_t;
 ...
 ...
 
 
-2. register_dmq_peer(dmq_peer_t* peer)
+2.  register_dmq_peer(dmq_peer_t* peer)
 
 
    Registers an entity as a DMQ peer which permits receiving/sending
    Registers an entity as a DMQ peer which permits receiving/sending
    messages between nodes which support the same peer.
    messages between nodes which support the same peer.
@@ -254,7 +275,7 @@ typedef struct dmq_api {
         Example to follow.
         Example to follow.
 ...
 ...
 
 
-3. bcast_message(dmq_peer_t* peer, str* body, dmq_node_t* except,
+3.  bcast_message(dmq_peer_t* peer, str* body, dmq_node_t* except,
 dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
 dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
 
 
    Broadcast a DMQ message to all nodes in the DMQ bus excluding self,
    Broadcast a DMQ message to all nodes in the DMQ bus excluding self,
@@ -265,7 +286,7 @@ dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
         Example to follow.
         Example to follow.
 ...
 ...
 
 
-4. send_message(dmq_peer_t* peer, str* body, dmq_node_t* node,
+4.  send_message(dmq_peer_t* peer, str* body, dmq_node_t* node,
 dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
 dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
 
 
    Send a DMQ message to a single node.
    Send a DMQ message to a single node.

+ 8 - 0
modules/dmq/dmq.c

@@ -86,6 +86,7 @@ static int child_init(int);
 static void destroy(void);
 static void destroy(void);
 static int handle_dmq_fixup(void** param, int param_no);
 static int handle_dmq_fixup(void** param, int param_no);
 static int send_dmq_fixup(void** param, int param_no);
 static int send_dmq_fixup(void** param, int param_no);
+static int bcast_dmq_fixup(void** param, int param_no);
 static int parse_server_address(str* uri, struct sip_uri* parsed_uri);
 static int parse_server_address(str* uri, struct sip_uri* parsed_uri);
 
 
 static cmd_export_t cmds[] = {
 static cmd_export_t cmds[] = {
@@ -93,6 +94,8 @@ static cmd_export_t cmds[] = {
 		REQUEST_ROUTE},
 		REQUEST_ROUTE},
 	{"dmq_send_message", (cmd_function)cfg_dmq_send_message, 4, send_dmq_fixup, 0,
 	{"dmq_send_message", (cmd_function)cfg_dmq_send_message, 4, send_dmq_fixup, 0,
 		ANY_ROUTE},
 		ANY_ROUTE},
+        {"dmq_bcast_message", (cmd_function)cfg_dmq_bcast_message, 3, bcast_dmq_fixup, 0,
+                ANY_ROUTE},
         {"bind_dmq",        (cmd_function)bind_dmq,       0, 0,              0},
         {"bind_dmq",        (cmd_function)bind_dmq,       0, 0,              0},
 	{0, 0, 0, 0, 0, 0}
 	{0, 0, 0, 0, 0, 0}
 };
 };
@@ -279,6 +282,11 @@ static int send_dmq_fixup(void** param, int param_no)
 	return fixup_spve_null(param, 1);
 	return fixup_spve_null(param, 1);
 }
 }
 
 
+static int bcast_dmq_fixup(void** param, int param_no)
+{
+        return fixup_spve_null(param, 1);
+}
+
 static int parse_server_address(str* uri, struct sip_uri* parsed_uri)
 static int parse_server_address(str* uri, struct sip_uri* parsed_uri)
 {
 {
 	if(!uri->s) {
 	if(!uri->s) {

+ 54 - 1
modules/dmq/dmq_funcs.c

@@ -250,7 +250,7 @@ int cfg_dmq_send_message(struct sip_msg* msg, char* peer, char* to, char* body,
 	}
 	}
 
 
 	
 	
-	LM_INFO("cfg_dmq_send_message: %.*s - %.*s - %.*s - %.*s\n",
+	LM_DBG("cfg_dmq_send_message: %.*s - %.*s - %.*s - %.*s\n",
 		peer_str.len, peer_str.s,
 		peer_str.len, peer_str.s,
 		to_str.len, to_str.s,
 		to_str.len, to_str.s,
 		body_str.len, body_str.s,
 		body_str.len, body_str.s,
@@ -285,6 +285,59 @@ error:
 	return -1;
 	return -1;
 }
 }
 
 
+
+/**
+ * @brief config file function for broadcasting dmq message
+ */
+int cfg_dmq_bcast_message(struct sip_msg* msg, char* peer, char* body, char* content_type)
+{
+	str peer_str;
+	str body_str;
+	str ct_str;
+
+	if(get_str_fparam(&peer_str, msg, (fparam_t*)peer)<0) {
+		LM_ERR("cannot get peer value\n");
+		return -1;
+	}
+	if(get_str_fparam(&body_str, msg, (fparam_t*)body)<0) {
+		LM_ERR("cannot get body value\n");
+		return -1;
+	}
+	if(get_str_fparam(&ct_str, msg, (fparam_t*)content_type)<0) {
+		LM_ERR("cannot get content-type value\n");
+		return -1;
+	}
+
+	LM_DBG("cfg_dmq_bcast_message: %.*s - %.*s - %.*s\n",
+		peer_str.len, peer_str.s,
+		body_str.len, body_str.s,
+		ct_str.len, ct_str.s);
+
+	dmq_peer_t* destination_peer = find_peer(peer_str);
+	if(!destination_peer) {
+		LM_INFO("cannot find peer %.*s - adding it.\n", peer_str.len, peer_str.s);
+		dmq_peer_t new_peer;
+		new_peer.callback = empty_peer_callback;
+		new_peer.description.s = "";
+		new_peer.description.len = 0;
+		new_peer.peer_id = peer_str;
+		destination_peer = register_dmq_peer(&new_peer);
+		if(!destination_peer) {
+			LM_ERR("error in register_dmq_peer\n");
+			goto error;
+		}
+	}
+	if(bcast_dmq_message(destination_peer, &body_str, 0,
+			&notification_callback, 1, &ct_str) < 0) {
+		LM_ERR("cannot send dmq message\n");
+		goto error;
+	}
+	return 1;
+error:
+	return -1;
+}
+
+
 /**
 /**
  * @brief pings the servers in the nodelist
  * @brief pings the servers in the nodelist
  *
  *

+ 2 - 0
modules/dmq/dmq_funcs.h

@@ -48,6 +48,8 @@ typedef struct dmq_cback_param {
 
 
 int cfg_dmq_send_message(struct sip_msg* msg, char* peer, char* to,
 int cfg_dmq_send_message(struct sip_msg* msg, char* peer, char* to,
 		char* body, char* content_type);
 		char* body, char* content_type);
+int cfg_dmq_bcast_message(struct sip_msg* msg, char* peer, char* body, 
+		char* content_type);
 dmq_peer_t* register_dmq_peer(dmq_peer_t* peer);
 dmq_peer_t* register_dmq_peer(dmq_peer_t* peer);
 int dmq_send_message(dmq_peer_t* peer, str* body, dmq_node_t* node,
 int dmq_send_message(dmq_peer_t* peer, str* body, dmq_node_t* node,
 		dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type);
 		dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type);

+ 39 - 1
modules/dmq/doc/dmq_admin.xml

@@ -168,7 +168,7 @@ modparam("dmq", "ping_interval", 90)
                	<function moreinfo="none">dmq_send_message(peer, node, body, content_type)</function>
                	<function moreinfo="none">dmq_send_message(peer, node, body, content_type)</function>
                 </title>
                 </title>
                 <para>
                 <para>
-                Sends a DMQ message directly from config file.
+                Sends a DMQ message directly from config file to a single node.
                 </para>
                 </para>
 		<para>Meaning of parameters:</para>
 		<para>Meaning of parameters:</para>
                 <itemizedlist>
                 <itemizedlist>
@@ -203,6 +203,44 @@ modparam("dmq", "ping_interval", 90)
 ...
 ...
 	dmq_send_message("peer_name", "sip:10.0.0.21:5060", "Message body...", "text/plain");
 	dmq_send_message("peer_name", "sip:10.0.0.21:5060", "Message body...", "text/plain");
 ...
 ...
+</programlisting>
+                </example>
+        </section>
+        <section id="dmq.f.dmq_bcast_message">
+                <title>
+                <function moreinfo="none">dmq_bcast_message(peer, body, content_type)</function>
+                </title>
+                <para>
+                Broadcasts a DMQ message from config file to all active nodes (except self).
+                </para>
+                <para>Meaning of parameters:</para>
+                <itemizedlist>
+                        <listitem>
+                                <para>
+                                <emphasis>peer</emphasis> - name of peer that should handle the message.
+                                </para>
+                        </listitem>
+                        <listitem>
+                                <para>
+                                <emphasis>body</emphasis> - the message body.
+                                </para>
+                        </listitem>
+                        <listitem>
+                                <para>
+                                <emphasis>content_type</emphasis> - the MIME type of the message body.
+                                </para>
+                        </listitem>
+                </itemizedlist>
+                <para>
+                This function can be used from any route.
+                </para>
+
+                <example>
+                <title><function>dmq_bcast_message</function> usage</title>
+                <programlisting format="linespecific">
+...
+        dmq_bcast_message("peer_name", "Message body...", "text/plain");
+...
 </programlisting>
 </programlisting>
                 </example>
                 </example>
         </section>
         </section>