]> jfr.im git - irc/quakenet/newserv.git/blob - trusts/trusts_migration.c
73ec6886331c57ea97a38918da63a5b0f49fde52
[irc/quakenet/newserv.git] / trusts / trusts_migration.c
1 #include "../control/control.h"
2 #include "../lib/irc_string.h"
3 #include "../core/config.h"
4 #include "trusts.h"
5
6 int trusts_migration_start(TrustDBMigrationCallback, void *);
7 void trusts_migration_stop(void);
8 static void registercommands(int, void *);
9 static void deregistercommands(int, void *);
10
11 static void migrate_status(int errcode, void *tag) {
12 long sender = (long)tag;
13 nick *np = getnickbynumeric(sender);
14
15 if(!np)
16 return;
17
18 if(!errcode || errcode == MIGRATION_LASTERROR) {
19 if(!errcode) {
20 controlreply(np, "Migration complete.");
21 controlreply(np, "Attempting to reload database. . .");
22 } else {
23 controlreply(np, "An error occured after the database was unloaded, attempting reload. . .");
24 }
25 if(trusts_loaddb()) {
26 controlreply(np, "Database reloaded successfully.");
27 } else {
28 controlreply(np, "An error occured, please reload the module manually.");
29 }
30 } else {
31 controlreply(np, "Error %d occured during migration, commands reregistered.", errcode);
32 registercommands(0, NULL);
33 }
34 }
35
36 static int trusts_cmdmigrate(void *source, int cargc, char **cargv) {
37 nick *sender = source;
38 int ret;
39
40 /* iffy but temporary */
41 ret = trusts_migration_start(migrate_status, (void *)(sender->numeric));
42 if(!ret) {
43 controlreply(sender, "Migration started, commands deregistered.");
44 deregistercommands(0, NULL);
45 } else {
46 controlreply(sender, "Error %d starting migration.", ret);
47 }
48
49 return CMD_OK;
50 }
51
52 static int commandsregistered;
53
54 static void registercommands(int hooknum, void *arg) {
55 if(commandsregistered)
56 return;
57 commandsregistered = 1;
58
59 registercontrolhelpcmd("trustmigrate", NO_DEVELOPER, 0, trusts_cmdmigrate, "Usage: trustmigrate\nCopies trust data from O and reloads the database.");
60 }
61
62 static void deregistercommands(int hooknum, void *arg) {
63 if(!commandsregistered)
64 return;
65 commandsregistered = 0;
66
67 deregistercontrolcmd("trustmigrate", trusts_cmdmigrate);
68 }
69
70 static int loaded = 0;
71 void _init(void) {
72 sstring *m;
73
74 m = getconfigitem("trusts", "master");
75 if(!m || (atoi(m->content) != 1)) {
76 Error("trusts_migrationr", ERR_ERROR, "Not a master server, not loaded.");
77 return;
78 }
79
80 loaded = 1;
81
82 registerhook(HOOK_TRUSTS_DB_LOADED, registercommands);
83 registerhook(HOOK_TRUSTS_DB_CLOSED, deregistercommands);
84
85 if(trustsdbloaded)
86 registercommands(0, NULL);
87 }
88
89 void _fini(void) {
90 if(!loaded)
91 return;
92
93 deregisterhook(HOOK_TRUSTS_DB_LOADED, registercommands);
94 deregisterhook(HOOK_TRUSTS_DB_CLOSED, deregistercommands);
95
96 trusts_migration_stop();
97
98 deregistercommands(0, NULL);
99 }