Compare commits

...

3 Commits

Author SHA1 Message Date
Martin Paterson 8643bf4277
Merge 6e7e76be88 into 3b58ebc5f3 2025-01-21 00:17:22 +00:00
junction1153b 3b58ebc5f3
[mod_sofia] Update Polycom UA to recognize new Poly phones
We observed that the new Poly phones (formerly known as Polycom) were not getting sent a SIP UPDATE in certain circumstances (example: retrieving a parked call, and therefore, Caller ID would not show the parked caller). I renamed Polycom to Poly which will catch all Poly AND Polycom UA's. I also added Acrobits, and Ringotel to extend such functionality to those UA's. There were also other minor compatibility issues with the new Poly phones which have been resolved with tweaking the UA recognition on the code.

Co-authored-by: Joseph <junction1153@gmail.com>
2025-01-21 00:57:25 +03:00
Martin.Paterson 6e7e76be88 [mod_odbc_cdr] add sql output to file on failed db insert 2024-02-28 18:40:18 +00:00
6 changed files with 33 additions and 6 deletions

View File

@ -254,7 +254,7 @@ char *generate_pai_str(private_object_t *tech_pvt)
callee_number = switch_sanitize_number(switch_core_session_strdup(session, callee_number));
callee_name = switch_sanitize_number(switch_core_session_strdup(session, callee_name));
if (!zstr(callee_number) && (zstr(ua) || !switch_stristr("polycom", ua))) {
if (!zstr(callee_number) && (zstr(ua) || !switch_stristr("poly", ua))) {
callee_number = switch_core_session_sprintf(session, "sip:%s@%s", callee_number, host);
}
@ -2075,13 +2075,15 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
nua_info(tech_pvt->nh, SIPTAG_CONTENT_TYPE_STR("message/sipfrag"),
TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)), SIPTAG_PAYLOAD_STR(message), TAG_END());
} else if (update_allowed && ua && (switch_channel_var_true(tech_pvt->channel, "update_ignore_ua") ||
switch_stristr("polycom", ua) ||
switch_stristr("poly", ua) ||
(switch_stristr("aastra", ua) && !switch_stristr("Intelligate", ua)) ||
(switch_stristr("cisco/spa50", ua) ||
switch_stristr("cisco/spa525", ua)) ||
switch_stristr("cisco/spa30", ua) ||
switch_stristr("Fanvil", ua) ||
switch_stristr("Grandstream", ua) ||
switch_stristr("Ringotel", ua) ||
switch_stristr("Groundwire", ua) ||
switch_stristr("Yealink", ua) ||
switch_stristr("Mitel", ua) ||
switch_stristr("Panasonic", ua))) {
@ -2152,7 +2154,7 @@ static switch_status_t sofia_receive_message(switch_core_session_t *session, swi
SIPTAG_PAYLOAD_STR(message),
TAG_IF(!zstr(session_id_header), SIPTAG_HEADER_STR(session_id_header)),
TAG_END());
} else if (ua && switch_stristr("polycom", ua)) {
} else if (ua && switch_stristr("poly", ua)) {
snprintf(message, sizeof(message), "P-Asserted-Identity: \"%s\" <%s>", msg->string_arg, tech_pvt->caller_profile->destination_number);
nua_update(tech_pvt->nh,
NUTAG_SESSION_TIMER(tech_pvt->session_timeout),

View File

@ -10476,7 +10476,7 @@ void sofia_handle_sip_i_invite(switch_core_session_t *session, nua_t *nua, sofia
(!is_tcp && !is_tls && (zstr(network_ip) || !switch_check_network_list_ip(network_ip, profile->local_network)) &&
profile->server_rport_level >= 2 && sip->sip_user_agent &&
sip->sip_user_agent->g_string &&
(!strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) || !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20)))
(!strncasecmp(sip->sip_user_agent->g_string, "Poly", 4) || !strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20)))
) {
if (sip->sip_via) {
const char *port = sip->sip_via->v_port;

View File

@ -2501,7 +2501,7 @@ static char *gen_pidf(char *user_agent, char *id, char *url, char *open, char *r
{
char *ret = NULL;
if (switch_stristr("polycom", user_agent)) {
if (switch_stristr("poly", user_agent)) {
*ct = "application/xpidf+xml";
/* If unknown/none prpid is provided, just show the user as online. */

View File

@ -1661,7 +1661,7 @@ uint8_t sofia_reg_handle_register_token(nua_t *nua, sofia_profile_t *profile, nu
if (!is_tcp && !is_tls && (zstr(network_ip) || !switch_check_network_list_ip(network_ip, profile->local_network)) &&
profile->server_rport_level >= 2 && sip->sip_user_agent &&
sip->sip_user_agent->g_string &&
( !strncasecmp(sip->sip_user_agent->g_string, "Polycom", 7) ||
( !strncasecmp(sip->sip_user_agent->g_string, "Poly", 4) ||
!strncasecmp(sip->sip_user_agent->g_string, "KIRK Wireless Server", 20) ||
!strncasecmp(sip->sip_user_agent->g_string, "ADTRAN_Total_Access", 19) )) {
if (sip->sip_via) {

View File

@ -10,6 +10,10 @@
<param name="csv-path" value="/usr/local/freeswitch/log/odbc_cdr"/>
<!-- if "csv-path-on-fail" is set, failed INSERTs will be placed here as CSV files otherwise they will be placed in "csv-path" -->
<param name="csv-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/>
<!-- value can be "never", "on-db-fail" -->
<param name="write-sql" value="on-db-fail"/>
<!-- failed INSERTs will be placed here -->
<param name="sql-path-on-fail" value="/usr/local/freeswitch/log/odbc_cdr/failed"/>
<!-- dump SQL statement after leg ends -->
<param name="debug-sql" value="true"/>
</settings>

View File

@ -52,13 +52,20 @@ typedef enum {
ODBC_CDR_CSV_ON_FAIL
} odbc_cdr_write_csv_t;
typedef enum {
ODBC_CDR_SQL_NEVER,
ODBC_CDR_SQL_ON_FAIL
} odbc_cdr_write_sql_t;
static struct {
char *odbc_dsn;
char *dbname;
char *csv_path;
char *csv_fail_path;
char *sql_fail_path;
odbc_cdr_log_leg_t log_leg;
odbc_cdr_write_csv_t write_csv;
odbc_cdr_write_sql_t write_sql;
switch_bool_t debug_sql;
switch_hash_t *table_hash;
uint32_t running;
@ -364,6 +371,13 @@ static switch_status_t odbc_cdr_reporting(switch_core_session_t *session)
switch_safe_free(full_path);
}
if (globals.write_sql == ODBC_CDR_SQL_ON_FAIL && insert_fail == SWITCH_TRUE) {
full_path = switch_mprintf("%s%s%s_%s.sql", globals.sql_fail_path, SWITCH_PATH_SEPARATOR, uuid, table_name);
assert(full_path);
write_cdr(full_path, sql);
switch_safe_free(full_path);
}
switch_safe_free(sql);
switch_safe_free(stream_field.data);
@ -414,6 +428,7 @@ static switch_status_t odbc_cdr_load_config(void)
globals.debug_sql = SWITCH_FALSE;
globals.log_leg = ODBC_CDR_LOG_BOTH;
globals.write_csv = ODBC_CDR_CSV_NEVER;
globals.write_sql = ODBC_CDR_SQL_NEVER;
if ((settings = switch_xml_child(cfg, "settings")) != NULL) {
for (param = switch_xml_child(settings, "param"); param; param = param->next) {
@ -444,10 +459,16 @@ static switch_status_t odbc_cdr_load_config(void)
} else if (!strcasecmp(val, "on-db-fail")) {
globals.write_csv = ODBC_CDR_CSV_ON_FAIL;
}
} else if (!strcasecmp(var, "write-sql") && !zstr(val)) {
if (!strcasecmp(val, "on-db-fail")) {
globals.write_sql = ODBC_CDR_SQL_ON_FAIL;
}
} else if (!strcasecmp(var, "csv-path") && !zstr(val)) {
globals.csv_path = switch_mprintf("%s%s", val, SWITCH_PATH_SEPARATOR);
} else if (!strcasecmp(var, "csv-path-on-fail") && !zstr(val)) {
globals.csv_fail_path = switch_mprintf("%s%s", val, SWITCH_PATH_SEPARATOR);
} else if (!strcasecmp(var, "sql-path-on-fail") && !zstr(val)) {
globals.sql_fail_path = switch_mprintf("%s%s", val, SWITCH_PATH_SEPARATOR);
}
}
}