]>
Commit | Line | Data |
---|---|---|
25697a35 | 1 | /* |
94ff9470 | 2 | * SARG Squid Analysis Report Generator http://sarg.sourceforge.net |
e99bf0c0 | 3 | * 1998, 2013 |
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 | |
2c7e8c23 FM |
30 | /* |
31 | Extract a date range from a squid log file and write it into a separate file. | |
32 | ||
33 | It can optionally convert the date in human readable format. | |
34 | ||
35 | The output can be split by day into separate files. | |
36 | ||
37 | \param arq The squid log file to split. | |
38 | \param df The date format if the date is to be converted in human readable form. Only the first | |
39 | character is taken into account. It can be 'e' for European date format or anything else for | |
40 | US date format. | |
41 | \param dfrom The first date to output in the form (Year*10000+Month*100+Day). | |
42 | \param duntil The last date to output in the form (Year*10000+Month*100+Day). | |
43 | \param convert \c True if the date must be converted into human readable form. | |
44 | \param splitprefix If not empty, the output file is written in separate files (one for each day) and | |
45 | the files are named after the day they contain prefixed with the string contained in this variable. | |
46 | */ | |
47 | void splitlog(const char *arq, const char *df, int dfrom, int duntil, int convert, const char *splitprefix) | |
25697a35 | 48 | { |
9bd92830 | 49 | FILE *fp_in; |
2c7e8c23 | 50 | FILE *fp_ou=NULL; |
9bd92830 FM |
51 | char *buf; |
52 | char data[30]; | |
53 | char dia[11]; | |
2c7e8c23 | 54 | char output_file[MAXLEN]; |
9bd92830 | 55 | time_t tt; |
2c7e8c23 FM |
56 | time_t min_tt; |
57 | time_t max_tt=0; | |
9bd92830 | 58 | int idata=0; |
2c7e8c23 FM |
59 | int autosplit=0; |
60 | int output_prefix_len=0; | |
61 | int prev_year=0, prev_month=0, prev_day=0; | |
9bd92830 FM |
62 | struct tm *t; |
63 | struct getwordstruct gwarea; | |
64 | longline line; | |
25697a35 | 65 | |
2c7e8c23 FM |
66 | if (splitprefix[0]!='\0') { |
67 | // '/' + '-YYYY-mm-dd' + '\0' == 13 | |
68 | output_prefix_len=snprintf(output_file,sizeof(output_file)-12,"%s%s",outdir,splitprefix); | |
69 | if (output_prefix_len>=sizeof(output_file)-12) { | |
b0cf31a8 FM |
70 | debugapos("splitlog",_("Path too long: ")); |
71 | debuga_more("%s%s-YYYY-mm-dd\n",outdir,splitprefix); | |
2c7e8c23 FM |
72 | exit(EXIT_FAILURE); |
73 | } | |
74 | autosplit=1; | |
75 | } else { | |
76 | fp_ou=stdout; | |
77 | } | |
78 | ||
9bd92830 FM |
79 | if(arq[0] == '\0') |
80 | arq="/var/log/squid/access.log"; | |
25697a35 | 81 | |
4c16ffe7 FM |
82 | if (arq[0]=='-' && arq[1]=='\0') { |
83 | fp_in=stdin; | |
84 | } else if((fp_in=MY_FOPEN(arq,"r"))==NULL) { | |
4b06d570 | 85 | debugapos("splitlog",_("Cannot open file \"%s\": %s\n"),arq,strerror(errno)); |
9bd92830 FM |
86 | exit(EXIT_FAILURE); |
87 | } | |
9b179eb0 | 88 | |
9bd92830 | 89 | if ((line=longline_create())==NULL) { |
b2dad7e7 | 90 | debuga(_("Not enough memory to read file \"%s\"\n"),arq); |
9bd92830 FM |
91 | exit(EXIT_FAILURE); |
92 | } | |
2c7e8c23 | 93 | time(&min_tt); |
25697a35 | 94 | |
9bd92830 FM |
95 | while((buf=longline_read(fp_in,line))!=NULL) { |
96 | getword_start(&gwarea,buf); | |
97 | if (getword(data,sizeof(data),&gwarea,' ')<0) { | |
b2dad7e7 | 98 | debuga(_("Invalid date in file \"%s\"\n"),arq); |
9bd92830 FM |
99 | exit(EXIT_FAILURE); |
100 | } | |
101 | tt=atoi(data); | |
102 | t=localtime(&tt); | |
25697a35 | 103 | |
9bd92830 FM |
104 | if(dfrom) { |
105 | idata=(t->tm_year+1900)*10000+(t->tm_mon+1)*100+t->tm_mday; | |
106 | if(idata < dfrom || idata > duntil) | |
107 | continue; | |
108 | } | |
25697a35 | 109 | |
2c7e8c23 FM |
110 | if (autosplit && (prev_year!=t->tm_year || prev_month!=t->tm_mon || prev_day!=t->tm_mday)) { |
111 | prev_year=t->tm_year; | |
112 | prev_month=t->tm_mon; | |
113 | prev_day=t->tm_mday; | |
114 | if (fp_ou && fclose(fp_ou)==EOF) { | |
4b06d570 | 115 | debuga(_("Failed to close file \"%s\": %s\n"),output_file,strerror(errno)); |
2c7e8c23 FM |
116 | exit(EXIT_FAILURE); |
117 | } | |
118 | strftime(output_file+output_prefix_len, sizeof(output_file)-output_prefix_len, "-%Y-%m-%d", t); | |
119 | /* | |
120 | The line must be added to a file we have already created. The file must be created if the date | |
121 | is seen for the first time. The idea is to create the files from scratch if the split is started | |
122 | a second time. | |
123 | */ | |
124 | if ((fp_ou=MY_FOPEN(output_file,(tt>=min_tt && tt<=max_tt) ? "a" : "w"))==NULL) { | |
4b06d570 | 125 | debugapos("splitlog",_("Cannot open file \"%s\": %s\n"),output_file,strerror(errno)); |
2c7e8c23 FM |
126 | exit(EXIT_FAILURE); |
127 | } | |
128 | if (tt<min_tt) min_tt=tt; | |
129 | if (tt>max_tt) max_tt=tt; | |
130 | } | |
131 | ||
9bd92830 | 132 | if(!convert) { |
2c7e8c23 | 133 | fprintf(fp_ou,"%s %s\n",data,gwarea.current); |
9bd92830 FM |
134 | } else { |
135 | if(df[0]=='e') | |
136 | strftime(dia, sizeof(dia), "%d/%m/%Y", t); | |
137 | else | |
138 | strftime(dia, sizeof(dia), "%m/%d/%Y", t); | |
25697a35 | 139 | |
2c7e8c23 | 140 | fprintf(fp_ou,"%s %02d:%02d:%02d %s\n",dia,t->tm_hour,t->tm_min,t->tm_sec,gwarea.current); |
9bd92830 FM |
141 | } |
142 | } | |
25697a35 | 143 | |
9bd92830 | 144 | longline_destroy(&line); |
4c16ffe7 | 145 | if (fp_in!=stdin && fclose(fp_in)==EOF) { |
4b06d570 | 146 | debuga(_("Failed to close file \"%s\": %s\n"),arq,strerror(errno)); |
9bd92830 | 147 | } |
2c7e8c23 FM |
148 | if (autosplit && fp_ou) { |
149 | if (fclose(fp_ou)==EOF) { | |
4b06d570 | 150 | debuga(_("Failed to close file \"%s\": %s\n"),output_file,strerror(errno)); |
2c7e8c23 FM |
151 | exit(EXIT_FAILURE); |
152 | } | |
153 | } | |
25697a35 | 154 | } |