return CLI_SUCCESS;
}
+static char *cli_show_qualify_endpoint(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
+ const char *endpoint_name;
+ char *aors;
+ char *aor_name;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "pjsip show qualify endpoint";
+ e->usage =
+ "Usage: pjsip show qualify endpoint <id>\n"
+ " Show the current qualify options for all Aors on the PJSIP endpoint.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 5) {
+ return CLI_SHOWUSAGE;
+ }
+
+ endpoint_name = a->argv[4];
+
+ endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint",
+ endpoint_name);
+ if (!endpoint) {
+ ast_cli(a->fd, "Unable to retrieve endpoint %s\n", endpoint_name);
+ return CLI_FAILURE;
+ }
+
+ if (ast_strlen_zero(endpoint->aors)) {
+ ast_cli(a->fd, "No AORs configured for endpoint '%s'\n", endpoint_name);
+ return CLI_FAILURE;
+ }
+
+ aors = ast_strdupa(endpoint->aors);
+ while ((aor_name = ast_strip(strsep(&aors, ",")))) {
+ struct sip_options_aor *aor_options;
+
+ aor_options = ao2_find(sip_options_aors, aor_name, OBJ_SEARCH_KEY);
+ if (!aor_options) {
+ continue;
+ }
+
+ ast_cli(a->fd, " * AOR '%s' on endpoint '%s'\n", aor_name, endpoint_name);
+ ast_cli(a->fd, " Qualify frequency : %d sec\n", aor_options->qualify_frequency);
+ ast_cli(a->fd, " Qualify timeout : %d ms\n", (int)(aor_options->qualify_timeout / 1000));
+ ast_cli(a->fd, " Authenticate qualify : %s\n", aor_options->authenticate_qualify?"yes":"no");
+ ast_cli(a->fd, "\n");
+ ao2_ref(aor_options, -1);
+ }
+
+ return CLI_SUCCESS;
+}
+
+static char *cli_show_qualify_aor(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ struct sip_options_aor *aor_options;
+ const char *aor_name;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "pjsip show qualify aor";
+ e->usage =
+ "Usage: pjsip show qualify aor <id>\n"
+ " Show the PJSIP Aor current qualify options.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 5) {
+ return CLI_SHOWUSAGE;
+ }
+
+ aor_name = a->argv[4];
+
+ aor_options = ao2_find(sip_options_aors, aor_name, OBJ_SEARCH_KEY);
+ if (!aor_options) {
+ ast_cli(a->fd, "Unable to retrieve aor '%s' qualify options\n", aor_name);
+ return CLI_FAILURE;
+ }
+
+ ast_cli(a->fd, " * AOR '%s'\n", aor_name);
+ ast_cli(a->fd, " Qualify frequency : %d sec\n", aor_options->qualify_frequency);
+ ast_cli(a->fd, " Qualify timeout : %d ms\n", (int)(aor_options->qualify_timeout / 1000));
+ ast_cli(a->fd, " Authenticate qualify : %s\n", aor_options->authenticate_qualify?"yes":"no");
+ ao2_ref(aor_options, -1);
+
+ return CLI_SUCCESS;
+}
+
+static char *cli_reload_qualify_endpoint(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ RAII_VAR(struct ast_sip_endpoint *, endpoint, NULL, ao2_cleanup);
+ const char *endpoint_name;
+ char *aors;
+ char *aor_name;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "pjsip reload qualify endpoint";
+ e->usage =
+ "Usage: pjsip reload qualify endpoint <id>\n"
+ " Synchronize the qualify options for all Aors on the PJSIP endpoint.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 5) {
+ return CLI_SHOWUSAGE;
+ }
+
+ endpoint_name = a->argv[4];
+
+ endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint",
+ endpoint_name);
+ if (!endpoint) {
+ ast_cli(a->fd, "Unable to retrieve endpoint %s\n", endpoint_name);
+ return CLI_FAILURE;
+ }
+
+ if (ast_strlen_zero(endpoint->aors)) {
+ ast_cli(a->fd, "No AORs configured for endpoint '%s'\n", endpoint_name);
+ return CLI_FAILURE;
+ }
+
+ aors = ast_strdupa(endpoint->aors);
+ while ((aor_name = ast_strip(strsep(&aors, ",")))) {
+ struct ast_sip_aor *aor;
+
+ aor = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "aor", aor_name);
+ if (!aor) {
+ continue;
+ }
+
+ ast_cli(a->fd, "Synchronizing AOR '%s' on endpoint '%s'\n", aor_name, endpoint_name);
+ ast_sip_push_task_wait_serializer(management_serializer,
+ sip_options_aor_observer_modified_task, aor);
+ ao2_ref(aor, -1);
+ }
+
+ return CLI_SUCCESS;
+}
+
+static char *cli_reload_qualify_aor(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+{
+ struct ast_sip_aor *aor;
+ const char *aor_name;
+
+ switch (cmd) {
+ case CLI_INIT:
+ e->command = "pjsip reload qualify aor";
+ e->usage =
+ "Usage: pjsip reload qualify aor <id>\n"
+ " Synchronize the PJSIP Aor qualify options.\n";
+ return NULL;
+ case CLI_GENERATE:
+ return NULL;
+ }
+
+ if (a->argc != 5) {
+ return CLI_SHOWUSAGE;
+ }
+
+ aor_name = a->argv[4];
+
+ aor = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "aor", aor_name);
+ if (!aor) {
+ ast_cli(a->fd, "Unable to retrieve aor '%s'\n", aor_name);
+ return CLI_FAILURE;
+ }
+
+ ast_cli(a->fd, "Synchronizing AOR '%s'\n", aor_name);
+ ast_sip_push_task_wait_serializer(management_serializer,
+ sip_options_aor_observer_modified_task, aor);
+ ao2_ref(aor, -1);
+
+ return CLI_SUCCESS;
+}
+
static int ami_sip_qualify(struct mansession *s, const struct message *m)
{
const char *endpoint_name = astman_get_header(m, "Endpoint");
}
static struct ast_cli_entry cli_options[] = {
- AST_CLI_DEFINE(cli_qualify, "Send an OPTIONS request to a PJSIP endpoint")
+ AST_CLI_DEFINE(cli_qualify, "Send an OPTIONS request to a PJSIP endpoint"),
+ AST_CLI_DEFINE(cli_show_qualify_endpoint, "Show the current qualify options for all Aors on the PJSIP endpoint"),
+ AST_CLI_DEFINE(cli_show_qualify_aor, "Show the PJSIP Aor current qualify options"),
+ AST_CLI_DEFINE(cli_reload_qualify_endpoint, "Synchronize the qualify options for all Aors on the PJSIP endpoint"),
+ AST_CLI_DEFINE(cli_reload_qualify_aor, "Synchronize the PJSIP Aor qualify options"),
};