[mod_callcenter] Added additional safety check when deleting an agent
This commit is contained in:
parent
0bd0069293
commit
6726c3aa0d
|
@ -53,6 +53,7 @@ SWITCH_MODULE_DEFINITION(mod_callcenter, mod_callcenter_load, mod_callcenter_shu
|
||||||
|
|
||||||
static switch_status_t load_agent(const char *agent_name, switch_event_t *params, switch_xml_t x_agents_cfg);
|
static switch_status_t load_agent(const char *agent_name, switch_event_t *params, switch_xml_t x_agents_cfg);
|
||||||
static switch_status_t load_tiers(switch_bool_t load_all, const char *queue_name, const char *agent_name, switch_event_t *params, switch_xml_t x_tiers_cfg);
|
static switch_status_t load_tiers(switch_bool_t load_all, const char *queue_name, const char *agent_name, switch_event_t *params, switch_xml_t x_tiers_cfg);
|
||||||
|
|
||||||
static const char *global_cf = "callcenter.conf";
|
static const char *global_cf = "callcenter.conf";
|
||||||
|
|
||||||
struct cc_status_table {
|
struct cc_status_table {
|
||||||
|
@ -259,6 +260,8 @@ static char tiers_sql[] =
|
||||||
" level INTEGER NOT NULL DEFAULT 1,\n"
|
" level INTEGER NOT NULL DEFAULT 1,\n"
|
||||||
" position INTEGER NOT NULL DEFAULT 1\n" ");\n";
|
" position INTEGER NOT NULL DEFAULT 1\n" ");\n";
|
||||||
|
|
||||||
|
cc_status_t cc_agent_get(const char *key, const char *agent, char *ret_result, size_t ret_result_size);
|
||||||
|
|
||||||
static switch_xml_config_int_options_t config_int_0_86400 = { SWITCH_TRUE, 0, SWITCH_TRUE, 86400 };
|
static switch_xml_config_int_options_t config_int_0_86400 = { SWITCH_TRUE, 0, SWITCH_TRUE, 86400 };
|
||||||
|
|
||||||
/* TODO This is temporary until we either move it to the core, or use it differently in the module */
|
/* TODO This is temporary until we either move it to the core, or use it differently in the module */
|
||||||
|
@ -930,22 +933,60 @@ done:
|
||||||
cc_status_t cc_agent_del(const char *agent)
|
cc_status_t cc_agent_del(const char *agent)
|
||||||
{
|
{
|
||||||
switch_event_t *event;
|
switch_event_t *event;
|
||||||
cc_status_t result;
|
cc_status_t result = CC_STATUS_FALSE;
|
||||||
|
|
||||||
char *sql;
|
char *sql;
|
||||||
int deleted_row_count;
|
int deleted_row_count;
|
||||||
|
char ret[64];
|
||||||
|
cc_status_t res;
|
||||||
|
|
||||||
sql = switch_mprintf("DELETE FROM tiers WHERE agent = '%q';", agent);
|
/* Check to see if agent exist and if status is Logged Out */
|
||||||
cc_execute_sql(NULL, sql, NULL);
|
switch (res = cc_agent_get("status", agent, ret, sizeof(ret))) {
|
||||||
switch_safe_free(sql);
|
case CC_STATUS_SUCCESS:
|
||||||
|
if (strcasecmp(cc_agent_status2str(CC_AGENT_STATUS_LOGGED_OUT), ret)) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Agent %s status [%s] is not Waiting, cannot be deleted\n", ret, agent);
|
||||||
|
result = CC_STATUS_AGENT_INVALID_STATUS;
|
||||||
|
|
||||||
sql = switch_mprintf("DELETE FROM agents WHERE name = '%q';", agent);
|
goto done;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CC_STATUS_AGENT_NOT_FOUND:
|
||||||
|
result = CC_STATUS_AGENT_NOT_FOUND;
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Agent %s doesn't exist, cannot be deleted\n", agent);
|
||||||
|
goto done;
|
||||||
|
default:
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Unknown error code occur %d\n", (int)res);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check to see if agent state is Waiting */
|
||||||
|
switch (res = cc_agent_get("state", agent, ret, sizeof(ret))) {
|
||||||
|
case CC_STATUS_SUCCESS:
|
||||||
|
if (strcasecmp(cc_agent_status2str(CC_AGENT_STATE_WAITING), ret)) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Agent %s state [%s] is not Waiting, cannot be deleted\n", ret, agent);
|
||||||
|
result = CC_STATUS_AGENT_INVALID_STATE;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CC_STATUS_AGENT_NOT_FOUND:
|
||||||
|
result = CC_STATUS_AGENT_NOT_FOUND;
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Agent %s doesn't exist, cannot be deleted\n", agent);
|
||||||
|
goto done;
|
||||||
|
default:
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Unknown error code occur %d\n", (int)res);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
sql = switch_mprintf("DELETE FROM agents WHERE name = '%q' AND status = '%s' AND state = '%s';", agent, cc_agent_status2str(CC_AGENT_STATUS_LOGGED_OUT), cc_agent_status2str(CC_AGENT_STATE_WAITING));
|
||||||
deleted_row_count = cc_execute_sql_affected_rows(sql);
|
deleted_row_count = cc_execute_sql_affected_rows(sql);
|
||||||
switch_safe_free(sql);
|
switch_safe_free(sql);
|
||||||
|
|
||||||
if (deleted_row_count > 0) {
|
if (deleted_row_count > 0) {
|
||||||
|
sql = switch_mprintf("DELETE FROM tiers WHERE agent = '%q';", agent);
|
||||||
|
cc_execute_sql(NULL, sql, NULL);
|
||||||
|
switch_safe_free(sql);
|
||||||
|
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Deleted Agent %s\n", agent);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Deleted Agent %s and associated tiers\n", agent);
|
||||||
|
|
||||||
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CALLCENTER_EVENT) == SWITCH_STATUS_SUCCESS) {
|
if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CALLCENTER_EVENT) == SWITCH_STATUS_SUCCESS) {
|
||||||
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "CC-Agent", agent);
|
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "CC-Agent", agent);
|
||||||
|
@ -955,10 +996,10 @@ cc_status_t cc_agent_del(const char *agent)
|
||||||
result = CC_STATUS_SUCCESS;
|
result = CC_STATUS_SUCCESS;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Agent %s not found, can not be deleted\n", agent);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Agent %s status or state changed, cannot be deleted\n", agent);
|
||||||
result = CC_STATUS_AGENT_NOT_FOUND;
|
result = CC_STATUS_AGENT_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
done:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue