-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsessionctl.c
More file actions
72 lines (56 loc) · 1.59 KB
/
Copy pathsessionctl.c
File metadata and controls
72 lines (56 loc) · 1.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <string.h>
#include "l2tpns.h"
#include "plugin.h"
#include "control.h"
/* session control */
int plugin_api_version = PLUGIN_API_VERSION;
static struct pluginfuncs *f = 0;
char *plugin_control_help[] = {
" drop USER|SID [REASON] Shutdown user session",
" kill USER|SID [REASON] Kill user session",
0
};
int plugin_control(struct param_control *data)
{
sessionidt session;
sessiont *s = 0;
char *end;
char *reason;
if (data->argc < 1)
return PLUGIN_RET_OK;
if (strcmp(data->argv[0], "drop") && strcmp(data->argv[0], "kill"))
return PLUGIN_RET_OK; // not for us
if (!data->iam_master)
return PLUGIN_RET_NOTMASTER;
if (data->argc < 2 || data->argc > 3)
{
data->response = NSCTL_RES_ERR;
data->additional = "requires username or session id and optional reason";
return PLUGIN_RET_STOP;
}
if (!(session = strtol(data->argv[1], &end, 10)) || *end)
session = f->get_session_by_username(data->argv[1]);
if (session)
s = f->get_session_by_id(session);
if (!s || !s->ip)
{
data->response = NSCTL_RES_ERR;
data->additional = "session not found";
return PLUGIN_RET_STOP;
}
if (data->argc > 2)
reason = data->argv[2];
else
reason = "Requested by administrator.";
if (data->argv[0][0] == 'd')
f->sessionshutdown(session, reason, CDN_ADMIN_DISC, TERM_ADMIN_RESET);
else
f->sessionkill(session, reason);
data->response = NSCTL_RES_OK;
data->additional = 0;
return PLUGIN_RET_STOP;
}
int plugin_init(struct pluginfuncs *funcs)
{
return ((f = funcs)) ? 1 : 0;
}