From: pk910 Date: Fri, 9 Sep 2011 05:06:25 +0000 (+0200) Subject: added cmd_netinfo X-Git-Tag: v5.3~450 X-Git-Url: http://git.pk910.de/?p=NeonServV5.git;a=commitdiff_plain;h=296b958ce326f1fd8f59c6a76e48348364e19a6c added cmd_netinfo --- diff --git a/ChanNode.c b/ChanNode.c index 4568e63..6869a95 100644 --- a/ChanNode.c +++ b/ChanNode.c @@ -60,7 +60,8 @@ void init_ChanNode() { --------------------------- = 47 */ - chanList = calloc(47, sizeof(*chanList)); + #define CHANNEL_LIST_SIZE 47 + chanList = calloc(CHANNEL_LIST_SIZE, sizeof(*chanList)); unsigned int *mode, flag = 1; modes_with_strarg = 0; modes_with_intarg = 0; @@ -83,7 +84,7 @@ void free_ChanNode() { int i; struct ChanNode *chan, *next; struct ChanUser *chanuser, *next_chanuser; - for(i = 0; i < 47; i++) { + for(i = 0; i < CHANNEL_LIST_SIZE; i++) { for(chan = chanList[i]; chan; chan = next) { next = chan->next; for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = next_chanuser) { @@ -173,6 +174,28 @@ struct ChanNode* addChannel(const char *name) { return chan; } +int getChannelCount() { + int i, count = 0; + struct ChanNode *chan; + for(i = 0; i < CHANNEL_LIST_SIZE; i++) { + for(chan = chanList[i]; chan; chan = chan->next) { + count++; + } + } + return count; +} + +int getChanUserCount() { + int i, count = 0; + struct ChanNode *chan; + for(i = 0; i < CHANNEL_LIST_SIZE; i++) { + for(chan = chanList[i]; chan; chan = chan->next) { + count += chan->usercount; + } + } + return count; +} + void delChannel(struct ChanNode* chan, int freeChan) { int chanListIndex = get_chanlist_entry(chan->name[1]); if(chanListIndex == -1) return; diff --git a/ChanNode.h b/ChanNode.h index 213f8ae..3bc0075 100644 --- a/ChanNode.h +++ b/ChanNode.h @@ -32,6 +32,8 @@ void free_ChanNode(); int is_valid_chan(const char *name); struct ChanNode* getChanByName(const char *name); struct ChanNode* addChannel(const char *chan); +int getChannelCount(); +int getChanUserCount(); void delChannel(struct ChanNode* chan, int freeChan); void freeChanNode(struct ChanNode* chan); void checkChannelVisibility(struct ChanNode* chan); diff --git a/ClientSocket.c b/ClientSocket.c index 59f272a..62e367d 100644 --- a/ClientSocket.c +++ b/ClientSocket.c @@ -38,6 +38,9 @@ struct ClientSocket* create_socket(char *host, int port, char *pass, struct User client->user = user; client->flags = 0; client->bufferpos = 0; + client->traffic_in = 0; + client->traffic_out = 0; + client->connection_time = 0; client->botid = 0; client->clientid = 0; client->next = sockets->data; @@ -78,6 +81,7 @@ int connect_socket(struct ClientSocket *client) { client->sock = sock; client->flags |= SOCKET_FLAG_CONNECTED; + client->connection_time = time(0); //send the IRC Headers char sendBuf[512]; @@ -120,6 +124,7 @@ int write_socket(struct ClientSocket *client, char* msg, int len) { if(!(client->flags & SOCKET_FLAG_CONNECTED)) return 0; printf("[send %d] %s", len, msg); write(client->sock, msg, len); + client->traffic_out += len; return 1; } @@ -162,6 +167,7 @@ void socket_loop(int timeout_seconds) { sock->flags &= ~(SOCKET_FLAG_CONNECTED | SOCKET_FLAG_READY); bot_disconnect(sock); } else { + sock->traffic_in += bytes; int used = parse_lines(sock, sock->buffer, sock->bufferpos); if(used == sock->bufferpos + 1) { //used all bytes so just reset the bufferpos @@ -198,7 +204,7 @@ struct ClientSocket* getBots(int flags, struct ClientSocket* last_bot) { struct ClientSocket *sock = (last_bot ? last_bot->next : sockets->data); if(sock == NULL) return NULL; for (; sock; sock = sock->next) { - if((sock->flags & flags) == flags) + if(!flags || (sock->flags & flags) == flags) return sock; } return NULL; diff --git a/ClientSocket.h b/ClientSocket.h index 494505b..380e051 100644 --- a/ClientSocket.h +++ b/ClientSocket.h @@ -22,6 +22,9 @@ struct ClientSocket { int port; char *pass; struct UserNode *user; + unsigned long traffic_in; + unsigned long traffic_out; + time_t connection_time; int botid : 16; int clientid : 16; diff --git a/UserNode.c b/UserNode.c index dccdad9..2ced2eb 100644 --- a/UserNode.c +++ b/UserNode.c @@ -143,6 +143,17 @@ struct UserNode* getAllUsers(struct UserNode *last) { return last->next; } +int getUserCount() { + int i, count = 0; + struct UserNode *user; + for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN+1; i++) { + for(user = userList[i]; user; user = user->next) { + count++; + } + } + return count; +} + struct UserNode* addUser(const char *nick) { int userListIndex = get_nicklist_entry(*nick); if(userListIndex == -1 || !is_valid_nick(nick)) diff --git a/UserNode.h b/UserNode.h index 0048398..f905437 100644 --- a/UserNode.h +++ b/UserNode.h @@ -43,6 +43,7 @@ int countUsersWithHost(char *host); char *getAuthFakehost(char *auth); struct UserNode* searchUserByNick(const char *nick); struct UserNode* getAllUsers(struct UserNode *last); +int getUserCount(); struct UserNode* addUser(const char *nick); struct UserNode* addUserMask(const char *mask); struct UserNode* createTempUser(const char *mask); diff --git a/bot_NeonServ.c b/bot_NeonServ.c index 5305913..fae9f0e 100644 --- a/bot_NeonServ.c +++ b/bot_NeonServ.c @@ -130,6 +130,13 @@ static const struct default_language_entry msgtab[] = { {"NS_DELBAN_BANNED_BY", "%s is banned by %s."}, {"NS_DELBAN_FAIL", "Sorry, no ban found for \002%s\002."}, {"NS_DELBAN_DONE", "Removed \002%s\002 from the %s ban list."}, + {"NS_NETINFO_HEADER", "\002Network information\002"}, + {"NS_NETINFO_UPTIME", "Uptime:"}, + {"NS_NETINFO_TRAFFIC", "Traffic:"}, + {"NS_NETINFO_CACHE", "Cache:"}, + {"NS_NETINFO_CHANNEL", " Channel:"}, + {"NS_NETINFO_USER", " User:"}, + {"NS_NETINFO_CHANUSER", " Channel-User:"}, {NULL, NULL} }; @@ -178,7 +185,7 @@ INCLUDE ALL CMD's HERE //#include "cmd_neonserv_mode.c" //#include "cmd_neonserv_invite.c" //#include "cmd_neonserv_info.c" -//#include "cmd_neonserv_netinfo.c" +#include "cmd_neonserv_netinfo.c" //#include "cmd_neonserv_peek.c" #include "cmd_neonserv_set.c" /* TODO: parse, check and set modelock */ //#include "cmd_neonserv_events.c" @@ -314,6 +321,7 @@ void init_NeonServ() { register_command(BOTID, "addban", neonserv_cmd_addban, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_staticban", 0); register_command(BOTID, "bans", neonserv_cmd_bans, 0, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "1", 0); register_command(BOTID, "delban", neonserv_cmd_delban, 1, CMDFLAG_REQUIRE_CHAN | CMDFLAG_REGISTERED_CHAN | CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, "#channel_staticban", 0); + register_command(BOTID, "netinfo", neonserv_cmd_netinfo, 0, 0, NULL, 0); register_command(BOTID, "trace", neonserv_cmd_trace, 1, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH, NULL, 400); @@ -325,6 +333,20 @@ void init_NeonServ() { register_default_language_table(msgtab); } +void loop_NeonServ() { + //check channel bans + check_mysql(); + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `ban_mask`, `ban_id` FROM `bans` WHERE `ban_expire` != '0' AND `ban_expire` <= UNIX_TIMESTAMP()"); + res = mysql_use(); + while ((row = mysql_fetch_row(res)) != NULL) { + printf_mysql_query("DELETE FROM `bans` WHERE `ban_id` = '%s'", row[1]); + //TODO: remove the ban from the channel + } + mysql_free(); +} + void free_NeonServ() { } diff --git a/bot_NeonServ.h b/bot_NeonServ.h index a42a2d5..8e33e23 100644 --- a/bot_NeonServ.h +++ b/bot_NeonServ.h @@ -4,6 +4,7 @@ #include "main.h" void init_NeonServ(); +void loop_NeonServ(); void free_NeonServ(); #endif \ No newline at end of file diff --git a/bots.c b/bots.c index a5c82bf..b957a19 100644 --- a/bots.c +++ b/bots.c @@ -7,6 +7,10 @@ void init_bots() { init_NeonServ(); } +void loop_bots() { + loop_NeonServ(); +} + void free_bots() { free_NeonServ(); } diff --git a/bots.h b/bots.h index 38371e4..a24b158 100644 --- a/bots.h +++ b/bots.h @@ -4,6 +4,7 @@ #include "main.h" void init_bots(); +void loop_bots(); void free_bots(); #endif \ No newline at end of file diff --git a/cmd_neonserv_netinfo.c b/cmd_neonserv_netinfo.c new file mode 100644 index 0000000..baf926e --- /dev/null +++ b/cmd_neonserv_netinfo.c @@ -0,0 +1,70 @@ + +/* +* no args +*/ +static CMD_BIND(neonserv_cmd_netinfo) { + reply(getTextBot(), user, "NS_NETINFO_HEADER"); + char tmp[MAXLEN]; + struct Table *table; + table = table_init(2, 5, 0); + char *content[2]; + + content[0] = get_language_string(user, "NS_NETINFO_UPTIME"); + content[1] = timeToStr(user, (time(0) - start_time), 3, tmp); + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_BOTS"); + struct ClientSocket *cclient; + int bot_count = 0, connected_bot_count = 0; + unsigned long traffic_in = 0, traffic_out = 0; + for(cclient = getBots(0, NULL); cclient; cclient = getBots(0, cclient)) { + bot_count++; + if(cclient->flags & SOCKET_FLAG_READY) + connected_bot_count++; + traffic_in += cclient->traffic_in; + traffic_out += cclient->traffic_out; + } + sprintf(tmp, "%d (%d connected)", bot_count, connected_bot_count); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_TRAFFIC"); + sprintf(tmp, "in: %lu kb out: %lu kb", traffic_in / 1024, traffic_out / 1024); + content[1] = tmp; + table_add(table, content); + + int channel_count = getChannelCount(); + float channel_memory = channel_count * sizeof(struct ChanNode); + int user_count = getUserCount(); + float user_memory = user_count * sizeof(struct UserNode); + int chanuser_count = getChanUserCount(); + float chanuser_memory = chanuser_count * sizeof(struct ChanUser); + float total_memory = channel_memory + user_memory + chanuser_memory; + + content[0] = get_language_string(user, "NS_NETINFO_CACHE"); + sprintf(tmp, "%f kB (%f MB)", total_memory / 1024, total_memory / 1024 / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_CHANNEL"); + sprintf(tmp, "%d %f kB (%d * %lu B = %f kB)", channel_count, channel_memory / 1024, channel_count, sizeof(struct ChanNode), channel_memory / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_USER"); + sprintf(tmp, "%d %f kB (%d * %lu B = %f kB)", user_count, user_memory / 1024, user_count, sizeof(struct UserNode), user_memory / 1024); + content[1] = tmp; + table_add(table, content); + + content[0] = get_language_string(user, "NS_NETINFO_CHANUSER"); + sprintf(tmp, "%d %f kB (%d * %lu B = %f kB)", chanuser_count, chanuser_memory / 1024, chanuser_count, sizeof(struct ChanUser), chanuser_memory / 1024); + content[1] = tmp; + table_add(table, content); + + char **table_lines = table_end(table); + int i; + for(i = 0; i < table->entrys; i++) { + reply(getTextBot(), user, table_lines[i]); + } + table_free(table); +} diff --git a/main.c b/main.c index bcf2fb2..c6814a1 100644 --- a/main.c +++ b/main.c @@ -14,6 +14,8 @@ #include "tools.h" #include "timeq.h" +time_t start_time; + void cleanup() { free_sockets(); free_parser(); @@ -30,6 +32,8 @@ void cleanup() { int main(void) { + start_time = time(0); + init_mysql(); init_lang(); init_parser(); @@ -48,6 +52,7 @@ int main(void) socket_loop(SOCKET_SELECT_TIME); } while(time(0) < socket_wait); timeq_tick(); + loop_bots(); clearTempUsers(); } } diff --git a/main.h b/main.h index e355d23..bf72d28 100644 --- a/main.h +++ b/main.h @@ -56,6 +56,8 @@ #define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN +extern time_t start_time; + int stricmp (const char *s1, const char *s2); int stricmplen (const char *s1, const char *s2, int len);