1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
7 * <brain@chatspike.net>
8 * <Craig@chatspike.net>
10 * Written by Craig Edwards, Craig McLure, and others.
11 * This program is free but copyrighted software; see
12 * the file COPYING for details.
14 * ---------------------------------------------------
23 #include <sys/types.h>
24 #include <sys/socket.h>
42 #define LT_DISCONNECT 6
44 #define LT_LOADMODULE 8
46 /* $ModDesc: Logs network-wide data to an SQL database */
50 class ModuleSQLLog : public Module
59 Conf = new ConfigReader();
60 dbid = Conf->ReadInteger("sqllog","dbid",0,true); // database id of a database configured in m_sql (see m_sql config)
62 SQLModule = Srv->FindModule("m_sql.so");
64 Srv->Log(DEFAULT,"WARNING: m_SQLLog.so could not initialize because m_sql.so is not loaded. Load the module and rehash your server.");
74 virtual void OnRehash()
79 long InsertNick(std::string nick)
82 SQLRequest* query = new SQLRequest(SQL_RESULT,dbid,"SELECT id,actor FROM ircd_log_actors WHERE actor='"+nick+"'");
83 Request queryrequest((char*)query, this, SQLModule);
84 SQLResult* result = (SQLResult*)queryrequest.Send();
85 if (result->GetType() == SQL_OK)
87 SQLRequest* rowrequest = new SQLRequest(SQL_ROW,dbid,"");
88 Request rowquery((char*)rowrequest, this, SQLModule);
89 SQLResult* rowresult = (SQLResult*)rowquery.Send();
90 if (rowresult->GetType() == SQL_ROW)
92 nid = atoi(rowresult->GetField("id").c_str());
98 query->SetQueryType(SQL_DONE);
99 query->SetConnID(dbid);
100 Request donerequest((char*)query, this, SQLModule);
105 SQLRequest* query2 = new SQLRequest(SQL_COUNT,dbid,"INSERT INTO ircd_log_actors VALUES('','"+nick+"')");
106 Request queryrequest2((char*)query2, this, SQLModule);
107 SQLResult* result2 = (SQLResult*)queryrequest2.Send();
108 if (result2->GetType() == SQL_ERROR)
110 Srv->Log(DEFAULT,"SQL log error: " + result2->GetError());
116 nid = InsertNick(nick);
121 void InsertEntry(unsigned long category,unsigned long nickid,unsigned long hostid,unsigned long sourceid,unsigned long date)
123 char querybuffer[MAXBUF];
124 snprintf(querybuffer,MAXBUF,"INSERT INTO ircd_log VALUES('',%lu,%lu,%lu,%lu,%lu)",(unsigned long)category,(unsigned long)nickid,(unsigned long)hostid,(unsigned long)sourceid,(unsigned long)date);
125 SQLRequest* query = new SQLRequest(SQL_COUNT,dbid,querybuffer);
126 Request queryrequest((char*)query, this, SQLModule);
127 SQLResult* result = (SQLResult*)queryrequest.Send();
128 if (result->GetType() == SQL_ERROR)
130 Srv->Log(DEFAULT,"SQL log error: " + result->GetError());
139 long InsertHost(std::string host)
142 SQLRequest* query = new SQLRequest(SQL_RESULT,dbid,"SELECT id,hostname FROM ircd_log_hosts WHERE hostname='"+host+"'");
143 Request queryrequest((char*)query, this, SQLModule);
144 SQLResult* result = (SQLResult*)queryrequest.Send();
145 if (result->GetType() == SQL_OK)
147 SQLRequest* rowrequest = new SQLRequest(SQL_ROW,dbid,"");
148 Request rowquery((char*)rowrequest, this, SQLModule);
149 SQLResult* rowresult = (SQLResult*)rowquery.Send();
150 if (rowresult->GetType() == SQL_ROW)
152 hid = atoi(rowresult->GetField("id").c_str());
158 query->SetQueryType(SQL_DONE);
159 query->SetConnID(dbid);
160 Request donerequest((char*)query, this, SQLModule);
165 SQLRequest* query2 = new SQLRequest(SQL_COUNT,dbid,"INSERT INTO ircd_log_hosts VALUES('','"+host+"')");
166 Request queryrequest2((char*)query2, this, SQLModule);
167 SQLResult* result2 = (SQLResult*)queryrequest2.Send();
168 if (result2->GetType() == SQL_ERROR)
170 Srv->Log(DEFAULT,"SQL log error: " + result2->GetError());
176 hid = InsertHost(host);
181 void AddLogEntry(int category, std::string nick, std::string host, std::string source)
183 // is the sql module loaded? If not, we don't attempt to do anything.
187 long nickid = InsertNick(nick);
188 long sourceid = InsertNick(source);
189 long hostid = InsertHost(host);
190 InsertEntry((unsigned)category,(unsigned)nickid,(unsigned)hostid,(unsigned)sourceid,(unsigned long)time(NULL));
193 virtual void OnOper(userrec* user)
195 AddLogEntry(LT_OPER,user->nick,user->host,user->server);
198 virtual void OnGlobalOper(userrec* user)
200 AddLogEntry(LT_OPER,user->nick,user->host,user->server);
203 virtual int OnKill(userrec* source, userrec* dest, std::string reason)
205 AddLogEntry(LT_KILL,dest->nick,dest->host,source->nick);
209 virtual int OnMeshToken(char token,string_list params,serverrec* source,serverrec* reply, std::string tcp_host,std::string ipaddr,int port)
211 if ((token == 'U') || (token == 's') || (token == 'S'))
212 AddLogEntry(LT_SERVLINK,tcp_host,ipaddr,Srv->GetServerName());
216 virtual int OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user)
218 if ((command == "GLINE") || (command == "KLINE") || (command == "ELINE") || (command == "ZLINE"))
220 AddLogEntry(LT_XLINE,user->nick,command[0]+std::string(":")+std::string(parameters[0]),user->server);
225 virtual void OnUserConnect(userrec* user)
227 AddLogEntry(LT_CONNECT,user->nick,user->host,user->server);
230 virtual void OnGlobalConnect(userrec* user)
232 AddLogEntry(LT_CONNECT,user->nick,user->host,user->server);
235 virtual void OnUserQuit(userrec* user)
237 AddLogEntry(LT_DISCONNECT,user->nick,user->host,user->server);
240 virtual void OnLoadModule(Module* mod,std::string name)
242 AddLogEntry(LT_LOADMODULE,name,Srv->GetServerName(),Srv->GetServerName());
245 virtual ~ModuleSQLLog()
250 virtual Version GetVersion()
252 return Version(1,0,0,1,VF_VENDOR);
257 class ModuleSQLLogFactory : public ModuleFactory
260 ModuleSQLLogFactory()
264 ~ModuleSQLLogFactory()
268 virtual Module * CreateModule()
270 return new ModuleSQLLog;
276 extern "C" void * init_module( void )
278 return new ModuleSQLLogFactory;