]> jfr.im git - irc/quakenet/newserv.git/blame - trusts/trusts_commands.c
No longer allow db reloading on the fly.
[irc/quakenet/newserv.git] / trusts / trusts_commands.c
CommitLineData
be2823bc 1#include "../control/control.h"
2d4ba67d 2#include "../lib/irc_string.h"
be2823bc
CP
3#include "trusts.h"
4
5int trusts_migration_start(TrustDBMigrationCallback, void *);
6void trusts_migration_stop(void);
7static void registercommands(void);
8static void deregistercommands(void);
9
be2823bc
CP
10static void migrate_status(int errcode, void *tag) {
11 long sender = (long)tag;
12 nick *np = getnickbynumeric(sender);
13
14 if(!np)
15 return;
16
17 if(!errcode) {
bf5b66e5 18 controlreply(np, "Migration complete, you must reload the module.");
be2823bc 19 } else {
bf5b66e5 20 controlreply(np, "Error %d occured during migration, commands reregistered.", errcode);
be2823bc
CP
21 registercommands();
22 }
23}
24
25static int trusts_cmdmigrate(void *source, int cargc, char **cargv) {
26 nick *sender = source;
27 int ret;
28
29 /* iffy but temporary */
30 ret = trusts_migration_start(migrate_status, (void *)(sender->numeric));
31 if(!ret) {
bf5b66e5 32 controlreply(sender, "Migration started, commands deregistered.");
be2823bc
CP
33 deregistercommands();
34 } else {
35 controlreply(sender, "Error %d starting migration.", ret);
36 }
37
38 return CMD_OK;
39}
40
2d4ba67d
CP
41static trustgroup *tg_strtotg(char *name) {
42 unsigned long id;
43 trustgroup *tg;
44
45 /* legacy format */
46 if(name[0] == '#') {
47 id = strtoul(&name[1], NULL, 10);
48 if(id == ULONG_MAX)
49 return NULL;
50
51 for(tg=tglist;tg;tg=tg->next)
52 if(tg->id == id)
53 return tg;
54 }
55
56 for(tg=tglist;tg;tg=tg->next)
57 if(tg->name && !match(name, tg->name->content))
58 return tg;
59
60 id = strtoul(name, NULL, 10);
61 if(id == ULONG_MAX)
62 return NULL;
63
64 /* legacy format */
65 for(tg=tglist;tg;tg=tg->next)
66 if(tg->id == id)
67 return tg;
68
69 return NULL;
70}
71
72static int trusts_cmdtrustlist(void *source, int cargc, char **cargv) {
73 nick *sender = source;
74 trustgroup *tg;
75 trusthost *th;
76 time_t t;
77
78 if(cargc < 1)
79 return CMD_USAGE;
80
81 tg = tg_strtotg(cargv[0]);
82 if(!tg) {
83 controlreply(sender, "Couldn't find a trustgroup with that id.");
84 return CMD_ERROR;
85 }
86
87 t = time(NULL);
88
89 controlreply(sender, "Name: : %s", tg->name?tg->name->content:"(unknown)");
90 controlreply(sender, "Trusted for : %d", tg->trustedfor);
1bbe1ac3 91 controlreply(sender, "Currently using : %d", tg->count);
2d4ba67d
CP
92 controlreply(sender, "Clients per user : %d (%senforcing ident)", tg->maxperident, tg->mode?"":"not ");
93 controlreply(sender, "Contact: : %s", tg->contact?tg->contact->content:"(unknown)");
94 controlreply(sender, "Expires in : %s", (tg->expires>t)?longtoduration(tg->expires - t, 2):"(in the past)");
95 controlreply(sender, "Last changed by : %s", tg->createdby?tg->createdby->content:"(unknown)");
96 controlreply(sender, "Comment: : %s", tg->comment?tg->comment->content:"(unknown)");
97 controlreply(sender, "ID: : %u", tg->id);
98 controlreply(sender, "Last used : %s", (tg->lastseen==t)?"(now)":trusts_timetostr(tg->lastseen));
99 controlreply(sender, "Max usage : %d", tg->maxseen);
100 controlreply(sender, "Last max reset : %s", tg->lastmaxuserreset?trusts_timetostr(tg->lastmaxuserreset):"(never)");
101
1bbe1ac3 102 controlreply(sender, "Host Current Max Last seen");
2d4ba67d
CP
103
104 for(th=tg->hosts;th;th=th->next)
1bbe1ac3 105 controlreply(sender, " %-20s %-10d %-10d %s", trusts_cidr2str(th->ip, th->mask), th->count, th->maxseen, (th->lastseen==t)?"(now)":trusts_timetostr(th->lastseen));
2d4ba67d
CP
106
107 controlreply(sender, "End of list.");
108
109 return CMD_OK;
110}
111
be2823bc
CP
112static void dbloaded(int hooknum, void *arg) {
113 registercommands();
114}
115
116void _init(void) {
117 registerhook(HOOK_TRUSTS_DB_LOADED, dbloaded);
118
119 if(trustsdbloaded)
120 registercommands();
121}
122
123void _fini(void) {
124 deregisterhook(HOOK_TRUSTS_DB_LOADED, dbloaded);
125 deregistercommands();
126
127 trusts_migration_stop();
128}
129
130static void registercommands(void) {
be2823bc 131 registercontrolhelpcmd("trustmigrate", NO_OPER, 0, trusts_cmdmigrate, "Usage: trustmigrate\nCopies trust data from O and reloads the database.");
2d4ba67d 132 registercontrolhelpcmd("trustlist", NO_OPER, 1, trusts_cmdtrustlist, "Usage: trustlist <#id|name|id>\nShows trust data for the specified trust group.");
be2823bc
CP
133}
134
135static void deregistercommands(void) {
bf5b66e5 136 if(!trustsdbloaded)
be2823bc
CP
137 return;
138
139 deregistercontrolcmd("trustmigrate", trusts_cmdmigrate);
2d4ba67d 140 deregistercontrolcmd("trustlist", trusts_cmdtrustlist);
be2823bc 141}