2 * AUTHOR: Pedro Lineu Orso orso@penguintech.com.br
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"
29 int getdata(char *, FILE *);
30 void datashow(char *);
31 static void getlog(void);
32 static void header(void);
37 char ouser
[MAXLEN
]="";
47 static void getlog(void)
49 FILE *tmp
, *fp
, *fp_usr
;
50 char template1
[255]="/var/tmp/sargtpl1.XXXXXX";
51 char template2
[255]="/var/tmp/sargtpl2.XXXXXX";
57 if(UserTabFile
[0] != '\0') {
59 sprintf(msg
,"%s: %s",text
[86],UserTabFile
);
62 if((fp_usr
=fopen(UserTabFile
,"r"))==NULL
) {
63 fprintf(stderr
, "SARG: (realtime) %s: %s - %s\n",text
[45],UserTabFile
,strerror(errno
));
66 nreg
= lseek(fileno(fp_usr
), 0, SEEK_END
);
67 lseek(fileno(fp_usr
), 0, 0);
68 if((userfile
=(char *) malloc(nreg
+100))==NULL
){
69 fprintf(stderr
, "SARG ERROR: %s",text
[87]);
72 bzero(userfile
,nreg
+100);
73 strncat(userfile
,":",1);
76 while(fgets(buf
,sizeof(buf
),fp_usr
)!=NULL
){
77 buf
[strlen(buf
)-1]='\0';
78 if(strstr(buf
,"\r") != 0) buf
[strlen(buf
)-1]='\0';
79 if (getword(bufy
,sizeof(bufy
),buf
,' ')<0) {
80 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",UserTabFile
);
83 for(z1
=0; z1
<=strlen(bufy
); z1
++) {
84 userfile
[z2
]=bufy
[z1
];
87 strncat(userfile
,":",1);
88 for(z1
=0; z1
<=strlen(buf
); z1
++) {
92 strncat(userfile
,":",1);
97 fd1
= mkstemp(template1
);
98 fd2
= mkstemp(template2
);
100 if((fd1
== -1 ) || ((tmp
= fdopen (fd1
, "w+" )) == NULL
) ) { /* failure, bail out */
101 fprintf(stderr
, "SARG: (realtime) mkstemp error - %s\n",strerror(errno
));
105 sprintf(cmd
,"tail -%d %s",realtime_access_log_lines
,AccessLog
);
106 fp
= popen(cmd
, "r");
107 while(fgets(buf
,sizeof(buf
),fp
) != NULL
)
108 if (getdata(buf
,tmp
)<0) {
109 fprintf(stderr
,"SARG: Maybe a broken record or garbage was returned by %s.\n",cmd
);
115 sprintf(cmd
,"sort -r -k 1,1 -k 2,2 -o %s %s",template2
,template1
);
117 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
118 fprintf(stderr
, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus
));
119 fprintf(stderr
, "SARG: sort command: %s\n",cmd
);
126 int getdata(char *rec
, FILE *ftmp
)
131 if (getword3(dat
,sizeof(dat
),rec
,' ')<0) {
132 fprintf(stderr
,"SARG: The time stamp at column 1 is too long.\n");
135 if (getword3(warea
,sizeof(warea
),rec
,' ')<0) {
136 fprintf(stderr
,"SARG: The connection duration at column 2 is too long.\n");
139 while(strcmp(warea
,"") == 0 && strlen(rec
) > 0)
140 if (getword3(warea
,sizeof(warea
),rec
,' ')<0) {
143 if (getword3(ip
,sizeof(ip
),rec
,' ')<0) {
144 fprintf(stderr
,"SARG: The IP address at column 3 is too long.\n");
147 if (getword3(warea
,sizeof(warea
),rec
,' ')<0) {
148 fprintf(stderr
,"SARG: The status at column 4 is too long.\n");
151 if (getword3(warea
,sizeof(warea
),rec
,' ')<0) {
152 fprintf(stderr
,"SARG: The size at column 5 is too long.\n");
155 if (getword3(typ
,sizeof(typ
),rec
,' ')<0) {
156 fprintf(stderr
,"SARG: The action at column 6 is too long.\n");
159 if(strncmp(typ
,"CONNECT",7) == 0) {
160 if (getword3(url
,sizeof(url
),rec
,' ')<0) {
163 if (getword3(user
,sizeof(user
),rec
,' ')<0) {
167 if (getword3(url
,sizeof(url
),rec
,'/')<0) {
168 fprintf(stderr
,"SARG: The URL at column 7 is too long.\n");
171 if (getword3(url
,sizeof(url
),rec
,'/')<0) {
172 fprintf(stderr
,"SARG: The URL at column 7 is too long.\n");
175 if (getword3(url
,sizeof(url
),rec
,'/')<0) {
176 fprintf(stderr
,"SARG: The URL at column 7 is too long.\n");
179 if (getword3(user
,sizeof(user
),rec
,' ')<0) {
180 fprintf(stderr
,"SARG: The data at column 8 is too long.\n");
183 if (getword3(user
,sizeof(user
),rec
,' ')<0) {
184 fprintf(stderr
,"SARG: The user at column 9 is too long.\n");
189 if(strncmp(user
,"-",1) == 0 && strcmp(RealtimeUnauthRec
,"ignore") == 0)
194 if(strncmp(DateFormat
,"u",1) == 0)
195 strftime(tbuf
, 127, "%Y-%m-%d %H:%M", t
);
196 else if(strncmp(DateFormat
,"e",1) == 0)
197 strftime(tbuf
, 127, "%d-%m-%Y %H:%M", t
);
199 fprintf(ftmp
,"%s %s %s %s %s\n",tbuf
,ip
,user
,url
,typ
);
203 void datashow(char *tmp
)
208 if((fin
=fopen(tmp
,"r"))==NULL
) {
209 fprintf(stderr
, "SARG: (realtime) open error %s - %s\n",tmp
,strerror(errno
));
215 while(fgets(buf
, MAXLEN
, fin
)) {
216 buf
[strlen(buf
)-1]='\0';
217 if (getword3(dat
,sizeof(dat
),buf
,' ')<0) {
218 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp
);
221 if (getword3(tim
,sizeof(tim
),buf
,' ')<0) {
222 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp
);
225 if (getword3(ip
,sizeof(ip
),buf
,' ')<0) {
226 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp
);
229 if (getword3(user
,sizeof(user
),buf
,' ')<0) {
230 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp
);
233 if(strlen(dat
) < 3 || strlen(user
) < 1) continue;
234 if (getword3(url
,sizeof(url
),buf
,' ')<0) {
235 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp
);
238 if (getword3(typ
,sizeof(typ
),buf
,' ')<0) {
239 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp
);
242 if(strstr(RealtimeTypes
,typ
) == 0)
245 if(strcmp(ouser
,user
) == 0 && strcmp(ourl
,url
) == 0)
249 if(strcmp(Ip2Name
,"yes") == 0)
250 ip2name(u2
,sizeof(u2
));
251 if(UserTabFile
[0] != '\0') {
252 sprintf(warea
,":%s:",u2
);
253 if((str
=(char *) strstr(userfile
,warea
)) != (char *) NULL
) {
255 str2
=(char *) strstr(str
+1,":");
258 while(str2
[z1
] != ':') {
262 } else strcpy(name
,u2
);
263 } else strcpy(name
,u2
);
265 if(dotinuser
&& strstr(name
,"_")) {
266 str2
=(char *)subs(name
,"_",".");
270 printf("<tr><td class=\"data\">%s %s</td><td class=\"data3\">%s</td><td class=\"data3\">%s</td><td class=\"data3\">%s</td><td class=\"data2\"><a href=\"http://%s\">%s</td></tr>\n",dat
,tim
,ip
,name
,typ
,url
,url
);
275 puts("</table>\n</html>\n");
282 static void header(void)
284 puts("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"");
285 puts(" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
289 printf(" <meta http-equiv=refresh content=\"%d\" url=\"sarg-php/sarg-realtime.php\"; charset=\"%s\">\n",realtime_refresh
,CharSet
);
291 printf(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet
);
294 printf(buf
,"<body style=\"font-family:%s;font-size:%s;background-color:%s;background-image:url(%s)\">\n",FontFace
,TitleFontSize
,BgColor
,BgImage
);
295 puts("<center><table cellpadding=\"1\" cellspacing=\"1\">\n");
296 printf("<tr><th class=\"title2\" colspan=\"10\">SARG %s</th></tr>\n",text
[134]);
297 printf("<tr><th class=\"text\" colspan=\"10\">%s: %d s</th></tr>\n",text
[136],realtime_refresh
);
298 printf("<tr><th class=\"header3\">%s</th><th class=\"header3\">%s</th><th class=\"header3\">%s</th><th class=\"header3\">%s</th><th class=\"header\">%s</th></tr>\n",text
[110],text
[111],text
[98],text
[135],text
[91]);