1 /* +------------------------------------+
2 * | Inspire Internet Relay Chat Daemon |
3 * +------------------------------------+
5 * InspIRCd 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>
37 enum LogTypes { LT_OPER = 1, LT_KILL, LT_SERVLINK, LT_XLINE, LT_CONNECT, LT_DISCONNECT, LT_FLOOD, LT_LOADMODULE };
39 /* $ModDesc: Logs network-wide data to an SQL database */
41 class ModuleSQLLog : public Module
51 Conf = new ConfigReader();
52 dbid = Conf->ReadInteger("sqllog","dbid",0,true); // database id of a database configured in m_sql (see m_sql config)
54 SQLModule = Srv->FindModule("m_sql.so");
56 Srv->Log(DEFAULT,"WARNING: m_SQLLog.so could not initialize because m_sql.so is not loaded. Load the module and rehash your server.");
60 ModuleSQLLog(Server* Me) : Module::Module(Me)
66 void Implements(char* List)
68 List[I_OnRehash] = List[I_OnOper] = List[I_OnGlobalOper] = List[I_OnKill] = 1;
69 List[I_OnPreCommand] = List[I_OnUserConnect] = List[I_OnGlobalConnect] = 1;
70 List[I_OnUserQuit] = List[I_OnLoadModule] = 1;
73 virtual void OnRehash(const std::string ¶meter)
78 long InsertNick(const 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();
86 if (result->GetType() == SQL_OK)
88 SQLRequest* rowrequest = new SQLRequest(SQL_ROW,dbid,"");
89 Request rowquery((char*)rowrequest, this, SQLModule);
90 SQLResult* rowresult = (SQLResult*)rowquery.Send();
92 if (rowresult->GetType() == SQL_ROW)
94 nid = atoi(rowresult->GetField("id").c_str());
102 query->SetQueryType(SQL_DONE);
103 query->SetConnID(dbid);
104 Request donerequest((char*)query, this, SQLModule);
110 SQLRequest* query2 = new SQLRequest(SQL_COUNT,dbid,"INSERT INTO ircd_log_actors VALUES('','"+nick+"')");
111 Request queryrequest2((char*)query2, this, SQLModule);
112 SQLResult* result2 = (SQLResult*)queryrequest2.Send();
114 if (result2->GetType() == SQL_ERROR)
116 Srv->Log(DEFAULT,"SQL log error: " + result2->GetError());
124 nid = InsertNick(nick);
129 void InsertEntry(unsigned long category,unsigned long nickid,unsigned long hostid,unsigned long sourceid,unsigned long date)
131 char querybuffer[MAXBUF];
133 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);
134 SQLRequest* query = new SQLRequest(SQL_COUNT,dbid,querybuffer);
135 Request queryrequest((char*)query, this, SQLModule);
136 SQLResult* result = (SQLResult*)queryrequest.Send();
138 if (result->GetType() == SQL_ERROR)
140 Srv->Log(DEFAULT,"SQL log error: " + result->GetError());
151 long InsertHost(const std::string &host)
155 SQLRequest* query = new SQLRequest(SQL_RESULT,dbid,"SELECT id,hostname FROM ircd_log_hosts WHERE hostname='"+host+"'");
156 Request queryrequest((char*)query, this, SQLModule);
157 SQLResult* result = (SQLResult*)queryrequest.Send();
159 if (result->GetType() == SQL_OK)
161 SQLRequest* rowrequest = new SQLRequest(SQL_ROW,dbid,"");
162 Request rowquery((char*)rowrequest, this, SQLModule);
163 SQLResult* rowresult = (SQLResult*)rowquery.Send();
165 if (rowresult->GetType() == SQL_ROW)
167 hid = atoi(rowresult->GetField("id").c_str());
175 query->SetQueryType(SQL_DONE);
176 query->SetConnID(dbid);
177 Request donerequest((char*)query, this, SQLModule);
183 SQLRequest* query2 = new SQLRequest(SQL_COUNT,dbid,"INSERT INTO ircd_log_hosts VALUES('','"+host+"')");
184 Request queryrequest2((char*)query2, this, SQLModule);
185 SQLResult* result2 = (SQLResult*)queryrequest2.Send();
187 if (result2->GetType() == SQL_ERROR)
189 Srv->Log(DEFAULT,"SQL log error: " + result2->GetError());
196 hid = InsertHost(host);
202 void AddLogEntry(int category, const std::string &nick, const std::string &host, const std::string &source)
204 // is the sql module loaded? If not, we don't attempt to do anything.
208 long nickid = InsertNick(nick);
209 long sourceid = InsertNick(source);
210 long hostid = InsertHost(host);
211 InsertEntry((unsigned)category,(unsigned)nickid,(unsigned)hostid,(unsigned)sourceid,(unsigned long)time(NULL));
214 virtual void OnOper(userrec* user, const std::string &opertype)
216 AddLogEntry(LT_OPER,user->nick,user->host,user->server);
219 virtual void OnGlobalOper(userrec* user)
221 AddLogEntry(LT_OPER,user->nick,user->host,user->server);
224 virtual int OnKill(userrec* source, userrec* dest, const std::string &reason)
226 AddLogEntry(LT_KILL,dest->nick,dest->host,source->nick);
230 virtual int OnPreCommand(const std::string &command, const char** parameters, int pcnt, userrec *user, bool validated)
232 if ((command == "GLINE") || (command == "KLINE") || (command == "ELINE") || (command == "ZLINE"))
234 AddLogEntry(LT_XLINE,user->nick,command[0]+std::string(":")+std::string(parameters[0]),user->server);
239 virtual void OnUserConnect(userrec* user)
241 AddLogEntry(LT_CONNECT,user->nick,user->host,user->server);
244 virtual void OnGlobalConnect(userrec* user)
246 AddLogEntry(LT_CONNECT,user->nick,user->host,user->server);
249 virtual void OnUserQuit(userrec* user, const std::string &reason)
251 AddLogEntry(LT_DISCONNECT,user->nick,user->host,user->server);
254 virtual void OnLoadModule(Module* mod, const std::string &name)
256 AddLogEntry(LT_LOADMODULE,name,Srv->GetServerName(),Srv->GetServerName());
259 virtual ~ModuleSQLLog()
263 virtual Version GetVersion()
265 return Version(1,0,0,1,VF_VENDOR);
270 class ModuleSQLLogFactory : public ModuleFactory
273 ModuleSQLLogFactory()
277 ~ModuleSQLLogFactory()
281 virtual Module * CreateModule(Server* Me)
283 return new ModuleSQLLog(Me);
289 extern "C" void * init_module( void )
291 return new ModuleSQLLogFactory;