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