From 93bd5833c270b4388d1156cea47ad3642ace7b0b Mon Sep 17 00:00:00 2001 From: Steven Ayre Date: Wed, 3 Sep 2014 21:44:11 +0100 Subject: [PATCH] Add uptime property to mod_sofia gateways The 'UP' status indicates a gateway is online as determined by registration and/or SIP OPTIONS pinging. The time the gateway has been in the 'UP' status is recorded, and can be monitored using 'sofia status' and 'sofia xmlstatus'. This can be used to detect and graph when there are outages. ref: FS-6772 Reviewed-by: Travis Cross --- src/mod/endpoints/mod_sofia/mod_sofia.c | 2 ++ src/mod/endpoints/mod_sofia/mod_sofia.h | 1 + src/mod/endpoints/mod_sofia/sofia.c | 2 ++ src/mod/endpoints/mod_sofia/sofia_reg.c | 8 ++++++-- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 33f4e0f855..5f656b762c 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -2584,6 +2584,7 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t stream->write_function(stream, "PingState\t%d/%d/%d\n", gp->ping_min, gp->ping_count, gp->ping_max); stream->write_function(stream, "State \t%s\n", sofia_state_names[gp->state]); stream->write_function(stream, "Status \t%s%s\n", status_names[gp->status], gp->pinging ? " (ping)" : ""); + stream->write_function(stream, "Uptime \t%ld\n", gp->status == SOFIA_GATEWAY_UP ? switch_time_now()-gp->uptime : 0); stream->write_function(stream, "CallsIN \t%u\n", gp->ib_calls); stream->write_function(stream, "CallsOUT\t%u\n", gp->ob_calls); stream->write_function(stream, "FailedCallsIN\t%u\n", gp->ib_failed_calls); @@ -2827,6 +2828,7 @@ static void xml_gateway_status(sofia_gateway_t *gp, switch_stream_handle_t *stre stream->write_function(stream, " %d\n", gp->pinging); stream->write_function(stream, " %s\n", sofia_state_names[gp->state]); stream->write_function(stream, " %s\n", status_names[gp->status]); + stream->write_function(stream, " %ld\n", gp->status == SOFIA_GATEWAY_UP ? switch_time_now()-gp->uptime : 0); stream->write_function(stream, " %u\n", gp->ib_calls); stream->write_function(stream, " %u\n", gp->ob_calls); stream->write_function(stream, " %u\n", gp->ib_failed_calls); diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 577ff07bbc..4be1d9747a 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -488,6 +488,7 @@ struct sofia_gateway { time_t reg_timeout; int pinging; sofia_gateway_status_t status; + switch_time_t uptime; uint32_t ping_freq; int ping_count; int ping_max; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index edc15cf69b..390a289d94 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -3487,6 +3487,7 @@ static void parse_gateways(sofia_profile_t *profile, switch_xml_t gateways_tag) if (!switch_true(register_str)) { gateway->state = REG_STATE_NOREG; gateway->status = SOFIA_GATEWAY_UP; + gateway->uptime = switch_time_now(); } if (zstr(auth_username)) { @@ -5563,6 +5564,7 @@ static void sofia_handle_sip_r_options(switch_core_session_t *session, int statu if (gateway->ping_count >= gateway->ping_min && gateway->status != SOFIA_GATEWAY_UP) { gateway->status = SOFIA_GATEWAY_UP; + gateway->uptime = switch_time_now(); sofia_reg_fire_custom_gateway_state_event(gateway, status, phrase); } diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 206b77283b..053ddd9a9e 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -372,8 +372,9 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now) switch (ostate) { case REG_STATE_NOREG: - if (!gateway_ptr->ping && !gateway_ptr->pinging) { + if (!gateway_ptr->ping && !gateway_ptr->pinging && gateway_ptr->status != SOFIA_GATEWAY_UP) { gateway_ptr->status = SOFIA_GATEWAY_UP; + gateway_ptr->uptime = switch_time_now(); } break; case REG_STATE_REGISTER: @@ -396,7 +397,10 @@ void sofia_reg_check_gateway(sofia_profile_t *profile, time_t now) gateway_ptr->expires = now + delta; gateway_ptr->state = REG_STATE_REGED; - gateway_ptr->status = SOFIA_GATEWAY_UP; + if (gateway_ptr->status != SOFIA_GATEWAY_UP) { + gateway_ptr->status = SOFIA_GATEWAY_UP; + gateway_ptr->uptime = switch_time_now(); + } break; case REG_STATE_UNREGISTER: