diff options
Diffstat (limited to 'accel-pptpd/cli/show_sessions.c')
-rw-r--r-- | accel-pptpd/cli/show_sessions.c | 434 |
1 files changed, 0 insertions, 434 deletions
diff --git a/accel-pptpd/cli/show_sessions.c b/accel-pptpd/cli/show_sessions.c deleted file mode 100644 index 90aeb3f..0000000 --- a/accel-pptpd/cli/show_sessions.c +++ /dev/null @@ -1,434 +0,0 @@ -#include <stdio.h> -#include <time.h> -#include <string.h> -#include <unistd.h> -#include <signal.h> -#include <arpa/inet.h> - -#include "triton.h" -#include "events.h" -#include "ppp.h" -#include "cli.h" -#include "utils.h" -#include "log.h" -#include "memdebug.h" - -#define CELL_SIZE 128 -#define DEF_COLUMNS "ifname,username,calling-sid,ip,rate-limit,type,state,uptime" - -struct column_t -{ - struct list_head entry; - const char *name; - const char *desc; - void (*print)(const struct ppp_t *ppp, char *buf); -}; - -struct col_t -{ - struct list_head entry; - struct column_t *column; - int width; -}; - -struct row_t -{ - struct list_head entry; - char *match_key; - char *order_key; - struct list_head cell_list; -}; - -struct cell_t -{ - struct list_head entry; - struct col_t *col; - char buf[CELL_SIZE + 1]; -}; - -static LIST_HEAD(col_list); - -void __export cli_show_ses_register(const char *name, const char *desc, void (*print)(const struct ppp_t *ppp, char *buf)) -{ - struct column_t *c = malloc(sizeof(*c)); - c->name = name; - c->desc = desc; - c->print = print; - list_add_tail(&c->entry, &col_list); -} - -static void show_ses_help(char * const *f, int f_cnt, void *cli) -{ - struct column_t *col; - char buf[129]; - - cli_send(cli, "show sessions [columns] [order <column>] [match <column> <regexp>] - shows sessions\r\n"); - cli_send(cli, "\tcolumns:\r\n"); - - list_for_each_entry(col, &col_list, entry) { - snprintf(buf, 128, "\t\t%s - %s\r\n", col->name, col->desc); - cli_send(cli, buf); - } -} - -static struct column_t *find_column(const char *name) -{ - struct column_t *col; - - list_for_each_entry(col, &col_list, entry) { - if (strcmp(col->name, name)) - continue; - return col; - } - - return NULL; -} - -static void free_row(struct row_t *row) -{ - struct cell_t *cell; - - while (!list_empty(&row->cell_list)) { - cell = list_entry(row->cell_list.next, typeof(*cell), entry); - list_del(&cell->entry); - _free(cell); - } - - _free(row); -} - -static void insert_row(struct list_head *list, struct row_t *row) -{ - struct row_t *row2, *row3; - - row3 = NULL; - list_for_each_entry(row2, list, entry) { - if (strcmp(row->order_key, row2->order_key) <= 0) { - row3 = row2; - break; - } - } - if (row3) - list_add_tail(&row->entry, &row3->entry); - else - list_add_tail(&row->entry, list); -} - -static int show_ses_exec(const char *cmd, char * const *f, int f_cnt, void *cli) -{ - char *columns = NULL; - struct column_t *match_key = NULL; - char *match_pattern = NULL; - struct column_t *order_key = NULL; - pcre *re = NULL; - const char *pcre_err; - int pcre_offset; - struct column_t *column; - struct col_t *col; - struct row_t *row; - struct cell_t *cell; - char *ptr1, *ptr2; - int i, n, total_width, def_columns = 0; - struct ppp_t *ppp; - char *buf = NULL; - LIST_HEAD(c_list); - LIST_HEAD(r_list); - LIST_HEAD(t_list); - - for (i = 2; i < f_cnt; i++) { - if (!strcmp(f[i], "order")) { - if (i == f_cnt - 1) - return CLI_CMD_SYNTAX; - order_key = find_column(f[++i]); - if (!order_key) { - cli_sendv(cli, "unknown column %s\r\n", f[i]); - return CLI_CMD_OK; - } - } else if (!strcmp(f[i], "match")) { - if (i == f_cnt - 2) - return CLI_CMD_SYNTAX; - match_key = find_column(f[++i]); - if (!match_key) { - cli_sendv(cli, "unknown column %s\r\n", f[i]); - return CLI_CMD_OK; - } - match_pattern = f[++i]; - } else if (!columns) - columns = f[i]; - else - return CLI_CMD_SYNTAX; - } - - if (match_key) { - re = pcre_compile2(match_pattern, 0, NULL, &pcre_err, &pcre_offset, NULL); - if (!re) { - cli_sendv(cli, "match: %s at %i\r\n", pcre_err, pcre_offset); - return CLI_CMD_OK; - } - } - - if (!columns) { - columns = DEF_COLUMNS; - def_columns = 1; - } - - columns = _strdup(columns); - ptr1 = columns; - while (1) { - ptr2 = strchr(ptr1, ','); - if (ptr2) - *ptr2 = 0; - column = find_column(ptr1); - if (column) { - col = _malloc(sizeof(*col)); - col->column = column; - col->width = strlen(column->name); - list_add_tail(&col->entry, &c_list); - } else { - if (!def_columns) { - cli_sendv(cli, "unknown column %s\r\n", ptr1); - _free(columns); - goto out; - } - } - if (!ptr2) - break; - ptr1 = ptr2 + 1; - } - _free(columns); - - pthread_rwlock_rdlock(&ppp_lock); - list_for_each_entry(ppp, &ppp_list, entry) { - row = _malloc(sizeof(*row)); - if (!row) - goto oom; - memset(row, 0, sizeof(*row)); - INIT_LIST_HEAD(&row->cell_list); - if (match_key || order_key) - list_add_tail(&row->entry, &t_list); - else - list_add_tail(&row->entry, &r_list); - list_for_each_entry(col, &c_list, entry) { - cell = _malloc(sizeof(*cell)); - if (!cell) - goto oom; - cell->col = col; - list_add_tail(&cell->entry, &row->cell_list); - col->column->print(ppp, cell->buf); - n = strlen(cell->buf); - if (n > col->width) - col->width = n; - if (col->column == order_key) - row->order_key = cell->buf; - if (col->column == match_key) - row->match_key = cell->buf; - } - } - pthread_rwlock_unlock(&ppp_lock); - - if (order_key || match_key) { - while(!list_empty(&t_list)) { - row = list_entry(t_list.next, typeof(*row), entry); - list_del(&row->entry); - if (match_key) { - if (pcre_exec(re, NULL, row->match_key, strlen(row->match_key), 0, 0, NULL, 0) < 0) { - free_row(row); - continue; - } - } - if (order_key) - insert_row(&r_list, row); - else - list_add_tail(&row->entry, &r_list); - } - } - - total_width = -1; - list_for_each_entry(col, &c_list, entry) - total_width += col->width + 3; - - buf = _malloc(total_width + 3); - if (!buf) - goto oom; - - ptr1 = buf; - list_for_each_entry(col, &c_list, entry) { - n = strlen(col->column->name); - if (col->width > n + 1) { - ptr2 = ptr1; - memset(ptr1, ' ', col->width/2 - n/2 + 1); - ptr1 += col->width/2 - n/2 + 1; - sprintf(ptr1, "%s", col->column->name); - ptr1 = strchr(ptr1, 0); - memset(ptr1, ' ', col->width + 2 - (ptr1 - ptr2)); - ptr1 += col->width + 2 - (ptr1 - ptr2); - *ptr1 = '|'; - ptr1++; - } else if (col->width > n) { - sprintf(ptr1, " %s |", col->column->name); - ptr1 = strchr(ptr1, 0); - } else { - sprintf(ptr1, " %s |", col->column->name); - ptr1 = strchr(ptr1, 0); - } - } - - strcpy(ptr1 - 1, "\r\n"); - cli_send(cli, buf); - - ptr1 = buf; - list_for_each_entry(col, &c_list, entry) { - memset(ptr1, '-', col->width + 2); - ptr1 += col->width + 2; - *ptr1 = '+'; - ptr1++; - } - - strcpy(ptr1 - 1, "\r\n"); - cli_send(cli, buf); - - while (!list_empty(&r_list)) { - row = list_entry(r_list.next, typeof(*row), entry); - ptr1 = buf; - list_for_each_entry(cell, &row->cell_list, entry) { - ptr2 = ptr1; - sprintf(ptr1, " %s ", cell->buf); - ptr1 = strchr(ptr1, 0); - n = ptr1 - ptr2; - if (n - 2 < cell->col->width) { - memset(ptr1, ' ', cell->col->width + 2 - (ptr1 - ptr2)); - ptr1 += cell->col->width + 2 - (ptr1 - ptr2); - } - *ptr1 = '|'; - ptr1++; - } - strcpy(ptr1 - 1, "\r\n"); - cli_send(cli, buf); - list_del(&row->entry); - free_row(row); - } - - _free(buf); - -out: - while (!list_empty(&c_list)) { - col = list_entry(c_list.next, typeof(*col), entry); - list_del(&col->entry); - _free(col); - } - - if (re) - pcre_free(re); - - return CLI_CMD_OK; - -oom: - if (buf) - _free(buf); - - while (!list_empty(&t_list)) { - row = list_entry(t_list.next, typeof(*row), entry); - list_del(&row->entry); - free_row(row); - } - cli_send(cli, "out of memory"); - goto out; -} - -static void print_ifname(const struct ppp_t *ppp, char *buf) -{ - snprintf(buf, CELL_SIZE, "%s", ppp->ifname); -} - -static void print_username(const struct ppp_t *ppp, char *buf) -{ - if (ppp->username) - snprintf(buf, CELL_SIZE, "%s", ppp->username); -} - -static void print_ip(const struct ppp_t *ppp, char *buf) -{ - char str[17]; - u_inet_ntoa(ppp->peer_ipaddr, str); - sprintf(buf, "%s", str); -} - -static void print_type(const struct ppp_t *ppp, char *buf) -{ - snprintf(buf, CELL_SIZE, "%s", ppp->ctrl->name); -} - -static void print_state(const struct ppp_t *ppp, char *buf) -{ - char *state; - switch (ppp->state) { - case PPP_STATE_STARTING: - state = "start"; - break; - case PPP_STATE_ACTIVE: - state = "active"; - break; - case PPP_STATE_FINISHING: - state = "finish"; - break; - default: - state = "unk"; - } - sprintf(buf, "%s", state); -} - -static void print_uptime(const struct ppp_t *ppp, char *buf) -{ - time_t uptime; - int day,hour,min,sec; - char time_str[14]; - - 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) - snprintf(time_str, 13, "%i.%02i:%02i:%02i", day, hour, min, sec); - else - snprintf(time_str, 13, "%02i:%02i:%02i", hour, min, sec); - - sprintf(buf, "%s", time_str); -} - -static void print_calling_sid(const struct ppp_t *ppp, char *buf) -{ - snprintf(buf, CELL_SIZE, "%s", ppp->ctrl->calling_station_id); -} - -static void print_called_sid(const struct ppp_t *ppp, char *buf) -{ - snprintf(buf, CELL_SIZE, "%s", ppp->ctrl->called_station_id); -} - -static void print_sid(const struct ppp_t *ppp, char *buf) -{ - snprintf(buf, CELL_SIZE, "%s", ppp->sessionid); -} - -void __init init(void) -{ - cli_register_simple_cmd2(show_ses_exec, show_ses_help, 2, "show", "sessions"); - - cli_show_ses_register("ifname", "interface name", print_ifname); - cli_show_ses_register("username", "user name", print_username); - cli_show_ses_register("ip", "IP address", print_ip); - cli_show_ses_register("type", "VPN type", print_type); - cli_show_ses_register("state", "state of session", print_state); - cli_show_ses_register("uptime", "uptime", print_uptime); - cli_show_ses_register("calling-sid", "calling station id", print_calling_sid); - cli_show_ses_register("called-sid", "called station id", print_called_sid); - cli_show_ses_register("sid", "session id", print_sid); -} - |