// vim: sw=4 ts=8
char const *cvs_name = "$Name: $";
-char const *cvs_id_cli = "$Id: cli.c,v 1.7 2004/07/02 07:30:43 bodea Exp $";
+char const *cvs_id_cli = "$Id: cli.c,v 1.10 2004/07/11 07:57:33 bodea Exp $";
#include <stdio.h>
#include <stdarg.h>
extern struct Tstats *_statistics;
struct cli_def *cli = NULL;
int cli_quit = 0;
-extern int clifd, udpfd, tapfd, snoopfd, ifrfd, cluster_sockfd;
+extern int clifd, udpfd, tunfd, snoopfd, ifrfd, cluster_sockfd;
extern int *radfds;
-extern sessionidt *cli_session_kill;
-extern tunnelidt *cli_tunnel_kill;
extern struct configt *config;
extern struct config_descriptt config_values[];
#ifdef RINGBUFFER
extern struct Tringbuffer *ringbuffer;
#endif
+extern struct cli_session_actions *cli_session_actions;
+extern struct cli_tunnel_actions *cli_tunnel_actions;
char *debug_levels[] = {
"CRIT",
int cmd_uptime(struct cli_def *cli, char *command, char **argv, int argc);
int regular_stuff(struct cli_def *cli);
-void init_cli()
+void init_cli(char *hostname)
{
FILE *f;
char buf[4096];
struct sockaddr_in addr;
cli = cli_init();
- cli_set_hostname(cli, "l2tpns");
+ if (hostname && *hostname)
+ cli_set_hostname(cli, hostname);
+ else
+ cli_set_hostname(cli, "l2tpns");
c = cli_register_command(cli, NULL, "show", NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, NULL);
cli_register_command(cli, c, "banana", cmd_show_banana, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, "Show a banana");
// Close sockets
if (udpfd) close(udpfd); udpfd = 0;
- if (tapfd) close(tapfd); tapfd = 0;
+ if (tunfd) close(tunfd); tunfd = 0;
if (snoopfd) close(snoopfd); snoopfd = 0;
for (i = 0; i < config->num_radfds; i++)
if (radfds[i]) close(radfds[i]);
memset(&debug_flags, 0, sizeof(debug_flags));
debug_flags.critical = 1;
- {
- char prompt[1005];
- snprintf(prompt, 1005, "l2tpns> ");
- cli_loop(cli, sockfd, prompt);
- }
+ cli_loop(cli, sockfd);
close(sockfd);
log(3, 0, 0, 0, "Closed CLI connection\n");
int cmd_show_session(struct cli_def *cli, char *command, char **argv, int argc)
{
int i;
- time_t time_now;
if (CLI_HELP_REQUESTED)
return cli_arg_help(cli, 1,
int cmd_show_tunnels(struct cli_def *cli, char *command, char **argv, int argc)
{
int i, x, show_all = 0;
- time_t time_now;
char *states[] = {
"Free",
"Open",
}
// Show tunnel summary
- cli_print(cli, "%s %s %s %s %s",
+ cli_print(cli, "%4s %20s %20s %6s %s",
"TID",
"Hostname",
"IP",
if (!show_all && (!tunnel[i].ip || tunnel[i].die || !tunnel[i].hostname[0])) continue;
for (x = 0; x < MAXSESSION; x++) if (session[x].tunnel == i && session[x].opened && !session[x].die) sessions++;
- cli_print(cli, "%d %s %s %s %d",
+ cli_print(cli, "%4d %20s %20s %6s %6d",
i,
*tunnel[i].hostname ? tunnel[i].hostname : "(null)",
inet_toa(htonl(tunnel[i].ip)),
cli_print(cli, "%-10s %-8s %-10s %-8s", "Ethernet", "Bytes", "Packets", "Errors");
cli_print(cli, "%-10s %8lu %8lu %8lu", "RX",
- GET_STAT(tap_rx_bytes),
- GET_STAT(tap_rx_packets),
- GET_STAT(tap_rx_errors));
+ GET_STAT(tun_rx_bytes),
+ GET_STAT(tun_rx_packets),
+ GET_STAT(tun_rx_errors));
cli_print(cli, "%-10s %8lu %8lu %8lu", "TX",
- GET_STAT(tap_tx_bytes),
- GET_STAT(tap_tx_packets),
- GET_STAT(tap_tx_errors));
+ GET_STAT(tun_tx_bytes),
+ GET_STAT(tun_tx_packets),
+ GET_STAT(tun_tx_errors));
cli_print(cli, "");
cli_print(cli, "%-10s %-8s %-10s %-8s %-8s", "Tunnel", "Bytes", "Packets", "Errors", "Retries");
cli_print(cli, "%-30s%-10s", "Counter", "Value");
cli_print(cli, "-----------------------------------------");
cli_print(cli, "%-30s%lu", "radius_retries", GET_STAT(radius_retries));
- cli_print(cli, "%-30s%lu", "arp_errors", GET_STAT(arp_errors));
- cli_print(cli, "%-30s%lu", "arp_replies", GET_STAT(arp_replies));
- cli_print(cli, "%-30s%lu", "arp_discarded", GET_STAT(arp_discarded));
cli_print(cli, "%-30s%lu", "arp_sent", GET_STAT(arp_sent));
- cli_print(cli, "%-30s%lu", "arp_recv", GET_STAT(arp_recv));
cli_print(cli, "%-30s%lu", "packets_snooped", GET_STAT(packets_snooped));
cli_print(cli, "%-30s%lu", "tunnel_created", GET_STAT(tunnel_created));
cli_print(cli, "%-30s%lu", "session_created", GET_STAT(session_created));
#ifdef STATISTICS
cli_print(cli, "\n%-30s%-10s", "Counter", "Value");
cli_print(cli, "-----------------------------------------");
- cli_print(cli, "%-30s%lu", "call_processtap", GET_STAT(call_processtap));
- cli_print(cli, "%-30s%lu", "call_processarp", GET_STAT(call_processarp));
+ cli_print(cli, "%-30s%lu", "call_processtun", GET_STAT(call_processtun));
cli_print(cli, "%-30s%lu", "call_processipout", GET_STAT(call_processipout));
cli_print(cli, "%-30s%lu", "call_processudp", GET_STAT(call_processudp));
cli_print(cli, "%-30s%lu", "call_processpap", GET_STAT(call_processpap));
{
int i;
int used = 0, free = 0, show_all = 0;
- time_t time_now;
if (!config->cluster_iam_master)
{
int cmd_show_radius(struct cli_def *cli, char *command, char **argv, int argc)
{
+ int i, free = 0, used = 0, show_all = 0;
char *states[] = {
"NULL",
"CHAP",
"STOP",
"WAIT",
};
- int i, free = 0, used = 0, show_all = 0;
- time_t time_now;
if (CLI_HELP_REQUESTED)
{
if (session[s].ip && session[s].opened && !session[s].die)
{
- int x;
-
cli_print(cli, "Dropping user %s", session[s].user);
- for (x = 0; x < MAXSESSION; x++)
- {
- if (!cli_session_kill[x])
- {
- cli_session_kill[x] = s;
- break;
- }
- }
+ cli_session_actions[s].action |= CLI_SESS_KILL;
}
}
int cmd_drop_tunnel(struct cli_def *cli, char *command, char **argv, int argc)
{
int i;
- tunnelidt tid;
+ tunnelidt t;
if (CLI_HELP_REQUESTED)
return cli_arg_help(cli, argc > 1,
for (i = 0; i < argc; i++)
{
- int x;
-
- if ((tid = atol(argv[i])) <= 0 || (tid >= MAXTUNNEL))
+ if ((t = atol(argv[i])) <= 0 || (t >= MAXTUNNEL))
{
cli_print(cli, "Invalid tunnel ID (1-%d)", MAXTUNNEL-1);
continue;
}
- if (!tunnel[tid].ip)
+ if (!tunnel[t].ip)
{
- cli_print(cli, "Tunnel %d is not connected", tid);
+ cli_print(cli, "Tunnel %d is not connected", t);
continue;
}
- if (tunnel[tid].die)
+ if (tunnel[t].die)
{
- cli_print(cli, "Tunnel %d is already being shut down", tid);
+ cli_print(cli, "Tunnel %d is already being shut down", t);
continue;
}
- for (x = 0; x < MAXTUNNEL; x++)
- {
- if (!cli_tunnel_kill[x])
- {
- cli_tunnel_kill[x] = tid;
- cli_print(cli, "Tunnel %d shut down (%s)", tid, tunnel[tid].hostname);
- break;
- }
- }
+ cli_print(cli, "Tunnel %d shut down (%s)", t, tunnel[t].hostname);
+ cli_tunnel_actions[t].action |= CLI_TUN_KILL;
}
return CLI_OK;
continue;
}
- if (session[s].opened && !session[s].die)
+ if (session[s].ip && session[s].opened && !session[s].die)
{
- int x;
- for (x = 0; x < MAXSESSION; x++)
- {
- if (!cli_session_kill[x])
- {
- cli_session_kill[x] = s;
- break;
- }
- }
cli_print(cli, "Dropping session %d", s);
+ cli_session_actions[s].action |= CLI_SESS_KILL;
}
else
{
return CLI_OK;
}
- session[s].snoop_ip = ip;
- session[s].snoop_port = port;
-
cli_print(cli, "Snooping user %s to %s:%d", argv[0], inet_toa(session[s].snoop_ip), session[s].snoop_port);
+ cli_session_actions[s].snoop_ip = ip;
+ cli_session_actions[s].snoop_port = port;
+ cli_session_actions[s].action |= CLI_SESS_SNOOP;
+
return CLI_OK;
}
cli_print(cli, "User %s is not connected", argv[i]);
continue;
}
- session[s].snoop_ip = 0;
- session[s].snoop_port = 0;
cli_print(cli, "Not snooping user %s", argv[i]);
+ cli_session_actions[s].action |= CLI_SESS_NOSNOOP;
}
return CLI_OK;
}
cli_print(cli, "User %s is not connected", argv[i]);
continue;
}
- if (!throttle_session(s, config->rl_rate))
- cli_print(cli, "Error throttling %s", argv[i]);
- else
- cli_print(cli, "Throttling user %s", argv[i]);
+
+ if (session[s].throttle)
+ {
+ cli_print(cli, "User %s already throttled", argv[i]);
+ continue;
+ }
+
+ cli_print(cli, "Throttling user %s", argv[i]);
+ cli_session_actions[s].throttle = config->rl_rate; // could be configurable at some stage
+ cli_session_actions[s].action |= CLI_SESS_THROTTLE;
}
return CLI_OK;
cli_print(cli, "User %s is not connected", argv[i]);
continue;
}
- throttle_session(s, 0);
+
+ if (!session[s].throttle)
+ {
+ cli_print(cli, "User %s not throttled", argv[i]);
+ continue;
+ }
cli_print(cli, "Unthrottling user %s", argv[i]);
+ cli_session_actions[s].action |= CLI_SESS_NOTHROTTLE;
}
return CLI_OK;
FILE *fh;
char buf[100], *p = buf, *loads[3];
int i, num_sessions = 0;
- time_t time_now;
if (CLI_HELP_REQUESTED)
return CLI_HELP_NO_ARGS;