]>
Commit | Line | Data |
---|---|---|
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 | /*! | |
32 | A new file is being read. The name of the file is \a FileName. | |
33 | */ | |
34 | static void Squid_NewFile(const char *FileName) | |
35 | { | |
36 | } | |
37 | ||
38 | /*! | |
39 | Read 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 | */ | |
48 | static 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. | |
130 | const 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 | }; |