]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/extra/m_sqllog.cpp
Updated copyrights in headers etc using perl inplace edit
[user/henk/code/inspircd.git] / src / modules / extra / m_sqllog.cpp
1 /*       +------------------------------------+
2  *       | Inspire Internet Relay Chat Daemon |
3  *       +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2004 ChatSpike-Dev.
6  *                       E-mail:
7  *                <brain@chatspike.net>
8  *                <Craig@chatspike.net>
9  *     
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *            the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 using namespace std;
18
19 #include <stdio.h>
20 #include <string>
21 #include <stdlib.h>
22 #include <time.h>
23 #include <sys/types.h>
24 #include <sys/socket.h>
25 #include <sys/time.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <errno.h>
29 #include <fcntl.h>
30 #include <poll.h>
31 #include "users.h"
32 #include "channels.h"
33 #include "modules.h"
34 #include "inspircd.h"
35 #include "m_sql.h"
36
37 #define LT_OPER         1
38 #define LT_KILL         2
39 #define LT_SERVLINK     3
40 #define LT_XLINE        4
41 #define LT_CONNECT      5
42 #define LT_DISCONNECT   6
43 #define LT_FLOOD        7
44 #define LT_LOADMODULE   8
45
46 /* $ModDesc: Logs network-wide data to an SQL database */
47
48 Server *Srv;
49
50 class ModuleSQLLog : public Module
51 {
52         ConfigReader* Conf;
53         unsigned long dbid;
54         Module* SQLModule;
55
56  public:
57         bool ReadConfig()
58         {
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)
61                 delete Conf;
62                 SQLModule = Srv->FindModule("m_sql.so");
63                 if (!SQLModule)
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.");
65                 return (SQLModule);
66         }
67
68         ModuleSQLLog(Server* Me)
69                 : Module::Module(Me)
70         {
71                 Srv = Me;
72                 ReadConfig();
73         }
74
75         void Implements(char* List)
76         {
77                 List[I_OnRehash] = List[I_OnOper] = List[I_OnGlobalOper] = List[I_OnKill] = 1;
78                 List[I_OnPreCommand] = List[I_OnUserConnect] = List[I_OnGlobalConnect] = 1;
79                 List[I_OnUserQuit] = List[I_OnLoadModule] = 1;
80         }
81
82         virtual void OnRehash(std::string parameter)
83         {
84                 ReadConfig();
85         }
86
87         long InsertNick(std::string nick)
88         {
89                 long nid = -1;
90                 SQLRequest* query = new SQLRequest(SQL_RESULT,dbid,"SELECT id,actor FROM ircd_log_actors WHERE actor='"+nick+"'");
91                 Request queryrequest((char*)query, this, SQLModule);
92                 SQLResult* result = (SQLResult*)queryrequest.Send();
93                 if (result->GetType() == SQL_OK)
94                 {
95                         SQLRequest* rowrequest = new SQLRequest(SQL_ROW,dbid,"");
96                         Request rowquery((char*)rowrequest, this, SQLModule);
97                         SQLResult* rowresult = (SQLResult*)rowquery.Send();
98                         if (rowresult->GetType() == SQL_ROW)
99                         {
100                                 nid = atoi(rowresult->GetField("id").c_str());
101                                 delete rowresult;
102                         }
103                         delete rowrequest;
104                         delete result;
105                 }
106                 query->SetQueryType(SQL_DONE);
107                 query->SetConnID(dbid);
108                 Request donerequest((char*)query, this, SQLModule);
109                 donerequest.Send();
110                 delete query;
111                 if (nid < 1)
112                 {
113                         SQLRequest* query2 = new SQLRequest(SQL_COUNT,dbid,"INSERT INTO ircd_log_actors VALUES('','"+nick+"')");
114                         Request queryrequest2((char*)query2, this, SQLModule);
115                         SQLResult* result2 = (SQLResult*)queryrequest2.Send();
116                         if (result2->GetType() == SQL_ERROR)
117                         {
118                                 Srv->Log(DEFAULT,"SQL log error: " + result2->GetError());
119                         }
120                         if (result2)
121                                 delete result;
122                         if (query2)
123                                 delete query2;
124                         nid = InsertNick(nick);
125                 }
126                 return nid;
127         }
128
129         void InsertEntry(unsigned long category,unsigned long nickid,unsigned long hostid,unsigned long sourceid,unsigned long date)
130         {
131                 char querybuffer[MAXBUF];
132                 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);
133                 SQLRequest* query = new SQLRequest(SQL_COUNT,dbid,querybuffer);
134                 Request queryrequest((char*)query, this, SQLModule);
135                 SQLResult* result = (SQLResult*)queryrequest.Send();
136                 if (result->GetType() == SQL_ERROR)
137                 {
138                         Srv->Log(DEFAULT,"SQL log error: " + result->GetError());
139                 }
140                 if (result)
141                         delete result;
142                 if (query)
143                         delete query;
144                 return;
145         }
146
147         long InsertHost(std::string host)
148         {
149                 long hid = -1;
150                 SQLRequest* query = new SQLRequest(SQL_RESULT,dbid,"SELECT id,hostname FROM ircd_log_hosts WHERE hostname='"+host+"'");
151                 Request queryrequest((char*)query, this, SQLModule);
152                 SQLResult* result = (SQLResult*)queryrequest.Send();
153                 if (result->GetType() == SQL_OK)
154                 {
155                         SQLRequest* rowrequest = new SQLRequest(SQL_ROW,dbid,"");
156                         Request rowquery((char*)rowrequest, this, SQLModule);
157                         SQLResult* rowresult = (SQLResult*)rowquery.Send();
158                         if (rowresult->GetType() == SQL_ROW)
159                         {
160                                 hid = atoi(rowresult->GetField("id").c_str());
161                                 delete rowresult;
162                         }
163                         delete rowrequest;
164                         delete result;
165                 }
166                 query->SetQueryType(SQL_DONE);
167                 query->SetConnID(dbid);
168                 Request donerequest((char*)query, this, SQLModule);
169                 donerequest.Send();
170                 delete query;
171                 if (hid < 1)
172                 {
173                         SQLRequest* query2 = new SQLRequest(SQL_COUNT,dbid,"INSERT INTO ircd_log_hosts VALUES('','"+host+"')");
174                         Request queryrequest2((char*)query2, this, SQLModule);
175                         SQLResult* result2 = (SQLResult*)queryrequest2.Send();
176                         if (result2->GetType() == SQL_ERROR)
177                         {
178                                 Srv->Log(DEFAULT,"SQL log error: " + result2->GetError());
179                         }
180                         if (result)
181                                 delete result2;
182                         if (query)
183                                 delete query2;
184                         hid = InsertHost(host);
185                 }
186                 return hid;
187         }
188
189         void AddLogEntry(int category, std::string nick, std::string host, std::string source)
190         {
191                 // is the sql module loaded? If not, we don't attempt to do anything.
192                 if (!SQLModule)
193                         return;
194
195                 long nickid = InsertNick(nick);
196                 long sourceid = InsertNick(source);
197                 long hostid = InsertHost(host);
198                 InsertEntry((unsigned)category,(unsigned)nickid,(unsigned)hostid,(unsigned)sourceid,(unsigned long)time(NULL));
199         }
200
201         virtual void OnOper(userrec* user, std::string opertype)
202         {
203                 AddLogEntry(LT_OPER,user->nick,user->host,user->server);
204         }
205
206         virtual void OnGlobalOper(userrec* user)
207         {
208                 AddLogEntry(LT_OPER,user->nick,user->host,user->server);
209         }
210
211         virtual int OnKill(userrec* source, userrec* dest, std::string reason)
212         {
213                 AddLogEntry(LT_KILL,dest->nick,dest->host,source->nick);
214                 return 0;
215         }
216
217         virtual int OnPreCommand(std::string command, char **parameters, int pcnt, userrec *user)
218         {
219                 if ((command == "GLINE") || (command == "KLINE") || (command == "ELINE") || (command == "ZLINE"))
220                 {
221                         AddLogEntry(LT_XLINE,user->nick,command[0]+std::string(":")+std::string(parameters[0]),user->server);
222                 }
223                 return 0;
224         }
225
226         virtual void OnUserConnect(userrec* user)
227         {
228                 AddLogEntry(LT_CONNECT,user->nick,user->host,user->server);
229         }
230
231         virtual void OnGlobalConnect(userrec* user)
232         {
233                 AddLogEntry(LT_CONNECT,user->nick,user->host,user->server);
234         }
235
236         virtual void OnUserQuit(userrec* user, std::string reason)
237         {
238                 AddLogEntry(LT_DISCONNECT,user->nick,user->host,user->server);
239         }
240
241         virtual void OnLoadModule(Module* mod,std::string name)
242         {
243                 AddLogEntry(LT_LOADMODULE,name,Srv->GetServerName(),Srv->GetServerName());
244         }
245
246         virtual ~ModuleSQLLog()
247         {
248         }
249         
250         virtual Version GetVersion()
251         {
252                 return Version(1,0,0,1,VF_VENDOR);
253         }
254         
255 };
256
257 class ModuleSQLLogFactory : public ModuleFactory
258 {
259  public:
260         ModuleSQLLogFactory()
261         {
262         }
263         
264         ~ModuleSQLLogFactory()
265         {
266         }
267         
268         virtual Module * CreateModule(Server* Me)
269         {
270                 return new ModuleSQLLog(Me);
271         }
272         
273 };
274
275
276 extern "C" void * init_module( void )
277 {
278         return new ModuleSQLLogFactory;
279 }
280