mod_rayo: some bugfixes to pause-when-offline

This commit is contained in:
Chris Rienzo 2014-03-14 17:23:27 -04:00
parent 25db7bd7c2
commit ff555aa519
1 changed files with 82 additions and 46 deletions

View File

@ -36,7 +36,8 @@
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_rayo_shutdown); SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_rayo_shutdown);
SWITCH_MODULE_LOAD_FUNCTION(mod_rayo_load); SWITCH_MODULE_LOAD_FUNCTION(mod_rayo_load);
SWITCH_MODULE_DEFINITION(mod_rayo, mod_rayo_load, mod_rayo_shutdown, NULL); SWITCH_MODULE_RUNTIME_FUNCTION(mod_rayo_runtime);
SWITCH_MODULE_DEFINITION(mod_rayo, mod_rayo_load, mod_rayo_shutdown, mod_rayo_runtime);
#define RAYO_CAUSE_HANGUP SWITCH_CAUSE_NORMAL_CLEARING #define RAYO_CAUSE_HANGUP SWITCH_CAUSE_NORMAL_CLEARING
#define RAYO_CAUSE_DECLINE SWITCH_CAUSE_CALL_REJECTED #define RAYO_CAUSE_DECLINE SWITCH_CAUSE_CALL_REJECTED
@ -224,6 +225,8 @@ static struct {
int offer_uri; int offer_uri;
/** if true, pause inbound calling if all clients are offline */ /** if true, pause inbound calling if all clients are offline */
int pause_when_offline; int pause_when_offline;
/** flag to reduce log noise */
int offline_logged;
} globals; } globals;
/** /**
@ -458,6 +461,62 @@ static void add_header(iks *node, const char *name, const char *value)
} }
} }
static void pause_inbound_calling(void)
{
int32_t arg = 1;
switch_mutex_lock(globals.clients_mutex);
switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
if (!globals.offline_logged) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Pausing inbound calling\n");
globals.offline_logged = 1;
}
switch_mutex_unlock(globals.clients_mutex);
}
static void resume_inbound_calling(void)
{
int32_t arg = 0;
switch_mutex_lock(globals.clients_mutex);
switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
if (globals.offline_logged) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Resuming inbound calling\n");
globals.offline_logged = 0;
}
switch_mutex_unlock(globals.clients_mutex);
}
/**
* Check online status of rayo client(s) and pause/resume the server
*/
static void pause_when_offline(void)
{
if (globals.pause_when_offline) {
int is_online = 0;
switch_hash_index_t *hi;
switch_mutex_lock(globals.clients_mutex);
for (hi = switch_core_hash_first(globals.clients_roster); hi; hi = switch_core_hash_next(hi)) {
const void *key;
void *client;
switch_core_hash_this(hi, &key, NULL, &client);
switch_assert(client);
if (RAYO_CLIENT(client)->availability == PS_ONLINE) {
is_online = 1;
break;
}
}
if (is_online) {
resume_inbound_calling();
} else {
pause_inbound_calling();
}
switch_mutex_unlock(globals.clients_mutex);
}
}
/** /**
* Send event to clients * Send event to clients
* @param from event sender * @param from event sender
@ -1369,30 +1428,6 @@ struct rayo_component *_rayo_component_init(struct rayo_component *component, sw
return component; return component;
} }
/**
* @return true if at least one rayo client is online
*/
static int is_rayo_client_online(void)
{
int is_online = 0;
switch_hash_index_t *hi;
switch_mutex_lock(globals.clients_mutex);
for (hi = switch_core_hash_first(globals.clients_roster); hi; hi = switch_core_hash_next(hi)) {
const void *key;
void *client;
switch_core_hash_this(hi, &key, NULL, &client);
switch_assert(client);
if (RAYO_CLIENT(client)->availability == PS_ONLINE) {
is_online = 1;
break;
}
}
switch_mutex_unlock(globals.clients_mutex);
return is_online;
}
/** /**
* Send XMPP message to client * Send XMPP message to client
*/ */
@ -1417,11 +1452,7 @@ static void rayo_client_cleanup(struct rayo_actor *actor)
} }
switch_mutex_unlock(globals.clients_mutex); switch_mutex_unlock(globals.clients_mutex);
if (globals.pause_when_offline && !is_rayo_client_online()) { pause_when_offline();
/* pause inbound calling */
int32_t arg = 1;
switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
}
} }
/** /**
@ -1455,11 +1486,7 @@ static struct rayo_client *rayo_client_init(struct rayo_client *client, switch_m
switch_mutex_unlock(globals.clients_mutex); switch_mutex_unlock(globals.clients_mutex);
} }
if (globals.pause_when_offline && is_rayo_client_online()) { pause_when_offline();
/* resume inbound calling */
int32_t arg = 0;
switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
}
return client; return client;
} }
@ -2822,17 +2849,7 @@ static void on_client_presence(struct rayo_client *rclient, iks *node)
RAYO_UNLOCK(rclient); RAYO_UNLOCK(rclient);
} }
if (globals.pause_when_offline) { pause_when_offline();
if (is_rayo_client_online()) {
/* resume inbound calling */
int32_t arg = 0;
switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
} else {
/* pause inbound calling */
int32_t arg = 1;
switch_core_session_ctl(SCSC_PAUSE_INBOUND, &arg);
}
}
} }
/** /**
@ -3613,6 +3630,7 @@ SWITCH_STANDARD_APP(rayo_app)
/* nobody to offer to */ /* nobody to offer to */
if (!ok) { if (!ok) {
pause_when_offline();
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Rejecting rayo call - there are no online rayo clients to offer call to\n"); switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_NOTICE, "Rejecting rayo call - there are no online rayo clients to offer call to\n");
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_TEMPORARY_FAILURE); switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_TEMPORARY_FAILURE);
} }
@ -4534,6 +4552,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_rayo_load)
switch_core_hash_init(&globals.cmd_aliases); switch_core_hash_init(&globals.cmd_aliases);
switch_thread_rwlock_create(&globals.shutdown_rwlock, pool); switch_thread_rwlock_create(&globals.shutdown_rwlock, pool);
switch_queue_create(&globals.msg_queue, 25000, pool); switch_queue_create(&globals.msg_queue, 25000, pool);
globals.offline_logged = 1;
/* server commands */ /* server commands */
rayo_actor_command_handler_add(RAT_SERVER, "", "get:"IKS_NS_XMPP_PING":ping", on_iq_xmpp_ping); rayo_actor_command_handler_add(RAT_SERVER, "", "get:"IKS_NS_XMPP_PING":ping", on_iq_xmpp_ping);
@ -4668,6 +4687,23 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_rayo_shutdown)
return SWITCH_STATUS_SUCCESS; return SWITCH_STATUS_SUCCESS;
} }
/**
* Checks status of connected clients
*/
SWITCH_MODULE_RUNTIME_FUNCTION(mod_rayo_runtime)
{
if (globals.pause_when_offline) {
switch_thread_rwlock_rdlock(globals.shutdown_rwlock);
while (!globals.shutdown) {
switch_sleep(1000 * 1000); /* 1 second */
pause_when_offline();
}
switch_thread_rwlock_unlock(globals.shutdown_rwlock);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Runtime thread is done\n");
}
return SWITCH_STATUS_TERM;
}
/* For Emacs: /* For Emacs:
* Local Variables: * Local Variables:
* mode:c * mode:c