]> git.ipfire.org Git - thirdparty/sarg.git/blame - datafile.c
Add support to decompress xz files
[thirdparty/sarg.git] / datafile.c
CommitLineData
25697a35 1/*
94ff9470 2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
110ce984 3 * 1998, 2015
25697a35
GS
4 *
5 * SARG donations:
6 * please look at http://sarg.sourceforge.net/donations.php
1164c474
FM
7 * Support:
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
25697a35
GS
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"
5f3cfd1d 28#include "include/defs.h"
25697a35 29
51f6da27 30static void saverecs(FILE *fp_ou, const struct userinfostruct *uinfo, long long int nacc, const char *url, long long int nbytes, const char *ip, const char *hora, const char *dia, long long int nelap, long long int incache, long long int oucache);
25697a35
GS
31
32void data_file(char *tmp)
33{
800eafb8
FM
34 FileObject *fp_in;
35 FILE *fp_ou=NULL;
25697a35 36
9bd92830
FM
37 char *buf;
38 char accdia[11], acchora[9], accip[MAXLEN], *accurl;
39 char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN];
40 char *oldurl;
5025f299 41 char acccode[50], oldacccode[50];
9bd92830
FM
42 char ipantes[MAXLEN], nameantes[MAXLEN];
43 char accsmart[MAXLEN];
44 char crc2[50];
45 char *str;
46 char tmp3[MAXLEN];
9bd92830 47 char u2[MAX_USER_LEN];
b6b6cb8c 48 char userlabel[MAX_USER_LEN];
93551487 49 userscan uscan;
9bd92830
FM
50 long long int nbytes=0;
51 long long int nelap=0;
52 long long int nacc=0;
53 int rtotal=0;
54 long long int incache=0;
55 long long int oucache=0;
56 long long int accbytes;
57 long long int accelap;
9bd92830
FM
58 int new_user;
59 int same_url;
60 int url_len;
61 int ourl_size;
62 struct getwordstruct gwarea;
63 struct userinfostruct *uinfo;
64 longline line;
25697a35 65
da56e0c2
FM
66 init_usertab(UserTabFile);
67
9bd92830
FM
68 ipantes[0]='\0';
69 nameantes[0]='\0';
25697a35 70
9bd92830
FM
71 oldurl=NULL;
72 ourl_size=0;
25697a35 73
93551487
FM
74 uscan=userinfo_startscan();
75 if (uscan == NULL) {
af961877 76 debuga(__FILE__,__LINE__,_("Cannot enumerate the user list\n"));
9bd92830
FM
77 exit(EXIT_FAILURE);
78 }
93551487 79 while ( (uinfo = userinfo_advancescan(uscan)) != NULL ) {
9bd92830
FM
80 strcpy(u2,uinfo->id);
81 if(Ip2Name && uinfo->id_is_ip) {
82 strcpy(ipantes,u2);
83 ip2name(u2,sizeof(u2));
84 strcpy(nameantes,u2);
85 }
b6b6cb8c
FM
86 user_find(userlabel,MAX_USER_LEN, u2);
87 userinfo_label(uinfo,userlabel);
af961877 88 if(debug) debuga(__FILE__,__LINE__,_("Reading user file \"%s/%s\"\n"),tmp,uinfo->filename);
f2ec8c75 89
461b479d 90 sort_users_log(tmp,debug,uinfo);
170a77ea 91 if (snprintf(tmp3,sizeof(tmp3),"%s/%s.user_log",tmp,uinfo->filename)>=sizeof(tmp3)) {
af961877 92 debuga(__FILE__,__LINE__,_("Path too long: "));
041018b6 93 debuga_more("%s/%s.user_log\n",tmp,uinfo->filename);
9bd92830
FM
94 exit(EXIT_FAILURE);
95 }
f2ec8c75 96
800eafb8
FM
97 if((fp_in=FileObject_Open(tmp3))==NULL){
98 debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp3,FileObject_GetLastOpenError());
9bd92830
FM
99 exit(EXIT_FAILURE);
100 }
25697a35 101
9bd92830 102 if ((line=longline_create())==NULL) {
af961877 103 debuga(__FILE__,__LINE__,_("Not enough memory to read file \"%s\"\n"),tmp3);
9bd92830
FM
104 exit(EXIT_FAILURE);
105 }
f84a35a3 106
9bd92830
FM
107 ttopen=0;
108 new_user=1;
109 while((buf=longline_read(fp_in,line))!=NULL) {
110 getword_start(&gwarea,buf);
111 if (getword(accdia,sizeof(accdia),&gwarea,'\t')<0 || getword(acchora,sizeof(acchora),&gwarea,'\t')<0 ||
007905af
FM
112 getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
113 getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
114 getword(acccode,sizeof(acccode),&gwarea,'\t')<0 || getword_atoll(&accelap,&gwarea,'\t')<0) {
af961877 115 debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),tmp3);
9bd92830
FM
116 exit(EXIT_FAILURE);
117 }
118 if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
af961877 119 debuga(__FILE__,__LINE__,_("Invalid smart info in file \"%s\"\n"),tmp3);
9bd92830
FM
120 exit(EXIT_FAILURE);
121 }
25697a35 122
9bd92830
FM
123 if(Ip2Name) {
124 if(strcmp(accip,ipantes) != 0) {
125 strcpy(ipantes,accip);
126 ip2name(accip,sizeof(accip));
127 strcpy(nameantes,accip);
128 }
129 else strcpy(accip,nameantes);
130 }
5542cb59 131
9bd92830
FM
132 if(!rtotal){
133 url_len=strlen(accurl);
134 if (!oldurl || url_len>=ourl_size) {
135 ourl_size=url_len+1;
136 oldurl=realloc(oldurl,ourl_size);
137 if (!oldurl) {
af961877 138 debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
9bd92830
FM
139 exit(EXIT_FAILURE);
140 }
141 }
142 strcpy(oldurl,accurl);
143 strcpy(oldacccode,acccode);
144 strcpy(oldaccip,accip);
145 strcpy(oldaccdia,accdia);
146 strcpy(oldacchora,acchora);
147 new_user=0;
148 rtotal++;
149 }
150 same_url=(strcmp(oldurl,accurl) == 0);
5542cb59 151
9bd92830
FM
152 if(!same_url || new_user){
153 if(!fp_ou && (fp_ou=MY_FOPEN(DataFile,"w"))==NULL){
af961877 154 debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),DataFile,strerror(errno));
9bd92830
FM
155 exit(EXIT_FAILURE);
156 }
157 saverecs(fp_ou,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
158 nacc=0;
159 nbytes=0;
160 nelap=0;
161 incache=0;
162 oucache=0;
163 new_user=0;
164 }
5542cb59 165
9bd92830
FM
166 nacc++;
167 nbytes+=accbytes;
168 nelap+=accelap;
25697a35 169
9bd92830
FM
170 strcpy(crc2,acccode);
171 str=strchr(crc2,'/');
172 if (str) *str='\0';
5542cb59 173
9bd92830
FM
174 if(strstr(crc2,"MISS") != 0) oucache+=accbytes;
175 else incache+=accbytes;
25697a35 176
9bd92830
FM
177 if (!same_url) {
178 url_len=strlen(accurl);
179 if (url_len>=ourl_size) {
180 ourl_size=url_len+1;
181 oldurl=realloc(oldurl,ourl_size);
182 if (!oldurl) {
af961877 183 debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
9bd92830
FM
184 exit(EXIT_FAILURE);
185 }
186 }
187 strcpy(oldurl,accurl);
188 }
189 new_user=0;
190 strcpy(oldacccode,acccode);
191 strcpy(oldaccip,accip);
192 strcpy(oldaccdia,accdia);
193 strcpy(oldacchora,acchora);
194 }
5542cb59 195
800eafb8
FM
196 if (FileObject_Close(fp_in)) {
197 debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),tmp3,FileObject_GetLastCloseError());
204781f4
FM
198 exit(EXIT_FAILURE);
199 }
9bd92830
FM
200 longline_destroy(&line);
201 }
93551487 202 userinfo_stopscan(uscan);
9bd92830 203 if (oldurl) free(oldurl);
507460ae 204 if (fp_ou && fclose(fp_ou)==EOF) {
af961877 205 debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),DataFile,strerror(errno));
507460ae
FM
206 exit(EXIT_FAILURE);
207 }
5542cb59 208
9bd92830 209 if(debug)
af961877 210 debuga(__FILE__,__LINE__,_("Datafile %s written successfully\n"),DataFile);
25697a35
GS
211}
212
51f6da27 213static void saverecs(FILE *fp_ou, const struct userinfostruct *uinfo, long long int nacc, const char *url, long long int nbytes, const char *ip, const char *hora, const char *dia, long long int nelap, long long int incache, long long int oucache)
25697a35 214{
9bd92830
FM
215 char val[20];
216 char name[512];
25697a35 217
9bd92830
FM
218 if((DataFileFields & DATA_FIELD_USER) != 0) {
219 fputs(uinfo->label,fp_ou);
220 fputc(DataFileDelimiter[0],fp_ou);
221 }
222 if((DataFileFields & DATA_FIELD_DATE) != 0) {
223 fputs(dia,fp_ou);
224 fputc(DataFileDelimiter[0],fp_ou);
225 }
226 if((DataFileFields & DATA_FIELD_TIME) != 0) {
227 fputs(hora,fp_ou);
228 fputc(DataFileDelimiter[0],fp_ou);
229 }
230 if((DataFileFields & DATA_FIELD_URL) != 0) {
231 url_hostname(url,name,sizeof(name));
08ed96f0 232 if (DataFileUrl == DATAFILEURL_IP && name[0]!=ALIAS_PREFIX) name2ip(name,sizeof(name));
9bd92830
FM
233 fputs(name,fp_ou);
234 fputc(DataFileDelimiter[0],fp_ou);
235 }
236 if((DataFileFields & DATA_FIELD_CONNECT) != 0) {
237 my_lltoa(nacc,val,sizeof(val),0);
238 fputs(val,fp_ou);
239 fputc(DataFileDelimiter[0],fp_ou);
240 }
241 if((DataFileFields & DATA_FIELD_BYTES) != 0) {
242 my_lltoa(nbytes,val,sizeof(val),0);
243 fputs(val,fp_ou);
244 fputc(DataFileDelimiter[0],fp_ou);
245 }
246 if((DataFileFields & DATA_FIELD_IN_CACHE) != 0) {
247 my_lltoa(incache,val,sizeof(val),0);
248 fputs(val,fp_ou);
249 fputc(DataFileDelimiter[0],fp_ou);
250 }
251 if((DataFileFields & DATA_FIELD_OUT_CACHE) != 0) {
252 my_lltoa(oucache,val,sizeof(val),0);
253 fputs(val,fp_ou);
254 fputc(DataFileDelimiter[0],fp_ou);
255 }
256 if((DataFileFields & DATA_FIELD_ELAPSED) != 0) {
257 my_lltoa(nelap,val,sizeof(val),0);
258 fputs(val,fp_ou);
259 fputc(DataFileDelimiter[0],fp_ou);
260 }
25697a35 261
9bd92830 262 fputc('\n',fp_ou);
25697a35 263}