5 #include "../core/hooks.h"
6 #include "../core/config.h"
7 #include "../core/error.h"
8 #include "../lib/sha1.h"
9 #include "../lib/hmac.h"
10 #include "../xsb/xsb.h"
11 #include "../control/control.h"
14 static void broadcast(SHA1_CTX
*c
, unsigned int replicationid
, unsigned int lineno
, char *command
, char *format
, ...) {
15 char buf
[512], buf2
[600];
20 vsnprintf(buf
, sizeof(buf
), format
, va
);
23 len
= snprintf(buf2
, sizeof(buf2
), "%u %u %s", replicationid
, lineno
, buf
);
24 xsb_broadcast(command
, NULL
, "%s", buf2
);
26 if(len
> (sizeof(buf2
) - 1))
27 len
= sizeof(buf2
) - 1;
33 SHA1Update(c
, (unsigned char *)buf2
, len
+ 1);
36 static void replicate(int forced
) {
38 unsigned int lineno
, lines
;
39 unsigned char digest
[SHA1_DIGESTSIZE
];
40 char digestbuf
[SHA1_DIGESTSIZE
*2+1];
41 static unsigned int replicationid
= 0;
45 if(++replicationid
> 10000)
48 for(lines
=2,tg
=tglist
;tg
;tg
=tg
->next
) {
50 for(th
=tg
->hosts
;th
;th
=th
->next
)
56 broadcast(&s
, replicationid
, lineno
++, "trinit", "%d %u", forced
, lines
);
58 for(tg
=tglist
;tg
;tg
=tg
->next
) {
59 broadcast(&s
, replicationid
, lineno
++, "trdata", "G %s", dumptg(tg
, 0));
61 for(th
=tg
->hosts
;th
;th
=th
->next
)
62 broadcast(&s
, replicationid
, lineno
++, "trdata", "H %s", dumpth(th
, 0));
65 SHA1Final(digest
, &s
);
66 xsb_broadcast("trfini", NULL
, "%u %u %s", replicationid
, lineno
, hmac_printhex(digest
, digestbuf
, SHA1_DIGESTSIZE
));
69 static int xsb_tr_requeststart(void *source
, int argc
, char **argv
) {
70 static time_t last
= 0;
71 time_t t
= time(NULL
);
82 static void groupadded(int hooknum
, void *arg
) {
85 xsb_broadcast("traddgroup", NULL
, "%s", dumptg(tg
, 0));
88 static void groupremoved(int hooknum
, void *arg
) {
91 xsb_broadcast("trdelgroup", NULL
, "%u", tg
->id
);
94 static void hostadded(int hooknum
, void *arg
) {
97 xsb_broadcast("traddhost", NULL
, "%s", dumpth(th
, 0));
100 static void hostremoved(int hooknum
, void *arg
) {
103 xsb_broadcast("trdelhost", NULL
, "%u", th
->id
);
106 static void groupmodified(int hooknum
, void *arg
) {
107 trustgroup
*tg
= arg
;
109 xsb_broadcast("trmodifygroup", NULL
, "%s", dumptg(tg
, 0));
112 static int trusts_cmdtrustforceresync(void *source
, int argc
, char **argv
) {
115 controlreply(np
, "Resync in progress. . .");
117 controlreply(np
, "Resync complete.");
122 static int commandsregistered
, loaded
;
123 static void __dbloaded(int hooknum
, void *arg
) {
124 if(commandsregistered
)
127 commandsregistered
= 1;
129 xsb_addcommand("trrequeststart", 0, xsb_tr_requeststart
);
131 registerhook(HOOK_TRUSTS_ADDGROUP
, groupadded
);
132 registerhook(HOOK_TRUSTS_DELGROUP
, groupremoved
);
133 registerhook(HOOK_TRUSTS_ADDHOST
, hostadded
);
134 registerhook(HOOK_TRUSTS_DELGROUP
, hostremoved
);
135 registerhook(HOOK_TRUSTS_MODIFYGROUP
, groupmodified
);
137 /* we've just reloaded */
138 /* if we're not online, no problem, other nodes will ask us individually */
139 if(trusts_fullyonline())
142 registercontrolhelpcmd("trustforceresync", NO_DEVELOPER
, 0, trusts_cmdtrustforceresync
, "Usage: trustforceresync");
145 static void __dbclosed(int hooknum
, void *arg
) {
146 if(!commandsregistered
)
148 commandsregistered
= 0;
150 xsb_delcommand("trrequeststart", xsb_tr_requeststart
);
152 registerhook(HOOK_TRUSTS_ADDGROUP
, groupadded
);
153 registerhook(HOOK_TRUSTS_DELGROUP
, groupremoved
);
154 registerhook(HOOK_TRUSTS_ADDHOST
, hostadded
);
155 registerhook(HOOK_TRUSTS_DELGROUP
, hostremoved
);
156 registerhook(HOOK_TRUSTS_MODIFYGROUP
, groupmodified
);
158 deregistercontrolcmd("trustforceresync", trusts_cmdtrustforceresync
);
164 m
= getconfigitem("trusts", "master");
165 if(!m
|| (atoi(m
->content
) != 1)) {
166 Error("trusts_master", ERR_ERROR
, "Not a master server, not loaded.");
172 registerhook(HOOK_TRUSTS_DB_LOADED
, __dbloaded
);
173 registerhook(HOOK_TRUSTS_DB_CLOSED
, __dbclosed
);
176 /* this will force a sync if we're online */
177 /* if we're not we'll be asked to sync when we come online */
181 Error("trusts_master", ERR_ERROR
, "Unable to load database.");
183 /* do nothing else, other servers will ask us when we come online */
184 /* also the __dbloaded hook will be triggered */
192 deregisterhook(HOOK_TRUSTS_DB_LOADED
, __dbloaded
);
193 deregisterhook(HOOK_TRUSTS_DB_CLOSED
, __dbclosed
);