/*
* SARG Squid Analysis Report Generator http://sarg.sourceforge.net
- * 1998, 2013
+ * 1998, 2015
*
* SARG donations:
* please look at http://sarg.sourceforge.net/donations.php
#include "include/conf.h"
#include "include/defs.h"
+#include "include/filelist.h"
//! The global statistics of the whole log read.
struct globalstatstruct globstat;
//! \c True to enable the smart filter.
bool smartfilter=false;
+extern FileListObject UserAgentLog;
+
//! The file to store the HTML page where the time of access is reported for one site and one user.
static FILE *fp_tt=NULL;
//! The name of the file containing the access time of the site/user.
void gerarel(void)
{
- FILE *fp_in;
+ FileObject *fp_in;
FILE *fp_gen;
FILE *fp_tmp=NULL;
char oldacciptt[256];
char wdirname[MAXLEN];
char *oldurl=NULL;
- char oldmsg[50], acccode[MAXLEN/2 - 1], oldacccode[MAXLEN/2 - 1];
+ const char *oldmsg;
+ char acccode[MAXLEN/2 - 1], oldacccode[MAXLEN/2 - 1];
char ipantes[256], nameantes[MAXLEN];
char accsmart[MAXLEN];
char crc2[MAXLEN/2 -1];
smartfilter=false;
memset(&globstat,0,sizeof(globstat));
- if (vrfydir(&period, addr, site, us, email)<0) {
- debuga(_("Cannot create the output directory name containing the period as part of the name\n"));
- exit(EXIT_FAILURE);
+ if (email[0]=='\0') {
+ if (vrfydir(&period, addr, site, us)<0) {
+ debuga(__FILE__,__LINE__,_("Cannot create the output directory name containing the period as part of the name\n"));
+ exit(EXIT_FAILURE);
+ }
+ } else {
+ if (snprintf(outdirname,sizeof(outdirname),"%s/emailrep",tmp)>=sizeof(outdirname)) {
+ debuga(__FILE__,__LINE__,_("Path too long: "));
+ debuga_more("%s/emailrep\n",tmp);
+ exit(EXIT_FAILURE);
+ }
+ my_mkdir(outdirname);
}
- if(debugz){
- debugaz(_("outdirname=%s\n"),outdirname);
+ if(debugz>=LogLevel_Process){
+ debugaz(__FILE__,__LINE__,_("outdirname=%s\n"),outdirname);
}
- if(UserAgentLog[0] != '\0' && email[0] == '\0') useragent();
+ if (email[0] == '\0' && !FileList_IsEmpty(UserAgentLog))
+ UserAgent_Readlog();
+
+ UserAgent();
+ init_usertab(UserTabFile);
snprintf(wdirname,sizeof(wdirname),"%s/sarg-general",outdirname);
if((fp_gen=MY_FOPEN(wdirname,"w"))==NULL){
- debuga(_("(report) Cannot open file %s: %s\n"),wdirname,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),wdirname,strerror(errno));
exit(EXIT_FAILURE);
}
uscan=userinfo_startscan();
if (uscan == NULL) {
- debuga(_("Cannot enumerate the user list\n"));
+ debuga(__FILE__,__LINE__,_("Cannot enumerate the user list\n"));
exit(EXIT_FAILURE);
}
while ((uinfo = userinfo_advancescan(uscan)) != NULL ) {
sort_users_log(tmp,debug,uinfo);
if (snprintf(tmp3,sizeof(tmp3),"%s/%s.user_log",tmp,uinfo->filename)>=sizeof(tmp3)) {
- debuga(_("(report) directory entry too long: %s/%s.user_log\n"),tmp,uinfo->filename);
+ debuga(__FILE__,__LINE__,_("Path too long: "));
+ debuga_more("%s/%s.user_log\n",tmp,uinfo->filename);
exit(EXIT_FAILURE);
}
- if((fp_in=MY_FOPEN(tmp3,"r"))==NULL){
- debuga(_("(report) Cannot open file %s: %s\n"),tmp,strerror(errno));
+ if((fp_in=FileObject_Open(tmp3))==NULL){
+ debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),tmp3,FileObject_GetLastOpenError());
exit(EXIT_FAILURE);
}
user=uinfo->filename;
oucache=0;
if ((line=longline_create())==NULL) {
- debuga(_("Not enough memory to read the downloaded files\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to read file \"%s\"\n"),tmp3);
exit(EXIT_FAILURE);
}
getword(accip,sizeof(accip),&gwarea,'\t')<0 ||
getword_ptr(buf,&accurl,&gwarea,'\t')<0 || getword_atoll(&accbytes,&gwarea,'\t')<0 ||
getword(acccode,sizeof(acccode),&gwarea,'\t')<0) {
- debuga(_("There is a broken record or garbage in file %s\n"),tmp3);
+ debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),tmp3);
exit(EXIT_FAILURE);
}
if(strncmp(acccode,"TCP_DENIED/407",14) == 0) continue;
if (getword_atoll(&accelap,&gwarea,'\t')<0) {
- debuga(_("There is a broken elapsed time in file %s\n"),tmp3);
+ debuga(__FILE__,__LINE__,_("Invalid elapsed time in file \"%s\"\n"),tmp3);
exit(EXIT_FAILURE);
}
if (getword_skip(20000,&gwarea,'"')<0 || getword(accsmart,sizeof(accsmart),&gwarea,'"')<0) {
- debuga(_("There is a broken smart info in file %s\n"),tmp3);
+ debuga(__FILE__,__LINE__,_("Invalid smart info in file \"%s\"\n"),tmp3);
exit(EXIT_FAILURE);
}
ourl_size=url_len+1;
oldurl=realloc(oldurl,ourl_size);
if (!oldurl) {
- debuga(_("Not enough memory to store the url\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
exit(EXIT_FAILURE);
}
}
if(site[0] == '\0') {
if(!same_url){
if(strstr(oldacccode,"DENIED") != 0)
- strcpy(oldmsg,"DENIED");
+ oldmsg="DENIED";
else
- strcpy(oldmsg,"OK");
+ oldmsg="OK";
if (fp_tmp) gravatmp(fp_tmp,oldurl,nacc,nbytes,oldmsg,nelap,incache,oucache);
gravager(fp_gen,wdirname,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
nacc=0;
my_mkdir(arqtt);
snprintf(arqtt,sizeof(arqtt),"%s/%s/tt.html",outdirname,uinfo->filename);
if ((fp_tt = fopen(arqtt, "w")) == 0) {
- debuga(_("(report) Cannot open file %s: %s\n"),arqtt,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),arqtt,strerror(errno));
exit(EXIT_FAILURE);
}
ttopen=1;
output_html_string(fp_tt,url,100);
fputs("</a></td></tr>\n",fp_tt);
fprintf(fp_tt,"<tr><th class=\"header_l\">%s</th>",_("IP"));
- fprintf(fp_tt,"<th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("DATE"),_("TIME"));
+ fprintf(fp_tt,"<th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("DATE"),pgettext("wall clock","TIME"));
}
fprintf(fp_tt,"<tr><td class=\"data2\">%s</td>",accip);
ourltt_size=url_len+1;
oldurltt=realloc(oldurltt,ourltt_size);
if (!oldurltt) {
- debuga(_("Not enough memory to store the url\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
exit(EXIT_FAILURE);
}
}
ourl_size=url_len+1;
oldurl=realloc(oldurl,ourl_size);
if (!oldurl) {
- debuga(_("Not enough memory to store the url\n"));
+ debuga(__FILE__,__LINE__,_("Not enough memory to store the url\n"));
exit(EXIT_FAILURE);
}
}
strcpy(oldaccdia,accdia);
strcpy(oldacchora,acchora);
}
- fclose(fp_in);
+ if (FileObject_Close(fp_in)) {
+ debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),tmp3,FileObject_GetLastCloseError());
+ exit(EXIT_FAILURE);
+ }
longline_destroy(&line);
if (oldurltt) free(oldurltt);
if (oldurl) {
if(strstr(oldacccode,"DENIED") != 0)
- strcpy(oldmsg,"DENIED");
+ oldmsg="DENIED";
else
- strcpy(oldmsg,"OK");
+ oldmsg="OK";
if (fp_tmp) gravatmp(fp_tmp,oldurl,nacc,nbytes,oldmsg,nelap,incache,oucache);
closett();
gravager(fp_gen,wdirname,uinfo,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
}
if (fp_tmp) {
if (fclose(fp_tmp)==EOF) {
- debuga(_("Failed to close temporary file for user %s: %s\n"),uinfo->filename,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),uinfo->filename,strerror(errno));
exit(EXIT_FAILURE);
}
fp_tmp=NULL;
}
if (!KeepTempLog && unlink(tmp3)) {
- debuga(_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),tmp3,strerror(errno));
exit(EXIT_FAILURE);
}
}
totalger(fp_gen,wdirname);
if (fclose(fp_gen)==EOF) {
- debuga(_("Write error in %s: %s\n"),wdirname,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),wdirname,strerror(errno));
exit(EXIT_FAILURE);
}
if (!indexonly) {
if(DansGuardianConf[0] != '\0')
dansguardian_log();
- else if (debugz)
- debugaz(_("Dansguardian report not produced because no dansguardian configuration file was provided\n"));
+ else if (debugz>=LogLevel_Process)
+ debugaz(__FILE__,__LINE__,_("Dansguardian report not produced because no dansguardian configuration file was provided\n"));
redirector_log();
}
if (!indexonly) {
if((ReportType & REPORT_TYPE_DOWNLOADS) != 0)
download_report();
- else if (debugz)
- debugaz(_("Downloaded files report not requested in report_type\n"));
+ else if (debugz>=LogLevel_Process)
+ debugaz(__FILE__,__LINE__,_("Downloaded files report not requested in report_type\n"));
if((ReportType & REPORT_TYPE_TOPSITES) != 0)
topsites();
- else if (debugz)
- debugaz(_("Top sites report not requested in report_type\n"));
+ else if (debugz>=LogLevel_Process)
+ debugaz(__FILE__,__LINE__,_("Top sites report not requested in report_type\n"));
if((ReportType & REPORT_TYPE_SITES_USERS) != 0)
siteuser();
- else if (debugz)
- debugaz(_("Sites & users report not requested in report_type\n"));
+ else if (debugz>=LogLevel_Process)
+ debugaz(__FILE__,__LINE__,_("Sites & users report not requested in report_type\n"));
if ((ReportType & REPORT_TYPE_DENIED) != 0)
gen_denied_report();
- else if (debugz)
- debugaz(_("Denied accesses report not requested in report_type\n"));
+ else if (debugz>=LogLevel_Process)
+ debugaz(__FILE__,__LINE__,_("Denied accesses report not requested in report_type\n"));
if ((ReportType & REPORT_TYPE_AUTH_FAILURES) != 0)
authfail_report();
- else if (debugz)
- debugaz(_("Authentication failures report not requested in report_type\n"));
+ else if (debugz>=LogLevel_Process)
+ debugaz(__FILE__,__LINE__,_("Authentication failures report not requested in report_type\n"));
if(smartfilter) smartfilter_report();
if((ReportType & REPORT_TYPE_USERS_SITES) != 0)
htmlrel();
- else if (debugz)
- debugaz(_("User's detailed report not requested in report_type\n"));
+ else if (debugz>=LogLevel_Process)
+ debugaz(__FILE__,__LINE__,_("User's detailed report not requested in report_type\n"));
}
make_index();
- if(SuccessfulMsg) debuga(_("Successful report generated on %s\n"),outdirname);
+ if(SuccessfulMsg) debuga(__FILE__,__LINE__,_("Successful report generated on %s\n"),outdirname);
} else {
- geramail(outdirname, debug, outdir, email, tmp);
+ topuser();
if((strcmp(email,"stdout") != 0) && SuccessfulMsg)
- debuga(_("Successful report generated and sent to %s\n"),email);
+ debuga(__FILE__,__LINE__,_("Successful report generated and sent to %s\n"),email);
}
if(indexonly) index_only(outdirname, debug);
if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return(NULL);
if((ReportType & REPORT_TYPE_TOPUSERS) == 0) return(NULL);
- if(debug) debuga(_("Making file: %s/%s\n"),tmp,user);
+ if(debug) debuga(__FILE__,__LINE__,_("Making file %s/%s\n"),tmp,user);
if (snprintf(wdirname,sizeof(wdirname),"%s/%s.utmp",tmp,user)>=sizeof(wdirname)) {
- debuga(_("Temporary file name too long: %s/%s.utmp\n"),tmp,user);
+ debuga(__FILE__,__LINE__,_("Path too long: "));
+ debuga_more("%s/%s.utmp\n",tmp,user);
exit(EXIT_FAILURE);
}
if((fp_ou=fopen(wdirname,"w"))==NULL){
- debuga(_("(report) Cannot open file %s: %s\n"),wdirname,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),wdirname,strerror(errno));
exit(EXIT_FAILURE);
}
fputs("</table>\n</div>\n",fp_tt);
fputs("</body>\n</html>\n",fp_tt);
if (fclose(fp_tt)==EOF) {
- debuga(_("Write error in %s: %s\n"),arqtt,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),arqtt,strerror(errno));
exit(EXIT_FAILURE);
}
fp_tt=NULL;
if((ReportType & REPORT_TYPE_USERS_SITES) == 0) return;
if (snprintf(wdirname,sizeof(wdirname),"%s/%s.ip",tmp,uinfo->filename)>=sizeof(wdirname)) {
- debuga(_("Path too long %s/%s.ip\n"),tmp,uinfo->filename);
+ debuga(__FILE__,__LINE__,_("Path too long: "));
+ debuga_more("%s/%s.ip\n",tmp,uinfo->filename);
exit(EXIT_FAILURE);
}
if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
- debuga(_("(report) Cannot open file %s: %s\n"),wdirname,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),wdirname,strerror(errno));
exit(EXIT_FAILURE);
}
fprintf(fp_ou,"%s\t%s\t%s\t%s\t%"PRIu64"\t%"PRIu64"\n",ip,url,data,hora,(uint64_t)tam,(uint64_t)elap);
if (fclose(fp_ou)==EOF) {
- debuga(_("Write error in %s: %s\n"),wdirname,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),wdirname,strerror(errno));
exit(EXIT_FAILURE);
}
to print a long long int unless it is exactly 64-bits long.
*/
if (fprintf(fp_gen,"%s\t%"PRIu64"\t%"PRIu64"\t%s\t%s\t%s\t%s\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",uinfo->id,(uint64_t)nacc,(uint64_t)nbytes,url,ip,hora,dia,(uint64_t)nelap,(uint64_t)incache,(uint64_t)oucache)<0) {
- debuga(_("Failed to write a line in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Write error in file \"%s\": %s\n"),filename,strerror(errno));
exit(EXIT_FAILURE);
}
to print a long long int unless it is exactly 64-bits long.
*/
if (fprintf(fp_gen,"TOTAL\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\t%"PRIu64"\n",(uint64_t)globstat.nacc,(uint64_t)globstat.nbytes,(uint64_t)globstat.elap,(uint64_t)globstat.incache,(uint64_t)globstat.oucache)<0) {
- debuga(_("Failed to write the total line in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Failed to write the total line in %s\n"),filename);
exit(EXIT_FAILURE);
}
}
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid total number of accesses in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid total number of accesses in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid total size in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid total size in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid total elapsed time in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid total elapsed time in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid total cache hit in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid total cache hit in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\0') {
- debuga(_("Invalid total cache miss in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid total cache miss in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
item->oucache=number*sign;
item->user=buffer;
for (i=0 ; i<MAX_USER_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
if (*buffer!='\t') {
- debuga(_("User name too long or invalid in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("User name too long or invalid in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
*buffer++='\0';
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid number of accesses in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid number of accesses in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid number of bytes in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid number of bytes in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
item->url=buffer;
while ((unsigned char)*buffer>=' ') buffer++;
if (*buffer!='\t') {
- debuga(_("URL too long or invalid in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("URL too long or invalid in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
*buffer++='\0';
item->ip=buffer;
for (i=0 ; i<MAX_IP_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
if (*buffer!='\t') {
- debuga(_("IP address too long or invalid in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("IP address too long or invalid in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
*buffer++='\0';
item->time=buffer;
for (i=0 ; i<MAX_DATETIME_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
if (*buffer!='\t') {
- debuga(_("Time too long or invalid in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Time too long or invalid in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
*buffer++='\0';
item->date=buffer;
for (i=0 ; i<MAX_DATETIME_LEN-1 && (unsigned char)*buffer>=' ' ; i++) buffer++;
if (*buffer!='\t') {
- debuga(_("Date too long or invalid in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Date too long or invalid in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
*buffer++='\0';
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid elapsed time in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid elapsed time in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\t') {
- debuga(_("Invalid cache hit size in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid cache hit size in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
buffer++;
while (isdigit(*buffer))
number=(number * 10) + (*buffer++)-'0';
if (*buffer!='\0') {
- debuga(_("Invalid cache miss size in %s\n"),filename);
+ debuga(__FILE__,__LINE__,_("Invalid cache miss size in file \"%s\"\n"),filename);
exit(EXIT_FAILURE);
}
item->oucache=number*sign;
char wdirname[MAXLEN];
if (snprintf(wdirname,sizeof(wdirname),"%s/smartfilter.int_unsort",dirname)>=sizeof(wdirname)) {
- debuga(_("File name too long for %s/smartfilter.int_unsort\n"),dirname);
+ debuga(__FILE__,__LINE__,_("Path too long: "));
+ debuga_more("%s/smartfilter.int_unsort\n",dirname);
exit(EXIT_FAILURE);
}
if((fp_ou=MY_FOPEN(wdirname,"a"))==NULL){
- debuga(_("(report) Cannot open file %s: %s\n"),wdirname,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),wdirname,strerror(errno));
exit(EXIT_FAILURE);
}
fputs("</body>\n</html>\n",fp_tt);
if (fclose(fp_ou)==EOF) {
- debuga(_("Write error in %s: %s\n"),wdirname,strerror(errno));
+ debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),wdirname,strerror(errno));
exit(EXIT_FAILURE);
}