]>
jfr.im git - irc/quakenet/newserv.git/blob - graphing/graphing.c
4 #include "../core/hooks.h"
5 #include "../core/config.h"
6 #include "../usercount/usercount.h"
7 #include "../lib/sstring.h"
8 #include "../core/schedule.h"
9 #include "../core/error.h"
10 #include "../lib/sha1.h"
11 #include "../lib/hmac.h"
15 static void gr_newserver(int hook
, void *arg
);
16 static void gr_lostserver(int hook
, void *arg
);
17 static void tick(void *arg
);
18 static void openserver(int servernum
);
19 static void closeserver(int servernum
);
21 fsample_m
*servergraphs
[MAXSERVERS
];
29 memset(servergraphs
, 0, sizeof(servergraphs
));
31 path
= getcopyconfigitem("graphing", "path", "", 100);
32 if(!path
|| !path
->content
|| !path
->content
[0]) {
33 Error("graphing", ERR_WARNING
, "Path not set, not loaded.");
37 for(i
=0;i
<MAXSERVERS
;i
++)
40 registerhook(HOOK_SERVER_NEWSERVER
, gr_newserver
);
41 registerhook(HOOK_SERVER_LOSTSERVER
, gr_lostserver
);
43 sched
= schedulerecurring(time(NULL
), 0, 1, tick
, NULL
);
49 deleteschedule(sched
, tick
, NULL
);
51 for(i
=0;i
<MAXSERVERS
;i
++)
52 if(servermonitored(i
))
57 deregisterhook(HOOK_SERVER_NEWSERVER
, gr_newserver
);
58 deregisterhook(HOOK_SERVER_LOSTSERVER
, gr_lostserver
);
61 int servermonitored(int servernum
) {
62 return servergraphs
[servernum
] != NULL
;
65 static char *appendsuffix(char *prefix
, char *suffix
) {
66 static char buf
[1024];
68 snprintf(buf
, sizeof(buf
), "%s%s", prefix
, suffix
);
73 static void openserver(int servernum
) {
74 unsigned char digest
[SHA1_DIGESTSIZE
];
75 char filename
[512], hexdigest
[sizeof(digest
)*2 + 1];
80 if(servermonitored(servernum
))
83 if(serverlist
[servernum
].linkstate
== LS_INVALID
)
87 SHA1Update(&sha
, (unsigned char *)serverlist
[servernum
].name
->content
, serverlist
[servernum
].name
->length
);
88 SHA1Final(digest
, &sha
);
90 snprintf(filename
, sizeof(filename
), "%s/%s", path
->content
, hmac_printhex(digest
, hexdigest
, sizeof(digest
)));
92 f
= fopen(appendsuffix(filename
, ".name"), "w");
94 Error("graphing", ERR_WARNING
, "Unable to create name file for %s (%s.name)", serverlist
[servernum
].name
->content
, filename
);
98 fprintf(f
, "%s\n", serverlist
[servernum
].name
->content
);
109 m
= fsopen_m(GRAPHING_DATASETS
, appendsuffix(filename
, ".0"), SAMPLES
, (CoreHandlerAddFn
)registercorehandler
, (CoreHandlerDelFn
)deregistercorehandler
);
111 Error("graphing", ERR_WARNING
, "Unable to create main backing store for %s (%s.0)", serverlist
[servernum
].name
->content
, filename
);
115 if(!fsadd_m(m, appendsuffix(filename, ".1"), PERMINUTE, fsapmean, (void *)PERMINUTE) ||
116 !fsadd_m(m, appendsuffix(filename, ".2"), PERMINUTE * 24, fsapmean, (void *)(PERMINUTE * 24)) ||
117 !fsadd_m(m, appendsuffix(filename, ".3"), PERMINUTE * 24 * 7, fsapmean, (void *)(PERMINUTE * 24 * 7)) ||
118 !fsadd_m(m, appendsuffix(filename, ".4"), PERMINUTE * 24 * 7 * 4, fsapmean, (void *)(PERMINUTE * 24 * 7 * 4)) ||
119 !fsadd_m(m, appendsuffix(filename, ".5"), PERMINUTE * 24 * 7 * 4 * 12, fsapmean, (void *)(PERMINUTE * 24 * 7 * 4 * 12)))
121 Error("graphing", ERR_WARNING, "Unable to create main side store for %s (%s.X)", serverlist[servernum].name->content, filename);
126 servergraphs
[servernum
] = m
;
129 static void closeserver(int servernum
) {
130 if(!servermonitored(servernum
))
133 fsclose_m(servergraphs
[servernum
]);
134 servergraphs
[servernum
] = NULL
;
137 static void gr_newserver(int hook
, void *arg
) {
138 long num
= (long)arg
;
143 static void gr_lostserver(int hook
, void *arg
) {
144 long num
= (long)arg
;
149 static void tick(void *arg
) {
150 time_t t
= time(NULL
);
153 if(t
% GRAPHING_RESOLUTION
!= 0)
156 for(i
=0;i
<MAXSERVERS
;i
++)
157 if(servermonitored(i
))
158 fsset_m(servergraphs
[i
], t
/ GRAPHING_RESOLUTION
, servercount
[i
]);