X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fs_stats.c;h=c3f01cd7c43abc0e64b5c2c5fe01dc748d253a47;hb=31c730086f07bd21737fe3808853d22d30661e53;hp=6b02585087ddbae1577a20d3fb487fd84f8920e2;hpb=c7052d26f3c0a422e73c218006dbbe14d42a9f0f;p=ircu2.10.12-pk.git diff --git a/ircd/s_stats.c b/ircd/s_stats.c index 6b02585..c3f01cd 100644 --- a/ircd/s_stats.c +++ b/ircd/s_stats.c @@ -43,6 +43,7 @@ #include "numnicks.h" #include "querycmds.h" #include "res.h" +#include "s_auth.h" #include "s_bsd.h" #include "s_conf.h" #include "s_debug.h" @@ -106,14 +107,20 @@ stats_configured_links(struct Client *sptr, const struct StatDesc* sd, if (tmp->status & CONF_UWORLD) send_reply(sptr, RPL_STATSULINE, host); else if (tmp->status & CONF_SERVER) - send_reply(sptr, RPL_STATSCLINE, name, "", "*", port, maximum, hub_limit, get_conf_class(tmp)); + send_reply(sptr, RPL_STATSCLINE, name, port, maximum, hub_limit, get_conf_class(tmp)); else if (tmp->status & CONF_CLIENT) send_reply(sptr, RPL_STATSILINE, + (tmp->username ? tmp->username : ""), (tmp->username ? "@" : ""), (tmp->host ? tmp->host : "*"), maximum, (name[0] == ':' ? "0" : ""), (tmp->name ? tmp->name : "*"), port, get_conf_class(tmp)); else if (tmp->status & CONF_OPERATOR) - send_reply(sptr, RPL_STATSOLINE, username, host, name, get_conf_class(tmp)); + send_reply(sptr, RPL_STATSOLINE, + ((FlagHas(&tmp->privs_dirty, PRIV_PROPAGATE) + && FlagHas(&tmp->privs, PRIV_PROPAGATE)) + || (FlagHas(&tmp->conn_class->privs_dirty, PRIV_PROPAGATE) + && FlagHas(&tmp->conn_class->privs, PRIV_PROPAGATE))) + ? 'O' : 'o', username, host, name, get_conf_class(tmp)); } } } @@ -133,7 +140,7 @@ stats_crule_list(struct Client* to, const struct StatDesc *sd, for ( ; p; p = p->next) { if (p->type & sd->sd_funcdata) - send_reply(to, RPL_STATSDLINE, sd->sd_c, p->hostmask, p->rule); + send_reply(to, RPL_STATSDLINE, (p->type & CRULE_ALL ? 'D' : 'd'), p->hostmask, p->rule); } } @@ -178,6 +185,7 @@ stats_access(struct Client *to, const struct StatDesc *sd, char *param) || (aconf->name && !match(param, aconf->name)))) { send_reply(to, RPL_STATSILINE, + (aconf->username ? aconf->username : ""), (aconf->username ? "@" : ""), (aconf->host ? aconf->host : "*"), aconf->maximum, (aconf->name && aconf->name[0] == ':' ? "0":""), aconf->name ? aconf->name : "*", @@ -246,20 +254,30 @@ stats_klines(struct Client *sptr, const struct StatDesc *sd, char *mask) for (conf = conf_get_deny_list(); conf; conf = conf->next) { - if ((!wilds && ((user || conf->hostmask) && - !match(conf->hostmask, host) && - (!user || !match(conf->usermask, user)))) || - (wilds && !mmatch(host, conf->hostmask) && - (!user || !mmatch(user, conf->usermask)))) - { - send_reply(sptr, RPL_STATSKLINE, conf->bits > 0 ? 'k' : 'K', - conf->usermask ? conf->usermask : "*", - conf->hostmask ? conf->hostmask : "*", - conf->message ? conf->message : "(none)", - conf->realmask ? conf->realmask : "*"); - if (--count == 0) - return; - } + /* Skip this block if the user is searching for a user-matching + * mask but the current Kill doesn't have a usermask, or if user + * is searching for a host-matching mask but the Kill has no + * hostmask, or if the user mask is specified and doesn't match, + * or if the host mask is specified and doesn't match. + */ + if ((user && !conf->usermask) + || (host && !conf->hostmask) + || (user && conf->usermask + && (wilds + ? mmatch(user, conf->usermask) + : match(conf->usermask, user))) + || (host && conf->hostmask + && (wilds + ? mmatch(host, conf->hostmask) + : match(conf->hostmask, host)))) + continue; + send_reply(sptr, RPL_STATSKLINE, conf->bits > 0 ? 'k' : 'K', + conf->usermask ? conf->usermask : "*", + conf->hostmask ? conf->hostmask : "*", + conf->message ? conf->message : "(none)", + conf->realmask ? conf->realmask : "*"); + if (--count == 0) + return; } } @@ -440,9 +458,9 @@ stats_servers_verbose(struct Client* sptr, const struct StatDesc* sd, "%-20s %-20s Flags Hops Numeric Lag RTT Up Down " "Clients/Max Proto %-10s :Info", "Servername", "Uplink", "LinkTS"); - fmt = "%-20s %-20s %c%c%c%c %4i %s %-4i %5i %4i %4i %4i %5i %5i P%-2i %Tu :%s"; + fmt = "%-20s %-20s %c%c%c%c%c %4i %s %-4i %5i %4i %4i %4i %5i %5i P%-2i %Tu :%s"; } else { - fmt = "%s %s %c%c%c%c %i %s %i %i %i %i %i %i %i P%i %Tu :%s"; + fmt = "%s %s %c%c%c%c%c %i %s %i %i %i %i %i %i %i P%i %Tu :%s"; } for (acptr = GlobalClientList; acptr; acptr = cli_next(acptr)) @@ -459,6 +477,7 @@ stats_servers_verbose(struct Client* sptr, const struct StatDesc* sd, IsBurstAck(acptr) ? 'A' : '-', IsHub(acptr) ? 'H' : '-', IsService(acptr) ? 'S' : '-', + IsIPv6(acptr) ? '6' : '-', cli_hopcount(acptr), NumServ(acptr), base64toint(cli_yxx(acptr)), @@ -474,7 +493,6 @@ stats_servers_verbose(struct Client* sptr, const struct StatDesc* sd, } } -#ifdef DEBUGMODE /** Display objects allocated (and total memory used by them) for * several types of structures. * @param[in] to Client requesting statistics. @@ -484,10 +502,12 @@ stats_servers_verbose(struct Client* sptr, const struct StatDesc* sd, static void stats_meminfo(struct Client* to, const struct StatDesc* sd, char* param) { + extern void bans_send_meminfo(struct Client *cptr); + class_send_meminfo(to); + bans_send_meminfo(to); send_listinfo(to, 0); } -#endif /** Send a list of available statistics. * @param[in] to Client requesting statistics. @@ -509,7 +529,7 @@ stats_help(struct Client* to, const struct StatDesc* sd, char* param) /** Contains information about all statistics. */ struct StatDesc statsinfo[] = { - { 'a', "nameservers", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_a, + { 'a', "nameservers", STAT_FLAG_OPERFEAT|STAT_FLAG_LOCONLY, FEAT_HIS_STATS_a, report_dns_servers, 0, "DNS servers." }, { 'c', "connect", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_c, @@ -524,9 +544,12 @@ struct StatDesc statsinfo[] = { { 'e', "engine", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_e, stats_engine, 0, "Report server event loop engine." }, - { 'f', "features", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_f, + { 'f', "features", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_f, feature_report, 0, "Feature settings." }, + { 'F', "featuresall", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_f, + feature_report, 1, + "All feature settings, including defaulted values." }, { 'g', "glines", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_g, gline_stats, 0, "Global bans (G-lines)." }, @@ -546,7 +569,7 @@ struct StatDesc statsinfo[] = { FEAT_HIS_STATS_l, stats_links, 0, "Current connections information." }, - { 'L', "modules", (STAT_FLAG_OPERFEAT | STAT_FLAG_VARPARAM | STAT_FLAG_CASESENS), + { 'L', "modules", (STAT_FLAG_OPERFEAT | STAT_FLAG_CASESENS), FEAT_HIS_STATS_L, stats_modules, 0, "Dynamically loaded modules." }, @@ -591,18 +614,22 @@ struct StatDesc statsinfo[] = { { 'w', "userload", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_w, calc_load, 0, "Userload statistics." }, -#ifdef DEBUGMODE { 'x', "memusage", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_x, stats_meminfo, 0, - "List usage information (Debug only)." }, -#endif + "List usage information." }, { 'y', "classes", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_y, report_classes, 0, "Connection classes." }, { 'z', "memory", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_z, count_memory, 0, "Memory/Structure allocation information." }, - { '*', "help", (STAT_FLAG_CASESENS | STAT_FLAG_VARPARAM), FEAT_LAST_F, + { ' ', "iauth", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_IAUTH, + report_iauth_stats, 0, + "IAuth statistics." }, + { ' ', "iauthconf", STAT_FLAG_OPERFEAT, FEAT_HIS_STATS_IAUTH, + report_iauth_conf, 0, + "IAuth configuration." }, + { '*', "help", STAT_FLAG_CASESENS, FEAT_LAST_F, stats_help, 0, "Send help for stats." }, { '\0', 0, FEAT_LAST_F, 0, 0, 0 } @@ -653,7 +680,7 @@ const struct StatDesc * stats_find(const char *name_or_char) { if (!name_or_char[1]) - return statsmap[(int)name_or_char[0]]; + return statsmap[name_or_char[0] - CHAR_MIN]; else return bsearch(name_or_char, statsinfo, statscount, sizeof(statsinfo[0]), stats_search); } @@ -663,11 +690,6 @@ void stats_init(void) { struct StatDesc *sd; - int i; - - /* Make darn sure the statsmap array is initialized to all zeros */ - for (i = 0; i < 256; i++) - statsmap[i] = 0; /* Count number of stats entries and sort them. */ for (statscount = 0, sd = statsinfo; sd->sd_name; sd++, statscount++) {} @@ -680,12 +702,12 @@ stats_init(void) continue; else if (sd->sd_flags & STAT_FLAG_CASESENS) /* case sensitive character... */ - statsmap[(int)sd->sd_c] = sd; + statsmap[sd->sd_c - CHAR_MIN] = sd; else { /* case insensitive--make sure to put in two entries */ - statsmap[(int)ToLower((int)sd->sd_c)] = sd; - statsmap[(int)ToUpper((int)sd->sd_c)] = sd; + statsmap[ToLower(sd->sd_c) - CHAR_MIN] = sd; + statsmap[ToUpper(sd->sd_c) - CHAR_MIN] = sd; } } }