Переглянути джерело

dmq: added function to broadcast message from config file.

Charles Chance 11 роки тому
батько
коміт
5e37d0c920
5 змінених файлів з 137 додано та 15 видалено
  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
 
-   Copyright © 2011 Marius Bucur
+   Copyright © 2011 Marius Bucur
 
-   Copyright © 2013 Charles Chance, Sipcentric Ltd.
+   Copyright © 2013 Charles Chance, Sipcentric Ltd.
      __________________________________________________________________
 
    Table of Contents
@@ -40,6 +40,7 @@ Charles Chance
 
               4.1. dmq_handle_message()
               4.2. dmq_send_message(peer, node, body, content_type)
+              4.3. dmq_bcast_message(peer, body, content_type)
 
    2. Developer Guide
 
@@ -61,6 +62,7 @@ Charles Chance
    1.4. Set ping_interval parameter
    1.5. dmq_handle_message usage
    1.6. dmq_send_message usage
+   1.7. dmq_bcast_message usage
    2.1. dmq_api_t structure
    2.2. register_dmq_peer usage
    2.3. bcast_message usage
@@ -87,6 +89,7 @@ Chapter 1. Admin Guide
 
         4.1. dmq_handle_message()
         4.2. dmq_send_message(peer, node, body, content_type)
+        4.3. dmq_bcast_message(peer, body, content_type)
 
 1. Overview
 
@@ -133,7 +136,7 @@ Chapter 1. Admin Guide
    The local server address. This is the interface over which the DMQ
    engine will send/receive messages.
 
-   Default value is "NULL".
+   Default value is “NULL�.
 
    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
    retrieve initial information about all other nodes.
 
-   Default value is "NULL".
+   Default value is “NULL�.
 
    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.
 
-   Default value is "2".
+   Default value is “2�.
 
    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
    nodes).
 
-   Minimum value is "60" (default).
+   Minimum value is “60� (default).
 
    Example 1.4. Set ping_interval parameter
 ...
@@ -179,8 +182,9 @@ modparam("dmq", "ping_interval", 90)
 
    4.1. dmq_handle_message()
    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
    (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:
      * peer - name of peer that should handle the message.
@@ -213,6 +217,23 @@ modparam("dmq", "ping_interval", 90)
 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
 
    Table of Contents
@@ -230,7 +251,7 @@ Chapter 2. Developer Guide
    The module provides the following functions that can be used in other
    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
    exported functions below.
@@ -244,7 +265,7 @@ typedef struct dmq_api {
 } 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
    messages between nodes which support the same peer.
@@ -254,7 +275,7 @@ typedef struct dmq_api {
         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)
 
    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.
 ...
 
-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)
 
    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 int handle_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 cmd_export_t cmds[] = {
@@ -93,6 +94,8 @@ static cmd_export_t cmds[] = {
 		REQUEST_ROUTE},
 	{"dmq_send_message", (cmd_function)cfg_dmq_send_message, 4, send_dmq_fixup, 0,
 		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},
 	{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);
 }
 
+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)
 {
 	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,
 		to_str.len, to_str.s,
 		body_str.len, body_str.s,
@@ -285,6 +285,59 @@ error:
 	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
  *

+ 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,
 		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);
 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);

+ 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>
                 </title>
                 <para>
-                Sends a DMQ message directly from config file.
+                Sends a DMQ message directly from config file to a single node.
                 </para>
 		<para>Meaning of parameters:</para>
                 <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");
 ...
+</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>
                 </example>
         </section>