]>
git.ipfire.org Git - thirdparty/sarg.git/blob - squidguard_log.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"
29 static char **files_done
= NULL
;
30 static int nfiles_done
= 0;
33 static void read_log(const char *wentp
, FILE *fp_ou
)
37 char leks
[5], sep
[2], res
[MAXLEN
];
38 char mon
[10], hour
[15];
47 if (getword(urly
,sizeof(urly
),buf
,' ')<0 || getword(href
,sizeof(href
),buf
,' ')<0) {
48 printf("SARG: Maybe you have a broken record or garbage in your %s string.\n",text
[7]);
51 debuga("%s squidGuard %s: %s",urly
,buf
,wentp
);
54 /* With squidGuard, you can log groups in only one log file.
55 We must parse each log files only one time. Example :
57 domainlist porn/domains
62 domainlist aggressive/domains
63 urllist aggressive/urls
67 domainlist audio-video/domains
68 urllist audio-video/urls
72 for (i
=0; i
<nfiles_done
; i
++)
73 if (!strcmp(wentp
, files_done
[i
])) return;
76 files_done
= realloc(files_done
, nfiles_done
*sizeof(char *));
78 perror("parse squidGuard - realloc");
81 files_done
[nfiles_done
-1] = strdup(wentp
);
82 if (!files_done
[nfiles_done
-1]) {
83 perror("parse squidGuard - strdup");
87 if ((fp_in
=fopen(wentp
,"r"))==NULL
) {
88 fprintf(stderr
, "SARG: (squidguard) %s: %s\n",text
[8],wentp
);
92 while (fgets(buf
,sizeof(buf
),fp_in
) != NULL
) {
93 if(strlen(SquidGuardLogFormat
) > 0) {
94 strcpy(bufbsf
,SquidGuardLogFormat
);
96 if (getword(leks
,sizeof(leks
),bufbsf
,'#')<0) {
97 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wentp
);
100 while(strcmp(leks
,"end") != 0) {
101 if (getword(leks
,sizeof(leks
),bufbsf
,'#')<0 || getword(sep
,sizeof(sep
),bufbsf
,'#')<0) {
102 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wentp
);
105 if(strcmp(leks
,"end") != 0) {
106 if (getword(res
,sizeof(res
),buf
,sep
[0])<0) {
107 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wentp
);
110 if(strcmp(leks
,"year") == 0)
112 else if(strcmp(leks
,"year") == 0)
114 else if(strcmp(leks
,"mon") == 0)
116 else if(strcmp(leks
,"day") == 0)
118 else if(strcmp(leks
,"hour") == 0)
120 else if(strcmp(leks
,"list") == 0)
122 else if(strcmp(leks
,"ip") == 0)
124 else if(strcmp(leks
,"user") == 0)
126 else if(strcmp(leks
,"url") == 0)
131 if (getword(year
,sizeof(year
),buf
,'-')<0 || getword(mon
,sizeof(mon
),buf
,'-')<0 ||
132 getword(day
,sizeof(day
),buf
,' ')<0 || getword(hour
,sizeof(hour
),buf
,' ')<0 ||
133 getword(list
,sizeof(list
),buf
,'/')<0 || getword(list
,sizeof(list
),buf
,'/')<0 ||
134 getword(tmp5
,sizeof(tmp5
),buf
,'/')<0 || getword(tmp5
,sizeof(tmp5
),buf
,'/')<0 ||
135 getword(url
,sizeof(url
),buf
,' ')<0 ||
136 getword(ip
,sizeof(ip
),buf
,'/')<0 || getword(user
,sizeof(user
),buf
,' ')<0 ||
137 getword(user
,sizeof(user
),buf
,' ')<0) {
138 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",wentp
);
145 sprintf(warea
,"%s%s%s",year
,mon
,day
);
146 sprintf(wdata
,"%s%s%s",year
,mon
,day
);
149 if(strcmp(SquidguardIgnoreDate
,"on") == 0) {
150 if(idata
< dfrom
|| idata
> duntil
)
154 if (strcmp(user
,"-") == 0) {
156 memset(ip
,0,sizeof(ip
));
158 fprintf(fp_ou
,"%s\t%s%s%s\t%s\t%s\t%s\t%s\n",user
,year
,mon
,day
,hour
,ip
,url
,list
);
161 if (fp_in
) fclose(fp_in
);
166 void squidguard_log(void)
168 FILE *fp_ou
= NULL
, *fp_guard
= NULL
;
169 char guard_in
[MAXLEN
];
170 char guard_ou
[MAXLEN
];
172 char year
[10], day
[10], mon
[10];
181 if(strlen(SquidGuardConf
) < 1 && strlen(SquidGuardLogAlternate
) < 1)
184 if (strlen(SquidGuardLogAlternate
) > 0)
185 SquidGuardConf
[0]='\0';
187 sprintf(guard_in
,"%s/squidguard.unsort",tmp
);
188 sprintf(guard_ou
,"%s/squidguard.log",tmp
);
189 if((fp_ou
=fopen(guard_in
,"a"))==NULL
) {
190 fprintf(stderr
, "SARG: (squidguard) %s: %s\n",text
[8],guard_in
);
198 if(strcmp(SquidguardIgnoreDate
,"on") == 0) {
199 if(strcmp(df
,"e") == 0) {
200 strncpy(day
,period
,2);
201 strncpy(mon
,period
+2,3);
202 strncpy(year
,period
+5,4);
204 sprintf(warea
,"%s%s%s",year
,mon
,day
);
206 strncpy(day
,period
+10,2);
207 strncpy(mon
,period
+12,3);
208 strncpy(year
,period
+15,4);
210 sprintf(warea
,"%s%s%s",year
,mon
,day
);
213 strncpy(day
,period
+7,2);
214 strncpy(mon
,period
+4,3);
215 strncpy(year
,period
,4);
217 sprintf(warea
,"%s%s%s",year
,mon
,day
);
219 strncpy(day
,period
+17,2);
220 strncpy(mon
,period
+14,3);
221 strncpy(year
,period
+10,4);
223 sprintf(warea
,"%s%s%s",year
,mon
,day
);
228 if(SquidGuardConf
[0] != 0) {
229 if(access(SquidGuardConf
, R_OK
) != 0) {
230 debuga("Cannot open squidGuard config file: %s",SquidGuardConf
);
234 if((fp_guard
=fopen(SquidGuardConf
,"r"))==NULL
) {
235 fprintf(stderr
, "SARG: (squidguard) %s: %s\n",text
[8],SquidGuardConf
);
240 while(fgets(buf
,sizeof(buf
),fp_guard
)!=NULL
) {
241 if(strstr(buf
,"\n") != 0)
242 buf
[strlen(buf
)-1]='\0';
243 if((str
=get_param_value("logdir",buf
))!=NULL
) {
244 if (getword(logdir
,sizeof(logdir
),str
,' ')<0) {
245 printf("SARG: Maybe you have an invalid logdir line in your %s file.\n",SquidGuardConf
);
248 } else if((str
=get_param_value("log",buf
))!=NULL
) {
249 if((str2
=get_param_value("anonymous",str
))!=NULL
)
253 If logdir is defined, we prepend it to the log file name, otherwise, we assume
254 the log directive provides an absolute file name to the log file. Therefore,
255 we don't need to add an additionnal / at the beginning of the log file name.
257 y
=(logdir
[0]) ? sprintf(wentp
,"%s/",logdir
) : 0;
259 Spaces are allowed in the name of the log file. The file name ends at the first #
260 because it is assumed it is an end of line comment. Any space before the # is then
261 removed. Any control character (i.e. a character with a code lower than 32) ends
262 the file name. That includes the terminating zero.
264 while((unsigned char)*str
>=' ' && *str
!='#' && y
<sizeof(wentp
)-1)
268 while(*str
==' ' && y
>0) {
274 read_log(wentp
,fp_ou
);
278 sprintf(wentp
,"%s",SquidGuardLogAlternate
);
279 read_log(wentp
,fp_ou
);
282 if (fp_guard
) fclose(fp_guard
);
283 if (fp_ou
) fclose(fp_ou
);
286 for (y
=0; y
<nfiles_done
; y
++)
287 if (files_done
[y
]) free(files_done
[y
]);
292 debuga("%s: %s",text
[54],guard_ou
);
295 sprintf(tmp6
,"sort -k 1,1 -k 2,2 -k 4,4 \"%s\" -o \"%s\"",guard_in
, guard_ou
);
296 cstatus
=system(tmp6
);
297 if (!WIFEXITED(cstatus
) || WEXITSTATUS(cstatus
)) {
298 fprintf(stderr
, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus
));
299 fprintf(stderr
, "SARG: sort command: %s\n",tmp6
);