]> git.ipfire.org Git - thirdparty/sarg.git/blame - readlog_squid.c
Use a global constant instead of the "index.html" file name in the code
[thirdparty/sarg.git] / readlog_squid.c
CommitLineData
1c91da07
FM
1/*
2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
67302a9e 3 * 1998, 2013
1c91da07
FM
4 *
5 * SARG donations:
6 * please look at http://sarg.sourceforge.net/donations.php
7 * Support:
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
9 * ---------------------------------------------------------------------
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
24 *
25 */
26
27#include "include/conf.h"
28#include "include/defs.h"
f83d7b44 29#include "include/readlog.h"
1c91da07
FM
30
31/*!
32A new file is being read. The name of the file is \a FileName.
33*/
34static void Squid_NewFile(const char *FileName)
35{
36}
37
38/*!
39Read one entry from a standard squid log format.
40
41\param Line One line from the input log file.
42\param Entry Where to store the information parsed from the line.
43
44\retval RLRC_NoError One valid entry is parsed.
45\retval RLRC_Unknown The line is invalid.
46\retval RLRC_InternalError An internal error was encountered.
47*/
48static enum ReadLogReturnCodeEnum Squid_ReadEntry(char *Line,struct ReadLogStruct *Entry)
49{
50 const char *Begin;
51 time_t log_time;
52 int IpLen;
53 int HttpCodeLen;
54 int UrlLen;
55 int UserLen;
cb53374b 56 struct tm *tt;
f83d7b44
FM
57 char *Ip;
58 char *User;
bd43d81f 59
1c91da07
FM
60 // get log time.
61 Begin=Line;
62 log_time=0;
63 while (isdigit(*Line)) log_time=log_time*10+(*Line++-'0');
64 if (*Line!='.' || Line==Begin) return(RLRC_Unknown);
bd43d81f 65
1c91da07
FM
66 // ignore decimal part to log time.
67 Begin=++Line;
68 while (isdigit(*Line)) Line++;
69 if (*Line!=' ' || Line==Begin) return(RLRC_Unknown);
bd43d81f 70
1c91da07
FM
71 // skip spaces before the elapsed time.
72 while (*Line==' ') Line++;
73 if (!isdigit(*Line)) return(RLRC_Unknown);
bd43d81f 74
1c91da07
FM
75 // get the elapsed time.
76 Begin=Line;
77 Entry->ElapsedTime=0L;
78 while (isdigit(*Line)) Entry->ElapsedTime=Entry->ElapsedTime*10+(*Line++-'0');
79 if (*Line!=' ' || Line==Begin) return(RLRC_Unknown);
80
81 // get IP address. It can be a fqdn if that option is enabled in squid.
f83d7b44 82 Entry->Ip=Ip=++Line;
1c91da07
FM
83 for (IpLen=0 ; *Line && *Line!=' ' ; IpLen++) Line++;
84 if (*Line!=' ' || IpLen==0) return(RLRC_Unknown);
85
86 // get the HTTP code.
87 Entry->HttpCode=++Line;
88 for (HttpCodeLen=0 ; *Line && *Line!=' ' ; HttpCodeLen++) Line++;
89 if (*Line!=' ' || HttpCodeLen==0) return(RLRC_Unknown);
90
91 // get the number of transfered bytes.
92 Begin=++Line;
93 Entry->DataSize=0LL;
94 while (isdigit(*Line)) Entry->DataSize=Entry->DataSize*10+(*Line++-'0');
95 if (*Line!=' ' || Begin==Line) return(RLRC_Unknown);
bd43d81f 96
1c91da07
FM
97 // skip the HTTP function
98 Begin=++Line;
99 while (*Line && *Line!=' ') Line++;
100 if (*Line!=' '|| Line==Begin) return(RLRC_Unknown);
bd43d81f 101
1c91da07
FM
102 // the url
103 Entry->Url=++Line;
104 for (UrlLen=0 ; *Line && *Line!=' ' ; UrlLen++) Line++;
105 if (*Line!=' ' || UrlLen==0) return(RLRC_Unknown);
bd43d81f 106
1c91da07 107 // the ID of the user or - if the user is unidentified
f83d7b44 108 Entry->User=User=++Line;
1c91da07
FM
109 for (UserLen=0 ; *Line && *Line!=' ' ; UserLen++) Line++;
110 if (*Line!=' ' || UserLen==0) return(RLRC_Unknown);
bd43d81f 111
1c91da07 112 // now, the format is known with a good confidence. If the time doesn't decode, it is an error.
cb53374b
FM
113 tt=localtime(&log_time);
114 if (tt==NULL) {
1c91da07
FM
115 debuga(_("Cannot convert the timestamp from the squid log file\n"));
116 return(RLRC_InternalError);
117 }
cb53374b 118 memcpy(&Entry->EntryTime,tt,sizeof(struct tm));
bd43d81f 119
1c91da07 120 // it is safe to alter the line buffer now that we are returning a valid entry
f83d7b44 121 Ip[IpLen]='\0';
1c91da07
FM
122 Entry->HttpCode[HttpCodeLen]='\0';
123 Entry->Url[UrlLen]='\0';
f83d7b44 124 User[UserLen]='\0';
bd43d81f 125
1c91da07
FM
126 return(RLRC_NoError);
127}
128
129//! \brief Object to read a standard squid log format.
130const struct ReadLogProcessStruct ReadSquidLog=
131{
132 /* TRANSLATORS: This is the name of the log format displayed when this format is detected in an input log file. */
133 N_("squid log format"),
134 Squid_NewFile,
135 Squid_ReadEntry
136};