diff options
| author | Kozlov Dmitry <dima@server> | 2010-11-10 18:33:36 +0300 |
|---|---|---|
| committer | Kozlov Dmitry <dima@server> | 2010-11-10 18:33:36 +0300 |
| commit | 058e7ff66b8fbb1f9494ae5077e5294db288fb1c (patch) | |
| tree | e5d4c535539681843efb80bb1f06a643cee88904 /accel-pptpd/cli | |
| parent | 4d826710d0d30606da88ff3543a4b43521e404df (diff) | |
| download | accel-ppp-058e7ff66b8fbb1f9494ae5077e5294db288fb1c.tar.gz accel-ppp-058e7ff66b8fbb1f9494ae5077e5294db288fb1c.zip | |
cli: implemented following command list: show stat, show sessions, terminate (sessison)
Diffstat (limited to 'accel-pptpd/cli')
| -rw-r--r-- | accel-pptpd/cli/std_cmd.c | 210 | ||||
| -rw-r--r-- | accel-pptpd/cli/telnet.c | 8 |
2 files changed, 195 insertions, 23 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); } diff --git a/accel-pptpd/cli/telnet.c b/accel-pptpd/cli/telnet.c index 30ec02b..377f5f0 100644 --- a/accel-pptpd/cli/telnet.c +++ b/accel-pptpd/cli/telnet.c @@ -121,14 +121,14 @@ static int send_prompt(struct client_t *cln) return telnet_send(cln, conf_prompt, strlen(conf_prompt)); } -static void print_buf(const uint8_t *buf, int size) +/*static void print_buf(const uint8_t *buf, int size) { int i; for (i = 0; i < size; i++) log_debug("%x ", buf[i]); log_debug("\n"); -} +}*/ static int process_data(struct client_t *cln) { @@ -209,8 +209,8 @@ static int cln_read(struct triton_md_handler_t *h) log_error("cli: read: %s\n", strerror(errno)); return 0; } - log_debug("cli: read(%i): ", n); - print_buf(cln->recv_buf + cln->recv_pos, n); + /*log_debug("cli: read(%i): ", n); + print_buf(cln->recv_buf + cln->recv_pos, n);*/ cln->recv_pos += n; if (process_data(cln)) return -1; |
