pjsip: Added "reg_server" to contacts.
authorAlexei Gradinari <alex2grad@gmail.com>
Fri, 15 Apr 2016 19:26:15 +0000 (15:26 -0400)
committerJoshua Colp <jcolp@digium.com>
Mon, 2 May 2016 13:01:40 +0000 (10:01 -0300)
If the Asterisk system name is set in asterisk.conf, it will be stored
into the "reg_server" field in the ps_contacts table to facilitate
multi-server setups.

ASTERISK-25931

Change-Id: Ia8f6bd2267809c78753b52bcf21835b9b59f4cb8

CHANGES
contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py [new file with mode: 0644]
include/asterisk/res_pjsip.h
res/res_pjsip.c
res/res_pjsip/location.c
res/res_pjsip_registrar.c

diff --git a/CHANGES b/CHANGES
index 1f5ea54..9f067bd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -272,6 +272,15 @@ Queue
  * Show the time when started the last pause for queue member on CLI for command
    'queue show'.
 
+--- Functionality changes from Asterisk 13.9.0 to Asterisk 13.10.0 -----------
+------------------------------------------------------------------------------
+
+res_pjsip
+------------------
+ * Added "reg_server" to contacts.
+   If the Asterisk system name is set in asterisk.conf, it will be stored
+   into the "reg_server" field in the ps_contacts table to facilitate
+   multi-server setups.
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 13.8.0 to Asterisk 13.9.0 ------------
diff --git a/contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py b/contrib/ast-db-manage/config/versions/81b01a191a46_pjsip_add_contact_reg_server.py
new file mode 100644 (file)
index 0000000..8bd151b
--- /dev/null
@@ -0,0 +1,25 @@
+"""pjsip: add contact reg_server
+
+Revision ID: 81b01a191a46
+Revises: 65eb22eb195
+Create Date: 2016-04-15 15:00:35.024525
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '81b01a191a46'
+down_revision = '65eb22eb195'
+
+from alembic import op
+import sqlalchemy as sa
+
+
+def upgrade():
+    op.add_column('ps_contacts', sa.Column('reg_server', sa.String(20)))
+    op.drop_constraint(UniqueConstraint('id'), 'ps_contacts', type_='unique')
+    op.create_unique_constraint('ps_contacts_uq', 'ps_contacts', ['id','reg_server'])
+
+def downgrade():
+    op.drop_constraint('ps_contacts_uq', 'ps_contacts', type_='unique')
+    op.drop_column('reg_server')
+    op.create_unique_constraint(None, 'ps_contacts', 'id')
index 6939d27..b6684ae 100644 (file)
@@ -248,6 +248,8 @@ struct ast_sip_contact {
        double qualify_timeout;
        /*! Endpoint that added the contact, only available in observers */
        struct ast_sip_endpoint *endpoint;
+       /*! Asterisk Server name */
+       AST_STRING_FIELD_EXTENDED(reg_server);
 };
 
 #define CONTACT_STATUS "contact_status"
index 6890e63..db3395f 100644 (file)
                                                REGISTER requests and is not intended to be configured manually.
                                        </para></description>
                                </configOption>
+                               <configOption name="reg_server">
+                                       <synopsis>Asterisk Server name</synopsis>
+                                       <description><para>
+                                               Asterisk Server name on which SIP endpoint registered.
+                                       </para></description>
+                               </configOption>
                        </configObject>
                        <configObject name="aor">
                                <synopsis>The configuration for a location of an endpoint</synopsis>
index db4f9ac..2779fe3 100644 (file)
@@ -23,6 +23,7 @@
 #include "asterisk/res_pjsip.h"
 #include "asterisk/logger.h"
 #include "asterisk/astobj2.h"
+#include "asterisk/paths.h"
 #include "asterisk/sorcery.h"
 #include "include/res_pjsip_private.h"
 #include "asterisk/res_pjsip_cli.h"
@@ -119,6 +120,8 @@ static void *contact_alloc(const char *name)
                return NULL;
        }
 
+       ast_string_field_init_extended(contact, reg_server);
+
        /* Dynamic contacts are delimited with ";@" and static ones with "@@" */
        if ((aor_separator = strstr(id, ";@")) || (aor_separator = strstr(id, "@@"))) {
                *aor_separator = '\0';
@@ -330,6 +333,10 @@ int ast_sip_location_add_contact_nolock(struct ast_sip_aor *aor, const char *uri
                ast_string_field_set(contact, user_agent, user_agent);
        }
 
+       if (!ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
+               ast_string_field_set(contact, reg_server, ast_config_AST_SYSTEM_NAME);
+       }
+
        contact->endpoint = ao2_bump(endpoint);
 
        return ast_sorcery_create(ast_sip_get_sorcery(), contact);
@@ -1111,6 +1118,7 @@ int ast_sip_initialize_sorcery_location(void)
        ast_sorcery_object_field_register(sorcery, "contact", "qualify_timeout", "3.0", OPT_DOUBLE_T, 0, FLDSET(struct ast_sip_contact, qualify_timeout));
        ast_sorcery_object_field_register(sorcery, "contact", "outbound_proxy", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, outbound_proxy));
        ast_sorcery_object_field_register(sorcery, "contact", "user_agent", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, user_agent));
+       ast_sorcery_object_field_register(sorcery, "contact", "reg_server", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_contact, reg_server));
 
        ast_sorcery_object_field_register(sorcery, "aor", "type", "", OPT_NOOP_T, 0, 0);
        ast_sorcery_object_field_register(sorcery, "aor", "minimum_expiration", "60", OPT_UINT_T, 0, FLDSET(struct ast_sip_aor, minimum_expiration));
index ae8440a..65fd56c 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "asterisk/res_pjsip.h"
 #include "asterisk/module.h"
+#include "asterisk/paths.h"
 #include "asterisk/test.h"
 #include "asterisk/taskprocessor.h"
 #include "asterisk/manager.h"
@@ -555,6 +556,9 @@ static int rx_task_core(struct rx_task_data *task_data, struct ao2_container *co
                        if (user_agent) {
                                ast_string_field_set(contact_update, user_agent, user_agent);
                        }
+                       if (!ast_strlen_zero(ast_config_AST_SYSTEM_NAME)) {
+                               ast_string_field_set(contact_update, reg_server, ast_config_AST_SYSTEM_NAME);
+                       }
 
                        if (ast_sip_location_update_contact(contact_update)) {
                                ast_log(LOG_ERROR, "Failed to update contact '%s' expiration time to %d seconds.\n",