]>
git.ipfire.org Git - thirdparty/sarg.git/blob - useragent.c
2 * AUTHOR: Pedro Lineu Orso pedro.orso@gmail.com
4 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
7 * please look at http://sarg.sourceforge.net/donations.php
8 * ---------------------------------------------------------------------
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
26 #include "include/conf.h"
27 #include "include/defs.h"
32 FILE * fp_in
= NULL
, * fp_ou
= NULL
, * fp_ht
= NULL
;
33 char ip
[ MAXLEN
], data
[ MAXLEN
], agent
[ MAXLEN
], user
[ MAXLEN
];
34 char ipbefore
[ MAXLEN
], namebefore
[ MAXLEN
];
36 char user_old
[ MAXLEN
]= "$#%0a3bc6" ;
37 char agent_old
[ MAXLEN
]= "$#%0a3bc6" ;
39 char idate
[ MAXLEN
], fdate
[ MAXLEN
];
41 int agentot
= 0 , agentot2
= 0 , agentdif
= 0 , cont
= 0 , nagent
;
42 unsigned long totregsl
= 0 ;
45 struct getwordstruct gwarea
;
56 sprintf ( tmp3
, "%s/squagent.unsort" , TempDir
);
57 sprintf ( tmp2
, "%s/squagent.log" , TempDir
);
59 if (( fp_in
= fopen ( UserAgentLog
, "r" ))== NULL
) {
60 fprintf ( stderr
, "SARG: (useragent) %s: %s \n " , text
[ 45 ], UserAgentLog
);
64 if (( fp_ou
= fopen ( tmp3
, "w" ))== NULL
) {
65 fprintf ( stderr
, "SARG: (email) %s: %s \n " , text
[ 45 ], tmp3
);
70 debuga ( "%s: %s" , text
[ 66 ], UserAgentLog
);
73 while ( fgets ( buf
, sizeof ( buf
), fp_in
)!= NULL
) {
75 getword_start (& gwarea
, buf
);
76 if ( getword ( ip
, sizeof ( ip
),& gwarea
, ' ' )< 0 || getword_skip ( MAXLEN
,& gwarea
, '[' )< 0 ||
77 getword ( data
, sizeof ( data
),& gwarea
, ' ' )< 0 ) {
78 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , UserAgentLog
);
83 if ( getword_skip ( MAXLEN
,& gwarea
, '"' )< 0 || getword ( agent
, sizeof ( agent
),& gwarea
, '"' )< 0 ) {
84 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , UserAgentLog
);
89 if ( strstr ( warea
, "SCRIPT" ) != 0 || strstr ( warea
, "ONLOAD" ) != 0 )
92 if ( gwarea
. current
[ 0 ]!= '\0' ) {
93 if ( getword_skip ( MAXLEN
,& gwarea
, ' ' )< 0 || getword ( user
, sizeof ( user
),& gwarea
, ' \n ' )< 0 ) {
94 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , UserAgentLog
);
104 fprintf ( fp_ou
, "%s \t %s \t %s \n " , ip
, agent
, user
);
111 debuga ( " %s: %ld" , text
[ 10 ], totregsl
);
118 debuga ( "%s: %s" , text
[ 54 ], tmp2
);
121 sprintf ( csort
, "sort -n -t \"\t\" -k 3,3 -k 2,2 -k 1,1 -o \" %s \" \" %s \" " , tmp2
, tmp3
);
122 cstatus
= system ( csort
);
123 if (! WIFEXITED ( cstatus
) || WEXITSTATUS ( cstatus
)) {
124 fprintf ( stderr
, "SARG: sort command return status %d \n " , WEXITSTATUS ( cstatus
));
125 fprintf ( stderr
, "SARG: sort command: %s \n " , csort
);
128 if (( fp_in
= fopen ( tmp2
, "r" ))== NULL
) {
129 fprintf ( stderr
, "SARG: (useragent) %s: %s \n " , text
[ 45 ], tmp2
);
130 fprintf ( stderr
, "SARG: sort command: %s \n " , csort
);
136 sprintf ( hfile
, "%s/%s/useragent.html" , outdir
, period
);
137 if (( fp_ht
= fopen ( hfile
, "w" ))== NULL
) {
138 fprintf ( stderr
, "SARG: (useragent) %s: %s \n " , text
[ 45 ], hfile
);
143 debuga ( "%s" , text
[ 72 ]);
145 fprintf ( fp_ht
, "<!DOCTYPE HTML PUBLIC \" -//W3C//DTD HTML 4.01 Transitional//EN \" \" http://www.w3.org/TR/html4/loose.dtd \" > \n <html> \n <head> \n <meta http-equiv= \" Content-Type \" content= \" text/html; charset=%s \" > \n " , CharSet
);
147 fputs ( "</head> \n " , fp_ht
);
148 //if(FontFace[0] != '\0') fprintf(fp_ht,"<font face=\"%s\">\n",FontFace);
149 fprintf ( fp_ht
, "<body bgcolor= \" %s \" text= \" %s \" background= \" %s \" > \n " , BgColor
, TxColor
, BgImage
);
150 write_logo_image ( fp_ht
);
152 if ( strcmp ( IndexTree
, "date" ) == 0 )
153 show_sarg ( fp_ht
, "../../.." );
155 show_sarg ( fp_ht
, ".." );
156 fputs ( "<div align= \" center \" ><table cellpadding= \" 0 \" cellspacing= \" 0 \" > \n " , fp_ht
);
157 fprintf ( fp_ht
, "<tr><th align= \" center \" colspan= \" 2 \" ><b><font color= \" %s \" size= \" +1 \" >%s</font></b></th></tr> \n " , TiColor
, text
[ 105 ]);
159 fputs ( "<tr><td></td></tr><tr><td></td></tr>" , fp_ht
);
160 fputs ( "</table></div> \n " , fp_ht
);
162 fputs ( "<div align= \" center \" ><table cellpadding= \" 0 \" cellspacing= \" 0 \" > \n " , fp_ht
);
164 fprintf ( fp_ht
, "<tr><td align= \" right \" bgcolor= \" %s \" >%s:<td align= \" left \" bgcolor= \" %s \" >%s - %s</td></td></tr> \n " , HeaderBgColor
, text
[ 89 ], TxBgColor
, idate
, fdate
);
166 fputs ( "</table></div> \n " , fp_ht
);
167 fputs ( "<div align= \" center \" ><table cellpadding= \" 0 \" cellspacing= \" 0 \" > \n " , fp_ht
);
168 fputs ( "<tr><td></td><td></td></tr>" , fp_ht
);
170 fprintf ( fp_ou
, "<tr><th align= \" left \" bgcolor= \" %s \" ><font color= \" %s \" >%s</font></th><th bgcolor= \" %s \" align= \" left \" ><font color= \" %s \" >%s</font></th></tr> \n " , HeaderBgColor
, HeaderColor
, text
[ 98 ], HeaderBgColor
, HeaderColor
, text
[ 106 ]);
172 while ( fgets ( buf
, sizeof ( buf
), fp_in
)!= NULL
) {
173 getword_start (& gwarea
, buf
);
174 if ( getword ( ip
, sizeof ( ip
),& gwarea
, ' \t ' )< 0 ) {
175 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , tmp2
);
180 if ( strcmp ( ip
, ipbefore
) != 0 ) {
182 ip2name ( ip
, sizeof ( ip
));
183 strcpy ( namebefore
, ip
);
184 } else strcpy ( ip
, namebefore
);
187 if ( getword ( agent
, sizeof ( agent
),& gwarea
, ' \t ' )< 0 ||
188 getword ( user
, sizeof ( user
),& gwarea
, ' \t ' )< 0 ) {
189 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , tmp2
);
193 if ( strcmp ( user
, user_old
) != 0 ) {
194 fprintf ( fp_ht
, "<tr><td align= \" left \" bgcolor= \" %s \" >%s</td><td align= \" left \" bgcolor= \" %s \" >%s</td></tr> \n " , TxBgColor
, user
, TxBgColor
, agent
);
195 strcpy ( user_old
, user
);
196 strcpy ( agent_old
, agent
);
198 if ( strcmp ( agent
, agent_old
) != 0 ) {
199 fprintf ( fp_ht
, "<tr><td></td><td align= \" left \" bgcolor= \" %s \" >%s</td></tr> \n " , TxBgColor
, agent
);
200 strcpy ( agent_old
, agent
);
205 fputs ( "</table> \n " , fp_ht
);
209 sprintf ( csort
, "sort -t \"\t\" -k 2,2 -o \" %s \" \" %s \" " , tmp3
, tmp2
);
210 cstatus
= system ( csort
);
211 if (! WIFEXITED ( cstatus
) || WEXITSTATUS ( cstatus
)) {
212 fprintf ( stderr
, "SARG: sort command return status %d \n " , WEXITSTATUS ( cstatus
));
213 fprintf ( stderr
, "SARG: sort command: %s \n " , csort
);
216 if (( fp_in
= fopen ( tmp3
, "r" ))== NULL
) {
217 fprintf ( stderr
, "SARG: (useragent) %s: %s \n " , text
[ 45 ], tmp3
);
218 fprintf ( stderr
, "SARG: sort command: %s \n " , csort
);
224 if (( fp_ou
= fopen ( tmp2
, "w" ))== NULL
) {
225 fprintf ( stderr
, "SARG: (useragent) %s: %s \n " , text
[ 45 ], tmp2
);
232 while ( fgets ( buf
, sizeof ( buf
), fp_in
)!= NULL
) {
233 getword_start (& gwarea
, buf
);
234 if ( getword ( ip
, sizeof ( ip
),& gwarea
, ' \t ' )< 0 ||
235 getword ( agent
, sizeof ( agent
),& gwarea
, ' \t ' )< 0 ) {
236 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , tmp
);
242 strcpy ( agent_old
, agent
);
245 if ( strcmp ( agent
, agent_old
) != 0 ) {
247 fprintf ( fp_ou
, "%06d %s \n " , agentot
, agent_old
);
248 strcpy ( agent_old
, agent
);
255 fprintf ( fp_ou
, "%06d %s \n " , agentot
, agent
);
263 sprintf ( csort
, "sort -n -r -k 1,1 -o \" %s \" \" %s \" " , tmp3
, tmp2
);
264 cstatus
= system ( csort
);
265 if (! WIFEXITED ( cstatus
) || WEXITSTATUS ( cstatus
)) {
266 fprintf ( stderr
, "SARG: sort command return status %d \n " , WEXITSTATUS ( cstatus
));
267 fprintf ( stderr
, "SARG: sort command: %s \n " , csort
);
270 if (( fp_in
= fopen ( tmp3
, "r" ))== NULL
) {
271 fprintf ( stderr
, "SARG: (useragent) %s: %s \n " , text
[ 45 ], tmp3
);
272 fprintf ( stderr
, "SARG: sort command: %s \n " , csort
);
278 if (( fp_ht
= fopen ( hfile
, "a" ))== NULL
) {
279 fprintf ( stderr
, "SARG: (useragent) %s: %s \n " , text
[ 45 ], hfile
);
283 fputs ( "<br><br> \n " , fp_ht
);
285 fputs ( "<div align= \" center \" ><table cellpadding= \" 0 \" cellspacing= \" 0 \" > \n " , fp_ht
);
286 fprintf ( fp_ht
, "<tr><th align= \" left \" bgcolor= \" %s \" ><font color= \" %s \" >%s</font></th><th bgcolor= \" %s \" align= \" left \" ><font color= \" %s \" >%s</font></th><th align= \" center \" bgcolor= \" %s \" ><font color= \" %s \" >%%</font></th></tr> \n " , HeaderBgColor
, HeaderColor
, text
[ 106 ], HeaderBgColor
, HeaderColor
, text
[ 107 ], HeaderBgColor
, HeaderColor
);
289 while ( fgets ( buf
, sizeof ( buf
), fp_in
)!= NULL
) {
291 getword_start (& gwarea
, buf
);
292 if ( getword ( tagent
, sizeof ( tagent
),& gwarea
, ' ' )< 0 ) {
293 printf ( "SARG: Maybe you have a broken record or garbage in your %s file. \n " , tmp
);
299 perc
= perc
/ agentot2
;
302 fprintf ( fp_ht
, "<tr><td align= \" left \" bgcolor= \" %s \" >%s</td><td align= \" right \" bgcolor= \" %s \" >%d</td><td align= \" right \" bgcolor= \" %s \" >%3.2f</td></tr> \n " , TxBgColor
, gwarea
. current
, TxBgColor
, nagent
, TxBgColor
, perc
);
305 fputs ( "</table></html> \n " , fp_ht
);
307 zdate ( ftime
, sizeof ( ftime
), DateFormat
);
308 fprintf ( fp_ht
, "<br><br><div align= \" center \" ><font size= \" -2 \" >%s <a href= \" %s \" >%s-%s</a> %s %s</font></div> \n " , text
[ 108 ], URL
, PGM
, VERSION
, text
[ 109 ], ftime
);
311 fputs ( "</table> \n </body> \n </html> \n " , fp_ht
);