00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef Site_History_HPP
00012 #define Site_History_HPP
00013
00014 #include <fstream>
00015 #include "read_write_base.hpp"
00016 #include "ocXML.h"
00017 #include <set>
00018
00019 using namespace std;
00020
00021 typedef set<string> filterSets;
00022
00023 class Site_History_Obj: public read_write_base
00024 {
00025 private:
00026 streampos lastPos;
00027 filterSets accept;
00028 filterSets reject;
00029 public:
00030 identifier Id;
00031 string Remote_Host;
00032 string Remote_Log;
00033 string Remote_User;
00034 time_date Request_Time;
00035 string Method;
00036 string Resource_Requested;
00037 string Protocol;
00038 string Original_Status;
00039 int Response_Size;
00040 string Referer;
00041 string User_Agent;
00042 string log_file;
00043 Site_History_Obj():read_write_base(),lastPos(0)
00044 ,Id(0LL)
00045 ,Remote_Host("")
00046 ,Remote_Log("")
00047 ,Remote_User("")
00048 ,Request_Time( )
00049 ,Method("")
00050 ,Resource_Requested("")
00051 ,Protocol("")
00052 ,Original_Status("")
00053 ,Response_Size(0)
00054 ,Referer("")
00055 ,User_Agent("")
00056 ,log_file("")
00057 {
00058
00059 data_name("Site_History");
00060
00061 addDXMap( new llongXfer("Id", &Id ));
00062 addDXMap( new stringXfer("Remote_Host", &Remote_Host ));
00063 addDXMap( new stringXfer("Remote_Log", &Remote_Log ));
00064 addDXMap( new stringXfer("Remote_User", &Remote_User ));
00065 addDXMap( new time_dateXfer("Request_Time", &Request_Time ));
00066 addDXMap( new stringXfer("Method", &Method ));
00067 addDXMap( new stringXfer("Resource_Requested", &Resource_Requested ));
00068 addDXMap( new stringXfer("Protocol", &Protocol ));
00069 addDXMap( new stringXfer("Original_Status", &Original_Status ));
00070 addDXMap( new intXfer("Response_Size", &Response_Size ));
00071 addDXMap( new stringXfer("Referer", &Referer ));
00072 addDXMap( new stringXfer("User_Agent", &User_Agent ));
00073 addDXMap( new stringXfer("log_file", &log_file ));
00074 }
00075 void getFilters( xmlParser & parser )
00076 {
00077 node_vector::iterator apos = parser.findFirstNodeByName( "accept" );
00078 while( apos != parser.nodeList().end() )
00079 {
00080 accept.insert( apos->data );
00081 apos = parser.findNextNodeByName( "accept" );
00082 }
00083 node_vector::iterator rpos = parser.findFirstNodeByName( "reject" );
00084 while( rpos != parser.nodeList().end() )
00085 {
00086 reject.insert( rpos->data );
00087 rpos = parser.findNextNodeByName( "reject" );
00088 }
00089 }
00090
00091
00092
00093 bool load(void)
00094 {
00095 bool ret = false;
00096
00097 ifstream setUp( "siteStatSetup.xml" );
00098 if( setUp )
00099 {
00100 cout << "opened setup file" << endl;
00101 xmlParser parser( &setUp );
00102 parser.parse();
00103
00104 node_vector::iterator pos = parser.findFirstNodeByName( "logfile" );
00105 if( pos != parser.nodeList().end() )
00106 {
00107 log_file = pos->attr["name"];
00108 getFilters(parser);
00109 cout << "Got logfile node from setup: logfile is " << pos->attr["path"] << endl;
00110 cout << "Initial seek pos is " << pos->attr["seekpos"] << endl;
00111 ret = load( pos->attr["name"],
00112 pos->attr["path"],
00113 pos->attr["seekpos"] );
00114 ocString lpos;
00115 lpos.append( lastPos );
00116 pos->attr["seekpos"] = lpos;
00117 }
00118 if( setUp ) setUp.close();
00119 ofstream wSetUp( "siteStatSetup.xml",ios_base::out | ios_base::trunc);
00120 if( wSetUp )
00121 {
00122 wSetUp << parser.emit() << endl;
00123 }
00124
00125
00126 }
00127 else
00128 {
00129 cout << "no setup file?" << endl;
00130 }
00131 return ret;
00132 }
00133 bool load( string name, string path, string seekpos )
00134 {
00135 ifstream logFile(path.c_str());
00136 if( logFile )
00137 {
00138 char linebuffer[9000];
00139 cout << " opened " << path << endl;
00140 lastPos = atoi(seekpos.c_str());
00141 if( lastPos > 0 )
00142 {
00143
00144 logFile.seekg(lastPos);
00145 logFile.getline(linebuffer,sizeof(linebuffer));
00146 }
00147
00148 while( logFile )
00149 {
00150 lastPos = logFile.tellg();
00151
00152 logFile.getline(linebuffer,sizeof(linebuffer));
00153 parseItem( linebuffer );
00154 }
00155 }
00156 else
00157 {
00158 cout << " could not open " << path << endl;
00159 }
00160 }
00161 bool parseItem( char* lineBuf )
00162 {
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 if( lineBuf && strlen( lineBuf ) )
00179 {
00180 ocString aiBuf = lineBuf;
00181 Remote_Host = aiBuf.parse(" ");
00182
00183 Remote_Log = aiBuf.parse(" ");
00184
00185 Remote_User = aiBuf.parse(" [");
00186
00187
00188
00189 ocString timestr = aiBuf.parse("] \"");
00190 timestr = timestr.replace(":"," ");
00191 timestr = timestr.parse(" -");
00192 Request_Time.parse(timestr.c_str(),"%d/%b/%Y %T");
00193 Request_Time.normalize();
00194
00195
00196 Method = aiBuf.parse(" ");
00197
00198 Resource_Requested = aiBuf.parse(" ");
00199
00200 Protocol = aiBuf.parse("\" ");
00201
00202
00203 Original_Status = aiBuf.parse(" ");
00204
00205 Response_Size = atoi(aiBuf.parse(" \"").c_str());
00206
00207 Referer = aiBuf.parse("\" \"");
00208
00209 User_Agent = aiBuf.parse("\"");
00210
00211
00212 if( filterPass() )
00213 {
00214 db_insert();
00215 }
00216
00217 }
00218 return true;
00219 }
00220 bool filterPass( void )
00221 {
00222 bool pass = false;
00223 filterSets::iterator pos = accept.begin();
00224 while( pos != accept.end() && pass == false )
00225 {
00226 ocString toFilter = Resource_Requested;
00227 string filter = *pos;
00228 if( toFilter.regExMatch(filter.c_str() ) )
00229 {
00230 pass = true;
00231 }
00232 ++pos;
00233 }
00234 pos = reject.begin();
00235 while( pos != reject.end() && pass == true )
00236 {
00237 ocString toFilter = Resource_Requested;
00238 string filter = *pos;
00239 if( toFilter.regExMatch(filter.c_str() ) )
00240 {
00241 pass = false;
00242 }
00243 ++pos;
00244 }
00245 return pass;
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 };
00263 #endif
00264
00265
00266