]>
Commit | Line | Data |
---|---|---|
be2823bc | 1 | #include "../control/control.h" |
2d4ba67d | 2 | #include "../lib/irc_string.h" |
be2823bc CP |
3 | #include "trusts.h" |
4 | ||
5 | int trusts_migration_start(TrustDBMigrationCallback, void *); | |
6 | void trusts_migration_stop(void); | |
7 | static void registercommands(void); | |
8 | static void deregistercommands(void); | |
9 | ||
be2823bc CP |
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) { | |
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 | ||
25 | static 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 |
41 | static 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 | ||
72 | static 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); | |
4be1aaf2 CP |
98 | controlreply(sender, "Last used : %s", (tg->count>0)?"(now)":trusts_timetostr(tg->lastseen)); |
99 | controlreply(sender, "Max usage : %d", tg->maxusage); | |
2d4ba67d CP |
100 | controlreply(sender, "Last max reset : %s", tg->lastmaxuserreset?trusts_timetostr(tg->lastmaxuserreset):"(never)"); |
101 | ||
4be1aaf2 | 102 | controlreply(sender, "Host Current Max Last seen"); |
2d4ba67d CP |
103 | |
104 | for(th=tg->hosts;th;th=th->next) | |
4be1aaf2 | 105 | controlreply(sender, " %-20s %-10d %-10d %s", trusts_cidr2str(th->ip, th->mask), th->count, th->maxusage, (th->count>0)?"(now)":trusts_timetostr(th->lastseen)); |
2d4ba67d CP |
106 | |
107 | controlreply(sender, "End of list."); | |
108 | ||
109 | return CMD_OK; | |
110 | } | |
111 | ||
be2823bc CP |
112 | static void dbloaded(int hooknum, void *arg) { |
113 | registercommands(); | |
114 | } | |
115 | ||
116 | void _init(void) { | |
117 | registerhook(HOOK_TRUSTS_DB_LOADED, dbloaded); | |
118 | ||
119 | if(trustsdbloaded) | |
120 | registercommands(); | |
121 | } | |
122 | ||
123 | void _fini(void) { | |
124 | deregisterhook(HOOK_TRUSTS_DB_LOADED, dbloaded); | |
125 | deregistercommands(); | |
126 | ||
127 | trusts_migration_stop(); | |
128 | } | |
129 | ||
130 | static 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 | ||
135 | static 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 | } |