You can subscribe to this list here.
| 2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(8) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2004 |
Jan
(3) |
Feb
(2) |
Mar
|
Apr
(1) |
May
|
Jun
(5) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Martijn <wa...@we...> - 2004-06-15 17:53:45
|
wasted 2004/06/15 09:45:54 PDT
Modified files:
src proto-p10.c
Log:
Fix TOPIC bug, add support for SVSNICK (I take no credit, nor blame for that function)
Revision Changes Path
1.2 +19 -2 wStats/src/proto-p10.c
Index: proto-p10.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/proto-p10.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- proto-p10.c 13 Dec 2003 13:36:25 -0000 1.1
+++ proto-p10.c 15 Jun 2004 16:45:53 -0000 1.2
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: proto-p10.c,v 1.1 2003/12/13 13:36:25 wasted Exp $
+ * $Id: proto-p10.c,v 1.2 2004/06/15 16:45:53 wasted Exp $
*/
#include "proto-common.c"
@@ -902,6 +902,21 @@
return 1;
}
+static CMD_FUNC(cmd_svsnick)
+{
+ struct userNode *target, *dest;
+
+ if ((argc < 4) || !(target = GetUserN(argv[1]))
+ || !IsLocal(target) || (dest = GetUserH(argv[2])))
+ {
+ return 0;
+ }
+
+ NickChange(target, argv[2], 0);
+
+ return 1;
+}
+
static CMD_FUNC(cmd_account)
{
struct userNode *user;
@@ -1079,7 +1094,7 @@
{
static struct chanNode *cn;
- if (argc < 4) return 0;
+ if (argc < 3) return 0;
if (!(cn = GetChannel(argv[1]))) {
log_module(MAIN_LOG, LOG_ERROR, "Unable to find channel %s whose topic is being set", argv[1]);
return 0;
@@ -1366,6 +1381,8 @@
dict_insert(irc_func_dict, TOK_NOTICE, cmd_notice);
dict_insert(irc_func_dict, CMD_STATS, cmd_stats);
dict_insert(irc_func_dict, TOK_STATS, cmd_stats);
+ dict_insert(irc_func_dict, CMD_SVSNICK, cmd_svsnick);
+ dict_insert(irc_func_dict, TOK_SVSNICK, cmd_svsnick);
dict_insert(irc_func_dict, CMD_WHOIS, cmd_whois);
dict_insert(irc_func_dict, TOK_WHOIS, cmd_whois);
dict_insert(irc_func_dict, CMD_GLINE, cmd_gline);
|
|
From: Martijn <wa...@we...> - 2004-06-12 12:40:29
|
wasted 2004/06/12 04:32:50 PDT
Modified files:
src Makefile.am Makefile.in main.c messages.h
statserv.c
Added files:
src rrdgraph.c rrdgraph.h
Log:
Add RRDGraph functionality, bump version.
Revision Changes Path
1.2 +1 -0 wStats-pgsql/src/Makefile.am
1.2 +6 -3 wStats-pgsql/src/Makefile.in
1.2 +3 -1 wStats-pgsql/src/main.c
1.2 +3 -1 wStats-pgsql/src/messages.h
1.1 +489 -0 wStats-pgsql/src/rrdgraph.c (new)
1.1 +23 -0 wStats-pgsql/src/rrdgraph.h (new)
1.2 +12 -2 wStats-pgsql/src/statserv.c
Index: rrdgraph.c
====================================================================
/* rrdgraph.c - RRDTool graphs
* Copyright 2004 Martijn Smit, WhatNET Coder-Com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. Important limitations are
* listed in the COPYING file that accompanies this software.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: rrdgraph.c,v 1.1 2004/06/12 11:32:50 wasted Exp $
*/
#include "conf.h"
#include "gline.h"
#include "modcmd.h"
#include "pgsql.h"
#include "rrdgraph.h"
#include "timeq.h"
#ifdef HAVE_SYS_TIMES_H
#include <sys/times.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
struct module *rrd_module;
static struct log_type *RRD_LOG;
static struct {
unsigned int active;
unsigned long update_duration;
struct string_list *ignore_servers;
char *rrdtool_path;
char *servername;
char *output_dir;
} rrd_conf;
#define RRD_CONF_NAME "rrdgraphs"
#define KEY_IGNORE_SERVERS "ignore_servers"
#define KEY_ACTIVE "active"
#define KEY_GRAPH_UPDATE "graph_update"
#define KEY_OUTPUTDIR "output_dir"
#define KEY_SERVERNAME "servername"
#define KEY_RRD_PATH "rrd_path"
#define DEF_COLORS "-c BACK#FFFFFF -c CANVAS#F3F3F3 -c SHADEA#C8C8C8 -c SHADEB#969696 -c GRID#8C8C8C -c MGRID#821E1E -c FONT#000000 -c FRAME#000000 -c ARROW#FF0000"
static void make_graphs(UNUSED_ARG(void *data));
unsigned int
check_rrdtool(const char *path)
{
FILE *fp;
if (!(fp = fopen(path, "r"))) {
log_module(RRD_LOG, LOG_ERROR, "Unable to open rrdtool (%s) for reading: %s", path, strerror(errno));
return 0;
}
fclose(fp);
if(access(path, X_OK) == -1) {
log_module(RRD_LOG, LOG_ERROR, "access() failed on rrdtool (%s): %s", path, strerror(errno));
return 0;
}
return 1;
}
unsigned int
rrd_exists(char *name)
{
char file[512];
FILE *fp;
sprintf(file, "%s/%s.rrd", rrd_conf.output_dir, name);
if (!(fp = fopen(file, "r"))) {
return 0;
}
fclose(fp);
return 1;
}
unsigned int
rrd_ignore_server(char *servername)
{
unsigned int i;
if(rrd_conf.ignore_servers)
{
for (i = 0; i < rrd_conf.ignore_servers->used; i++)
{
if(!irccasecmp(servername, rrd_conf.ignore_servers->list[i])) {
return 1;
}
}
}
return 0;
}
void
frput(FILE *fp, const char *str, ...)
{
va_list arg_list;
unsigned char buffer[MAXLEN];
int pos;
buffer[0] = '\0';
va_start(arg_list, str);
pos = vsnprintf(buffer, MAXLEN - 2, str, arg_list);
if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2;
buffer[pos++] = '\n';
buffer[pos] = 0;
va_end(arg_list);
fputs(buffer, fp);
}
void
collect_graphs(void)
{
dict_iterator_t it;
char str[MAXLEN];
if(!rrd_exists(rrd_conf.servername)) {
sprintf(str, "%s create %s/%s.rrd DS:ircops:GAUGE:600:U:U DS:users:GAUGE:600:U:U DS:channels:GAUGE:600:U:U DS:invisible:GAUGE:600:U:U DS:normal:GAUGE:600:U:U DS:servers:GAUGE:600:U:U RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:24:775 RRA:AVERAGE:0.5:288:797 RRA:MAX:0.5:1:600 RRA:MAX:0.5:6:700 RRA:MAX:0.5:24:775 RRA:MAX:0.5:288:797", rrd_conf.rrdtool_path, rrd_conf.output_dir, rrd_conf.servername);
}
else {
sprintf(str, "%s update %s/%s.rrd N:%d:%d:%d:%d:%d:%d", rrd_conf.rrdtool_path, rrd_conf.output_dir, rrd_conf.servername, curr_opers.used, dict_size(clients), dict_size(channels), invis_clients, (dict_size(clients) - invis_clients), dict_size(servers));
}
system(str);
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(!rrd_exists(server->name)) {
// create
char str2[5000];
sprintf(str2, "%s create %s/%s.rrd DS:localusers:GAUGE:600:U:U DS:totalusers:GAUGE:600:U:U RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:6:700 RRA:AVERAGE:0.5:24:775 RRA:AVERAGE:0.5:288:797 RRA:MAX:0.5:1:600 RRA:MAX:0.5:6:700 RRA:MAX:0.5:24:775 RRA:MAX:0.5:288:797 >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name);
system(str2);
}
else {
// update
sprintf(str, "%s update %s/%s.rrd N:%d:%d >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, server->clients, dict_size(clients));
system(str);
}
}
timeq_add(now + 10, make_graphs, NULL);
}
static void
get_data(UNUSED_ARG(void *data))
{
collect_graphs();
if(rrd_conf.active && rrd_conf.update_duration) {
timeq_add(now + rrd_conf.update_duration, get_data, NULL);
}
}
void
html_header(FILE *fp, int defaulth, char *title)
{
time_t _time = now;
frput(fp, "<HTML>\n");
frput(fp, "<head>\n");
if(defaulth || !title) {
frput(fp, " <title>Stats for %s on %s</title>\n", rrd_conf.servername, ctime(&_time));
}
else {
frput(fp, " <title>%s</title>\n", title);
}
frput(fp, "<meta http-equiv=\"Refresh\" content=\"%ld\">\n", rrd_conf.update_duration);
frput(fp, "<meta name=\"Generator\" content=\"%s\">\n", MSG_VERSIONNB);
frput(fp, "<style type=\"text/css\" title=\"Defs\">\n");
frput(fp, "H2 {color:black; font-family:\"Helvetica\"; font-style:normal; font-weight:bold; font-size:16pt}\n");
frput(fp, ".normal {color:black; font-family:\"Helvetica\"; font-style:normal}\n");
frput(fp, "</style>\n");
frput(fp, "</head>\n");
frput(fp, "<body bgcolor=\"white\" link=\"blue\">\n");
frput(fp, "<center>\n");
}
void
html_footer(FILE *fp)
{
frput(fp, " <br><br><hr>\n");
frput(fp, " <font class=\"normal\">\n");
frput(fp, " This page was built using <a href=\"http://wstats.sourceforge.net\">%s</a> by <a href=\"mailto:wa...@wh...\">Martijn Smit</a><br>\n", MSG_VERSIONNB);
frput(fp, " PNG images created with <a href=\"http://www.rrdtool.org\">RRDTool</a> by Tobi Oetiker\n");
frput(fp, " </font><br>\n");
frput(fp, "</CENTER>\n");
frput(fp, "</BODY>\n");
frput(fp, "</HTML>\n");
}
void
format_html_index()
{
time_t _time = now;
dict_iterator_t it;
char file[125];
FILE *fp;
sprintf(file, "%s/index.html", rrd_conf.output_dir);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
html_header(fp, 1, NULL);
frput(fp, "<h2><p align=\"center\">Stats for <b>%s</b></h2>\n", rrd_conf.servername);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(rrd_exists(server->name)) {
frput(fp, " <a href=\"%s.html\"><img src=\"%s-day.png\" border=\"0\"></a><br><br>\n", server->name, server->name);
}
}
frput(fp, " <a href=\"network.html\"><img src=\"network-day.png\" border=\"0\"></a><br><br>\n");
frput(fp, " <a href=\"servers.html\"><img src=\"servers-day.png\" border=\"0\"></a><br><br>\n");
html_footer(fp);
fclose(fp);
}
void
format_html_network()
{
time_t _time = now;
char file[125];
FILE *fp;
sprintf(file, "%s/network.html", rrd_conf.output_dir);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
html_header(fp, 1, NULL);
frput(fp, "<h2><p align=\"center\">Stats for <b>%s</b></h2>\n", rrd_conf.servername);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
frput(fp, " <img src=\"network-day.png\"><br><br>\n");
frput(fp, " <img src=\"network-week.png\"><br><br>\n");
frput(fp, " <img src=\"network-month.png\"><br><br>\n");
frput(fp, " <img src=\"network-year.png\">\n");
html_footer(fp);
fclose(fp);
}
void
format_html_servers()
{
time_t _time = now;
char file[125];
FILE *fp;
sprintf(file, "%s/servers.html", rrd_conf.output_dir);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
html_header(fp, 1, NULL);
frput(fp, "<h2><p align=\"center\">Servers and Ircops on <b>%s</b></h2>\n", rrd_conf.servername);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
frput(fp, " <img src=\"servers-day.png\"><br><br>\n");
frput(fp, " <img src=\"servers-week.png\"><br><br>\n");
frput(fp, " <img src=\"servers-month.png\"><br><br>\n");
frput(fp, " <img src=\"servers-year.png\">\n");
html_footer(fp);
fclose(fp);
}
void
format_html_local_servers()
{
char file[512], str[512];
time_t _time = now;
dict_iterator_t it;
FILE *fp;
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(rrd_exists(server->name)) {
sprintf(file, "%s/%s.html", rrd_conf.output_dir, server->name);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
sprintf(str, "Users connected to %s", server->name);
html_header(fp, 0, str);
frput(fp, "<h2><p align=\"center\">Stats for <b>%s</b></h2>\n", server->name);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
frput(fp, " <img src=\"%s-day.png\"><br><br>\n", server->name);
frput(fp, " <img src=\"%s-week.png\"><br><br>\n", server->name);
frput(fp, " <img src=\"%s-month.png\"><br><br>\n", server->name);
frput(fp, " <img src=\"%s-year.png\">\n", server->name);
html_footer(fp);
fclose(fp);
}
}
}
void
format_graph_servers()
{
char str[5000];
sprintf(str, "%s graph %s/servers-day.png %s -a PNG -s -1day -v \"servers/ircops\" -t \"Servers and ircops online (1 day)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE \"CDEF:copsperserver=totalircops,totalservers,/\" \"CDEF:percircops=totalircops,100,*,users,/\" AREA:totalservers#FF0000:\"Servers online\" LINE2:totalircops#000000:\"IRCops online\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' GPRINT:copsperserver:LAST:'IRCops per server\\: %%.2lf\\l' GPRINT:percircops:LAST:'Ircops\\: %%.2lf%%%% of total users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.out!
put_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/servers-week.png %s -a PNG -s -1week -v \"servers/ircops\" -t \"Servers and ircops on line (1 week)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE AREA:totalservers#FF0000:\"Servers on line\" LINE2:totalircops#FF6600:\"IRCops on line\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/servers-month.png %s -a PNG -s -1month -v \"servers/ircops\" -t \"Servers and ircops on line (1 month)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE AREA:totalservers#FF0000:\"Servers on line\" LINE2:totalircops#FF6600:\"IRCops on line\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/servers-year.png %s -a PNG -s -1year -v \"servers/ircops\" -t \"Servers and ircops on line (1 year)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE AREA:totalservers#FF0000:\"Servers on line\" LINE2:totalircops#FF6600:\"IRCops on line\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
}
void
format_graph_network()
{
char str[5000];
sprintf(str, "%s graph %s/network-day.png %s -a PNG -h 200 -s -1day -v \"users/channels\" -t \"Users and channels in the network (1 day)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE \"CDEF:usersperchannel=users,channels,/\" DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE \"CDEF:percinvisible=invisible,100,*,users,/\" \"CDEF:percnormal=normal,100,*,users,/\" AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' GPRINT:usersperchannel:LAST:'Users per channel\\: %%.2lf\\l' GPRINT:percinvisible:L!
AST:'Invisible (+i)\\: %%.2lf%%%% of total users\\l' GPRINT:percnormal:LAST:'Visible (-i)\\: %%.2lf%%%% of total users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/network-week.png %s -a PNG -h 200 -s -1week -v \"users/channels\" -t \"Users and channels in the network (1 week)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.outp!
ut_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/network-month.png %s -a PNG -h 200 -s -1month -v \"users/channels\" -t \"Users and channels in the network (1 month)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.o!
utput_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/network-year.png %s -a PNG -h 200 -s -1year -v \"users/channels\" -t \"Users and channels in the network (1 year)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.outp!
ut_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
}
void
format_graph_local_servers()
{
dict_iterator_t it;
char str[3000];
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(rrd_exists(server->name)) {
sprintf(str, "%s graph %s/%s-day.png %s -a PNG -v \"local users\" -t \"Users connected to %s (1 day)\" DEF:lastglobal=%s/%s.rrd:totalusers:AVERAGE DEF:localusers=%s/%s.rrd:localusers:AVERAGE \"CDEF:perclocal=localusers,100,*,lastglobal,/\" AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocal=%s/%s.rrd:localusers:MAX GPRINT:maxlocal:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf\\l' GPRINT:perclocal:LAST:'Percentage\\: %s has %%.2lf%%%% of global users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name, server->name);
system(str);
sprintf(str, "%s graph %s/%s-week.png %s -a PNG -s -1week -v \"local users\" -t \"Users connected to %s (1 week)\" DEF:localusers=%s/%s.rrd:localusers:AVERAGE AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocals=%s/%s.rrd:localusers:MAX GPRINT:maxlocals:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name);
system(str);
sprintf(str, "%s graph %s/%s-month.png %s -a PNG -s -1month -v \"local users\" -t \"Users connected to %s (1 month)\" DEF:localusers=%s/%s.rrd:localusers:AVERAGE AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocals=%s/%s.rrd:localusers:MAX GPRINT:maxlocals:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name);
system(str);
sprintf(str, "%s graph %s/%s-year.png %s -a PNG -s -1year -v \"local users\" -t \"Users connected to %s (1 year)\" DEF:localusers=%s/%s.rrd:localusers:AVERAGE AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocals=%s/%s.rrd:localusers:MAX GPRINT:maxlocals:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name);
system(str);
}
}
}
static void
make_graphs(UNUSED_ARG(void *data))
{
format_html_index();
format_html_network();
format_html_servers();
format_html_local_servers();
format_graph_servers();
format_graph_network();
format_graph_local_servers();
}
static void
rrd_conf_read(void)
{
struct record_data *rd;
dict_t conf_node;
const char *str;
rd = conf_get_node(RRD_CONF_NAME);
if (!rd || rd->type != RECDB_OBJECT) {
log_module(RRD_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type", RRD_CONF_NAME);
return;
}
conf_node = rd->d.object;
str = database_get_data(conf_node, KEY_ACTIVE, RECDB_QSTRING);
rrd_conf.active = enabled_string(str) ? 1 : 0;
str = database_get_data(conf_node, KEY_GRAPH_UPDATE, RECDB_QSTRING);
rrd_conf.update_duration = str ? ParseInterval(str) : 900;
str = database_get_data(conf_node, KEY_SERVERNAME, RECDB_QSTRING);
rrd_conf.servername = str ? strdup(str) : "bad.config";
str = database_get_data(conf_node, KEY_OUTPUTDIR, RECDB_QSTRING);
if(str) {
rrd_conf.output_dir = strdup(str);
}
else {
log_module(RRD_LOG, LOG_ERROR, "No output directory defined! Deactivating rrdgraphs module");
rrd_conf.active = 0;
}
free_string_list(rrd_conf.ignore_servers);
rrd_conf.ignore_servers = database_get_data(conf_node, KEY_IGNORE_SERVERS, RECDB_STRING_LIST);
if(rrd_conf.ignore_servers) {
rrd_conf.ignore_servers = string_list_copy(rrd_conf.ignore_servers);
}
str = database_get_data(conf_node, KEY_RRD_PATH, RECDB_QSTRING);
if(str) {
rrd_conf.rrdtool_path = strdup(str);
if(!check_rrdtool(rrd_conf.rrdtool_path)) {
rrd_conf.active = 0;
}
}
else {
log_module(RRD_LOG, LOG_ERROR, "RRDTool path not defined! Deactivating rrdgraphs module");
rrd_conf.active = 0;
}
}
void
rrd_module_init(void)
{
RRD_LOG = log_register_type("RRD", "file:rrd.log");
rrd_module = module_register("RRD", RRD_LOG, NULL, NULL);
conf_register_reload(rrd_conf_read);
if(rrd_conf.active && rrd_conf.update_duration) {
timeq_add(now + rrd_conf.update_duration, get_data, NULL);
}
}
Index: rrdgraph.h
====================================================================
/* rrdgraph.h - RRDTool graphs
* Copyright 2004 Martijn Smit, WhatNET Coder-Com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. Important limitations are
* listed in the COPYING file that accompanies this software.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: rrdgraph.h,v 1.1 2004/06/12 11:32:50 wasted Exp $
*/
void rrd_module_init(void);
void collect_graphs(void);
Index: Makefile.am
===================================================================
RCS file: /home/cvs/wstats/wStats-pgsql/src/Makefile.am,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Makefile.am 10 Apr 2004 16:57:01 -0000 1.1
+++ Makefile.am 12 Jun 2004 11:32:49 -0000 1.2
@@ -25,6 +25,7 @@
statserv.c statserv.h \
proto-p10.c proto.h \
recdb.c recdb.h \
+ rrdgraph.c rrdgraph.h \
timeq.c timeq.h \
tools.c
Index: Makefile.in
===================================================================
RCS file: /home/cvs/wstats/wStats-pgsql/src/Makefile.in,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Makefile.in 10 Apr 2004 16:57:01 -0000 1.1
+++ Makefile.in 12 Jun 2004 11:32:49 -0000 1.2
@@ -108,6 +108,7 @@
statserv.c statserv.h \
proto-p10.c proto.h \
recdb.c recdb.h \
+ rrdgraph.c rrdgraph.h \
timeq.c timeq.h \
tools.c
@@ -123,7 +124,8 @@
hash.$(OBJEXT) heap.$(OBJEXT) helpfile.$(OBJEXT) \
ioset.$(OBJEXT) log.$(OBJEXT) main.$(OBJEXT) modcmd.$(OBJEXT) \
pgsql.$(OBJEXT) statserv.$(OBJEXT) proto-p10.$(OBJEXT) \
- recdb.$(OBJEXT) timeq.$(OBJEXT) tools.$(OBJEXT)
+ recdb.$(OBJEXT) rrdgraph.$(OBJEXT) timeq.$(OBJEXT) \
+ tools.$(OBJEXT)
wstats_OBJECTS = $(am_wstats_OBJECTS)
wstats_LDFLAGS =
@@ -141,8 +143,8 @@
@AMDEP_TRUE@ ./$(DEPDIR)/log.Po ./$(DEPDIR)/main.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/modcmd.Po ./$(DEPDIR)/pgsql.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/proto-p10.Po ./$(DEPDIR)/recdb.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/statserv.Po ./$(DEPDIR)/timeq.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/tools.Po
+@AMDEP_TRUE@ ./$(DEPDIR)/rrdgraph.Po ./$(DEPDIR)/statserv.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/timeq.Po ./$(DEPDIR)/tools.Po
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
@@ -210,6 +212,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pgsql.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proto-p10.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recdb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rrdgraph.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statserv.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeq.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tools.Po@am__quote@
Index: main.c
===================================================================
RCS file: /home/cvs/wstats/wStats-pgsql/src/main.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- main.c 10 Apr 2004 16:57:06 -0000 1.1
+++ main.c 12 Jun 2004 11:32:49 -0000 1.2
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: main.c,v 1.1 2004/04/10 16:57:06 wasted Exp $
+ * $Id: main.c,v 1.2 2004/06/12 11:32:49 wasted Exp $
*/
#define PID_FILE "wstats.pid"
@@ -28,6 +28,7 @@
#include "ioset.h"
#include "modcmd.h"
#include "pgsql.h"
+#include "rrdgraph.h"
#include "timeq.h"
#include "statserv.h"
@@ -449,6 +450,7 @@
if (info) init_statserv(info);
pgsql_module_init();
+ rrd_module_init();
}
#ifdef HAVE_SYS_RESOURCE_H
Index: messages.h
===================================================================
RCS file: /home/cvs/wstats/wStats-pgsql/src/messages.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- messages.h 10 Apr 2004 16:57:08 -0000 1.1
+++ messages.h 12 Jun 2004 11:32:49 -0000 1.2
@@ -18,13 +18,15 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: messages.h,v 1.1 2004/04/10 16:57:08 wasted Exp $
+ * $Id: messages.h,v 1.2 2004/06/12 11:32:49 wasted Exp $
*/
#ifndef _MESSAGES_H_
#define _MESSAGES_H_
#define MSG_VERSION "$b"PACKAGE_STRING"$b, Built: " __DATE__ ", " __TIME__"."
+// No Bold version.
+#define MSG_VERSIONNB PACKAGE_STRING", Built: " __DATE__ ", " __TIME__"."
#define MSG_SERVICE_PRIVILEGED "$b%s$b is a privileged service."
#define MSG_NOT_A_SERVICE "$b%s$b is not a service bot."
#define MSG_COMMAND_UNKNOWN "$b%s$b is an unknown command."
Index: statserv.c
===================================================================
RCS file: /home/cvs/wstats/wStats-pgsql/src/statserv.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- statserv.c 10 Apr 2004 16:57:07 -0000 1.1
+++ statserv.c 12 Jun 2004 11:32:50 -0000 1.2
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * $Id: statserv.c,v 1.1 2004/04/10 16:57:07 wasted Exp $
+ * $Id: statserv.c,v 1.2 2004/06/12 11:32:50 wasted Exp $
*/
#include "conf.h"
@@ -24,6 +24,7 @@
#include "modcmd.h"
#include "pgsql.h"
#include "statserv.h"
+#include "rrdgraph.h"
#include "timeq.h"
#ifdef HAVE_SYS_TIMES_H
@@ -79,6 +80,7 @@
#define MSG_RAW_PARSE_ERROR "Error parsing raw line (not dumping to uplink)."
#define MSG_UPLINK_START "Uplink $b%s$b:"
#define MSG_NO_SUCH_STATS "No such stats type $b%s$b."
+#define MSG_RRDUPDATED "RRD graphs are being updated."
#define MAX_CHANNELS_WHOIS 50
@@ -95,7 +97,7 @@
unsigned char trigger_char;
} statserv_conf;
-const char *SSMSG_VERSION_ID = "$Id: statserv.c,v 1.1 2004/04/10 16:57:07 wasted Exp $";
+const char *SSMSG_VERSION_ID = "$Id: statserv.c,v 1.2 2004/06/12 11:32:50 wasted Exp $";
#define statserv_notice(target, format...) send_message(target, statserv, ## format)
#define statserv_debug(format...) do { if (statserv_conf.debug_channel) send_channel_notice(statserv_conf.debug_channel, statserv, ## format); } while (0)
@@ -600,6 +602,13 @@
statserv_notice(user, MSG_NO_SUCH_STATS, argv[1]);
return 0;
}
+
+static STATSERV_FUNC(cmd_rrdupdate)
+{
+ collect_graphs();
+ statserv_notice(user, MSG_RRDUPDATED);
+ return 1;
+}
static STATSERV_FUNC(cmd_dump)
{
@@ -742,6 +751,7 @@
modcmd_register(statserv_module, "REHASH", cmd_rehash, 1);
modcmd_register(statserv_module, "RESTART", cmd_restart, 1);
modcmd_register(statserv_module, "STATS", cmd_stats, 2);
+ modcmd_register(statserv_module, "RRDUPDATE", cmd_rrdupdate, 1);
modcmd_register(statserv_module, "UPTIME", cmd_uptime, 1);
modcmd_register(statserv_module, "VERSION", cmd_version, 1);
modcmd_register(statserv_module, "WHOIS", cmd_whois, 2);
|
|
From: Martijn <wa...@we...> - 2004-06-12 12:40:27
|
wasted 2004/06/12 04:32:49 PDT
Modified files:
. configure configure.in
Log:
Add RRDGraph functionality, bump version.
Revision Changes Path
1.2 +11 -11 wStats-pgsql/configure
1.2 +2 -2 wStats-pgsql/configure.in
Index: configure
===================================================================
RCS file: /home/cvs/wstats/wStats-pgsql/configure,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- configure 10 Apr 2004 16:56:59 -0000 1.1
+++ configure 12 Jun 2004 11:32:49 -0000 1.2
@@ -1,7 +1,7 @@
#! /bin/sh
-# From configure.in Id: configure.in,v 1.2 2004/01/18 16:59:16 wasted Exp .
+# From configure.in Id: configure.in,v 1.1.1.1 2004/04/10 16:56:59 wasted Exp .
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.57 for wstats 1.1.
+# Generated by GNU Autoconf 2.57 for wstats 1.2.
#
# Report bugs to <wst...@li...>.
#
@@ -269,8 +269,8 @@
# Identity of this package.
PACKAGE_NAME='wstats'
PACKAGE_TARNAME='wstats'
-PACKAGE_VERSION='1.1'
-PACKAGE_STRING='wstats 1.1'
+PACKAGE_VERSION='1.2'
+PACKAGE_STRING='wstats 1.2'
PACKAGE_BUGREPORT='wst...@li...'
ac_unique_file="src/statserv.c"
@@ -788,7 +788,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures wstats 1.1 to adapt to many kinds of systems.
+\`configure' configures wstats 1.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -855,7 +855,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of wstats 1.1:";;
+ short | recursive ) echo "Configuration of wstats 1.2:";;
esac
cat <<\_ACEOF
@@ -954,7 +954,7 @@
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
-wstats configure 1.1
+wstats configure 1.2
generated by GNU Autoconf 2.57
Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
@@ -969,7 +969,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by wstats $as_me 1.1, which was
+It was created by wstats $as_me 1.2, which was
generated by GNU Autoconf 2.57. Invocation command line was
$ $0 $@
@@ -1649,7 +1649,7 @@
# Define the identity of the package.
PACKAGE=wstats
- VERSION=1.1
+ VERSION=1.2
cat >>confdefs.h <<_ACEOF
@@ -8365,7 +8365,7 @@
} >&5
cat >&5 <<_CSEOF
-This file was extended by wstats $as_me 1.1, which was
+This file was extended by wstats $as_me 1.2, which was
generated by GNU Autoconf 2.57. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -8428,7 +8428,7 @@
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-wstats config.status 1.1
+wstats config.status 1.2
configured by $0, generated by GNU Autoconf 2.57,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
Index: configure.in
===================================================================
RCS file: /home/cvs/wstats/wStats-pgsql/configure.in,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- configure.in 10 Apr 2004 16:56:59 -0000 1.1
+++ configure.in 12 Jun 2004 11:32:49 -0000 1.2
@@ -1,6 +1,6 @@
-AC_REVISION([$Id: configure.in,v 1.1 2004/04/10 16:56:59 wasted Exp $])
+AC_REVISION([$Id: configure.in,v 1.2 2004/06/12 11:32:49 wasted Exp $])
AC_PREREQ(2.53)
-AC_INIT(wstats, 1.1, wst...@li...)
+AC_INIT(wstats, 1.2, wst...@li...)
AM_CONFIG_HEADER(src/config.h)
AC_CONFIG_SRCDIR(src/statserv.c)
|
|
From: Martijn <wa...@we...> - 2004-06-12 12:18:14
|
wasted 2004/06/12 04:10:32 PDT
Modified files:
src Makefile.am Makefile.in ioset.c main.c
messages.h statserv.c
Added files:
src rrdgraph.c rrdgraph.h
Log:
Add RRDGraph functionality, bump version.
Revision Changes Path
1.2 +1 -0 wStats/src/Makefile.am
1.2 +7 -4 wStats/src/Makefile.in
1.2 +2 -2 wStats/src/ioset.c
1.3 +3 -1 wStats/src/main.c
1.2 +3 -1 wStats/src/messages.h
1.1 +489 -0 wStats/src/rrdgraph.c (new)
1.1 +23 -0 wStats/src/rrdgraph.h (new)
1.2 +12 -2 wStats/src/statserv.c
Index: rrdgraph.c
====================================================================
/* rrdgraph.c - RRDTool graphs
* Copyright 2004 Martijn Smit, WhatNET Coder-Com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. Important limitations are
* listed in the COPYING file that accompanies this software.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: rrdgraph.c,v 1.1 2004/06/12 11:10:31 wasted Exp $
*/
#include "conf.h"
#include "gline.h"
#include "modcmd.h"
#include "mysql.h"
#include "rrdgraph.h"
#include "timeq.h"
#ifdef HAVE_SYS_TIMES_H
#include <sys/times.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
struct module *rrd_module;
static struct log_type *RRD_LOG;
static struct {
unsigned int active;
unsigned long update_duration;
struct string_list *ignore_servers;
char *rrdtool_path;
char *servername;
char *output_dir;
} rrd_conf;
#define RRD_CONF_NAME "rrdgraphs"
#define KEY_IGNORE_SERVERS "ignore_servers"
#define KEY_ACTIVE "active"
#define KEY_GRAPH_UPDATE "graph_update"
#define KEY_OUTPUTDIR "output_dir"
#define KEY_SERVERNAME "servername"
#define KEY_RRD_PATH "rrd_path"
#define DEF_COLORS "-c BACK#FFFFFF -c CANVAS#F3F3F3 -c SHADEA#C8C8C8 -c SHADEB#969696 -c GRID#8C8C8C -c MGRID#821E1E -c FONT#000000 -c FRAME#000000 -c ARROW#FF0000"
static void make_graphs(UNUSED_ARG(void *data));
unsigned int
check_rrdtool(const char *path)
{
FILE *fp;
if (!(fp = fopen(path, "r"))) {
log_module(RRD_LOG, LOG_ERROR, "Unable to open rrdtool (%s) for reading: %s", path, strerror(errno));
return 0;
}
fclose(fp);
if(access(path, X_OK) == -1) {
log_module(RRD_LOG, LOG_ERROR, "access() failed on rrdtool (%s): %s", path, strerror(errno));
return 0;
}
return 1;
}
unsigned int
rrd_exists(char *name)
{
char file[512];
FILE *fp;
sprintf(file, "%s/%s.rrd", rrd_conf.output_dir, name);
if (!(fp = fopen(file, "r"))) {
return 0;
}
fclose(fp);
return 1;
}
unsigned int
rrd_ignore_server(char *servername)
{
unsigned int i;
if(rrd_conf.ignore_servers)
{
for (i = 0; i < rrd_conf.ignore_servers->used; i++)
{
if(!irccasecmp(servername, rrd_conf.ignore_servers->list[i])) {
return 1;
}
}
}
return 0;
}
void
frput(FILE *fp, const char *str, ...)
{
va_list arg_list;
unsigned char buffer[MAXLEN];
int pos;
buffer[0] = '\0';
va_start(arg_list, str);
pos = vsnprintf(buffer, MAXLEN - 2, str, arg_list);
if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2;
buffer[pos++] = '\n';
buffer[pos] = 0;
va_end(arg_list);
fputs(buffer, fp);
}
void
collect_graphs(void)
{
dict_iterator_t it;
char str[MAXLEN];
if(!rrd_exists(rrd_conf.servername)) {
sprintf(str, "%s create %s/%s.rrd DS:ircops:GAUGE:600:U:U DS:users:GAUGE:600:U:U DS:channels:GAUGE:600:U:U DS:invisible:GAUGE:600:U:U DS:normal:GAUGE:600:U:U DS:servers:GAUGE:600:U:U RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:24:775 RRA:AVERAGE:0.5:288:797 RRA:MAX:0.5:1:600 RRA:MAX:0.5:6:700 RRA:MAX:0.5:24:775 RRA:MAX:0.5:288:797", rrd_conf.rrdtool_path, rrd_conf.output_dir, rrd_conf.servername);
}
else {
sprintf(str, "%s update %s/%s.rrd N:%d:%d:%d:%d:%d:%d", rrd_conf.rrdtool_path, rrd_conf.output_dir, rrd_conf.servername, curr_opers.used, dict_size(clients), dict_size(channels), invis_clients, (dict_size(clients) - invis_clients), dict_size(servers));
}
system(str);
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(!rrd_exists(server->name)) {
// create
char str2[5000];
sprintf(str2, "%s create %s/%s.rrd DS:localusers:GAUGE:600:U:U DS:totalusers:GAUGE:600:U:U RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:6:700 RRA:AVERAGE:0.5:24:775 RRA:AVERAGE:0.5:288:797 RRA:MAX:0.5:1:600 RRA:MAX:0.5:6:700 RRA:MAX:0.5:24:775 RRA:MAX:0.5:288:797 >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name);
system(str2);
}
else {
// update
sprintf(str, "%s update %s/%s.rrd N:%d:%d >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, server->clients, dict_size(clients));
system(str);
}
}
timeq_add(now + 10, make_graphs, NULL);
}
static void
get_data(UNUSED_ARG(void *data))
{
collect_graphs();
if(rrd_conf.active && rrd_conf.update_duration) {
timeq_add(now + rrd_conf.update_duration, get_data, NULL);
}
}
void
html_header(FILE *fp, int defaulth, char *title)
{
time_t _time = now;
frput(fp, "<HTML>\n");
frput(fp, "<head>\n");
if(defaulth || !title) {
frput(fp, " <title>Stats for %s on %s</title>\n", rrd_conf.servername, ctime(&_time));
}
else {
frput(fp, " <title>%s</title>\n", title);
}
frput(fp, "<meta http-equiv=\"Refresh\" content=\"%ld\">\n", rrd_conf.update_duration);
frput(fp, "<meta name=\"Generator\" content=\"%s\">\n", MSG_VERSIONNB);
frput(fp, "<style type=\"text/css\" title=\"Defs\">\n");
frput(fp, "H2 {color:black; font-family:\"Helvetica\"; font-style:normal; font-weight:bold; font-size:16pt}\n");
frput(fp, ".normal {color:black; font-family:\"Helvetica\"; font-style:normal}\n");
frput(fp, "</style>\n");
frput(fp, "</head>\n");
frput(fp, "<body bgcolor=\"white\" link=\"blue\">\n");
frput(fp, "<center>\n");
}
void
html_footer(FILE *fp)
{
frput(fp, " <br><br><hr>\n");
frput(fp, " <font class=\"normal\">\n");
frput(fp, " This page was built using <a href=\"http://wstats.sourceforge.net\">%s</a> by <a href=\"mailto:wa...@wh...\">Martijn Smit</a><br>\n", MSG_VERSIONNB);
frput(fp, " PNG images created with <a href=\"http://www.rrdtool.org\">RRDTool</a> by Tobi Oetiker\n");
frput(fp, " </font><br>\n");
frput(fp, "</CENTER>\n");
frput(fp, "</BODY>\n");
frput(fp, "</HTML>\n");
}
void
format_html_index()
{
time_t _time = now;
dict_iterator_t it;
char file[125];
FILE *fp;
sprintf(file, "%s/index.html", rrd_conf.output_dir);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
html_header(fp, 1, NULL);
frput(fp, "<h2><p align=\"center\">Stats for <b>%s</b></h2>\n", rrd_conf.servername);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(rrd_exists(server->name)) {
frput(fp, " <a href=\"%s.html\"><img src=\"%s-day.png\" border=\"0\"></a><br><br>\n", server->name, server->name);
}
}
frput(fp, " <a href=\"network.html\"><img src=\"network-day.png\" border=\"0\"></a><br><br>\n");
frput(fp, " <a href=\"servers.html\"><img src=\"servers-day.png\" border=\"0\"></a><br><br>\n");
html_footer(fp);
fclose(fp);
}
void
format_html_network()
{
time_t _time = now;
char file[125];
FILE *fp;
sprintf(file, "%s/network.html", rrd_conf.output_dir);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
html_header(fp, 1, NULL);
frput(fp, "<h2><p align=\"center\">Stats for <b>%s</b></h2>\n", rrd_conf.servername);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
frput(fp, " <img src=\"network-day.png\"><br><br>\n");
frput(fp, " <img src=\"network-week.png\"><br><br>\n");
frput(fp, " <img src=\"network-month.png\"><br><br>\n");
frput(fp, " <img src=\"network-year.png\">\n");
html_footer(fp);
fclose(fp);
}
void
format_html_servers()
{
time_t _time = now;
char file[125];
FILE *fp;
sprintf(file, "%s/servers.html", rrd_conf.output_dir);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
html_header(fp, 1, NULL);
frput(fp, "<h2><p align=\"center\">Servers and Ircops on <b>%s</b></h2>\n", rrd_conf.servername);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
frput(fp, " <img src=\"servers-day.png\"><br><br>\n");
frput(fp, " <img src=\"servers-week.png\"><br><br>\n");
frput(fp, " <img src=\"servers-month.png\"><br><br>\n");
frput(fp, " <img src=\"servers-year.png\">\n");
html_footer(fp);
fclose(fp);
}
void
format_html_local_servers()
{
char file[512], str[512];
time_t _time = now;
dict_iterator_t it;
FILE *fp;
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(rrd_exists(server->name)) {
sprintf(file, "%s/%s.html", rrd_conf.output_dir, server->name);
if(!(fp = fopen(file, "w"))) {
log_module(RRD_LOG, LOG_ERROR, "Couldn't open %s!", file);
return;
}
sprintf(str, "Users connected to %s", server->name);
html_header(fp, 0, str);
frput(fp, "<h2><p align=\"center\">Stats for <b>%s</b></h2>\n", server->name);
frput(fp, "<font class=\"normal\">Page build at %s</font><br><hr>\n", ctime(&_time));
frput(fp, " <img src=\"%s-day.png\"><br><br>\n", server->name);
frput(fp, " <img src=\"%s-week.png\"><br><br>\n", server->name);
frput(fp, " <img src=\"%s-month.png\"><br><br>\n", server->name);
frput(fp, " <img src=\"%s-year.png\">\n", server->name);
html_footer(fp);
fclose(fp);
}
}
}
void
format_graph_servers()
{
char str[5000];
sprintf(str, "%s graph %s/servers-day.png %s -a PNG -s -1day -v \"servers/ircops\" -t \"Servers and ircops online (1 day)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE \"CDEF:copsperserver=totalircops,totalservers,/\" \"CDEF:percircops=totalircops,100,*,users,/\" AREA:totalservers#FF0000:\"Servers online\" LINE2:totalircops#000000:\"IRCops online\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' GPRINT:copsperserver:LAST:'IRCops per server\\: %%.2lf\\l' GPRINT:percircops:LAST:'Ircops\\: %%.2lf%%%% of total users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.out!
put_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/servers-week.png %s -a PNG -s -1week -v \"servers/ircops\" -t \"Servers and ircops on line (1 week)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE AREA:totalservers#FF0000:\"Servers on line\" LINE2:totalircops#FF6600:\"IRCops on line\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/servers-month.png %s -a PNG -s -1month -v \"servers/ircops\" -t \"Servers and ircops on line (1 month)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE AREA:totalservers#FF0000:\"Servers on line\" LINE2:totalircops#FF6600:\"IRCops on line\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/servers-year.png %s -a PNG -s -1year -v \"servers/ircops\" -t \"Servers and ircops on line (1 year)\" DEF:totalservers=%s/%s.rrd:servers:AVERAGE DEF:maxservers=%s/%s.rrd:servers:MAX DEF:totalircops=%s/%s.rrd:ircops:AVERAGE DEF:maxircops=%s/%s.rrd:ircops:MAX DEF:users=%s/%s.rrd:users:AVERAGE AREA:totalservers#FF0000:\"Servers on line\" LINE2:totalircops#FF6600:\"IRCops on line\\l\" GPRINT:totalservers:AVERAGE:'Servers -> Average\\: %%.lf' GPRINT:maxservers:MAX:'Max\\: %%.lf' GPRINT:totalservers:LAST:'Current\\: %%.lf\\l' GPRINT:totalircops:AVERAGE:'IRCops -> Average\\: %%.lf' GPRINT:maxircops:MAX:'Max\\: %%.lf' GPRINT:totalircops:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
}
void
format_graph_network()
{
char str[5000];
sprintf(str, "%s graph %s/network-day.png %s -a PNG -h 200 -s -1day -v \"users/channels\" -t \"Users and channels in the network (1 day)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE \"CDEF:usersperchannel=users,channels,/\" DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE \"CDEF:percinvisible=invisible,100,*,users,/\" \"CDEF:percnormal=normal,100,*,users,/\" AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' GPRINT:usersperchannel:LAST:'Users per channel\\: %%.2lf\\l' GPRINT:percinvisible:L!
AST:'Invisible (+i)\\: %%.2lf%%%% of total users\\l' GPRINT:percnormal:LAST:'Visible (-i)\\: %%.2lf%%%% of total users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/network-week.png %s -a PNG -h 200 -s -1week -v \"users/channels\" -t \"Users and channels in the network (1 week)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.outp!
ut_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/network-month.png %s -a PNG -h 200 -s -1month -v \"users/channels\" -t \"Users and channels in the network (1 month)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.o!
utput_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
sprintf(str, "%s graph %s/network-year.png %s -a PNG -h 200 -s -1year -v \"users/channels\" -t \"Users and channels in the network (1 year)\" DEF:users=%s/%s.rrd:users:AVERAGE DEF:channels=%s/%s.rrd:channels:AVERAGE DEF:invisible=%s/%s.rrd:invisible:AVERAGE DEF:normal=%s/%s.rrd:normal:AVERAGE AREA:users#FF0000:\"Users connected\" LINE2:channels#0000FF:\"Channels created\" LINE2:invisible#00FF00:\"Users +i\" LINE2:normal#000000:\"Users -i\" DEF:maxusers=%s/%s.rrd:users:MAX DEF:maxchannels=%s/%s.rrd:channels:MAX GPRINT:maxusers:MAX:'Users -> Max\\: %%.lf' GPRINT:users:AVERAGE:'Average\\: %%.lf' GPRINT:users:LAST:'Current\\: %%.lf\\l' GPRINT:maxchannels:MAX:'Channels -> Max\\: %%.lf' GPRINT:channels:AVERAGE:'Average\\: %%.lf' GPRINT:channels:LAST:'Current\\: %%.lf\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, DEF_COLORS, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.outp!
ut_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername, rrd_conf.output_dir, rrd_conf.servername);
system(str);
}
void
format_graph_local_servers()
{
dict_iterator_t it;
char str[3000];
for (it = dict_first(servers); it; it = iter_next(it))
{
struct server *server = iter_data(it);
if(rrd_ignore_server(server->name)) continue;
if(rrd_exists(server->name)) {
sprintf(str, "%s graph %s/%s-day.png %s -a PNG -v \"local users\" -t \"Users connected to %s (1 day)\" DEF:lastglobal=%s/%s.rrd:totalusers:AVERAGE DEF:localusers=%s/%s.rrd:localusers:AVERAGE \"CDEF:perclocal=localusers,100,*,lastglobal,/\" AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocal=%s/%s.rrd:localusers:MAX GPRINT:maxlocal:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf\\l' GPRINT:perclocal:LAST:'Percentage\\: %s has %%.2lf%%%% of global users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name, server->name);
system(str);
sprintf(str, "%s graph %s/%s-week.png %s -a PNG -s -1week -v \"local users\" -t \"Users connected to %s (1 week)\" DEF:localusers=%s/%s.rrd:localusers:AVERAGE AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocals=%s/%s.rrd:localusers:MAX GPRINT:maxlocals:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name);
system(str);
sprintf(str, "%s graph %s/%s-month.png %s -a PNG -s -1month -v \"local users\" -t \"Users connected to %s (1 month)\" DEF:localusers=%s/%s.rrd:localusers:AVERAGE AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocals=%s/%s.rrd:localusers:MAX GPRINT:maxlocals:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name);
system(str);
sprintf(str, "%s graph %s/%s-year.png %s -a PNG -s -1year -v \"local users\" -t \"Users connected to %s (1 year)\" DEF:localusers=%s/%s.rrd:localusers:AVERAGE AREA:localusers#FF0000:\"Users connected to %s\\l\" DEF:maxlocals=%s/%s.rrd:localusers:MAX GPRINT:maxlocals:MAX:'Users -> Max\\: %%.lf' GPRINT:localusers:AVERAGE:'Average\\: %%.lf' GPRINT:localusers:LAST:'Current\\: %%.lf users\\l' >> /dev/null", rrd_conf.rrdtool_path, rrd_conf.output_dir, server->name, DEF_COLORS, server->name, rrd_conf.output_dir, server->name, server->name, rrd_conf.output_dir, server->name);
system(str);
}
}
}
static void
make_graphs(UNUSED_ARG(void *data))
{
format_html_index();
format_html_network();
format_html_servers();
format_html_local_servers();
format_graph_servers();
format_graph_network();
format_graph_local_servers();
}
static void
rrd_conf_read(void)
{
struct record_data *rd;
dict_t conf_node;
const char *str;
rd = conf_get_node(RRD_CONF_NAME);
if (!rd || rd->type != RECDB_OBJECT) {
log_module(RRD_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type", RRD_CONF_NAME);
return;
}
conf_node = rd->d.object;
str = database_get_data(conf_node, KEY_ACTIVE, RECDB_QSTRING);
rrd_conf.active = enabled_string(str) ? 1 : 0;
str = database_get_data(conf_node, KEY_GRAPH_UPDATE, RECDB_QSTRING);
rrd_conf.update_duration = str ? ParseInterval(str) : 900;
str = database_get_data(conf_node, KEY_SERVERNAME, RECDB_QSTRING);
rrd_conf.servername = str ? strdup(str) : "bad.config";
str = database_get_data(conf_node, KEY_OUTPUTDIR, RECDB_QSTRING);
if(str) {
rrd_conf.output_dir = strdup(str);
}
else {
log_module(RRD_LOG, LOG_ERROR, "No output directory defined! Deactivating rrdgraphs module");
rrd_conf.active = 0;
}
free_string_list(rrd_conf.ignore_servers);
rrd_conf.ignore_servers = database_get_data(conf_node, KEY_IGNORE_SERVERS, RECDB_STRING_LIST);
if(rrd_conf.ignore_servers) {
rrd_conf.ignore_servers = string_list_copy(rrd_conf.ignore_servers);
}
str = database_get_data(conf_node, KEY_RRD_PATH, RECDB_QSTRING);
if(str) {
rrd_conf.rrdtool_path = strdup(str);
if(!check_rrdtool(rrd_conf.rrdtool_path)) {
rrd_conf.active = 0;
}
}
else {
log_module(RRD_LOG, LOG_ERROR, "RRDTool path not defined! Deactivating rrdgraphs module");
rrd_conf.active = 0;
}
}
void
rrd_module_init(void)
{
RRD_LOG = log_register_type("RRD", "file:rrd.log");
rrd_module = module_register("RRD", RRD_LOG, NULL, NULL);
conf_register_reload(rrd_conf_read);
if(rrd_conf.active && rrd_conf.update_duration) {
timeq_add(now + rrd_conf.update_duration, get_data, NULL);
}
}
Index: rrdgraph.h
====================================================================
/* rrdgraph.h - RRDTool graphs
* Copyright 2004 Martijn Smit, WhatNET Coder-Com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. Important limitations are
* listed in the COPYING file that accompanies this software.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: rrdgraph.h,v 1.1 2004/06/12 11:10:31 wasted Exp $
*/
void rrd_module_init(void);
void collect_graphs(void);
Index: Makefile.am
===================================================================
RCS file: /home/cvs/wstats/wStats/src/Makefile.am,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Makefile.am 13 Dec 2003 13:36:21 -0000 1.1
+++ Makefile.am 12 Jun 2004 11:10:31 -0000 1.2
@@ -22,6 +22,7 @@
main.c messages.h common.h \
modcmd.c modcmd.h \
mysql.c mysql.h \
+ rrdgraph.c rrdgraph.h \
statserv.c statserv.h \
proto-p10.c proto.h \
recdb.c recdb.h \
Index: Makefile.in
===================================================================
RCS file: /home/cvs/wstats/wStats/src/Makefile.in,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Makefile.in 13 Dec 2003 13:36:21 -0000 1.1
+++ Makefile.in 12 Jun 2004 11:10:31 -0000 1.2
@@ -105,6 +105,7 @@
main.c messages.h common.h \
modcmd.c modcmd.h \
mysql.c mysql.h \
+ rrdgraph.c rrdgraph.h \
statserv.c statserv.h \
proto-p10.c proto.h \
recdb.c recdb.h \
@@ -122,8 +123,9 @@
getopt.$(OBJEXT) getopt1.$(OBJEXT) gline.$(OBJEXT) \
hash.$(OBJEXT) heap.$(OBJEXT) helpfile.$(OBJEXT) \
ioset.$(OBJEXT) log.$(OBJEXT) main.$(OBJEXT) modcmd.$(OBJEXT) \
- mysql.$(OBJEXT) statserv.$(OBJEXT) proto-p10.$(OBJEXT) \
- recdb.$(OBJEXT) timeq.$(OBJEXT) tools.$(OBJEXT)
+ mysql.$(OBJEXT) rrdgraph.$(OBJEXT) statserv.$(OBJEXT) \
+ proto-p10.$(OBJEXT) recdb.$(OBJEXT) timeq.$(OBJEXT) \
+ tools.$(OBJEXT)
wstats_OBJECTS = $(am_wstats_OBJECTS)
wstats_LDFLAGS =
@@ -141,8 +143,8 @@
@AMDEP_TRUE@ ./$(DEPDIR)/log.Po ./$(DEPDIR)/main.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/modcmd.Po ./$(DEPDIR)/mysql.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/proto-p10.Po ./$(DEPDIR)/recdb.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/statserv.Po ./$(DEPDIR)/timeq.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/tools.Po
+@AMDEP_TRUE@ ./$(DEPDIR)/rrdgraph.Po ./$(DEPDIR)/statserv.Po \
+@AMDEP_TRUE@ ./$(DEPDIR)/timeq.Po ./$(DEPDIR)/tools.Po
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
@@ -210,6 +212,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mysql.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proto-p10.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/recdb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rrdgraph.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/statserv.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timeq.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tools.Po@am__quote@
Index: ioset.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/ioset.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ioset.c 13 Dec 2003 13:36:22 -0000 1.1
+++ ioset.c 12 Jun 2004 11:10:31 -0000 1.2
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: ioset.c,v 1.1 2003/12/13 13:36:22 wasted Exp $
+ * $Id: ioset.c,v 1.2 2004/06/12 11:10:31 wasted Exp $
*/
#include "hash.h"
@@ -439,4 +439,4 @@
void
ioset_set_time(unsigned long new_now) {
clock_skew = new_now - time(NULL);
-}
\ No newline at end of file
+}
Index: main.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/main.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- main.c 18 Jan 2004 16:59:19 -0000 1.2
+++ main.c 12 Jun 2004 11:10:31 -0000 1.3
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: main.c,v 1.2 2004/01/18 16:59:19 wasted Exp $
+ * $Id: main.c,v 1.3 2004/06/12 11:10:31 wasted Exp $
*/
#define PID_FILE "wstats.pid"
@@ -28,6 +28,7 @@
#include "ioset.h"
#include "modcmd.h"
#include "mysql.h"
+#include "rrdgraph.h"
#include "timeq.h"
#include "statserv.h"
@@ -449,6 +450,7 @@
if (info) init_statserv(info);
mysql_module_init();
+ rrd_module_init();
}
#ifdef HAVE_SYS_RESOURCE_H
Index: messages.h
===================================================================
RCS file: /home/cvs/wstats/wStats/src/messages.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- messages.h 13 Dec 2003 13:36:21 -0000 1.1
+++ messages.h 12 Jun 2004 11:10:31 -0000 1.2
@@ -18,13 +18,15 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: messages.h,v 1.1 2003/12/13 13:36:21 wasted Exp $
+ * $Id: messages.h,v 1.2 2004/06/12 11:10:31 wasted Exp $
*/
#ifndef _MESSAGES_H_
#define _MESSAGES_H_
#define MSG_VERSION "$b"PACKAGE_STRING"$b, Built: " __DATE__ ", " __TIME__"."
+// No Bold version.
+#define MSG_VERSIONNB PACKAGE_STRING", Built: " __DATE__ ", " __TIME__"."
#define MSG_SERVICE_PRIVILEGED "$b%s$b is a privileged service."
#define MSG_NOT_A_SERVICE "$b%s$b is not a service bot."
#define MSG_COMMAND_UNKNOWN "$b%s$b is an unknown command."
Index: statserv.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/statserv.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- statserv.c 13 Dec 2003 13:36:26 -0000 1.1
+++ statserv.c 12 Jun 2004 11:10:31 -0000 1.2
@@ -16,13 +16,14 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * $Id: statserv.c,v 1.1 2003/12/13 13:36:26 wasted Exp $
+ * $Id: statserv.c,v 1.2 2004/06/12 11:10:31 wasted Exp $
*/
#include "conf.h"
#include "gline.h"
#include "modcmd.h"
#include "mysql.h"
+#include "rrdgraph.h"
#include "statserv.h"
#include "timeq.h"
@@ -79,6 +80,7 @@
#define MSG_RAW_PARSE_ERROR "Error parsing raw line (not dumping to uplink)."
#define MSG_UPLINK_START "Uplink $b%s$b:"
#define MSG_NO_SUCH_STATS "No such stats type $b%s$b."
+#define MSG_RRDUPDATED "RRD graphs are being updated."
#define MAX_CHANNELS_WHOIS 50
@@ -95,7 +97,7 @@
unsigned char trigger_char;
} statserv_conf;
-const char *SSMSG_VERSION_ID = "$Id: statserv.c,v 1.1 2003/12/13 13:36:26 wasted Exp $";
+const char *SSMSG_VERSION_ID = "$Id: statserv.c,v 1.2 2004/06/12 11:10:31 wasted Exp $";
#define statserv_notice(target, format...) send_message(target, statserv, ## format)
#define statserv_debug(format...) do { if (statserv_conf.debug_channel) send_channel_notice(statserv_conf.debug_channel, statserv, ## format); } while (0)
@@ -605,6 +607,13 @@
return 0;
}
+static STATSERV_FUNC(cmd_rrdupdate)
+{
+ collect_graphs();
+ statserv_notice(user, MSG_RRDUPDATED);
+ return 1;
+}
+
static STATSERV_FUNC(cmd_dump)
{
char linedup[MAXLEN], *original;
@@ -753,6 +762,7 @@
modcmd_register(statserv_module, "RESTART", cmd_restart, 1);
modcmd_register(statserv_module, "SEEN", cmd_seen, 2);
modcmd_register(statserv_module, "STATS", cmd_stats, 2);
+ modcmd_register(statserv_module, "RRDUPDATE", cmd_rrdupdate, 1);
modcmd_register(statserv_module, "UPTIME", cmd_uptime, 1);
modcmd_register(statserv_module, "VERSION", cmd_version, 1);
modcmd_register(statserv_module, "WHOIS", cmd_whois, 2);
|
|
From: Martijn <wa...@we...> - 2004-06-12 12:18:13
|
wasted 2004/06/12 04:10:31 PDT
Modified files:
. configure configure.in
wstats.conf.example
Log:
Add RRDGraph functionality, bump version.
Revision Changes Path
1.3 +11 -11 wStats/configure
1.3 +2 -2 wStats/configure.in
1.2 +16 -0 wStats/wstats.conf.example
Index: configure
===================================================================
RCS file: /home/cvs/wstats/wStats/configure,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- configure 18 Jan 2004 16:59:16 -0000 1.2
+++ configure 12 Jun 2004 11:10:30 -0000 1.3
@@ -1,7 +1,7 @@
#! /bin/sh
-# From configure.in Id: configure.in,v 1.1.1.1 2003/12/13 13:36:19 wasted Exp .
+# From configure.in Id: configure.in,v 1.2 2004/01/18 16:59:16 wasted Exp .
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.57 for wstats 1.1.
+# Generated by GNU Autoconf 2.57 for wstats 1.2.
#
# Report bugs to <wst...@li...>.
#
@@ -269,8 +269,8 @@
# Identity of this package.
PACKAGE_NAME='wstats'
PACKAGE_TARNAME='wstats'
-PACKAGE_VERSION='1.1'
-PACKAGE_STRING='wstats 1.1'
+PACKAGE_VERSION='1.2'
+PACKAGE_STRING='wstats 1.2'
PACKAGE_BUGREPORT='wst...@li...'
ac_unique_file="src/statserv.c"
@@ -788,7 +788,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures wstats 1.1 to adapt to many kinds of systems.
+\`configure' configures wstats 1.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -855,7 +855,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of wstats 1.1:";;
+ short | recursive ) echo "Configuration of wstats 1.2:";;
esac
cat <<\_ACEOF
@@ -954,7 +954,7 @@
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
-wstats configure 1.1
+wstats configure 1.2
generated by GNU Autoconf 2.57
Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
@@ -969,7 +969,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by wstats $as_me 1.1, which was
+It was created by wstats $as_me 1.2, which was
generated by GNU Autoconf 2.57. Invocation command line was
$ $0 $@
@@ -1649,7 +1649,7 @@
# Define the identity of the package.
PACKAGE=wstats
- VERSION=1.1
+ VERSION=1.2
cat >>confdefs.h <<_ACEOF
@@ -8157,7 +8157,7 @@
} >&5
cat >&5 <<_CSEOF
-This file was extended by wstats $as_me 1.1, which was
+This file was extended by wstats $as_me 1.2, which was
generated by GNU Autoconf 2.57. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -8220,7 +8220,7 @@
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-wstats config.status 1.1
+wstats config.status 1.2
configured by $0, generated by GNU Autoconf 2.57,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
Index: configure.in
===================================================================
RCS file: /home/cvs/wstats/wStats/configure.in,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- configure.in 18 Jan 2004 16:59:16 -0000 1.2
+++ configure.in 12 Jun 2004 11:10:31 -0000 1.3
@@ -1,6 +1,6 @@
-AC_REVISION([$Id: configure.in,v 1.2 2004/01/18 16:59:16 wasted Exp $])
+AC_REVISION([$Id: configure.in,v 1.3 2004/06/12 11:10:31 wasted Exp $])
AC_PREREQ(2.53)
-AC_INIT(wstats, 1.1, wst...@li...)
+AC_INIT(wstats, 1.2, wst...@li...)
AM_CONFIG_HEADER(src/config.h)
AC_CONFIG_SRCDIR(src/statserv.c)
Index: wstats.conf.example
===================================================================
RCS file: /home/cvs/wstats/wStats/wstats.conf.example,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- wstats.conf.example 13 Dec 2003 13:36:21 -0000 1.1
+++ wstats.conf.example 12 Jun 2004 11:10:31 -0000 1.2
@@ -62,6 +62,22 @@
"history_interval" "1d";
};
+// RRDTool graphs
+"rrdgraphs" {
+ // is this module active?
+ "active" "1";
+ // where should wStats put your graph files/rrd file?
+ "output_dir" "/home/services/public_html";
+ // how often do we update them?
+ "graph_update" "5m";
+ // Where is the RRTool located?
+ "rrd_path" "/usr/local/bin/rrdtool";
+ // your network name?
+ "servername" "Irc.WhatNET.Org";
+ // don't process the local users of the following servers
+ "ignore_servers" ("WhatNET.wStats", "Network.Services", "Other.Services");
+};
+
"rlimits" {
"data" "50M";
"stack" "6M";
|
|
From: Martijn <wa...@we...> - 2004-04-10 18:04:03
|
wasted 2004/04/10 09:57:14 PDT wStats-pgsql - Imported sources Update of /home/cvs/wstats/wStats-pgsql In directory web.clandemonium.net:/tmp/cvs-serv52543 Log Message: Initial import of pgsql wStats. Status: Vendor Tag: vendor Release Tags: start N wStats-pgsql/Makefile.in N wStats-pgsql/README N wStats-pgsql/autogen.sh N wStats-pgsql/compile N wStats-pgsql/config.guess N wStats-pgsql/config.sub N wStats-pgsql/configure N wStats-pgsql/configure.in N wStats-pgsql/depcomp N wStats-pgsql/install-sh N wStats-pgsql/ltmain.sh N wStats-pgsql/missing N wStats-pgsql/mkinstalldirs N wStats-pgsql/wstats.conf.example N wStats-pgsql/wstats.sql N wStats-pgsql/AUTHORS N wStats-pgsql/ChangeLog N wStats-pgsql/INSTALL N wStats-pgsql/Makefile.am N wStats-pgsql/src/Makefile.am N wStats-pgsql/src/Makefile.in N wStats-pgsql/src/common.h N wStats-pgsql/src/compat.c N wStats-pgsql/src/compat.h N wStats-pgsql/src/conf.c N wStats-pgsql/src/conf.h N wStats-pgsql/src/config.h.in N wStats-pgsql/src/dict-splay.c N wStats-pgsql/src/dict.h N wStats-pgsql/src/expnhelp.c N wStats-pgsql/src/getopt.c N wStats-pgsql/src/getopt.h N wStats-pgsql/src/getopt1.c N wStats-pgsql/src/gline.c N wStats-pgsql/src/gline.h N wStats-pgsql/src/hash.c N wStats-pgsql/src/hash.h N wStats-pgsql/src/heap.c N wStats-pgsql/src/heap.h N wStats-pgsql/src/helpfile.c N wStats-pgsql/src/helpfile.h N wStats-pgsql/src/ioset.c N wStats-pgsql/src/ioset.h N wStats-pgsql/src/log.c N wStats-pgsql/src/log.h N wStats-pgsql/src/main.c N wStats-pgsql/src/modcmd.c N wStats-pgsql/src/modcmd.h N wStats-pgsql/src/pgsql.h N wStats-pgsql/src/proto-common.c N wStats-pgsql/src/proto-p10.c N wStats-pgsql/src/proto.h N wStats-pgsql/src/recdb.c N wStats-pgsql/src/recdb.h N wStats-pgsql/src/statserv.c N wStats-pgsql/src/statserv.h N wStats-pgsql/src/statserv.help N wStats-pgsql/src/timeq.c N wStats-pgsql/src/timeq.h N wStats-pgsql/src/tools.c N wStats-pgsql/src/messages.h N wStats-pgsql/src/pgsql.c N wStats-pgsql/scripts/README N wStats-pgsql/rx/COPYING.LIB N wStats-pgsql/rx/ChangeLog N wStats-pgsql/rx/Makefile.am N wStats-pgsql/rx/Makefile.in N wStats-pgsql/rx/_rx.h N wStats-pgsql/rx/compile N wStats-pgsql/rx/depcomp N wStats-pgsql/rx/hashrexp.c N wStats-pgsql/rx/inst-rxposix.h N wStats-pgsql/rx/rx.c N wStats-pgsql/rx/rx.h N wStats-pgsql/rx/rxall.h N wStats-pgsql/rx/rxanal.c N wStats-pgsql/rx/rxanal.h N wStats-pgsql/rx/rxbasic.c N wStats-pgsql/rx/rxbasic.h N wStats-pgsql/rx/rxbitset.c N wStats-pgsql/rx/rxbitset.h N wStats-pgsql/rx/rxcontext.h N wStats-pgsql/rx/rxcset.c N wStats-pgsql/rx/rxcset.h N wStats-pgsql/rx/rxdbug.c N wStats-pgsql/rx/rxgnucomp.c N wStats-pgsql/rx/rxgnucomp.h N wStats-pgsql/rx/rxnfa.c N wStats-pgsql/rx/rxhash.c N wStats-pgsql/rx/rxhash.h N wStats-pgsql/rx/rxnfa.h N wStats-pgsql/rx/rxnode.c N wStats-pgsql/rx/rxnode.h N wStats-pgsql/rx/rxposix.c N wStats-pgsql/rx/rxposix.h N wStats-pgsql/rx/rxproto.h N wStats-pgsql/rx/rxsimp.c N wStats-pgsql/rx/rxsimp.h N wStats-pgsql/rx/rxspencer.c N wStats-pgsql/rx/rxspencer.h N wStats-pgsql/rx/rxstr.c N wStats-pgsql/rx/rxsuper.c N wStats-pgsql/rx/rxsuper.h N wStats-pgsql/rx/rxunfa.c N wStats-pgsql/rx/rxunfa.h N wStats-pgsql/rx/rxstr.h No conflicts created by this import |
|
From: wasted <wa...@fi...> - 2004-02-22 10:50:22
|
wasted 2004/02/22 04:47:04 CST
Modified files:
src modcmd.c
Log:
Forgot one. :\
Revision Changes Path
1.4 +2 -2 wStats/src/modcmd.c
Index: modcmd.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/modcmd.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- modcmd.c 22 Feb 2004 10:44:15 -0000 1.3
+++ modcmd.c 22 Feb 2004 10:47:03 -0000 1.4
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: modcmd.c,v 1.3 2004/02/22 10:44:15 wasted Exp $
+ * $Id: modcmd.c,v 1.4 2004/02/22 10:47:03 wasted Exp $
*/
#include "conf.h"
@@ -395,7 +395,7 @@
struct module *module;
for (ii = 0; def_binds[ii].svcname; ++ii) {
- sprintf(buf, "statserv/nick", def_binds[ii].svcname);
+ sprintf(buf, "statserv/nick");
if (!(nick = conf_get_data(buf, RECDB_QSTRING))) continue;
if (!(service = service_find(nick))) continue;
if (dict_size(service->commands) > 0) continue;
|
|
From: wasted <wa...@fi...> - 2004-02-22 10:47:39
|
wasted 2004/02/22 04:44:15 CST
Modified files:
src modcmd.c
Log:
Squish compile warning.
Revision Changes Path
1.3 +2 -2 wStats/src/modcmd.c
Index: modcmd.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/modcmd.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- modcmd.c 31 Dec 2003 20:15:43 -0000 1.2
+++ modcmd.c 22 Feb 2004 10:44:15 -0000 1.3
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: modcmd.c,v 1.2 2003/12/31 20:15:43 wasted Exp $
+ * $Id: modcmd.c,v 1.3 2004/02/22 10:44:15 wasted Exp $
*/
#include "conf.h"
@@ -326,7 +326,7 @@
struct timeval start, stop;
if (!statserv_module->helpfile_name) {
- send_message(user, bot, MCMSG_NO_HELPFILE, statserv_module->name);
+ send_message(user, bot, MCMSG_NO_HELPFILE);
return;
}
old_helpfile = statserv_module->helpfile;
|
|
From: wasted <wa...@fi...> - 2004-01-18 16:53:46
|
wasted 2004/01/18 10:59:18 CST
Added files:
scripts README chaninfo.php channels.php
functions.php seen.php squits.php
Log:
Add some PHP example scripts and bump up the version for a release.
Revision Changes Path
1.1 +3 -0 wStats/scripts/README (new)
1.1 +62 -0 wStats/scripts/chaninfo.php (new)
1.1 +98 -0 wStats/scripts/channels.php (new)
1.1 +204 -0 wStats/scripts/functions.php (new)
1.1 +42 -0 wStats/scripts/seen.php (new)
1.1 +75 -0 wStats/scripts/squits.php (new)
Index: README
====================================================================
The scripts in this directory are here to help give a webmaster
the idea of whats possible with the wStats database, no support
is given for them.
Index: chaninfo.php
====================================================================
<?
include"functions.php";
// Change the host, user and password.
$dbstats = mysql_connect("wstats.mysql.host", "youruser", "yourpassword");
if(!$dbstats) {
die("Sorry, the connection to the server cannot be made! (".mysql_error().")");
}
else {
// Change the database if needed aswell.
mysql_select_db("wStats", $dbstats) or die("Failed the select database: ".mysql_error());
}
if($_GET['channel'])
{
$channel = "#".mysql_real_escape_string($_GET['channel']);
$sql = mysql_query("SELECT topic, topicby, topicon, modes, climit, users FROM channels WHERE cname = '".$channel."'");
if(!mysql_num_rows($sql))
{
echo"<center>No such channel!</center>";
}
else {
echo"<table align=\"center\">
<tr><td colspan=2 align=\"center\"><b>".$channel."</b></td></tr>";
list($topic, $topicby, $topicon, $modes, $limit, $users) = mysql_fetch_row($sql);
if(!$limit) unset($limit);
if($topic) echo"<tr><td colspan=2>Topic: ".irctext(stripslashes($topic), 15, 15)." set on ".date("H/m/d H:i:s", $topicon)." by ".stripslashes($topicby)."</td></tr>
<tr>
<td colspan=2> </td>
</tr>
<tr>
<td colspan=2>Modes: ".$modes." ".$limit."</td>
</tr>
<tr>
<td colspan=2>Users: ".$users."</td>
</tr>
<tr>
<td colspan=2> </td>
</tr>
<tr>
<td colspan=2 align=\"center\"><b>Users:</b></td>
</tr>";
$sql = mysql_query("SELECT nickname, status FROM userlists WHERE cname = '".$channel."' ORDER BY status DESC");
while($usr = mysql_fetch_row($sql))
{
echo"<tr><td>".get_status($usr[1]).$usr[0]."</td></tr>";
}
echo"</table>";
}
}
else {
echo"<center>Please call this file with ?channel=channel (without a #)</center>";
}
?>
Index: channels.php
====================================================================
<?
include"functions.php";
// Change the host, user and password.
$dbstats = mysql_connect("wstats.mysql.host", "youruser", "yourpassword");
if(!$dbstats) {
die("Sorry, the connection to the server cannot be made! (".mysql_error().")");
}
else {
// Change the database if needed aswell.
mysql_select_db("wStats", $dbstats) or die("Failed the select database: ".mysql_error());
}
?>
<h2>Channel search</h2>
<form method="post">
<table>
<tr>
<td>Channel:</td>
<td><input type="text" name="channel" value="<?=$_POST['channel']?>" class="editbox"></td>
</tr>
<tr>
<td>Sort by:</td>
<td>
<select name="sortby" class="editbox">
<option <? if($_POST['sortby'] == "Users") { echo "selected"; } ?>>Users</option>
<option <? if($_POST['sortby'] == "Name") { echo "selected"; } ?>>Name</option>
<option <? if($_POST['sortby'] == "Topic timestamp") { echo "selected"; } ?>>Topic timestamp</opion>
</select>
</td>
</tr>
<tr>
<td> </td>
<td><input type="checkbox" name="showpub" value="1" <? if($_POST['showpub']) echo"checked";?>>Show topics in +p channels</td>
</tr>
<tr>
<td> </td>
<td><input type="checkbox" name="showsecret" value="1" <? if($_POST['showsecret']) echo"checked";?>>Show +s channels</td>
</tr>
<tr>
<td colspan=2> </td>
</tr>
<tr>
<td colspan=2><input type="submit" value="Search" class="editbox"></td>
</tr>
</table>
</form>
<?
if($_POST['channel']) {
echo"<br><hr>";
if($_POST['showsecret']) $where = "WHERE";
else $where = "WHERE issecret = 0 AND";
$channel = addslashes($_POST['channel']);
if($_POST['sortby'] == "Users") {
$sql = mysql_query("SELECT cname, modes, topic, users, isprivate FROM channels ".$where." cname LIKE '%".$channel."%' ORDER BY users DESC");
}
elseif($_POST['sortby'] == "Name") {
$sql = mysql_query("SELECT cname, modes, topic, users, isprivate FROM channels ".$where." cname LIKE '%".$channel."%' ORDER BY cname ASC");
}
elseif($_POST['sortby'] == "Topic timestamp") {
$sql = mysql_query("SELECT cname, modes, topic, users, isprivate FROM channels ".$where." cname LIKE '%".$channel."%' ORDER BY topicon DESC");
}
if(!mysql_num_rows($sql)) {
echo"No channels found.<br><br>";
}
else {
?>
<table align="center">
<tr bgcolor="#000000">
<td><font color="#ffffff"><b>Channel</b></font></td>
<td><font color="#ffffff"><b>Users</b></font></td>
<td><font color="#ffffff"><b>Modes</b></font></td>
<td><font color="#ffffff"><b>Topic</b></font></td>
</tr>
<?
while($chan = mysql_fetch_row($sql)) {
echo"<tr>
<td>".stripslashes($chan[0])."</td>
<td>".$chan[3]."</td>
<td>".$chan[1]."</td>
<td>";
if($chan[4] != 1 || $_POST['showpub'])
{
echo irctext(stripslashes($chan[2]), 15, 15);
}
else {
echo" ";
}
echo"</td></tr>";
}
?></table><?
}
}
?>
Index: functions.php
====================================================================
<?
function calcElapsedTime($time)
{
$diff = time()-$time;
$daysDiff = floor($diff/60/60/24);
$diff -= $daysDiff*60*60*24;
$hrsDiff = floor($diff/60/60);
$diff -= $hrsDiff*60*60;
$minsDiff = floor($diff/60);
$diff -= $minsDiff*60;
$secsDiff = $diff;
return $daysDiff.'d '.$hrsDiff.'h '.$minsDiff.'m '.$secsDiff.'s ago';
}
function isnumber($x)
{
if (($x == "0") || ($x == "1") || ($x == "2") ||
($x == "3") || ($x == "4") || ($x == "5") ||
($x == "6") || ($x == "7") || ($x == "8") ||
($x == "9"))
{
return 1;
}
return 0;
}
function colourof($x, $fgbg = "fg", $fgx = -1, $bgx = -1)
{
if ($x > 15 && $x < 99) $x = $x % 16;
if ($x == 0) return "white";
if ($x == 1) return "black";
if ($x == 2) return "darkblue";
if ($x == 3) return "darkgreen";
if ($x == 4) return "red";
if ($x == 5) return "maroon";
if ($x == 6) return "purple";
if ($x == 7) return "orange";
if ($x == 8) return "yellow";
if ($x == 9) return "lime";
if ($x == 10) return "teal";
if ($x == 11) return "cyan";
if ($x == 12) return "blue";
if ($x == 13) return "pink";
if ($x == 14) return "darkgray";
if ($x == 15) return "lightgray";
if ($fgx == -1) $fgx = "black";
if ($bgx == -1) $bgx = "white";
if ($fgbg == "fg") return $fgx;
if ($fgbg == "bg") return $bgx;
}
function irctext($x, $fgx = "99", $bgx = "99")
{
$z = "";
$bold = 0;
$underline = 0;
$colour = 0;
$reverse = 0;
$fg = $fgx;
$bg = $bgx;
for ($i = 0; $i < strlen($x); $i++)
{
if (substr($x, $i, 1) == chr(3)) {
if ($colour == 7 && !$reverse) { $z .= "</font>"; }
$colour = 1;
}
elseif ($colour == 1) {
if (isnumber(substr($x, $i, 1))) {
$colour++;
$fg = substr($x, $i, 1);
$comma = 0;
}
else {
$colour = 0;
$fg = $fgx;
$bg = $bgx;
}
}
elseif ($colour == 2) {
if (isnumber(substr($x, $i, 1))) {
$colour++;
$fg .= substr($x, $i, 1);
$comma = 0;
}
elseif (substr($x, $i, 1) == ",") {
$colour++;
$comma = 1;
}
else {
$colour = 7;
if (!$reverse) $z .= "<font color=\"".colourof($fg, "fg", $fgz, $bgx)."\" style=\"background:".colourof($bg, "bg")."\">";
}
}
elseif ($colour == 3) {
if (isnumber(substr($x, $i, 1)) && $comma) {
$colour++;
$bg = substr($x, $i, 1);
$comma = 0;
}
elseif (substr($x, $i, 1) == ",") {
$colour++;
$comma = 1;
}
else {
$colour = 7;
if (!$reverse) $z .= "<font color=\"".colourof($fg, "fg", $fgz, $bgx)."\" style=\"background:".colourof($bg, "bg")."\">";
if ($comma) $z .= ",";
}
}
elseif ($colour == 4) {
if (isnumber(substr($x, $i, 1))) {
$colour++;
$bg .= substr($x, $i, 1);
if ($comma) $bg = substr($x, $i, 1);
}
else {
$colour = 7;
if (!$reverse) $z .= "<font color=\"".colourof($fg, "fg", $fgz, $bgx)."\" style=\"background:".colourof($bg, "bg")."\">";
if ($comma) $z .= ",";
}
}
elseif ($colour == 5) {
if (isnumber(substr($x, $i, 1))) {
$bg .= substr($x, $i, 1);
$colour++;
}
else {
$colour = 7;
if (!$reverse) $z .= "<font color=\"".colourof($fg,"fg",$fgz,$bgx)."\" style=\"background:".colourof($bg,"bg")."\">";
}
}
elseif ($colour == 6) {
$colour++;
if (!$reverse) $z .= "<font color=\"".colourof($fg,"fg",$fgz,$bgx)."\" style=\"background:".colourof($bg,"bg")."\">";
}
if (substr($x, $i, 1) == chr(2)) {
if ($bold) {
$z .= "</b>";
$bold = 0;
}
else {
$z .= "<b>";
$bold = 1;
}
}
elseif (substr($x, $i, 1) == chr(31)) {
if ($underline) {
$z .= "</u>";
$underline = 0;
}
else {
$z .= "<u>";
$underline = 1;
}
}
elseif (substr($x, $i, 1) == chr(22)) {
if ($reverse) {
$z .= "</font>";
if ($colour == 7) $z .= "<font color=\"".colourof($fg, "fg", $fgx, $bgx)."\" style=\"background:".colourof($bg, "bg", $fgx, $bgx)."\">";
$reverse = 0;
}
else {
if ($colour == 7) $z .= "</font>";
$z .= "<font color=\"".colourof(99, "bg")."\" style=\"background:".colourof(99, "fg")."\">";
$reverse = 1;
}
}
elseif (substr($x, $i, 1) == chr(15)) {
if ($bold) $z .= "</b>";
if ($underline) $z .= "</u>";
if ($colour == 7 AND !$reverse) $z .= "</font>";
if ($reverse) $z .= "</font>";
$bold = 0; $colour = 0; $underline = 0;
$reverse = 0; $fg = $fgx; $bg = $bgx;
}
elseif (substr($x, $i, 1) != chr(3) AND ($colour == 0 OR ($colour == 1 AND !isnumber(substr($x, $i, 1))) OR $colour == 7)) {
$z .= htmlentities(substr($x, $i, 1));
}
}
if ($bold) $z .= "</b>";
if ($underline) $z .= "</u>";
if ($colour == 7 AND !$reverse) $z .= "</font>";
if ($reverse) $z .= "</font>";
return $z;
}
function get_status($status)
{
switch($status)
{
case 2:
return "@";
break;
case 1:
return "+";
break;
}
}
?>
Index: seen.php
====================================================================
<?
include"functions.php";
// Change the host, user and password.
$dbstats = mysql_connect("wstats.mysql.host", "youruser", "yourpassword");
if(!$dbstats) {
die("Sorry, the connection to the server cannot be made! (".mysql_error().")");
}
else {
// Change the database if needed aswell.
mysql_select_db("wStats", $dbstats) or die("Failed the select database: ".mysql_error());
}
?>
<center>
See how long ago it was a nickname was used.<br><br>
<form method="post">
<table width="50%" align="center">
<tr>
<td>Nickname:</td>
<td><input type="text" name="seennick" class="editbox"></td>
</tr>
<tr>
<td colspan=2 align="center"><input type="submit" value="Go!" class="editbox"></td>
</tr>
</table>
</form>
<?
if(!empty($_POST['seennick'])) {
echo"<br><hr><br><br>";
$nick = addslashes($_POST['seennick']);
$sql = mysql_query("SELECT nickname, lastused FROM seen WHERE nickname = '".$nick."'");
if(!mysql_num_rows($sql)) {
echo"The nickname <b>".$nick."</b> has not been recorded being used, sorry.";
}
else {
list($nickname, $lastused) = mysql_fetch_row($sql);
echo"The nickname <b>".stripslashes($nickname)."</b> was last used on ".date("Y-m-d", $lastused)." at ".date("H:i:s", $lastused).", ".calcElapsedTime($lastused)."<br><br>";
}
}
?>
</center>
Index: squits.php
====================================================================
<?
include"functions.php";
// Change the host, user and password.
$dbstats = mysql_connect("wstats.mysql.host", "youruser", "yourpassword");
if(!$dbstats) {
die("Sorry, the connection to the server cannot be made! (".mysql_error().")");
}
else {
// Change the database if needed aswell.
mysql_select_db("wStats", $dbstats) or die("Failed the select database: ".mysql_error());
}
?>
<form method="post">Show only:
<select name="order" onchange="this.form.submit();">
<option value="All">All</option>
<?
$sql = mysql_query("SELECT mask FROM servers ORDER BY mask");
while($serv = mysql_fetch_row($sql))
{
$selected = "";
if($_POST['order'] == $serv[0]) $selected = " selected";
echo"<option value=\"".$serv[0]."\"".$selected.">".$serv[0]."</option>";
}
?>
</select>
</form>
<center>
<?
if(isset($_POST['order']) && $_POST['order'] != "All") {
$sql = mysql_query("SELECT ts, split_server, reason, hub FROM splits WHERE split_server = '".$_POST['order']."' ORDER BY id DESC");
}
else {
$sql = mysql_query("SELECT ts, split_server, reason, hub FROM splits ORDER BY id DESC");
}
if(!mysql_num_rows($sql)) {
if(isset($_POST['order'])) {
echo"No *.net *.splits recorded for ".$_POST['order'];
}
else {
echo"No *.net *.splits recorded.";
}
}
else {
?>
<table border=1 bordercolor="#000000" width="90%" align="center">
<tr>
<td width="20%" align="center" bgcolor="#000000"><font color="#ffffff"><B>Date</B></font></td>
<td width="15%" align="center" bgcolor="#000000"><font color="#ffffff"><B>Hub</B></font></td>
<td width="15%" align="center" bgcolor="#000000"><font color="#ffffff"><B>Split</B></font></td>
<td width="50%" align="center" bgcolor="#000000"><font color="#ffffff"><B>Reason</B></font></td>
</tr>
<?
while($split = mysql_fetch_row($sql)) {
$split[0] = date("H:i:s d-m-Y T", $split[0]);
echo"<tr>
<td width=\"20%\" align=\"center\">".$split[0]."</td>
<td width=\"20%\" align=\"center\">".$split[3]."</td>
<td width=\"20%\" align=\"center\">".$split[1]."</td>
<td width=\"60%\" align=\"center\">".$split[2]."</td>
</tr>
";
}
?>
</table>
<br><br>
<?
$rows = mysql_num_rows($sql);
echo "$rows squits logged.";
}
?>
</center>
|
|
From: wasted <wa...@fi...> - 2004-01-18 16:53:45
|
wasted 2004/01/18 10:59:17 CST
Modified files:
. configure configure.in
Log:
Add some PHP example scripts and bump up the version for a release.
Revision Changes Path
1.2 +11 -11 wStats/configure
1.2 +2 -2 wStats/configure.in
Index: configure
===================================================================
RCS file: /home/cvs/wstats/wStats/configure,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- configure 13 Dec 2003 13:36:19 -0000 1.1
+++ configure 18 Jan 2004 16:59:16 -0000 1.2
@@ -1,7 +1,7 @@
#! /bin/sh
-# From configure.in Id: configure.in,v 1.2 2003/11/29 12:59:00 wasted Exp .
+# From configure.in Id: configure.in,v 1.1.1.1 2003/12/13 13:36:19 wasted Exp .
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.57 for wstats 1.0.
+# Generated by GNU Autoconf 2.57 for wstats 1.1.
#
# Report bugs to <wst...@li...>.
#
@@ -269,8 +269,8 @@
# Identity of this package.
PACKAGE_NAME='wstats'
PACKAGE_TARNAME='wstats'
-PACKAGE_VERSION='1.0'
-PACKAGE_STRING='wstats 1.0'
+PACKAGE_VERSION='1.1'
+PACKAGE_STRING='wstats 1.1'
PACKAGE_BUGREPORT='wst...@li...'
ac_unique_file="src/statserv.c"
@@ -788,7 +788,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures wstats 1.0 to adapt to many kinds of systems.
+\`configure' configures wstats 1.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -855,7 +855,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of wstats 1.0:";;
+ short | recursive ) echo "Configuration of wstats 1.1:";;
esac
cat <<\_ACEOF
@@ -954,7 +954,7 @@
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
-wstats configure 1.0
+wstats configure 1.1
generated by GNU Autoconf 2.57
Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
@@ -969,7 +969,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by wstats $as_me 1.0, which was
+It was created by wstats $as_me 1.1, which was
generated by GNU Autoconf 2.57. Invocation command line was
$ $0 $@
@@ -1649,7 +1649,7 @@
# Define the identity of the package.
PACKAGE=wstats
- VERSION=1.0
+ VERSION=1.1
cat >>confdefs.h <<_ACEOF
@@ -8157,7 +8157,7 @@
} >&5
cat >&5 <<_CSEOF
-This file was extended by wstats $as_me 1.0, which was
+This file was extended by wstats $as_me 1.1, which was
generated by GNU Autoconf 2.57. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -8220,7 +8220,7 @@
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-wstats config.status 1.0
+wstats config.status 1.1
configured by $0, generated by GNU Autoconf 2.57,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
Index: configure.in
===================================================================
RCS file: /home/cvs/wstats/wStats/configure.in,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- configure.in 13 Dec 2003 13:36:19 -0000 1.1
+++ configure.in 18 Jan 2004 16:59:16 -0000 1.2
@@ -1,6 +1,6 @@
-AC_REVISION([$Id: configure.in,v 1.1 2003/12/13 13:36:19 wasted Exp $])
+AC_REVISION([$Id: configure.in,v 1.2 2004/01/18 16:59:16 wasted Exp $])
AC_PREREQ(2.53)
-AC_INIT(wstats, 1.0, wst...@li...)
+AC_INIT(wstats, 1.1, wst...@li...)
AM_CONFIG_HEADER(src/config.h)
AC_CONFIG_SRCDIR(src/statserv.c)
|
|
From: wasted <wa...@fi...> - 2004-01-18 16:53:45
|
wasted 2004/01/18 10:59:19 CST
Modified files:
src main.c
Log:
Add some PHP example scripts and bump up the version for a release.
Revision Changes Path
1.2 +2 -2 wStats/src/main.c
Index: main.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/main.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- main.c 13 Dec 2003 13:36:23 -0000 1.1
+++ main.c 18 Jan 2004 16:59:19 -0000 1.2
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: main.c,v 1.1 2003/12/13 13:36:23 wasted Exp $
+ * $Id: main.c,v 1.2 2004/01/18 16:59:19 wasted Exp $
*/
#define PID_FILE "wstats.pid"
@@ -542,7 +542,7 @@
void version() {
printf(" --------------------------------------------------\n"
" - "PACKAGE_STRING", Built: " __DATE__ ", " __TIME__".\n"
- " - Copyright (C) 2003, wStats Development\n"
+ " - Copyright (C) 2003-2004, wStats Development\n"
" --------------------------------------------------\n");
}
|
|
From: wasted <wa...@fi...> - 2003-12-31 20:13:15
|
wasted 2003/12/31 14:15:43 CST
Modified files:
src modcmd.c
Log:
Fix ugly core on /msg StatServ command #channel.
Revision Changes Path
1.2 +9 -1 wStats/src/modcmd.c
Index: modcmd.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/modcmd.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- modcmd.c 13 Dec 2003 13:36:24 -0000 1.1
+++ modcmd.c 31 Dec 2003 20:15:43 -0000 1.2
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: modcmd.c,v 1.1 2003/12/13 13:36:24 wasted Exp $
+ * $Id: modcmd.c,v 1.2 2003/12/31 20:15:43 wasted Exp $
*/
#include "conf.h"
@@ -158,6 +158,14 @@
argv[1] = argv[0];
argv[0] = tmp;
}
+
+ if ((argc > 1) && IsChannelName(argv[1])
+ && (channel = dict_find(channels, argv[1], NULL)))
+ {
+ argv[1] = argv[0];
+ argv++, argc--;
+ cmd_arg = 1;
+ }
if (argc < cmd->command->min_argc) {
send_message(user, service->bot, MSG_MISSING_PARAMS, cmd->name);
|
|
From: wasted <wa...@fi...> - 2003-12-29 20:39:08
|
wasted 2003/12/29 14:41:16 CST
Modified files:
src mysql.c
Log:
Add lame, but possible fix for cores related to mysql_real_escape_string()
Revision Changes Path
1.3 +7 -1 wStats/src/mysql.c
Index: mysql.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/mysql.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- mysql.c 22 Dec 2003 08:54:21 -0000 1.2
+++ mysql.c 29 Dec 2003 20:41:16 -0000 1.3
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * $Id: mysql.c,v 1.2 2003/12/22 08:54:21 wasted Exp $
+ * $Id: mysql.c,v 1.3 2003/12/29 20:41:16 wasted Exp $
*/
#include <mysql/mysql.h>
@@ -150,6 +150,12 @@
addslashes(char *str)
{
char *out;
+
+ if((strchr(str, '\\') == NULL) && (strchr(str, '\'') == NULL)
+ && (strchr(str, '\"') == NULL))
+ {
+ return str;
+ }
if(str)
{
|
|
From: wasted <wa...@fi...> - 2003-12-24 08:30:05
|
wasted 2003/12/24 02:30:35 CST
Modified files:
src gline.c
Log:
revise gline system
Revision Changes Path
1.3 +181 -89 wStats/src/gline.c
Index: gline.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/gline.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- gline.c 22 Dec 2003 08:54:21 -0000 1.2
+++ gline.c 24 Dec 2003 08:30:35 -0000 1.3
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: gline.c,v 1.2 2003/12/22 08:54:21 wasted Exp $
+ * $Id: gline.c,v 1.3 2003/12/24 08:30:35 wasted Exp $
*/
#include "heap.h"
@@ -28,93 +28,185 @@
#include "gline.h"
#include "mysql.h"
-static dict_t gline_dict; /* key: target, data: struct gline* */
-
-static void
-free_gline_from_dict(void *data)
-{
- struct gline *ent = data;
- free(ent->issuer);
- free(ent->target);
- free(ent->reason);
- free(ent);
-}
-
-static void
-expire_gline(void *data)
-{
- struct gline *ex_gline = data;
-
- if(dict_find(gline_dict, ex_gline->target, NULL))
- {
- dict_remove(gline_dict, ex_gline->target);
- free(ex_gline);
- }
-}
-
-int
-gline_remove(const char *target)
-{
- struct gline *ex_gline;
-
- if((ex_gline = dict_find(gline_dict, target, NULL)))
- {
- dict_remove(gline_dict, target);
- timeq_del(0, expire_gline, ex_gline, TIMEQ_IGNORE_WHEN);
- free(ex_gline);
- return 1;
- }
-
- return 0;
-}
-
-struct gline *
-gline_add(const char *issuer, const char *target, unsigned long duration, const char *reason, time_t issued)
-{
- struct gline *newgline;
-
- if(dict_find(gline_dict, target, NULL))
- {
- dict_remove(gline_dict, target);
- }
-
- /* If the duration is in the minus, stop */
- if(duration <= 0) return NULL;
-
- newgline = calloc(1, sizeof(*newgline));
- newgline->expires = now + duration;
- newgline->issued = issued;
- newgline->issuer = strdup(issuer);
- newgline->reason = strdup(reason);
- newgline->target = strdup(target);
-
- dict_insert(gline_dict, newgline->target, newgline);
-
- if(duration) {
- timeq_add(newgline->expires, expire_gline, newgline);
- }
-
- return newgline;
-}
-
-unsigned int
-gline_count(void)
-{
- return dict_size(gline_dict);
-}
-
-static void
-gline_db_cleanup(void)
-{
- dict_delete(gline_dict);
-}
-
-void
-gline_init(void)
-{
- gline_dict = dict_new();
- dict_set_free_data(gline_dict, free_gline_from_dict);
- reg_exit_func(gline_db_cleanup);
+static heap_t gline_heap; /* key: expiry time, data: struct gline_entry* */
+static dict_t gline_dict; /* key: target, data: struct gline_entry* */
+
+static int
+gline_comparator(const void *a, const void *b)
+{
+ const struct gline *ga=a, *gb=b;
+ return ga->expires - gb->expires;
+}
+
+static void
+free_gline_from_dict(void *data)
+{
+ struct gline *ent = data;
+ free(ent->issuer);
+ free(ent->target);
+ free(ent->reason);
+ free(ent);
+}
+
+static void
+free_gline(struct gline *ent)
+{
+ dict_remove(gline_dict, ent->target);
+}
+
+static int
+gline_for_p(UNUSED_ARG(void *key), void *data, void *extra)
+{
+ struct gline *ge = data;
+ return !irccasecmp(ge->target, extra);
+}
+
+static int
+delete_gline_for_p(UNUSED_ARG(void *key), void *data, void *extra)
+{
+ struct gline *ge = data;
+
+ if (!irccasecmp(ge->target, extra))
+ {
+ free_gline(ge);
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+static void
+gline_expire(UNUSED_ARG(void *data))
+{
+ time_t stopped;
+ void *wraa;
+
+ stopped = 0;
+ while (heap_size(gline_heap))
+ {
+ heap_peek(gline_heap, 0, &wraa);
+ stopped = ((struct gline*)wraa)->expires;
+ if (stopped > now)
+ {
+ break;
+ }
+ heap_pop(gline_heap);
+ free_gline(wraa);
+ }
+ if (heap_size(gline_heap))
+ {
+ timeq_add(stopped, gline_expire, NULL);
+ }
+}
+
+int
+gline_remove(const char *target)
+{
+ int res = dict_find(gline_dict, target, NULL) ? 1 : 0;
+ if (heap_remove_pred(gline_heap, delete_gline_for_p, (char*)target))
+ {
+ void *argh;
+ struct gline *new_first;
+ heap_peek(gline_heap, 0, &argh);
+ if (argh)
+ {
+ new_first = argh;
+ timeq_del(0, gline_expire, 0, TIMEQ_IGNORE_WHEN|TIMEQ_IGNORE_DATA);
+ timeq_add(new_first->expires, gline_expire, 0);
+ }
+ }
+
+ return res;
+}
+
+struct gline *
+gline_add(const char *issuer, const char *target, unsigned long duration, const char *reason, time_t issued)
+{
+ struct gline *ent;
+ struct gline *prev_first;
+ void *argh;
+
+ heap_peek(gline_heap, 0, &argh);
+ prev_first = argh;
+ ent = dict_find(gline_dict, target, NULL);
+ if (ent)
+ {
+ heap_remove_pred(gline_heap, gline_for_p, (char*)target);
+ if (ent->expires < (time_t)(now + duration))
+ {
+ ent->expires = now + duration;
+ }
+ }
+ else {
+ ent = malloc(sizeof(*ent));
+ ent->issued = issued;
+ ent->issuer = strdup(issuer);
+ ent->target = strdup(target);
+ ent->expires = now + duration;
+ ent->reason = strdup(reason);
+ dict_insert(gline_dict, ent->target, ent);
+ }
+ heap_insert(gline_heap, ent, ent);
+ if (!prev_first || (ent->expires < prev_first->expires))
+ {
+ timeq_del(0, gline_expire, 0, TIMEQ_IGNORE_WHEN|TIMEQ_IGNORE_DATA);
+ timeq_add(ent->expires, gline_expire, 0);
+ }
+
+ return ent;
+}
+
+struct gline *
+gline_find(const char *target)
+{
+ struct gline *res;
+ dict_iterator_t it;
+
+ res = dict_find(gline_dict, target, NULL);
+ if (res)
+ {
+ return res;
+ }
+ /* Stock ircu requires BADCHANs to match exactly. */
+ if ((target[0] == '#') || (target[0] == '&'))
+ {
+ return NULL;
+ }
+ else {
+ /* Otherwise, do an obnoxiously long search. */
+ for (it = dict_first(gline_dict); it; it = iter_next(it))
+ {
+ res = iter_data(it);
+ if (match_ircglob(target, res->target))
+ {
+ return res;
+ }
+ }
+ }
+ return NULL;
+}
+
+unsigned int
+gline_count(void)
+{
+ return dict_size(gline_dict);
+}
+
+static void
+gline_db_cleanup(void)
+{
+ heap_delete(gline_heap);
+ dict_delete(gline_dict);
+}
+
+void
+gline_init(void)
+{
+ gline_heap = heap_new(gline_comparator);
+ gline_dict = dict_new();
+ dict_set_free_data(gline_dict, free_gline_from_dict);
+ reg_exit_func(gline_db_cleanup);
}
static int
@@ -142,4 +234,4 @@
next = iter_next(it);
mysql_insert_gline(target);
}
-}
\ No newline at end of file
+}
|
|
From: wasted <wa...@fi...> - 2003-12-22 08:53:38
|
wasted 2003/12/22 02:54:21 CST
Modified files:
src gline.c mysql.c
Log:
Fix 2 bugs that caused a nasty core.
Revision Changes Path
1.2 +14 -13 wStats/src/gline.c
1.2 +2 -2 wStats/src/mysql.c
Index: gline.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/gline.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- gline.c 13 Dec 2003 13:36:22 -0000 1.1
+++ gline.c 22 Dec 2003 08:54:21 -0000 1.2
@@ -18,7 +18,7 @@
* wStats is derrived from srvx (http://srvx.net), everything in here that's
* original srvx code, Copyrighted 2000-2003 srvx Development Team.
*
- * $Id: gline.c,v 1.1 2003/12/13 13:36:22 wasted Exp $
+ * $Id: gline.c,v 1.2 2003/12/22 08:54:21 wasted Exp $
*/
#include "heap.h"
@@ -40,6 +40,18 @@
free(ent);
}
+static void
+expire_gline(void *data)
+{
+ struct gline *ex_gline = data;
+
+ if(dict_find(gline_dict, ex_gline->target, NULL))
+ {
+ dict_remove(gline_dict, ex_gline->target);
+ free(ex_gline);
+ }
+}
+
int
gline_remove(const char *target)
{
@@ -48,23 +60,12 @@
if((ex_gline = dict_find(gline_dict, target, NULL)))
{
dict_remove(gline_dict, target);
+ timeq_del(0, expire_gline, ex_gline, TIMEQ_IGNORE_WHEN);
free(ex_gline);
return 1;
}
return 0;
-}
-
-static void
-expire_gline(void *data)
-{
- struct gline *ex_gline = data;
-
- if(dict_find(gline_dict, ex_gline->target, NULL))
- {
- dict_remove(gline_dict, ex_gline->target);
- free(ex_gline);
- }
}
struct gline *
Index: mysql.c
===================================================================
RCS file: /home/cvs/wstats/wStats/src/mysql.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- mysql.c 13 Dec 2003 13:36:24 -0000 1.1
+++ mysql.c 22 Dec 2003 08:54:21 -0000 1.2
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * $Id: mysql.c,v 1.1 2003/12/13 13:36:24 wasted Exp $
+ * $Id: mysql.c,v 1.2 2003/12/22 08:54:21 wasted Exp $
*/
#include <mysql/mysql.h>
@@ -154,7 +154,7 @@
if(str)
{
out = malloc((strlen(str) * 2) + 1);
- mysql_real_escape_string(&mysql, out, str, strlen(str));
+ mysql_real_escape_string(&mysql, out, strdup(str), strlen(str));
return out;
}
return str;
|
|
From: wasted <wa...@fi...> - 2003-12-15 15:14:56
|
wasted 2003/12/15 09:17:03 CST
Modified files:
. README
Log:
Testing mailer.
Revision Changes Path
1.2 +19 -20 wStats/README
Index: README
===================================================================
RCS file: /home/cvs/wstats/wStats/README,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- README 13 Dec 2003 13:36:21 -0000 1.1
+++ README 15 Dec 2003 15:17:03 -0000 1.2
@@ -1,20 +1,19 @@
- - wStats README -
-
-wStats is an IRC server compatible with Undernet's ircu P10 protocol,
-it provides extensive statistics about your IRC network, i.e. channels,
-users, servers, G-lines, bans, *.net *.split's, and lots more.
-For a full detailed list of the statistics wStats stores into a
-MySQL database, you can view our features page. (http://wstats.sourceforge.net/features.php)
-
-The base of wStats is derrived from srvx (http://www.srvx.net),
-using it's very good foundation to support and strengthen the
-base of wStats, and allow it to be a very stable service
-and do it's job.
-
- - Installation -
-For installation help see INSTALL.
-
-- Contact -
-The authors are in the AUTHORS file, and irc.WhatNET.Org #coder-com can
-be used as an IRC support channel.
-
+ - wStats README -
+
+wStats is an IRC server compatible with Undernet's ircu P10 protocol,
+it provides extensive statistics about your IRC network, i.e. channels,
+users, servers, G-lines, bans, *.net *.split's, and lots more.
+For a full detailed list of the statistics wStats stores into a
+MySQL database, you can view our features page. (http://wstats.sourceforge.net/features.php)
+
+The base of wStats is derrived from srvx (http://www.srvx.net),
+using it's very good foundation to support and strengthen the
+base of wStats, and allow it to be a very stable service
+and do it's job.
+
+ - Installation -
+For installation help see INSTALL.
+
+- Contact -
+The authors are in the AUTHORS file, and irc.WhatNET.Org #coder-com can
+be used as an IRC support channel.
|
|
From: Martijn S. <wa...@lo...> - 2003-12-15 15:11:08
|
Testing. |
|
From: Martijn S. <wa...@wh...> - 2003-12-13 13:43:07
|
test |
|
From: wasted <wa...@fi...> - 2003-12-13 13:34:47
|
wasted 2003/12/13 07:36:31 CST wStats - Imported sources Update of /home/cvs/wstats/wStats In directory firestorm.shockcore.com:/tmp/cvs-serv32907 Log Message: Initial import. Status: Vendor Tag: vendor Release Tags: start N wStats/ChangeLog N wStats/INSTALL N wStats/Makefile.am N wStats/Makefile.in N wStats/autogen.sh N wStats/compile N wStats/config.guess N wStats/config.sub N wStats/configure N wStats/configure.in N wStats/depcomp N wStats/install-sh N wStats/ltmain.sh N wStats/missing N wStats/mkinstalldirs N wStats/wstats.conf.example N wStats/wstats.sql N wStats/AUTHORS N wStats/README N wStats/src/messages.h N wStats/src/Makefile.am N wStats/src/Makefile.in N wStats/src/common.h N wStats/src/compat.c N wStats/src/compat.h N wStats/src/conf.c N wStats/src/conf.h N wStats/src/config.h.in N wStats/src/dict-splay.c N wStats/src/dict.h N wStats/src/expnhelp.c N wStats/src/getopt.c N wStats/src/getopt.h N wStats/src/getopt1.c N wStats/src/gline.c N wStats/src/gline.h N wStats/src/hash.c N wStats/src/hash.h N wStats/src/heap.c N wStats/src/heap.h N wStats/src/helpfile.c N wStats/src/helpfile.h N wStats/src/ioset.c N wStats/src/ioset.h N wStats/src/log.c N wStats/src/log.h N wStats/src/main.c N wStats/src/modcmd.c N wStats/src/modcmd.h N wStats/src/mysql.c N wStats/src/mysql.h N wStats/src/proto-common.c N wStats/src/proto-p10.c N wStats/src/proto.h N wStats/src/recdb.c N wStats/src/recdb.h N wStats/src/statserv.c N wStats/src/statserv.h N wStats/src/statserv.help N wStats/src/timeq.c N wStats/src/timeq.h N wStats/src/tools.c N wStats/rx/COPYING.LIB N wStats/rx/ChangeLog N wStats/rx/Makefile.am N wStats/rx/Makefile.in N wStats/rx/_rx.h N wStats/rx/compile N wStats/rx/depcomp N wStats/rx/hashrexp.c N wStats/rx/inst-rxposix.h N wStats/rx/rx.c N wStats/rx/rx.h N wStats/rx/rxall.h N wStats/rx/rxanal.c N wStats/rx/rxanal.h N wStats/rx/rxbasic.c N wStats/rx/rxbasic.h N wStats/rx/rxbitset.c N wStats/rx/rxbitset.h N wStats/rx/rxcontext.h N wStats/rx/rxcset.c N wStats/rx/rxcset.h N wStats/rx/rxdbug.c N wStats/rx/rxgnucomp.c N wStats/rx/rxgnucomp.h N wStats/rx/rxnfa.c N wStats/rx/rxhash.c N wStats/rx/rxhash.h N wStats/rx/rxnfa.h N wStats/rx/rxnode.c N wStats/rx/rxnode.h N wStats/rx/rxposix.c N wStats/rx/rxposix.h N wStats/rx/rxproto.h N wStats/rx/rxsimp.c N wStats/rx/rxsimp.h N wStats/rx/rxspencer.c N wStats/rx/rxspencer.h N wStats/rx/rxstr.c N wStats/rx/rxstr.h N wStats/rx/rxsuper.c N wStats/rx/rxsuper.h N wStats/rx/rxunfa.c N wStats/rx/rxunfa.h No conflicts created by this import |