Issue #7443 - amdtech - Optionally SIP registrations in another
authorOlle Johansson <oej@edvina.net>
Thu, 15 Feb 2007 12:10:55 +0000 (12:10 +0000)
committerOlle Johansson <oej@edvina.net>
Thu, 15 Feb 2007 12:10:55 +0000 (12:10 +0000)
realtime family.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@54574 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
configs/extconfig.conf.sample
doc/realtime.txt

index 1b47035..619bbb9 100644 (file)
@@ -2502,12 +2502,17 @@ static void realtime_update_peer(const char *peername, struct sockaddr_in *sin,
        char port[10];
        char ipaddr[INET_ADDRSTRLEN];
        char regseconds[20];
+       char *tablename = NULL;
 
        char *sysname = ast_config_AST_SYSTEM_NAME;
        char *syslabel = NULL;
 
        time_t nowtime = time(NULL) + expirey;
        const char *fc = fullcontact ? "fullcontact" : NULL;
+
+       int realtimeregs = ast_check_realtime("sipregs");
+
+       tablename = realtimeregs ? "sipregs" : "sippeers";
        
        snprintf(regseconds, sizeof(regseconds), "%d", (int)nowtime);   /* Expiration time */
        ast_copy_string(ipaddr, ast_inet_ntoa(sin->sin_addr), sizeof(ipaddr));
@@ -2519,11 +2524,11 @@ static void realtime_update_peer(const char *peername, struct sockaddr_in *sin,
                syslabel = "regserver";
 
        if (fc)
-               ast_update_realtime("sippeers", "name", peername, "ipaddr", ipaddr,
+               ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
                        "port", port, "regseconds", regseconds,
                        "username", username, fc, fullcontact, syslabel, sysname, NULL); /* note fc and syslabel _can_ be NULL */
        else
-               ast_update_realtime("sippeers", "name", peername, "ipaddr", ipaddr,
+               ast_update_realtime(tablename, "name", peername, "ipaddr", ipaddr,
                        "port", port, "regseconds", regseconds,
                        "username", username, syslabel, sysname, NULL); /* note syslabel _can_ be NULL */
 }
@@ -2616,6 +2621,7 @@ static void update_peer(struct sip_peer *p, int expiry)
 
 /*! \brief  realtime_peer: Get peer from realtime storage
  * Checks the "sippeers" realtime family from extconfig.conf 
+ * Checks the "sipregs" realtime family from extconfig.conf if it's configured.
  * \todo Consider adding check of port address when matching here to follow the same
  *     algorithm as for static peers. Will we break anything by adding that?
 */
@@ -2623,17 +2629,42 @@ static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_i
 {
        struct sip_peer *peer;
        struct ast_variable *var = NULL;
+       struct ast_variable *varregs = NULL;
        struct ast_variable *tmp;
        char ipaddr[INET_ADDRSTRLEN];
+       int realtimeregs = ast_check_realtime("sipregs");
 
        /* First check on peer name */
-       if (newpeername) 
+       if (newpeername) {
                var = ast_load_realtime("sippeers", "name", newpeername, NULL);
-       else if (sin) { /* Then check on IP address for dynamic peers */
+               if (realtimeregs)
+                       varregs = ast_load_realtime("sipregs", "name", newpeername, NULL);
+       } else if (sin) {       /* Then check on IP address for dynamic peers */
                ast_copy_string(ipaddr, ast_inet_ntoa(sin->sin_addr), sizeof(ipaddr));
                var = ast_load_realtime("sippeers", "host", ipaddr, NULL);      /* First check for fixed IP hosts */
-               if (!var)
-                       var = ast_load_realtime("sippeers", "ipaddr", ipaddr, NULL);    /* Then check for registred hosts */
+               if (var && realtimeregs) {
+                       tmp = var;
+                       while (tmp) {
+                               if (!newpeername && !strcasecmp(tmp->name, "name"))
+                                       newpeername = tmp->value;
+                               tmp = tmp->next;
+                       }
+                       varregs = ast_load_realtime("sipregs", "name", newpeername, NULL);
+               } else {
+                       if (realtimeregs)
+                               varregs = ast_load_realtime("sipregs", "ipaddr", ipaddr, NULL); /* Then check for registered hosts */
+                       else
+                               var = ast_load_realtime("sippeers", "ipaddr", ipaddr, NULL); /* Then check for registered hosts */
+                       if (varregs) {
+                               tmp = varregs;
+                               while (tmp) {
+                                       if (!newpeername && !strcasecmp(tmp->name, "name"))
+                                               newpeername = tmp->value;
+                                       tmp = tmp->next;
+                               }
+                               var = ast_load_realtime("sippeers", "name", newpeername, NULL);
+                       }
+               }
        }
 
        if (!var)
@@ -2644,6 +2675,7 @@ static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_i
                if (!strcasecmp(tmp->name, "type") &&
                    !strcasecmp(tmp->value, "user")) {
                        ast_variables_destroy(var);
+                       ast_variables_destroy(varregs);
                        return NULL;
                } else if (!newpeername && !strcasecmp(tmp->name, "name")) {
                        newpeername = tmp->value;
@@ -2658,9 +2690,10 @@ static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_i
 
 
        /* Peer found in realtime, now build it in memory */
-       peer = build_peer(newpeername, var, NULL, !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS));
+       peer = build_peer(newpeername, var, varregs, !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS));
        if (!peer) {
                ast_variables_destroy(var);
+               ast_variables_destroy(varregs);
                return NULL;
        }
 
@@ -2681,6 +2714,7 @@ static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_i
                ast_set_flag(&peer->flags[0], SIP_REALTIME);
        }
        ast_variables_destroy(var);
+       ast_variables_destroy(varregs);
 
        return peer;
 }
@@ -7733,9 +7767,16 @@ static int transmit_request_with_auth(struct sip_pvt *p, int sipmethod, int seqn
 /*! \brief Remove registration data from realtime database or AST/DB when registration expires */
 static void destroy_association(struct sip_peer *peer)
 {
+       int realtimeregs;
+       char *tablename;
+       realtimeregs = ast_check_realtime("sipregs");
+       if (realtimeregs)
+               tablename = "sipregs";
+       else
+               tablename = "sippeers";
        if (!ast_test_flag(&global_flags[1], SIP_PAGE2_IGNOREREGEXPIRE)) {
                if (ast_test_flag(&peer->flags[1], SIP_PAGE2_RT_FROMCONTACT))
-                       ast_update_realtime("sippeers", "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", "username", "", "regserver", "", NULL);
+                       ast_update_realtime(tablename, "name", peer->name, "fullcontact", "", "ipaddr", "", "port", "", "regseconds", "0", "username", "", "regserver", "", NULL);
                else 
                        ast_db_del("SIP/Registry", peer->name);
        }
@@ -10563,10 +10604,12 @@ static int sip_show_settings(int fd, int argc, char *argv[])
 {
        int realtimepeers;
        int realtimeusers;
+       int realtimeregs;
        char codec_buf[BUFSIZ];
 
        realtimepeers = ast_check_realtime("sippeers");
        realtimeusers = ast_check_realtime("sipusers");
+       realtimeregs = ast_check_realtime("sipregs");
 
        if (argc != 3)
                return RESULT_SHOWUSAGE;
@@ -10611,7 +10654,7 @@ static int sip_show_settings(int fd, int argc, char *argv[])
        ast_cli(fd, "  Jitterbuffer resync:    %ld\n", global_jbconf.resync_threshold);
        ast_cli(fd, "  Jitterbuffer impl:      %s\n", global_jbconf.impl);
        ast_cli(fd, "  Jitterbuffer log:       %s\n", ast_test_flag(&global_jbconf, AST_JB_LOG) ? "Yes" : "No");
-       if (!realtimepeers && !realtimeusers)
+       if (!realtimepeers && !realtimeusers && !realtimeregs)
                ast_cli(fd, "  SIP realtime:           Disabled\n" );
        else
                ast_cli(fd, "  SIP realtime:           Enabled\n" );
@@ -10660,11 +10703,12 @@ static int sip_show_settings(int fd, int argc, char *argv[])
        ast_cli(fd, "  Voice Mail Extension:   %s\n", default_vmexten);
 
        
-       if (realtimepeers || realtimeusers) {
+       if (realtimepeers || realtimeusers || realtimeregs) {
                ast_cli(fd, "\nRealtime SIP Settings:\n");
                ast_cli(fd, "----------------------\n");
                ast_cli(fd, "  Realtime Peers:         %s\n", realtimepeers ? "Yes" : "No");
                ast_cli(fd, "  Realtime Users:         %s\n", realtimeusers ? "Yes" : "No");
+               ast_cli(fd, "  Realtime Regs:          %s\n", realtimeregs ? "Yes" : "No");
                ast_cli(fd, "  Cache Friends:          %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS) ? "Yes" : "No");
                ast_cli(fd, "  Update:                 %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_RTUPDATE) ? "Yes" : "No");
                ast_cli(fd, "  Ignore Reg. Expire:     %s\n", ast_test_flag(&global_flags[1], SIP_PAGE2_IGNOREREGEXPIRE) ? "Yes" : "No");
index a6c399f..0266ddc 100644 (file)
@@ -46,6 +46,7 @@
 ;iaxpeers => odbc,asterisk
 ;sipusers => odbc,asterisk
 ;sippeers => odbc,asterisk
+;sipregs => odbc,asterisk
 ;voicemail => odbc,asterisk
 ;extensions => odbc,asterisk
 ;queues => odbc,asterisk
index cc415ab..be7956b 100644 (file)
@@ -52,6 +52,9 @@ the ones in static configuration.
 With caching, the device stays in memory for a specified time. More 
 information about this is to be found in the sip.conf sample file.
 
+If you specify a separate family called "sipregs" SIP registration
+data will be stored in that table and not in the "sippeers" table.
+
 * Realtime H.323 friends
 ------------------------
 Like SIP realtime friends, H.323 friends also can be configured using