diff options
Diffstat (limited to 'accel-pptpd/cli/std_cmd.c')
-rw-r--r-- | accel-pptpd/cli/std_cmd.c | 210 |
1 files changed, 191 insertions, 19 deletions
diff --git a/accel-pptpd/cli/std_cmd.c b/accel-pptpd/cli/std_cmd.c index 2239bef..491caf7 100644 --- a/accel-pptpd/cli/std_cmd.c +++ b/accel-pptpd/cli/std_cmd.c @@ -1,7 +1,11 @@ #include <stdio.h> +#include <time.h> +#include <string.h> #include "triton.h" +#include "ppp.h" #include "cli.h" +#include "utils.h" int show_stat_exec(const char *cmd, char * const *fields, int fields_cnt, void *client) { @@ -10,47 +14,63 @@ int show_stat_exec(const char *cmd, char * const *fields, int fields_cnt, void * if (cli_send(client, "core:\r\n")) return CLI_CMD_FAILED; - sprintf(buf, "\tmempool_allocated: %u\r\n", triton_stat.mempool_allocated); + sprintf(buf, " mempool_allocated: %u\r\n", triton_stat.mempool_allocated); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tmempool_available: %u\r\n", triton_stat.mempool_available); + sprintf(buf, " mempool_available: %u\r\n", triton_stat.mempool_available); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tthread_count: %u\r\n", triton_stat.thread_count); + sprintf(buf, " thread_count: %u\r\n", triton_stat.thread_count); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tthread_active: %u\r\n", triton_stat.thread_active); + sprintf(buf, " thread_active: %u\r\n", triton_stat.thread_active); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tcontext_count: %u\r\n", triton_stat.context_count); + sprintf(buf, " context_count: %u\r\n", triton_stat.context_count); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tcontext_sleeping: %u\r\n", triton_stat.context_sleeping); + sprintf(buf, " context_sleeping: %u\r\n", triton_stat.context_sleeping); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tcontext_pending: %u\r\n", triton_stat.context_pending); + sprintf(buf, " context_pending: %u\r\n", triton_stat.context_pending); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tmd_handler_count: %u\r\n", triton_stat.md_handler_count); + sprintf(buf, " md_handler_count: %u\r\n", triton_stat.md_handler_count); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\tmd_handler_pending: %u\r\n", triton_stat.md_handler_pending); + sprintf(buf, " md_handler_pending: %u\r\n", triton_stat.md_handler_pending); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\ttimer_count: %u\r\n", triton_stat.timer_count); + sprintf(buf, " timer_count: %u\r\n", triton_stat.timer_count); if (cli_send(client, buf)) return CLI_CMD_FAILED; - sprintf(buf, "\ttimer_pending: %u\r\n", triton_stat.timer_pending); + sprintf(buf, " timer_pending: %u\r\n", triton_stat.timer_pending); + if (cli_send(client, buf)) + return CLI_CMD_FAILED; + +//=========== + if (cli_send(client, "ppp:\r\n")) + return CLI_CMD_FAILED; + + sprintf(buf, " staring: %u\r\n", ppp_stat.starting); + if (cli_send(client, buf)) + return CLI_CMD_FAILED; + + sprintf(buf, " active: %u\r\n", ppp_stat.active); + if (cli_send(client, buf)) + return CLI_CMD_FAILED; + + sprintf(buf, " finishing: %u\r\n", ppp_stat.finishing); if (cli_send(client, buf)) return CLI_CMD_FAILED; @@ -65,6 +85,16 @@ int show_stat_help(char * const *fields, int fields_cnt, void *client) return 0; } +const char *show_stat_hdr[] = {"show","stat"}; +static struct cli_simple_cmd_t show_stat_cmd = { + .hdr_len = 2, + .hdr = show_stat_hdr, + .exec = show_stat_exec, + .help = show_stat_help, +}; + +//============================= + int exit_exec(const char *cmd, char * const *fields, int fields_cnt, void *client) { return CLI_CMD_EXIT; @@ -78,14 +108,6 @@ int exit_help(char * const *fields, int fields_cnt, void *client) return 0; } -const char *show_stat_hdr[] = {"show","stat"}; -static struct cli_simple_cmd_t show_stat_cmd = { - .hdr_len = 2, - .hdr = show_stat_hdr, - .exec = show_stat_exec, - .help = show_stat_help, -}; - const char *exit_hdr[] = {"exit"}; static struct cli_simple_cmd_t exit_cmd = { .hdr_len = 1, @@ -94,9 +116,159 @@ static struct cli_simple_cmd_t exit_cmd = { .help = exit_help, }; +//============================= + +int show_ses_exec(const char *cmd, char * const *fields, int fields_cnt, void *client) +{ + char buf[128]; + char ip_str[17]; + char *state_str; + char time_str[12]; + time_t uptime; + int day,hour,min,sec; + struct ppp_t *ppp; + + if (cli_send(client, "interface: username: address: type: state: uptime:\r\n")) + return CLI_CMD_FAILED; + + if (cli_send(client, "------------------------------------------------------------------------\r\n")) + return CLI_CMD_FAILED; + + pthread_rwlock_rdlock(&ppp_lock); + list_for_each_entry(ppp, &ppp_list, entry) { + u_inet_ntoa(ppp->peer_ipaddr, ip_str); + + switch (ppp->state) { + case PPP_STATE_STARTING: + state_str = "start"; + break; + case PPP_STATE_ACTIVE: + state_str = "active"; + break; + case PPP_STATE_FINISHING: + state_str = "finish"; + break; + default: + state_str = "unk"; + } + + if (ppp->stop_time) + uptime = ppp->stop_time - ppp->start_time; + else { + time(&uptime); + uptime -= ppp->start_time; + } + day = uptime/ (24*60*60); uptime %= (24*60*60); + hour = uptime / (60*60); uptime %= (60*60); + min = uptime / 60; + sec = uptime % 60; + if (day) + sprintf(time_str, "%i.%02i:%02i:%02i", day, hour, min, sec); + else + sprintf(time_str, "%02i:%02i:%02i", hour, min, sec); + + sprintf(buf, "%9s %15s %16s %6s %6s %10s\r\n", ppp->ifname, ppp->username ? ppp->username : "", ip_str, ppp->ctrl->name, state_str, time_str); + if (cli_send(client, buf)) { + pthread_rwlock_unlock(&ppp_lock); + return CLI_CMD_FAILED; + } + } + pthread_rwlock_unlock(&ppp_lock); + + return CLI_CMD_OK; +} + +int show_ses_help(char * const *fields, int fields_cnt, void *client) +{ + if (cli_send(client, "show sessions - shows all sessions\r\n")) + return -1; + + return 0; +} + +const char *show_ses_hdr[] = {"show", "sessions"}; +static struct cli_simple_cmd_t show_ses_cmd = { + .hdr_len = 2, + .hdr = show_ses_hdr, + .exec = show_ses_exec, + .help = show_ses_help, +}; + +//============================= + +static void ppp_terminate_soft(struct ppp_t *ppp) +{ + ppp_terminate(ppp, 0, TERM_ADMIN_RESET); +} + +static void ppp_terminate_hard(struct ppp_t *ppp) +{ + ppp_terminate(ppp, 1, TERM_ADMIN_RESET); +} + +int terminate_help(char * const *fields, int fields_cnt, void *client); +int terminate_exec(const char *cmd, char * const *fields, int fields_cnt, void *client) +{ + struct ppp_t *ppp; + int hard = 0; + + if (fields_cnt == 1) + return terminate_help(NULL, 0, client); + + if (fields_cnt == 3) { + if (!strcmp(fields[2], "hard")) + hard = 1; + else if (strcmp(fields[2], "soft")) + return terminate_help(NULL, 0, client); + } + + pthread_rwlock_rdlock(&ppp_lock); + if (strcmp(fields[1], "all")) { + list_for_each_entry(ppp, &ppp_list, entry) { + if (strcmp(ppp->ifname, fields[1])) + continue; + if (hard) + triton_context_call(ppp->ctrl->ctx, (triton_event_func)ppp_terminate_hard, ppp); + else + triton_context_call(ppp->ctrl->ctx, (triton_event_func)ppp_terminate_soft, ppp); + break; + } + } else { + list_for_each_entry(ppp, &ppp_list, entry) { + if (hard) + triton_context_call(ppp->ctrl->ctx, (triton_event_func)ppp_terminate_hard, ppp); + else + triton_context_call(ppp->ctrl->ctx, (triton_event_func)ppp_terminate_soft, ppp); + } + } + pthread_rwlock_unlock(&ppp_lock); + + return CLI_CMD_OK; +} + +int terminate_help(char * const *fields, int fields_cnt, void *client) +{ + if (cli_send(client, "terminate <interface> [soft|hard]- terminate session\r\n")) + return -1; + + if (cli_send(client, "terminate all [soft|hard]- terminate all session\r\n")) + return -1; + + return 0; +} + +const char *terminate_hdr[] = {"terminate"}; +static struct cli_simple_cmd_t terminate_cmd = { + .hdr_len = 1, + .hdr = terminate_hdr, + .exec = terminate_exec, + .help = terminate_help, +}; static void __init init(void) { cli_register_simple_cmd(&show_stat_cmd); + cli_register_simple_cmd(&show_ses_cmd); + cli_register_simple_cmd(&terminate_cmd); cli_register_simple_cmd(&exit_cmd); } |