Index: openacs-4/packages/dotlrn-user-tracking/dotlrn-user-tracking.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-user-tracking/dotlrn-user-tracking.info,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/dotlrn-user-tracking/dotlrn-user-tracking.info 1 Mar 2005 17:39:23 -0000 1.1 @@ -0,0 +1,26 @@ + + + + + dotLRN UserTracking Management Applet + dotLRN UserTracking Management Applets + f + t + + + David Ortega + 2004-10-25 + Elane + + + + + + + + + + + + + \ No newline at end of file Index: openacs-4/packages/dotlrn-user-tracking/sql/postgresql/dotlrn-user-tracking-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-user-tracking/sql/postgresql/dotlrn-user-tracking-create.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/dotlrn-user-tracking/sql/postgresql/dotlrn-user-tracking-create.sql 1 Mar 2005 17:39:23 -0000 1.1 @@ -0,0 +1,148 @@ +-- This file is part of dotLRN. +-- +-- dotLRN is free software; you can redistribute it and/or modify it under the +-- terms of the GNU General Public License as published by the Free Software +-- Foundation; either version 2 of the License, or (at your option) any later +-- version. +-- +-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +-- details. +-- +-- The UserTracking applet for dotLRN +-- +-- @author David Ortega (doa@tid.es) +-- @creation-date 2004-10-25 +-- + +-- create the implementation +select acs_sc_impl__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'dotlrn_user_tracking' +); + +-- add all the hooks + +-- GetPrettyName +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'GetPrettyName', + 'dotlrn_user_tracking::get_pretty_name', + 'TCL' +); + +-- AddApplet +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddApplet', + 'dotlrn_user_tracking::add_applet', + 'TCL' +); + +-- RemoveApplet +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveApplet', + 'dotlrn_user_tracking::remove_applet', + 'TCL' +); + +-- AddAppletToCommunity +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddAppletToCommunity', + 'dotlrn_user_tracking::add_applet_to_community', + 'TCL' +); + +-- RemoveAppletFromCommunity +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveAppletFromCommunity', + 'dotlrn_user_tracking::remove_applet_from_community', + 'TCL' +); + +-- AddUser +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddUser', + 'dotlrn_user_tracking::add_user', + 'TCL' +); + +-- RemoveUser +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveUser', + 'dotlrn_user_tracking::remove_user', + 'TCL' +); + +-- AddUserToCommunity +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddUserToCommunity', + 'dotlrn_user_tracking::add_user_to_community', + 'TCL' +); + +-- RemoveUserFromCommunity +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveUserFromCommunity', + 'dotlrn_user_tracking::remove_user_from_community', + 'TCL' +); + +-- AddPortlet +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddPortlet', + 'dotlrn_user_tracking::add_portlet', + 'TCL' + ); + +-- RemovePortlet +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemovePortlet', + 'dotlrn_user_tracking::remove_portlet', + 'TCL' +); + +-- Clone +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'Clone', + 'dotlrn_user_tracking::clone', + 'TCL' +); + +select acs_sc_impl_alias__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'ChangeEventHandler', + 'dotlrn_user_tracking::change_event_handler', + 'TCL' +); + +-- Add the binding +select acs_sc_binding__new ( + 'dotlrn_applet', + 'dotlrn_user_tracking' +); Index: openacs-4/packages/dotlrn-user-tracking/sql/postgresql/dotlrn-user-tracking-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-user-tracking/sql/postgresql/dotlrn-user-tracking-drop.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/dotlrn-user-tracking/sql/postgresql/dotlrn-user-tracking-drop.sql 1 Mar 2005 17:39:23 -0000 1.1 @@ -0,0 +1,132 @@ +-- +-- Copyright (C) 2001, 2002 MIT +-- +-- This file is part of dotLRN. +-- +-- dotLRN is free software; you can redistribute it and/or modify it under the +-- terms of the GNU General Public License as published by the Free Software +-- Foundation; either version 2 of the License, or (at your option) any later +-- version. +-- +-- dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +-- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +-- details. +-- + + +-- +-- The user-tracking applet for dotLRN +-- +-- ben,arjun@openforce.net +-- +-- 10/05/2001 +-- +-- Postgresql port adarsh@symphinity.com +-- +-- 10th July 2002 +-- +-- Postgresql port adarsh@symphinity.com +-- +-- 8th July 2002 + + + +select acs_sc_impl__delete( + 'dotlrn_applet', -- impl_contract_name + 'dotlrn_user_tracking' -- impl_name +); + + +-- add all the hooks + +-- GetPrettyName +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'GetPrettyName' +); + +-- AddApplet +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddApplet' +); + +-- RemoveApplet +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveApplet' +); + +-- AddAppletToCommunity +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddAppletToCommunity' +); + +-- RemoveAppletFromCommunity +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveAppletFromCommunity' +); + +-- AddUser +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddUser' +); + +-- RemoveUser +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveUser' +); + +-- AddUserToCommunity +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddUserToCommunity' +); + +-- RemoveUserFromCommunity +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemoveUserFromCommunity' +); + +-- AddPortlet +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'AddPortlet' + ); + +-- RemovePortlet +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'RemovePortlet' +); + +-- Clone +select acs_sc_impl_alias__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking', + 'Clone' +); + + +-- Add the binding +select acs_sc_binding__delete ( + 'dotlrn_applet', + 'dotlrn_user_tracking' +); Index: openacs-4/packages/dotlrn-user-tracking/tcl/dotlrn-user-tracking-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-user-tracking/tcl/dotlrn-user-tracking-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/dotlrn-user-tracking/tcl/dotlrn-user-tracking-procs.tcl 1 Mar 2005 17:39:23 -0000 1.1 @@ -0,0 +1,246 @@ +# +# This file is part of dotLRN. +# +# dotLRN is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# + +ad_library { + + Procs to set up the dotLRN User-tracking applet + + @author David Ortega (doa@tid.es) + +} + +namespace eval dotlrn_user_tracking { + + ad_proc -public applet_key { + } { + What's my applet key? + } { + return "dotlrn_user_tracking" + } + + ad_proc -public package_key { + } { + What package do I deal with? + } { + return "user-tracking" + } + + ad_proc -public my_package_key { + } { + What's my package key? + } { + return "dotlrn-user-tracking" + } + + ad_proc -public get_pretty_name { + } { + returns the pretty name + } { + return "UserTracking Management" + } + + ad_proc -public add_applet { + } { + Add the user_tracking applet to dotlrn. One time init - must be repeatable! + } { + dotlrn_applet::add_applet_to_dotlrn -applet_key [applet_key] -package_key [my_package_key] + } + + ad_proc -public remove_applet { + community_id + package_id + } { + remove the applet + } { + ad_return_complaint 1 "[applet_key] remove_applet not implemented!" + } + + ad_proc -public add_applet_to_community { + community_id + } { + Add the user_tracking applet to a specifc dotlrn community + } { + set portal_id [dotlrn_community::get_portal_id -community_id $community_id] + + # create the user_tracking package instance (all in one, I've mounted it) + set package_id [dotlrn::instantiate_and_mount $community_id [package_key]] + + # set up the admin portal + set admin_portal_id [dotlrn_community::get_admin_portal_id \ + -community_id $community_id + ] + + user_tracking_admin_portlet::add_self_to_page \ + -portal_id $admin_portal_id \ + -package_id $package_id + + # add the portlet to the comm's portal using + # add_portlet_helper + set args [ns_set create] + ns_set put $args package_id $package_id + add_portlet_helper $portal_id $args + + return $package_id + } + + ad_proc -public remove_applet_from_community { + community_id + } { + remove the applet from the community + } { + ad_return_complaint 1 "[applet_key] remove_applet_from_community not implemented!" + } + + ad_proc -public add_user { + user_id + } { + one time user-specifuc init + } { + # noop + } + + ad_proc -public remove_user { + user_id + } { + } { + ad_return_complaint 1 "[applet_key] remove_user not implemented!" + } + + ad_proc -public add_user_to_community { + community_id + user_id + } { + Add a user to a specifc dotlrn community + } { + set package_id [dotlrn_community::get_applet_package_id -community_id $community_id -applet_key [applet_key]] + set portal_id [dotlrn::get_portal_id -user_id $user_id] + + # use "append" here since we want to aggregate + set args [ns_set create] + ns_set put $args package_id $package_id + ns_set put $args param_action append + add_portlet_helper $portal_id $args + } + + ad_proc -public remove_user_from_community { + community_id + user_id + } { + Remove a user from a community + } { + set package_id [dotlrn_community::get_applet_package_id -community_id $community_id -applet_key [applet_key]] + set portal_id [dotlrn::get_portal_id -user_id $user_id] + + set args [ns_set create] + ns_set put $args package_id $package_id + + remove_portlet $portal_id $args + } + + ad_proc -public add_portlet { + portal_id + } { + A helper proc to add the underlying portlet to the given portal. + + @param portal_id + } { + # simple, no type specific stuff, just set some dummy values + + set args [ns_set create] + ns_set put $args package_id 0 + ns_set put $args param_action overwrite + add_portlet_helper $portal_id $args + } + + ad_proc -public add_portlet_helper { + portal_id + args + } { + A helper proc to add the underlying portlet to the given portal. + + @param portal_id + @param args an ns_set + } { + user_tracking_portlet::add_self_to_page \ + -portal_id $portal_id \ + -package_id [ns_set get $args package_id] \ + -param_action [ns_set get $args param_action] + } + + ad_proc -public remove_portlet { + portal_id + args + } { + A helper proc to remove the underlying portlet from the given portal. + + @param portal_id + @param args A list of key-value pairs (possibly user_id, community_id, and more) + } { + user_tracking_portlet::remove_self_from_page \ + -portal_id $portal_id \ + -package_id [ns_set get $args package_id] + } + + ad_proc -public clone { + old_community_id + new_community_id + } { + Clone this applet's content from the old community to the new one + } { + ns_log notice "Cloning: [applet_key]" + set new_package_id [add_applet_to_community $new_community_id] + set old_package_id [dotlrn_community::get_applet_package_id \ + -community_id $old_community_id \ + -applet_key [applet_key] + ] + + set clone_courses [db_list_of_lists course_clone { + SELECT man_id, user_tracking_instance_id, community_id, class_key, isenabled, istrackable + FROM ims_cp_manifest_class + WHERE community_id = :old_community_id + }] + + if {![empty_string_p $clone_courses]} { + + foreach course $clone_courses { + set man_id [lindex $course 0] + set isenabled [lindex $course 4] + set istrackable [lindex $course 5] + set class_key [dotlrn_community::get_community_type_from_community_id $new_community_id] + + db_dml add-course { + insert into ims_cp_manifest_class \ + (man_id, user_tracking_instance_id, community_id, class_key, isenabled, istrackable) \ + values \ + (:man_id, :new_package_id, :new_community_id, :class_key, :isenabled, :istrackable) + } + + } + + } + + return $new_package_id + } + + ad_proc -public change_event_handler { + community_id + event + old_value + new_value + } { + listens for the following events: + } { + } + +} Index: openacs-4/packages/dotlrn-user-tracking/tcl/dotlrn-user-tracking-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn-user-tracking/tcl/dotlrn-user-tracking-procs.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/dotlrn-user-tracking/tcl/dotlrn-user-tracking-procs.xql 1 Mar 2005 17:39:23 -0000 1.1 @@ -0,0 +1,16 @@ + + + +postgresql7.1 + + + + select user_tracking__clone ( + :old_package_id, + :new_package_id + ); + + + + + Index: openacs-4/packages/user-tracking/user-tracking.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/user-tracking.info,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/user-tracking.info 1 Mar 2005 17:35:30 -0000 1.1 @@ -0,0 +1,28 @@ + + + + + User Tracking + Users tracking + f + f + user-tracking + + + Pablo Arozarena + Sergio González + David Ortega + Package for user tracking + 2004-11-03 + E-lane + The purpose behind this development is to ensure we track and retrieve knowledge about how end users are making use of the system. The main objective of this package will be to track user behaviour and activities, so that Professors and administrators can use this to understand how the system is used and make improvements in the learning process. + + + + + + + + + + Index: openacs-4/packages/user-tracking/catalog/user-tracking.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/catalog/user-tracking.en_US.ISO-8859-1.xml,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/catalog/user-tracking.en_US.ISO-8859-1.xml 1 Mar 2005 17:35:30 -0000 1.1 @@ -0,0 +1,116 @@ + + + + Active News + Add + add with all subgroups + Added FAQS + Created Files + Files added by: + Added news + Survey added by + Admin Options + Administer + eliminate + FAQ Name + Question + Faqs Stats + Files Stats + Forum + Forums Stats + General Options + Add a user + Advanced Statistics + Advanced Statistics + Communities Statistics + Estadisticas de Comunidades + Communities Statistics + Delete Selection + No stats + Statistics of #dotlrn.Users# + Progam data charge + Selected Communities %Communities% + Selected Users: %Users% + Site Statistics + User Id + Users Statistics + View Advanced Statistics + View Communities Statistics + View Statistics + View Users Statistics + Write users data to config file + Messages added + Files modified + Month + News Stats + Title + Archived News + Post Date + User Tracking + Registrations + Registrations number + See community stats + See site stats + See you community/class stats + See your stats + See your site stats + Statistics + Stats with subgroups + Message subject + Ver Respuesta + Title + Surveys Stats + Users Statistics + User Tracking access package + User Tracking Home + Have an Admin role: %NofAdmin% + Have a Student role: %NofUsers% + Comunidad: %first_names% + Community Stats + Creation Date: %creation_date% + Faqs + Files + Forum messages + Last Register: %LastRegistration% + Last Visit: %LastVisit% + Month + Name: %name% + News + Number of Admins: %NofAdmin% + Number of Classes: %NofClasses% + Number of Communities: %NofCommunities% + Number of Faqs: %NofFaqs% + Number of Forums: %NofForums% + Number of Members: %NofMembers% + Number of News: %NofNews% + Number of Teachers: %NofAdmin% + Number of Registers + Number of Students: %NofUsers% + Numero de subComunidades: %NofSub% + Number of Surveys: %NofSurveys% + Number of Users: %NofUsers% + Number of users: %NofMembers% + Registrations History + Registers + See Community Stats + See Faqs + See Files + Ver Foros + See Messages + See News + See Register Historic + See community stats with subgroups + Ver Surveys + See Site Stats + site objects + Surveys + Total of Sessions: %TotalVisits% + Type: Community + Type: Course + User has added + User has posted + Year + See Forums + See Surveys + Year + Index: openacs-4/packages/user-tracking/catalog/user-tracking.es_ES.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/catalog/user-tracking.es_ES.ISO-8859-1.xml,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/catalog/user-tracking.es_ES.ISO-8859-1.xml 1 Mar 2005 17:35:30 -0000 1.1 @@ -0,0 +1,114 @@ + + + + Noticias activas + a&ntilde;adir + a&ntilde;adir con subgrupos + FAQS a�adidos por: + Ficheros creados + Ficheros a�adidos por: + Noticias a�adidas por: + Encuestas a�adidas por: + Opciones de Administrador + Administrar + Deseleccionar + Nombre del FAQ + Pregunta + Estadisticas de Faqs + Estadisticas de Ficheros + Foro + Estadisticas de Foros + Opciones Generales + A�adir usuario + Estad�sticas Avanzadas + Estad�sticas avanzadas + Estad�sticas de comunidades + Estadisticas de Comunidades + Estadisticas de Comunidades + Borrar Selecci&oacute;n + Sin estad&iacute;sticas + Estad&iacute;sticas de usuarios + Programar carga de datos + Comunidades Seleccionadas + Usuarios Seleccionados + Estad�sticas del Site + User Id + Estad�sticas de Usuarios + Ver estad&iacute;sticas avanzadas + Ver estad&iacute;sticas de comunidades + Ver estad�sticas + Ver estad&iacute;sticas de usuarios + Escribir los datos de los usuarios al fichero de configuraci�n + Mensajes A�adidos + Ficheros modificados + Mes + Estadisticas de Noticias + T�tulo de la noticia + Noticias archivadas + Fecha de publicaci�n + User Tracking + Registros + N�mero de Registros + Ver estad&iacute;sticas completas de esta comunidad + Ver estad&iacute;sticas completas del site + Ver tus estad&iacute;sticas en esta comunidad / clase + Ver tus estad&iacute;sticas + Ver tus estad&iacute;sticas en el site + Estad�sticas + Estad&iacute;sticas con subgrupos + Asunto del mensaje + Ver Respuesta + T�tulo + Estadisticas de Surveys + Estad�sticas de Usuario + Acceso al paquete de User Tracking + User Tracking + Participan como Administradores: %NofAdmin% + Participan como Estudiantes: %NofUsers% + Comunidad: %first_names% + Estadisticas de Comunidad: + Fecha de Creaci&oacute;n: %creation_date% + Faqs + Ficheros + mensajes de los Foros + Ultimo Registro: %LastRegistration% + Ultima Visita: %LastVisit% + Mes + Nombre: %name% + Noticias + N&uacute;mero de Administradores: %NofAdmin% + N�mero de clases: %NofClasses% + N�mero de Comunidades: %NofCommunities% + N&uacute;mero de Faqs: %NofFaqs% + N�mero de Foros: %NofForums% + N&uacute;mero de Miembros: %NofMembers% + N�mero de Noticias: %NofNews% + N&uacute;mero de Profesores: %NofAdmin% + N&uacute;mero de Registros + N&uacute;mero de Estudiantes: %NofUsers% + N&uacute;mero de Surveys: %NofSurveys% + N&uacute;mero de Usuarios: %NofUsers% + N�mero de Usuarios: %NofMembers% + Historial de registros + Registros + Ver estad&iacute;sticas de comunidad + Ver FAQS + Ver Ficheros + Ver Foros + Ver mensajes + Ver News + Ver Historial de Registros + Ver surveys + Ver estad�sticas de movimiento en el sistema + objetos del site + Surveys + Visitas totales: %TotalVisits% + Tipo: Comunidad + Tipo: Curso + El usuario ha a&ntilde;adido + El usuario ha posteado + A&ntilde;o + Ver Foros + Ver Surveys + A&ntilde;o + Index: openacs-4/packages/user-tracking/config/AllowedUrls.conf =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/config/Attic/AllowedUrls.conf,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/config/AllowedUrls.conf 1 Mar 2005 17:35:30 -0000 1.1 @@ -0,0 +1 @@ \ No newline at end of file Index: openacs-4/packages/user-tracking/config/awstatsDirecto.class.conf =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/config/Attic/awstatsDirecto.class.conf,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/config/awstatsDirecto.class.conf 1 Mar 2005 17:35:32 -0000 1.1 @@ -0,0 +1,1529 @@ +# AWSTATS CONFIGURE FILE 6.2 +#----------------------------------------------------------------------------- +# Copy this file into awstats.www.mydomain.conf and edit this new config file +# to setup AWStats (See documentation in docs/ directory). +# The config file must be in /etc/awstats, /usr/local/etc/awstats or /etc (for +# Unix/Linux) or same directory than awstats.pl (Windows, Mac, Unix/Linux...) +# To include an environment variable in any parameter (AWStats will replace +# it with its value when reading it), follow the example: +# Parameter="__ENVNAME__" +# Note that environment variable AWSTATS_CURRENT_CONFIG is always defined with +# the config value in an AWStats running session and can be used like others. +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:32 $ + + + +#----------------------------------------------------------------------------- +# MAIN SETUP SECTION (Required to make AWStats work) +#----------------------------------------------------------------------------- + +# "LogFile" contains the web, ftp or mail server log file to analyze. +# Possible values: A full path, or a relative path from awstats.pl directory. +# Example: "/var/log/apache/access.log" +# Example: "../logs/mycombinedlog.log" +# You can also use tags in this filename if you need a dynamic file name +# depending on date or time (Replacement is made by AWStats at the beginning +# of its execution). This is available tags : +# %YYYY-n is replaced with 4 digits year we were n hours ago +# %YY-n is replaced with 2 digits year we were n hours ago +# %MM-n is replaced with 2 digits month we were n hours ago +# %MO-n is replaced with 3 letters month we were n hours ago +# %DD-n is replaced with day we were n hours ago +# %HH-n is replaced with hour we were n hours ago +# %NS-n is replaced with number of seconds at 00:00 since 1970 +# %WM-n is replaced with the week number in month (1-5) +# %Wm-n is replaced with the week number in month (0-4) +# %WY-n is replaced with the week number in year (01-52) +# %Wy-n is replaced with the week number in year (00-51) +# %DW-n is replaced with the day number in week (1-7, 1=sunday) +# use n=24 if you need (1-7, 1=monday) +# %Dw-n is replaced with the day number in week (0-6, 0=sunday) +# use n=24 if you need (0-6, 0=monday) +# Use 0 for n if you need current year, month, day, hour... +# Example: "/var/log/access_log.%YYYY-0%MM-0%DD-0.log" +# Example: "C:/WINNT/system32/LogFiles/W3SVC1/ex%YY-24%MM-24%DD-24.log" +# You can also use a pipe if log file come from a pipe : +# Example: "gzip -d outputpath/output.html"), enter +# path of icon directory relative to the output directory 'outputpath'. +# Example: "/awstatsicons" +# Example: "../icon" +# Default: "/icon" (means you must copy icon directories in "/mywwwroot/icon") +# +DirIcons="/user-tracking/awstats/icon" + + +# When this parameter is set to 1, AWStats add a button on report page to +# allow to "update" statistics from a web browser. Warning, when "update" is +# made from a browser, AWStats is ran as a CGI by the web server user defined +# in your web server (user "nobody" by default with Apache, "IUSR_XXX" with +# IIS), so the "DirData" directory and all already existing history files +# awstatsMMYYYY[.xxx].txt must be writable by this user. Change permissions if +# necessary to "Read/Write" (and "Modify" for Windows NTFS file systems). +# Warning: Update process can be long so you might experience "time out" +# browser errors if you don't launch AWStats enough frequently. +# When set to 0, update is only made when AWStats is ran from the command +# line interface (or a task scheduler). +# Possible values: 0 or 1 +# Default: 0 +# +AllowToUpdateStatsFromBrowser=1 + + +# AWStats save and sort its database on a month basis, this allows to build +# build a report quickly. However, if you choose the -month=all from command +# line or value '-Year-' from CGI combo form to have a report for all year, +# AWStats needs to reload all data for full year, and resort them completely, +# requiring a large amount of time, memory and CPU. This might be a problem +# for web hosting providers that offer AWStats for large sites, on shared +# servers, to non CPU cautious customers. +# For this reason, the 'full year' is only enabled on Command Line by default. +# You can change this by setting this parameter to 0, 1, 2 or 3. +# Possible values: +# 0 - Never allowed +# 1 - Allowed on CLI only, -Year- value in combo is not visible +# 2 - Allowed on CLI only, -Year- value in combo is visible but not allowed +# 3 - Possible on CLI and CGI +# Default: 2 +# +AllowFullYearView=3 + + + +#----------------------------------------------------------------------------- +# OPTIONAL SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# When the update process run, AWStats can set a lock file in TEMP or TMP +# directory. This lock is to avoid to have 2 update processes running at the +# same time to prevent unknown conflicts problems and avoid DoS attacks when +# AllowToUpdateStatsFromBrowser is set to 1. +# Because, when you use lock file, you can experience sometimes problems in +# lock file not correctly removed (killed process for example requires that +# you remove the file manualy), this option is not enabled by default (Do +# not enable this option with no console server access). +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +EnableLockForUpdate=1 + + +# AWStats can do reverse DNS lookups through a static DNS cache file that was +# previously created manually. If no path is given in static DNS cache file +# name, AWStats will search DirData directory. This file is never changed. +# This option is not used if DNSLookup=0. +# Note: DNS cache file format is 'minsince1970 ipaddress resolved_hostname' +# or just 'ipaddress resolved_hostname' +# Change : Effective for new updates only +# Example: "/mydnscachedir/dnscache" +# Default: "dnscache.txt" +# +DNSStaticCacheFile="dnscache.txt" + + +# AWStats can do reverse DNS lookups through a DNS cache file that was created +# by a previous run of AWStats. This file is erased and recreated after each +# statistics update process. You don't need to create and/or edit it. +# AWStats will read and save this file in DirData directory. +# This option is used only if DNSLookup=1. +# Note: If a DNSStaticCacheFile is available, AWStats will check for DNS +# lookup in DNSLastUpdateCacheFile after checking into DNSStaticCacheFile. +# Change : Effective for new updates only +# Example: "/mydnscachedir/dnscachelastupdate" +# Default: "dnscachelastupdate.txt" +# +DNSLastUpdateCacheFile="dnscachelastupdate.txt" + + +# You can specify specific IP addresses that should NOT be looked up in DNS. +# This option is used only if DNSLookup=1. +# Note: Use space between each value. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "123.123.123.123 REGEX[^192\.168\.]" +# Default: "" +# +SkipDNSLookupFor="" + + +# The following two parameters allow you to protect a config file from being +# read by AWStats when called from a browser if web user has not been +# authenticated. Your AWStats program must be in a web protected "realm" (With +# Apache, you can use .htaccess files to do so. With other web servers, see +# your server setup manual). +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +AllowAccessFromWebToAuthenticatedUsersOnly=0 + + +# This parameter give the list of all authorized authenticated users to view +# statistics for this domain/config file. This parameter is used only if +# AllowAccessFromWebToAuthenticatedUsersOnly is set to 1. +# Change : Effective immediatly +# Example: "user1 user2" +# Example: "__REMOTE_USER__" +# Default: "" +# +AllowAccessFromWebToFollowingAuthenticatedUsers="" + + +# When this parameter is define to something, the IP address of the user that +# read its statistics from a browser (when AWStats is used as a CGI) is +# checked and must match one of the IP address values or ranges. +# Change : Effective immediatly +# Example: "127.0.0.1 123.123.123.1-123.123.123.255" +# Default: "" +# +AllowAccessFromWebToFollowingIPAddresses="" + + +# If the "DirData" directory (see above) does not exists, AWStats return an +# error. However, you can ask AWStats to create it. +# This option can be used by some Web Hosting Providers that has defined a +# dynamic value for DirData (for example DirData="/home/__REMOTE_USER__") and +# don't want to have to create a new directory each time they add a new user. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +CreateDirDataIfNotExists=1 + + +# You can choose in which format the Awstats history database is saved. +# Note: Using "xml" format make AWStats building database files three times +# larger than using "text" format. +# Change : Database format is switched after next update +# Possible values: text or xml +# Default: text +# +BuildHistoryFormat=text + + +# If you prefer having the report output pages be built as XML compliant pages +# instead of simple HTML pages, you can set this to 'xhtml' (May not works +# properly with old browsers). +# Change : Effective immediatly +# Possible values: html or xhtml +# Default: html +# +BuildReportFormat=html + + +# In most case, AWStats is used as a cgi program. So AWStats process is ran +# by default web server user (nobody for Unix, IUSR_xxx for IIS/Windows,...). +# To make use easier and avoid permission's problems between update process +# (run by an admin user) and CGI process (ran by a low level user), AWStats +# save its database files with read and write for everyone. +# If you have experience on managing security policies (Web Hosting Provider), +# you should set this parameter to 0. AWStats will keep default process user +# permissions on its files. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 1 +# +SaveDatabaseFilesWithPermissionsForEveryone=1 + + +# AWStats can purge log file, after analyzing it. Note that AWStats is able +# to detect new lines in a log file, to process only them, so you can launch +# AWStats as often as you want, even with this parameter to 0. +# With 0, no purge is made, so you must use a scheduled task or a web server +# that make this purge frequently. +# With 1, the purge of the log file is made each time AWStats update is ran. +# This parameter doesn't work with IIS (This web server doesn't let its log +# file to be purged). +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +PurgeLogFile=0 + + +# When PurgeLogFile is setup to 1, AWStats will clean your log file after +# processing it. You can however keep an archive file (saved in "DirData") of +# all processed log records by setting this to 1 (For example if you want to +# use another log analyzer). +# This parameter is not used if PurgeLogFile=0 +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +ArchiveLogRecords=0 + + +# Each time you run the update process, AWStats overwrite the 'historic file' +# for the month (awstatsMMYYYY[.*].txt) with the updated one. +# When write errors occurs (IO, disk full,...), this historic file can be +# corrupted and must be deleted. Because this file contains information of all +# past processed log files, you will loose old stats if removed. So you can +# ask AWStats to save last non corrupted file in a .bak file. This file is +# stored in "DirData" directory with other 'historic files'. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +KeepBackupOfHistoricFiles=0 + + +# Default index page name for your web server. +# Change : Effective for new updates only +# Example: "index.php index.html default.html" +# Default: "index.html" +# +DefaultFile="index.html" + + +# Do not include access from clients that match following criteria. +# If your log file contains IP adresses in host field, you must enter here +# matching IP adresses criteria. +# If DNS lookup is already done in your log file, you must enter here hostname +# criteria, else enter ip address criteria. +# The opposite parameter of "SkipHosts" is "OnlyHosts". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" +# Example: "localhost REGEX[^.*\.localdomain$]" +# Default: "" +# +SkipHosts="" + + +# Do not include access from clients with a user agent that match following +# criteria. If you want to exclude a robot, you should update the robots.pm +# file instead of this parameter. +# The opposite parameter of "SkipUserAgents" is "OnlyUserAgents". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "konqueror REGEX[ua_test_v\d\.\d]" +# Default: "" +# +SkipUserAgents="" + + +# Use SkipFiles to ignore access to URLs that match one of following entries. +# You can enter a list of not important URLs (like framed menus, hidden pages, +# etc...) to exclude them from statistics. You must enter here exact relative +# URL as found in log file, or a matching REGEX value. +# For example, to ignore /badpage.html, just add "/badpage.html". To ignore +# all pages in a particular directory, add "REGEX[^\/directorytoexclude]". +# The opposite parameter of "SkipFiles" is "OnlyFiles". +# Note: Use space between each value. This parameter is or not case sensitive +# depending on URLNotCaseSensitive parameter. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "/badpage.html REGEX[^\/excludedirectory]" +# Default: "" +# +SkipFiles="" + + +# Include in stats, only accesses from hosts that match one of following +# entries. For example, if you want AWStats to filter access to keep only +# stats for visits from particular hosts, you can add those hosts names in +# this parameter. +# If DNS lookup is already done in your log file, you must enter here hostname +# criteria, else enter ip address criteria. +# The opposite parameter of "OnlyHosts" is "SkipHosts". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" +# Default: "" +# +OnlyHosts="" + + +# Include in stats, only accesses from user agent that match one of following +# entries. For example, if you want AWStats to filter access to keep only +# stats for visits from particular browsers, you can add their user agents +# string in this parameter. +# The opposite parameter of "OnlyUserAgents" is "SkipUserAgents". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "msie" +# Default: "" +# +OnlyUserAgents="" + + +# Include in stats, only accesses to URLs that match one of following entries. +# For example, if you want AWStats to filter access to keep only stats that +# match a particular string, like a particular directory, you can add this +# directory name in this parameter. +# The opposite parameter of "OnlyFiles" is "SkipFiles". +# Note: Use space between each value. This parameter is or not case sensitive +# depending on URLNotCaseSensitive parameter. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "REGEX[marketing_directory] REGEX[office\/.*\.(csv|sxw)$]" +# Default: "" +# +#OnlyFiles="" + + +# Add here a list of kind of url (file extension) that must be counted as +# "Hit only" and not as a "Hit" and "Page/Download". You can set here all +# images extensions as they are hit downloaded that must be counted but they +# are not viewed pages. URLs with such extensions are not included in the TOP +# Pages/URL report. +# Note: If you want to exclude particular URLs from stats (No Pages and no +# Hits reported), you must use SkipFiles parameter. +# Change : Effective for new updates only +# Example: "css js class gif jpg jpeg png bmp ico zip arj gz z wav mp3 wma mpg" +# Example: "" +# Default: "css js class gif jpg jpeg png bmp ico" +# +NotPageList="css js class gif jpg jpeg png bmp ico" + + +# By default, AWStats considers that records found in web log file are +# successful hits if HTTP code returned by server is a valid HTTP code (200 +# and 304). Any other code are reported in HTTP status chart. +# Note that HTTP 'control codes', like redirection (302, 305) are not added by +# default in this list as they are not pages seen by a visitor but are +# protocol exchange codes to tell the browser to ask another page. Because +# this other page will be counted and seen with a 200 or 304 code, if you +# add such codes, you will have 2 pages viewed reported for only one in facts. +# Change : Effective for new updates only +# Example: "200 304 302 305" +# Default: "200 304" +# +ValidHTTPCodes="200 304" + + +# By default, AWStats considers that records found in mail log file are +# successful mail transfers if field that represent return code in analyzed +# log file match values defined by this parameter. +# Change : Effective for new updates only +# Example: "1 250 200" +# Default: "1 250" +# +ValidSMTPCodes="1 250" + + +# Some web servers on some Operating systems (IIS-Windows) considers that a +# login with same value but different case are the same login. To tell AWStats +# to also considers them as one, set this parameter to 1. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +AuthenticatedUsersNotCaseSensitive=0 + + +# Some web servers on some Operating systems (IIS-Windows) considers that two +# URLs with same value but different case are the same URL. To tell AWStats to +# also considers them as one, set this parameter to 1. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +URLNotCaseSensitive=0 + + +# Keep or remove the anchor string you can find in some URLs. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +URLWithAnchor=0 + + +# In URL links, "?" char is used to add parameter's list in URLs. Syntax is: +# /mypage.html?param1=value1¶m2=value2 +# However, some servers/sites use also others chars to isolate dynamic part of +# their URLs. You can complete this list with all such characters. +# Change : Effective for new updates only +# Example: "?;," +# Default: "?;" +# +URLQuerySeparators="?;" + + +# Keep or remove the query string to the URL in the statistics for individual +# pages. This is primarily used to differentiate between the URLs of dynamic +# pages. If set to 1, mypage.html?id=x and mypage.html?id=y are counted as two +# different pages. +# Warning, when set to 1, memory required to run AWStats is dramatically +# increased if you have a lot of changing URLs (for example URLs with a random +# id inside). Such web sites should not set this option to 1 or use seriously +# the next parameter URLWithQueryWithOnlyFollowingParameters (or eventually +# URLWithQueryWithoutFollowingParameters). +# Change : Effective for new updates only +# Possible values: +# 0 - URLs are cleaned from the query string (ie: "/mypage.html") +# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") +# Default: 0 +# +URLWithQuery=0 + + +# When URLWithQuery is on, you will get the full URL with all parameters in +# URL reports. But among thoose parameters, sometimes you don't need a +# particular parameter because it does not identify the page or because it's +# a random ID changing for each access even if URL points to same page. In +# such cases, it is higly recommanded to ask AWStats to keep only parameters +# you need (if you know them) before counting, manipulating and storing URL. +# Enter here list of wanted parameters. For example, with "param", one hit on +# /mypage.cgi?param=abc&id=Yo4UomP9d and /mypage.cgi?param=abc&id=Mu8fdxl3r +# will be reported as 2 hits on /mypage.cgi?param=abc +# This parameter is not used when URLWithQuery is 0 and can't be used with +# URLWithQueryWithoutFollowingParameters. +# Change : Effective for new updates only +# Example: "param" +# Default: "" +# +URLWithQueryWithOnlyFollowingParameters="" + + +# When URLWithQuery is on, you will get the full URL with all parameters in +# URL reports. But among thoose parameters, sometimes you don't need a +# particular parameter because it does not identify the page or because it's +# a random ID changing for each access even if URL points to same page. In +# such cases, it is higly recommanded to ask AWStats to remove such parameters +# from the URL before counting, manipulating and storing URL. Enter here list +# of all non wanted parameters. For example if you enter "id", one hit on +# /mypage.cgi?param=abc&id=Yo4UomP9d and /mypage.cgi?param=abc&id=Mu8fdxl3r +# will be reported as 2 hits on /mypage.cgi?param=abc +# This parameter is not used when URLWithQuery is 0 and can't be used with +# URLWithQueryWithOnlyFollowingParameters. +# Change : Effective for new updates only +# Example: "PHPSESSID jsessionid" +# Default: "" +# +URLWithQueryWithoutFollowingParameters="" + + +# Keep or remove the query string to the referrer URL in the statistics for +# external referrer pages. This is used to differentiate between the URLs of +# dynamic referrer pages. If set to 1, mypage.html?id=x and mypage.html?id=y +# are counted as two different referrer pages. +# Change : Effective for new updates only +# Possible values: +# 0 - Referrer URLs are cleaned from the query string (ie: "/mypage.html") +# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") +# Default: 0 +# +URLReferrerWithQuery=0 + + +# AWStats can detect setup problems or show you important informations to have +# a better use. Keep this to 1, except if AWStats says you can change it. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 1 +# +WarningMessages=1 + + +# When an error occurs, AWStats output a message related to errors. If you +# want (in most cases for security reasons) to have no error messages, you +# can set this parameter to your personalized generic message. +# Change : Effective immediatly +# Example: "An error occured. Contact your Administrator" +# Default: "" +# +ErrorMessages="" + + +# AWStat can be run with debug=x parameter to ouput various informations +# to help in debugging or solving troubles. If you want (in most cases for +# security reasons) to disable debugging, set this parameter to 0. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 1 +# +DebugMessages=1 + + +# To help you to detect if your log format is good, AWStats report an error +# if all the first NbOfLinesForCorruptedLog lines have a format that does not +# match the LogFormat parameter. +# However, some worm virus attack on your web server can result in a very high +# number of corrupted lines in your log. So if you experience awstats stop +# because of bad virus records at the beginning of your log file, you can +# increase this parameter (very rare). +# Change : Effective for new updates only +# Default: 50 +# +NbOfLinesForCorruptedLog=50 + + +# For some particular integration needs, you may want to have CGI links to +# point to another script than awstats.pl. +# Use the name of this script in WrapperScript parameter. +# Change : Effective immediatly +# Example: "awstatslauncher.pl" +# Default: "" +# +WrapperScript="" + + +# DecodeUA must be set to 1 if you use Roxen web server. This server converts +# all spaces in user agent field into %20. This make the AWStats robots, os +# and browsers detection fail in some cases. Just change it to 1 if and only +# if your web server is Roxen. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +DecodeUA=0 + + +# MiscTrackerUrl can be used to make AWStats able to detect some miscellanous +# things, that can not be tracked on other way, like: +# - Javascript disabled +# - Java enabled +# - Screen size +# - Color depth +# - Macromedia Director plugin +# - Macromedia Shockwave plugin +# - Realplayer G2 plugin +# - QuickTime plugin +# - Mediaplayer plugin +# - Acrobat PDF plugin +# To enable all this features, you must copy the awstats_misc_tracker.js file +# into a /js/ directory stored in your web document root and add the following +# HTML code at the end of your index page (but before ) : +# +# +# +# +# If code is not added in index page, all those detection capabilities will be +# disabled. You must also check that ShowScreenSizeStats and ShowMiscStats +# parameters are set to 1 to make results appear in AWStats report page. +# If you want to use another directory than /js/, you must also change the +# awstatsmisctrackerurl variable into the awstats_misc_tracker.js file. +# Change : Effective for new updates only. +# Possible value: URL of javascript tracker file added in your HTML code. +# Default: "/js/awstats_misc_tracker.js" +# +MiscTrackerUrl="/js/awstats_misc_tracker.js" + + + +#----------------------------------------------------------------------------- +# OPTIONAL ACCURACY SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# Following values allows you to define accuracy of AWStats entities (robots, +# browsers, os, referers, file types) detection. +# It might be a good idea for large web sites or ISP that provides AWStats to +# high number of customers, to set this parameter to 1 (or 0), instead of 2. +# Possible values: +# 0 = No detection, +# 1 = Medium/Standard detection +# 2 = Full detection +# Change : Effective for new updates only +# Default: 2 (0 for LevelForWormsDetection) +# +LevelForBrowsersDetection=2 # 0 disables Browsers detection. + # 2 reduces AWStats speed by 2% +LevelForOSDetection=2 # 0 disables OS detection. + # 2 reduces AWStats speed by 3% +LevelForRefererAnalyze=0 # 0 disables Origin detection. + # 2 reduces AWStats speed by 14% +LevelForRobotsDetection=0 # 0 disables Robots detection. + # 2 reduces AWStats speed by 2.5% +LevelForSearchEnginesDetection=0 # 0 disables Search engines detection. + # 2 reduces AWStats speed by 9% +LevelForKeywordsDetection=0 # 0 disables Keyphrases/Keywords detection. + # 2 reduces AWStats speed by 1% +LevelForFileTypesDetection=2 # 0 disables File types detection. + # 2 reduces AWStats speed by 1% +LevelForWormsDetection=0 # 0 disables Worms detection. + # 2 reduces AWStats speed by 15% + + +#----------------------------------------------------------------------------- +# OPTIONAL APPEARANCE SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# When you use AWStats as a CGI, you can have the reports shown in HTML frames. +# Frames are only available for report viewed dynamically. When you build +# pages from command line, this option is not used and no frames are built. +# Possible values: 0 or 1 +# Default: 1 +# + +UseFramesWhenCGI=1 + + +# This parameter ask your browser to open detailed reports into a different +# window than the main page. +# Possible values: +# 0 - Open all in same browser window +# 1 - Open detailed reports in another window except if using frames +# 2 - Open always in a different window even if reports are framed +# Default: 1 +# +DetailedReportsOnNewWindows=1 + + +# You can add, in the HTML report page, a cache lifetime (in seconds) that +# will be returned to browser in HTTP header answer by server. +# This parameter is not used when report are built with -staticlinks option. +# Example: 3600 +# Default: 0 +# +Expires=0 + + +# To avoid too large web pages, you can ask AWStats to limit number of rows of +# all reported charts to this number when no other limit apply. +# Default: 1000 +# +MaxRowsInHTMLOutput=1000 + + +# Set your primary language (ISO-639-1 language codes). +# Possible value: +# Albanian=al, Bosnian=ba, Bulgarian=bg, Catalan=ca, +# Chinese (Taiwan)=tw, Chinese (Simpliefied)=cn, Czech=cz, Danish=dk, +# Dutch=nl, English=en, Estonian=et, Euskara=eu, Finnish=fi, +# French=fr, Galician=gl, German=de, Greek=gr, Hebrew=he, Hungarian=hu, +# Icelandic=is, Indonesian=id, Italian=it, Japanese=jp, Korean=kr, +# Latvian=lv, Norwegian (Nynorsk)=nn, Norwegian (Bokmal)=nb, Polish=pl, +# Portuguese=pt, Portuguese (Brazilian)=br, Romanian=ro, Russian=ru, +# Serbian=sr, Slovak=sk, Slovenian=si, Spanish=es, Swedish=se, Turkish=tr, +# Ukrainian=ua, Welsh=cy. +# First available language accepted by browser=auto +# Default: "auto" +# +Lang="es" + + +# Set the location of language files. +# Example: "/usr/share/awstats/lang" +# Default: "./lang" (means lang directory is in same location than awstats.pl) +# +DirLang="./lang" + + +# Show menu header with reports' links +# Possible values: 0 or 1 +# Default: 1 +# +ShowMenu=1 + + +# You choose here which reports you want to see in the main page and what you +# want to see in those reports. +# Possible values: +# 0 - Report is not shown at all +# 1 - Report is shown in main page with an entry in menu and default columns +# XYZ - Report shows column informations defined by code X,Y,Z... +# X,Y,Z... are code letters among the following: +# U = Unique visitors +# V = Visits +# P = Number of pages +# H = Number of hits (or mails) +# B = Bandwith (or total mail size for mail logs) +# L = Last access date +# E = Entry pages +# X = Exit pages +# C = Web compression (mod_gzip,mod_deflate) +# M = Average mail size (mail logs) +# + +# Show monthly chart +# Context: Web, Streaming, Mail, Ftp +# Default: UVPHB, Possible column codes: UVPHB +ShowMonthStats=UVPH + +# Show days of month chart +# Context: Web, Streaming, Mail, Ftp +# Default: VPHB, Possible column codes: VPHB +ShowDaysOfMonthStats=VPH + +# Show days of week chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowDaysOfWeekStats=PH + +# Show hourly chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowHoursStats=PH + +# Show domains/country chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowDomainsStats=0 + +# Show hosts chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHBL, Possible column codes: PHBL +ShowHostsStats=PHL + +# Show authenticated users chart +# Context: Web, Streaming, Ftp +# Default: 0, Possible column codes: PHBL +ShowAuthenticatedUsers=PHL + +# Show robots chart +# Context: Web, Streaming +# Default: HBL, Possible column codes: HBL +ShowRobotsStats=0 + +# Show worms chart +# Context: Web, Streaming +# Default: 0 (If set to 1, see also LevelForWormsDetection), Possible column codes: HBL +ShowWormsStats=0 + +# Show email senders chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: HBML +ShowEMailSenders=0 + +# Show email receivers chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: HBML +ShowEMailReceivers=0 + +# Show session chart +# Context: Web, Streaming, Ftp +# Default: 1, Possible column codes: None +ShowSessionsStats=1 + +# Show pages-url chart. +# Context: Web, Streaming, Ftp +# Default: PBEX, Possible column codes: PBEX +ShowPagesStats=PEX + +# Show file types chart. +# Context: Web, Streaming, Ftp +# Default: HB, Possible column codes: HBC +ShowFileTypesStats=H + +# Show file size chart (Not yet available) +# Context: Web, Streaming, Mail, Ftp +# Default: 1, Possible column codes: None +ShowFileSizesStats=0 + +# Show operating systems chart +# Context: Web, Streaming, Ftp +# Default: 1, Possible column codes: None +ShowOSStats=1 + +# Show browsers chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowBrowsersStats=1 + +# Show screen size chart +# Context: Web, Streaming +# Default: 0 (If set to 1, see also MiscTrackerUrl), Possible column codes: None +ShowScreenSizeStats=0 + +# Show origin chart +# Context: Web, Streaming +# Default: PH, Possible column codes: PH +ShowOriginStats=0 + +# Show keyphrases chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowKeyphrasesStats=0 + +# Show keywords chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowKeywordsStats=0 + +# Show misc chart +# Context: Web, Streaming +# Default: a (See also MiscTrackerUrl parameter), Possible column codes: anjdfrqwp +ShowMiscStats=0 + +# Show http errors chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowHTTPErrorsStats=1 + +# Show smtp errors chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: None +ShowSMTPErrorsStats=0 + +# Show the cluster report (Your LogFormat must contains the %cluster tag) +# Context: Web, Streaming, Ftp +# Default: 0, Possible column codes: PHB +ShowClusterStats=0 + + +# Some graphical reports are followed by the data array of values. +# If you don't want this array (to reduce report size for example), you can +# set thoose options to 0. +# Possible values: 0 or 1 +# Default: 1 +# +# Data array values for the ShowMonthStats report +AddDataArrayMonthStats=1 +# Data array values for the ShowDaysOfMonthStats report +AddDataArrayShowDaysOfMonthStats=1 +# Data array values for the ShowDaysOfWeekStats report +AddDataArrayShowDaysOfWeekStats=1 +# Data array values for the ShowHoursStats report +AddDataArrayShowHoursStats=1 + + +# In the Origin chart, you have stats on where your hits came from. You can +# includes hits on pages that comes from pages of same sites in this chart. +# Possible values: 0 or 1 +# Default: 0 +# +IncludeInternalLinksInOriginSection=1 + + +# Following parameter can be used to choose maximum number of lines shown for +# the particular following report. +# +# Stats by countries/domains +MaxNbOfDomain = 10 +MinHitDomain = 1 +# Stats by hosts +MaxNbOfHostsShown = 10 +MinHitHost = 1 +# Stats by authenticated users +MaxNbOfLoginShown = 10 +MinHitLogin = 1 +# Stats by robots +MaxNbOfRobotShown = 10 +MinHitRobot = 1 +# Stats by pages +MaxNbOfPageShown = 10 +MinHitFile = 1 +# Stats by OS +MaxNbOfOsShown = 10 +MinHitOs = 1 +# Stats by browsers +MaxNbOfBrowsersShown = 10 +MinHitBrowser = 1 +# Stats by screen size +MaxNbOfScreenSizesShown = 5 +MinHitScreenSize = 1 +# Stats by window size (following 2 parameters are not yet used) +MaxNbOfWindowSizesShown = 5 +MinHitWindowSize = 1 +# Stats by referers +MaxNbOfRefererShown = 10 +MinHitRefer = 1 +# Stats for keyphrases +MaxNbOfKeyphrasesShown = 10 +MinHitKeyphrase = 1 +# Stats for keywords +MaxNbOfKeywordsShown = 10 +MinHitKeyword = 1 +# Stats for sender or receiver emails +MaxNbOfEMailsShown = 20 +MinHitEMail = 1 + + +# Choose if you want the week report to start on sunday or monday +# Possible values: +# 0 - Week start on sunday +# 1 - Week start on monday +# Default: 1 +# +FirstDayOfWeek=1 + + +# List of visible flags that links to other language translations. +# See Lang parameter for list of allowed flag/language codes. +# If you don't want any flag link, set ShowFlagLinks to "". +# This parameter is used only if ShowMenu parameter is set to 1. +# Possible values: "" or "language_codes_separated_by_space" +# Example: "en es fr nl de" +# Default: "" +# +ShowFlagLinks="en fr de" + + +# Each URL, shown in stats report views, are links you can click. +# Possible values: 0 or 1 +# Default: 1 +# +ShowLinksOnUrl=1 + + +# When AWStats build HTML links in its report pages, it starts thoose link +# with "http://". However some links might be HTTPS links, so you can enter +# here the root of all your HTTPS links. If all your site is a SSL web site, +# just enter "/". +# This parameter is not used if ShowLinksOnUrl is 0. +# Example: "/shopping" +# Example: "/" +# Default: "" +UseHTTPSLinkForUrl="" + + +# Maximum length of URL part shown on stats page (number of characters). +# This affects only URL visible text, link still work. +# Default: 64 +# +MaxLengthOfShownURL=64 + + +# You can enter HTML code that will be added at the top of AWStats reports. +# Default: "" +# +HTMLHeadSection="" + + +# You can enter HTML code that will be added at the end of AWStats reports. +# Great to add advert ban. +# Default: "" +# +HTMLEndSection="" + + +# You can set Logo and LogoLink to use your own logo. +# Logo must be the name of image file (must be in $DirIcons/other directory). +# LogoLink is the expected URL when clicking on Logo. +# Default: "awstats_logo6.png" +# +Logo="awstats_logo6.png" +LogoLink="http://awstats.sourceforge.net" + + +# Value of maximum bar width/height for horizontal/vertical HTML graphics bar. +# Default: 260/90 +# +BarWidth = 260 +BarHeight = 90 + + +# You can ask AWStats to use a particular CSS (Cascading Style Sheet) to +# change its look. To create a style sheet, you can use samples provided with +# AWStats in wwwroot/css directory. +# Example: "/awstatscss/awstats_bw.css" +# Example: "/css/awstats_bw.css" +# Default: "" +# +StyleSheet="" + + +# Those colors parameters can be used (if StyleSheet parameter is not used) +# to change AWStats look. +# Example: color_name="RRGGBB" # RRGGBB is Red Green Blue components in Hex +# +color_Background="FFFFFF" # Background color for main page (Default = "FFFFFF") +color_TableBGTitle="CCCCDD" # Background color for table title (Default = "CCCCDD") +color_TableTitle="000000" # Table title font color (Default = "000000") +color_TableBG="CCCCDD" # Background color for table (Default = "CCCCDD") +color_TableRowTitle="FFFFFF" # Table row title font color (Default = "FFFFFF") +color_TableBGRowTitle="ECECEC" # Background color for row title (Default = "ECECEC") +color_TableBorder="ECECEC" # Table border color (Default = "ECECEC") +color_text="000000" # Color of text (Default = "000000") +color_textpercent="606060" # Color of text for percent values (Default = "606060") +color_titletext="000000" # Color of text title within colored Title Rows (Default = "000000") +color_weekend="EAEAEA" # Color for week-end days (Default = "EAEAEA") +color_link="0011BB" # Color of HTML links (Default = "0011BB") +color_hover="605040" # Color of HTML on-mouseover links (Default = "605040") +color_u="FFAA66" # Background color for number of unique visitors (Default = "FFAA66") +color_v="F4F090" # Background color for number of visites (Default = "F4F090") +color_p="4477DD" # Background color for number of pages (Default = "4477DD") +color_h="66DDEE" # Background color for number of hits (Default = "66DDEE") +color_k="2EA495" # Background color for number of bytes (Default = "2EA495") +color_s="8888DD" # Background color for number of search (Default = "8888DD") +color_e="CEC2E8" # Background color for number of entry pages (Default = "CEC2E8") +color_x="C1B2E2" # Background color for number of exit pages (Default = "C1B2E2") + + + +#----------------------------------------------------------------------------- +# PLUGINS +#----------------------------------------------------------------------------- + +# Add here all plugins file you want to load. +# Plugin files must be .pm files stored in 'plugins' directory. +# Uncomment LoadPlugin lines to enable a plugin after checking that perl +# modules required by the plugin are installed. + +# Plugin: Tooltips +# Perl modules required: None +# Add some tooltips help on HTML report pages. +# Note that enabled this kind of help will increased HTML report pages size, +# so server load and bandwidth. +# +#LoadPlugin="tooltips" + +# Plugin: DecodeUTFKeys +# Perl modules required: Encode and URI::Escape +# Allow AWStats to show correctly (in language charset) keywords/keyphrases +# strings even if they were UTF8 coded by the referer search engine. +# +#LoadPlugin="decodeutfkeys" + +# Plugin: IPv6 +# Perl modules required: Net::IP and Net::DNS +# This plugin gives AWStats capability to make reverse DNS lookup on IPv6 +# addresses. +# Note: If you are interesting in having country report, you should use the +# geoipfree or geoip plugin instead of enabled reverse DNS lookup. +# +#LoadPlugin="ipv6" + +# Plugin: HashFiles +# Perl modules required: Storable +# AWStats DNS cache files are read/saved as native hash files. This increase +# DNS cache files loading speed, above all for very large web sites. +# +#LoadPlugin="hashfiles" + +# Plugin: GeoIP +# Perl modules required: Geo::IP or Geo::IP::PurePerl (from Maxmind) +# Country chart is built from an Internet IP-Country database. +# This plugin is useless for intranet only log files. +# Note: You must choose between using this plugin (need Perl Geo::IP module +# from Maxmind, database more up to date) or the GeoIPfree plugin (need +# Perl Geo::IPfree module, database less up to date). +# This plugin reduces AWStats speed of 8% ! +# +#LoadPlugin="geoip GEOIP_STANDARD" + +# Plugin: GeoIPfree +# Perl modules required: Geo::IPfree version 0.2+ (from Graciliano M.P.) +# Country chart is built from an Internet IP-Country database. +# This plugin is useless for intranet only log files. +# Note: You must choose between using this plugin (need Perl Geo::IPfree +# module, database less up to date) or the GeoIP plugin (need Perl Geo::IP +# module from Maxmind, database more up to date). +# Note: Activestate provide a corrupted version of Geo::IPfree 0.2 Perl +# module, so install it from elsewhere (from www.cpan.org for example). +# This plugin reduces AWStats speed of 10% ! +# +#LoadPlugin="geoipfree" + +# Plugin: GeoIP_Region_Maxmind +# Perl modules required: Geo::IP (from Maxmind) +# This plugin add a chart of hits by regions. Only regions for US and +# Canada can be detected. +# Note: This plugin need Maxmind GeoIP Perl module AND the region database. +# Note: I get some problem with Maxmind Geo::IP Perl module with ActiveState +# on Windows but it works great on Linux with default Perl. +# You need to purchase a license from Maxmind to get/use the Region database. +# This plugin reduces AWStats speed. +# +#LoadPlugin="geoip_region_maxmind GEOIP_STANDARD /pathto/GeoIPRegion.dat" + +# Plugin: UserInfo +# Perl modules required: None +# Add a text (Firtname, Lastname, Office Department, ...) in authenticated user +# reports for each login value. +# A text file called userinfo.myconfig.txt, with two fields (first is login, +# second is text to show, separated by a tab char) must be created in DirData +# directory. +# +LoadPlugin="userinfo" + +# Plugin: HostInfo +# Perl modules required: Net::XWhois +# Add a column into host chart with a link to open a popup window that shows +# info on host (like whois records). +# +#LoadPlugin="hostinfo" + +# Plugin: ClusterInfo +# Perl modules required: None +# Add a text (for example a full hostname) in cluster reports for each cluster +# number. +# A text file called clusterinfo.myconfig.txt, with two fields (first is +# cluster number, second is text to show) separated by a tab char. must be +# created into DirData directory. +# Note this plugin is useless if ShowClusterStats is set to 0 or if you don't +# use a personalized log format that contains %cluster tag. +# +#LoadPlugin="clusterinfo" + +# Plugin: UrlAliases +# Perl modules required: None +# Add a text (Page title, description...) in URL reports before URL value. +# A text file called urlalias.myconfig.txt, with two fields (first is URL, +# second is text to show, separated by a tab char) must be created into +# DirData directory. +# +#LoadPlugin="urlalias" + +# Plugin: TimeHiRes +# Perl modules required: Time::HiRes (if Perl < 5.8) +# Time reported by -showsteps option is in millisecond. For debug purpose. +# +#LoadPlugin="timehires" + +# Plugin: TimeZone +# Perl modules required: Time::Local +# Allow AWStats to correct a bad timezone for user of some IIS that use +# GMT date in its log instead of local server time. +# This module is useless for Apache and most IIS version. +# This plugin reduces AWStats speed of 40% !!!!!!! +# +#LoadPlugin="timezone +2" + +# Plugin: Rawlog +# Perl modules required: None +# This plugin adds a form in AWStats main page to allow users to see raw +# content of current log files. A filter is also available. +# +#LoadPlugin="rawlog" + +# Plugin: GraphApplet +# Perl modules required: None +# Supported charts are built by a 3D graphic applet. +# +#LoadPlugin="graphapplet /awstatsclasses" # EXPERIMENTAL FEATURE + + + +#----------------------------------------------------------------------------- +# EXTRA SECTIONS +#----------------------------------------------------------------------------- + +# You can define your own charts, you choose here what are rows and columns +# keys. This feature is particularly usefull for marketing purpose, tracking +# products orders for example. +# For this, edit all parameters of Extra section. Each set of parameter is a +# different chart. For several charts, duplicate section changing the number. +# Note: Each Extra section reduces AWStats speed by 8%. +# +# WARNING: A wrong setup of Extra section might result in too large arrays +# that will consume all your memory, making AWStats unusable after several +# updates, so be sure to setup it correctly. +# In most cases, you don't need this feature. +# +# ExtraSectionNameX is title of your personalized chart. +# ExtraSectionCodeFilterX is list of codes the record code field must match. +# Put an empty string for no test on code. +# ExtraSectionConditionX are conditions you can use to count or not the hit, +# Use one of the field condition (URL,QUERY_STRING,REFERER,UA,HOST,extraX) +# and a regex to match, after a coma. Use "||" for "OR". +# ExtraSectionFirstColumnTitleX is the first column title of the chart. +# ExtraSectionFirstColumnValuesX is a string to tell AWStats which field to +# extract value from (URL,QUERY_STRING,REFERER,UA,HOST,extraX) +# and how to extract the value (using regex syntax). Each different value +# found will appear in first column of report on a different row. Be sure +# that list of different possible values will not grow indefinitely. +# ExtraSectionFirstColumnFormatX is the string used to write value. +# ExtraSectionStatTypesX are things you want to count. You can use standard +# code letters (P for pages,H for hits,B for bandwidth,L for last access). +# ExtraSectionAddAverageRowX add a row at bottom of chart with average values. +# ExtraSectionAddSumRowX add a row at bottom of chart with sum values. +# MaxNbOfExtraX is maximum number of rows shown in chart. +# MinHitExtraX is minimum number of hits required to be shown in chart. +# + +# Example to report the 20 products the most ordered by "order.cgi" script +#ExtraSectionName1="Product orders" +#ExtraSectionCodeFilter1="200 304" +#ExtraSectionCondition1="URL,\/cgi\-bin\/order\.cgi||URL,\/cgi\-bin\/order2\.cgi" +#ExtraSectionFirstColumnTitle1="Product ID" +#ExtraSectionFirstColumnValues1="QUERY_STRING,productid=([^&]+)" +#ExtraSectionFirstColumnFormat1="%s" +#ExtraSectionStatTypes1=PL +#ExtraSectionAddAverageRow1=0 +#ExtraSectionAddSumRow1=1 +#MaxNbOfExtra1=20 +#MinHitExtra1=1 + +ExtraSectionName1="Objetos" +ExtraSectionCodeFilter1="200 304" +ExtraSectionCondition1="QUERY_STRING,(id=)" +ExtraSectionFirstColumnTitle1="Id del objeto" +ExtraSectionFirstColumnValues1="QUERY_STRING,(.+)" +ExtraSectionFirstColumnFormat1="%s" +ExtraSectionStatTypes1=HVL +ExtraSectionAddAverageRow1=0 +ExtraSectionAddSumRow1=1 +MaxNbOfExtra1=20 +MinHitExtra1=1 + +# Example to report the 20 products the most ordered by "order.cgi" script +# Report of requests of xml/rdf/rss feeds +ExtraSectionName2="Foros visitados" +ExtraSectionCodeFilter2="200 304" +ExtraSectionCondition2="URL,(forum-view)" +ExtraSectionFirstColumnTitle2="Id del foro" +ExtraSectionFirstColumnValues2="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat2="%s" +ExtraSectionStatTypes2=HVL +ExtraSectionAddAverageRow2=0 +ExtraSectionAddSumRow2=1 +MaxNbOfExtra2=20 +MinHitExtra2=1 + +#message-view?message%5fid=7110 +ExtraSectionName3="Mensajes leidos" +ExtraSectionCodeFilter3="200 304" +ExtraSectionCondition3="URL,(message-view)" +ExtraSectionFirstColumnTitle3="Id del mensaje" +ExtraSectionFirstColumnValues3="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat3="%s" +ExtraSectionStatTypes3=HVL +ExtraSectionAddAverageRow3=0 +ExtraSectionAddSumRow3=1 +MaxNbOfExtra3=20 +MinHitExtra3=1 + +#one-faq?faq_id=904 +ExtraSectionName4="FAQS visitados" +ExtraSectionCodeFilter4="200 304" +ExtraSectionCondition4="URL,(faq\/one-faq)" +ExtraSectionFirstColumnTitle4="Id del FAQ" +ExtraSectionFirstColumnValues4="QUERY_STRING,faq_id=([^&]+)" +ExtraSectionFirstColumnFormat4="%s" +ExtraSectionStatTypes4=HVL +ExtraSectionAddAverageRow4=0 +ExtraSectionAddSumRow4=1 +MaxNbOfExtra4=20 +MinHitExtra4=1 + +#file-storage/index?folder%5fid=716 +ExtraSectionName5="Folders visitados" +ExtraSectionCodeFilter5="200 304" +ExtraSectionCondition5="URL,(file-storage\/index)" +ExtraSectionFirstColumnTitle5="Id del folder" +ExtraSectionFirstColumnValues5="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat5="%s" +ExtraSectionStatTypes5=HVL +ExtraSectionAddAverageRow5=0 +ExtraSectionAddSumRow5=1 +MaxNbOfExtra5=20 +MinHitExtra5=1 + +#news/item?item_id=7893 +ExtraSectionName6="Noticias leidas" +ExtraSectionCodeFilter6="200 304" +ExtraSectionCondition6="URL,(news\/item)" +ExtraSectionFirstColumnTitle6="Id de la noticia" +ExtraSectionFirstColumnValues6="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat6="%s" +ExtraSectionStatTypes6=HVL +ExtraSectionAddAverageRow6=0 +ExtraSectionAddSumRow6=1 +MaxNbOfExtra6=20 +MinHitExtra6=1 + +#forums/message-view?message%5fid=7110 +ExtraSectionName7="Mensajes leidos en los foros" +ExtraSectionCodeFilter7="200 304" +ExtraSectionCondition7="URL,(forums\/message-view)" +ExtraSectionFirstColumnTitle7="Id del mensaje" +#ExtraSectionFirstColumnValues7="QUERY_STRING,id=([^&]+) | URL,(.+)" +#ExtraSectionFirstColumnValues7="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnValues7="REFERER,(.+)" +ExtraSectionFirstColumnFormat7="%s" +ExtraSectionStatTypes7=HVL +ExtraSectionAddAverageRow7=0 +ExtraSectionAddSumRow7=1 +MaxNbOfExtra7=20 +MinHitExtra7=1 + +#dotlrn/clubs/pruebasdenotificaciones/one-community?page_num=0 +ExtraSectionName8="Comunidades visitadas" +ExtraSectionCodeFilter8="200 304" +ExtraSectionCondition8="URL,(dotlrn\/clubs\/)" +ExtraSectionFirstColumnTitle8="Nombre de la comunidad" +ExtraSectionFirstColumnValues8="URL,/dotlrn/clubs/([\w]+)\/" +ExtraSectionFirstColumnFormat8="%s" +ExtraSectionStatTypes8=PHVL +ExtraSectionAddAverageRow8=0 +ExtraSectionAddSumRow8=1 +MaxNbOfExtra8=20 +MinHitExtra8=1 + +#Por medio del community_id +ExtraSectionName9="Asignaturas visitadas" +ExtraSectionCodeFilter9="200 304" +ExtraSectionCondition9="extra1,community_id=(.+)" +ExtraSectionFirstColumnTitle9="Id de la asignatura" +ExtraSectionFirstColumnValues9="extra1,id=([\w]+)" +ExtraSectionFirstColumnFormat9="%s" +ExtraSectionStatTypes9=PHVL +ExtraSectionAddAverageRow9=0 +ExtraSectionAddSumRow9=1 +MaxNbOfExtra9=20 +MinHitExtra9=1 + +#----------------------------------------------------------------------------- +# INCLUDES +#----------------------------------------------------------------------------- + +# You can include other config files using the directive with the name of the +# config file. +# This is particularly usefull for users who have a lot of virtual servers, so +# a lot of config files and want to maintain common values in only one file. +# Note that when a variable is defined both in a config file and in an +# included file, AWStats will use the last value read for parameters that +# contains one value and AWStats will concat all values from both files for +# parameters that are lists of value. +# + +#Include "" Index: openacs-4/packages/user-tracking/config/awstatsDirecto.site.conf =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/config/Attic/awstatsDirecto.site.conf,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/config/awstatsDirecto.site.conf 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,1529 @@ +# AWSTATS CONFIGURE FILE 6.2 +#----------------------------------------------------------------------------- +# Copy this file into awstats.www.mydomain.conf and edit this new config file +# to setup AWStats (See documentation in docs/ directory). +# The config file must be in /etc/awstats, /usr/local/etc/awstats or /etc (for +# Unix/Linux) or same directory than awstats.pl (Windows, Mac, Unix/Linux...) +# To include an environment variable in any parameter (AWStats will replace +# it with its value when reading it), follow the example: +# Parameter="__ENVNAME__" +# Note that environment variable AWSTATS_CURRENT_CONFIG is always defined with +# the config value in an AWStats running session and can be used like others. +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:37 $ + + + +#----------------------------------------------------------------------------- +# MAIN SETUP SECTION (Required to make AWStats work) +#----------------------------------------------------------------------------- + +# "LogFile" contains the web, ftp or mail server log file to analyze. +# Possible values: A full path, or a relative path from awstats.pl directory. +# Example: "/var/log/apache/access.log" +# Example: "../logs/mycombinedlog.log" +# You can also use tags in this filename if you need a dynamic file name +# depending on date or time (Replacement is made by AWStats at the beginning +# of its execution). This is available tags : +# %YYYY-n is replaced with 4 digits year we were n hours ago +# %YY-n is replaced with 2 digits year we were n hours ago +# %MM-n is replaced with 2 digits month we were n hours ago +# %MO-n is replaced with 3 letters month we were n hours ago +# %DD-n is replaced with day we were n hours ago +# %HH-n is replaced with hour we were n hours ago +# %NS-n is replaced with number of seconds at 00:00 since 1970 +# %WM-n is replaced with the week number in month (1-5) +# %Wm-n is replaced with the week number in month (0-4) +# %WY-n is replaced with the week number in year (01-52) +# %Wy-n is replaced with the week number in year (00-51) +# %DW-n is replaced with the day number in week (1-7, 1=sunday) +# use n=24 if you need (1-7, 1=monday) +# %Dw-n is replaced with the day number in week (0-6, 0=sunday) +# use n=24 if you need (0-6, 0=monday) +# Use 0 for n if you need current year, month, day, hour... +# Example: "/var/log/access_log.%YYYY-0%MM-0%DD-0.log" +# Example: "C:/WINNT/system32/LogFiles/W3SVC1/ex%YY-24%MM-24%DD-24.log" +# You can also use a pipe if log file come from a pipe : +# Example: "gzip -d outputpath/output.html"), enter +# path of icon directory relative to the output directory 'outputpath'. +# Example: "/awstatsicons" +# Example: "../icon" +# Default: "/icon" (means you must copy icon directories in "/mywwwroot/icon") +# +DirIcons="/user-tracking/awstats/icon" + + +# When this parameter is set to 1, AWStats add a button on report page to +# allow to "update" statistics from a web browser. Warning, when "update" is +# made from a browser, AWStats is ran as a CGI by the web server user defined +# in your web server (user "nobody" by default with Apache, "IUSR_XXX" with +# IIS), so the "DirData" directory and all already existing history files +# awstatsMMYYYY[.xxx].txt must be writable by this user. Change permissions if +# necessary to "Read/Write" (and "Modify" for Windows NTFS file systems). +# Warning: Update process can be long so you might experience "time out" +# browser errors if you don't launch AWStats enough frequently. +# When set to 0, update is only made when AWStats is ran from the command +# line interface (or a task scheduler). +# Possible values: 0 or 1 +# Default: 0 +# +AllowToUpdateStatsFromBrowser=1 + + +# AWStats save and sort its database on a month basis, this allows to build +# build a report quickly. However, if you choose the -month=all from command +# line or value '-Year-' from CGI combo form to have a report for all year, +# AWStats needs to reload all data for full year, and resort them completely, +# requiring a large amount of time, memory and CPU. This might be a problem +# for web hosting providers that offer AWStats for large sites, on shared +# servers, to non CPU cautious customers. +# For this reason, the 'full year' is only enabled on Command Line by default. +# You can change this by setting this parameter to 0, 1, 2 or 3. +# Possible values: +# 0 - Never allowed +# 1 - Allowed on CLI only, -Year- value in combo is not visible +# 2 - Allowed on CLI only, -Year- value in combo is visible but not allowed +# 3 - Possible on CLI and CGI +# Default: 2 +# +AllowFullYearView=3 + + + +#----------------------------------------------------------------------------- +# OPTIONAL SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# When the update process run, AWStats can set a lock file in TEMP or TMP +# directory. This lock is to avoid to have 2 update processes running at the +# same time to prevent unknown conflicts problems and avoid DoS attacks when +# AllowToUpdateStatsFromBrowser is set to 1. +# Because, when you use lock file, you can experience sometimes problems in +# lock file not correctly removed (killed process for example requires that +# you remove the file manualy), this option is not enabled by default (Do +# not enable this option with no console server access). +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +EnableLockForUpdate=1 + + +# AWStats can do reverse DNS lookups through a static DNS cache file that was +# previously created manually. If no path is given in static DNS cache file +# name, AWStats will search DirData directory. This file is never changed. +# This option is not used if DNSLookup=0. +# Note: DNS cache file format is 'minsince1970 ipaddress resolved_hostname' +# or just 'ipaddress resolved_hostname' +# Change : Effective for new updates only +# Example: "/mydnscachedir/dnscache" +# Default: "dnscache.txt" +# +DNSStaticCacheFile="dnscache.txt" + + +# AWStats can do reverse DNS lookups through a DNS cache file that was created +# by a previous run of AWStats. This file is erased and recreated after each +# statistics update process. You don't need to create and/or edit it. +# AWStats will read and save this file in DirData directory. +# This option is used only if DNSLookup=1. +# Note: If a DNSStaticCacheFile is available, AWStats will check for DNS +# lookup in DNSLastUpdateCacheFile after checking into DNSStaticCacheFile. +# Change : Effective for new updates only +# Example: "/mydnscachedir/dnscachelastupdate" +# Default: "dnscachelastupdate.txt" +# +DNSLastUpdateCacheFile="dnscachelastupdate.txt" + + +# You can specify specific IP addresses that should NOT be looked up in DNS. +# This option is used only if DNSLookup=1. +# Note: Use space between each value. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "123.123.123.123 REGEX[^192\.168\.]" +# Default: "" +# +SkipDNSLookupFor="" + + +# The following two parameters allow you to protect a config file from being +# read by AWStats when called from a browser if web user has not been +# authenticated. Your AWStats program must be in a web protected "realm" (With +# Apache, you can use .htaccess files to do so. With other web servers, see +# your server setup manual). +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +AllowAccessFromWebToAuthenticatedUsersOnly=0 + + +# This parameter give the list of all authorized authenticated users to view +# statistics for this domain/config file. This parameter is used only if +# AllowAccessFromWebToAuthenticatedUsersOnly is set to 1. +# Change : Effective immediatly +# Example: "user1 user2" +# Example: "__REMOTE_USER__" +# Default: "" +# +AllowAccessFromWebToFollowingAuthenticatedUsers="" + + +# When this parameter is define to something, the IP address of the user that +# read its statistics from a browser (when AWStats is used as a CGI) is +# checked and must match one of the IP address values or ranges. +# Change : Effective immediatly +# Example: "127.0.0.1 123.123.123.1-123.123.123.255" +# Default: "" +# +AllowAccessFromWebToFollowingIPAddresses="" + + +# If the "DirData" directory (see above) does not exists, AWStats return an +# error. However, you can ask AWStats to create it. +# This option can be used by some Web Hosting Providers that has defined a +# dynamic value for DirData (for example DirData="/home/__REMOTE_USER__") and +# don't want to have to create a new directory each time they add a new user. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +CreateDirDataIfNotExists=1 + + +# You can choose in which format the Awstats history database is saved. +# Note: Using "xml" format make AWStats building database files three times +# larger than using "text" format. +# Change : Database format is switched after next update +# Possible values: text or xml +# Default: text +# +BuildHistoryFormat=text + + +# If you prefer having the report output pages be built as XML compliant pages +# instead of simple HTML pages, you can set this to 'xhtml' (May not works +# properly with old browsers). +# Change : Effective immediatly +# Possible values: html or xhtml +# Default: html +# +BuildReportFormat=html + + +# In most case, AWStats is used as a cgi program. So AWStats process is ran +# by default web server user (nobody for Unix, IUSR_xxx for IIS/Windows,...). +# To make use easier and avoid permission's problems between update process +# (run by an admin user) and CGI process (ran by a low level user), AWStats +# save its database files with read and write for everyone. +# If you have experience on managing security policies (Web Hosting Provider), +# you should set this parameter to 0. AWStats will keep default process user +# permissions on its files. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 1 +# +SaveDatabaseFilesWithPermissionsForEveryone=1 + + +# AWStats can purge log file, after analyzing it. Note that AWStats is able +# to detect new lines in a log file, to process only them, so you can launch +# AWStats as often as you want, even with this parameter to 0. +# With 0, no purge is made, so you must use a scheduled task or a web server +# that make this purge frequently. +# With 1, the purge of the log file is made each time AWStats update is ran. +# This parameter doesn't work with IIS (This web server doesn't let its log +# file to be purged). +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +PurgeLogFile=0 + + +# When PurgeLogFile is setup to 1, AWStats will clean your log file after +# processing it. You can however keep an archive file (saved in "DirData") of +# all processed log records by setting this to 1 (For example if you want to +# use another log analyzer). +# This parameter is not used if PurgeLogFile=0 +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +ArchiveLogRecords=0 + + +# Each time you run the update process, AWStats overwrite the 'historic file' +# for the month (awstatsMMYYYY[.*].txt) with the updated one. +# When write errors occurs (IO, disk full,...), this historic file can be +# corrupted and must be deleted. Because this file contains information of all +# past processed log files, you will loose old stats if removed. So you can +# ask AWStats to save last non corrupted file in a .bak file. This file is +# stored in "DirData" directory with other 'historic files'. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +KeepBackupOfHistoricFiles=0 + + +# Default index page name for your web server. +# Change : Effective for new updates only +# Example: "index.php index.html default.html" +# Default: "index.html" +# +DefaultFile="index.html" + + +# Do not include access from clients that match following criteria. +# If your log file contains IP adresses in host field, you must enter here +# matching IP adresses criteria. +# If DNS lookup is already done in your log file, you must enter here hostname +# criteria, else enter ip address criteria. +# The opposite parameter of "SkipHosts" is "OnlyHosts". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" +# Example: "localhost REGEX[^.*\.localdomain$]" +# Default: "" +# +SkipHosts="" + + +# Do not include access from clients with a user agent that match following +# criteria. If you want to exclude a robot, you should update the robots.pm +# file instead of this parameter. +# The opposite parameter of "SkipUserAgents" is "OnlyUserAgents". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "konqueror REGEX[ua_test_v\d\.\d]" +# Default: "" +# +SkipUserAgents="" + + +# Use SkipFiles to ignore access to URLs that match one of following entries. +# You can enter a list of not important URLs (like framed menus, hidden pages, +# etc...) to exclude them from statistics. You must enter here exact relative +# URL as found in log file, or a matching REGEX value. +# For example, to ignore /badpage.html, just add "/badpage.html". To ignore +# all pages in a particular directory, add "REGEX[^\/directorytoexclude]". +# The opposite parameter of "SkipFiles" is "OnlyFiles". +# Note: Use space between each value. This parameter is or not case sensitive +# depending on URLNotCaseSensitive parameter. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "/badpage.html REGEX[^\/excludedirectory]" +# Default: "" +# +SkipFiles="" + + +# Include in stats, only accesses from hosts that match one of following +# entries. For example, if you want AWStats to filter access to keep only +# stats for visits from particular hosts, you can add those hosts names in +# this parameter. +# If DNS lookup is already done in your log file, you must enter here hostname +# criteria, else enter ip address criteria. +# The opposite parameter of "OnlyHosts" is "SkipHosts". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" +# Default: "" +# +OnlyHosts="" + + +# Include in stats, only accesses from user agent that match one of following +# entries. For example, if you want AWStats to filter access to keep only +# stats for visits from particular browsers, you can add their user agents +# string in this parameter. +# The opposite parameter of "OnlyUserAgents" is "SkipUserAgents". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "msie" +# Default: "" +# +OnlyUserAgents="" + + +# Include in stats, only accesses to URLs that match one of following entries. +# For example, if you want AWStats to filter access to keep only stats that +# match a particular string, like a particular directory, you can add this +# directory name in this parameter. +# The opposite parameter of "OnlyFiles" is "SkipFiles". +# Note: Use space between each value. This parameter is or not case sensitive +# depending on URLNotCaseSensitive parameter. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "REGEX[marketing_directory] REGEX[office\/.*\.(csv|sxw)$]" +# Default: "" +# +#OnlyFiles="" + + +# Add here a list of kind of url (file extension) that must be counted as +# "Hit only" and not as a "Hit" and "Page/Download". You can set here all +# images extensions as they are hit downloaded that must be counted but they +# are not viewed pages. URLs with such extensions are not included in the TOP +# Pages/URL report. +# Note: If you want to exclude particular URLs from stats (No Pages and no +# Hits reported), you must use SkipFiles parameter. +# Change : Effective for new updates only +# Example: "css js class gif jpg jpeg png bmp ico zip arj gz z wav mp3 wma mpg" +# Example: "" +# Default: "css js class gif jpg jpeg png bmp ico" +# +NotPageList="css js class gif jpg jpeg png bmp ico" + + +# By default, AWStats considers that records found in web log file are +# successful hits if HTTP code returned by server is a valid HTTP code (200 +# and 304). Any other code are reported in HTTP status chart. +# Note that HTTP 'control codes', like redirection (302, 305) are not added by +# default in this list as they are not pages seen by a visitor but are +# protocol exchange codes to tell the browser to ask another page. Because +# this other page will be counted and seen with a 200 or 304 code, if you +# add such codes, you will have 2 pages viewed reported for only one in facts. +# Change : Effective for new updates only +# Example: "200 304 302 305" +# Default: "200 304" +# +ValidHTTPCodes="200 304" + + +# By default, AWStats considers that records found in mail log file are +# successful mail transfers if field that represent return code in analyzed +# log file match values defined by this parameter. +# Change : Effective for new updates only +# Example: "1 250 200" +# Default: "1 250" +# +ValidSMTPCodes="1 250" + + +# Some web servers on some Operating systems (IIS-Windows) considers that a +# login with same value but different case are the same login. To tell AWStats +# to also considers them as one, set this parameter to 1. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +AuthenticatedUsersNotCaseSensitive=0 + + +# Some web servers on some Operating systems (IIS-Windows) considers that two +# URLs with same value but different case are the same URL. To tell AWStats to +# also considers them as one, set this parameter to 1. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +URLNotCaseSensitive=0 + + +# Keep or remove the anchor string you can find in some URLs. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +URLWithAnchor=0 + + +# In URL links, "?" char is used to add parameter's list in URLs. Syntax is: +# /mypage.html?param1=value1¶m2=value2 +# However, some servers/sites use also others chars to isolate dynamic part of +# their URLs. You can complete this list with all such characters. +# Change : Effective for new updates only +# Example: "?;," +# Default: "?;" +# +URLQuerySeparators="?;" + + +# Keep or remove the query string to the URL in the statistics for individual +# pages. This is primarily used to differentiate between the URLs of dynamic +# pages. If set to 1, mypage.html?id=x and mypage.html?id=y are counted as two +# different pages. +# Warning, when set to 1, memory required to run AWStats is dramatically +# increased if you have a lot of changing URLs (for example URLs with a random +# id inside). Such web sites should not set this option to 1 or use seriously +# the next parameter URLWithQueryWithOnlyFollowingParameters (or eventually +# URLWithQueryWithoutFollowingParameters). +# Change : Effective for new updates only +# Possible values: +# 0 - URLs are cleaned from the query string (ie: "/mypage.html") +# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") +# Default: 0 +# +URLWithQuery=0 + + +# When URLWithQuery is on, you will get the full URL with all parameters in +# URL reports. But among thoose parameters, sometimes you don't need a +# particular parameter because it does not identify the page or because it's +# a random ID changing for each access even if URL points to same page. In +# such cases, it is higly recommanded to ask AWStats to keep only parameters +# you need (if you know them) before counting, manipulating and storing URL. +# Enter here list of wanted parameters. For example, with "param", one hit on +# /mypage.cgi?param=abc&id=Yo4UomP9d and /mypage.cgi?param=abc&id=Mu8fdxl3r +# will be reported as 2 hits on /mypage.cgi?param=abc +# This parameter is not used when URLWithQuery is 0 and can't be used with +# URLWithQueryWithoutFollowingParameters. +# Change : Effective for new updates only +# Example: "param" +# Default: "" +# +URLWithQueryWithOnlyFollowingParameters="" + + +# When URLWithQuery is on, you will get the full URL with all parameters in +# URL reports. But among thoose parameters, sometimes you don't need a +# particular parameter because it does not identify the page or because it's +# a random ID changing for each access even if URL points to same page. In +# such cases, it is higly recommanded to ask AWStats to remove such parameters +# from the URL before counting, manipulating and storing URL. Enter here list +# of all non wanted parameters. For example if you enter "id", one hit on +# /mypage.cgi?param=abc&id=Yo4UomP9d and /mypage.cgi?param=abc&id=Mu8fdxl3r +# will be reported as 2 hits on /mypage.cgi?param=abc +# This parameter is not used when URLWithQuery is 0 and can't be used with +# URLWithQueryWithOnlyFollowingParameters. +# Change : Effective for new updates only +# Example: "PHPSESSID jsessionid" +# Default: "" +# +URLWithQueryWithoutFollowingParameters="" + + +# Keep or remove the query string to the referrer URL in the statistics for +# external referrer pages. This is used to differentiate between the URLs of +# dynamic referrer pages. If set to 1, mypage.html?id=x and mypage.html?id=y +# are counted as two different referrer pages. +# Change : Effective for new updates only +# Possible values: +# 0 - Referrer URLs are cleaned from the query string (ie: "/mypage.html") +# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") +# Default: 0 +# +URLReferrerWithQuery=0 + + +# AWStats can detect setup problems or show you important informations to have +# a better use. Keep this to 1, except if AWStats says you can change it. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 1 +# +WarningMessages=1 + + +# When an error occurs, AWStats output a message related to errors. If you +# want (in most cases for security reasons) to have no error messages, you +# can set this parameter to your personalized generic message. +# Change : Effective immediatly +# Example: "An error occured. Contact your Administrator" +# Default: "" +# +ErrorMessages="" + + +# AWStat can be run with debug=x parameter to ouput various informations +# to help in debugging or solving troubles. If you want (in most cases for +# security reasons) to disable debugging, set this parameter to 0. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 1 +# +DebugMessages=1 + + +# To help you to detect if your log format is good, AWStats report an error +# if all the first NbOfLinesForCorruptedLog lines have a format that does not +# match the LogFormat parameter. +# However, some worm virus attack on your web server can result in a very high +# number of corrupted lines in your log. So if you experience awstats stop +# because of bad virus records at the beginning of your log file, you can +# increase this parameter (very rare). +# Change : Effective for new updates only +# Default: 50 +# +NbOfLinesForCorruptedLog=50 + + +# For some particular integration needs, you may want to have CGI links to +# point to another script than awstats.pl. +# Use the name of this script in WrapperScript parameter. +# Change : Effective immediatly +# Example: "awstatslauncher.pl" +# Default: "" +# +WrapperScript="" + + +# DecodeUA must be set to 1 if you use Roxen web server. This server converts +# all spaces in user agent field into %20. This make the AWStats robots, os +# and browsers detection fail in some cases. Just change it to 1 if and only +# if your web server is Roxen. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +DecodeUA=0 + + +# MiscTrackerUrl can be used to make AWStats able to detect some miscellanous +# things, that can not be tracked on other way, like: +# - Javascript disabled +# - Java enabled +# - Screen size +# - Color depth +# - Macromedia Director plugin +# - Macromedia Shockwave plugin +# - Realplayer G2 plugin +# - QuickTime plugin +# - Mediaplayer plugin +# - Acrobat PDF plugin +# To enable all this features, you must copy the awstats_misc_tracker.js file +# into a /js/ directory stored in your web document root and add the following +# HTML code at the end of your index page (but before ) : +# +# +# +# +# If code is not added in index page, all those detection capabilities will be +# disabled. You must also check that ShowScreenSizeStats and ShowMiscStats +# parameters are set to 1 to make results appear in AWStats report page. +# If you want to use another directory than /js/, you must also change the +# awstatsmisctrackerurl variable into the awstats_misc_tracker.js file. +# Change : Effective for new updates only. +# Possible value: URL of javascript tracker file added in your HTML code. +# Default: "/js/awstats_misc_tracker.js" +# +MiscTrackerUrl="/js/awstats_misc_tracker.js" + + + +#----------------------------------------------------------------------------- +# OPTIONAL ACCURACY SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# Following values allows you to define accuracy of AWStats entities (robots, +# browsers, os, referers, file types) detection. +# It might be a good idea for large web sites or ISP that provides AWStats to +# high number of customers, to set this parameter to 1 (or 0), instead of 2. +# Possible values: +# 0 = No detection, +# 1 = Medium/Standard detection +# 2 = Full detection +# Change : Effective for new updates only +# Default: 2 (0 for LevelForWormsDetection) +# +LevelForBrowsersDetection=2 # 0 disables Browsers detection. + # 2 reduces AWStats speed by 2% +LevelForOSDetection=2 # 0 disables OS detection. + # 2 reduces AWStats speed by 3% +LevelForRefererAnalyze=0 # 0 disables Origin detection. + # 2 reduces AWStats speed by 14% +LevelForRobotsDetection=0 # 0 disables Robots detection. + # 2 reduces AWStats speed by 2.5% +LevelForSearchEnginesDetection=0 # 0 disables Search engines detection. + # 2 reduces AWStats speed by 9% +LevelForKeywordsDetection=0 # 0 disables Keyphrases/Keywords detection. + # 2 reduces AWStats speed by 1% +LevelForFileTypesDetection=2 # 0 disables File types detection. + # 2 reduces AWStats speed by 1% +LevelForWormsDetection=0 # 0 disables Worms detection. + # 2 reduces AWStats speed by 15% + + +#----------------------------------------------------------------------------- +# OPTIONAL APPEARANCE SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# When you use AWStats as a CGI, you can have the reports shown in HTML frames. +# Frames are only available for report viewed dynamically. When you build +# pages from command line, this option is not used and no frames are built. +# Possible values: 0 or 1 +# Default: 1 +# + +UseFramesWhenCGI=1 + + +# This parameter ask your browser to open detailed reports into a different +# window than the main page. +# Possible values: +# 0 - Open all in same browser window +# 1 - Open detailed reports in another window except if using frames +# 2 - Open always in a different window even if reports are framed +# Default: 1 +# +DetailedReportsOnNewWindows=1 + + +# You can add, in the HTML report page, a cache lifetime (in seconds) that +# will be returned to browser in HTTP header answer by server. +# This parameter is not used when report are built with -staticlinks option. +# Example: 3600 +# Default: 0 +# +Expires=0 + + +# To avoid too large web pages, you can ask AWStats to limit number of rows of +# all reported charts to this number when no other limit apply. +# Default: 1000 +# +MaxRowsInHTMLOutput=1000 + + +# Set your primary language (ISO-639-1 language codes). +# Possible value: +# Albanian=al, Bosnian=ba, Bulgarian=bg, Catalan=ca, +# Chinese (Taiwan)=tw, Chinese (Simpliefied)=cn, Czech=cz, Danish=dk, +# Dutch=nl, English=en, Estonian=et, Euskara=eu, Finnish=fi, +# French=fr, Galician=gl, German=de, Greek=gr, Hebrew=he, Hungarian=hu, +# Icelandic=is, Indonesian=id, Italian=it, Japanese=jp, Korean=kr, +# Latvian=lv, Norwegian (Nynorsk)=nn, Norwegian (Bokmal)=nb, Polish=pl, +# Portuguese=pt, Portuguese (Brazilian)=br, Romanian=ro, Russian=ru, +# Serbian=sr, Slovak=sk, Slovenian=si, Spanish=es, Swedish=se, Turkish=tr, +# Ukrainian=ua, Welsh=cy. +# First available language accepted by browser=auto +# Default: "auto" +# +Lang="es" + + +# Set the location of language files. +# Example: "/usr/share/awstats/lang" +# Default: "./lang" (means lang directory is in same location than awstats.pl) +# +DirLang="./lang" + + +# Show menu header with reports' links +# Possible values: 0 or 1 +# Default: 1 +# +ShowMenu=1 + + +# You choose here which reports you want to see in the main page and what you +# want to see in those reports. +# Possible values: +# 0 - Report is not shown at all +# 1 - Report is shown in main page with an entry in menu and default columns +# XYZ - Report shows column informations defined by code X,Y,Z... +# X,Y,Z... are code letters among the following: +# U = Unique visitors +# V = Visits +# P = Number of pages +# H = Number of hits (or mails) +# B = Bandwith (or total mail size for mail logs) +# L = Last access date +# E = Entry pages +# X = Exit pages +# C = Web compression (mod_gzip,mod_deflate) +# M = Average mail size (mail logs) +# + +# Show monthly chart +# Context: Web, Streaming, Mail, Ftp +# Default: UVPHB, Possible column codes: UVPHB +ShowMonthStats=UVPH + +# Show days of month chart +# Context: Web, Streaming, Mail, Ftp +# Default: VPHB, Possible column codes: VPHB +ShowDaysOfMonthStats=VPH + +# Show days of week chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowDaysOfWeekStats=PH + +# Show hourly chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowHoursStats=PH + +# Show domains/country chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowDomainsStats=0 + +# Show hosts chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHBL, Possible column codes: PHBL +ShowHostsStats=PHL + +# Show authenticated users chart +# Context: Web, Streaming, Ftp +# Default: 0, Possible column codes: PHBL +ShowAuthenticatedUsers=PHL + +# Show robots chart +# Context: Web, Streaming +# Default: HBL, Possible column codes: HBL +ShowRobotsStats=0 + +# Show worms chart +# Context: Web, Streaming +# Default: 0 (If set to 1, see also LevelForWormsDetection), Possible column codes: HBL +ShowWormsStats=0 + +# Show email senders chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: HBML +ShowEMailSenders=0 + +# Show email receivers chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: HBML +ShowEMailReceivers=0 + +# Show session chart +# Context: Web, Streaming, Ftp +# Default: 1, Possible column codes: None +ShowSessionsStats=1 + +# Show pages-url chart. +# Context: Web, Streaming, Ftp +# Default: PBEX, Possible column codes: PBEX +ShowPagesStats=PEX + +# Show file types chart. +# Context: Web, Streaming, Ftp +# Default: HB, Possible column codes: HBC +ShowFileTypesStats=H + +# Show file size chart (Not yet available) +# Context: Web, Streaming, Mail, Ftp +# Default: 1, Possible column codes: None +ShowFileSizesStats=0 + +# Show operating systems chart +# Context: Web, Streaming, Ftp +# Default: 1, Possible column codes: None +ShowOSStats=1 + +# Show browsers chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowBrowsersStats=1 + +# Show screen size chart +# Context: Web, Streaming +# Default: 0 (If set to 1, see also MiscTrackerUrl), Possible column codes: None +ShowScreenSizeStats=0 + +# Show origin chart +# Context: Web, Streaming +# Default: PH, Possible column codes: PH +ShowOriginStats=0 + +# Show keyphrases chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowKeyphrasesStats=0 + +# Show keywords chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowKeywordsStats=0 + +# Show misc chart +# Context: Web, Streaming +# Default: a (See also MiscTrackerUrl parameter), Possible column codes: anjdfrqwp +ShowMiscStats=0 + +# Show http errors chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowHTTPErrorsStats=1 + +# Show smtp errors chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: None +ShowSMTPErrorsStats=0 + +# Show the cluster report (Your LogFormat must contains the %cluster tag) +# Context: Web, Streaming, Ftp +# Default: 0, Possible column codes: PHB +ShowClusterStats=0 + + +# Some graphical reports are followed by the data array of values. +# If you don't want this array (to reduce report size for example), you can +# set thoose options to 0. +# Possible values: 0 or 1 +# Default: 1 +# +# Data array values for the ShowMonthStats report +AddDataArrayMonthStats=1 +# Data array values for the ShowDaysOfMonthStats report +AddDataArrayShowDaysOfMonthStats=1 +# Data array values for the ShowDaysOfWeekStats report +AddDataArrayShowDaysOfWeekStats=1 +# Data array values for the ShowHoursStats report +AddDataArrayShowHoursStats=1 + + +# In the Origin chart, you have stats on where your hits came from. You can +# includes hits on pages that comes from pages of same sites in this chart. +# Possible values: 0 or 1 +# Default: 0 +# +IncludeInternalLinksInOriginSection=1 + + +# Following parameter can be used to choose maximum number of lines shown for +# the particular following report. +# +# Stats by countries/domains +MaxNbOfDomain = 10 +MinHitDomain = 1 +# Stats by hosts +MaxNbOfHostsShown = 10 +MinHitHost = 1 +# Stats by authenticated users +MaxNbOfLoginShown = 10 +MinHitLogin = 1 +# Stats by robots +MaxNbOfRobotShown = 10 +MinHitRobot = 1 +# Stats by pages +MaxNbOfPageShown = 10 +MinHitFile = 1 +# Stats by OS +MaxNbOfOsShown = 10 +MinHitOs = 1 +# Stats by browsers +MaxNbOfBrowsersShown = 10 +MinHitBrowser = 1 +# Stats by screen size +MaxNbOfScreenSizesShown = 5 +MinHitScreenSize = 1 +# Stats by window size (following 2 parameters are not yet used) +MaxNbOfWindowSizesShown = 5 +MinHitWindowSize = 1 +# Stats by referers +MaxNbOfRefererShown = 10 +MinHitRefer = 1 +# Stats for keyphrases +MaxNbOfKeyphrasesShown = 10 +MinHitKeyphrase = 1 +# Stats for keywords +MaxNbOfKeywordsShown = 10 +MinHitKeyword = 1 +# Stats for sender or receiver emails +MaxNbOfEMailsShown = 20 +MinHitEMail = 1 + + +# Choose if you want the week report to start on sunday or monday +# Possible values: +# 0 - Week start on sunday +# 1 - Week start on monday +# Default: 1 +# +FirstDayOfWeek=1 + + +# List of visible flags that links to other language translations. +# See Lang parameter for list of allowed flag/language codes. +# If you don't want any flag link, set ShowFlagLinks to "". +# This parameter is used only if ShowMenu parameter is set to 1. +# Possible values: "" or "language_codes_separated_by_space" +# Example: "en es fr nl de" +# Default: "" +# +ShowFlagLinks="en fr de" + + +# Each URL, shown in stats report views, are links you can click. +# Possible values: 0 or 1 +# Default: 1 +# +ShowLinksOnUrl=1 + + +# When AWStats build HTML links in its report pages, it starts thoose link +# with "http://". However some links might be HTTPS links, so you can enter +# here the root of all your HTTPS links. If all your site is a SSL web site, +# just enter "/". +# This parameter is not used if ShowLinksOnUrl is 0. +# Example: "/shopping" +# Example: "/" +# Default: "" +UseHTTPSLinkForUrl="" + + +# Maximum length of URL part shown on stats page (number of characters). +# This affects only URL visible text, link still work. +# Default: 64 +# +MaxLengthOfShownURL=64 + + +# You can enter HTML code that will be added at the top of AWStats reports. +# Default: "" +# +HTMLHeadSection="" + + +# You can enter HTML code that will be added at the end of AWStats reports. +# Great to add advert ban. +# Default: "" +# +HTMLEndSection="" + + +# You can set Logo and LogoLink to use your own logo. +# Logo must be the name of image file (must be in $DirIcons/other directory). +# LogoLink is the expected URL when clicking on Logo. +# Default: "awstats_logo6.png" +# +Logo="awstats_logo6.png" +LogoLink="http://awstats.sourceforge.net" + + +# Value of maximum bar width/height for horizontal/vertical HTML graphics bar. +# Default: 260/90 +# +BarWidth = 260 +BarHeight = 90 + + +# You can ask AWStats to use a particular CSS (Cascading Style Sheet) to +# change its look. To create a style sheet, you can use samples provided with +# AWStats in wwwroot/css directory. +# Example: "/awstatscss/awstats_bw.css" +# Example: "/css/awstats_bw.css" +# Default: "" +# +StyleSheet="" + + +# Those colors parameters can be used (if StyleSheet parameter is not used) +# to change AWStats look. +# Example: color_name="RRGGBB" # RRGGBB is Red Green Blue components in Hex +# +color_Background="FFFFFF" # Background color for main page (Default = "FFFFFF") +color_TableBGTitle="CCCCDD" # Background color for table title (Default = "CCCCDD") +color_TableTitle="000000" # Table title font color (Default = "000000") +color_TableBG="CCCCDD" # Background color for table (Default = "CCCCDD") +color_TableRowTitle="FFFFFF" # Table row title font color (Default = "FFFFFF") +color_TableBGRowTitle="ECECEC" # Background color for row title (Default = "ECECEC") +color_TableBorder="ECECEC" # Table border color (Default = "ECECEC") +color_text="000000" # Color of text (Default = "000000") +color_textpercent="606060" # Color of text for percent values (Default = "606060") +color_titletext="000000" # Color of text title within colored Title Rows (Default = "000000") +color_weekend="EAEAEA" # Color for week-end days (Default = "EAEAEA") +color_link="0011BB" # Color of HTML links (Default = "0011BB") +color_hover="605040" # Color of HTML on-mouseover links (Default = "605040") +color_u="FFAA66" # Background color for number of unique visitors (Default = "FFAA66") +color_v="F4F090" # Background color for number of visites (Default = "F4F090") +color_p="4477DD" # Background color for number of pages (Default = "4477DD") +color_h="66DDEE" # Background color for number of hits (Default = "66DDEE") +color_k="2EA495" # Background color for number of bytes (Default = "2EA495") +color_s="8888DD" # Background color for number of search (Default = "8888DD") +color_e="CEC2E8" # Background color for number of entry pages (Default = "CEC2E8") +color_x="C1B2E2" # Background color for number of exit pages (Default = "C1B2E2") + + + +#----------------------------------------------------------------------------- +# PLUGINS +#----------------------------------------------------------------------------- + +# Add here all plugins file you want to load. +# Plugin files must be .pm files stored in 'plugins' directory. +# Uncomment LoadPlugin lines to enable a plugin after checking that perl +# modules required by the plugin are installed. + +# Plugin: Tooltips +# Perl modules required: None +# Add some tooltips help on HTML report pages. +# Note that enabled this kind of help will increased HTML report pages size, +# so server load and bandwidth. +# +#LoadPlugin="tooltips" + +# Plugin: DecodeUTFKeys +# Perl modules required: Encode and URI::Escape +# Allow AWStats to show correctly (in language charset) keywords/keyphrases +# strings even if they were UTF8 coded by the referer search engine. +# +#LoadPlugin="decodeutfkeys" + +# Plugin: IPv6 +# Perl modules required: Net::IP and Net::DNS +# This plugin gives AWStats capability to make reverse DNS lookup on IPv6 +# addresses. +# Note: If you are interesting in having country report, you should use the +# geoipfree or geoip plugin instead of enabled reverse DNS lookup. +# +#LoadPlugin="ipv6" + +# Plugin: HashFiles +# Perl modules required: Storable +# AWStats DNS cache files are read/saved as native hash files. This increase +# DNS cache files loading speed, above all for very large web sites. +# +#LoadPlugin="hashfiles" + +# Plugin: GeoIP +# Perl modules required: Geo::IP or Geo::IP::PurePerl (from Maxmind) +# Country chart is built from an Internet IP-Country database. +# This plugin is useless for intranet only log files. +# Note: You must choose between using this plugin (need Perl Geo::IP module +# from Maxmind, database more up to date) or the GeoIPfree plugin (need +# Perl Geo::IPfree module, database less up to date). +# This plugin reduces AWStats speed of 8% ! +# +#LoadPlugin="geoip GEOIP_STANDARD" + +# Plugin: GeoIPfree +# Perl modules required: Geo::IPfree version 0.2+ (from Graciliano M.P.) +# Country chart is built from an Internet IP-Country database. +# This plugin is useless for intranet only log files. +# Note: You must choose between using this plugin (need Perl Geo::IPfree +# module, database less up to date) or the GeoIP plugin (need Perl Geo::IP +# module from Maxmind, database more up to date). +# Note: Activestate provide a corrupted version of Geo::IPfree 0.2 Perl +# module, so install it from elsewhere (from www.cpan.org for example). +# This plugin reduces AWStats speed of 10% ! +# +#LoadPlugin="geoipfree" + +# Plugin: GeoIP_Region_Maxmind +# Perl modules required: Geo::IP (from Maxmind) +# This plugin add a chart of hits by regions. Only regions for US and +# Canada can be detected. +# Note: This plugin need Maxmind GeoIP Perl module AND the region database. +# Note: I get some problem with Maxmind Geo::IP Perl module with ActiveState +# on Windows but it works great on Linux with default Perl. +# You need to purchase a license from Maxmind to get/use the Region database. +# This plugin reduces AWStats speed. +# +#LoadPlugin="geoip_region_maxmind GEOIP_STANDARD /pathto/GeoIPRegion.dat" + +# Plugin: UserInfo +# Perl modules required: None +# Add a text (Firtname, Lastname, Office Department, ...) in authenticated user +# reports for each login value. +# A text file called userinfo.myconfig.txt, with two fields (first is login, +# second is text to show, separated by a tab char) must be created in DirData +# directory. +# +LoadPlugin="userinfo" + +# Plugin: HostInfo +# Perl modules required: Net::XWhois +# Add a column into host chart with a link to open a popup window that shows +# info on host (like whois records). +# +#LoadPlugin="hostinfo" + +# Plugin: ClusterInfo +# Perl modules required: None +# Add a text (for example a full hostname) in cluster reports for each cluster +# number. +# A text file called clusterinfo.myconfig.txt, with two fields (first is +# cluster number, second is text to show) separated by a tab char. must be +# created into DirData directory. +# Note this plugin is useless if ShowClusterStats is set to 0 or if you don't +# use a personalized log format that contains %cluster tag. +# +#LoadPlugin="clusterinfo" + +# Plugin: UrlAliases +# Perl modules required: None +# Add a text (Page title, description...) in URL reports before URL value. +# A text file called urlalias.myconfig.txt, with two fields (first is URL, +# second is text to show, separated by a tab char) must be created into +# DirData directory. +# +#LoadPlugin="urlalias" + +# Plugin: TimeHiRes +# Perl modules required: Time::HiRes (if Perl < 5.8) +# Time reported by -showsteps option is in millisecond. For debug purpose. +# +#LoadPlugin="timehires" + +# Plugin: TimeZone +# Perl modules required: Time::Local +# Allow AWStats to correct a bad timezone for user of some IIS that use +# GMT date in its log instead of local server time. +# This module is useless for Apache and most IIS version. +# This plugin reduces AWStats speed of 40% !!!!!!! +# +#LoadPlugin="timezone +2" + +# Plugin: Rawlog +# Perl modules required: None +# This plugin adds a form in AWStats main page to allow users to see raw +# content of current log files. A filter is also available. +# +#LoadPlugin="rawlog" + +# Plugin: GraphApplet +# Perl modules required: None +# Supported charts are built by a 3D graphic applet. +# +#LoadPlugin="graphapplet /awstatsclasses" # EXPERIMENTAL FEATURE + + + +#----------------------------------------------------------------------------- +# EXTRA SECTIONS +#----------------------------------------------------------------------------- + +# You can define your own charts, you choose here what are rows and columns +# keys. This feature is particularly usefull for marketing purpose, tracking +# products orders for example. +# For this, edit all parameters of Extra section. Each set of parameter is a +# different chart. For several charts, duplicate section changing the number. +# Note: Each Extra section reduces AWStats speed by 8%. +# +# WARNING: A wrong setup of Extra section might result in too large arrays +# that will consume all your memory, making AWStats unusable after several +# updates, so be sure to setup it correctly. +# In most cases, you don't need this feature. +# +# ExtraSectionNameX is title of your personalized chart. +# ExtraSectionCodeFilterX is list of codes the record code field must match. +# Put an empty string for no test on code. +# ExtraSectionConditionX are conditions you can use to count or not the hit, +# Use one of the field condition (URL,QUERY_STRING,REFERER,UA,HOST,extraX) +# and a regex to match, after a coma. Use "||" for "OR". +# ExtraSectionFirstColumnTitleX is the first column title of the chart. +# ExtraSectionFirstColumnValuesX is a string to tell AWStats which field to +# extract value from (URL,QUERY_STRING,REFERER,UA,HOST,extraX) +# and how to extract the value (using regex syntax). Each different value +# found will appear in first column of report on a different row. Be sure +# that list of different possible values will not grow indefinitely. +# ExtraSectionFirstColumnFormatX is the string used to write value. +# ExtraSectionStatTypesX are things you want to count. You can use standard +# code letters (P for pages,H for hits,B for bandwidth,L for last access). +# ExtraSectionAddAverageRowX add a row at bottom of chart with average values. +# ExtraSectionAddSumRowX add a row at bottom of chart with sum values. +# MaxNbOfExtraX is maximum number of rows shown in chart. +# MinHitExtraX is minimum number of hits required to be shown in chart. +# + +# Example to report the 20 products the most ordered by "order.cgi" script +#ExtraSectionName1="Product orders" +#ExtraSectionCodeFilter1="200 304" +#ExtraSectionCondition1="URL,\/cgi\-bin\/order\.cgi||URL,\/cgi\-bin\/order2\.cgi" +#ExtraSectionFirstColumnTitle1="Product ID" +#ExtraSectionFirstColumnValues1="QUERY_STRING,productid=([^&]+)" +#ExtraSectionFirstColumnFormat1="%s" +#ExtraSectionStatTypes1=PL +#ExtraSectionAddAverageRow1=0 +#ExtraSectionAddSumRow1=1 +#MaxNbOfExtra1=20 +#MinHitExtra1=1 + +ExtraSectionName1="Objetos" +ExtraSectionCodeFilter1="200 304" +ExtraSectionCondition1="QUERY_STRING,(id=)" +ExtraSectionFirstColumnTitle1="Id del objeto" +ExtraSectionFirstColumnValues1="QUERY_STRING,(.+)" +ExtraSectionFirstColumnFormat1="%s" +ExtraSectionStatTypes1=HVL +ExtraSectionAddAverageRow1=0 +ExtraSectionAddSumRow1=1 +MaxNbOfExtra1=20 +MinHitExtra1=1 + +# Example to report the 20 products the most ordered by "order.cgi" script +# Report of requests of xml/rdf/rss feeds +ExtraSectionName2="Foros visitados" +ExtraSectionCodeFilter2="200 304" +ExtraSectionCondition2="URL,(forum-view)" +ExtraSectionFirstColumnTitle2="Id del foro" +ExtraSectionFirstColumnValues2="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat2="%s" +ExtraSectionStatTypes2=HVL +ExtraSectionAddAverageRow2=0 +ExtraSectionAddSumRow2=1 +MaxNbOfExtra2=20 +MinHitExtra2=1 + +#message-view?message%5fid=7110 +ExtraSectionName3="Mensajes leidos" +ExtraSectionCodeFilter3="200 304" +ExtraSectionCondition3="URL,(message-view)" +ExtraSectionFirstColumnTitle3="Id del mensaje" +ExtraSectionFirstColumnValues3="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat3="%s" +ExtraSectionStatTypes3=HVL +ExtraSectionAddAverageRow3=0 +ExtraSectionAddSumRow3=1 +MaxNbOfExtra3=20 +MinHitExtra3=1 + +#one-faq?faq_id=904 +ExtraSectionName4="FAQS visitados" +ExtraSectionCodeFilter4="200 304" +ExtraSectionCondition4="URL,(faq\/one-faq)" +ExtraSectionFirstColumnTitle4="Id del FAQ" +ExtraSectionFirstColumnValues4="QUERY_STRING,faq_id=([^&]+)" +ExtraSectionFirstColumnFormat4="%s" +ExtraSectionStatTypes4=HVL +ExtraSectionAddAverageRow4=0 +ExtraSectionAddSumRow4=1 +MaxNbOfExtra4=20 +MinHitExtra4=1 + +#file-storage/index?folder%5fid=716 +ExtraSectionName5="Folders visitados" +ExtraSectionCodeFilter5="200 304" +ExtraSectionCondition5="URL,(file-storage\/index)" +ExtraSectionFirstColumnTitle5="Id del folder" +ExtraSectionFirstColumnValues5="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat5="%s" +ExtraSectionStatTypes5=HVL +ExtraSectionAddAverageRow5=0 +ExtraSectionAddSumRow5=1 +MaxNbOfExtra5=20 +MinHitExtra5=1 + +#news/item?item_id=7893 +ExtraSectionName6="Noticias leidas" +ExtraSectionCodeFilter6="200 304" +ExtraSectionCondition6="URL,(news\/item)" +ExtraSectionFirstColumnTitle6="Id de la noticia" +ExtraSectionFirstColumnValues6="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat6="%s" +ExtraSectionStatTypes6=HVL +ExtraSectionAddAverageRow6=0 +ExtraSectionAddSumRow6=1 +MaxNbOfExtra6=20 +MinHitExtra6=1 + +#forums/message-view?message%5fid=7110 +ExtraSectionName7="Mensajes leidos en los foros" +ExtraSectionCodeFilter7="200 304" +ExtraSectionCondition7="URL,(forums\/message-view)" +ExtraSectionFirstColumnTitle7="Id del mensaje" +#ExtraSectionFirstColumnValues7="QUERY_STRING,id=([^&]+) | URL,(.+)" +#ExtraSectionFirstColumnValues7="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnValues7="REFERER,(.+)" +ExtraSectionFirstColumnFormat7="%s" +ExtraSectionStatTypes7=HVL +ExtraSectionAddAverageRow7=0 +ExtraSectionAddSumRow7=1 +MaxNbOfExtra7=20 +MinHitExtra7=1 + +#dotlrn/clubs/pruebasdenotificaciones/one-community?page_num=0 +ExtraSectionName8="Comunidades visitadas" +ExtraSectionCodeFilter8="200 304" +ExtraSectionCondition8="URL,(dotlrn\/clubs\/)" +ExtraSectionFirstColumnTitle8="Nombre de la comunidad" +ExtraSectionFirstColumnValues8="URL,/dotlrn/clubs/([\w]+)\/" +ExtraSectionFirstColumnFormat8="%s" +ExtraSectionStatTypes8=PHVL +ExtraSectionAddAverageRow8=0 +ExtraSectionAddSumRow8=1 +MaxNbOfExtra8=20 +MinHitExtra8=1 + +#Por medio del community_id +ExtraSectionName9="Asignaturas visitadas" +ExtraSectionCodeFilter9="200 304" +ExtraSectionCondition9="extra1,community_id=(.+)" +ExtraSectionFirstColumnTitle9="Id de la asignatura" +ExtraSectionFirstColumnValues9="extra1,id=([\w]+)" +ExtraSectionFirstColumnFormat9="%s" +ExtraSectionStatTypes9=PHVL +ExtraSectionAddAverageRow9=0 +ExtraSectionAddSumRow9=1 +MaxNbOfExtra9=20 +MinHitExtra9=1 + +#----------------------------------------------------------------------------- +# INCLUDES +#----------------------------------------------------------------------------- + +# You can include other config files using the directive with the name of the +# config file. +# This is particularly usefull for users who have a lot of virtual servers, so +# a lot of config files and want to maintain common values in only one file. +# Note that when a variable is defined both in a config file and in an +# included file, AWStats will use the last value read for parameters that +# contains one value and AWStats will concat all values from both files for +# parameters that are lists of value. +# + +#Include "" Index: openacs-4/packages/user-tracking/config/awstatsDirecto.user.conf =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/config/Attic/awstatsDirecto.user.conf,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/config/awstatsDirecto.user.conf 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,1527 @@ +# AWSTATS CONFIGURE FILE 6.2 +#----------------------------------------------------------------------------- +# Copy this file into awstats.www.mydomain.conf and edit this new config file +# to setup AWStats (See documentation in docs/ directory). +# The config file must be in /etc/awstats, /usr/local/etc/awstats or /etc (for +# Unix/Linux) or same directory than awstats.pl (Windows, Mac, Unix/Linux...) +# To include an environment variable in any parameter (AWStats will replace +# it with its value when reading it), follow the example: +# Parameter="__ENVNAME__" +# Note that environment variable AWSTATS_CURRENT_CONFIG is always defined with +# the config value in an AWStats running session and can be used like others. +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:37 $ + + + +#----------------------------------------------------------------------------- +# MAIN SETUP SECTION (Required to make AWStats work) +#----------------------------------------------------------------------------- + +# "LogFile" contains the web, ftp or mail server log file to analyze. +# Possible values: A full path, or a relative path from awstats.pl directory. +# Example: "/var/log/apache/access.log" +# Example: "../logs/mycombinedlog.log" +# You can also use tags in this filename if you need a dynamic file name +# depending on date or time (Replacement is made by AWStats at the beginning +# of its execution). This is available tags : +# %YYYY-n is replaced with 4 digits year we were n hours ago +# %YY-n is replaced with 2 digits year we were n hours ago +# %MM-n is replaced with 2 digits month we were n hours ago +# %MO-n is replaced with 3 letters month we were n hours ago +# %DD-n is replaced with day we were n hours ago +# %HH-n is replaced with hour we were n hours ago +# %NS-n is replaced with number of seconds at 00:00 since 1970 +# %WM-n is replaced with the week number in month (1-5) +# %Wm-n is replaced with the week number in month (0-4) +# %WY-n is replaced with the week number in year (01-52) +# %Wy-n is replaced with the week number in year (00-51) +# %DW-n is replaced with the day number in week (1-7, 1=sunday) +# use n=24 if you need (1-7, 1=monday) +# %Dw-n is replaced with the day number in week (0-6, 0=sunday) +# use n=24 if you need (0-6, 0=monday) +# Use 0 for n if you need current year, month, day, hour... +# Example: "/var/log/access_log.%YYYY-0%MM-0%DD-0.log" +# Example: "C:/WINNT/system32/LogFiles/W3SVC1/ex%YY-24%MM-24%DD-24.log" +# You can also use a pipe if log file come from a pipe : +# Example: "gzip -d outputpath/output.html"), enter +# path of icon directory relative to the output directory 'outputpath'. +# Example: "/awstatsicons" +# Example: "../icon" +# Default: "/icon" (means you must copy icon directories in "/mywwwroot/icon") +# +DirIcons="/user-tracking/awstats/icon" + + +# When this parameter is set to 1, AWStats add a button on report page to +# allow to "update" statistics from a web browser. Warning, when "update" is +# made from a browser, AWStats is ran as a CGI by the web server user defined +# in your web server (user "nobody" by default with Apache, "IUSR_XXX" with +# IIS), so the "DirData" directory and all already existing history files +# awstatsMMYYYY[.xxx].txt must be writable by this user. Change permissions if +# necessary to "Read/Write" (and "Modify" for Windows NTFS file systems). +# Warning: Update process can be long so you might experience "time out" +# browser errors if you don't launch AWStats enough frequently. +# When set to 0, update is only made when AWStats is ran from the command +# line interface (or a task scheduler). +# Possible values: 0 or 1 +# Default: 0 +# +AllowToUpdateStatsFromBrowser=1 + + +# AWStats save and sort its database on a month basis, this allows to build +# build a report quickly. However, if you choose the -month=all from command +# line or value '-Year-' from CGI combo form to have a report for all year, +# AWStats needs to reload all data for full year, and resort them completely, +# requiring a large amount of time, memory and CPU. This might be a problem +# for web hosting providers that offer AWStats for large sites, on shared +# servers, to non CPU cautious customers. +# For this reason, the 'full year' is only enabled on Command Line by default. +# You can change this by setting this parameter to 0, 1, 2 or 3. +# Possible values: +# 0 - Never allowed +# 1 - Allowed on CLI only, -Year- value in combo is not visible +# 2 - Allowed on CLI only, -Year- value in combo is visible but not allowed +# 3 - Possible on CLI and CGI +# Default: 2 +# +AllowFullYearView=3 + + + +#----------------------------------------------------------------------------- +# OPTIONAL SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# When the update process run, AWStats can set a lock file in TEMP or TMP +# directory. This lock is to avoid to have 2 update processes running at the +# same time to prevent unknown conflicts problems and avoid DoS attacks when +# AllowToUpdateStatsFromBrowser is set to 1. +# Because, when you use lock file, you can experience sometimes problems in +# lock file not correctly removed (killed process for example requires that +# you remove the file manualy), this option is not enabled by default (Do +# not enable this option with no console server access). +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +EnableLockForUpdate=1 + + +# AWStats can do reverse DNS lookups through a static DNS cache file that was +# previously created manually. If no path is given in static DNS cache file +# name, AWStats will search DirData directory. This file is never changed. +# This option is not used if DNSLookup=0. +# Note: DNS cache file format is 'minsince1970 ipaddress resolved_hostname' +# or just 'ipaddress resolved_hostname' +# Change : Effective for new updates only +# Example: "/mydnscachedir/dnscache" +# Default: "dnscache.txt" +# +DNSStaticCacheFile="dnscache.txt" + + +# AWStats can do reverse DNS lookups through a DNS cache file that was created +# by a previous run of AWStats. This file is erased and recreated after each +# statistics update process. You don't need to create and/or edit it. +# AWStats will read and save this file in DirData directory. +# This option is used only if DNSLookup=1. +# Note: If a DNSStaticCacheFile is available, AWStats will check for DNS +# lookup in DNSLastUpdateCacheFile after checking into DNSStaticCacheFile. +# Change : Effective for new updates only +# Example: "/mydnscachedir/dnscachelastupdate" +# Default: "dnscachelastupdate.txt" +# +DNSLastUpdateCacheFile="dnscachelastupdate.txt" + + +# You can specify specific IP addresses that should NOT be looked up in DNS. +# This option is used only if DNSLookup=1. +# Note: Use space between each value. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "123.123.123.123 REGEX[^192\.168\.]" +# Default: "" +# +SkipDNSLookupFor="" + + +# The following two parameters allow you to protect a config file from being +# read by AWStats when called from a browser if web user has not been +# authenticated. Your AWStats program must be in a web protected "realm" (With +# Apache, you can use .htaccess files to do so. With other web servers, see +# your server setup manual). +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +AllowAccessFromWebToAuthenticatedUsersOnly=0 + + +# This parameter give the list of all authorized authenticated users to view +# statistics for this domain/config file. This parameter is used only if +# AllowAccessFromWebToAuthenticatedUsersOnly is set to 1. +# Change : Effective immediatly +# Example: "user1 user2" +# Example: "__REMOTE_USER__" +# Default: "" +# +AllowAccessFromWebToFollowingAuthenticatedUsers="" + + +# When this parameter is define to something, the IP address of the user that +# read its statistics from a browser (when AWStats is used as a CGI) is +# checked and must match one of the IP address values or ranges. +# Change : Effective immediatly +# Example: "127.0.0.1 123.123.123.1-123.123.123.255" +# Default: "" +# +AllowAccessFromWebToFollowingIPAddresses="" + + +# If the "DirData" directory (see above) does not exists, AWStats return an +# error. However, you can ask AWStats to create it. +# This option can be used by some Web Hosting Providers that has defined a +# dynamic value for DirData (for example DirData="/home/__REMOTE_USER__") and +# don't want to have to create a new directory each time they add a new user. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 0 +# +CreateDirDataIfNotExists=1 + + +# You can choose in which format the Awstats history database is saved. +# Note: Using "xml" format make AWStats building database files three times +# larger than using "text" format. +# Change : Database format is switched after next update +# Possible values: text or xml +# Default: text +# +BuildHistoryFormat=text + + +# If you prefer having the report output pages be built as XML compliant pages +# instead of simple HTML pages, you can set this to 'xhtml' (May not works +# properly with old browsers). +# Change : Effective immediatly +# Possible values: html or xhtml +# Default: html +# +BuildReportFormat=html + + +# In most case, AWStats is used as a cgi program. So AWStats process is ran +# by default web server user (nobody for Unix, IUSR_xxx for IIS/Windows,...). +# To make use easier and avoid permission's problems between update process +# (run by an admin user) and CGI process (ran by a low level user), AWStats +# save its database files with read and write for everyone. +# If you have experience on managing security policies (Web Hosting Provider), +# you should set this parameter to 0. AWStats will keep default process user +# permissions on its files. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 1 +# +SaveDatabaseFilesWithPermissionsForEveryone=1 + + +# AWStats can purge log file, after analyzing it. Note that AWStats is able +# to detect new lines in a log file, to process only them, so you can launch +# AWStats as often as you want, even with this parameter to 0. +# With 0, no purge is made, so you must use a scheduled task or a web server +# that make this purge frequently. +# With 1, the purge of the log file is made each time AWStats update is ran. +# This parameter doesn't work with IIS (This web server doesn't let its log +# file to be purged). +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +PurgeLogFile=0 + + +# When PurgeLogFile is setup to 1, AWStats will clean your log file after +# processing it. You can however keep an archive file (saved in "DirData") of +# all processed log records by setting this to 1 (For example if you want to +# use another log analyzer). +# This parameter is not used if PurgeLogFile=0 +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +ArchiveLogRecords=0 + + +# Each time you run the update process, AWStats overwrite the 'historic file' +# for the month (awstatsMMYYYY[.*].txt) with the updated one. +# When write errors occurs (IO, disk full,...), this historic file can be +# corrupted and must be deleted. Because this file contains information of all +# past processed log files, you will loose old stats if removed. So you can +# ask AWStats to save last non corrupted file in a .bak file. This file is +# stored in "DirData" directory with other 'historic files'. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +KeepBackupOfHistoricFiles=0 + + +# Default index page name for your web server. +# Change : Effective for new updates only +# Example: "index.php index.html default.html" +# Default: "index.html" +# +DefaultFile="index.html" + + +# Do not include access from clients that match following criteria. +# If your log file contains IP adresses in host field, you must enter here +# matching IP adresses criteria. +# If DNS lookup is already done in your log file, you must enter here hostname +# criteria, else enter ip address criteria. +# The opposite parameter of "SkipHosts" is "OnlyHosts". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" +# Example: "localhost REGEX[^.*\.localdomain$]" +# Default: "" +# +SkipHosts="" + + +# Do not include access from clients with a user agent that match following +# criteria. If you want to exclude a robot, you should update the robots.pm +# file instead of this parameter. +# The opposite parameter of "SkipUserAgents" is "OnlyUserAgents". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "konqueror REGEX[ua_test_v\d\.\d]" +# Default: "" +# +SkipUserAgents="" + + +# Use SkipFiles to ignore access to URLs that match one of following entries. +# You can enter a list of not important URLs (like framed menus, hidden pages, +# etc...) to exclude them from statistics. You must enter here exact relative +# URL as found in log file, or a matching REGEX value. +# For example, to ignore /badpage.html, just add "/badpage.html". To ignore +# all pages in a particular directory, add "REGEX[^\/directorytoexclude]". +# The opposite parameter of "SkipFiles" is "OnlyFiles". +# Note: Use space between each value. This parameter is or not case sensitive +# depending on URLNotCaseSensitive parameter. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "/badpage.html REGEX[^\/excludedirectory]" +# Default: "" +# +SkipFiles="" + + +# Include in stats, only accesses from hosts that match one of following +# entries. For example, if you want AWStats to filter access to keep only +# stats for visits from particular hosts, you can add those hosts names in +# this parameter. +# If DNS lookup is already done in your log file, you must enter here hostname +# criteria, else enter ip address criteria. +# The opposite parameter of "OnlyHosts" is "SkipHosts". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "127.0.0.1 REGEX[^192\.168\.] REGEX[^10\.]" +# Default: "" +# +OnlyHosts="" + + +# Include in stats, only accesses from user agent that match one of following +# entries. For example, if you want AWStats to filter access to keep only +# stats for visits from particular browsers, you can add their user agents +# string in this parameter. +# The opposite parameter of "OnlyUserAgents" is "SkipUserAgents". +# Note: Use space between each value. This parameter is not case sensitive. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "msie" +# Default: "" +# +OnlyUserAgents="" + + +# Include in stats, only accesses to URLs that match one of following entries. +# For example, if you want AWStats to filter access to keep only stats that +# match a particular string, like a particular directory, you can add this +# directory name in this parameter. +# The opposite parameter of "OnlyFiles" is "SkipFiles". +# Note: Use space between each value. This parameter is or not case sensitive +# depending on URLNotCaseSensitive parameter. +# Note: You can use regular expression values writing value with REGEX[value]. +# Change : Effective for new updates only +# Example: "REGEX[marketing_directory] REGEX[office\/.*\.(csv|sxw)$]" +# Default: "" +# +#OnlyFiles="" + + +# Add here a list of kind of url (file extension) that must be counted as +# "Hit only" and not as a "Hit" and "Page/Download". You can set here all +# images extensions as they are hit downloaded that must be counted but they +# are not viewed pages. URLs with such extensions are not included in the TOP +# Pages/URL report. +# Note: If you want to exclude particular URLs from stats (No Pages and no +# Hits reported), you must use SkipFiles parameter. +# Change : Effective for new updates only +# Example: "css js class gif jpg jpeg png bmp ico zip arj gz z wav mp3 wma mpg" +# Example: "" +# Default: "css js class gif jpg jpeg png bmp ico" +# +NotPageList="css js class gif jpg jpeg png bmp ico" + + +# By default, AWStats considers that records found in web log file are +# successful hits if HTTP code returned by server is a valid HTTP code (200 +# and 304). Any other code are reported in HTTP status chart. +# Note that HTTP 'control codes', like redirection (302, 305) are not added by +# default in this list as they are not pages seen by a visitor but are +# protocol exchange codes to tell the browser to ask another page. Because +# this other page will be counted and seen with a 200 or 304 code, if you +# add such codes, you will have 2 pages viewed reported for only one in facts. +# Change : Effective for new updates only +# Example: "200 304 302 305" +# Default: "200 304" +# +ValidHTTPCodes="200 304" + + +# By default, AWStats considers that records found in mail log file are +# successful mail transfers if field that represent return code in analyzed +# log file match values defined by this parameter. +# Change : Effective for new updates only +# Example: "1 250 200" +# Default: "1 250" +# +ValidSMTPCodes="1 250" + + +# Some web servers on some Operating systems (IIS-Windows) considers that a +# login with same value but different case are the same login. To tell AWStats +# to also considers them as one, set this parameter to 1. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +AuthenticatedUsersNotCaseSensitive=0 + + +# Some web servers on some Operating systems (IIS-Windows) considers that two +# URLs with same value but different case are the same URL. To tell AWStats to +# also considers them as one, set this parameter to 1. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +URLNotCaseSensitive=0 + + +# Keep or remove the anchor string you can find in some URLs. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +URLWithAnchor=0 + + +# In URL links, "?" char is used to add parameter's list in URLs. Syntax is: +# /mypage.html?param1=value1¶m2=value2 +# However, some servers/sites use also others chars to isolate dynamic part of +# their URLs. You can complete this list with all such characters. +# Change : Effective for new updates only +# Example: "?;," +# Default: "?;" +# +URLQuerySeparators="?;" + + +# Keep or remove the query string to the URL in the statistics for individual +# pages. This is primarily used to differentiate between the URLs of dynamic +# pages. If set to 1, mypage.html?id=x and mypage.html?id=y are counted as two +# different pages. +# Warning, when set to 1, memory required to run AWStats is dramatically +# increased if you have a lot of changing URLs (for example URLs with a random +# id inside). Such web sites should not set this option to 1 or use seriously +# the next parameter URLWithQueryWithOnlyFollowingParameters (or eventually +# URLWithQueryWithoutFollowingParameters). +# Change : Effective for new updates only +# Possible values: +# 0 - URLs are cleaned from the query string (ie: "/mypage.html") +# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") +# Default: 0 +# +URLWithQuery=0 + + +# When URLWithQuery is on, you will get the full URL with all parameters in +# URL reports. But among thoose parameters, sometimes you don't need a +# particular parameter because it does not identify the page or because it's +# a random ID changing for each access even if URL points to same page. In +# such cases, it is higly recommanded to ask AWStats to keep only parameters +# you need (if you know them) before counting, manipulating and storing URL. +# Enter here list of wanted parameters. For example, with "param", one hit on +# /mypage.cgi?param=abc&id=Yo4UomP9d and /mypage.cgi?param=abc&id=Mu8fdxl3r +# will be reported as 2 hits on /mypage.cgi?param=abc +# This parameter is not used when URLWithQuery is 0 and can't be used with +# URLWithQueryWithoutFollowingParameters. +# Change : Effective for new updates only +# Example: "param" +# Default: "" +# +URLWithQueryWithOnlyFollowingParameters="" + + +# When URLWithQuery is on, you will get the full URL with all parameters in +# URL reports. But among thoose parameters, sometimes you don't need a +# particular parameter because it does not identify the page or because it's +# a random ID changing for each access even if URL points to same page. In +# such cases, it is higly recommanded to ask AWStats to remove such parameters +# from the URL before counting, manipulating and storing URL. Enter here list +# of all non wanted parameters. For example if you enter "id", one hit on +# /mypage.cgi?param=abc&id=Yo4UomP9d and /mypage.cgi?param=abc&id=Mu8fdxl3r +# will be reported as 2 hits on /mypage.cgi?param=abc +# This parameter is not used when URLWithQuery is 0 and can't be used with +# URLWithQueryWithOnlyFollowingParameters. +# Change : Effective for new updates only +# Example: "PHPSESSID jsessionid" +# Default: "" +# +URLWithQueryWithoutFollowingParameters="" + + +# Keep or remove the query string to the referrer URL in the statistics for +# external referrer pages. This is used to differentiate between the URLs of +# dynamic referrer pages. If set to 1, mypage.html?id=x and mypage.html?id=y +# are counted as two different referrer pages. +# Change : Effective for new updates only +# Possible values: +# 0 - Referrer URLs are cleaned from the query string (ie: "/mypage.html") +# 1 - Full URL with query string is used (ie: "/mypage.html?p=x&q=y") +# Default: 0 +# +URLReferrerWithQuery=0 + + +# AWStats can detect setup problems or show you important informations to have +# a better use. Keep this to 1, except if AWStats says you can change it. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 1 +# +WarningMessages=1 + + +# When an error occurs, AWStats output a message related to errors. If you +# want (in most cases for security reasons) to have no error messages, you +# can set this parameter to your personalized generic message. +# Change : Effective immediatly +# Example: "An error occured. Contact your Administrator" +# Default: "" +# +ErrorMessages="" + + +# AWStat can be run with debug=x parameter to ouput various informations +# to help in debugging or solving troubles. If you want (in most cases for +# security reasons) to disable debugging, set this parameter to 0. +# Change : Effective immediatly +# Possible values: 0 or 1 +# Default: 1 +# +DebugMessages=1 + + +# To help you to detect if your log format is good, AWStats report an error +# if all the first NbOfLinesForCorruptedLog lines have a format that does not +# match the LogFormat parameter. +# However, some worm virus attack on your web server can result in a very high +# number of corrupted lines in your log. So if you experience awstats stop +# because of bad virus records at the beginning of your log file, you can +# increase this parameter (very rare). +# Change : Effective for new updates only +# Default: 50 +# +NbOfLinesForCorruptedLog=50 + + +# For some particular integration needs, you may want to have CGI links to +# point to another script than awstats.pl. +# Use the name of this script in WrapperScript parameter. +# Change : Effective immediatly +# Example: "awstatslauncher.pl" +# Default: "" +# +WrapperScript="" + + +# DecodeUA must be set to 1 if you use Roxen web server. This server converts +# all spaces in user agent field into %20. This make the AWStats robots, os +# and browsers detection fail in some cases. Just change it to 1 if and only +# if your web server is Roxen. +# Change : Effective for new updates only +# Possible values: 0 or 1 +# Default: 0 +# +DecodeUA=0 + + +# MiscTrackerUrl can be used to make AWStats able to detect some miscellanous +# things, that can not be tracked on other way, like: +# - Javascript disabled +# - Java enabled +# - Screen size +# - Color depth +# - Macromedia Director plugin +# - Macromedia Shockwave plugin +# - Realplayer G2 plugin +# - QuickTime plugin +# - Mediaplayer plugin +# - Acrobat PDF plugin +# To enable all this features, you must copy the awstats_misc_tracker.js file +# into a /js/ directory stored in your web document root and add the following +# HTML code at the end of your index page (but before ) : +# +# +# +# +# If code is not added in index page, all those detection capabilities will be +# disabled. You must also check that ShowScreenSizeStats and ShowMiscStats +# parameters are set to 1 to make results appear in AWStats report page. +# If you want to use another directory than /js/, you must also change the +# awstatsmisctrackerurl variable into the awstats_misc_tracker.js file. +# Change : Effective for new updates only. +# Possible value: URL of javascript tracker file added in your HTML code. +# Default: "/js/awstats_misc_tracker.js" +# +MiscTrackerUrl="/js/awstats_misc_tracker.js" + + + +#----------------------------------------------------------------------------- +# OPTIONAL ACCURACY SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# Following values allows you to define accuracy of AWStats entities (robots, +# browsers, os, referers, file types) detection. +# It might be a good idea for large web sites or ISP that provides AWStats to +# high number of customers, to set this parameter to 1 (or 0), instead of 2. +# Possible values: +# 0 = No detection, +# 1 = Medium/Standard detection +# 2 = Full detection +# Change : Effective for new updates only +# Default: 2 (0 for LevelForWormsDetection) +# +LevelForBrowsersDetection=2 # 0 disables Browsers detection. + # 2 reduces AWStats speed by 2% +LevelForOSDetection=2 # 0 disables OS detection. + # 2 reduces AWStats speed by 3% +LevelForRefererAnalyze=0 # 0 disables Origin detection. + # 2 reduces AWStats speed by 14% +LevelForRobotsDetection=0 # 0 disables Robots detection. + # 2 reduces AWStats speed by 2.5% +LevelForSearchEnginesDetection=0 # 0 disables Search engines detection. + # 2 reduces AWStats speed by 9% +LevelForKeywordsDetection=0 # 0 disables Keyphrases/Keywords detection. + # 2 reduces AWStats speed by 1% +LevelForFileTypesDetection=2 # 0 disables File types detection. + # 2 reduces AWStats speed by 1% +LevelForWormsDetection=0 # 0 disables Worms detection. + # 2 reduces AWStats speed by 15% + + +#----------------------------------------------------------------------------- +# OPTIONAL APPEARANCE SETUP SECTION (Not required but increase AWStats features) +#----------------------------------------------------------------------------- + +# When you use AWStats as a CGI, you can have the reports shown in HTML frames. +# Frames are only available for report viewed dynamically. When you build +# pages from command line, this option is not used and no frames are built. +# Possible values: 0 or 1 +# Default: 1 +# + +UseFramesWhenCGI=1 + + +# This parameter ask your browser to open detailed reports into a different +# window than the main page. +# Possible values: +# 0 - Open all in same browser window +# 1 - Open detailed reports in another window except if using frames +# 2 - Open always in a different window even if reports are framed +# Default: 1 +# +DetailedReportsOnNewWindows=1 + + +# You can add, in the HTML report page, a cache lifetime (in seconds) that +# will be returned to browser in HTTP header answer by server. +# This parameter is not used when report are built with -staticlinks option. +# Example: 3600 +# Default: 0 +# +Expires=0 + + +# To avoid too large web pages, you can ask AWStats to limit number of rows of +# all reported charts to this number when no other limit apply. +# Default: 1000 +# +MaxRowsInHTMLOutput=1000 + + +# Set your primary language (ISO-639-1 language codes). +# Possible value: +# Albanian=al, Bosnian=ba, Bulgarian=bg, Catalan=ca, +# Chinese (Taiwan)=tw, Chinese (Simpliefied)=cn, Czech=cz, Danish=dk, +# Dutch=nl, English=en, Estonian=et, Euskara=eu, Finnish=fi, +# French=fr, Galician=gl, German=de, Greek=gr, Hebrew=he, Hungarian=hu, +# Icelandic=is, Indonesian=id, Italian=it, Japanese=jp, Korean=kr, +# Latvian=lv, Norwegian (Nynorsk)=nn, Norwegian (Bokmal)=nb, Polish=pl, +# Portuguese=pt, Portuguese (Brazilian)=br, Romanian=ro, Russian=ru, +# Serbian=sr, Slovak=sk, Slovenian=si, Spanish=es, Swedish=se, Turkish=tr, +# Ukrainian=ua, Welsh=cy. +# First available language accepted by browser=auto +# Default: "auto" +# +Lang="es" + + +# Set the location of language files. +# Example: "/usr/share/awstats/lang" +# Default: "./lang" (means lang directory is in same location than awstats.pl) +# +DirLang="./lang" + + +# Show menu header with reports' links +# Possible values: 0 or 1 +# Default: 1 +# +ShowMenu=1 + + +# You choose here which reports you want to see in the main page and what you +# want to see in those reports. +# Possible values: +# 0 - Report is not shown at all +# 1 - Report is shown in main page with an entry in menu and default columns +# XYZ - Report shows column informations defined by code X,Y,Z... +# X,Y,Z... are code letters among the following: +# U = Unique visitors +# V = Visits +# P = Number of pages +# H = Number of hits (or mails) +# B = Bandwith (or total mail size for mail logs) +# L = Last access date +# E = Entry pages +# X = Exit pages +# C = Web compression (mod_gzip,mod_deflate) +# M = Average mail size (mail logs) +# + +# Show monthly chart +# Context: Web, Streaming, Mail, Ftp +# Default: UVPHB, Possible column codes: UVPHB +ShowMonthStats=UVPH + +# Show days of month chart +# Context: Web, Streaming, Mail, Ftp +# Default: VPHB, Possible column codes: VPHB +ShowDaysOfMonthStats=VPH + +# Show days of week chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowDaysOfWeekStats=PH + +# Show hourly chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowHoursStats=PH + +# Show domains/country chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHB, Possible column codes: PHB +ShowDomainsStats=0 + +# Show hosts chart +# Context: Web, Streaming, Mail, Ftp +# Default: PHBL, Possible column codes: PHBL +ShowHostsStats=PHL + +# Show authenticated users chart +# Context: Web, Streaming, Ftp +# Default: 0, Possible column codes: PHBL +ShowAuthenticatedUsers=0 + +# Show robots chart +# Context: Web, Streaming +# Default: HBL, Possible column codes: HBL +ShowRobotsStats=0 + +# Show worms chart +# Context: Web, Streaming +# Default: 0 (If set to 1, see also LevelForWormsDetection), Possible column codes: HBL +ShowWormsStats=0 + +# Show email senders chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: HBML +ShowEMailSenders=0 + +# Show email receivers chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: HBML +ShowEMailReceivers=0 + +# Show session chart +# Context: Web, Streaming, Ftp +# Default: 1, Possible column codes: None +ShowSessionsStats=1 + +# Show pages-url chart. +# Context: Web, Streaming, Ftp +# Default: PBEX, Possible column codes: PBEX +ShowPagesStats=PEX + +# Show file types chart. +# Context: Web, Streaming, Ftp +# Default: HB, Possible column codes: HBC +ShowFileTypesStats=H + +# Show file size chart (Not yet available) +# Context: Web, Streaming, Mail, Ftp +# Default: 1, Possible column codes: None +ShowFileSizesStats=0 + +# Show operating systems chart +# Context: Web, Streaming, Ftp +# Default: 1, Possible column codes: None +ShowOSStats=1 + +# Show browsers chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowBrowsersStats=1 + +# Show screen size chart +# Context: Web, Streaming +# Default: 0 (If set to 1, see also MiscTrackerUrl), Possible column codes: None +ShowScreenSizeStats=0 + +# Show origin chart +# Context: Web, Streaming +# Default: PH, Possible column codes: PH +ShowOriginStats=0 + +# Show keyphrases chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowKeyphrasesStats=0 + +# Show keywords chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowKeywordsStats=0 + +# Show misc chart +# Context: Web, Streaming +# Default: a (See also MiscTrackerUrl parameter), Possible column codes: anjdfrqwp +ShowMiscStats=0 + +# Show http errors chart +# Context: Web, Streaming +# Default: 1, Possible column codes: None +ShowHTTPErrorsStats=1 + +# Show smtp errors chart (For use when analyzing mail log files) +# Context: Mail +# Default: 0, Possible column codes: None +ShowSMTPErrorsStats=0 + +# Show the cluster report (Your LogFormat must contains the %cluster tag) +# Context: Web, Streaming, Ftp +# Default: 0, Possible column codes: PHB +ShowClusterStats=0 + + +# Some graphical reports are followed by the data array of values. +# If you don't want this array (to reduce report size for example), you can +# set thoose options to 0. +# Possible values: 0 or 1 +# Default: 1 +# +# Data array values for the ShowMonthStats report +AddDataArrayMonthStats=1 +# Data array values for the ShowDaysOfMonthStats report +AddDataArrayShowDaysOfMonthStats=1 +# Data array values for the ShowDaysOfWeekStats report +AddDataArrayShowDaysOfWeekStats=1 +# Data array values for the ShowHoursStats report +AddDataArrayShowHoursStats=1 + + +# In the Origin chart, you have stats on where your hits came from. You can +# includes hits on pages that comes from pages of same sites in this chart. +# Possible values: 0 or 1 +# Default: 0 +# +IncludeInternalLinksInOriginSection=1 + + +# Following parameter can be used to choose maximum number of lines shown for +# the particular following report. +# +# Stats by countries/domains +MaxNbOfDomain = 10 +MinHitDomain = 1 +# Stats by hosts +MaxNbOfHostsShown = 10 +MinHitHost = 1 +# Stats by authenticated users +MaxNbOfLoginShown = 10 +MinHitLogin = 1 +# Stats by robots +MaxNbOfRobotShown = 10 +MinHitRobot = 1 +# Stats by pages +MaxNbOfPageShown = 10 +MinHitFile = 1 +# Stats by OS +MaxNbOfOsShown = 10 +MinHitOs = 1 +# Stats by browsers +MaxNbOfBrowsersShown = 10 +MinHitBrowser = 1 +# Stats by screen size +MaxNbOfScreenSizesShown = 5 +MinHitScreenSize = 1 +# Stats by window size (following 2 parameters are not yet used) +MaxNbOfWindowSizesShown = 5 +MinHitWindowSize = 1 +# Stats by referers +MaxNbOfRefererShown = 10 +MinHitRefer = 1 +# Stats for keyphrases +MaxNbOfKeyphrasesShown = 10 +MinHitKeyphrase = 1 +# Stats for keywords +MaxNbOfKeywordsShown = 10 +MinHitKeyword = 1 +# Stats for sender or receiver emails +MaxNbOfEMailsShown = 20 +MinHitEMail = 1 + + +# Choose if you want the week report to start on sunday or monday +# Possible values: +# 0 - Week start on sunday +# 1 - Week start on monday +# Default: 1 +# +FirstDayOfWeek=1 + + +# List of visible flags that links to other language translations. +# See Lang parameter for list of allowed flag/language codes. +# If you don't want any flag link, set ShowFlagLinks to "". +# This parameter is used only if ShowMenu parameter is set to 1. +# Possible values: "" or "language_codes_separated_by_space" +# Example: "en es fr nl de" +# Default: "" +# +ShowFlagLinks="en fr de" + + +# Each URL, shown in stats report views, are links you can click. +# Possible values: 0 or 1 +# Default: 1 +# +ShowLinksOnUrl=1 + + +# When AWStats build HTML links in its report pages, it starts thoose link +# with "http://". However some links might be HTTPS links, so you can enter +# here the root of all your HTTPS links. If all your site is a SSL web site, +# just enter "/". +# This parameter is not used if ShowLinksOnUrl is 0. +# Example: "/shopping" +# Example: "/" +# Default: "" +UseHTTPSLinkForUrl="" + + +# Maximum length of URL part shown on stats page (number of characters). +# This affects only URL visible text, link still work. +# Default: 64 +# +MaxLengthOfShownURL=64 + + +# You can enter HTML code that will be added at the top of AWStats reports. +# Default: "" +# +HTMLHeadSection="" + + +# You can enter HTML code that will be added at the end of AWStats reports. +# Great to add advert ban. +# Default: "" +# +HTMLEndSection="" + + +# You can set Logo and LogoLink to use your own logo. +# Logo must be the name of image file (must be in $DirIcons/other directory). +# LogoLink is the expected URL when clicking on Logo. +# Default: "awstats_logo6.png" +# +Logo="awstats_logo6.png" +LogoLink="http://awstats.sourceforge.net" + + +# Value of maximum bar width/height for horizontal/vertical HTML graphics bar. +# Default: 260/90 +# +BarWidth = 260 +BarHeight = 90 + + +# You can ask AWStats to use a particular CSS (Cascading Style Sheet) to +# change its look. To create a style sheet, you can use samples provided with +# AWStats in wwwroot/css directory. +# Example: "/awstatscss/awstats_bw.css" +# Example: "/css/awstats_bw.css" +# Default: "" +# +StyleSheet="" + + +# Those colors parameters can be used (if StyleSheet parameter is not used) +# to change AWStats look. +# Example: color_name="RRGGBB" # RRGGBB is Red Green Blue components in Hex +# +color_Background="FFFFFF" # Background color for main page (Default = "FFFFFF") +color_TableBGTitle="CCCCDD" # Background color for table title (Default = "CCCCDD") +color_TableTitle="000000" # Table title font color (Default = "000000") +color_TableBG="CCCCDD" # Background color for table (Default = "CCCCDD") +color_TableRowTitle="FFFFFF" # Table row title font color (Default = "FFFFFF") +color_TableBGRowTitle="ECECEC" # Background color for row title (Default = "ECECEC") +color_TableBorder="ECECEC" # Table border color (Default = "ECECEC") +color_text="000000" # Color of text (Default = "000000") +color_textpercent="606060" # Color of text for percent values (Default = "606060") +color_titletext="000000" # Color of text title within colored Title Rows (Default = "000000") +color_weekend="EAEAEA" # Color for week-end days (Default = "EAEAEA") +color_link="0011BB" # Color of HTML links (Default = "0011BB") +color_hover="605040" # Color of HTML on-mouseover links (Default = "605040") +color_u="FFAA66" # Background color for number of unique visitors (Default = "FFAA66") +color_v="F4F090" # Background color for number of visites (Default = "F4F090") +color_p="4477DD" # Background color for number of pages (Default = "4477DD") +color_h="66DDEE" # Background color for number of hits (Default = "66DDEE") +color_k="2EA495" # Background color for number of bytes (Default = "2EA495") +color_s="8888DD" # Background color for number of search (Default = "8888DD") +color_e="CEC2E8" # Background color for number of entry pages (Default = "CEC2E8") +color_x="C1B2E2" # Background color for number of exit pages (Default = "C1B2E2") + + + +#----------------------------------------------------------------------------- +# PLUGINS +#----------------------------------------------------------------------------- + +# Add here all plugins file you want to load. +# Plugin files must be .pm files stored in 'plugins' directory. +# Uncomment LoadPlugin lines to enable a plugin after checking that perl +# modules required by the plugin are installed. + +# Plugin: Tooltips +# Perl modules required: None +# Add some tooltips help on HTML report pages. +# Note that enabled this kind of help will increased HTML report pages size, +# so server load and bandwidth. +# +#LoadPlugin="tooltips" + +# Plugin: DecodeUTFKeys +# Perl modules required: Encode and URI::Escape +# Allow AWStats to show correctly (in language charset) keywords/keyphrases +# strings even if they were UTF8 coded by the referer search engine. +# +#LoadPlugin="decodeutfkeys" + +# Plugin: IPv6 +# Perl modules required: Net::IP and Net::DNS +# This plugin gives AWStats capability to make reverse DNS lookup on IPv6 +# addresses. +# Note: If you are interesting in having country report, you should use the +# geoipfree or geoip plugin instead of enabled reverse DNS lookup. +# +#LoadPlugin="ipv6" + +# Plugin: HashFiles +# Perl modules required: Storable +# AWStats DNS cache files are read/saved as native hash files. This increase +# DNS cache files loading speed, above all for very large web sites. +# +#LoadPlugin="hashfiles" + +# Plugin: GeoIP +# Perl modules required: Geo::IP or Geo::IP::PurePerl (from Maxmind) +# Country chart is built from an Internet IP-Country database. +# This plugin is useless for intranet only log files. +# Note: You must choose between using this plugin (need Perl Geo::IP module +# from Maxmind, database more up to date) or the GeoIPfree plugin (need +# Perl Geo::IPfree module, database less up to date). +# This plugin reduces AWStats speed of 8% ! +# +#LoadPlugin="geoip GEOIP_STANDARD" + +# Plugin: GeoIPfree +# Perl modules required: Geo::IPfree version 0.2+ (from Graciliano M.P.) +# Country chart is built from an Internet IP-Country database. +# This plugin is useless for intranet only log files. +# Note: You must choose between using this plugin (need Perl Geo::IPfree +# module, database less up to date) or the GeoIP plugin (need Perl Geo::IP +# module from Maxmind, database more up to date). +# Note: Activestate provide a corrupted version of Geo::IPfree 0.2 Perl +# module, so install it from elsewhere (from www.cpan.org for example). +# This plugin reduces AWStats speed of 10% ! +# +#LoadPlugin="geoipfree" + +# Plugin: GeoIP_Region_Maxmind +# Perl modules required: Geo::IP (from Maxmind) +# This plugin add a chart of hits by regions. Only regions for US and +# Canada can be detected. +# Note: This plugin need Maxmind GeoIP Perl module AND the region database. +# Note: I get some problem with Maxmind Geo::IP Perl module with ActiveState +# on Windows but it works great on Linux with default Perl. +# You need to purchase a license from Maxmind to get/use the Region database. +# This plugin reduces AWStats speed. +# +#LoadPlugin="geoip_region_maxmind GEOIP_STANDARD /pathto/GeoIPRegion.dat" + +# Plugin: UserInfo +# Perl modules required: None +# Add a text (Firtname, Lastname, Office Department, ...) in authenticated user +# reports for each login value. +# A text file called userinfo.myconfig.txt, with two fields (first is login, +# second is text to show, separated by a tab char) must be created in DirData +# directory. +# +LoadPlugin="userinfo" + +# Plugin: HostInfo +# Perl modules required: Net::XWhois +# Add a column into host chart with a link to open a popup window that shows +# info on host (like whois records). +# +#LoadPlugin="hostinfo" + +# Plugin: ClusterInfo +# Perl modules required: None +# Add a text (for example a full hostname) in cluster reports for each cluster +# number. +# A text file called clusterinfo.myconfig.txt, with two fields (first is +# cluster number, second is text to show) separated by a tab char. must be +# created into DirData directory. +# Note this plugin is useless if ShowClusterStats is set to 0 or if you don't +# use a personalized log format that contains %cluster tag. +# +#LoadPlugin="clusterinfo" + +# Plugin: UrlAliases +# Perl modules required: None +# Add a text (Page title, description...) in URL reports before URL value. +# A text file called urlalias.myconfig.txt, with two fields (first is URL, +# second is text to show, separated by a tab char) must be created into +# DirData directory. +# +#LoadPlugin="urlalias" + +# Plugin: TimeHiRes +# Perl modules required: Time::HiRes (if Perl < 5.8) +# Time reported by -showsteps option is in millisecond. For debug purpose. +# +#LoadPlugin="timehires" + +# Plugin: TimeZone +# Perl modules required: Time::Local +# Allow AWStats to correct a bad timezone for user of some IIS that use +# GMT date in its log instead of local server time. +# This module is useless for Apache and most IIS version. +# This plugin reduces AWStats speed of 40% !!!!!!! +# +#LoadPlugin="timezone +2" + +# Plugin: Rawlog +# Perl modules required: None +# This plugin adds a form in AWStats main page to allow users to see raw +# content of current log files. A filter is also available. +# +#LoadPlugin="rawlog" + +# Plugin: GraphApplet +# Perl modules required: None +# Supported charts are built by a 3D graphic applet. +# +#LoadPlugin="graphapplet /awstatsclasses" # EXPERIMENTAL FEATURE + + + +#----------------------------------------------------------------------------- +# EXTRA SECTIONS +#----------------------------------------------------------------------------- + +# You can define your own charts, you choose here what are rows and columns +# keys. This feature is particularly usefull for marketing purpose, tracking +# products orders for example. +# For this, edit all parameters of Extra section. Each set of parameter is a +# different chart. For several charts, duplicate section changing the number. +# Note: Each Extra section reduces AWStats speed by 8%. +# +# WARNING: A wrong setup of Extra section might result in too large arrays +# that will consume all your memory, making AWStats unusable after several +# updates, so be sure to setup it correctly. +# In most cases, you don't need this feature. +# +# ExtraSectionNameX is title of your personalized chart. +# ExtraSectionCodeFilterX is list of codes the record code field must match. +# Put an empty string for no test on code. +# ExtraSectionConditionX are conditions you can use to count or not the hit, +# Use one of the field condition (URL,QUERY_STRING,REFERER,UA,HOST,extraX) +# and a regex to match, after a coma. Use "||" for "OR". +# ExtraSectionFirstColumnTitleX is the first column title of the chart. +# ExtraSectionFirstColumnValuesX is a string to tell AWStats which field to +# extract value from (URL,QUERY_STRING,REFERER,UA,HOST,extraX) +# and how to extract the value (using regex syntax). Each different value +# found will appear in first column of report on a different row. Be sure +# that list of different possible values will not grow indefinitely. +# ExtraSectionFirstColumnFormatX is the string used to write value. +# ExtraSectionStatTypesX are things you want to count. You can use standard +# code letters (P for pages,H for hits,B for bandwidth,L for last access). +# ExtraSectionAddAverageRowX add a row at bottom of chart with average values. +# ExtraSectionAddSumRowX add a row at bottom of chart with sum values. +# MaxNbOfExtraX is maximum number of rows shown in chart. +# MinHitExtraX is minimum number of hits required to be shown in chart. +# + +# Example to report the 20 products the most ordered by "order.cgi" script +#ExtraSectionName1="Product orders" +#ExtraSectionCodeFilter1="200 304" +#ExtraSectionCondition1="URL,\/cgi\-bin\/order\.cgi||URL,\/cgi\-bin\/order2\.cgi" +#ExtraSectionFirstColumnTitle1="Product ID" +#ExtraSectionFirstColumnValues1="QUERY_STRING,productid=([^&]+)" +#ExtraSectionFirstColumnFormat1="%s" +#ExtraSectionStatTypes1=PL +#ExtraSectionAddAverageRow1=0 +#ExtraSectionAddSumRow1=1 +#MaxNbOfExtra1=20 +#MinHitExtra1=1 + +ExtraSectionName1="Objetos" +ExtraSectionCodeFilter1="200 304" +ExtraSectionCondition1="QUERY_STRING,(id=)" +ExtraSectionFirstColumnTitle1="Id del objeto" +ExtraSectionFirstColumnValues1="QUERY_STRING,(.+)" +ExtraSectionFirstColumnFormat1="%s" +ExtraSectionStatTypes1=HVL +ExtraSectionAddAverageRow1=0 +ExtraSectionAddSumRow1=1 +MaxNbOfExtra1=20 +MinHitExtra1=1 + +# Example to report the 20 products the most ordered by "order.cgi" script +# Report of requests of xml/rdf/rss feeds +ExtraSectionName2="Foros visitados" +ExtraSectionCodeFilter2="200 304" +ExtraSectionCondition2="URL,(forum-view)" +ExtraSectionFirstColumnTitle2="Id del foro" +ExtraSectionFirstColumnValues2="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat2="%s" +ExtraSectionStatTypes2=HVL +ExtraSectionAddAverageRow2=0 +ExtraSectionAddSumRow2=1 +MaxNbOfExtra2=20 +MinHitExtra2=1 + +#message-view?message%5fid=7110 +ExtraSectionName3="Mensajes leidos" +ExtraSectionCodeFilter3="200 304" +ExtraSectionCondition3="URL,(message-view)" +ExtraSectionFirstColumnTitle3="Id del mensaje" +ExtraSectionFirstColumnValues3="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat3="%s" +ExtraSectionStatTypes3=HVL +ExtraSectionAddAverageRow3=0 +ExtraSectionAddSumRow3=1 +MaxNbOfExtra3=20 +MinHitExtra3=1 + +#one-faq?faq_id=904 +ExtraSectionName4="FAQS visitados" +ExtraSectionCodeFilter4="200 304" +ExtraSectionCondition4="URL,(faq\/one-faq)" +ExtraSectionFirstColumnTitle4="Id del FAQ" +ExtraSectionFirstColumnValues4="QUERY_STRING,faq_id=([^&]+)" +ExtraSectionFirstColumnFormat4="%s" +ExtraSectionStatTypes4=HVL +ExtraSectionAddAverageRow4=0 +ExtraSectionAddSumRow4=1 +MaxNbOfExtra4=20 +MinHitExtra4=1 + +#file-storage/index?folder%5fid=716 +ExtraSectionName5="Folders visitados" +ExtraSectionCodeFilter5="200 304" +ExtraSectionCondition5="URL,(file-storage\/index)" +ExtraSectionFirstColumnTitle5="Id del folder" +ExtraSectionFirstColumnValues5="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat5="%s" +ExtraSectionStatTypes5=HVL +ExtraSectionAddAverageRow5=0 +ExtraSectionAddSumRow5=1 +MaxNbOfExtra5=20 +MinHitExtra5=1 + +#news/item?item_id=7893 +ExtraSectionName6="Noticias leidas" +ExtraSectionCodeFilter6="200 304" +ExtraSectionCondition6="URL,(news\/item)" +ExtraSectionFirstColumnTitle6="Id de la noticia" +ExtraSectionFirstColumnValues6="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnFormat6="%s" +ExtraSectionStatTypes6=HVL +ExtraSectionAddAverageRow6=0 +ExtraSectionAddSumRow6=1 +MaxNbOfExtra6=20 +MinHitExtra6=1 + +#forums/message-view?message%5fid=7110 +ExtraSectionName7="Mensajes leidos en los foros" +ExtraSectionCodeFilter7="200 304" +ExtraSectionCondition7="URL,(forums\/message-view)" +ExtraSectionFirstColumnTitle7="Id del mensaje" +#ExtraSectionFirstColumnValues7="QUERY_STRING,id=([^&]+) | URL,(.+)" +#ExtraSectionFirstColumnValues7="QUERY_STRING,id=([^&]+)" +ExtraSectionFirstColumnValues7="REFERER,(.+)" +ExtraSectionFirstColumnFormat7="%s" +ExtraSectionStatTypes7=HVL +ExtraSectionAddAverageRow7=0 +ExtraSectionAddSumRow7=1 +MaxNbOfExtra7=20 +MinHitExtra7=1 + +#dotlrn/clubs/pruebasdenotificaciones/one-community?page_num=0 +ExtraSectionName8="Comunidades visitadas" +ExtraSectionCodeFilter8="200 304" +ExtraSectionCondition8="URL,(dotlrn\/clubs\/)" +ExtraSectionFirstColumnTitle8="Nombre de la comunidad" +ExtraSectionFirstColumnValues8="URL,/dotlrn/clubs/([\w]+)\/" +ExtraSectionFirstColumnFormat8="%s" +ExtraSectionStatTypes8=PHVL +ExtraSectionAddAverageRow8=0 +ExtraSectionAddSumRow8=1 +MaxNbOfExtra8=20 +MinHitExtra8=1 + +#Por medio del community_id +ExtraSectionName9="Asignaturas visitadas" +ExtraSectionCodeFilter9="200 304" +ExtraSectionCondition9="extra1,community_id=(.+)" +ExtraSectionFirstColumnTitle9="Id de la asignatura" +ExtraSectionFirstColumnValues9="extra1,id=([\w]+)" +ExtraSectionFirstColumnFormat9="%s" +ExtraSectionStatTypes9=PHVL +ExtraSectionAddAverageRow9=0 +ExtraSectionAddSumRow9=1 +MaxNbOfExtra9=20 +MinHitExtra9=1 + +#----------------------------------------------------------------------------- +# INCLUDES +#----------------------------------------------------------------------------- + +# You can include other config files using the directive with the name of the +# config file. +# This is particularly usefull for users who have a lot of virtual servers, so +# a lot of config files and want to maintain common values in only one file. +# Note that when a variable is defined both in a config file and in an +# included file, AWStats will use the last value read for parameters that +# contains one value and AWStats will concat all values from both files for +# parameters that are lists of value. +# Index: openacs-4/packages/user-tracking/sql/postgresql/user-tracking-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/sql/postgresql/user-tracking-create.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/sql/postgresql/user-tracking-create.sql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,4 @@ +CREATE TABLE ut_sched ( + "process_id" INTEGER NOT NULL, + CONSTRAINT "ut_sched_pk" PRIMARY KEY("process_id") + ); Index: openacs-4/packages/user-tracking/sql/postgresql/user-tracking-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/sql/postgresql/user-tracking-drop.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/sql/postgresql/user-tracking-drop.sql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1 @@ +drop table ut_sched; \ No newline at end of file Index: openacs-4/packages/user-tracking/tcl/apm-callback-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/tcl/apm-callback-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/tcl/apm-callback-procs.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,93 @@ +ad_library { + + user-tracking Package APM callbacks library + + Procedures that deal with installing, instantiating, mounting. + + @creation-date 2004-10-29 + @author David Ortega +} + +namespace eval user-tracking::apm_callbacks {} + +ad_proc -private user-tracking::apm_callbacks::package_install {} { + + Update config files + + @author David Ortega (doa@tid.es) + +} { + + + #Leer un par�metro de config.tcl + set logdir [ns_config "ns/parameters" serverlog] + #Me quedo con lo que me interesa + set patron "(.*)(\/(.)*\.log$)" + regexp $patron $logdir all dir part2 ] + append dir "/" + + set server [ns_info server] + set system_name [ad_system_name] + set http_port [ns_conn location] + + set ip [util_current_location] + + #Busco ficheros de configuraci�n + set ut_dir [acs_package_root_dir "user-tracking"] + append config_dir $ut_dir "/config" + set execls [list "ls" $config_dir] + set files [exec [lindex $execls 0] [lindex $execls 1]] + + #Escribo los par�metros al final de cada fichero + + for {set x 0} {$x<[llength $files]} {incr x} { + set file_name "${config_dir}/[lindex $files $x]" + + if { [file exists $file_name] == 1} { + + set config_file [open $file_name a] + set logdir [ns_config "ns/server/[ns_info server]/module/nslog" file] + set patron "(.*)(\.log$)" + regexp $patron $logdir all part1 part2 ] + + puts $config_file "LogFile=\"${ut_dir}/tools/logresolvemerge.pl ${part1}* | \"" + puts $config_file "SiteDomain=\"${server}\"" + puts $config_file "HostAliases=\"${server} www.${server} ${system_name} www.${system_name} ${ip} 127.0.0.1 localhost\"" + puts $config_file "DirData=\"${dir}awstat\"" + #puts $config_file "Lang=\"es\"" + #puts $config_file "ShowFlagLinks=\"en fr de\"" + + close $config_file + } + } + + + # Escribo fichero de users.txt + exec "/bin/mkdir" ${dir}awstat + set touch [exec "/bin/touch" ${dir}awstat/userinfo.txt] + set filename "${dir}awstat/userinfo.txt" + ns_log notice "Escribiendo en $filename" + set config_file [open $filename w] + db_foreach get_users "select person_id, first_names, last_name from persons" { + puts $config_file "$person_id \t $first_names $last_name" + } + close $config_file + + set touch [exec "/bin/touch" ${config_dir}/AllowedUrls.conf] + set filename "${config_dir}/AllowedUrls.conf" + ns_log notice "Escribiendo en $filename" + set config_file [open $filename w] + puts $config_file $ip + + close $config_file + + + + + + #Leer un par�metro del paquete + #set paquete [parameter::get -parameter "logsDir"] + #Fijar un par�metro del paquete + #parameter::set_value -parameter "logsDir" -value $dir + +} Index: openacs-4/packages/user-tracking/tcl/filters-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/tcl/filters-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/tcl/filters-procs.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,23 @@ +#--------------------------------------------------------------------- +# +# ANALOG Support +# +#--------------------------------------------------------------------- + +ns_register_filter preauth GET "*" log_user_id +ns_register_filter preauth POST "*" log_user_id + + +ad_proc -public log_user_id {auth conn} { + Log user_id +} { + set user_id [ad_conn user_id] + set community_id [dotlrn_community::get_community_id] + if {[empty_string_p $community_id]} { + set community_id 0 + } + ns_set put [ns_conn headers] X-User-Id "$user_id\" \"community_id=$community_id" + #ns_set put [ns_conn headers] X-User-Id $user_id + return "filter_ok" + +} Index: openacs-4/packages/user-tracking/tcl/user-tracking-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/tcl/user-tracking-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/tcl/user-tracking-procs.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,184 @@ +ad_library { + + User-tracking Library + + @creation-date 2004-08-10 + @author David Ortega (doa@tid.es) + +} + +namespace eval user-tracking { + + ad_proc -public get_package_url { + + } { + Returns url of user-tracking package + } { + + return [util_current_location][site_node::get_package_url -package_key [apm_package_key_from_id [ad_conn package_id]]] + } + + ad_proc -public get_user_tracking_dir { + } { + Return directoy of user-tracking package + } { + # return "[acs_root_dir][pkg_home [apm_package_key_from_id [ad_conn package_id]]]" + return "[acs_root_dir][pkg_home "user-tracking"]" + } + + ad_proc -public process_sessions { + + } { + process file with sessions info + } { + + ns_log notice "user-tracking::process_sessions INIT" + set file_name "[acs_root_dir]/www/results.dat" + + + if { [file exists $file_name] == 1} { + + ns_log notice "Opening file $file_name ..." + set sessions_file [open [acs_root_dir]/www/results.dat r] + + while { [gets $sessions_file linea ] >= 0} { + # Se procesa la variable "linea" + # Hay un pb con el nombre del mes. No se puede meter directamente, ya que viene en espa�ol y la bd lo espera en ingl�s + # o en formato num�rico. Por eso lo paso a formato num�rico. + scan $linea "%u %u %s %u/%3s/%u %s %u/%3s/%u %s" session_id user_id ip day month year init_time f_day f_month f_year finish_time + set lista [lc_get abmon] + set init_date "" + set finish_date "" + append init_date "${year}-[expr [lsearch $lista $month] + 1]-${day} $init_time" + append finish_date "${f_year}-[expr [lsearch $lista $f_month] + 1]-${f_day} $finish_time" + db_dml write_to_db "" + } + close $sessions_file + + } + + } + + ad_proc -public launch_process { + horas + informes + } { + launches do_data_load if perioricidad=1 + } { + db_dml delete_scheduled_processes {} + user-tracking::do_data_load $informes + set id [ad_schedule_proc -thread "t" [expr [expr [lindex $horas 3] * 3600] + [expr [lindex $horas 4] * 60]] user-tracking::do_data_load $informes] + ns_log notice "\n\nId del proc programado $id. Se ejecutar� dentro de [expr [expr [lindex $horas 3] * 3600] + [expr [lindex $horas 4] * 60]] segundos\n" + db_dml insert_scheduled_process_id {} + } + + ad_proc -public do_data_load { + informes + } { + Execute awstats + } { + + #Proceso la variable "informes" + + foreach elm $informes { + switch $elm { + 1 { set all_users_p 1} + 2 { set all_communities_p 1} + 3 { set all_all_p 1} + 4 { set site_p 1} + } + } + + if {[exists_and_not_null all_users_p]} { + + ns_log notice "Ejecuto script para cada usuario" + + db_foreach user "select user_id from cc_users" { + #Ejecuto script para cada usuario + #ns_log notice "USUARIO: $user_id" + set execAnalyzer [list "/usr/bin/perl" "[get_user_tracking_dir]/www/awstats/cgi-bin/awstatsDirecto.pl" "-config=elane" "-update" "-onlyusers=$user_id"] + #ns_log notice "User: $user_id, ejecutamos: $execAnalyzer" + + catch {exec [lindex $execAnalyzer 0] [lindex $execAnalyzer 1] [lindex $execAnalyzer 2] [lindex $execAnalyzer 3] [lindex $execAnalyzer 4]} aux + + } + } + if {[exists_and_not_null all_communities_p]} { + + ns_log notice "Ejecuto script para cada comunidad" + + db_foreach community "select community_id from dotlrn_communities" { + + #ejecuto script para cada comunidad + #ns_log notice "Comunidad: $community_id" + set execAnalyzer [list "[get_user_tracking_dir]/www/awstats/cgi-bin/awstatsDirecto.pl" "-config=elane" "-update" "-onlylines=REGEX[.*community_id=$community_id.*]"] + catch {exec [lindex $execAnalyzer 0] [lindex $execAnalyzer 1] [lindex $execAnalyzer 2] [lindex $execAnalyzer 3]} aux + } + } + + if {[exists_and_not_null all_all_p]} { + ns_log notice "Ejecuto script para cada usuario en cada comunidad" + db_foreach community "select community_id from dotlrn_communities" { + db_foreach user "select user_id from cc_users" { + #ejecuto para cada user en cada comunidad + ns_log notice "Comunidad: $community_id - User: $user_id" + set execAnalyzer [list "[get_user_tracking_dir]/www/awstats/cgi-bin/awstatsDirecto.pl" "-config=elane" "-update" "-onlylines=REGEX[.*community_id=$community_id.*]" "-onlyusers=$user_id"] + catch {exec [lindex $execAnalyzer 0] [lindex $execAnalyzer 1] [lindex $execAnalyzer 2] [lindex $execAnalyzer 3] [lindex $execAnalyzer 4]} aux + } + } + + } + if {[exists_and_not_null site_p]} { + ns_log notice "Ejecuto script s�lo para el sitio web" + set execAnalyzer [list "[get_user_tracking_dir]/www/awstats/cgi-bin/awstatsDirecto.pl" "-config=elane" "-update"] + catch {exec [lindex $execAnalyzer 0] [lindex $execAnalyzer 1] [lindex $execAnalyzer 2]} aux + + } + } + + ad_proc -public select_children_communities { + parent_id + } { + Select subcommunities + } { + + set ComList [list $parent_id] + set i 0 + + while {$i < [llength $ComList] } { + set aux [lindex $ComList $i] + set query "select distinct community_id from dotlrn_communities where parent_community_id= $aux" + db_foreach com $query { + #add child id + lappend ComList $community_id + } + incr i + } + + return [join $ComList] + } + + ad_proc -public write_users_file { + } { + Writes users in db to usersinfo.txt + } { + + #Leer un par�metro de config.tcl + set logdir [ns_config "ns/parameters" serverlog] + #Me quedo con lo que me interesa + set patron "(.*)(\/(.)*\.log$)" + regexp $patron $logdir all dir part2 ] + append dir "/" + + #Escribo fichero de users.txt + set filename "${dir}awstat/userinfo.txt" + ns_log notice "Escribiendo en $filename" + set config_file [open $filename w] + db_foreach get_users "select person_id, first_names, last_name from persons" { + puts $config_file "$person_id \t $first_names $last_name" + } + close $config_file + } + +} + Index: openacs-4/packages/user-tracking/tcl/user-tracking-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/tcl/user-tracking-procs.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/tcl/user-tracking-procs.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,37 @@ + + + + + + + + + insert into ut_sessions ( + session_id, + user_id, + init_date, + finish_date, + ip + ) values ( + :session_id, + :user_id, + :init_date, + :finish_date, + :ip + ) + + + + + + + insert into ut_sched values (:id) + + + + + + delete from ut_sched; + + + \ No newline at end of file Index: openacs-4/packages/user-tracking/tools/logresolvemerge.pl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/tools/logresolvemerge.pl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/tools/logresolvemerge.pl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,660 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# Allows you to get one unique output log file, sorted on date, +# built from particular sources. +# This tool is part of AWStats log analyzer but can be use +# alone for any other log analyzer. +# See COPYING.TXT file about AWStats GNU General Public License. +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:37 $ + +use strict; no strict "refs"; +#use diagnostics; + +#----------------------------------------------------------------------------- +# Defines +#----------------------------------------------------------------------------- + +# ENABLETHREAD --> COMMENT THIS BLOCK TO USE A THREADED VERSION +my $UseThread=0; +&Check_Thread_Use(); +my $NbOfDNSLookupAsked = 0; +my %threadarray = (); +my %MyDNSTable = (); +my %TmpDNSLookup = (); + +# ENABLETHREAD --> UNCOMMENT THIS BLOCK TO USE A THREADED VERSION +#my $UseThread=1; +#&Check_Thread_Use(); +#my $NbOfDNSLookupAsked : shared = 0; +#my %threadarray : shared = (); +#my %MyDNSTable : shared = (); +#my %TmpDNSLookup : shared = (); + + +# ---------- Init variables -------- +use vars qw/ $REVISION $VERSION /; +$REVISION='$Revision: 1.1 $'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; +$VERSION="1.2 (build $REVISION)"; + +use vars qw/ $NBOFLINESFORBENCHMARK /; +$NBOFLINESFORBENCHMARK=8192; + +use vars qw/ +$DIR $PROG $Extension +$Debug $ShowSteps $AddFileNum +$MaxNbOfThread $DNSLookup $DNSCache $DirCgi $DirData $DNSLookupAlreadyDone +$NbOfLinesShowsteps $AFINET $QueueCursor +/; +$DIR=''; +$PROG=''; +$Extension=''; +$Debug=0; +$ShowSteps=0; +$AddFileNum=0; +$MaxNbOfThread=0; +$DNSLookup=0; +$DNSCache=''; +$DirCgi=''; +$DirData=''; +$DNSLookupAlreadyDone=0; +$NbOfLinesShowsteps=0; +$AFINET=''; + +# ---------- Init arrays -------- +use vars qw/ +@SkipDNSLookupFor +@ParamFile +/; +# ---------- Init hash arrays -------- +use vars qw/ +%linerecord %timerecord %corrupted +%QueueHostsToResolve %QueueRecords +/; +%linerecord = %timerecord = %corrupted = (); +%QueueHostsToResolve = %QueueRecords = (); + +# ---------- External Program variables ---------- +# For gzip compression +my $zcat = 'zcat'; +my $zcat_file = '\.gz$'; +# For bz2 compression +my $bzcat = 'bzcat'; +my $bzcat_file = '\.bz2$'; + + + +#----------------------------------------------------------------------------- +# Functions +#----------------------------------------------------------------------------- + +#------------------------------------------------------------------------------ +# Function: Write an error message and exit +# Parameters: $message +# Input: None +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub error { + print "Error: $_[0].\n"; + exit 1; +} + +#------------------------------------------------------------------------------ +# Function: Write a debug message +# Parameters: $message +# Input: $Debug +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub debug { + my $level = $_[1] || 1; + if ($Debug >= $level) { + my $debugstring = $_[0]; + print "DEBUG $level - ".localtime(time())." : $debugstring\n"; + } +} + +#------------------------------------------------------------------------------ +# Function: Write a warning message +# Parameters: $message +# Input: $Debug +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub warning { + my $messagestring=shift; + if ($Debug) { debug("$messagestring",1); } + print "$messagestring\n"; +} + +#----------------------------------------------------------------------------- +# Function: Return 1 if string contains only ascii chars +# Input: String +# Return: 0 or 1 +#----------------------------------------------------------------------------- +sub IsAscii { + my $string=shift; + if ($Debug) { debug("IsAscii($string)",5); } + if ($string =~ /^[\w\+\-\/\\\.%,;:=\"\'&?!\s]+$/) { + if ($Debug) { debug(" Yes",5); } + return 1; # Only alphanum chars (and _) or + - / \ . % , ; : = " ' & ? space \t + } + if ($Debug) { debug(" No",5); } + return 0; +} + +#----------------------------------------------------------------------------- +# Function: Return 1 if string contains only ascii chars +# Input: String +# Return: 0 or 1 +#----------------------------------------------------------------------------- +sub SkipDNSLookup { + foreach my $match (@SkipDNSLookupFor) { if ($_[0] =~ /$match/i) { return 1; } } + 0; # Not in @SkipDNSLookupFor +} + +#----------------------------------------------------------------------------- +# Function: Function that wait for DNS lookup (can be threaded) +# Input: String +# Return: 0 or 1 +#----------------------------------------------------------------------------- +sub MakeDNSLookup { + my $ipaddress=shift; + $NbOfDNSLookupAsked++; + use Socket; $AFINET=AF_INET; + my $tid=0; + $tid=$MaxNbOfThread?eval("threads->self->tid()"):0; + if ($Debug) { debug(" ***** Thread id $tid: MakeDNSlookup started (for $ipaddress)",4); } + my $lookupresult=gethostbyaddr(pack("C4",split(/\./,$ipaddress)),$AFINET); # This is very slow, may took 20 seconds + if (! $lookupresult || $lookupresult =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/ || ! IsAscii($lookupresult)) { + $TmpDNSLookup{$ipaddress}='*'; + } + else { + $TmpDNSLookup{$ipaddress}=$lookupresult; + } + if ($Debug) { debug(" ***** Thread id $tid: MakeDNSlookup done ($ipaddress resolved into $TmpDNSLookup{$ipaddress})",4); } + delete $threadarray{$ipaddress}; + return; +} + +#----------------------------------------------------------------------------- +# Function: WriteRecordsReadyInQueue +# Input: - +# Return: 0 +#----------------------------------------------------------------------------- +sub WriteRecordsReadyInQueue { + my $logfilechosen=shift; + if ($Debug) { debug("Check head of queue to write records ready to flush (QueueCursor=$QueueCursor, QueueSize=".(scalar keys %QueueRecords).")",4); } + while ( $QueueHostsToResolve{$QueueCursor} && ( ($QueueHostsToResolve{$QueueCursor} eq '*') || ($MyDNSTable{$QueueHostsToResolve{$QueueCursor}}) || ($TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}) ) ) { + # $QueueCursor point to a ready record + if ($QueueHostsToResolve{$QueueCursor} eq '*') { + if ($Debug) { debug(" First elem in queue is ready. No change on it. We pull it.",4); } + } + else { + if ($MyDNSTable{$QueueHostsToResolve{$QueueCursor}}) { + if ($MyDNSTable{$QueueHostsToResolve{$QueueCursor}} ne '*') { + $QueueRecords{$QueueCursor}=~s/$QueueHostsToResolve{$QueueCursor}/$MyDNSTable{$QueueHostsToResolve{$QueueCursor}}/; + if ($Debug) { debug(" First elem in queue has been resolved (found in MyDNSTable $MyDNSTable{$QueueHostsToResolve{$QueueCursor}}). We pull it.",4); } + } + } + elsif ($TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}) { + if ($TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}} ne '*') { + $QueueRecords{$QueueCursor}=~s/$QueueHostsToResolve{$QueueCursor}/$TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}/; + if ($Debug) { debug(" First elem in queue has been resolved (found in TmpDNSLookup $TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}}). We pull it.",4); } + } + } + } + # Record is ready, we output it. + if ($AddFileNum) { print "$logfilechosen $QueueRecords{$QueueCursor}\n"; } + else { print "$QueueRecords{$QueueCursor}\n"; } + delete $QueueRecords{$QueueCursor}; + delete $QueueHostsToResolve{$QueueCursor}; + $QueueCursor++; + } + return 0; +} + +#----------------------------------------------------------------------------- +# Function: Check if thread are enabled or not +# Input: - +# Return: - +#----------------------------------------------------------------------------- +sub Check_Thread_Use { + if ($] >= 5.008) { for (0..@ARGV-1) { if ($ARGV[$_] =~ /^-dnslookup[:=](\d{1,2})/i) { + if ($UseThread) { + if (!eval ('require "threads.pm";')) { &error("Failed to load perl module 'threads' required for multi-threaded DNS lookup".($@?": $@":"")); } + if (!eval ('require "threads/shared.pm";')) { &error("Failed to load perl module 'threads::shared' required for multi-threaded DNS lookup".($@?": $@":"")); } + } + else { &error("Multi-thread is disabled in default version of this script.\nYou must manually edit the file '$0' to comment/uncomment all\nlines marked with 'ENABLETHREAD' string to enable multi-threading"); } + } } + } +} + + +#----------------------------------------------------------------------------- +# MAIN +#----------------------------------------------------------------------------- +($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; + +# Get parameters (Note: $MaxNbOfThread is already known +my $cpt=1; +for (0..@ARGV-1) { + if ($ARGV[$_] =~ /^-/) { + if ($ARGV[$_] =~ /debug=(\d)/i) { $Debug=$1; } + elsif ($ARGV[$_] =~ /dnscache=/i) { $DNSLookup||=2; $DNSCache=$ARGV[$_]; $DNSCache =~ s/-dnscache=//; } + elsif ($ARGV[$_] =~ /dnslookup[:=](\d{1,2})/i) { $DNSLookup||=1; $MaxNbOfThread=$1; } + elsif ($ARGV[$_] =~ /dnslookup/i) { $DNSLookup||=1; } + elsif ($ARGV[$_] =~ /showsteps/i) { $ShowSteps=1; } + elsif ($ARGV[$_] =~ /addfilenum/i) { $AddFileNum=1; } + else { print "Unknown argument $ARGV[$_] ignored\n"; } + } + else { + push @ParamFile, $ARGV[$_]; + $cpt++; + } +} +if ($Debug) { $|=1; } + +if ($Debug) { + debug(ucfirst($PROG)." - $VERSION - Perl $^X $]",1); + debug("DNSLookup=$DNSLookup"); + debug("DNSCache=$DNSCache"); + debug("MaxNbOfThread=$MaxNbOfThread"); +} + +# Disallow MaxNbOfThread and Perl < 5.8 +if ($] < 5.008 && $MaxNbOfThread) { + error("Multi-threaded DNS lookup is only supported with Perl 5.8 or higher (not $]). Use -dnslookup option instead"); +} + +# Warning, there is a memory hole in ActiveState perl version (in delete functions) +if ($^X =~ /activestate/i || $^X =~ /activeperl/i) { + # TODO Add a warning + +} + +if (scalar @ParamFile == 0) { + print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; + print "$PROG allows you to get one unique output log file, sorted on date,\n"; + print "built from particular sources:\n"; + print " - It can read several input log files,\n"; + print " - It can read .gz/.bz2 log files,\n"; + print " - It can also makes a fast reverse DNS lookup to replace\n"; + print " all IP addresses into host names in resulting log file.\n"; + print "$PROG comes with ABSOLUTELY NO WARRANTY. It's a free software\n"; + print "distributed with a GNU General Public License (See COPYING.txt file).\n"; + print "$PROG is part of AWStats but can be used alone as a log merger\n"; + print "or resolver before using any other log analyzer.\n"; + print "\n"; + print "Usage:\n"; + print " $PROG.$Extension [options] file\n"; + print " $PROG.$Extension [options] file1 ... filen\n"; + print " $PROG.$Extension [options] *.*\n"; + print " perl $PROG.$Extension [options] *.* > newfile\n"; + print "Options:\n"; + print " -dnslookup make a reverse DNS lookup on IP adresses\n"; + print " -dnslookup=n same with a n parallel threads instead of serial requests\n"; + print " -dnscache=file make DNS lookup from cache file first before network lookup\n"; + print " -showsteps print on stderr benchmark information every $NBOFLINESFORBENCHMARK lines\n"; + print " -addfilenum if used with several files, file number can be added in first\n"; + print " field of output file. This can be used to add a cluster id\n"; + print " when log files come from several load balanced computers.\n"; + print "\n"; + + print "This runs $PROG in command line to open one or several\n"; + print "server log files to merge them (sorted on date) and/or to make a reverse\n"; + print "DNS lookup (if asked). The result log file is sent on standard output.\n"; + print "Note: $PROG is not a 'sort' tool to sort one file. It's a\n"; + print "software able to output sorted log records (with a reverse DNS lookup\n"; + print "included or not) even if log records are dispatched in several files.\n"; + print "Each of thoose files must be already independently sorted itself\n"; + print "(but that is the case in all web server log files). So you can use it\n"; + print "for load balanced log files or to group several old log files.\n"; + print "\n"; + print "Don't forget that the main goal of logresolvemerge is to send log records to\n"; + print "a log analyzer in a sorted order without merging files on disk (NO NEED\n"; + print "OF DISK SPACE AT ALL) and without loading files into memory (NO NEED\n"; + print "OF MORE MEMORY). Choose of output records is done on the fly.\n"; + print "\n"; + print "So logresolvemerge is particularly usefull when you want to output several\n"; + print "and/or large log files in a fast process, with no use of disk or\n"; + print "more memory, and in a chronological order through a pipe (to be used by a log\n"; + print "analyzer).\n"; + print "\n"; + print "Note: If input records are not 'exactly' sorted but 'nearly' sorted (this\n"; + print "occurs with heavy servers), this is not a problem, the output will also\n"; + print "be 'nearly' sorted but a few log analyzers (like AWStats) knowns how to deal\n"; + print "with such logs.\n"; + print "\n"; + print "WARNING: If log files are old MAC text files (lines ended with CR char), you\n"; + print "can't run this tool on Win or Unix platforms.\n"; + print "\n"; + print "WARNING: Because of important memory holes in ActiveState Perl version, use\n"; + print "another Perl interpreter if you need to process large lof files.\n"; + print "\n"; + print "Now supports/detects:\n"; + print " Automatic detection of log format\n"; + print " Files can be .gz/.bz2 files if zcat/bzcat tools are available in PATH.\n"; + print " Multithreaded reverse DNS lookup (several parallel requests) with Perl 5.8+.\n"; + print "New versions and FAQ at http://awstats.sourceforge.net\n"; + exit 0; +} + +# Get current time +my $nowtime=time; +my ($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear) = localtime($nowtime); +if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } +my $nowsmallyear=$nowyear;$nowsmallyear =~ s/^..//; +if (++$nowmonth < 10) { $nowmonth = "0$nowmonth"; } +if ($nowday < 10) { $nowday = "0$nowday"; } +if ($nowhour < 10) { $nowhour = "0$nowhour"; } +if ($nowmin < 10) { $nowmin = "0$nowmin"; } +if ($nowsec < 10) { $nowsec = "0$nowsec"; } +# Get tomorrow time (will be used to discard some record with corrupted date (future date)) +my ($tomorrowsec,$tomorrowmin,$tomorrowhour,$tomorrowday,$tomorrowmonth,$tomorrowyear) = localtime($nowtime+86400); +if ($tomorrowyear < 100) { $tomorrowyear+=2000; } else { $tomorrowyear+=1900; } +my $tomorrowsmallyear=$tomorrowyear;$tomorrowsmallyear =~ s/^..//; +if (++$tomorrowmonth < 10) { $tomorrowmonth = "0$tomorrowmonth"; } +if ($tomorrowday < 10) { $tomorrowday = "0$tomorrowday"; } +if ($tomorrowhour < 10) { $tomorrowhour = "0$tomorrowhour"; } +if ($tomorrowmin < 10) { $tomorrowmin = "0$tomorrowmin"; } +if ($tomorrowsec < 10) { $tomorrowsec = "0$tomorrowsec"; } +my $timetomorrow=$tomorrowyear.$tomorrowmonth.$tomorrowday.$tomorrowhour.$tomorrowmin.$tomorrowsec; + +# Init other parameters +$NBOFLINESFORBENCHMARK--; +if ($ENV{"GATEWAY_INTERFACE"}) { $DirCgi=''; } +if ($DirCgi && !($DirCgi =~ /\/$/) && !($DirCgi =~ /\\$/)) { $DirCgi .= '/'; } +if (! $DirData || $DirData eq '.') { $DirData=$DIR; } # If not defined or choosed to "." value then DirData is current dir +if (! $DirData) { $DirData='.'; } # If current dir not defined then we put it to "." +$DirData =~ s/\/$//; + +#my %monthlib = ( "01","$Message[60]","02","$Message[61]","03","$Message[62]","04","$Message[63]","05","$Message[64]","06","$Message[65]","07","$Message[66]","08","$Message[67]","09","$Message[68]","10","$Message[69]","11","$Message[70]","12","$Message[71]" ); +# monthnum must be in english because it's used to translate log date in apache log files which are always in english +my %monthnum = ( "Jan","01","ene","01","Feb","02","feb","02","Mar","03","mar","03","Apr","04","abr","04","May","05","may","05","Jun","06","jun","06","Jul","07","jul","07","Aug","08","ago","08","Sep","09","sep","09","Oct","10","oct","10","Nov","11","nov","11","Dec","12","dic","12" ); + +if ($DNSCache) { + if ($Debug) { debug("Load DNS Cache file $DNSCache",2); } + open(CACHE, "<$DNSCache") or error("Can't open cache file $DNSCache"); + while () { + my ($time, $ip, $name) = split; + $name='ip' if $name eq '*'; + $MyDNSTable{$ip}=$name; + } + close CACHE; +} + +#----------------------------------------------------------------------------- +# PROCESSING CURRENT LOG(s) +#----------------------------------------------------------------------------- +my %LogFileToDo=(); +my $NbOfLinesRead=0; +my $NbOfLinesParsed=0; +my $logfilechosen=0; +my $starttime=time(); + +# Define the LogFileToDo list +$cpt=1; +foreach my $key (0..(@ParamFile-1)) { + if ($ParamFile[$key] !~ /\*/ && $ParamFile[$key] !~ /\?/) { + if ($Debug) { debug("Log file $ParamFile[$key] is added to LogFileToDo with number $cpt."); } + + # Check for supported compression + if ($ParamFile[$key] =~ /$zcat_file/) { + if ($Debug) { debug("GZIP compression detected for Log file $ParamFile[$key]."); } + # Modify the name to include the zcat command + $ParamFile[$key] = $zcat . ' ' . $ParamFile[$key] . ' |'; + } + elsif ($ParamFile[$key] =~ /$bzcat_file/) { + if ($Debug) { debug("BZ2 compression detected for Log file $ParamFile[$key]."); } + # Modify the name to include the bzcat command + $ParamFile[$key] = $bzcat . ' ' . $ParamFile[$key] . ' |'; + } + + $LogFileToDo{$cpt}=@ParamFile[$key]; + $cpt++; + } + else { + my $DirFile=$ParamFile[$key]; $DirFile =~ s/([^\/\\]*)$//; + $ParamFile[$key] = $1; + if ($DirFile eq '') { $DirFile = '.'; } + $ParamFile[$key] =~ s/\./\\\./g; + $ParamFile[$key] =~ s/\*/\.\*/g; + $ParamFile[$key] =~ s/\?/\./g; + if ($Debug) { debug("Search for file \"$ParamFile[$key]\" into \"$DirFile\""); } + opendir(DIR,"$DirFile"); + my @filearray = sort readdir DIR; + close DIR; + foreach my $i (0..$#filearray) { + if ("$filearray[$i]" =~ /^$ParamFile[$key]$/ && "$filearray[$i]" ne "." && "$filearray[$i]" ne "..") { + if ($Debug) { debug("Log file $filearray[$i] is added to LogFileToDo with number $cpt."); } + $LogFileToDo{$cpt}="$DirFile/$filearray[$i]"; + $cpt++; + } + } + } +} + +# If no files to process +if (scalar keys %LogFileToDo == 0) { + error("No input log file found"); +} + +# Open all log files +if ($Debug) { debug("Start of processing ".(scalar keys %LogFileToDo)." log file(s), $MaxNbOfThread threads max"); } +foreach my $logfilenb (keys %LogFileToDo) { + if ($Debug) { debug("Open log file number $logfilenb: \"$LogFileToDo{$logfilenb}\""); } + open("LOG$logfilenb","$LogFileToDo{$logfilenb}") || error("Couldn't open log file \"$LogFileToDo{$logfilenb}\" : $!"); + binmode "LOG$logfilenb"; # To avoid pb of corrupted text log files with binary chars. +} + +$QueueCursor=1; +while (1 == 1) +{ + # BEGIN Read new record (for each log file or only for log file with record just processed) + #------------------------------------------------------------------------------------------ + foreach my $logfilenb (keys %LogFileToDo) { + if (($logfilechosen == 0) || ($logfilechosen == $logfilenb)) { + if ($Debug) { debug("Search next record in file number $logfilenb",3); } + # Read chosen log file until we found a record with good date or reaching end of file + while (1 == 1) { + my $LOG="LOG$logfilenb"; + $_=<$LOG>; # Read new line + if (! $_) { # No more records in log file number $logfilenb + if ($Debug) { debug(" No more records in file number $logfilenb",2); } + delete $LogFileToDo{$logfilenb}; + last; + } + + $NbOfLinesRead++; + chomp $_; s/\r$//; + + if (/^#/) { next; } # Ignore comment lines (ISS writes such comments) + if (/^!!/) { next; } # Ignore comment lines (Webstar writes such comments) + if (/^$/) { next; } # Ignore blank lines (With ISS: happens sometimes, with Apache: possible when editing log file) + + $linerecord{$logfilenb}=$_; + + # Check filters + #---------------------------------------------------------------------- + + # Split DD/Month/YYYY:HH:MM:SS or YYYY-MM-DD HH:MM:SS or MM/DD/YY\tHH:MM:SS + my $year=0; my $month=0; my $day=0; my $hour=0; my $minute=0; my $second=0; + if ($_ =~ /(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/) { $year=$1; $month=$2; $day=$3; $hour=$4; $minute=$5; $second=$6; } + elsif ($_ =~ /\[(\d\d)[\/:\s](\w+)[\/:\s](\d\d\d\d)[\/:\s](\d\d)[\/:\s](\d\d)[\/:\s](\d\d) /) { $year=$3; $month=$2; $day=$1; $hour=$4; $minute=$5; $second=$6; } + elsif ($_ =~ /\[\w+ (\w+) (\d\d) (\d\d)[\/:\s](\d\d)[\/:\s](\d\d) (\d\d\d\d)\]/) { $year=$6; $month=$1; $day=$2; $hour=$3; $minute=$4; $second=$5; } + + if ($monthnum{$month}) { $month=$monthnum{$month}; } # Change lib month in num month if necessary + + # Create $timerecord like YYYYMMDDHHMMSS + $timerecord{$logfilenb}=int("$year$month$day$hour$minute$second"); + if ($timerecord{$logfilenb}<10000000000000) { + if ($Debug) { debug(" This record is corrupted (no date found)",3); } + $corrupted{$logfilenb}++; + next; + } + if ($Debug) { debug(" This is next record for file $logfilenb : timerecord=$timerecord{$logfilenb}",3); } + last; + } + } + } + # END Read new lines for each log file. After this, following var are filled + # $timerecord{$logfilenb} + + # We choose wich record of wich log file to process + if ($Debug) { debug("Choose of wich record of which log file to process",3); } + $logfilechosen=-1; + my $timeref="99999999999999"; + foreach my $logfilenb (keys %LogFileToDo) { + if ($Debug) { debug(" timerecord for file $logfilenb is $timerecord{$logfilenb}",4); } + if ($timerecord{$logfilenb} < $timeref) { $logfilechosen=$logfilenb; $timeref=$timerecord{$logfilenb} } + } + if ($logfilechosen <= 0) { last; } # No more record to process + # Record is chosen + if ($Debug) { debug(" We choosed to qualify record of file number $logfilechosen",3); } + if ($Debug) { debug(" Record is $linerecord{$logfilechosen}",3); } + + # Record is approved. We found a new line to parse in file number $logfilechosen + #------------------------------------------------------------------------------- + $NbOfLinesParsed++; + if ($ShowSteps) { + if ((++$NbOfLinesShowsteps & $NBOFLINESFORBENCHMARK) == 0) { + my $delay=(time()-$starttime)||1; + print STDERR "$NbOfLinesParsed lines processed (".(1000*$delay)." ms, ".int($NbOfLinesShowsteps/$delay)." lines/seconds)\n"; + } + } + + # Do DNS lookup + #-------------------- + my $Host=''; + my $ip=0; + if ($DNSLookup) { # DNS lookup is 1 or 2 + if ($linerecord{$logfilechosen} =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { $ip=4; $Host=$1; } # IPv4 + elsif ($linerecord{$logfilechosen} =~ /([0-9A-F]*:)/i) { $ip=6; $Host=$1; } # IPv6 + if ($ip) { + # Check in static DNS cache file + if ($MyDNSTable{$Host}) { + if ($Debug) { debug(" DNS lookup asked for $Host and found in static DNS cache file: $MyDNSTable{$Host}",4); } + } + elsif ($DNSLookup==1) { + # Check in session cache (dynamic DNS cache file + session DNS cache) + if (! $threadarray{$Host} && ! $TmpDNSLookup{$Host}) { + if (@SkipDNSLookupFor && &SkipDNSLookup($Host)) { + $TmpDNSLookup{$Host}='*'; + if ($Debug) { debug(" No need of reverse DNS lookup for $Host, skipped at user request.",4); } + } + else { + if ($ip == 4) { + # Create or not a new thread + if ($MaxNbOfThread) { + if (! $threadarray{$Host}) { # No thread already launched for $Host + while ((scalar keys %threadarray) >= $MaxNbOfThread) { + if ($Debug) { debug(" $MaxNbOfThread thread running reached, so we wait",4); } + sleep 1; + } + $threadarray{$Host}=1; # Semaphore to tell thread for $Host is active +# my $t = new Thread \&MakeDNSLookup, $Host; + my $t = threads->create(sub { MakeDNSLookup($Host) }); + if (! $t) { error("Failed to create new thread"); } + if ($Debug) { debug(" Reverse DNS lookup for $Host queued in thread ".$t->tid,4); } + $t->detach(); # We don't need to keep return code + } + else { + if ($Debug) { debug(" Reverse DNS lookup for $Host already queued in a thread"); } + } + # Here, this is the only way, $TmpDNSLookup{$Host} can be not defined + } else { + &MakeDNSLookup($Host); + if ($Debug) { debug(" Reverse DNS lookup for $Host done: $TmpDNSLookup{$Host}",4); } + } + } + elsif ($ip == 6) { + $TmpDNSLookup{$Host}='*'; + if ($Debug) { debug(" Reverse DNS lookup for $Host not available for IPv6",4); } + } + } + } else { + if ($Debug) { debug(" Reverse DNS lookup already queued or done for $Host: $TmpDNSLookup{$Host}",4); } + } + } + else { + if ($Debug) { debug(" DNS lookup by static DNS cache file asked for $Host but not found.",4); } + } + } + else { + if ($Debug) { debug(" DNS lookup asked for $Host but this is not an IP address.",4); } + $DNSLookupAlreadyDone=$LogFileToDo{$logfilechosen}; + } + } + else { + if ($linerecord{$logfilechosen} =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { $ip=4; $Host=$1; } # IPv4 + elsif ($linerecord{$logfilechosen} =~ /([0-9A-F]*:)/i) { $ip=6; $Host=$1; } # IPv6 + if ($Debug) { debug(" No DNS lookup asked.",4); } + } + + # Put record in record queue + if ($Debug) { debug("Add record $NbOfLinesParsed in record queue (with host to resolve = ".($Host?$Host:'*').")",4); } + $QueueRecords{$NbOfLinesParsed}=$linerecord{$logfilechosen}; + + # Put record in host queue + # If there is a host to resolve, we add line to queue with value of host to resolve + # $Host is '' (no ip found) or is ip + if ($DNSLookup==0) { + $QueueHostsToResolve{$NbOfLinesParsed}='*'; + } + if ($DNSLookup==1) { + $QueueHostsToResolve{$NbOfLinesParsed}=$Host?$Host:'*'; + } + if ($DNSLookup==2) { + $QueueHostsToResolve{$NbOfLinesParsed}=$MyDNSTable{$Host}?$Host:'*'; + } + + # Print all records in head of queue that are ready + &WriteRecordsReadyInQueue($logfilechosen); + +} # End of processing new record. Loop on next one. + +if ($Debug) { debug("End of processing log file(s)"); } + +# Close all log files +foreach my $logfilenb (keys %LogFileToDo) { + if ($Debug) { debug("Close log file number $logfilenb"); } + close("LOG$logfilenb") || error("Command for pipe '$LogFileToDo{$logfilenb}' failed"); +} + +while ( $QueueHostsToResolve{$QueueCursor} && $QueueHostsToResolve{$QueueCursor} ne '*' && ! $MyDNSTable{$QueueHostsToResolve{$QueueCursor}} && ! $TmpDNSLookup{$QueueHostsToResolve{$QueueCursor}} ) { + sleep 1; + # Print all records in head of queue that are ready + &WriteRecordsReadyInQueue($logfilechosen); +} + +# Waiting queue is empty +if ($MaxNbOfThread) { + foreach my $t (threads->list()) { + if ($Debug) { debug("Join thread $t"); } + $t->join(); + } +} + +# DNSLookup warning +if ($DNSLookup==1 && $DNSLookupAlreadyDone) { + warning("Warning: $PROG has detected that some host names were already resolved in your logfile $DNSLookupAlreadyDone.\nIf DNS lookup was already made by the logger (web server) in ALL your log files, you should not use -dnslookup option to increase $PROG speed."); +} + +if ($Debug) { + debug("Total nb of read lines: $NbOfLinesRead"); + debug("Total nb of parsed lines: $NbOfLinesParsed"); + debug("Total nb of DNS lookup asked: $NbOfDNSLookupAsked"); +} + +#if ($DNSCache) { +# open(CACHE, ">$DNSCache") or die; +# foreach (keys %TmpDNSLookup) { +# $TmpDNSLookup{$_}="*" if $TmpDNSLookup{$_} eq "ip"; +# print CACHE "0\t$_\t$TmpDNSLookup{$_}\n"; +# } +# close CACHE; +#} + +0; # Do not remove this line Index: openacs-4/packages/user-tracking/www/Copy of site-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/Copy of site-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/Copy of site-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,151 @@ + + + + postgresql7.1 + + + + + select count(u.user_id) as n_users, + to_char(max(creation_date), 'YYYY-MM-DD HH24:MI:SS') as last_registration, + to_char(max(u.last_visit), 'YYYY-MM-DD HH24:MI:SS') as last_visit, + sum(u.n_sessions) as total_visits + from users u, + acs_objects o + where o.object_id = u.user_id + and user_id <> 0 + + + + + + select count (*) + from dotlrn_users + + + + + + select count (*) + from dotlrn_communities h, dotlrn_clubs c + where h.parent_community_id is not null + or c.club_id = h.community_id + + + + + + select count (*) + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + + + + + + select cr_items.live_revision as revision_id, + coalesce(cr_revisions.title, 'view this portrait') as portrait_title + from acs_rels, + cr_items, + cr_revisions + where acs_rels.object_id_two = cr_items.item_id + and cr_items.live_revision = cr_revisions.revision_id + and acs_rels.object_id_one = :user_id + and acs_rels.rel_type = 'user_portrait_rel' + + + + + + select dotlrn_class_instances_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_class_instances_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_class_instances_full.class_instance_id + order by dotlrn_class_instances_full.department_name, + dotlrn_class_instances_full.department_key, + dotlrn_class_instances_full.pretty_name, + dotlrn_class_instances_full.community_key + + + + + + select dotlrn_clubs_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_clubs_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_clubs_full.club_id + order by dotlrn_clubs_full.pretty_name, + dotlrn_clubs_full.community_key + + + + + + select dotlrn_communities.*, + dotlrn_community__url(dotlrn_communities.community_id) as url, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_communities, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_communities.community_id + and dotlrn_communities.community_type = 'dotlrn_community' + order by dotlrn_communities.pretty_name, + dotlrn_communities.community_key + + + + + select count(distinct community_id) + from dotlrn_communities + where parent_community_id= :community_id + + + + + + select count (distinct acs_rels.object_id_two) + from acs_rels, dotlrn_users + where acs_rels.rel_type in ('[join $rels "\', \'"]') + and dotlrn_users.user_id=acs_rels.object_id_two + + + + + + select count(distinct forums.forum_id) + from forums_forums_enabled forums + + + + + + select count(distinct f.faq_id) + from faqs f + + + + + + select count(distinct n.item_id) + from news_items_approved n + + + + + + select count(distinct s.survey_id) + from surveys s + + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-large-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-large-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-large-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,38 @@ + + + + postgresql7.1 + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where (h.parent_community_id is not null + or c.club_id = h.community_id) + and ( + lower(h.pretty_name) like lower('%' || :search_text || '%') + or lower(h.community_key) like lower('%' || :search_text || '%') + ) + order by h.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + and ( + lower(dotlrn_communities_full.pretty_name) like lower('%' || :search_text || '%') + or lower(dotlrn_communities_full.community_key) like lower('%' || :search_text || '%') + ) + order by dotlrn_communities_full.pretty_name + + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-large.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-large.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-large.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + +
#dotlrn.Search_Text#
+ +
+ + + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-large.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-large.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-large.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,75 @@ + + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-communities-chunk-large.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {search_text ""} +} -properties { + communities_list:multirow +} + +if {![exists_and_not_null type_request]} { + set type_request community +} + +if {![exists_and_not_null type]} { + set type "dotlrn_club" +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + + +form create community_search -action "/user-tracking/pruebas/advanced-stats" + +element create community_search search_text \ + -label [_ dotlrn.Search] \ + -datatype text \ + -widget text \ + -value $search_text + +element create community_search type \ + -label [_ dotlrn.Type] \ + -datatype text \ + -widget hidden \ + -value $type + +element create community_search referer \ + -label [_ dotlrn.Referer] \ + -datatype text \ + -widget hidden \ + -value $referer + +element create community_search type_request \ + -label type_request \ + -datatype text \ + -widget hidden \ + -value $type_request + +if {[form is_valid community_search]} { + form get_values community_search search_text referer + + set dotlrn_package_id [dotlrn::get_package_id] + set root_object_id [acs_magic_object security_context_root] + set i 1 + + if {[string equal $type "dotlrn_club"] == 1} { + db_multirow communities_list select_dotlrn_clubs {} { + incr i + } + } else { + db_multirow communities_list select_dotlrn_classes {} { + incr i + } + } + +} else { + multirow create communities_list dummy +} + +ad_return_template + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,88 @@ + + + + postgresql7.1 + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where (h.parent_community_id is not null + or c.club_id = h.community_id) + and upper(substr(h.pretty_name, 1, 1)) = :section + order by h.pretty_name + + + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where (h.parent_community_id is not null + or c.club_id = h.community_id) + and upper(substr(h.pretty_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by h.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + and upper(substr(dotlrn_communities_full.pretty_name, 1, 1)) = :section + order by dotlrn_communities_full.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + and upper(substr(dotlrn_communities_full.pretty_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by dotlrn_communities_full.pretty_name + + + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where dotlrn_users.type = :type + and upper(substr(dotlrn_users.last_name, 1, 1)) = :section + order by dotlrn_users.last_name + + + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where dotlrn_users.type = :type + and upper(substr(dotlrn_users.last_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by dotlrn_users.last_name + + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,6 @@ + +

@control_bar;noquote@

+ + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-medium.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,53 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-communities-chunk-medium.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {section A} +} -properties { + control_bar:onevalue + communities_list:multirow +} + +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null type]} { + set type "dotlrn_club" +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + +set dimension_list {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} +foreach dimension $dimension_list { + lappend dimensions [list $dimension $dimension {}] +} +lappend dimensions [list Other Other {}] + +set control_bar [portal::dimensional -no_bars [list [list section {} $section $dimensions]]] + +set i 1 + +if {[string equal $type "dotlrn_club"] == 1} { + set query select_dotlrn_clubs + if {[string match Other $section]} { + append query "_other" + } + db_multirow communities_list $query {} { + incr i + } +} else { + set query select_dotlrn_classes + if {[string match Other $section]} { + append query "_other" + } + db_multirow communities_list $query {} { + incr i + } +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-small-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-small-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-small-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,39 @@ + + + + postgresql7.1 + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where h.parent_community_id is not null + or c.club_id = h.community_id + order by h.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + order by dotlrn_communities_full.pretty_name + + + + + + select dotlrn_communities.community_key, + dotlrn_communities.community_id, + dotlrn_communities.pretty_name + from dotlrn_communities + order by dotlrn_communities.pretty_name + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-small.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-small.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-small.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,3 @@ + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk-small.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk-small.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk-small.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,38 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-communities-chunk-small.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { +} -properties { + communities_list:multirow +} + +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null type]} { + set type "dotlrn_club" +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + +set i 1 +if {[string equal $type "dotlrn_club"] == 1} { + db_multirow communities_list select_dotlrn_clubs {} { + incr i + } +} elseif {[string equal $type "dotlrn_class"] == 1} { + db_multirow communities_list select_dotlrn_classes {} { + incr i + } +} else { + db_multirow communities_list select_dotlrn_communities {} { + incr i + } +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,62 @@ +<% + +%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#dotlrn.Community##user-tracking.add#
+ @communities_list.pretty_name@ ( @communities_list.community_id@ ) + + <% + + set selected 0 + set without_selected "" + set patron "(.*)(@communities_list.community_id@)(.*)" + if { [regexp $patron @Communities@ todo part1 part2 part3] ==1 } { + set selected 1 + append without_selected @part1@ @part3@ + } else { + set temp "" + append temp @Communities@ " " @communities_list.community_id@ + set tempLong "" + append tempLong @Communities@ " " [user-tracking::select_children_communities @communities_list.community_id@] + } + %> + #user-tracking.eliminate# + + #user-tracking.add# + | + #user-tracking.add_subgroups# + +
#dotlrn.No_Communities#
+
+ + + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-chunk.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-chunk.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-chunk.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-communities-chunk.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {section ""} +} -properties { + user_id:onevalue +} + +set user_id [ad_conn user_id] + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-communities-stats-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-stats-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-stats-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,23 @@ + + + + postgresql7.1 + + + + select count(distinct h.community_key) + from dotlrn_communities h, dotlrn_clubs c + where h.parent_community_id is not null + or c.club_id = h.community_id + + + + + + select count(distinct dotlrn_communities_full.community_id) + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-stats.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-stats.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-stats.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,15 @@ + +

@control_bar_communities;noquote@

+ + + + + + + + + + + + + Index: openacs-4/packages/user-tracking/www/advanced-communities-stats.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-stats.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-stats.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,30 @@ + +ad_page_contract { + Displays the stats users page + + @author yon (elane@tid.es) + @creation-date 2004-09-15 + @version $Id: advanced-communities-stats.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {type_request "community"} + {type dotlrn_club} +} -properties { + control_bar_communities:onevalue + n_vals:onevalue +} + + +set n_vals [db_string select_dotlrn_communities_count {}] + +set n_clubs [db_string select_dotlrn_clubs_count {}] +set n_classes [db_string select_dotlrn_classes_count {}] + + +set dotlrn_community_types [list] +lappend dotlrn_community_types [list dotlrn_club "[_ dotlrn.Communities] ($n_clubs)"] +lappend dotlrn_community_types [list dotlrn_class "[_ dotlrn.Classes] ($n_classes)"] + +set control_bar_communities [ad_dimensional [list [list type "[_ dotlrn.Community_Type]:" $type $dotlrn_community_types]]] + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-communities-stats.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-communities-stats.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-communities-stats.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + + + + + + + select count(*) + from dotlrn_communities + + + + + + select count(*) + from dotlrn_users + + + + Index: openacs-4/packages/user-tracking/www/advanced-stats.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-stats.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-stats.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,58 @@ + + +@page_title;noquote@ +@context;noquote@ + + +<% + +set referer "[user-tracking::get_package_url]/advanced-stats" %> + +[ + #user-tracking.lt_Site_Stats# + | + #user-tracking.lt_Communities_Stats# + | + #user-tracking.lt_Users_Stats# + | + #user-tracking.lt_Advanced_Stats_1# +] + +

+

#user-tracking.lt_Selected_Users#@Users@
+ #user-tracking.lt_Selected_Communities#@Communities@ + +

+

+

+ + #user-tracking.lt_No_stats# + + + #user-tracking.lt_View_Comm_Stats# + + + #user-tracking.lt_View_Users_Stats# + + #user-tracking.lt_View_Advanced_Stats# + + + + | + + #user-tracking.lt_Delete_Selection# + + #user-tracking.lt_Delete_Selection# + +

+ +

@control_bar;noquote@

+ + + + + + + + + Index: openacs-4/packages/user-tracking/www/advanced-stats.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-stats.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-stats.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,39 @@ + +ad_page_contract { + Displays the stats users page + + @author yon (elane@tid.es) + @creation-date 2004-09-15 + @version $Id: advanced-stats.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {type_request "user"} + Users:optional + {Communities ""} +} -properties { + control_bar:onevalue + n_vals:onevalue +} + +if {![exists_and_not_null Users]} { + set Users "" +} +set page_title [_ user-tracking.lt_Advanced_Stats] +set context [list $page_title] + +set n_users [db_string select_dotlrn_user_count {}] +set n_communities [db_string select_dotlrn_communities_count {}] + +set dotlrn_types [list] +lappend dotlrn_types [list user "[_ dotlrn.Users] ($n_users)"] +lappend dotlrn_types [list community "[_ dotlrn.Communities] ($n_communities)"] + +set control_bar [ad_dimensional [list [list type_request "Tipo:" $type_request $dotlrn_types]]] + +if {[string equal $type_request "user"] == 1} { + set n_vals $n_users +} else { + set n_vals $n_communities +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-stats.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-stats.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-stats.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + + + + + + + select count(*) + from dotlrn_communities + + + + + + select count(*) + from dotlrn_users + + + + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-large-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-large-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-large-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,24 @@ + + + + postgresql7.1 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where ( + lower(dotlrn_users.last_name) like lower('%' || :search_text || '%') + or lower(dotlrn_users.first_names) like lower('%' || :search_text || '%') + or lower(dotlrn_users.email) like lower('%' || :search_text || '%') + ) + order by dotlrn_users.last_name + + + + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-large.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-large.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-large.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + +
#dotlrn.Search_Text#
+ +
+ + + + + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-large.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-large.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-large.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,62 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-users-chunk-large.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {search_text ""} +} -properties { + Userslist:multirow +} + +if {![exists_and_not_null type_request]} { + set type_request user +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + + +form create user_search -action "/user-tracking/pruebas/advanced-stats" + +element create user_search search_text \ + -label [_ dotlrn.Search] \ + -datatype text \ + -widget text \ + -value $search_text + +element create user_search type \ + -label [_ dotlrn.Type] \ + -datatype text \ + -widget hidden \ + -value $type + +element create user_search referer \ + -label [_ dotlrn.Referer] \ + -datatype text \ + -widget hidden \ + -value $referer + +element create user_search type_request \ + -label "type_request" \ + -datatype text \ + -widget hidden \ + -value $type_request + +if {[form is_valid user_search]} { + form get_values user_search search_text referer + + set dotlrn_package_id [dotlrn::get_package_id] + set root_object_id [acs_magic_object security_context_root] + set i 1 + + db_multirow Userslist select_dotlrn_users {} { + incr i + } +} else { + multirow create Userslist dummy +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-medium-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-medium-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-medium-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,34 @@ + + + + postgresql7.1 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where upper(substr(dotlrn_users.last_name, 1, 1)) = :section + order by dotlrn_users.last_name + + + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where upper(substr(dotlrn_users.last_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by dotlrn_users.last_name + + + + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-medium.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-medium.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-medium.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,6 @@ + +

@control_bar;noquote@

+ + + + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-medium.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-medium.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-medium.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,38 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-users-chunk-medium.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {section A} +} -properties { + Userslist:multirow +} + +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + +set dimension_list {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} +foreach dimension $dimension_list { + lappend dimensions [list $dimension $dimension {}] +} +lappend dimensions [list Other Other {}] + +set control_bar [portal::dimensional -no_bars [list [list section {} $section $dimensions]]] + +set i 1 + set query select_dotlrn_users + if {[string match Other $section]} { + append query "_other" + } + db_multirow Userslist $query {} { + incr i + } + + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-small-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-small-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-small-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,18 @@ + + + + postgresql7.1 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id,dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + order by dotlrn_users.last_name + + + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-small.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-small.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-small.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,2 @@ + + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk-small.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk-small.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk-small.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,26 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-users-chunk-small.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { +} -properties { + Userslist:multirow +} + +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + +# Currently, just present a list of dotLRN users +set i 1 + + db_multirow Userslist select_dotlrn_users {} { + incr i + } + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,60 @@ +<% + set admin_url [dotlrn::get_admin_url] +%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#dotlrn.User##user-tracking.lt_User_id##dotlrn.Guest##user-tracking.lt_Add_a_user#
+ @Userslist.last_name@, @Userslist.first_names@ (@Userslist.email@) + @Userslist.user_id@ + #dotlrn.Yes##dotlrn.No# + + <% + set selected 0 + set temp "" + set without_selected "" + set patron "(.*)(@Userslist.user_id@)(.*)" + if { [regexp $patron @Users@ all part1 part2 part3] == 1} { + set selected 1 + append without_selected @part1@ @part3@ + } else { + append temp @Users@ " " @Userslist.user_id@ + } + %> + #user-tracking.eliminate# + + #user-tracking.add# + +
#dotlrn.No_Users#
+
+ Index: openacs-4/packages/user-tracking/www/advanced-users-chunk.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: advanced-users-chunk.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {section ""} +} -properties { + user_id:onevalue +} + +set user_id [ad_conn user_id] + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/advanced-stats" +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-users-chunk.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-chunk.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-chunk.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + + + + + + + select count(*) + from dotlrn_communities + + + + + + select count(*) + from dotlrn_users + + + + Index: openacs-4/packages/user-tracking/www/advanced-users-stats.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-stats.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-stats.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,15 @@ + +

+ + + + + + + + + + + + + Index: openacs-4/packages/user-tracking/www/advanced-users-stats.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-stats.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-stats.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,20 @@ + +ad_page_contract { + Displays the stats users page + + @author yon (elane@tid.es) + @creation-date 2004-09-15 + @version $Id: advanced-users-stats.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {type_request "user"} +} -properties { + control_bar_users:onevalue + n_vals:onevalue +} + +set n_vals [db_string select_dotlrn_user_count {}] + +set context_bar [_ dotlrn.Users] + +ad_return_template + Index: openacs-4/packages/user-tracking/www/advanced-users-stats.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/advanced-users-stats.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/advanced-users-stats.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + + + + + + + select count(*) + from dotlrn_communities + + + + + + select count(*) + from dotlrn_users + + + + Index: openacs-4/packages/user-tracking/www/communities-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,194 @@ + + + + postgresql7.1 + + + + select f.community_key as key, + f.community_id as id, + f.pretty_name as name, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date + from dotlrn_classes c, dotlrn_communities_full f, acs_objects o + where f.community_type = c.class_key + and f.community_id= :community_id + and o.object_id= :community_id + + + + + + select distinct h.community_key as key, + h.community_id as id, + h.pretty_name as name, + h.parent_community_id as parent_id, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date + from dotlrn_communities h, dotlrn_clubs c, acs_objects o + where h.community_id= c.club_id + and h.community_id= :community_id + and o.object_id= :community_id + + + + + + select distinct h.community_key as key, + h.community_id as id, + h.pretty_name as name, + h.parent_community_id as parent_id, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date + from dotlrn_communities h, acs_objects o + where h.community_id= :community_id + and o.object_id= :community_id + + + + + + select count(distinct community_id) + from dotlrn_communities + where parent_community_id= :community_id + + + + + + select count (*) + from acs_rels + where acs_rels.object_id_one= :community_id + + + + + + select count (*) + from acs_rels + where acs_rels.object_id_one= :community_id + and acs_rels.rel_type in ('[join $rels "\', \'"]') + + + + + + select count(distinct forums.forum_id) + from forums_forums_enabled forums, dotlrn_communities com + where com.community_id= :community_id + and apm_package__parent_id(forums.package_id) = com.package_id + + + + + + select count(distinct f.faq_id) + from faqs f, dotlrn_communities com, acs_objects o + where com.community_id= :community_id + and o.object_id=f.faq_id + and apm_package__parent_id(o.context_id) = com.package_id + + + + + + select count(n.item_id) + from news_items_approved n, dotlrn_communities com + where com.community_id= :community_id + and apm_package__parent_id(n.package_id) = com.package_id + + + + + + select count(s.survey_id) + from surveys s, dotlrn_communities com + where com.community_id= :community_id + and apm_package__parent_id(s.package_id) = com.package_id + + + + + + select count (*) + from dotlrn_communities h, dotlrn_clubs c + where h.parent_community_id is not null + or c.club_id = h.community_id + + + + + + select count (*) + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + + + + + + select cr_items.live_revision as revision_id, + coalesce(cr_revisions.title, 'view this portrait') as portrait_title + from acs_rels, + cr_items, + cr_revisions + where acs_rels.object_id_two = cr_items.item_id + and cr_items.live_revision = cr_revisions.revision_id + and acs_rels.object_id_one = :user_id + and acs_rels.rel_type = 'user_portrait_rel' + + + + + + select dotlrn_class_instances_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_class_instances_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_class_instances_full.class_instance_id + order by dotlrn_class_instances_full.department_name, + dotlrn_class_instances_full.department_key, + dotlrn_class_instances_full.pretty_name, + dotlrn_class_instances_full.community_key + + + + + + select dotlrn_clubs_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_clubs_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_clubs_full.club_id + order by dotlrn_clubs_full.pretty_name, + dotlrn_clubs_full.community_key + + + + + + select dotlrn_communities.*, + dotlrn_community__url(dotlrn_communities.community_id) as url, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_communities, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_communities.community_id + and dotlrn_communities.community_type = 'dotlrn_community' + order by dotlrn_communities.pretty_name, + dotlrn_communities.community_key + + + + + + select distinct package_key from apm_packages where package_key= :package_key + + + + Index: openacs-4/packages/user-tracking/www/communities-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,75 @@ + + +@page_title;noquote@ +@context;noquote@ + +[ + #user-tracking.lt_Site_Stats# + | + #user-tracking.lt_Communities_Stats# + | + #user-tracking.lt_Users_Stats# + | + #user-tracking.lt_Advanced_Stats_1# +] + +

+

+ +

#user-tracking.ut_Community_Stats#

+ + + + Index: openacs-4/packages/user-tracking/www/communities-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,102 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: communities-card.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {community_id ""} + {type ""} + {NofSub ""} + {NofMembers ""} + {NofUsers ""} + {NofAdmin ""} + {NofForums ""} + {NofFaqs ""} + {NofNews ""} + {NofSurveys ""} + {name ""} + {creation_date ""} + {id ""} + +} -properties { + type:onevalue + NofSub:onevalue + NofMembers:onevalue + NofUsers:onevalue + NofAdmin:onevalue + NofForums:onevalue + NofFaqs:onevalue + NofNews:onevalue + NofSurveys:onevalue + name:onevalue + creation_date:onevalue + id:onevalue +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/communities-stats" +} + + +if {![exists_and_not_null community_id]} { + ad_returnredirect $referer +} + +#Only proffesor of a class could see class stats +ad_require_permission $community_id "admin" + + +#Hay que modificar el titulo de la pagina +set page_title [_ user-tracking.User_Stats] +set context [list $page_title] + +#Each kind of community is a number: Club 1, Class 2, other 3 +if {![db_0or1row select_class_data {}]} { + set rol_users_list {dotlrn_member_rel} + set rol_admin_list {dotlrn_admin_rel} + if {![db_0or1row select_club_data {}]} { + if {![db_0or1row select_com_data {}]} { + ad_returnredirect $referer + } else { + set type 3 + } + } else { + set type 1 + } +} else { + set type 2 + set rol_users_list {dotlrn_student_rel dotlrn_member_rel} + set rol_admin_list {dotlrn_admin_rel dotlrn_cadmin_rel dotlrn_instructor_rel} +} + +set NofSub [db_string select_subgroup_count {} ] +set NofMembers [db_string select_members_count {} ] + +set rels $rol_users_list +set NofUsers [db_string select_members_count_by_type {} ] + +set rels $rol_admin_list +set NofAdmin [db_string select_members_count_by_type {} ] + +set package_key "forums" +if {[db_0or1row select_package_exists {}]} { + set NofForums [db_string select_forums_count {} ] +} + +set package_key "faq" +if {[db_0or1row select_package_exists {}]} { + set NofFaqs [db_string select_faqs_count {} ] +} + +set package_key "news" +if {[db_0or1row select_package_exists {}]} { + set NofNews [db_string select_news_count {} ] +} + +set package_key "survey" +if {[db_0or1row select_package_exists {}]} { + set NofSurveys [db_string select_surveys_count {} ] +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/communities-chunk-large-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-large-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-large-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,38 @@ + + + + postgresql7.1 + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where (h.parent_community_id is not null + or c.club_id = h.community_id) + and ( + lower(h.pretty_name) like lower('%' || :search_text || '%') + or lower(h.community_key) like lower('%' || :search_text || '%') + ) + order by h.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + and ( + lower(dotlrn_communities_full.pretty_name) like lower('%' || :search_text || '%') + or lower(dotlrn_communities_full.community_key) like lower('%' || :search_text || '%') + ) + order by dotlrn_communities_full.pretty_name + + + + Index: openacs-4/packages/user-tracking/www/communities-chunk-large.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-large.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-large.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + +
#dotlrn.Search_Text#
+ +
+ + + + + Index: openacs-4/packages/user-tracking/www/communities-chunk-large.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-large.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-large.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,64 @@ + + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: communities-chunk-large.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {search_text ""} +} -properties { + communities:multirow +} + +if {![exists_and_not_null type]} { + set type "dotlrn_club" +} + +if {![exists_and_not_null referer]} { + set referer "[dotlrn::get_admin_url]/communities-stats" +} + + +form create community_search + +element create community_search search_text \ + -label [_ dotlrn.Search] \ + -datatype text \ + -widget text \ + -value $search_text + +element create community_search type \ + -label [_ dotlrn.Type] \ + -datatype text \ + -widget hidden \ + -value $type + +element create community_search referer \ + -label [_ dotlrn.Referer] \ + -datatype text \ + -widget hidden \ + -value $referer + +if {[form is_valid community_search]} { + form get_values community_search search_text referer + + + set dotlrn_package_id [dotlrn::get_package_id] + set root_object_id [acs_magic_object security_context_root] + set i 1 + + if {[string equal $type "dotlrn_club"] == 1} { + db_multirow communities select_dotlrn_clubs {} { + incr i + } + } else { + db_multirow communities select_dotlrn_classes {} { + incr i + } + } +} else { + multirow create communities dummy +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/communities-chunk-medium-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-medium-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-medium-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,58 @@ + + + + postgresql7.1 + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where (h.parent_community_id is not null + or c.club_id = h.community_id) + and upper(substr(h.pretty_name, 1, 1)) = :section + order by h.pretty_name + + + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where (h.parent_community_id is not null + or c.club_id = h.community_id) + and upper(substr(h.pretty_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by h.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + and upper(substr(dotlrn_communities_full.pretty_name, 1, 1)) = :section + order by dotlrn_communities_full.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + and upper(substr(dotlrn_communities_full.pretty_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by dotlrn_communities_full.pretty_name + + + + Index: openacs-4/packages/user-tracking/www/communities-chunk-medium.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-medium.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-medium.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,6 @@ + +

@control_bar;noquote@

+ + + + Index: openacs-4/packages/user-tracking/www/communities-chunk-medium.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-medium.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-medium.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,52 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: communities-chunk-medium.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {section A} +} -properties { + control_bar:onevalue + communities:multirow +} + +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null type]} { + set type "dotlrn_club" +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/communities-stats" +} + +set dimension_list {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} +foreach dimension $dimension_list { + lappend dimensions [list $dimension $dimension {}] +} +lappend dimensions [list Other Other {}] + +set control_bar [portal::dimensional -no_bars [list [list section {} $section $dimensions]]] + +set i 1 +if {[string equal $type "dotlrn_club"] == 1} { + set query select_dotlrn_clubs + if {[string match Other $section]} { + append query "_other" + } + db_multirow communities $query {} { + incr i + } +} else { + set query select_dotlrn_classes + if {[string match Other $section]} { + append query "_other" + } + db_multirow communities $query {} { + incr i + } +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/communities-chunk-small-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-small-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-small-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,39 @@ + + + + postgresql7.1 + + + + select distinct h.community_key, + h.community_id, + h.pretty_name, + h.parent_community_id + from dotlrn_communities h, dotlrn_clubs c + where h.parent_community_id is not null + or c.club_id = h.community_id + order by h.pretty_name + + + + + + select dotlrn_communities_full.community_key, + dotlrn_communities_full.community_id, + dotlrn_communities_full.pretty_name + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + order by dotlrn_communities_full.pretty_name + + + + + + select dotlrn_communities.community_key, + dotlrn_communities.community_id, + dotlrn_communities.pretty_name + from dotlrn_communities + order by dotlrn_communities.pretty_name + + + Index: openacs-4/packages/user-tracking/www/communities-chunk-small.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-small.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-small.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,2 @@ + + Index: openacs-4/packages/user-tracking/www/communities-chunk-small.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk-small.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk-small.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,41 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: communities-chunk-small.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { +} -properties { + user_id:onevalue + communities:multirow +} + +set user_id [ad_conn user_id] +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null type]} { + set type "dotlrn_club" +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/communities-stats" +} + +# Currently, just present a list of dotLRN communities +set i 1 +if {[string equal $type "dotlrn_club"] == 1} { + db_multirow communities select_dotlrn_clubs {} { + incr i + } +} elseif {[string equal $type "dotlrn_class"] == 1} { + db_multirow communities select_dotlrn_classes {} { + incr i + } +} else { + db_multirow communities select_dotlrn_communities {} { + incr i + } +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/communities-chunk.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,40 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#dotlrn.Community##user-tracking.lt_View_Stats#
+ @communities.pretty_name@ ( @communities.community_id@ ) + + #user-tracking.Stats# +
#dotlrn.No_Communities#
+
+ + + + + Index: openacs-4/packages/user-tracking/www/communities-chunk.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-chunk.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-chunk.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: communities-chunk.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {section ""} +} -properties { + user_id:onevalue +} + +set user_id [ad_conn user_id] + +if {![exists_and_not_null referer]} { + set referer "[dotlrn::get_admin_url]/communities" +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/communities-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/communities-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,31 @@ + + + + postgresql7.1 + + + + select dotlrn_communities_all.*, + dotlrn_community__url(dotlrn_communities_all.community_id) as url, + (CASE + WHEN + dotlrn_communities_all.community_type = 'dotlrn_community' + THEN 'dotlrn_community' + WHEN dotlrn_communities_all.community_type = 'dotlrn_club' + THEN 'dotlrn_club' + ELSE 'dotlrn_class_instance' + END) as simple_community_type, + tree_level(dotlrn_communities_all.tree_sortkey) as tree_level, + coalesce((select tree_level(dotlrn_community_types.tree_sortkey) + from dotlrn_community_types + where dotlrn_community_types.community_type = dotlrn_communities_all.community_type), 0) as community_type_level, + acs_permission__permission_p(dotlrn_communities_all.community_id, :user_id, 'admin') as admin_p + from dotlrn_communities_all, + dotlrn_member_rels_approved + where dotlrn_communities_all.community_id = dotlrn_member_rels_approved.community_id + and dotlrn_member_rels_approved.user_id = :user_id + order by dotlrn_communities_all.tree_sortkey + + + + Index: openacs-4/packages/user-tracking/www/communities-stats-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-stats-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-stats-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,23 @@ + + + + postgresql7.1 + + + + select count(distinct h.community_key) + from dotlrn_communities h, dotlrn_clubs c + where h.parent_community_id is not null + or c.club_id = h.community_id + + + + + + select count(distinct dotlrn_communities_full.community_id) + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + + + + Index: openacs-4/packages/user-tracking/www/communities-stats.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-stats.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-stats.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,36 @@ + + +@page_title;noquote@ +@context;noquote@ + +<% set referer "[user-tracking::get_package_url]/communities-stats" %> + +[ + #user-tracking.lt_Site_Stats# + | + #user-tracking.lt_Communities_Stats# + | + #user-tracking.lt_Users_Stats# + | + #user-tracking.lt_Advanced_Stats# +] + +

+ +

+ +

@control_bar;noquote@

+ + + + + + + + + + + + + + Index: openacs-4/packages/user-tracking/www/communities-stats.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-stats.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-stats.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,36 @@ + +ad_page_contract { + Displays the stats users page + + @author yon (elane@tid.es) + @creation-date 2004-09-15 + @version $Id: communities-stats.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {type "dotlrn_club"} +} -properties { + control_bar:onevalue + n_communities:onevalue +} + +set page_title [_ user-tracking.lt_Communities_Stats_1] +set context [list $page_title] + +set n_clubs [db_string select_dotlrn_clubs_count {}] +set n_classes [db_string select_dotlrn_classes_count {}] + +set dotlrn_community_types [list] +lappend dotlrn_community_types [list dotlrn_club "[_ dotlrn.Communities] ($n_clubs)"] +lappend dotlrn_community_types [list dotlrn_class "[_ dotlrn.Classes] ($n_classes)"] + +set control_bar [ad_dimensional [list [list type "[_ dotlrn.Community_Type]:" $type $dotlrn_community_types]]] + +if {[string equal $type "dotlrn_club"] == 1} { + set n_communities $n_clubs +} elseif {[string equal $type "dotlrn_class"] == 1} { + set n_communities $n_classes +} else { + set n_communities [db_string select_dotlrn_communities_count {}] +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/communities-stats.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/communities-stats.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities-stats.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,12 @@ + + + + + + + select count(*) + from dotlrn_communities + + + + Index: openacs-4/packages/user-tracking/www/communities.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/communities.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,69 @@ + + + +User Tracking + + + + + + +<% + set old_level 0 + set new_level 0 + set depth 0 +%> + + + +<% set new_level $communities(tree_level) %> + + + <% incr depth -1 %> + + + <% while {$depth > 1} { + append close_tags "" + incr depth -1 + } + %> + @close_tags@ + + + + +<% incr depth 1 %> + \n" + } +%> + + + + Index: openacs-4/packages/user-tracking/www/communities.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/communities.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/communities.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,35 @@ + +ad_page_contract { + The display logic for the dotlrn main (Groups) portlet + + @author Arjun Sanyal (arjun@openforce.net) + @version $Id: communities.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} { +} -properties { + title:onevalue + context:onevalue +} + +set context {} +set title {} +if {![exists_and_not_null show_buttons_p]} { + set show_buttons_p 0 +} + +set user_id [ad_conn user_id] +set user_can_browse_p [dotlrn::user_can_browse_p -user_id $user_id] + +set comm_type "" +ns_log notice "hola" +db_multirow communities select_communities {} { + set tree_level [expr $tree_level - $community_type_level] + if {![string equal $simple_community_type dotlrn_community]} { + set comm_type $simple_community_type + } else { + set simple_community_type $comm_type + } +} + +set dotlrn_url [dotlrn::get_url] + +ad_return_template Index: openacs-4/packages/user-tracking/www/dotlrn-admin-master.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/dotlrn-admin-master.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/dotlrn-admin-master.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,27 @@ + + + +@title@ +1 +@focus;noquote@ + +

@title@

+ + + <%= [eval dotlrn::admin_navbar $context_bar] %> + +
+ + + + + + + + + + + + + + Index: openacs-4/packages/user-tracking/www/faq-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/faq-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/faq-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,76 @@ + + + + postgresql7.1 + + + + select ans.question as question, + ans.entry_id as entry_id, + f.faq_id as faq_id, + f.faq_name as faq_name, + (select site_node__url(site_nodes.node_id) + from site_nodes, acs_objects + where site_nodes.object_id = acs_objects.context_id and acs_objects.object_id=f.faq_id) as url, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date + from faq_q_and_as ans, faqs f, acs_objects o + where o.object_id=ans.entry_id + and ans.faq_id=f.faq_id + and o.creation_user= :user_id + + + + + + select f.faq_name as faq_name, + f.faq_id as faq_id, + (select site_node__url(site_nodes.node_id) + from site_nodes, acs_objects + where site_nodes.object_id = acs_objects.context_id and acs_objects.object_id=f.faq_id) as url, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date + from faqs f, acs_objects o, dotlrn_communities com + where o.object_id=f.faq_id + and com.community_id= :community_id + and apm_package__parent_id(o.context_id) = com.package_id + + + + + + select f.faq_name as faq_name, + f.faq_id as faq_id, + (select site_node__url(site_nodes.node_id) + from site_nodes, acs_objects + where site_nodes.object_id = acs_objects.context_id and acs_objects.object_id=f.faq_id) as url, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date + from faqs f, acs_objects o + where o.object_id=f.faq_id + + + + + + select first_names, + last_name, + email, + screen_name, + creation_date as registration_date, + creation_ip, + last_visit, + member_state, + email_verified_p + from cc_users + where user_id = :user_id + + + + + + select distinct h.pretty_name as first_names + from dotlrn_communities h + where h.community_id= :community_id + + + + + Index: openacs-4/packages/user-tracking/www/faq-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/faq-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/faq-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,42 @@ + +@page_title;noquote@ +@context;noquote@ + +

#user-tracking.added_faqs#

+ +
    + + +
  • #dotlrn.Person_name#: @first_names@ @last_name@
  • +
  • #dotlrn.Email# @email@
  • + +
+ +
+ +
+ + + +
  • #user-tracking.ut_Community_Name#
  • + + +
    + +
    +
    +
    + +
    + +
    + + + + + + + + + + Index: openacs-4/packages/user-tracking/www/faq-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/faq-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/faq-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,122 @@ +ad_page_contract { + @author sergiog (sergiog@tid.es) + @author doa (doa@tid.es) + @creation-date 2004-11-23 +} -query { + {user_id ""} + {community_id ""} +} -properties { + faqs:multirow + first_names:onevalue + last_name:onevalue + email:onevalue + user_id:onevalue + +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/communities-stats" +} + +if {![exists_and_not_null user_id]} { + if {![exists_and_not_null community_id]} { + #Only Admins can see this stats + ad_require_permission [ad_conn package_id] "admin" + set query select_site_faqs + } else { + #Only Professor can see this stats + ad_require_permission $community_id "admin" + if {![db_0or1row select_com_data {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_faqs_by_com + } +db_multirow -extend { + faqs_url + posting_date_pretty + entry_url +} faqs $query {} { + + set posting_date_ansi [lc_time_system_to_conn $creation_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set faqs_url "${url}one-faq?faq_id=${faq_id}" + +} +} else { + set new_user_id [ad_conn user_id] + #An user can see his / her own stats + if {![string equal $new_user_id $user_id]} { + ad_require_permission [ad_conn package_id] "admin" + } + if {![db_0or1row select_user_info {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_faqs +db_multirow -extend { + faqs_url + posting_date_pretty + entry_url +} faqs $query {} { + + set posting_date_ansi [lc_time_system_to_conn $creation_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set faqs_url "${url}one-faq?faq_id=${faq_id}" + set entry_url "${url}one-question?entry_id=${entry_id}" + +} +} + + +set page_title [_ user-tracking.Faqs_Stats] +set context [list $page_title] + +#db_multirow faqs select_faqs {} {} + +#ad_return_template +#ad_return_template + +template::list::create \ + -name faqs_q_and_as \ + -multirow faqs \ + -elements { + name { + label "#user-tracking.faq_name#" + link_url_col faqs_url + display_col faq_name + } + question { + label "#user-tracking.faq_question#" + link_url_col entry_url + display_col question + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + + } -filters { + package_id {} + } + +template::list::create \ + -name faqs \ + -multirow faqs \ + -elements { + name { + label "#user-tracking.faq_name#" + link_url_col faqs_url + display_col faq_name + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + + } -filters { + package_id {} + } + + + Index: openacs-4/packages/user-tracking/www/files-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/files-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/files-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,62 @@ +?xml version="1.0"?> + + + postgresql7.1 + + + + select f.name, f.file_id, f.type, f.content_size, + to_char(f.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date, + file_storage__get_package_id(f.parent_id) as package_id, + (select site_node__url(node_id) from site_nodes + where object_id= file_storage__get_package_id(f.parent_id)) as package_url, + o.creation_user + from acs_objects o, fs_files f + where f.file_id=o.object_id and + o.modifying_user= :user_id + and o.creation_user <> :user_id + + + + + + + select content_item__get_root_folder(:file_id); + + + + + + select f.name, f.file_id, f.type, f.content_size, + to_char(f.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date, + file_storage__get_package_id(f.parent_id) as package_id, + (select site_node__url(node_id) from site_nodes + where object_id= file_storage__get_package_id(f.parent_id)) as package_url, + o.creation_user + from acs_objects o, fs_files f + where f.file_id=o.object_id + and o.creation_user= :user_id + + + + + + select first_names, + last_name, + email, + screen_name, + creation_date as registration_date, + creation_ip, + last_visit, + member_state, + email_verified_p + from cc_users + where user_id = :user_id + + + + + + \ No newline at end of file Index: openacs-4/packages/user-tracking/www/files-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/files-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/files-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,24 @@ + +@page_title;noquote@ +@context;noquote@ + +

    #user-tracking.added_files_by#

    + +
      + +
    • #dotlrn.Person_name#: @first_names@ @last_name@
    • +
    • #dotlrn.Email# @email@
    • +

      + +
    +

    #user-tracking.added_files#

    +
    + +
    + + +

    #user-tracking.modified_files#

    +
    + +
    + Index: openacs-4/packages/user-tracking/www/files-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/files-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/files-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,136 @@ +ad_page_contract { + @author sergiog (sergiog@tid.es) + @author doa (doa@tid.es) + @creation-date 2004-11-23 +} -query { + {user_id ""} +} -properties { + created_files:multirow + modified_files:multirow + first_names:onevalue + last_name:onevalue + email:onevalue + user_id:onevalue + +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +if {![exists_and_not_null user_id]} { + ad_returnredirect $referer +} + +if {![db_0or1row select_user_info {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort +} + +set page_title [_ user-tracking.Files_Stats] +set context [list $page_title] + +set new_user_id [ad_conn user_id] +if {![string equal $new_user_id $user_id]} { + ad_require_permission [ad_conn package_id] "admin" +} + + +set query select_created_files +#ad_return_template + +template::list::create \ + -name created_files \ + -multirow created_files \ + -elements { + name { + label "#file-storage.Name#" + link_url_col files_url + display_col name + } + type { + label "#file-storage.Type#" + display_col type + } + size { + label "#file-storage.Size#" + display_col content_size + } + creation_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + last_modified { + label "#file-storage.Last_Modified#" + display_col modified_date_pretty + } + + } -filters { + package_id {} + } + +db_multirow -extend { + files_url + posting_date_pretty + modified_date_pretty +} created_files $query {} { + + set posting_date_ansi [lc_time_system_to_conn $creation_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set modified_date_ansi [lc_time_system_to_conn $creation_date] + set modified_date_pretty [lc_time_fmt $modified_date_ansi "%x %X"] + + set files_url "${package_url}file?file_id=$file_id" + +} + +set query select_modified_files +#ad_return_template + +template::list::create \ + -name modified_files \ + -multirow modified_files \ + -elements { + name { + label "#file-storage.Name#" + link_url_col files_url + display_col name + } + type { + label "#file-storage.Type#" + display_col type + } + size { + label "#file-storage.Size#" + display_col content_size + } + creation_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + last_modified { + label "#file-storage.Last_Modified#" + display_col modified_date_pretty + } + + } -filters { + package_id {} + } + +db_multirow -extend { + files_url + posting_date_pretty + modified_date_pretty +} modified_files $query {} { + + set posting_date_ansi [lc_time_system_to_conn $creation_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set modified_date_ansi [lc_time_system_to_conn $creation_date] + set modified_date_pretty [lc_time_fmt $modified_date_ansi "%x %X"] + + set files_url "${package_url}file?file_id=$file_id" + +} + + +ad_return_template Index: openacs-4/packages/user-tracking/www/forums-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/forums-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/forums-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,103 @@ + + + + postgresql7.1 + + + + select forums_forums.package_id, + acs_object__name(apm_package__parent_id(forums_forums.package_id)) as parent_name, + (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = forums_forums.package_id) as url, + forums_forums.forum_id, + forums_forums.name, + case when last_modified > (cast(current_timestamp as date)- 1) then 't' else 'f' end as new_p, + forums_messages.content + from forums_forums_enabled forums_forums, + acs_objects, forums_messages + where acs_objects.object_id = forums_forums.forum_id + and forums_messages.forum_id=forums_forums.forum_id + and acs_objects.creation_user= :user_id + order by parent_name, + forums_forums.name + + + + + + + select (select site_node__url(site_nodes.node_id) + from site_nodes, acs_objects + where site_nodes.object_id = forums_forums.package_id and acs_objects.object_id = forums_forums.forum_id) as url, + forums_forums.name, + forums_messages.content, + forums_messages.message_id, + forums_messages.subject, + to_char(acs_objects.creation_date, 'YYYY-MM-DD HH24:MI:SS') as posting_date, + forums_forums.forum_id as forum_id + from forums_forums, + acs_objects, forums_messages + where acs_objects.object_id = forums_messages.message_id + and forums_messages.forum_id=forums_forums.forum_id + and acs_objects.creation_user= :user_id + order by forums_forums.name + + + + + + select distinct (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = forums.package_id) as url, + forums.name as name, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as posting_date, + forums.forum_id as forum_id + from forums_forums forums, + acs_objects o, dotlrn_communities com + where o.object_id = forums.forum_id + and com.community_id= :community_id + and apm_package__parent_id(forums.package_id) = com.package_id + order by forums.name + + + + + + select distinct (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = forums.package_id) as url, + forums.name as name, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as posting_date, + forums.forum_id as forum_id + from forums_forums forums, acs_objects o + where o.object_id = forums.forum_id + order by forums.name + + + + + + select first_names, + last_name, + email, + screen_name, + creation_date as registration_date, + creation_ip, + last_visit, + member_state, + email_verified_p + from cc_users + where user_id = :user_id + + + + + + select distinct h.pretty_name as first_names + from dotlrn_communities h + where h.community_id= :community_id + + + + Index: openacs-4/packages/user-tracking/www/forums-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/forums-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/forums-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,39 @@ + +@page_title;noquote@ +@context;noquote@ + +

    #user-tracking.messages_added#

    + +
      + + +
    • #dotlrn.Person_name#: @first_names@ @last_name@
    • +
    • #dotlrn.Email# @email@
    • + +
    + +
    + +
    + + + +
  • #user-tracking.ut_Community_Name#
  • + + +
    + +
    +
    +
    + +
    + +
    +
    + + + + + + Index: openacs-4/packages/user-tracking/www/forums-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/forums-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/forums-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,147 @@ +ad_page_contract { + @author sergiog (sergiog@tid.es) + @author doa (doa@tid.es) + @creation-date 2004-11-23 +} -query { + {user_id ""} + {community_id ""} +} -properties { + forums:multirow +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/communities-stats" +} + +#if {![exists_and_not_null user_id]} { +# #Si no hay user_id redireccionamos a la seleccion de usuarios +# ad_returnredirect $referer +#} + +#if {![db_0or1row select_user_info {}]} { +# ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " +# ad_script_abort +#} + +set page_title [_ user-tracking.Forums_Stats] +set context [list $page_title] + +#set query select_forums +#ad_return_template + +template::list::create \ + -name forums_messages \ + -multirow forums \ + -elements { + forum { + label "#user-tracking.Forum_Name#" + display_template { + + + @forums.name@ + <% set name @forums.name@ %> + + } + } + message { + label "#user-tracking.Subject#" + link_url_col message_url + display_col subject + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + + } -filters { + forum_id {} + } + +template::list::create \ + -name forums \ + -multirow forums \ + -elements { + forum { + label "#user-tracking.Forum_Name#" + display_template { + + + @forums.name@ + <% set name @forums.name@ %> + + } + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + + } -filters { + forum_id {} + } + +if {![exists_and_not_null user_id]} { + if {![exists_and_not_null community_id]} { + #Admin + ad_require_permission [ad_conn package_id] "admin" + set query select_site_forums + db_multirow -extend { + forum_url + posting_date_pretty + } forums $query {} { + + set posting_date_ansi [lc_time_system_to_conn $posting_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set forum_url "${url}forum-view?forum_id=$forum_id" + + } + } else { + #Proffesor + ad_require_permission $community_id "admin" + if {![db_0or1row select_com_data {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_forums_by_com + db_multirow -extend { + forum_url + posting_date_pretty + } forums $query {} { + + set posting_date_ansi [lc_time_system_to_conn $posting_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set forum_url "${url}forum-view?forum_id=$forum_id" + + } + } +} else { + set new_user_id [ad_conn user_id] + if {![string equal $new_user_id $user_id]} { + ad_require_permission [ad_conn package_id] "admin" + } + if {![db_0or1row select_user_info {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_forums + db_multirow -extend { + message_url + forum_url + posting_date_pretty + } forums $query {} { + + set posting_date_ansi [lc_time_system_to_conn $posting_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set message_url "${url}message-view?message_id=$message_id" + set forum_url "${url}forum-view?forum_id=$forum_id" + + } +} + + + +if {[exists_and_not_null alt_template]} { + ad_return_template $alt_template +} + + Index: openacs-4/packages/user-tracking/www/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/index.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/index.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,22 @@ + +@title;noquote@ +@context;noquote@ + + + +

    + + + + +
    + [#user-tracking.Administer#] +
    + + +

    Index: openacs-4/packages/user-tracking/www/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/index.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/index.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,23 @@ +# index.tcl + +ad_page_contract { + +} { + +} -properties { + + + title:onevalue + context:onevalue + admin_p:onevalue + +} + +set title [_ user-tracking.User_Tracking_Home] +set context "" + +set package_id [ad_conn package_id] + +set admin_p [ad_permission_p $package_id admin] + + Index: openacs-4/packages/user-tracking/www/lanza-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/lanza-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/lanza-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,35 @@ + + + + postgresql7.1 + + + + select * + from acs_rels + where object_id_one = :community_id and + (rel_type = 'dotlrn_instructor_rel' or + rel_type = 'dotlrn_professor_profile_rel') + + + + + + select object_id_two + from acs_rels + where object_id_one = :community_id and + (rel_type = 'dotlrn_admin_rel' or + rel_type = 'dotlrn_admin_profile_rel' or + rel_type = 'dotlrn_cadmin_rel') + + + + + select * + from dotlrn_users + where user_id = :user_id and + type = 'admin' + + + + Index: openacs-4/packages/user-tracking/www/lanza.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/lanza.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/lanza.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,137 @@ +# E-Lane 19-10-2004 +# Lanzador de awstats, comprobando Permisos +# Version 0.1b +# Author E-Lane TID + +ad_page_contract { + Displays the stats users page + + @author sergiog (sergiog@tid.es) + @author doa (doa@tid.es) + @creation-date 2004-10-19 + @version $Id: lanza.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {community_id ""} + {user_id ""} + {onlyusers ""} + {onlylines ""} + {config ""} + {sitedomain ""} +} -properties { + user_id:onevalue + community_id:onevalue +} + +# First of all, we have to delete all blank spaces +regsub -all -- "(%20)+" $onlylines " " onlylines +regsub -all -- "\[\\t \\r\\n\]+" $onlylines " " onlylines +regsub -all -- "(%20)+" $onlyusers " " onlyusers +regsub -all -- "\[\\t \\r\\n\]+" $onlyusers " " onlyusers + + +# If we don�t receive any value, we do nothing +if {[empty_string_p $community_id] && [empty_string_p $onlyusers] && [empty_string_p $onlylines] && [empty_string_p $config]} { + ns_log notice "No hay community Id, hace falta ser Adminisrtador" + ad_require_permission [ad_conn package_id] "admin" +# ad_returnredirect [user-tracking::get_package_url] + ad_returnredirect "/user-tracking" +} + +#Add the prefer language of the user, if it isn�t implemented we use english by default +set Language [lang::conn::locale] + +switch $Language { + en_Us {set parseString "&lang=en"} + es_ES {set parseString "&lang=es"} + de_DE {set parseString "&lang=de"} + fr_FR {set parseString "&lang=fr"} + ar_LB {set parseString "&lang=ar"} + hu_HU {set parseString "&lang=hu"} + pt_PT {set parseString "&lang=pt"} + ro_RO {set parseString "&lang=ro"} + ru_RU {set parseString "&lang=ru"} + sv_SE {set parseString "&lang=se"} + it_IT {set parseString "&lang=it"} + gl_ES {set parseString "&lang=gl"} + zh_CN {set parseString "&lang=cn"} + zh_TW {set parseString "&lang=cn"} + da_DK {set parseString "&lang=dk"} + en_GB {set parseString "&lang=en"} + el_GR {set parseString "&lang=gr"} + ja_JP {set parseString "&lang=jp"} + ko_KR {set parseString "&lang=kr"} + nn_NO {set parseString "&lang=nn"} + no_NO {set parseString "&lang=nb"} + pl_PL {set parseString "&lang=pl"} + tr_TR {set parseString "&lang=tr"} + default {set parseString "&lang=en"} +} + +#parseString contains all the parameters we need to pass awstats +if {[empty_string_p $config]} { + append parseString "&config=site" +} else { + append parseString "&config=$config" +} + +if {![empty_string_p $sitedomain]} { + append parseString "&sitedomain=$sitedomain" +} + + +#Depend on kind of report, required permission will be different +if {[empty_string_p $community_id] } { + if {![empty_string_p $user_id]} { + set new_user_id [ad_conn user_id] + if {[string equal $new_user_id $user_id]} { + append parseString "&onlyusers=$user_id" + } else { + ad_require_permission [ad_conn package_id] "admin" + append parseString "&onlyusers=$user_id" + } + } else { + ns_log notice "Informe general, hace falta ser Adminisrtador" + ad_require_permission [ad_conn package_id] "admin" + if {![empty_string_p $onlyusers]} { + append parseString "&onlyusers=$onlyusers" + } + if {![empty_string_p $onlylines]} { + set auxParse "" + foreach aux [split $onlylines] { + if {![empty_string_p $aux]} { + set auxParse "REGEX\[.*community_id=$aux.*\] $auxParse" + } + } + if {![empty_string_p $auxParse]} { + append parseString "&onlylines=$auxParse" + } + } + + ns_log notice "informe general: Vamos a llamar a awstats con los parametros: $parseString" + } + ad_returnredirect "/user-tracking/awstats/cgi-bin/awstatsDirecto.pl?$parseString&update=1" +} else { + if {![empty_string_p $user_id]} { + set new_user_id [ad_conn user_id] + if {[string equal $new_user_id $user_id]} { + ad_require_permission $community_id "read" + ns_log notice "Estadisticas de un usuario, se permite solo con pertenecer: $parseString" + append parseString "&onlyusers=$user_id" + } else { + ad_require_permission [ad_conn package_id] "admin" + ns_log notice "No es el mismo usuario,solo dejamos si es admin: $parseString" + append parseString "&onlyusers=$user_id" + } + } else { + ns_log notice "Informe de clase, profesor" + ad_require_permission $community_id "admin" + if {![empty_string_p $onlyusers]} { + append parseString "&onlyusers=$onlyusers" + } + } + + append parseString "&onlylines=REGEX\[.*community_id=$community_id.*\]" + ns_log notice "Informe de profe: Vamos a llamar a awstats con los parametros: $parseString" + ad_returnredirect "/user-tracking/awstats/cgi-bin/awstatsDirecto.pl?$parseString&update=1" +} + Index: openacs-4/packages/user-tracking/www/news-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/news-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/news-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,155 @@ + + + + postgresql7.1 + + + + select news_items_approved.package_id, + acs_object__name(apm_package__parent_id(news_items_approved.package_id)) as parent_name, + (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = news_items_approved.package_id) as url, + news_items_approved.item_id, + news_items_approved.publish_title, + to_char(news_items_approved.publish_date, 'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi + from news_items_approved + where news_items_approved.publish_date < current_timestamp + and (news_items_approved.archive_date >= current_timestamp or news_items_approved.archive_date is null) + and news_items_approved.creation_user= :user_id + order by news_items_approved.publish_date desc, + news_items_approved.publish_title + + + + + + + select news_items_approved.package_id, + acs_object__name(apm_package__parent_id(news_items_approved.package_id)) as parent_name, + (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = news_items_approved.package_id) as url, + news_items_approved.item_id, + news_items_approved.publish_title, + to_char(news_items_approved.publish_date, 'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi + from news_items_approved + where (news_items_approved.publish_date >= current_timestamp + or news_items_approved.archive_date < current_timestamp) + and news_items_approved.creation_user= :user_id + order by news_items_approved.publish_date desc, + news_items_approved.publish_title + + + + + + select distinct news.package_id, + acs_object__name(apm_package__parent_id(news.package_id)) as parent_name, + (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = news.package_id) as url, + news.item_id, + news.publish_title, + to_char(news.publish_date, 'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi + from news_items_approved news, dotlrn_communities com + where news.publish_date < current_timestamp + and (news.archive_date >= current_timestamp or news.archive_date is null) + and com.community_id= :community_id + and apm_package__parent_id(news.package_id) = com.package_id + order by publish_date_ansi desc, + news.publish_title + + + + + + + select distinct news.package_id, + acs_object__name(apm_package__parent_id(news.package_id)) as parent_name, + (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = news.package_id) as url, + news.item_id, + news.publish_title, + to_char(news.publish_date, 'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi + from news_items_approved news, dotlrn_communities com + where (news.publish_date >= current_timestamp + or news.archive_date < current_timestamp) + and com.community_id= :community_id + and apm_package__parent_id(news.package_id) = com.package_id + order by publish_date_ansi desc, + news.publish_title + + + + + + select distinct news.package_id, + acs_object__name(apm_package__parent_id(news.package_id)) as parent_name, + (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = news.package_id) as url, + news.item_id, + news.publish_title, + to_char(news.publish_date, 'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi + from news_items_approved news + where news.publish_date < current_timestamp + and (news.archive_date >= current_timestamp or news.archive_date is null) + order by publish_date_ansi desc, + news.publish_title + + + + + + + select distinct news.package_id, + acs_object__name(apm_package__parent_id(news.package_id)) as parent_name, + (select site_node__url(site_nodes.node_id) + from site_nodes + where site_nodes.object_id = news.package_id) as url, + news.item_id, + news.publish_title, + to_char(news.publish_date, 'YYYY-MM-DD HH24:MI:SS') as publish_date_ansi + from news_items_approved news + where (news.publish_date >= current_timestamp + or news.archive_date < current_timestamp) + order by publish_date_ansi desc, + news.publish_title + + + + + + select first_names, + last_name, + email, + screen_name, + creation_date as registration_date, + creation_ip, + last_visit, + member_state, + email_verified_p + from cc_users + where user_id = :user_id + + + + + + select count(*) + from acs_objects + where creation_user = :user_id + + + + + + select distinct h.pretty_name as first_names + from dotlrn_communities h + where h.community_id= :community_id + + + + \ No newline at end of file Index: openacs-4/packages/user-tracking/www/news-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/news-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/news-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,38 @@ + +@page_title;noquote@ +@context;noquote@ + + +

    #user-tracking.Added_news#

    + +
      + + +
    • #dotlrn.Person_name#: @first_names@ @last_name@
    • +
    • #dotlrn.Email# @email@
    • + +
    +
    + +
  • #user-tracking.ut_Community_Name#
  • + +
    +
    + +
    +

    #user-tracking.Active_news#

    + +
    +
    +
    +
    +

    #user-tracking.Non_active_news#

    + +
    +
    +
    + + + + + Index: openacs-4/packages/user-tracking/www/news-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/news-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/news-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,133 @@ +ad_page_contract { + @author sergiog (sergiog@tid.es) + @author doa (doa@tid.es) + @creation-date 2004-11-23 +} -query { + {user_id ""} + {community_id ""} +} -properties { + active_news:multirow + non_active_news:multirow + first_names:onevalue + last_name:onevalue + email:onevalue + user_id:onevalue + +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +if {![exists_and_not_null user_id]} { + if {![exists_and_not_null community_id]} { + #Admin + ad_require_permission [ad_conn package_id] "admin" + set query select_site_active_news + set queryb select_site_non_active_news + } else { + #Profesor + ad_require_permission $community_id "admin" + if {![db_0or1row select_com_data {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_active_news_by_com + set queryb select_non_active_news_by_com + } +} else { + set new_user_id [ad_conn user_id] + if {![string equal $new_user_id $user_id]} { + ad_require_permission [ad_conn package_id] "admin" + } + + if {![db_0or1row select_user_info {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_active_news + set queryb select_non_active_news +} + +#if {![exists_and_not_null user_id]} { +# #Si no hay user_id redireccionamos a la seleccion de usuarios +# ad_returnredirect $referer +#} + +#if {![db_0or1row select_user_info {}]} { +# ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " +# ad_script_abort +#} + +#Hay que modificar el titulo de la pagina +set page_title [_ user-tracking.News_Stats] +set context [list $page_title] + +# db_multirow active_news select_active_news {} {} + +# db_multirow non_active_news select_non_active_news {} {} + +#set query select_active_news +#ad_return_template + +template::list::create \ + -name active_news \ + -multirow active_news \ + -elements { + title { + label "#user-tracking.news_title#" + link_url_col news_url + display_col publish_title + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + + } -filters { + package_id {} + } + +db_multirow -extend { + news_url + posting_date_pretty +} active_news $query {} { + + set posting_date_pretty [lc_time_fmt $publish_date_ansi "%x %X"] + set news_url "${url}item?item_id=$item_id" + +} + +#set queryb select_non_active_news + +template::list::create \ + -name non_active_news \ + -multirow non_active_news \ + -elements { + title { + label "#user-tracking.news_title#" + link_url_col news_url + display_col publish_title + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + + } -filters { + package_id {} + } + +db_multirow -extend { + news_url + posting_date_pretty +} non_active_news $queryb {} { + + set posting_date_pretty [lc_time_fmt $publish_date_ansi "%x %X"] + set news_url "${url}item?item_id=$item_id" + +} + +if {[exists_and_not_null alt_template]} { + ad_return_template $alt_template +} Index: openacs-4/packages/user-tracking/www/registration-history-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/registration-history-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/registration-history-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,32 @@ + + + + + + + select to_char(creation_date,'YYYYMM') as sort_key, + rtrim(to_char(creation_date,'Month')) as pretty_month, + to_char(creation_date,'YYYY') as pretty_year, + count(*) as n_new + from users, acs_objects + where users.user_id = acs_objects.object_id + and creation_date is not null + and user_id <> 0 + group by to_char(creation_date,'YYYYMM'), to_char(creation_date,'Month'), to_char(creation_date,'YYYY') + order by 1 + + + + + + select max(t1.n_new) as MaxReg + from (select count(*) as n_new + from users, acs_objects + where users.user_id = acs_objects.object_id + and creation_date is not null + group by to_char(creation_date,'YYYYMM'), to_char(creation_date,'Month'), to_char(creation_date,'YYYY')) as t1 + + + + + Index: openacs-4/packages/user-tracking/www/registration-history.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/registration-history.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/registration-history.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,6 @@ + +#user-tracking.ut_Register_Historic# +@context;noquote@ + + + Index: openacs-4/packages/user-tracking/www/registration-history.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/registration-history.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/registration-history.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,68 @@ +ad_page_contract { + displays a table of number of registrations by month + + @author philg@mit.edu + @creation-date Jan 1999 + @cvs-id $Id: registration-history.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ + @modified by sergiog@tid.es +} -properties { + context:onevalue + user_rows:multirow + MaxReg:onevalue + temp:onevalue +} + + +#Only Admin can see this stats +ad_require_permission [ad_conn package_id] "admin" + + +set context [list [list "./site-card" "#user-tracking.lt_Site_Stats#"] "[_ user-tracking.lt_Site_Stats]"] +set page_title [_ user-tracking.ut_Registration_Historic] + +# we have to query for pretty month and year separately because Oracle pads +# month with spaces that we need to trim + +set temp 0 +set MaxReg 10 + + +set query registrations + +db_0or1row max_register {} + +template::list::create \ + -name registrations \ + -multirow registrations \ + -pass_properties temp \ + -elements { + year { + label #user-tracking.year# + display_col pretty_year + } + month { + label #user-tracking.month# + display_col pretty_month + } + MaxReg { + label "#user-tracking.registers#" + display_template { + + } + } + NofReg { + label "#user-tracking.registers_number#" + display_col n_new + } + + } -filters { + sort_key {} + } + +db_multirow -extend { + temp1 +} registrations $query {} { +set temp1 [expr $n_new*100/$MaxReg] +} + +#ad_return_template Index: openacs-4/packages/user-tracking/www/registration-history_old.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/registration-history_old.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/registration-history_old.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,62 @@ +ad_page_contract { + displays a table of number of registrations by month + + @author philg@mit.edu + @creation-date Jan 1999 + @cvs-id $Id: registration-history_old.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ + @modified by sergiog@tid.es +} -properties { + context:onevalue + user_rows:multirow + MaxReg:onevalue + temp:onevalue +} + +set context [list [list "./" "Users"] "Registration History"] + +# we have to query for pretty month and year separately because Oracle pads +# month with spaces that we need to trim + +set temp 0 +set MaxReg 10 + +db_multirow user_rows user_rows "select to_char(creation_date,'YYYYMM') as sort_key, rtrim(to_char(creation_date,'Month')) as pretty_month, to_char(creation_date,'YYYY') as pretty_year, count(*) as n_new + from users, acs_objects + where users.user_id = acs_objects.object_id + and creation_date is not null + group by to_char(creation_date,'YYYYMM'), to_char(creation_date,'Month'), to_char(creation_date,'YYYY') + order by 1" + +db_0or1row max_register {} + +template::list::create \ + -name registrations \ + -multirow user_rows \ + -pass_properties { MaxReg } \ + -elements { + year { + label "Año" + display_col pretty_year + } + month { + label "Mes" + display_col pretty_month + } + MaxReg { + label "Registros" + display_template { + <% set temp [expr @n_new@*100/@MaxReg@] %> + @ancho_col@ + } + } + NofReg { + label "Número de registros" + display_col n_new + } + + } -filters { + sort_key {} + } + + +ad_return_template Index: openacs-4/packages/user-tracking/www/site-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/site-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/site-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,157 @@ + + + + postgresql7.1 + + + + + select count(u.user_id) as n_users, + to_char(max(creation_date), 'YYYY-MM-DD HH24:MI:SS') as last_registration, + to_char(max(u.last_visit), 'YYYY-MM-DD HH24:MI:SS') as last_visit, + sum(u.n_sessions) as total_visits + from users u, + acs_objects o + where o.object_id = u.user_id + and user_id <> 0 + + + + + + select count (*) + from dotlrn_users + + + + + + select count (*) + from dotlrn_communities h, dotlrn_clubs c + where h.parent_community_id is not null + or c.club_id = h.community_id + + + + + + select count (*) + from dotlrn_classes, dotlrn_communities_full + where dotlrn_communities_full.community_type = dotlrn_classes.class_key + + + + + + select cr_items.live_revision as revision_id, + coalesce(cr_revisions.title, 'view this portrait') as portrait_title + from acs_rels, + cr_items, + cr_revisions + where acs_rels.object_id_two = cr_items.item_id + and cr_items.live_revision = cr_revisions.revision_id + and acs_rels.object_id_one = :user_id + and acs_rels.rel_type = 'user_portrait_rel' + + + + + + select dotlrn_class_instances_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_class_instances_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_class_instances_full.class_instance_id + order by dotlrn_class_instances_full.department_name, + dotlrn_class_instances_full.department_key, + dotlrn_class_instances_full.pretty_name, + dotlrn_class_instances_full.community_key + + + + + + select dotlrn_clubs_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_clubs_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_clubs_full.club_id + order by dotlrn_clubs_full.pretty_name, + dotlrn_clubs_full.community_key + + + + + + select dotlrn_communities.*, + dotlrn_community__url(dotlrn_communities.community_id) as url, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_communities, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_communities.community_id + and dotlrn_communities.community_type = 'dotlrn_community' + order by dotlrn_communities.pretty_name, + dotlrn_communities.community_key + + + + + select count(distinct community_id) + from dotlrn_communities + where parent_community_id= :community_id + + + + + + select count (distinct acs_rels.object_id_two) + from acs_rels, dotlrn_users + where acs_rels.rel_type in ('[join $rels "\', \'"]') + and dotlrn_users.user_id=acs_rels.object_id_two + + + + + + select count(distinct forums.forum_id) + from forums_forums_enabled forums + + + + + + select count(distinct f.faq_id) + from faqs f + + + + + + select count(distinct n.item_id) + from news_items_approved n + + + + + + select count(distinct s.survey_id) + from surveys s + + + + + + select distinct package_key from apm_packages where package_key= :package_key + + + + Index: openacs-4/packages/user-tracking/www/site-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/site-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/site-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,61 @@ + + +@page_title;noquote@ +@context;noquote@ + +[ + #user-tracking.lt_Site_Stats# + | + #user-tracking.lt_Communities_Stats# + | + #user-tracking.lt_Users_Stats# + | + #user-tracking.lt_Advanced_Stats_1# +] + +

    +

    + +

    #user-tracking.lt_Site_Stats#

    + + + + + Index: openacs-4/packages/user-tracking/www/site-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/site-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/site-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,91 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: site-card.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {NofMembers ""} + {NofUsers ""} + {LastVisit ""} + {LastRegistration ""} + {TotalVisits ""} + {NofClasses ""} + {NofCommunities ""} + {NofForums ""} + {NofFaqs ""} + {NofNews ""} + {NofSurveys ""} + +} -properties { + NofMembers:onevalue + NofUsers:onevalue + LastVisit:onevalue + LastRegistration:onevalue + TotalVisits:onevalue + NofClasses:onevalue + NofCommunities:onevalue + NofForums:onevalue + NofFaqs:onevalue + NofNews:onevalue + NofSurveys:onevalue +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +#Admin +ad_require_permission [ad_conn package_id] "admin" + +#Hay que modificar el titulo de la pagina +set page_title [_ user-tracking.lt_Site_Stats] +set context [list $page_title] + +db_1row select_n_users {} +set NofMembers $n_users + set LastRegistration_ansi [lc_time_system_to_conn $last_registration] + set LastRegistration [lc_time_fmt $LastRegistration_ansi "%x %X"] + + set LastVisit_ansi [lc_time_system_to_conn $last_visit] + set LastVisit [lc_time_fmt $LastVisit_ansi "%x %X"] +set TotalVisits $total_visits + + + +set rol_users_list {dotlrn_student_rel dotlrn_member_rel membership_rel dotlrn_non_guest_rel dotlrn_student_profile_rel} +set rol_admin_list {dotlrn_admin_rel dotlrn_cadmin_rel dotlrn_instructor_rel dotlrn_admin_profile_rel dotlrn_professor_profile_rel} + +set rels $rol_users_list +set NofUsers [db_string select_members_count_by_type {} ] + +set rels $rol_admin_list +set NofAdmin [db_string select_members_count_by_type {} ] + + +set NofClasses [db_string select_classes_count {} ] + +set NofCommunities [db_string select_clubs_count {} ] + +set package_key "forums" +if {[db_0or1row select_package_exists {}]} { + set NofForums [db_string select_forums_count {} ] +} + +set package_key "faq" +if {[db_0or1row select_package_exists {}]} { + set NofFaqs [db_string select_faqs_count {} ] +} + +set package_key "news" +if {[db_0or1row select_package_exists {}]} { + set NofNews [db_string select_news_count {} ] +} + +set package_key "survey" +if {[db_0or1row select_package_exists {}]} { + set NofSurveys [db_string select_surveys_count {} ] +} + + +ad_return_template + Index: openacs-4/packages/user-tracking/www/survey-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/survey-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/survey-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,69 @@ +?xml version="1.0"?> + + + postgresql7.1 + + + + select s.survey_id, s.name, s.editable_p, s.single_response_p, + sr.response_id, to_char(sr.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date, + s.package_id + from surveys s, survey_responses_latest sr + where s.enabled_p='t' + and s.survey_id = sr.survey_id + and sr.initial_user_id= :user_id + order by upper(s.name) + + + + + + select s.survey_id, s.name, s.editable_p, s.single_response_p, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date, + s.package_id + from surveys s, dotlrn_communities com, acs_objects o + where s.enabled_p='t' + and o.object_id=s.survey_id + and com.community_id= 3461 + and apm_package__parent_id(s.package_id) = com.package_id + order by upper(s.name) + + + + + + select s.survey_id, s.name, s.editable_p, s.single_response_p, + to_char(o.creation_date, 'YYYY-MM-DD HH24:MI:SS') as creation_date, + s.package_id + from surveys s, acs_objects o + where s.enabled_p='t' + and o.object_id=s.survey_id + order by upper(s.name) + + + + + + select first_names, + last_name, + email, + screen_name, + creation_date as registration_date, + creation_ip, + last_visit, + member_state, + email_verified_p + from cc_users + where user_id = :user_id + + + + + + select distinct h.pretty_name as first_names + from dotlrn_communities h + where h.community_id= :community_id + + + + \ No newline at end of file Index: openacs-4/packages/user-tracking/www/survey-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/survey-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/survey-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,34 @@ + +@page_title;noquote@ +@context;noquote@ + +

    #user-tracking.added_survey#

    + +
      + + +
    • #dotlrn.Person_name#: @first_names@ @last_name@
    • +
    • #dotlrn.Email# @email@
    • + +
    + +
    + +
    + + + +
  • #user-tracking.ut_Community_Name#
  • + + +
    + +
    +
    +
    + +
    +
    +
    +

    + Index: openacs-4/packages/user-tracking/www/survey-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/survey-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/survey-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,145 @@ +ad_page_contract { + @author sergiog (sergiog@tid.es) + @author doa (doa@tid.es) + @creation-date 2004-11-23 +} -query { + {user_id ""} + {community_id ""} +} -properties { + surveys:multirow + first_names:onevalue + last_name:onevalue + email:onevalue + user_id:onevalue + +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +if {![exists_and_not_null user_id]} { + if {![exists_and_not_null community_id]} { + #Admin + ad_require_permission [ad_conn package_id] "admin" + set query select_site_surveys + db_multirow -extend { + posting_date_pretty + url + goto + } surveys $query {} { + set posting_date_ansi [lc_time_system_to_conn $creation_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set url [site_node::get_url_from_object_id -object_id $package_id] + set url "${url}one-survey?survey_id=${survey_id}" + set goto "#user-tracking.survey_goto#" + } + } else { + #Proffesor + ad_require_permission $community_id "admin" + if {![db_0or1row select_com_data {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_survey_by_com + db_multirow -extend { + posting_date_pretty + url + goto + } surveys $query {} { + + set posting_date_ansi [lc_time_system_to_conn $creation_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set url [site_node::get_url_from_object_id -object_id $package_id] + set url "${url}one-survey?survey_id=${survey_id}" + set goto "#user-tracking.survey_goto#" + + } + } +} else { + set new_user_id [ad_conn user_id] + if {![string equal $new_user_id $user_id]} { + ad_require_permission [ad_conn package_id] "admin" + } + + if {![db_0or1row select_user_info {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort + } + set query select_survey + db_multirow -extend { + survey_url + posting_date_pretty + url + goto + } surveys $query {} { + + set posting_date_ansi [lc_time_system_to_conn $creation_date] + set posting_date_pretty [lc_time_fmt $posting_date_ansi "%x %X"] + set url [site_node::get_url_from_object_id -object_id $package_id] + set survey_url "${url}one-respondent?survey_id=$survey_id#$response_id" + set url "${url}one-survey?survey_id=${survey_id}" + set goto "#user-tracking.survey_goto#" + } +} + +#if {![exists_and_not_null user_id]} { +# #Si no hay user_id redireccionamos a la seleccion de usuarios +# ad_returnredirect $referer +#} + +#if {![db_0or1row select_user_info {}]} { +# ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " +# ad_script_abort +#} + +set page_title [_ user-tracking.Surveys_Stats] +set context [list $page_title] + +#db_multirow surveys select_survey {} { +#} + +#ad_return_template +#set query select_survey + +template::list::create \ + -name surveys \ + -multirow surveys \ + -elements { + title { + label "#user-tracking.survey_title#" + link_url_col url + display_col name + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + } -filters { + package_id {} + } + +template::list::create \ + -name surveys_responses \ + -multirow surveys \ + -elements { + title { + label "#user-tracking.survey_title#" + link_url_col url + display_col name + } + posting_date { + label "#user-tracking.Post_Date#" + display_col posting_date_pretty + } + goto { + label "#user-tracking.survey_goto#" + link_url_col survey_url + display_col goto + } + + } -filters { + package_id {} + } + +ad_return_template Index: openacs-4/packages/user-tracking/www/users-card-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-card-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-card-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,111 @@ + + + + postgresql7.1 + + + + select first_names, + last_name, + email, + screen_name, + creation_date as registration_date, + creation_ip, + last_visit, + member_state, + email_verified_p + from cc_users + where user_id = :user_id + + + + + + select dotlrn_class_instances_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_class_instances_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_class_instances_full.class_instance_id + order by dotlrn_class_instances_full.department_name, + dotlrn_class_instances_full.department_key, + dotlrn_class_instances_full.pretty_name, + dotlrn_class_instances_full.community_key + + + + + + select dotlrn_clubs_full.*, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_clubs_full, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_clubs_full.club_id + order by dotlrn_clubs_full.pretty_name, + dotlrn_clubs_full.community_key + + + + + + select dotlrn_communities.*, + dotlrn_community__url(dotlrn_communities.community_id) as url, + dotlrn_member_rels_approved.rel_type, + dotlrn_member_rels_approved.role, + '' as role_pretty_name + from dotlrn_communities, + dotlrn_member_rels_approved + where dotlrn_member_rels_approved.user_id = :user_id + and dotlrn_member_rels_approved.community_id = dotlrn_communities.community_id + and dotlrn_communities.community_type = 'dotlrn_community' + order by dotlrn_communities.pretty_name, + dotlrn_communities.community_key + + + + + + select count(*) + from acs_objects + where creation_user = :user_id + + + + + + select count(*) + from acs_objects + where creation_user = :user_id + and object_type= :object_type + + + + + + select count(ans.question) + from faq_q_and_as ans, faqs f, acs_objects o + where o.object_id=ans.entry_id + and ans.faq_id=f.faq_id + and o.creation_user= :user_id + + + + + select count(news_items_approved.publish_title) + from news_items_approved + where news_items_approved.creation_user= :user_id + + + + + + select distinct package_key from apm_packages where package_key= :package_key + + + + Index: openacs-4/packages/user-tracking/www/users-card.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-card.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-card.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,101 @@ + + +@page_title;noquote@ +@context;noquote@ + +[ + #user-tracking.lt_Site_Stats# + | + #user-tracking.lt_Communities_Stats# + | + #user-tracking.lt_Users_Stats# + | + #user-tracking.lt_Advanced_Stats_1# +] + +

    +

    + +

    #dotlrn.General_Information#

    + +
      +
    • #dotlrn.Person_name#: @first_names@ @last_name@
    • +
    • #dotlrn.Email#: @email@
    • +
    • #dotlrn.Screen_name#: @screen_name@
    • +
    • #dotlrn.User_ID#: @user_id@
    • +
    • #dotlrn.Registration_date# @registration_date@
    • + +
    • #dotlrn.Last_Visit#: @last_visit@
    • +
      +
    • #user-tracking.lt_View_Stats#
    • +

      + +
    + + + +
    +

    #dotlrn.class_memberships#

    + +
    +
    + + +
    +

    #dotlrn.community_memberships#

    + +
    +
    + + +
    +

    #dotlrn.subcommunity_memberships#

    + +
    +
    + + +
    +

    #user-tracking.ut_User_has_Added# @total_posted@ #user-tracking.ut_Site_objects#

    + +
    +
    + Index: openacs-4/packages/user-tracking/www/users-card.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-card.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-card.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,133 @@ + + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: users-card.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {user_id ""} + {first_names ""} + {last_name ""} + {email ""} + {screen_name ""} + {user_id ""} + {registration_date ""} + {last_visit ""} + {total_posted ""} + {faq_posted ""} + {news_posted ""} + {surveys_posted ""} + {forum_posted ""} + {files_posted ""} +} -properties { + first_names:onevalue + last_name:onevalue + email:onevalue + screen_name:onevalue + user_id:onevalue + registration_date:onevalue + last_visit:onevalue + member_classes:multirow + member_clubs:multirow + member_subgroups:multirow + total_posted:onevalue + faq_posted:onevalue + news_posted:onevalue + surveys_posted:onevalue + forum_posted:onevalue + files_posted:onevalue +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +if {![exists_and_not_null user_id]} { + ad_returnredirect $referer +} + +if {![empty_string_p $user_id]} { + set new_user_id [ad_conn user_id] + if {![string equal $new_user_id $user_id]} { + ad_require_permission [ad_conn package_id] "admin" + } +} + + +#Hay que modificar el titulo de la pagina +set page_title [_ user-tracking.User_Stats] +set context [list $page_title] + +if {![db_0or1row select_user_info {}]} { + ad_return_complaint 1 "
  • [_ dotlrn.couldnt_find_user_id [list user_id $user_id]]
  • " + ad_script_abort +} + +if {[empty_string_p $screen_name]} { + set screen_name "<[_ dotlrn.none_set_up]>" +} +set registration_date [lc_time_fmt $registration_date "%q"] +if {![empty_string_p $last_visit]} { + set last_visit [lc_time_fmt $last_visit "%q"] +} + +db_multirow member_classes select_member_classes {} { + set role_pretty_name [dotlrn_community::get_role_pretty_name -community_id $class_instance_id -rel_type $rel_type] +} +db_multirow member_clubs select_member_clubs {} { + set role_pretty_name [dotlrn_community::get_role_pretty_name -community_id $club_id -rel_type $rel_type] +} +db_multirow member_subgroups select_member_subgroups {} { + set role_pretty_name [dotlrn_community::get_role_pretty_name -community_id $community_id -rel_type $rel_type] +} + +set package_key "faq" +if {[db_0or1row select_package_exists {}]} { + set object_type "faq" + set faq_posted [db_string select_faq_count {} ] +} else { + set faq_posted 0 +} + +set package_key "news" +if {[db_0or1row select_package_exists {}]} { + set object_type "content_item" + set news_posted [db_string select_news_count {} ] +} else { + set news_posted 0 +} + +set package_key "survey" +if {[db_0or1row select_package_exists {}]} { + set object_type "survey_response" + set surveys_posted [db_string select_total_posts_by_type {} ] +} else { + set surveys_posted 0 +} + +set package_key "forums" +if {[db_0or1row select_package_exists {}]} { + set object_type "forums_message" + set forum_posted [db_string select_total_posts_by_type {} ] +} else { + set forum_posted 0 +} + +set package_key "file-storage" +if {[db_0or1row select_package_exists {}]} { + set object_type "file_storage_object" + set files_posted [db_string select_total_posts_by_type {} ] +} else { + set files_posted 0 +} + + +set total_posted [expr $faq_posted+$news_posted+$surveys_posted+$files_posted+$forum_posted] + + +set class_instances_pretty_name [parameter::get -localize -parameter class_instances_pretty_name] +set clubs_pretty_name [parameter::get -localize -parameter clubs_pretty_name] +set subcommunities_pretty_name [parameter::get -localize -parameter subcommunities_pretty_name] + +ad_return_template + Index: openacs-4/packages/user-tracking/www/users-chunk-large-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-large-oracle.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-large-oracle.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,23 @@ + + + + oracle8.1.6 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy.guest_p(dotlrn_users.user_id) as guest_p, + acs_permission.permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where ( + lower(dotlrn_users.last_name) like lower('%' || :search_text || '%') + or lower(dotlrn_users.first_names) like lower('%' || :search_text || '%') + or lower(dotlrn_users.email) like lower('%' || :search_text || '%') + ) + order by dotlrn_users.last_name + + + Index: openacs-4/packages/user-tracking/www/users-chunk-large-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-large-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-large-postgresql.xql 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,24 @@ + + + + postgresql7.1 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where ( + lower(dotlrn_users.last_name) like lower('%' || :search_text || '%') + or lower(dotlrn_users.first_names) like lower('%' || :search_text || '%') + or lower(dotlrn_users.email) like lower('%' || :search_text || '%') + ) + order by dotlrn_users.last_name + + + + Index: openacs-4/packages/user-tracking/www/users-chunk-large.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-large.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-large.adp 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + +
    #dotlrn.Search_Text#
    + +
    + + Index: openacs-4/packages/user-tracking/www/users-chunk-large.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-large.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-large.tcl 1 Mar 2005 17:35:37 -0000 1.1 @@ -0,0 +1,60 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: users-chunk-large.tcl,v 1.1 2005/03/01 17:35:37 rocaelh Exp $ +} -query { + {search_text ""} +} -properties { + user_id:onevalue + users:multirow +} + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +set user_id [ad_conn user_id] + +form create user_search + +element create user_search search_text \ + -label [_ dotlrn.Search] \ + -datatype text \ + -widget text \ + -value $search_text + +element create user_search type \ + -label [_ dotlrn.Type] \ + -datatype text \ + -widget hidden \ + -value $type + +element create user_search referer \ + -label [_ dotlrn.Referer] \ + -datatype text \ + -widget hidden \ + -value $referer + +if {[form is_valid user_search]} { + form get_values user_search search_text referer + + set user_id [ad_conn user_id] + set dotlrn_package_id [dotlrn::get_package_id] + set root_object_id [acs_magic_object security_context_root] + set i 1 + + db_multirow users select_dotlrn_users {} { + if {[dotlrn::user_can_browse_p -user_id $user_id]} { + set users:${i}(access_level) Full + } else { + set users:${i}(access_level) Limited + } + incr i + } +} else { + multirow create users dummy +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/users-chunk-medium-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-medium-oracle.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-medium-oracle.xql 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,33 @@ + + + + oracle8.1.6 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy.guest_p(dotlrn_users.user_id) as guest_p, + acs_permission.permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where upper(substr(dotlrn_users.last_name, 1, 1)) = :section + order by dotlrn_users.last_name + + + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy.guest_p(dotlrn_users.user_id) as guest_p, + acs_permission.permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where upper(substr(dotlrn_users.last_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by dotlrn_users.last_name + + + Index: openacs-4/packages/user-tracking/www/users-chunk-medium-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-medium-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-medium-postgresql.xql 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,34 @@ + + + + postgresql7.1 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where upper(substr(dotlrn_users.last_name, 1, 1)) = :section + order by dotlrn_users.last_name + + + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + where upper(substr(dotlrn_users.last_name, 1, 1)) not in ('[join $dimension_list "\', \'"]') + order by dotlrn_users.last_name + + + + Index: openacs-4/packages/user-tracking/www/users-chunk-medium.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-medium.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-medium.adp 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,6 @@ + +

    @control_bar;noquote@

    + + + + Index: openacs-4/packages/user-tracking/www/users-chunk-medium.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-medium.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-medium.tcl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,45 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: users-chunk-medium.tcl,v 1.1 2005/03/01 17:35:38 rocaelh Exp $ +} -query { + {section A} +} -properties { + user_id:onevalue + control_bar:onevalue + users:multirow +} + +set user_id [ad_conn user_id] +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +set dimension_list {A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} +foreach dimension $dimension_list { + lappend dimensions [list $dimension $dimension {}] +} +lappend dimensions [list Other Other {}] + +set control_bar [portal::dimensional -no_bars [list [list section {} $section $dimensions]]] + +set i 1 + set query select_dotlrn_users + if {[string match Other $section]} { + append query "_other" + } + db_multirow users $query {} { + if {[dotlrn::user_can_browse_p -user_id $user_id]} { + set users:${i}(access_level) Full + } else { + set users:${i}(access_level) Limited + } + incr i + } + +ad_return_template + Index: openacs-4/packages/user-tracking/www/users-chunk-small-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-small-oracle.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-small-oracle.xql 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,19 @@ + + + + oracle8.1.6 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy.guest_p(dotlrn_users.user_id) as guest_p, + acs_permission.permission_p(:root_object_id, dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + order by dotlrn_users.last_name + + + + Index: openacs-4/packages/user-tracking/www/users-chunk-small-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-small-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-small-postgresql.xql 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,18 @@ + + + + postgresql7.1 + + + + select dotlrn_users.user_id, + dotlrn_users.first_names, + dotlrn_users.last_name, + dotlrn_users.email, + dotlrn_privacy__guest_p(dotlrn_users.user_id) as guest_p, + acs_permission__permission_p(:root_object_id,dotlrn_users.user_id, 'admin') as site_wide_admin_p + from dotlrn_users + order by dotlrn_users.last_name + + + Index: openacs-4/packages/user-tracking/www/users-chunk-small.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-small.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-small.adp 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,3 @@ + + + Index: openacs-4/packages/user-tracking/www/users-chunk-small.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk-small.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk-small.tcl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,33 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: users-chunk-small.tcl,v 1.1 2005/03/01 17:35:38 rocaelh Exp $ +} -query { +} -properties { + user_id:onevalue + users:multirow +} + +set user_id [ad_conn user_id] +set dotlrn_package_id [dotlrn::get_package_id] +set root_object_id [acs_magic_object security_context_root] + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +# Currently, just present a list of dotLRN users +set i 1 + db_multirow users select_dotlrn_users {} { + if {[dotlrn::user_can_browse_p -user_id $user_id]} { + set users:${i}(access_level) Full + } else { + set users:${i}(access_level) Limited + } + incr i + } + + +ad_return_template + Index: openacs-4/packages/user-tracking/www/users-chunk.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk.adp 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,49 @@ + +<% + set admin_url [dotlrn::get_admin_url] +%> +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #dotlrn.User##dotlrn.Access##dotlrn.Guest##user-tracking.lt_View_Stats#
    + @users.last_name@, @users.first_names@ (@users.email@) + @users.access_level@ + #dotlrn.Yes##dotlrn.No# + + #user-tracking.Stats# +
    #dotlrn.No_Users#
    +
    + + + + + Index: openacs-4/packages/user-tracking/www/users-chunk.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-chunk.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-chunk.tcl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,19 @@ + +ad_page_contract { + @author yon (yon@openforce.net) + @creation-date 2002-01-30 + @version $Id: users-chunk.tcl,v 1.1 2005/03/01 17:35:38 rocaelh Exp $ +} -query { + {section ""} +} -properties { + user_id:onevalue +} + +set user_id [ad_conn user_id] + +if {![exists_and_not_null referer]} { + set referer "[user-tracking::get_package_url]/users-stats" +} + +ad_return_template + Index: openacs-4/packages/user-tracking/www/users-stats-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-stats-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-stats-postgresql.xql 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,20 @@ + + + + postgresql7.1 + + + + select count(*) + from (select acs_rels.object_id_two + from acs_rels, membership_rels + where acs_rels.object_id_one = (select acs__magic_object_id('registered_users') from dual) + and acs_rels.rel_id = membership_rels.rel_id + and acs_rels.object_id_two not in ( + select acs_rels.object_id_two + from acs_rels, + dotlrn_user_types + where acs_rels.object_id_one = dotlrn_user_types.group_id)) as foo + + + Index: openacs-4/packages/user-tracking/www/users-stats.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-stats.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-stats.adp 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,32 @@ + + + +@page_title;noquote@ +@context;noquote@ + +<% set referer "[user-tracking::get_package_url]/users-stats" %> + +[ + #user-tracking.lt_Site_Stats# + | + #user-tracking.lt_Communities_Stats_2# + | + #user-tracking.lt_Users_Stats# + | + #user-tracking.lt_Advanced_Stats_1# +] +

    +

    + + + + + + + + + + + + + Index: openacs-4/packages/user-tracking/www/users-stats.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-stats.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-stats.tcl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,18 @@ + +ad_page_contract { + Displays the stats users page + + @author Sergio (sergiog@tid.es) + @creation-date 2004-09-15 +} -query { +} -properties { + n_users:onevalue +} + +set page_title [_ user-tracking.User_Stats] +set context [list $page_title] + +set n_users [db_string select_dotlrn_users_count {}] + +ad_return_template + Index: openacs-4/packages/user-tracking/www/users-stats.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/users-stats.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/users-stats.xql 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,12 @@ + + + + + + + select count(*) + from dotlrn_users + + + + Index: openacs-4/packages/user-tracking/www/vh.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/Attic/vh.png,v diff -u Binary files differ Index: openacs-4/packages/user-tracking/www/admin/index.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/admin/index.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/admin/index.adp 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,8 @@ + + @page_title;noquote@ + @context;noquote@ + + Index: openacs-4/packages/user-tracking/www/admin/index.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/admin/index.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/admin/index.tcl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,18 @@ +ad_page_contract { + + Creating a new Scheduling process + + @author David Ortega (doa@tid.es) + @author Sergio Gonz�lez (sergiog@tid.es) + @creation-date 2004/09/28 +} { + + +} +set page_title "Administraci�n de user-tracking" +set context "" + +#Pages in this directory are only runnable by dotlrn-wide admins. +dotlrn::require_admin + + Index: openacs-4/packages/user-tracking/www/admin/scheduling.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/admin/scheduling.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/admin/scheduling.adp 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,28 @@ + + @page_title;noquote@ + @context;noquote@ + + + + +
    + +
    Index: openacs-4/packages/user-tracking/www/admin/scheduling.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/admin/scheduling.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/admin/scheduling.tcl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,155 @@ +ad_page_contract { + + Creating a new Scheduling process + + @author David Ortega (doa@tid.es) + @author Sergio Gonz�lez (sergiog@tid.es) + @creation-date 2004/09/28 +} { + + +} +set page_title "Programar carga de Datos" +set context [list $page_title] + +#Pages in this directory are only runnable by dotlrn-wide admins. +dotlrn::require_admin + + +ad_form -name ut_sched -form { + {ut_sched_id:key} + +# {start_date:date,to_sql(linear_date),to_html(sql_date) +# {label "Fecha de inicio"} +# } + + {start_time:date + {label "Hora de inicio"} + {format {[lc_get formbuilder_time_format]}} + } + + {perioricidad:text(radio) + {label "Perioricidad"} + {html {onClick "javascript:TimePChanged(this);"}} + {options {{"Cada x horas" 1} + {"Diaria" 2} + {"Semanal" 3}}} + } + + {horas:date,optional + {label "Cada cu�ntas horas?"} + {format {[lc_get formbuilder_time_format]}} + } + + {informes:text(checkbox),multiple + {label "Tipos de informes"} + {options {{"Todos los usuarios" 1} + {"Todas las comunidades" 2} + {"Todos los usuarios en todas la comunidades" 3} + {"Todo el sitio web" 4}}} + } + + # {my_key:text(multiselect),multiple {label "select some values"} + # {options {first second third fourth fifth}} + # {html {size 4}}} + +} +#---------------------------------------------------------------------- +# LARS: Hack to make enable/disable time widgets work with i18n +#---------------------------------------------------------------------- + +set format_string [lc_get formbuilder_time_format] + +multirow create time_format_elms name + +while { ![empty_string_p $format_string] } { + # Snip off the next token + regexp {([^/\-.: ]*)([/\-.: ]*)(.*)} \ + $format_string match word sep format_string + # Extract the trailing "t", if any + regexp -nocase $template::util::date::token_exp $word \ + match token type + + # Output the widget + set fragment_def $template::util::date::fragment_widgets([string toupper $token]) + + multirow append time_format_elms [lindex $fragment_def 1] +} + +ad_form -extend -name ut_sched -validate { + + #HAbria que comprobar que es superior a la fecha actual. + # {start_date + # { [template::util::date::compare $start_date $end_date] <= 0 } + # "The term must start before it ends" + # } + + {horas + {!(($perioricidad == 1) && ([lindex $horas 3] == 0) && ([lindex $horas 4] == 0))} + "Ilegal time scheduling" + } + +} -new_request { + + set start_time "{} {} {} 0 0 {} {HH24:MI}" + set horas "{} {} {} 0 0 {} {HH24:MI}" + #set start_date "0 0 0 0 0 {} {DDMM}" + set perioricidad 1 +} -on_submit { + + ns_log notice "He obtenido lo siguiente:\n \t\t \n\t\t Hora inicio= $start_time \n\t\t perioricidad=$perioricidad horas=$horas informes=$informes" + + #Programo la ejecuci�n del procedimiento + #user-tracking::do_data_load $informes + + #Borro programaciones anteriores + db_foreach get_scheduled_processes {} { + ns_unschedule_proc $process_id + db_dml delete_scheduled_process {} + ns_log notice "Desprogramado proceso $process_id" + } + + + + + + if {$perioricidad == 1 } { + + #estimating seconds to start_time + + set time [ns_localtime] + set minutes [ns_parsetime min $time] + set hour [ns_parsetime hour $time] + set seconds [ns_parsetime sec $time] + set hours_diff [expr [lindex $start_time 3] - $hour] + set minutes_diff [expr [lindex $start_time 4] - $minutes] + set diff [expr [expr [expr $hours_diff * 3600] + [expr $minutes_diff * 60]] - $seconds] + + ns_log notice "El proceso se lanzar� dentro de $diff segundos" + if {$diff < 0 } { + #seconds in a day + incr diff 86400 + } + #scheduling first execution + set id [ad_schedule_proc -once "t" -thread "t" $diff user-tracking::launch_process $horas $informes] + ns_log notice "\n\nId del proc programado $id\n" + db_dml insert_scheduled_process_id {} + ns_log notice "[ns_info scheduled]" + + } elseif {$perioricidad == 2} { + set id [ad_schedule_proc -thread "t" -schedule_proc ns_schedule_daily [list [lindex $start_time 3] [lindex $start_time 4]] user-tracking::do_data_load $informes] + ns_log notice "\n\nId del proc programado $id\n" + db_dml insert_scheduled_process_id {} + + } else { #perioricidad=3 + set id [ad_schedule_proc -thread "t" -schedule_proc ns_schedule_weekly [list [lindex $start_time 3] [lindex $start_time 4]] user-tracking::do_data_load $informes] + ns_log notice "\n\nId del proc programado $id\n" + db_dml insert_scheduled_process_id {} + + } + + + #P�gina siguiente + ad_returnredirect "" + ad_script_abort +} \ No newline at end of file Index: openacs-4/packages/user-tracking/www/admin/scheduling.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/admin/scheduling.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/admin/scheduling.xql 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,24 @@ + + + + + + + select process_id + from ut_sched + + + + + + insert into ut_sched values (:id) + + + + + + delete from ut_sched where process_id = :process_id + + + + \ No newline at end of file Index: openacs-4/packages/user-tracking/www/admin/write.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/admin/write.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/admin/write.tcl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,7 @@ +#Pages in this directory are only runnable by dotlrn-wide admins. +dotlrn::require_admin + +user-tracking::write_users_file + +ad_returnredirect "" +ad_script_abort \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/awredir.pl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/Attic/awredir.pl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/awredir.pl 1 Mar 2005 17:35:38 -0000 1.1 @@ -0,0 +1,140 @@ +#!/usr/bin/perl +#------------------------------------------------------- +# Save the click done on managed hits into a trace file +# and return to browser a redirector to tell browser to visit this URL. +# Ex: XXX +#------------------------------------------------------- + +#use DBD::mysql; + + +#------------------------------------------------------- +# Defines +#------------------------------------------------------- +use vars qw/ $REVISION $VERSION /; +$REVISION='$Revision: 1.1 $'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; +$VERSION="1.1 (build $REVISION)"; + +use vars qw / $DIR $PROG $Extension $DEBUG $DEBUGFILE $REPLOG $DEBUGRESET $SITE $REPCONF /; +($DIR=$0) =~ s/([^\/\\]*)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; +$DEBUG=0; # Debug level +$DEBUGFILE="$PROG.log"; # Debug output (A log file name or "screen" to have debug on screen) +$REPLOG="$DIR"; # Debug directory + +$TRACEBASE=0; # Set to 1 to track click on links that point to extern site into a database +$TRACEFILE=0; # Set to 1 to track click on links that point to extern site into a file +$TXTDIR="$DIR/../../../logs"; # Directory where to write tracking file (if TRACEFILE=1) +$TXTFILE="awredir.trc"; # Tracking file (if TRACEFILE=1) +$EXCLUDEIP="127.0.0.1"; + + +#------------------------------------------------------- +# Functions +#------------------------------------------------------- + +sub error { + print "Content-type: text/html; charset=iso-8859-1\n"; + print "\n"; + print "\n"; + print "\n"; + print "\n"; + print "\n"; + print "\n"; + print "

    \n"; + print "AWRedir
    \n\n"; + print "$_[0].

    \n"; + print "Setup (setup or logfile permissions) may be wrong.\n"; + $date=localtime(); + print "

    $date - Advanced Web Redirector $VERSION
    \n"; + print "
    \n"; + print ""; + print ""; + die; +} + +#------------------------------------------------------- +# MAIN +#------------------------------------------------------- + +if ($DEBUG) { + open(LOGFILE,">$REPLOG/$PROG.log"); + print LOGFILE "----- $PROG $VERSION -----\n"; +} + +if (! $ENV{'GATEWAY_INTERFACE'}) { # Run from command line + print "----- $PROG $VERSION (c) Laurent Destailleur -----\n"; + print "This script is absolutely not required to use AWStats.\n"; + print "It's a third tool that can help webmaster in their tracking tasks but is\n"; + print "not used by AWStats engine.\n"; + print "\n"; + print "This tools must be used as a CGI script. When called as a CGI, it returns to\n"; + print "browser a redirector to tell it to show the page provided in 'url' parameter.\n"; + print "So, to use this script, you must replace HTML code for external links onto your\n"; + print "HTML pages from\n"; + print "Link\n"; + print "to\n"; + print "Link\n"; + print "\n"; + print "For your web visitor, there is no difference. However this allow you to track\n"; + print "clicks done on links onto your web pages that point to external web sites,\n"; + print "because an entry will be seen in your own server log, to awredir.pl script\n"; + print "with url parameter, even if link was pointing to another external web server.\n"; + print "\n"; + sleep 2; + exit 0; +} + +# Extract tag +$Tag='NOTAG'; +if ($ENV{QUERY_STRING} =~ /tag=\"?([^\"&]+)\"?/) { $Tag=$1; } + +# Extract url to redirect to +$Url=$ENV{QUERY_STRING}; +if ($Url =~ /url=\"([^\"]+)\"/) { $Url=$1; } +elsif ($Url =~ /url=(.+)$/) { $Url=$1; } + +if ($Url !~ /^http/i) { $Url = "http://".$Url; } +if (! $Url) { + error("Error: Bad use of $PROG. To redirect an URL with $PROG, use the following syntax:
    /cgi-bin/$PROG.pl?url=http://urltogo"); +} +if ($DEBUG) { print LOGFILE "Url=$Url\n"; } + +# Get date +($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear,$nowwday,$nowyday,$nowisdst) = localtime(time); +if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } +$nowsmallyear=$nowyear;$nowsmallyear =~ s/^..//; +if (++$nowmonth < 10) { $nowmonth = "0$nowmonth"; } +if ($nowday < 10) { $nowday = "0$nowday"; } +if ($nowhour < 10) { $nowhour = "0$nowhour"; } +if ($nowmin < 10) { $nowmin = "0$nowmin"; } +if ($nowsec < 10) { $nowsec = "0$nowsec"; } + +if ($TRACEBASE == 1) { + if ($ENV{REMOTE_ADDR} !~ /$EXCLUDEIP/) { + if ($DEBUG == 1) { print LOGFILE "Execution requete Update sur BASE=$BASE, USER=$USER, PASS=$PASS\n"; } + my $dbh = DBI->connect("DBI:mysql:$BASE", $USER, $PASS) || die "Can't connect to DBI:mysql:$BASE: $dbh->errstr\n"; + my $sth = $dbh->prepare("UPDATE T_LINKS set HITS_LINKS = HIT_LINKS+1 where URL_LINKS = '$Url'"); + $sth->execute || error("Error: Unable execute query:$dbh->err, $dbh->errstr"); + $sth->finish; + $dbh->disconnect; + if ($DEBUG == 1) { print LOGFILE "Execution requete Update - OK\n"; } + } +} + +if ($TRACEFILE == 1) { + if ($ENV{REMOTE_ADDR} !~ /$EXCLUDEIP/) { + open(FICHIER,">>$TXTDIR/$TXTFILE") || error("Error: Enable to open trace file $TXTDIR/$TXTFILE: $!"); + print FICHIER "$nowyear-$nowmonth-$nowday $nowhour:$nowmin:$nowsec\t$ENV{REMOTE_ADDR}\t$Tag\t$Url\n"; + close(FICHIER); + } +} + +# Redir html instructions +print "Location: $Url\n\n"; + +if ($DEBUG) { + print LOGFILE "Redirect to $Url\n"; + close(LOGFILE); +} + +0; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/awstatsDirecto.pl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/Attic/awstatsDirecto.pl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/awstatsDirecto.pl 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,10409 @@ +#!/usr/bin/perl +#------------------------------------------------------------------------------ +# Free realtime web server logfile analyzer to show advanced web statistics. +# Works from command line or as a CGI. You must use this script as often as +# necessary from your scheduler to update your statistics and from command +# line or a browser to read report results. +# See AWStats documentation (in docs/ directory) for all setup instructions. +#------------------------------------------------------------------------------ +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:40 $ +# $Modifications by Sergio Gonzalez, TID, E-Lane proyect +require 5.005; + +#$|=1; +#use warnings; # Must be used in test mode only. This reduce a little process speed +#use diagnostics; # Must be used in test mode only. This reduce a lot of process speed +use strict;no strict "refs"; +use Time::Local; # use Time::Local 'timelocal_nocheck' is faster but not supported by all Time::Local modules +use Socket; + + +#------------------------------------------------------------------------------ +# Defines +#------------------------------------------------------------------------------ +use vars qw/ $REVISION $VERSION /; +$REVISION='$Revision: 1.1 $'; $REVISION =~ /\s(.*)\s/; $REVISION=$1; +$VERSION="6.2 (build $REVISION)"; + +# ----- Constants ----- +use vars qw/ +$DEBUGFORCED $NBOFLINESFORBENCHMARK $FRAMEWIDTH $NBOFLASTUPDATELOOKUPTOSAVE +$LIMITFLUSH $NEWDAYVISITTIMEOUT $VISITTIMEOUT $NOTSORTEDRECORDTOLERANCE +$WIDTHCOLICON $TOOLTIPON +$lastyearbeforeupdate +/; +$DEBUGFORCED=0; # Force debug level to log lesser level into debug.log file (Keep this value to 0) +$NBOFLINESFORBENCHMARK=8192; # Benchmark info are printing every NBOFLINESFORBENCHMARK lines (Must be a power of 2) +$FRAMEWIDTH=240; # Width of left frame when UseFramesWhenCGI is on +$NBOFLASTUPDATELOOKUPTOSAVE=500; # Nb of records to save in DNS last update cache file +$LIMITFLUSH=5000; # Nb of records in data arrays after how we need to flush data on disk +$NEWDAYVISITTIMEOUT=764041; # Delay between 01-23:59:59 and 02-00:00:00 +$VISITTIMEOUT=10000; # Lapse of time to consider a page load as a new visit. 10000 = 1 hour (Default = 10000) +$NOTSORTEDRECORDTOLERANCE=20000; # Lapse of time to accept a record if not in correct order. 20000 = 2 hour (Default = 20000) +$WIDTHCOLICON=32; +$TOOLTIPON=0; # Tooltips plugin loaded +# ----- Running variables ----- +use vars qw/ +$DIR $PROG $Extension +$Debug $ShowSteps +$DebugResetDone $DNSLookupAlreadyDone +$RunAsCli $UpdateFor $HeaderHTTPSent $HeaderHTMLSent +$LastLine $LastLineNumber $LastLineOffset $LastLineChecksum $LastUpdate +$lowerval +$PluginMode +$TotalUnique $TotalVisits $TotalHostsKnown $TotalHostsUnknown +$TotalPages $TotalHits $TotalBytes +$TotalNotViewedPages $TotalNotViewedHits $TotalNotViewedBytes +$TotalEntries $TotalExits $TotalBytesPages $TotalDifferentPages +$TotalKeyphrases $TotalKeywords $TotalDifferentKeyphrases $TotalDifferentKeywords +$TotalSearchEnginesPages $TotalSearchEnginesHits $TotalRefererPages $TotalRefererHits $TotalDifferentSearchEngines $TotalDifferentReferer +$FrameName $Center $FileConfig $FileSuffix $Host $DayRequired $MonthRequired $YearRequired +$QueryString $SiteConfig $StaticLinks $PageCode $PageDir $PerlParsingFormat $UserAgent +$pos_vh $pos_host $pos_logname $pos_date $pos_tz $pos_method $pos_url $pos_code $pos_size +$pos_referer $pos_agent $pos_query $pos_gzipin $pos_gzipout $pos_compratio $pos_timetaken +$pos_cluster $pos_emails $pos_emailr $pos_hostr @pos_extra +/; +$DIR=$PROG=$Extension=''; +$Debug = $ShowSteps = 0; +$DebugResetDone = $DNSLookupAlreadyDone = 0; +$RunAsCli = $UpdateFor = $HeaderHTTPSent = $HeaderHTMLSent = 0; +$LastLine = $LastLineNumber = $LastLineOffset = $LastLineChecksum = $LastUpdate = 0; +$lowerval = 0; +$PluginMode = ''; +$TotalUnique = $TotalVisits = $TotalHostsKnown = $TotalHostsUnknown = 0; +$TotalPages = $TotalHits = $TotalBytes = 0; +$TotalNotViewedPages = $TotalNotViewedHits = $TotalNotViewedBytes = 0; +$TotalEntries = $TotalExits = $TotalBytesPages = $TotalDifferentPages = 0; +$TotalKeyphrases = $TotalKeywords = $TotalDifferentKeyphrases = $TotalDifferentKeywords = 0; +$TotalSearchEnginesPages = $TotalSearchEnginesHits = $TotalRefererPages = $TotalRefererHits = $TotalDifferentSearchEngines = $TotalDifferentReferer = 0; +($FrameName, $Center, $FileConfig, $FileSuffix, $Host, $DayRequired, $MonthRequired, $YearRequired, +$QueryString, $SiteConfig, $StaticLinks, $PageCode, $PageDir, $PerlParsingFormat, $UserAgent)= +('','','','','','','','','','','','','','',''); +$pos_vh = $pos_host = $pos_logname = $pos_date = $pos_tz = $pos_method = $pos_url = $pos_code = $pos_size = -1; +$pos_referer = $pos_agent = $pos_query = $pos_gzipin = $pos_gzipout = $pos_compratio = -1; +$pos_cluster = $pos_emails = $pos_emailr = $pos_hostr = -1; +@pos_extra=(); +# ----- Plugins variable ----- +use vars qw/ %PluginsLoaded $PluginDir $AtLeastOneSectionPlugin /; +%PluginsLoaded=(); +$PluginDir=''; +$AtLeastOneSectionPlugin=0; +# ----- Time vars ----- +use vars qw/ +$starttime +$nowtime $tomorrowtime +$nowweekofmonth $nowweekofyear $nowdaymod $nowsmallyear +$nowsec $nowmin $nowhour $nowday $nowmonth $nowyear $nowwday $nowyday $nowns +$StartSeconds $StartMicroseconds +/; +$StartSeconds=$StartMicroseconds=0; +# ----- Variables for config file reading ----- +use vars qw/ +$FoundNotPageList +/; +$FoundNotPageList=0; +# ----- Config file variables ----- +use vars qw/ +$StaticExt +$DNSStaticCacheFile +$DNSLastUpdateCacheFile +$MiscTrackerUrl +$Lang +$MaxRowsInHTMLOutput +$MaxLengthOfShownURL +$MaxLengthOfStoredURL +$MaxLengthOfStoredUA +%BarPng +$BuildReportFormat +$BuildHistoryFormat +$ExtraTrackedRowsLimit +/; +$StaticExt='html'; +$DNSStaticCacheFile='dnscache.txt'; +$DNSLastUpdateCacheFile='dnscachelastupdate.txt'; +$MiscTrackerUrl='/js/awstats_misc_tracker.js'; +$Lang='auto'; +$MaxRowsInHTMLOutput=1000; +$MaxLengthOfShownURL=64; +$MaxLengthOfStoredURL=256; # Note: Apache LimitRequestLine is default to 8190 +$MaxLengthOfStoredUA=256; +%BarPng=('vv'=>'vv.png','vu'=>'vu.png','hu'=>'hu.png','vp'=>'vp.png','hp'=>'hp.png', +'he'=>'he.png','hx'=>'hx.png','vh'=>'vh.png','hh'=>'hh.png','vk'=>'vk.png','hk'=>'hk.png'); +$BuildReportFormat='html'; +$BuildHistoryFormat='text'; +$ExtraTrackedRowsLimit=500; +use vars qw/ +$EnableLockForUpdate $DNSLookup $AllowAccessFromWebToAuthenticatedUsersOnly +$BarHeight $BarWidth $CreateDirDataIfNotExists $KeepBackupOfHistoricFiles +$NbOfLinesParsed $NbOfLinesDropped $NbOfLinesCorrupted $NbOfOldLines $NbOfNewLines +$NbOfLinesShowsteps $NewLinePhase $NbOfLinesForCorruptedLog $PurgeLogFile $ArchiveLogRecords +$ShowDropped $ShowCorrupted $ShowUnknownOrigin $ShowLinksToWhoIs +$ShowAuthenticatedUsers $ShowFileSizesStats $ShowScreenSizeStats $ShowSMTPErrorsStats +$ShowEMailSenders $ShowEMailReceivers $ShowWormsStats $ShowClusterStats +$IncludeInternalLinksInOriginSection +$AuthenticatedUsersNotCaseSensitive +$Expires $UpdateStats $MigrateStats $URLNotCaseSensitive $URLWithQuery $URLReferrerWithQuery +$DecodeUA +/; +($EnableLockForUpdate, $DNSLookup, $AllowAccessFromWebToAuthenticatedUsersOnly, +$BarHeight, $BarWidth, $CreateDirDataIfNotExists, $KeepBackupOfHistoricFiles, +$NbOfLinesParsed, $NbOfLinesDropped, $NbOfLinesCorrupted, $NbOfOldLines, $NbOfNewLines, +$NbOfLinesShowsteps, $NewLinePhase, $NbOfLinesForCorruptedLog, $PurgeLogFile, $ArchiveLogRecords, +$ShowDropped, $ShowCorrupted, $ShowUnknownOrigin, $ShowLinksToWhoIs, +$ShowAuthenticatedUsers, $ShowFileSizesStats, $ShowScreenSizeStats, $ShowSMTPErrorsStats, +$ShowEMailSenders, $ShowEMailReceivers, $ShowWormsStats, $ShowClusterStats, +$IncludeInternalLinksInOriginSection, +$AuthenticatedUsersNotCaseSensitive, +$Expires, $UpdateStats, $MigrateStats, $URLNotCaseSensitive, $URLWithQuery, $URLReferrerWithQuery, +$DecodeUA)= +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); +use vars qw/ +$AllowToUpdateStatsFromBrowser $DetailedReportsOnNewWindows +$FirstDayOfWeek $KeyWordsNotSensitive $SaveDatabaseFilesWithPermissionsForEveryone +$WarningMessages $DebugMessages $ShowLinksOnUrl $UseFramesWhenCGI +$ShowMenu $ShowMonthStats $ShowDaysOfMonthStats $ShowDaysOfWeekStats +$ShowHoursStats $ShowDomainsStats $ShowHostsStats +$ShowRobotsStats $ShowSessionsStats $ShowPagesStats $ShowFileTypesStats +$ShowOSStats $ShowBrowsersStats $ShowOriginStats +$ShowKeyphrasesStats $ShowKeywordsStats $ShowMiscStats $ShowHTTPErrorsStats +$AddDataArrayMonthStats $AddDataArrayShowDaysOfMonthStats $AddDataArrayShowDaysOfWeekStats $AddDataArrayShowHoursStats +/; +($AllowToUpdateStatsFromBrowser, $DetailedReportsOnNewWindows, +$FirstDayOfWeek, $KeyWordsNotSensitive, $SaveDatabaseFilesWithPermissionsForEveryone, +$WarningMessages, $DebugMessages, $ShowLinksOnUrl, $UseFramesWhenCGI, +$ShowMenu, $ShowMonthStats, $ShowDaysOfMonthStats, $ShowDaysOfWeekStats, +$ShowHoursStats, $ShowDomainsStats, $ShowHostsStats, +$ShowRobotsStats, $ShowSessionsStats, $ShowPagesStats, $ShowFileTypesStats, +$ShowOSStats, $ShowBrowsersStats, $ShowOriginStats, +$ShowKeyphrasesStats, $ShowKeywordsStats, $ShowMiscStats, $ShowHTTPErrorsStats, +$AddDataArrayMonthStats, $AddDataArrayShowDaysOfMonthStats, $AddDataArrayShowDaysOfWeekStats, $AddDataArrayShowHoursStats +)= +(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); +use vars qw/ +$AllowFullYearView +$LevelForRobotsDetection $LevelForWormsDetection $LevelForBrowsersDetection $LevelForOSDetection $LevelForRefererAnalyze +$LevelForFileTypesDetection $LevelForSearchEnginesDetection $LevelForKeywordsDetection +/; +($AllowFullYearView, +$LevelForRobotsDetection, $LevelForWormsDetection, $LevelForBrowsersDetection, $LevelForOSDetection, $LevelForRefererAnalyze, +$LevelForFileTypesDetection, $LevelForSearchEnginesDetection, $LevelForKeywordsDetection)= +(2,2,0,2,2,2,2,2,2); +use vars qw/ +$DirLock $DirCgi $DirConfig $DirData $DirIcons $DirLang $AWScript $ArchiveFileName +$AllowAccessFromWebToFollowingIPAddresses $HTMLHeadSection $HTMLEndSection $LinksToWhoIs $LinksToIPWhoIs +$LogFile $LogType $LogFormat $LogSeparator $Logo $LogoLink $StyleSheet $WrapperScript $SiteDomain +$UseHTTPSLinkForUrl $URLQuerySeparators $URLWithAnchor $ErrorMessages $ShowFlagLinks +/; +($DirLock, $DirCgi, $DirConfig, $DirData, $DirIcons, $DirLang, $AWScript, $ArchiveFileName, +$AllowAccessFromWebToFollowingIPAddresses, $HTMLHeadSection, $HTMLEndSection, $LinksToWhoIs, $LinksToIPWhoIs, +$LogFile, $LogType, $LogFormat, $LogSeparator, $Logo, $LogoLink, $StyleSheet, $WrapperScript, $SiteDomain, +$UseHTTPSLinkForUrl, $URLQuerySeparators, $URLWithAnchor, $ErrorMessages, $ShowFlagLinks)= +('','','','','','','','','','','','','','','','','','','','','','','','','','',''); +use vars qw/ +$color_Background $color_TableBG $color_TableBGRowTitle +$color_TableBGTitle $color_TableBorder $color_TableRowTitle $color_TableTitle +$color_text $color_textpercent $color_titletext $color_weekend $color_link $color_hover $color_other +$color_h $color_k $color_p $color_e $color_x $color_s $color_u $color_v +/; +($color_Background, $color_TableBG, $color_TableBGRowTitle, +$color_TableBGTitle, $color_TableBorder, $color_TableRowTitle, $color_TableTitle, +$color_text, $color_textpercent, $color_titletext, $color_weekend, $color_link, $color_hover, $color_other, +$color_h, $color_k, $color_p, $color_e, $color_x, $color_s, $color_u, $color_v)= +('','','','','','','','','','','','','','','','','','','','','',''); +# ---------- Init arrays -------- +use vars qw/ +@RobotsSearchIDOrder_list1 @RobotsSearchIDOrder_list2 @RobotsSearchIDOrder_listgen +@SearchEnginesSearchIDOrder_list1 @SearchEnginesSearchIDOrder_list2 @SearchEnginesSearchIDOrder_listgen +@BrowsersSearchIDOrder @OSSearchIDOrder @WordsToExtractSearchUrl @WordsToCleanSearchUrl +@WormsSearchIDOrder +@RobotsSearchIDOrder @SearchEnginesSearchIDOrder +@_from_p @_from_h +@_time_p @_time_h @_time_k @_time_nv_p @_time_nv_h @_time_nv_k +@DOWIndex @fieldlib @keylist +/; +@RobotsSearchIDOrder = @SearchEnginesSearchIDOrder = (); +@_from_p = @_from_h = (); +@_time_p = @_time_h = @_time_k = @_time_nv_p = @_time_nv_h = @_time_nv_k = (); +@DOWIndex = @fieldlib = @keylist = (); +#New params OnlyUsers and OnlyLines defined by E-Lane +use vars qw/ +@MiscListOrder %MiscListCalc +@OSFamily %BrowsersFamily @SessionsRange %SessionsAverage +%LangBrowserToLangAwstats %LangAWStatsToFlagAwstats +@HostAliases @AllowAccessFromWebToFollowingAuthenticatedUsers +@DefaultFile @SkipDNSLookupFor +@SkipHosts @SkipUserAgents @SkipFiles +@OnlyHosts @OnlyUserAgents @OnlyFiles +@OnlyUsers @OnlyLines +@URLWithQueryWithOnly @URLWithQueryWithout +@ExtraName @ExtraCondition @ExtraStatTypes @MaxNbOfExtra @MinHitExtra +@ExtraFirstColumnTitle @ExtraFirstColumnValues @ExtraFirstColumnFormat +@ExtraCodeFilter @ExtraConditionType @ExtraConditionTypeVal +@ExtraFirstColumnValuesType @ExtraFirstColumnValuesTypeVal +@ExtraAddAverageRow @ExtraAddSumRow +@PluginsToLoad +/; +@MiscListOrder=('AddToFavourites','JavascriptDisabled','JavaEnabled','DirectorSupport','FlashSupport','RealPlayerSupport','QuickTimeSupport','WindowsMediaPlayerSupport','PDFSupport'); +%MiscListCalc=('TotalMisc'=>'','AddToFavourites'=>'u','JavascriptDisabled'=>'hm','JavaEnabled'=>'hm','DirectorSupport'=>'hm','FlashSupport'=>'hm','RealPlayerSupport'=>'hm','QuickTimeSupport'=>'hm','WindowsMediaPlayerSupport'=>'hm','PDFSupport'=>'hm'); +@OSFamily=('win','mac'); +#%BrowsersFamily=('msie'=>1,'netscape'=>2,'mozilla'=>3); +%BrowsersFamily=('msie'=>1,'netscape'=>2); +@SessionsRange=('0s-30s','30s-2mn','2mn-5mn','5mn-15mn','15mn-30mn','30mn-1h','1h+'); +%SessionsAverage=('0s-30s',15,'30s-2mn',75,'2mn-5mn',210,'5mn-15mn',600,'15mn-30mn',1350,'30mn-1h',2700,'1h+',3600); +# HTTP-Accept or Lang parameter => AWStats code to use for lang +# ISO-639-1 or 2 or other => awstats-xx.txt where xx is ISO-639-1 +%LangBrowserToLangAwstats=( +'sq'=>'al','ar'=>'ar','ba'=>'ba','bg'=>'bg','zh-tw'=>'tw','zh'=>'cn','cz'=>'cz', +'de'=>'de','da'=>'dk', +'en'=>'en','et'=>'et','fi'=>'fi','fr'=>'fr','gl'=>'gl', +'es'=>'es','eu'=>'eu','ca'=>'ca', +'el'=>'gr','hu'=>'hu','is'=>'is','in'=>'id','it'=>'it', +'ja'=>'jp','ko'=>'kr','lv'=>'lv','nl'=>'nl','no'=>'nb','nb'=>'nb','nn'=>'nn', +'pl'=>'pl','pt'=>'pt','pt-br'=>'br','ro'=>'ro','ru'=>'ru','sr'=>'sr','sk'=>'sk', +'sv'=>'se','th'=>'th','tr'=>'tr','uk'=>'ua','cy'=>'cy','wlk'=>'cy' +); +%LangAWStatsToFlagAwstats=( # If flag (country ISO-3166 two letters) is not same than AWStats Lang code +'ca'=>'es_cat','et'=>'ee','eu','es_eu', +'cy'=>'wlk', +'gl'=>'glg', +'he'=>'il', +'ar'=>'sa', +'sr'=>'cs' +); +@HostAliases = @AllowAccessFromWebToFollowingAuthenticatedUsers=(); +@DefaultFile = @SkipDNSLookupFor = (); +@SkipHosts = @SkipUserAgents = @SkipFiles = (); +@OnlyHosts = @OnlyUserAgents = @OnlyFiles = (); +#Defined OnlyXXX by E-Lane +@OnlyUsers = @OnlyLines = (); +@URLWithQueryWithOnly = @URLWithQueryWithout = (); +@ExtraName = @ExtraCondition = @ExtraStatTypes = @MaxNbOfExtra = @MinHitExtra = (); +@ExtraFirstColumnTitle = @ExtraFirstColumnValues = @ExtraFirstColumnFormat = (); +@ExtraCodeFilter = @ExtraConditionType = @ExtraConditionTypeVal = (); +@ExtraFirstColumnValuesType = @ExtraFirstColumnValuesTypeVal = (); +@ExtraAddAverageRow = @ExtraAddSumRow = (); +@PluginsToLoad = (); +# ---------- Init hash arrays -------- +use vars qw/ +%BrowsersHashIDLib %BrowsersHashIcon %BrowsersHereAreGrabbers +%DomainsHashIDLib +%MimeHashLib %MimeHashIcon %MimeHashFamily +%OSHashID %OSHashLib +%RobotsHashIDLib %RobotsAffiliateLib +%SearchEnginesHashID %SearchEnginesHashLib %SearchEnginesKnownUrl %NotSearchEnginesKeys +%WormsHashID %WormsHashLib %WormsHashTarget +/; +use vars qw/ +%HTMLOutput %NoLoadPlugin %FilterIn %FilterEx +%BadFormatWarning +%MonthNumLib +%ValidHTTPCodes %ValidSMTPCodes +%TrapInfosForHTTPErrorCodes %NotPageList %DayBytes %DayHits %DayPages %DayVisits +%MaxNbOf %MinHit +%ListOfYears %HistoryAlreadyFlushed %PosInFile %ValueInFile +%val %nextval %egal +%TmpDNSLookup %TmpOS %TmpRefererServer %TmpRobot %TmpBrowser %MyDNSTable +/; +%HTMLOutput = %NoLoadPlugin = %FilterIn = %FilterEx = (); +%BadFormatWarning = (); +%MonthNumLib = (); +%ValidHTTPCodes = %ValidSMTPCodes = (); +%TrapInfosForHTTPErrorCodes=(); $TrapInfosForHTTPErrorCodes{404}=1; # TODO Add this in config file +%NotPageList=(); +%DayBytes = %DayHits = %DayPages = %DayVisits = (); +%MaxNbOf = %MinHit = (); +%ListOfYears = %HistoryAlreadyFlushed = %PosInFile = %ValueInFile = (); +%val = %nextval = %egal = (); +%TmpDNSLookup = %TmpOS = %TmpRefererServer = %TmpRobot = %TmpBrowser = %MyDNSTable = (); +use vars qw/ +%FirstTime %LastTime +%MonthHostsKnown %MonthHostsUnknown +%MonthUnique %MonthVisits +%MonthPages %MonthHits %MonthBytes +%MonthNotViewedPages %MonthNotViewedHits %MonthNotViewedBytes +%_session %_browser_h +%_domener_p %_domener_h %_domener_k %_errors_h %_errors_k +%_filetypes_h %_filetypes_k %_filetypes_gz_in %_filetypes_gz_out +%_host_p %_host_h %_host_k %_host_l %_host_s %_host_u +%_waithost_e %_waithost_l %_waithost_s %_waithost_u +%_keyphrases %_keywords %_os_h %_pagesrefs_p %_pagesrefs_h %_robot_h %_robot_k %_robot_l %_robot_r +%_worm_h %_worm_k %_worm_l %_login_h %_login_p %_login_k %_login_l %_screensize_h +%_misc_p %_misc_h %_misc_k +%_cluster_p %_cluster_h %_cluster_k +%_se_referrals_p %_se_referrals_h %_sider404_h %_referer404_h %_url_p %_url_k %_url_e %_url_x +%_unknownreferer_l %_unknownrefererbrowser_l +%_emails_h %_emails_k %_emails_l %_emailr_h %_emailr_k %_emailr_l +/; +&Init_HashArray(); +# ---------- Init Regex -------- +use vars qw/ $regclean1 $regclean2 $regdate /; +$regclean1=qr/<(recnb|\/td)>/i; +$regclean2=qr/<\/?[^<>]+>/i; +$regdate=qr/(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/; + +# ---------- Init Tie::hash arrays -------- +# Didn't find a tie that increase speed +#use Tie::StdHash; +#use Tie::Cache::LRU; +#tie %_host_p, 'Tie::StdHash'; +#tie %TmpOS, 'Tie::Cache::LRU'; + +# PROTOCOL CODES +use vars qw/ %httpcodelib %ftpcodelib %smtpcodelib /; + +# DEFAULT MESSAGE +use vars qw/ @Message /; +@Message=( +'Unknown', +'Unknown (unresolved ip)', +'Others', +'View details', +'Day', +'Month', +'Year', +'Statistics for', +'First visit', +'Last visit', +'Number of visits', +'Unique visitors', +'Visit', +'different keywords', +'Search', +'Percent', +'Traffic', +'Domains/Countries', +'Visitors', +'Pages-URL', +'Hours', +'Browsers', +'', +'Referers', +'Never updated (See \'Build/Update\' on awstats_setup.html page)', +'Visitors domains/countries', +'hosts', +'pages', +'different pages-url', +'Viewed', +'Other words', +'Pages not found', +'HTTP Error codes', +'Netscape versions', +'IE versions', +'Last Update', +'Connect to site from', +'Origin', +'Direct address / Bookmarks', +'Origin unknown', +'Links from an Internet Search Engine', +'Links from an external page (other web sites except search engines)', +'Links from an internal page (other page on same site)', +'Keyphrases used on search engines', +'Keywords used on search engines', +'Unresolved IP Address', +'Unknown OS (Referer field)', +'Required but not found URLs (HTTP code 404)', +'IP Address', +'Error Hits', +'Unknown browsers (Referer field)', +'different robots', +'visits/visitor', +'Robots/Spiders visitors', +'Free realtime logfile analyzer for advanced web statistics', +'of', +'Pages', +'Hits', +'Versions', +'Operating Systems', +'Jan', +'Feb', +'Mar', +'Apr', +'May', +'Jun', +'Jul', +'Aug', +'Sep', +'Oct', +'Nov', +'Dec', +'Navigation', +'File type', +'Update now', +'Bandwidth', +'Back to main page', +'Top', +'dd mmm yyyy - HH:MM', +'Filter', +'Full list', +'Hosts', +'Known', +'Robots', +'Sun', +'Mon', +'Tue', +'Wed', +'Thu', +'Fri', +'Sat', +'Days of week', +'Who', +'When', +'Authenticated users', +'Min', +'Average', +'Max', +'Web compression', +'Bandwidth saved', +'Compression on', +'Compression result', +'Total', +'different keyphrases', +'Entry', +'Code', +'Average size', +'Links from a NewsGroup', +'KB', +'MB', +'GB', +'Grabber', +'Yes', +'No', +'Info.', +'OK', +'Exit', +'Visits duration', +'Close window', +'Bytes', +'Search Keyphrases', +'Search Keywords', +'different refering search engines', +'different refering sites', +'Other phrases', +'Other logins (and/or anonymous users)', +'Refering search engines', +'Refering sites', +'Summary', +'Exact value not available in "Year" view', +'Data value arrays', +'Sender EMail', +'Receiver EMail', +'Reported period', +'Extra/Marketing', +'Screen sizes', +'Worm/Virus attacks', +'Add to favorites (estimated)', +'Days of month', +'Miscellaneous', +'Browsers with Java support', +'Browsers with Macromedia Director Support', +'Browsers with Flash Support', +'Browsers with Real audio playing support', +'Browsers with Quictime audio playing support', +'Browsers with Windows Media audio playing support', +'Browsers with PDF support', +'SMTP Error codes', +'Countries', +'Mails', +'Size', +'First', +'Last', +'Exclude filter', +'Codes shown here gave hits or traffic "not viewed" by visitors, so they are not included in other charts.', +'Cluster', +'Robots shown here gave hits or traffic "not viewed" by visitors, so they are not included in other charts.', +'Numbers after + are successful hits on "robots.txt" files', +'Worms shown here gave hits or traffic "not viewed" by visitors, so thay are not included in other charts.', +'Not viewed traffic includes traffic generated by robots, worms, or replies with special HTTP status codes.', +'Traffic viewed', +'Traffic not viewed', +'Monthly history', +'Worms', +'different worms', +'Mails successfully sent', +'Mails failed/refused', +'Sensitive targets', +'Javascript disabled' +); + + + +#------------------------------------------------------------------------------ +# Functions +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# Function: Write on ouput header of HTTP answer +# Parameters: None +# Input: $HeaderHTTPSent $BuildReportFormat $PageCode $Expires +# Output: $HeaderHTTPSent=1 +# Return: None +#------------------------------------------------------------------------------ +sub http_head { + if (! $HeaderHTTPSent) { + if ($BuildReportFormat eq 'xhtml' || $BuildReportFormat eq 'xml') { print ($ENV{'HTTP_USER_AGENT'}=~/MSIE|Googlebot/i?"Content-type: text/html; charset=$PageCode\n":"Content-type: text/xml; charset=$PageCode\n"); } + else { print "Content-type: text/html; charset=$PageCode\n"; } + + # Expires must be GMT ANSI asctime and must be after Content-type to avoid pb with some servers (SAMBAR) + if ($Expires =~ /^\d+$/) { + print "Cache-Control: public\n"; + print "Last-Modified: ".gmtime($starttime)."\n"; + print "Expires: ".(gmtime($starttime+$Expires))."\n"; + } + print "\n"; + } + $HeaderHTTPSent++;; +} + +#------------------------------------------------------------------------------ +# Function: Write on ouput header of HTML page +# Parameters: None +# Input: %HTMLOutput $PluginMode $Expires $Lang $StyleSheet $HTMLHeadSection $PageCode $PageDir +# Output: $HeaderHTMLSent=1 +# Return: None +#------------------------------------------------------------------------------ +sub html_head { + my $dir=$PageDir?'right':'left'; + if (scalar keys %HTMLOutput || $PluginMode) { + my $MetaRobot=0; # meta robots + my $periodtitle=" ($YearRequired".($MonthRequired ne 'all'?"-$MonthRequired":"").")"; + # Write head section + if ($BuildReportFormat eq 'xhtml' || $BuildReportFormat eq 'xml') { + if ($PageCode) { print "\n"; } + else { print "\n"; }; + if ($FrameName ne 'index') { print "\n"; } + else { print "\n"; } + print "\n"; + } else { + if ($FrameName ne 'index') { print "\n\n"; } + else { print "\n\n"; } + print "\n"; + } + print "\n"; + + print "\n"; + + if ($MetaRobot) { print "\n"; } + else { print "\n"; } + + # Affiche tag meta content-type + if ($BuildReportFormat eq 'xhtml' || $BuildReportFormat eq 'xml') { print ($ENV{'HTTP_USER_AGENT'}=~/MSIE|Googlebot/i?"\n":"\n"); } + else { print "\n"; } + + if ($Expires) { print "\n"; } + print "\n"; + if ($MetaRobot && $FrameName ne 'mainleft') { print "\n"; } + print "$Message[7] $SiteDomain$periodtitle\n"; + if ($FrameName ne 'index') { + + # A STYLE section must be in head section. Do not use " for number in a style section + print "\n"; + + if ($StyleSheet) { + print "\n"; + } + } + print "\n\n"; + if ($FrameName ne 'index') { + print "\n"; + } + } + $HeaderHTMLSent++; +} + +#------------------------------------------------------------------------------ +# Function: Write on ouput end of HTML page +# Parameters: 0|1 (0=no list plugins,1=list plugins) +# Input: %HTMLOutput $HTMLEndSection $FrameName $BuildReportFormat +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub html_end { + my $listplugins=shift||0; + if (scalar keys %HTMLOutput) { + + # Call to plugins' function AddHTMLBodyFooter + foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLBodyFooter'}}) { + my $function="AddHTMLBodyFooter_$pluginname()"; + eval("$function"); + } + + if ($FrameName ne 'index' && $FrameName ne 'mainleft') { + print "$Center

    \n"; + print ""; + print "Advanced Web Statistics $VERSION - Created by $PROG"; + if ($listplugins) { + my $atleastoneplugin=0; + foreach my $pluginname (keys %{$PluginsLoaded{'init'}}) { + if (! $atleastoneplugin) { $atleastoneplugin=1; print " (with plugin "; } + else { print ", "; } + print "$pluginname"; + } + if ($atleastoneplugin) { print ")"; } + } + print "
    \n"; + if ($HTMLEndSection) { print "
    \n$HTMLEndSection\n"; } + } + print "\n"; + if ($FrameName ne 'index') { + if ($FrameName ne 'mainleft' && $BuildReportFormat eq 'html') { print "
    \n"; } + print "\n"; + } + print "\n"; +# print "\n"; + } +} + +#------------------------------------------------------------------------------ +# Function: Print on stdout tab header of a chart +# Parameters: $title $tooltipnb [$width percentage of chart title] +# Input: None +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub tab_head { + my $title=shift; + my $tooltipnb=shift; + my $width=shift||70; + my $class=shift; + if ($width == 70 && $QueryString =~ /buildpdf/i) { print "\n"; } + else { print "
    \n"; } + + if ($tooltipnb) { + print ""; + } + else { + print ""; + } + print "\n"; + print "
    $title
    $title  
    \n"; + if ($width == 70 && $QueryString =~ /buildpdf/i) { print "\n"; } + else { print "
    \n"; } +} + +#------------------------------------------------------------------------------ +# Function: Print on stdout tab ender of a chart +# Parameters: None +# Input: None +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub tab_end { + my $string=shift; + print "
    "; + if ($string) { print "$string
    \n"; } + print "
    \n\n"; +} + +#------------------------------------------------------------------------------ +# Function: Write error message and exit +# Parameters: $message $secondmessage $thirdmessage $donotshowsetupinfo +# Input: $HeaderHTTPSent $HeaderHTMLSent %HTMLOutput $LogSeparator $LogFormat +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub error { + my $message=shift||''; if (scalar keys %HTMLOutput) { $message =~ s/\/>/g; } + my $secondmessage=shift||''; + my $thirdmessage=shift||''; + my $donotshowsetupinfo=shift||0; + + if (! $HeaderHTTPSent && $ENV{'GATEWAY_INTERFACE'}) { http_head(); } + if (! $HeaderHTMLSent && scalar keys %HTMLOutput) { print "\n"; $HeaderHTMLSent=1; } + if ($Debug) { debug("$message $secondmessage $thirdmessage",1); } + my $tagbold=''; my $tagunbold=''; my $tagbr=''; my $tagfontred=''; my $tagfontgrey=''; my $tagunfont=''; + if (scalar keys %HTMLOutput) { + $tagbold=''; $tagunbold=''; $tagbr='
    '; + $tagfontred=''; + $tagfontgrey=''; + $tagunfont=''; + } + if (! $ErrorMessages && $message =~ /^Format error$/i) { + # Files seems to have bad format + if (scalar keys %HTMLOutput) { print "

    \n"; } + if ($message !~ $LogSeparator) { + # Bad LogSeparator parameter + print "${tagfontred}AWStats did not found the ${tagbold}LogSeparator${tagunbold} in your log records.${tagbr}${tagunfont}\n"; + } + else { + # Bad LogFormat parameter + print "AWStats did not find any valid log lines that match your ${tagbold}LogFormat${tagunbold} parameter, in the ${NbOfLinesForCorruptedLog}th first non commented lines read of your log.${tagbr}\n"; + print "${tagfontred}Your log file ${tagbold}$thirdmessage${tagunbold} must have a bad format or ${tagbold}LogFormat${tagunbold} parameter setup does not match this format.${tagbr}${tagbr}${tagunfont}\n"; + print "Your AWStats ${tagbold}LogFormat${tagunbold} parameter is:\n"; + print "${tagbold}$LogFormat${tagunbold}${tagbr}\n"; + print "This means each line in your web server log file need to have "; + if ($LogFormat == 1) { + print "${tagbold}\"combined log format\"${tagunbold} like this:${tagbr}\n"; + print (scalar keys %HTMLOutput?"$tagfontgrey":""); + print "111.22.33.44 - - [10/Jan/2001:02:14:14 +0200] \"GET / HTTP/1.1\" 200 1234 \"http://www.fromserver.com/from.htm\" \"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\"\n"; + print (scalar keys %HTMLOutput?"$tagunfont${tagbr}${tagbr}\n":""); + } + if ($LogFormat == 2) { + print "${tagbold}\"MSIE Extended W3C log format\"${tagunbold} like this:${tagbr}\n"; + print (scalar keys %HTMLOutput?"$tagfontgrey":""); + print "date time c-ip c-username cs-method cs-uri-sterm sc-status sc-bytes cs-version cs(User-Agent) cs(Referer)\n"; + print (scalar keys %HTMLOutput?"$tagunfont${tagbr}${tagbr}\n":""); + } + if ($LogFormat == 3) { + print "${tagbold}\"WebStar native log format\"${tagunbold}${tagbr}\n"; + } + if ($LogFormat == 4) { + print "${tagbold}\"common log format\"${tagunbold} like this:${tagbr}\n"; + print (scalar keys %HTMLOutput?"$tagfontgrey":""); + print "111.22.33.44 - - [10/Jan/2001:02:14:14 +0200] \"GET / HTTP/1.1\" 200 1234\n"; + print (scalar keys %HTMLOutput?"$tagunfont${tagbr}${tagbr}\n":""); + } + if ($LogFormat == 5) { + print "${tagbold}\"ISA native log format\"${tagunbold}${tagbr}\n"; + } + if ($LogFormat == 6) { + print "${tagbold}\"Lotus Notes/Lotus Domino\"${tagunbold}${tagbr}\n"; + print (scalar keys %HTMLOutput?"$tagfontgrey":""); + print "111.22.33.44 - Firstname Middlename Lastname [10/Jan/2001:02:14:14 +0200] \"GET / HTTP/1.1\" 200 1234 \"http://www.fromserver.com/from.htm\" \"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\"\n"; + print (scalar keys %HTMLOutput?"
    ${tagbr}${tagbr}\n":""); + } + if ($LogFormat !~ /^[1-6]$/) { + print "the following personalized log format:${tagbr}\n"; + print (scalar keys %HTMLOutput?"$tagfontgrey":""); + print "$LogFormat\n"; + print (scalar keys %HTMLOutput?"$tagunfont${tagbr}${tagbr}\n":""); + } + print "And this is an example of records AWStats found in your log file (the record number $NbOfLinesForCorruptedLog in your log):\n"; + print (scalar keys %HTMLOutput?"
    $tagfontgrey":""); + print "$secondmessage"; + print (scalar keys %HTMLOutput?"$tagunfont${tagbr}${tagbr}":""); + print "\n"; + } + #print "Note: If your $NbOfLinesForCorruptedLog first lines in your log files are wrong because of "; + #print "a worm virus attack, you can increase the NbOfLinesForCorruptedLog parameter in config file.\n"; + #print "\n"; + } + else { + print (scalar keys %HTMLOutput?"
    $tagfontred\n":""); + print ($ErrorMessages?"$ErrorMessages":"Error: $message"); + print (scalar keys %HTMLOutput?"\n
    ":""); + print "\n"; + } + if (! $ErrorMessages && ! $donotshowsetupinfo) { + if ($message =~ /Couldn.t open config file/i) { + my $dir=$DIR; + if ($dir =~ /^\./) { $dir.='/../..'; } + else { $dir =~ s/[\\\/]?wwwroot[\/\\]cgi-bin[\\\/]?//; } + print "${tagbr}\n"; + if ($ENV{'GATEWAY_INTERFACE'}) { + print "- ${tagbold}Did you use the correct URL ?${tagunbold}${tagbr}\n"; + print "Example: http://localhost/awstats/awstats.pl?config=mysite${tagbr}\n"; + print "Example: http://127.0.0.1/cgi-bin/awstats.pl?config=mysite${tagbr}\n"; + } else { + print "- ${tagbold}Did you use correct config parameter ?${tagunbold}${tagbr}\n"; + print "Example: If your config file is awstats.mysite.conf, use -config=mysite\n"; + } + print "- ${tagbold}Did you create your config file 'awstats.$SiteConfig.conf' ?${tagunbold}${tagbr}\n"; + print "If not, you can run \"$dir/tools/configure.pl\"\nfrom command line, or create it manually.${tagbr}\n"; + print "${tagbr}\n"; + } + else { print "${tagbr}${tagbold}Setup (".($FileConfig?"'".$FileConfig."'":"Config")." file, web server or permissions) may be wrong.${tagunbold}${tagbr}\n"; } + print "Check config file, permissions and AWStats documentation (in 'docs' directory).\n"; + } + # Remove lock if not a lock message + if ($EnableLockForUpdate && $message !~ /lock file/) { &Lock_Update(0); } + if (scalar keys %HTMLOutput) { print "\n"; } + exit 1; +} + +#------------------------------------------------------------------------------ +# Function: Write a warning message +# Parameters: $message +# Input: $HeaderHTTPSent $HeaderHTMLSent $WarningMessage %HTMLOutput +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub warning { + my $messagestring=shift; + + if (! $HeaderHTTPSent && $ENV{'GATEWAY_INTERFACE'}) { http_head(); } + if (! $HeaderHTMLSent) { html_head(); } + if ($Debug) { debug("$messagestring",1); } + if ($WarningMessages) { + if (scalar keys %HTMLOutput) { + $messagestring =~ s/\n/\/g; + print "$messagestring
    \n"; + } + else { + print "$messagestring\n"; + } + } +} + +#------------------------------------------------------------------------------ +# Function: Write debug message and exit +# Parameters: $string $level +# Input: %HTMLOutput $Debug=required level $DEBUGFORCED=required level forced +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub debug { + my $level = $_[1] || 1; + + if (! $HeaderHTTPSent && $ENV{'GATEWAY_INTERFACE'}) { http_head(); } # To send the HTTP header and see debug + if ($level <= $DEBUGFORCED) { + my $debugstring = $_[0]; + if (! $DebugResetDone) { open(DEBUGFORCEDFILE,"debug.log"); close DEBUGFORCEDFILE; chmod 0666,"debug.log"; $DebugResetDone=1; } + open(DEBUGFORCEDFILE,">>debug.log"); + print DEBUGFORCEDFILE localtime(time)." - $$ - DEBUG $level - $debugstring\n"; + close DEBUGFORCEDFILE; + } + if ($DebugMessages && $level <= $Debug) { + my $debugstring = $_[0]; + if (scalar keys %HTMLOutput) { $debugstring =~ s/^ /   /; $debugstring .= "
    "; } + print localtime(time)." - DEBUG $level - $debugstring\n"; + } +} + +#------------------------------------------------------------------------------ +# Function: Optimize an array removing duplicate entries +# Parameters: @Array notcasesensitive=0|1 +# Input: None +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub OptimizeArray { + my $array=shift; + my @arrayunreg=map{if (/\(\?[-\w]*:(.*)\)/) { $1 } } @$array; + my $notcasesensitive=shift; + my $searchlist=0; + if ($Debug) { debug("OptimizeArray (notcasesensitive=$notcasesensitive)",4); } + while ($searchlist>-1 && @arrayunreg) { + my $elemtoremove=-1; + OPTIMIZELOOP: + foreach my $i ($searchlist..(scalar @arrayunreg)-1) { + # Search if $i elem is already treated by another elem + foreach my $j (0..(scalar @arrayunreg)-1) { + if ($i == $j) { next; } + my $parami=$notcasesensitive?lc($arrayunreg[$i]):$arrayunreg[$i]; + my $paramj=$notcasesensitive?lc($arrayunreg[$j]):$arrayunreg[$j]; + if ($Debug) { debug(" Compare $i ($parami) to $j ($paramj)",4); } + if (index($parami,$paramj)>-1) { + if ($Debug) { debug(" Elem $i ($arrayunreg[$i]) already treated with elem $j ($arrayunreg[$j])",4); } + $elemtoremove=$i; + last OPTIMIZELOOP; + } + } + } + if ($elemtoremove > -1) { + if ($Debug) { debug(" Remove elem $elemtoremove - $arrayunreg[$elemtoremove]",4); } + splice @arrayunreg, $elemtoremove, 1; + $searchlist=$elemtoremove; + } + else { + $searchlist=-1; + } + } + if ($notcasesensitive) { return map{qr/$_/i} @arrayunreg; } + return map{qr/$_/} @arrayunreg; +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in SkipDNSLookupFor array +# Parameters: ip @SkipDNSLookupFor (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +#------------------------------------------------------------------------------ +sub SkipDNSLookup { + foreach (@SkipDNSLookupFor) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @SkipDNSLookupFor +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in SkipHosts array +# Parameters: host @SkipHosts (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +#------------------------------------------------------------------------------ +sub SkipHost { + foreach (@SkipHosts) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @SkipHosts +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in SkipUserAgents array +# Parameters: useragent @SkipUserAgents (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +#------------------------------------------------------------------------------ +sub SkipUserAgent { + foreach (@SkipUserAgents) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @SkipUserAgent +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in SkipFiles array +# Parameters: url @SkipFiles (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +#------------------------------------------------------------------------------ +sub SkipFile { + foreach (@SkipFiles) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @SkipFiles +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in OnlyHosts array +# Parameters: host @OnlyHosts (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +#------------------------------------------------------------------------------ +sub OnlyHost { + foreach (@OnlyHosts) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @OnlyHosts +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in OnlyUserAgents array +# Parameters: useragent @OnlyUserAgents (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +#------------------------------------------------------------------------------ +sub OnlyUserAgent { + foreach (@OnlyUserAgents) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @OnlyHosts +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in OnlyUsers array +# Parameters: useragent @OnlyUsers (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +# Author: E-Lane +#------------------------------------------------------------------------------ +sub OnlyUser { + foreach (@OnlyUsers) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @OnlyUsers +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in OnlyLines array +# Parameters: useragent @OnlyLines (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +# Author: E-Lane +#------------------------------------------------------------------------------ +sub OnlyLine { + foreach (@OnlyLines) { if ($_[0] =~ /$_/) { return 1; } } + 0; # Not in @OnlyUsers +} + +#------------------------------------------------------------------------------ +# Function: Check if parameter is in OnlyFiles array +# Parameters: url @OnlyFiles (a NOT case sensitive precompiled regex array) +# Return: 0 Not found, 1 Found +#------------------------------------------------------------------------------ +sub OnlyFile { + foreach (@OnlyFiles) { + if ($_[0] =~ /$_/) { return 1; } + } + 0; # Not in @OnlyFiles +} + +#------------------------------------------------------------------------------ +# Function: Return day of week of a day +# Parameters: $day $month $year +# Return: 0-6 +#------------------------------------------------------------------------------ +sub DayOfWeek { + my ($day, $month, $year) = @_; + if ($Debug) { debug("DayOfWeek for $day $month $year",4); } + if ($month < 3) { $month += 10; $year--; } + else { $month -= 2; } + my $cent = sprintf("%1i",($year/100)); + my $y = ($year % 100); + my $dw = (sprintf("%1i",(2.6*$month)-0.2) + $day + $y + sprintf("%1i",($y/4)) + sprintf("%1i",($cent/4)) - (2*$cent)) % 7; + $dw += 7 if ($dw<0); + if ($Debug) { debug(" is $dw",4); } + return $dw; +} + +#------------------------------------------------------------------------------ +# Function: Return 1 if a date exists +# Parameters: $day $month $year +# Return: 1 if date exists else 0 +#------------------------------------------------------------------------------ +sub DateIsValid { + my ($day, $month, $year) = @_; + if ($Debug) { debug("DateIsValid for $day $month $year",4); } + if ($day < 1) { return 0; } + if ($day > 31) { return 0; } + if ($month==4 || $month==6 || $month==9 || $month==11) { + if ($day > 30) { return 0; } + } + elsif ($month==2) { + my $leapyear=($year%4==0?1:0); # A leap year every 4 years + if ($year%100==0 && $year%400!=0) { $leapyear=0; } # Except if year is 100x and not 400x + if ($day > (28+$leapyear)) { return 0; } + } + return 1; +} + +#------------------------------------------------------------------------------ +# Function: Return string of visit duration +# Parameters: $starttime $endtime +# Input: None +# Output: None +# Return: A string that identify the visit duration range +#------------------------------------------------------------------------------ +sub GetSessionRange { + my $starttime = my $endtime; + if (shift =~ /$regdate/o) { $starttime = Time::Local::timelocal($6,$5,$4,$3,$2-1,$1); } + if (shift =~ /$regdate/o) { $endtime = Time::Local::timelocal($6,$5,$4,$3,$2-1,$1); } + my $delay=$endtime-$starttime; + if ($Debug) { debug("GetSessionRange $endtime - $starttime = $delay",4); } + if ($delay <= 30) { return $SessionsRange[0]; } + if ($delay <= 120) { return $SessionsRange[1]; } + if ($delay <= 300) { return $SessionsRange[2]; } + if ($delay <= 900) { return $SessionsRange[3]; } + if ($delay <= 1800) { return $SessionsRange[4]; } + if ($delay <= 3600) { return $SessionsRange[5]; } + return $SessionsRange[6]; +} + +#------------------------------------------------------------------------------ +# Function: Read config file +# Parameters: None or configdir to scan +# Input: $DIR $PROG $SiteConfig +# Output: Global variables +# Return: - +#------------------------------------------------------------------------------ +sub Read_Config { + # Check config file in common possible directories : + # Windows : "$DIR" (same dir than awstats.pl) + # Standard, Mandrake and Debian package : "/etc/awstats" + # Other possible directories : "/usr/local/etc/awstats", "/etc" + # FHS standard, Suse package : "/etc/opt/awstats" + my $configdir=shift; + my @PossibleConfigDir=(); + + if ($configdir) { @PossibleConfigDir=("$configdir","$DIR","${DIR}/../../../config","/etc/awstats","/usr/local/etc/awstats","/etc","/etc/opt/awstats"); } + else { @PossibleConfigDir=("$DIR","${DIR}/../../../config","/etc/awstats","/usr/local/etc/awstats","/etc","/etc/opt/awstats"); } + + # Open config file + $FileConfig=''; +# $FileConfig=$FileSuffix=''; + foreach (@PossibleConfigDir) { + my $searchdir=$_; + if ($searchdir && $searchdir !~ /[\\\/]$/) { $searchdir .= "/"; } + if (open(CONFIG,"$searchdir$PROG.$SiteConfig.conf")) { $FileConfig="$searchdir$PROG.$SiteConfig.conf"; $FileSuffix=".$SiteConfig$FileSuffix"; last; } + if (open(CONFIG,"$searchdir$PROG.conf")) { $FileConfig="$searchdir$PROG.conf"; $FileSuffix="$FileSuffix"; last; } + } + if (! $FileConfig) { error("Couldn't open config file \"$PROG.$SiteConfig.conf\" nor \"$PROG.conf\" after searching in path \"".join(',',@PossibleConfigDir)."\": $!"); } + + # Analyze config file content and close it + &Parse_Config( *CONFIG , 1 , $FileConfig); + close CONFIG; + + # If parameter NotPageList not found, init for backward compatibility + if (! $FoundNotPageList) { + %NotPageList=('css'=>1,'js'=>1,'class'=>1,'gif'=>1,'jpg'=>1,'jpeg'=>1,'png'=>1,'bmp'=>1); + } + # If parameter ValidHTTPCodes empty, init for backward compatibility + if (! scalar keys %ValidHTTPCodes) { $ValidHTTPCodes{"200"}=$ValidHTTPCodes{"304"}=1; } + # If parameter ValidSMTPCodes empty, init for backward compatibility + if (! scalar keys %ValidSMTPCodes) { $ValidSMTPCodes{"1"}=$ValidSMTPCodes{"250"}=1; } +} + +#------------------------------------------------------------------------------ +# Function: Parse content of a config file +# Parameters: opened file handle, depth level, file name +# Input: - +# Output: Global variables +# Return: - +#------------------------------------------------------------------------------ +sub Parse_Config { + my ( $confighandle ) = $_[0]; + my $level = $_[1]; + my $configFile = $_[2]; + my $versionnum=0; + my $conflinenb=0; + + if ($level > 10) { error("$PROG can't read down more than 10 level of includes. Check that no 'included' config files include their parent config file (this cause infinite loop)."); } + + while (<$confighandle>) { + chomp $_; s/\r//; + $conflinenb++; + + # Extract version from first line + if (! $versionnum && $_ =~ /^# AWSTATS CONFIGURE FILE (\d+).(\d+)/i) { + $versionnum=($1*1000)+$2; + #if ($Debug) { debug(" Configure file version is $versionnum",1); } + next; + } + + if ($_ =~ /^\s*$/) { next; } + + # Check includes + if ($_ =~ /^Include "([^\"]+)"/ || $_ =~ /^#include "([^\"]+)"/) { # #include kept for backward compatibility + my $includeFile = $1; + if ($Debug) { debug("Found an include : $includeFile",2); } + if ( $includeFile !~ /^[\\\/]/ ) { + # Correct relative include files + if ($FileConfig =~ /^(.*[\\\/])[^\\\/]*$/) { $includeFile = "$1$includeFile"; } + } + if ($level > 1) { + warning("Warning: Perl versions before 5.6 cannot handle nested includes"); + next; + } + if ( open( CONFIG_INCLUDE, $includeFile ) ) { + &Parse_Config( *CONFIG_INCLUDE , $level+1, $includeFile); + close( CONFIG_INCLUDE ); + } + else { + error("Could not open include file: $includeFile" ); + } + next; + } + + # Remove comments + if ($_ =~ /^\s*#/) { next; } + $_ =~ s/\s#.*$//; + + # Extract param and value + my ($param,$value)=split(/=/,$_,2); + $param =~ s/^\s+//; $param =~ s/\s+$//; + + # If not a param=value, try with next line + if (! $param) { warning("Warning: Syntax error line $conflinenb in file '$configFile'. Config line is ignored."); next; } + if (! defined $value) { warning("Warning: Syntax error line $conflinenb in file '$configFile'. Config line is ignored."); next; } + + if ($value) { + $value =~ s/^\s+//; $value =~ s/\s+$//; + $value =~ s/^\"//; $value =~ s/\";?$//; + # Replace __MONENV__ with value of environnement variable MONENV + # Must be able to replace __VAR_1____VAR_2__ + while ($value =~ /__([^\s_]+(?:_[^\s_]+)*)__/) { my $var=$1; $value =~ s/__${var}__/$ENV{$var}/g; } + } + + # Initialize parameter for (param,value) + if ($param =~ /^LogFile/) { + if ($QueryString !~ /logfile=([^\s&]+)/i) { $LogFile=$value; } + next; + } + if ($param =~ /^DirIcons/) { + if ($QueryString !~ /diricons=([^\s&]+)/i) { $DirIcons=$value; } + next; + } +#We have modified this option, because is more important the line command param + if ($param =~ /^SiteDomain/) { + # No regex test as SiteDomain is always exact value + if ($SiteDomain eq '') { $SiteDomain=$value;} + next; + } + if ($param =~ /^HostAliases/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ s/^\@//) { # If list of hostaliases in a file + open(DATAFILE,"<$elem") || error("Failed to open file '$elem' declared in HostAliases parameter"); + my @val=map(/^(.*)$/i,); + push @HostAliases, map{qr/^$_$/i} @val; + close(DATAFILE); + } + else { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @HostAliases, qr/$elem/i; } + } + } + next; + } + # Special optional setup params + if ($param =~ /^SkipDNSLookupFor/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @SkipDNSLookupFor, qr/$elem/i; } + } + next; + } + if ($param =~ /^AllowAccessFromWebToFollowingAuthenticatedUsers/) { + foreach (split(/\s+/,$value)) { push @AllowAccessFromWebToFollowingAuthenticatedUsers,$_; } + next; + } + if ($param =~ /^DefaultFile/) { + foreach my $elem (split(/\s+/,$value)) { + # No REGEX for this option + #if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + #else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @DefaultFile,$elem; } + } + next; + } + if ($param =~ /^SkipHosts/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @SkipHosts, qr/$elem/i; } + } + next; + } + if ($param =~ /^SkipUserAgents/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @SkipUserAgents, qr/$elem/i; } + } + next; + } + if ($param =~ /^SkipFiles/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @SkipFiles, qr/$elem/i; } + } + next; + } + if ($param =~ /^OnlyHosts/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyHosts, qr/$elem/i; } + } + next; + } + if ($param =~ /^OnlyUserAgents/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyUserAgents, qr/$elem/i; } + } + next; + } + if ($param =~ /^OnlyFiles/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyFiles, qr/$elem/i; } + } + next; + } +#Params OnlyXXX defined by E-Lane + if ($param =~ /^OnlyUsers/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyUsers, qr/$elem/i; } + } + next; + } + if ($param =~ /^OnlyLines/) { + foreach my $elem (split(/\s+/,$value)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; } + else { $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyLines, qr/$elem/i; } + } + next; + } + if ($param =~ /^NotPageList/) { + foreach (split(/\s+/,$value)) { $NotPageList{$_}=1; } + $FoundNotPageList=1; + next; + } + if ($param =~ /^ValidHTTPCodes/) { + foreach (split(/\s+/,$value)) { $ValidHTTPCodes{$_}=1; } + next; + } + if ($param =~ /^ValidSMTPCodes/) { + foreach (split(/\s+/,$value)) { $ValidSMTPCodes{$_}=1; } + next; + } + if ($param =~ /^URLWithQueryWithOnlyFollowingParameters$/) { + @URLWithQueryWithOnly=split(/\s+/,$value); + next; + } + if ($param =~ /^URLWithQueryWithoutFollowingParameters$/) { + @URLWithQueryWithout=split(/\s+/,$value); + next; + } + + # Extra parameters + if ($param =~ /^ExtraSectionName(\d+)/) { $ExtraName[$1]=$value; next; } + if ($param =~ /^ExtraSectionCodeFilter(\d+)/) { @{$ExtraCodeFilter[$1]}=split(/\s+/,$value); next; } + if ($param =~ /^ExtraSectionCondition(\d+)/) { $ExtraCondition[$1]=$value; next; } + if ($param =~ /^ExtraSectionStatTypes(\d+)/) { $ExtraStatTypes[$1]=$value; next; } + if ($param =~ /^ExtraSectionFirstColumnTitle(\d+)/) { $ExtraFirstColumnTitle[$1]=$value; next; } + if ($param =~ /^ExtraSectionFirstColumnValues(\d+)/) { $ExtraFirstColumnValues[$1]=$value; next; } + if ($param =~ /^ExtraSectionFirstColumnFormat(\d+)/) { $ExtraFirstColumnFormat[$1]=$value; next; } + if ($param =~ /^ExtraSectionAddAverageRow(\d+)/) { $ExtraAddAverageRow[$1]=$value; next; } + if ($param =~ /^ExtraSectionAddSumRow(\d+)/) { $ExtraAddSumRow[$1]=$value; next; } + if ($param =~ /^MaxNbOfExtra(\d+)/) { $MaxNbOfExtra[$1]=$value; next; } + if ($param =~ /^MinHitExtra(\d+)/) { $MinHitExtra[$1]=$value; next; } + # Special appearance parameters + if ($param =~ /^LoadPlugin/) { push @PluginsToLoad, $value; next; } + # Other parameter checks we need to put after MaxNbOfExtra and MinHitExtra + if ($param =~ /^MaxNbOf(\w+)/) { $MaxNbOf{$1}=$value; next; } + if ($param =~ /^MinHit(\w+)/) { $MinHit{$1}=$value; next; } + # Check if this is a known parameter +# if (! $ConfOk{$param}) { error("Unknown config parameter '$param' found line $conflinenb in file \"configFile\""); } + # If parameters was not found previously, defined variable with name of param to value + $$param=$value; + } + + # For backward compatibility + if ($versionnum < 5001) { $BarHeight=$BarHeight>>1; } + + if ($Debug) { debug("Config file read was \"$configFile\" (level $level)"); } +} + +#------------------------------------------------------------------------------ +# Function: Load the reference databases +# Parameters: List of files to load +# Input: $DIR +# Output: Arrays and Hash tables are defined +# Return: - +#------------------------------------------------------------------------------ +sub Read_Ref_Data { + # Check lib files in common possible directories : + # Windows and standard package: "$DIR/lib" (lib in same dir than awstats.pl) + # Debian package : "/usr/share/awstats/lib" + my @PossibleLibDir=("$DIR/lib","/usr/share/awstats/lib"); + my %FilePath=(); my %DirAddedInINC=(); + my @FileListToLoad=(); + while (my $file=shift) { push @FileListToLoad, "$file.pm"; } + if ($Debug) { debug("Call to Read_Ref_Data with files to load: ".(join(',',@FileListToLoad))); } + foreach my $file (@FileListToLoad) { + foreach my $dir (@PossibleLibDir) { + my $searchdir=$dir; + if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } + if (! $FilePath{$file}) { # To not load twice same file in different path + if (-s "${searchdir}${file}") { + $FilePath{$file}="${searchdir}${file}"; + if ($Debug) { debug("Call to Read_Ref_Data [FilePath{$file}=\"$FilePath{$file}\"]"); } + # Note: cygwin perl 5.8 need a push + require file + if (! $DirAddedInINC{"$dir"}) { + push @INC, "$dir"; + $DirAddedInINC{"$dir"}=1; + } + my $loadret=require "$file"; + #my $loadret=(require "$FilePath{$file}"||require "${file}"); + } + } + } + if (! $FilePath{$file}) { + my $filetext=$file; $filetext =~ s/\.pm$//; $filetext =~ s/_/ /g; + warning("Warning: Can't read file \"$file\" ($filetext detection will not work correctly).\nCheck if file is in \"".($PossibleLibDir[0])."\" directory and is readable."); + } + } + # Sanity check (if loaded) + if ((scalar keys %OSHashID) && @OSSearchIDOrder != scalar keys %OSHashID) { error("Not same number of records of OSSearchIDOrder (".(@OSSearchIDOrder)." entries) and OSHashID (".(scalar keys %OSHashID)." entries) in OS database. Check your file ".$FilePath{"operating_systems.pm"}); } + if ((scalar keys %SearchEnginesHashID) && (@SearchEnginesSearchIDOrder_list1+@SearchEnginesSearchIDOrder_list2+@SearchEnginesSearchIDOrder_listgen) != scalar keys %SearchEnginesHashID) { error("Not same number of records of SearchEnginesSearchIDOrder_listx (total is ".(@SearchEnginesSearchIDOrder_list1+@SearchEnginesSearchIDOrder_list2+@SearchEnginesSearchIDOrder_listgen)." entries) and SearchEnginesHashID (".(scalar keys %SearchEnginesHashID)." entries) in Search Engines database. Check your file ".$FilePath{"search_engines.pm"}); } + if ((scalar keys %BrowsersHashIDLib) && @BrowsersSearchIDOrder != (scalar keys %BrowsersHashIDLib) - 2) { error("Not same number of records of BrowsersSearchIDOrder (".(@BrowsersSearchIDOrder)." entries) and BrowsersHashIDLib (".((scalar keys %BrowsersHashIDLib) - 2)." entries without msie and netscape) in Browsers database. Check your file ".$FilePath{"browsers.pm"}); } + if ((scalar keys %RobotsHashIDLib) && (@RobotsSearchIDOrder_list1+@RobotsSearchIDOrder_list2+@RobotsSearchIDOrder_listgen) != (scalar keys %RobotsHashIDLib) - 1) { error("Not same number of records of RobotsSearchIDOrder_listx (total is ".(@RobotsSearchIDOrder_list1+@RobotsSearchIDOrder_list2+@RobotsSearchIDOrder_listgen)." entries) and RobotsHashIDLib (".((scalar keys %RobotsHashIDLib) - 1)." entries without 'unknown') in Robots database. Check your file ".$FilePath{"robots.pm"}); } +} + + +#------------------------------------------------------------------------------ +# Function: Get the messages for a specified language +# Parameters: LanguageId +# Input: $DirLang $DIR +# Output: $Message table is defined in memory +# Return: None +#------------------------------------------------------------------------------ +sub Read_Language_Data { + # Check lang files in common possible directories : + # Windows and standard package: "$DIR/lang" (lang in same dir than awstats.pl) + # Debian package : "/usr/share/awstats/lang" + my @PossibleLangDir=("$DirLang","$DIR/lang","/usr/share/awstats/lang"); + + my $FileLang=''; + foreach (@PossibleLangDir) { + my $searchdir=$_; + if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } + if (open(LANG,"${searchdir}awstats-$_[0].txt")) { $FileLang="${searchdir}awstats-$_[0].txt"; last; } + } + # If file not found, we try english + if (! $FileLang) { + foreach (@PossibleLangDir) { + my $searchdir=$_; + if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } + if (open(LANG,"${searchdir}awstats-en.txt")) { $FileLang="${searchdir}awstats-en.txt"; last; } + } + } + if ($Debug) { debug("Call to Read_Language_Data [FileLang=\"$FileLang\"]"); } + if ($FileLang) { + my $i = 0; + binmode LANG; # Might avoid 'Malformed UTF-8 errors' + my $cregcode=qr/^PageCode=[\t\s\"\']*([\w-]+)/i; + my $cregdir=qr/^PageDir=[\t\s\"\']*([\w-]+)/i; + my $cregmessage=qr/^Message\d+=/i; + while () { + chomp $_; s/\r//; + if ($_ =~ /$cregcode/o) { $PageCode = $1; } + if ($_ =~ /$cregdir/o) { $PageDir = $1; } + if ($_ =~ s/$cregmessage//o) { + $_ =~ s/#.*//; # Remove comments + $_ =~ tr/\t / /s; # Change all blanks into " " + $_ =~ s/^\s+//; $_ =~ s/\s+$//; + $_ =~ s/^\"//; $_ =~ s/\"$//; + $Message[$i] = $_; + $i++; + } + } + close(LANG); + } + else { + warning("Warning: Can't find language files for \"$_[0]\". English will be used."); + } + # Some language string changes + if ($LogType eq 'M') { # For mail + $Message[8]=$Message[151]; + $Message[9]=$Message[152]; + $Message[57]=$Message[149]; + $Message[75]=$Message[150]; + } + if ($LogType eq 'F') { # For web + + } +} + + +#------------------------------------------------------------------------------ +# Function: Check if all parameters are correctly defined. If not set them to default. +# Parameters: None +# Input: All global variables +# Output: Change on some global variables +# Return: None +#------------------------------------------------------------------------------ +sub Check_Config { + if ($Debug) { debug("Call to Check_Config"); } + + my %MonthNumLibEn = ("01","Jan","02","Feb","03","Mar","04","Apr","05","May","06","Jun","07","Jul","08","Aug","09","Sep","10","Oct","11","Nov","12","Dec"); + + # Show initial values of main parameters before check + if ($Debug) { + debug(" LogFile='$LogFile'",2); + debug(" LogType='$LogType'",2); + debug(" LogFormat='$LogFormat'",2); + debug(" LogSeparator='$LogSeparator'",2); + debug(" DNSLookup='$DNSLookup'",2); + debug(" DirData='$DirData'",2); + debug(" DirCgi='$DirCgi'",2); + debug(" DirIcons='$DirIcons'",2); + debug(" NotPageList ".(join(',',keys %NotPageList)),2); + debug(" ValidHTTPCodes ".(join(',',keys %ValidHTTPCodes)),2); + debug(" ValidSMTPCodes ".(join(',',keys %ValidSMTPCodes)),2); + debug(" UseFramesWhenCGI=$UseFramesWhenCGI",2); + debug(" BuildReportFormat=$BuildReportFormat",2); + debug(" BuildHistoryFormat=$BuildHistoryFormat",2); + debug(" URLWithQueryWithOnlyFollowingParameters=".(join(',',@URLWithQueryWithOnly)),2); + debug(" URLWithQueryWithoutFollowingParameters=".(join(',',@URLWithQueryWithout)),2); + } + + # Main section + while ($LogFile =~ /%([ymdhwYMDHWNSO]+)-(\(\d+\)|\d+)/) { + # Accept tag %xx-dd and %xx-(dd) + my $timetag="$1"; + my $timephase=quotemeta("$2"); + my $timephasenb="$2"; $timephasenb=~s/[^\d]//g; + if ($Debug) { debug(" Found a time tag '$timetag' with a phase of '$timephasenb' hour in log file name",1); } + # Get older time + my ($oldersec,$oldermin,$olderhour,$olderday,$oldermonth,$olderyear,$olderwday,$olderyday) = localtime($starttime-($timephasenb*3600)); + my $olderweekofmonth=int($olderday/7); + my $olderweekofyear=int(($olderyday-1+6-($olderwday==0?6:$olderwday-1))/7)+1; if ($olderweekofyear > 52) { $olderweekofyear = 1; } + my $olderdaymod=$olderday%7; + $olderwday++; + my $olderns=Time::Local::timegm(0,0,0,$olderday,$oldermonth,$olderyear); + if ($olderdaymod <= $olderwday) { if (($olderwday != 7) || ($olderdaymod != 0)) { $olderweekofmonth=$olderweekofmonth+1; } } + if ($olderdaymod > $olderwday) { $olderweekofmonth=$olderweekofmonth+2; } + # Change format of time variables + $olderweekofmonth = "0$olderweekofmonth"; + if ($olderweekofyear < 10) { $olderweekofyear = "0$olderweekofyear"; } + if ($olderyear < 100) { $olderyear+=2000; } else { $olderyear+=1900; } + my $oldersmallyear=$olderyear;$oldersmallyear =~ s/^..//; + if (++$oldermonth < 10) { $oldermonth = "0$oldermonth"; } + if ($olderday < 10) { $olderday = "0$olderday"; } + if ($olderhour < 10) { $olderhour = "0$olderhour"; } + if ($oldermin < 10) { $oldermin = "0$oldermin"; } + if ($oldersec < 10) { $oldersec = "0$oldersec"; } + # Replace tag with new value + if ($timetag eq 'YYYY') { $LogFile =~ s/%YYYY-$timephase/$olderyear/ig; next; } + if ($timetag eq 'YY') { $LogFile =~ s/%YY-$timephase/$oldersmallyear/ig; next; } + if ($timetag eq 'MM') { $LogFile =~ s/%MM-$timephase/$oldermonth/ig; next; } + if ($timetag eq 'MO') { $LogFile =~ s/%MO-$timephase/$MonthNumLibEn{$oldermonth}/ig; next; } + if ($timetag eq 'DD') { $LogFile =~ s/%DD-$timephase/$olderday/ig; next; } + if ($timetag eq 'HH') { $LogFile =~ s/%HH-$timephase/$olderhour/ig; next; } + if ($timetag eq 'NS') { $LogFile =~ s/%NS-$timephase/$olderns/ig; next; } + if ($timetag eq 'WM') { $LogFile =~ s/%WM-$timephase/$olderweekofmonth/g; next; } + if ($timetag eq 'Wm') { my $olderweekofmonth0=$olderweekofmonth-1; $LogFile =~ s/%Wm-$timephase/$olderweekofmonth0/g; next; } + if ($timetag eq 'WY') { $LogFile =~ s/%WY-$timephase/$olderweekofyear/g; next; } + if ($timetag eq 'Wy') { my $olderweekofyear0=sprintf("%02d",$olderweekofyear-1); $LogFile =~ s/%Wy-$timephase/$olderweekofyear0/g; next; } + if ($timetag eq 'DW') { $LogFile =~ s/%DW-$timephase/$olderwday/g; next; } + if ($timetag eq 'Dw') { my $olderwday0=$olderwday-1; $LogFile =~ s/%Dw-$timephase/$olderwday0/g; next; } + # If unknown tag + error("Unknown tag '\%$timetag' in LogFile parameter."); + } + # Replace %YYYY %YY %MM %DD %HH with current value. Kept for backward compatibility. + $LogFile =~ s/%YYYY/$nowyear/ig; + $LogFile =~ s/%YY/$nowsmallyear/ig; + $LogFile =~ s/%MM/$nowmonth/ig; + $LogFile =~ s/%MO/$MonthNumLibEn{$nowmonth}/ig; + $LogFile =~ s/%DD/$nowday/ig; + $LogFile =~ s/%HH/$nowhour/ig; + $LogFile =~ s/%NS/$nowns/ig; + $LogFile =~ s/%WM/$nowweekofmonth/g; + my $nowweekofmonth0=$nowweekofmonth-1; $LogFile =~ s/%Wm/$nowweekofmonth0/g; + $LogFile =~ s/%WY/$nowweekofyear/g; + my $nowweekofyear0=$nowweekofyear-1; $LogFile =~ s/%Wy/$nowweekofyear0/g; + $LogFile =~ s/%DW/$nowwday/g; + my $nowwday0=$nowwday-1; $LogFile =~ s/%Dw/$nowwday0/g; + if (! $LogFile) { error("LogFile parameter is not defined in config/domain file"); } + if ($LogType !~ /[WSMF]/i) { $LogType='W'; } + $LogFormat =~ s/\\//g; + if (! $LogFormat) { error("LogFormat parameter is not defined in config/domain file"); } + if ($LogFormat =~ /^\d$/ && $LogFormat !~ /[1-6]/) { error("LogFormat parameter is wrong in config/domain file. Value is '$LogFormat' (should be 1,2,3,4,5 or a 'personalized AWStats log format string')"); } + $LogSeparator||="\\s"; + $DirData||='.'; + $DirCgi||='/cgi-bin'; + $DirIcons||='/icon'; + if ($DNSLookup !~ /[0-2]/) { error("DNSLookup parameter is wrong in config/domain file. Value is '$DNSLookup' (should be 0 or 1)"); } + if (! $SiteDomain) { error("SiteDomain parameter not defined in your config/domain file. You must add it for using this version of AWStats."); } + if ($AllowToUpdateStatsFromBrowser !~ /[0-1]/) { $AllowToUpdateStatsFromBrowser=0; } + if ($AllowFullYearView !~ /[0-3]/) { $AllowFullYearView=2; } + # Optional setup section + if ($EnableLockForUpdate !~ /[0-1]/) { $EnableLockForUpdate=0; } + $DNSStaticCacheFile||='dnscache.txt'; + $DNSLastUpdateCacheFile||='dnscachelastupdate.txt'; + if ($DNSStaticCacheFile eq $DNSLastUpdateCacheFile) { error("DNSStaticCacheFile and DNSLastUpdateCacheFile must have different values."); } + if ($AllowAccessFromWebToAuthenticatedUsersOnly !~ /[0-1]/) { $AllowAccessFromWebToAuthenticatedUsersOnly=0; } + if ($CreateDirDataIfNotExists !~ /[0-1]/) { $CreateDirDataIfNotExists=0; } + if ($BuildReportFormat !~ /html|xhtml|xml/i) { $BuildReportFormat='html'; } + if ($BuildHistoryFormat !~ /text|xml/) { $BuildHistoryFormat='text'; } + if ($SaveDatabaseFilesWithPermissionsForEveryone !~ /[0-1]/) { $SaveDatabaseFilesWithPermissionsForEveryone=1; } + if ($PurgeLogFile !~ /[0-1]/) { $PurgeLogFile=0; } + if ($ArchiveLogRecords !~ /[0-1]/) { $ArchiveLogRecords=0; } + if ($KeepBackupOfHistoricFiles !~ /[0-1]/) { $KeepBackupOfHistoricFiles=0; } + $DefaultFile[0]||='index.html'; + if ($AuthenticatedUsersNotCaseSensitive !~ /[0-1]/) { $AuthenticatedUsersNotCaseSensitive=0; } + if ($URLNotCaseSensitive !~ /[0-1]/) { $URLNotCaseSensitive=0; } + if ($URLWithAnchor !~ /[0-1]/) { $URLWithAnchor=0; } + $URLQuerySeparators =~ s/\s//g; + if (! $URLQuerySeparators) { $URLQuerySeparators='?;'; } + if ($URLWithQuery !~ /[0-1]/) { $URLWithQuery=0; } + if ($URLReferrerWithQuery !~ /[0-1]/) { $URLReferrerWithQuery=0; } + if ($WarningMessages !~ /[0-1]/) { $WarningMessages=1; } + if ($DebugMessages !~ /[0-1]/) { $DebugMessages=1; } + if ($NbOfLinesForCorruptedLog !~ /^\d+/ || $NbOfLinesForCorruptedLog<1) { $NbOfLinesForCorruptedLog=50; } + if ($Expires !~ /^\d+/) { $Expires=0; } + if ($DecodeUA !~ /[0-1]/) { $DecodeUA=0; } + $MiscTrackerUrl||='/js/awstats_misc_tracker.js'; + # Optional accuracy setup section + if ($LevelForWormsDetection !~ /^\d+/) { $LevelForWormsDetection=0; } + if ($LevelForRobotsDetection !~ /^\d+/) { $LevelForRobotsDetection=2; } + if ($LevelForBrowsersDetection !~ /^\d+/) { $LevelForBrowsersDetection=2; } + if ($LevelForOSDetection !~ /^\d+/) { $LevelForOSDetection=2; } + if ($LevelForRefererAnalyze !~ /^\d+/) { $LevelForRefererAnalyze=2; } + if ($LevelForFileTypesDetection !~ /^\d+/) { $LevelForFileTypesDetection=2; } + if ($LevelForSearchEnginesDetection !~ /^\d+/) { $LevelForSearchEnginesDetection=2; } + if ($LevelForKeywordsDetection !~ /^\d+/) { $LevelForKeywordsDetection=2; } + # Optional extra setup section + foreach my $extracpt (1..@ExtraName-1) { + if ($ExtraStatTypes[$extracpt] !~ /[PHBL]/) { $ExtraStatTypes[$extracpt]='PHBL'; } + if ($MaxNbOfExtra[$extracpt] !~ /^\d+$/ || $MaxNbOfExtra[$extracpt]<1) { $MaxNbOfExtra[$extracpt]=20; } + if ($MinHitExtra[$extracpt] !~ /^\d+$/ || $MinHitExtra[$extracpt]<1) { $MinHitExtra[$extracpt]=1; } + if (! $ExtraFirstColumnValues[$extracpt]) { error("Extra section number $extracpt is defined without ExtraSectionFirstColumnValues$extracpt parameter"); } + if (! $ExtraFirstColumnFormat[$extracpt]) { $ExtraFirstColumnFormat[$extracpt] = '%s'; } + } + # Optional appearance setup section + if ($MaxRowsInHTMLOutput !~ /^\d+/ || $MaxRowsInHTMLOutput<1) { $MaxRowsInHTMLOutput=1000; } + if ($ShowMenu !~ /[01]/) { $ShowMenu=1; } + if ($ShowMonthStats !~ /[01UVPHB]/) { $ShowMonthStats='UVPHB'; } + if ($ShowDaysOfMonthStats !~ /[01VPHB]/) { $ShowDaysOfMonthStats='VPHB'; } + if ($ShowDaysOfWeekStats !~ /[01PHBL]/) { $ShowDaysOfWeekStats='PHBL'; } + if ($ShowHoursStats !~ /[01PHBL]/) { $ShowHoursStats='PHBL'; } + if ($ShowDomainsStats !~ /[01PHB]/) { $ShowDomainsStats='PHB'; } + if ($ShowHostsStats !~ /[01PHBL]/) { $ShowHostsStats='PHBL'; } + if ($ShowAuthenticatedUsers !~ /[01PHBL]/) { $ShowAuthenticatedUsers=0; } + if ($ShowRobotsStats !~ /[01HBL]/) { $ShowRobotsStats='HBL'; } + if ($ShowWormsStats !~ /[01HBL]/) { $ShowWormsStats='HBL'; } + if ($ShowEMailSenders !~ /[01HBML]/) { $ShowEMailSenders=0; } + if ($ShowEMailReceivers !~ /[01HBML]/) { $ShowEMailReceivers=0; } + if ($ShowSessionsStats !~ /[01]/) { $ShowSessionsStats=1; } + if ($ShowPagesStats !~ /[01PBEX]/i) { $ShowPagesStats='PBEX'; } + if ($ShowFileTypesStats !~ /[01HBC]/) { $ShowFileTypesStats='HB'; } + if ($ShowFileSizesStats !~ /[01]/) { $ShowFileSizesStats=1; } + if ($ShowOSStats !~ /[01]/) { $ShowOSStats=1; } + if ($ShowBrowsersStats !~ /[01]/) { $ShowBrowsersStats=1; } + if ($ShowScreenSizeStats !~ /[01]/) { $ShowScreenSizeStats=0; } + if ($ShowOriginStats !~ /[01PH]/) { $ShowOriginStats='PH'; } + if ($ShowKeyphrasesStats !~ /[01]/) { $ShowKeyphrasesStats=1; } + if ($ShowKeywordsStats !~ /[01]/) { $ShowKeywordsStats=1; } + if ($ShowClusterStats !~ /[01PHB]/) { $ShowClusterStats=0; } + if ($ShowMiscStats !~ /[01anjdfrqwp]/) { $ShowMiscStats='a'; } + if ($ShowHTTPErrorsStats !~ /[01]/) { $ShowHTTPErrorsStats=1; } + if ($ShowSMTPErrorsStats !~ /[01]/) { $ShowSMTPErrorsStats=0; } + if ($AddDataArrayMonthStats !~ /[01]/) { $AddDataArrayMonthStats=1; } + if ($AddDataArrayShowDaysOfMonthStats !~ /[01]/) { $AddDataArrayShowDaysOfMonthStats=1; } + if ($AddDataArrayShowDaysOfWeekStats !~ /[01]/) { $AddDataArrayShowDaysOfWeekStats=1; } + if ($AddDataArrayShowHoursStats !~ /[01]/) { $AddDataArrayShowHoursStats=1; } + my @maxnboflist=('Domain','HostsShown','LoginShown','RobotShown','WormsShown','PageShown','OsShown','BrowsersShown','ScreenSizesShown','RefererShown','KeyphrasesShown','KeywordsShown','EMailsShown'); + my @maxnboflistdefaultval=(10,10,10,10,5,10,10,10,5,10,10,10,20); + foreach my $i (0..(@maxnboflist-1)) { + if (! $MaxNbOf{$maxnboflist[$i]} || $MaxNbOf{$maxnboflist[$i]} !~ /^\d+$/ || $MaxNbOf{$maxnboflist[$i]}<1) { $MaxNbOf{$maxnboflist[$i]}=$maxnboflistdefaultval[$i]; } + } + my @minhitlist=('Domain','Host','Login','Robot','Worm','File','Os','Browser','ScreenSize','Refer','Keyphrase','Keyword','EMail'); + my @minhitlistdefaultval=(1,1,1,1,1,1,1,1,1,1,1,1,1); + foreach my $i (0..(@minhitlist-1)) { + if (! $MinHit{$minhitlist[$i]} || $MinHit{$minhitlist[$i]} !~ /^\d+$/ || $MinHit{$minhitlist[$i]}<1) { $MinHit{$minhitlist[$i]}=$minhitlistdefaultval[$i]; } + } + if ($FirstDayOfWeek !~ /[01]/) { $FirstDayOfWeek=1; } + if ($UseFramesWhenCGI !~ /[01]/) { $UseFramesWhenCGI=1; } + if ($DetailedReportsOnNewWindows !~ /[012]/) { $DetailedReportsOnNewWindows=1; } + if ($ShowLinksOnUrl !~ /[01]/) { $ShowLinksOnUrl=1; } + if ($MaxLengthOfShownURL !~ /^\d+/ || $MaxLengthOfShownURL<1) { $MaxLengthOfShownURL=64; } + if ($ShowLinksToWhoIs !~ /[01]/) { $ShowLinksToWhoIs=0; } + $Logo||='awstats_logo6.png'; + $LogoLink||='http://awstats.sourceforge.net'; + if ($BarWidth !~ /^\d+/ || $BarWidth<1) { $BarWidth=260; } + if ($BarHeight !~ /^\d+/ || $BarHeight<1) { $BarHeight=90; } + $color_Background =~ s/#//g; if ($color_Background !~ /^[0-9|A-H]+$/i) { $color_Background='FFFFFF'; } + $color_TableBGTitle =~ s/#//g; if ($color_TableBGTitle !~ /^[0-9|A-H]+$/i) { $color_TableBGTitle='CCCCDD'; } + $color_TableTitle =~ s/#//g; if ($color_TableTitle !~ /^[0-9|A-H]+$/i) { $color_TableTitle='000000'; } + $color_TableBG =~ s/#//g; if ($color_TableBG !~ /^[0-9|A-H]+$/i) { $color_TableBG='CCCCDD'; } + $color_TableRowTitle =~ s/#//g; if ($color_TableRowTitle !~ /^[0-9|A-H]+$/i) { $color_TableRowTitle='FFFFFF'; } + $color_TableBGRowTitle =~ s/#//g; if ($color_TableBGRowTitle !~ /^[0-9|A-H]+$/i) { $color_TableBGRowTitle='ECECEC'; } + $color_TableBorder =~ s/#//g; if ($color_TableBorder !~ /^[0-9|A-H]+$/i) { $color_TableBorder='ECECEC'; } + $color_text =~ s/#//g; if ($color_text !~ /^[0-9|A-H]+$/i) { $color_text='000000'; } + $color_textpercent =~ s/#//g; if ($color_textpercent !~ /^[0-9|A-H]+$/i) { $color_textpercent='606060'; } + $color_titletext =~ s/#//g; if ($color_titletext !~ /^[0-9|A-H]+$/i) { $color_titletext='000000'; } + $color_weekend =~ s/#//g; if ($color_weekend !~ /^[0-9|A-H]+$/i) { $color_weekend='EAEAEA'; } + $color_link =~ s/#//g; if ($color_link !~ /^[0-9|A-H]+$/i) { $color_link='0011BB'; } + $color_hover =~ s/#//g; if ($color_hover !~ /^[0-9|A-H]+$/i) { $color_hover='605040'; } + $color_other =~ s/#//g; if ($color_other !~ /^[0-9|A-H]+$/i) { $color_other='666688'; } + $color_u =~ s/#//g; if ($color_u !~ /^[0-9|A-H]+$/i) { $color_u='FFA060'; } + $color_v =~ s/#//g; if ($color_v !~ /^[0-9|A-H]+$/i) { $color_v='F4F090'; } + $color_p =~ s/#//g; if ($color_p !~ /^[0-9|A-H]+$/i) { $color_p='4477DD'; } + $color_h =~ s/#//g; if ($color_h !~ /^[0-9|A-H]+$/i) { $color_h='66EEFF'; } + $color_k =~ s/#//g; if ($color_k !~ /^[0-9|A-H]+$/i) { $color_k='2EA495'; } + $color_s =~ s/#//g; if ($color_s !~ /^[0-9|A-H]+$/i) { $color_s='8888DD'; } + $color_e =~ s/#//g; if ($color_e !~ /^[0-9|A-H]+$/i) { $color_e='CEC2E8'; } + $color_x =~ s/#//g; if ($color_x !~ /^[0-9|A-H]+$/i) { $color_x='C1B2E2'; } + + # Correct param if default value is asked + if ($ShowMonthStats eq '1') { $ShowMonthStats = 'UVPHB'; } + if ($ShowDaysOfMonthStats eq '1') { $ShowDaysOfMonthStats = 'VPHB'; } + if ($ShowDaysOfWeekStats eq '1') { $ShowDaysOfWeekStats = 'PHBL'; } + if ($ShowHoursStats eq '1') { $ShowHoursStats = 'PHBL'; } + if ($ShowDomainsStats eq '1') { $ShowDomainsStats = 'PHB'; } + if ($ShowHostsStats eq '1') { $ShowHostsStats = 'PHBL'; } + if ($ShowEMailSenders eq '1') { $ShowEMailSenders = 'HBML'; } + if ($ShowEMailReceivers eq '1') { $ShowEMailReceivers = 'HBML'; } + if ($ShowAuthenticatedUsers eq '1') { $ShowAuthenticatedUsers = 'PHBL'; } + if ($ShowRobotsStats eq '1') { $ShowRobotsStats = 'HBL'; } + if ($ShowWormsStats eq '1') { $ShowWormsStats = 'HBL'; } + if ($ShowPagesStats eq '1') { $ShowPagesStats = 'PBEX'; } + if ($ShowFileTypesStats eq '1') { $ShowFileTypesStats = 'HB'; } + if ($ShowOriginStats eq '1') { $ShowOriginStats = 'PH'; } + if ($ShowClusterStats eq '1') { $ShowClusterStats = 'PHB'; } + if ($ShowMiscStats eq '1') { $ShowMiscStats = 'anjdfrqwp'; } + + # Convert extra sections data into @ExtraConditionType, @ExtraConditionTypeVal... + foreach my $extranum (1..@ExtraName-1) { + my $part=0; + foreach my $conditioncouple (split(/\s*\|\|\s*/, $ExtraCondition[$extranum])) { + my ($conditiontype, $conditiontypeval)=split(/[,:]/,$conditioncouple,2); + $ExtraConditionType[$extranum][$part]=$conditiontype; + if ($conditiontypeval =~ /^REGEX\[(.*)\]$/i) { $conditiontypeval=$1; } + #else { $conditiontypeval=quotemeta($conditiontypeval); } + $ExtraConditionTypeVal[$extranum][$part]=qr/$conditiontypeval/i; + $part++; + } + $part=0; + foreach my $rowkeycouple (split(/\s*\|\|\s*/, $ExtraFirstColumnValues[$extranum])) { + my ($rowkeytype, $rowkeytypeval)=split(/[,:]/,$rowkeycouple,2); + $ExtraFirstColumnValuesType[$extranum][$part]=$rowkeytype; + if ($rowkeytypeval =~ /^REGEX\[(.*)\]$/i) { $rowkeytypeval=$1; } + #else { $rowkeytypeval=quotemeta($rowkeytypeval); } + $ExtraFirstColumnValuesTypeVal[$extranum][$part]=qr/$rowkeytypeval/i; + $part++; + } + } + + # Show definitive value for major parameters + if ($Debug) { + debug(" LogFile='$LogFile'",2); + debug(" LogFormat='$LogFormat'",2); + debug(" LogSeparator='$LogSeparator'",2); + debug(" DNSLookup='$DNSLookup'",2); + debug(" DirData='$DirData'",2); + debug(" DirCgi='$DirCgi'",2); + debug(" DirIcons='$DirIcons'",2); + debug(" SiteDomain='$SiteDomain'",2); + debug(" MiscTrackerUrl='$MiscTrackerUrl'",2); + foreach (keys %MaxNbOf) { debug(" MaxNbOf{$_}=$MaxNbOf{$_}",2); } + foreach (keys %MinHit) { debug(" MinHit{$_}=$MinHit{$_}",2); } + foreach my $extranum (1..@ExtraName-1) { + debug(" ExtraCodeFilter[$extranum] is array ".join(',',@{$ExtraCodeFilter[$extranum]}),2); + debug(" ExtraConditionType[$extranum] is array ".join(',',@{$ExtraConditionType[$extranum]}),2); + debug(" ExtraConditionTypeVal[$extranum] is array ".join(',',@{$ExtraConditionTypeVal[$extranum]}),2); + debug(" ExtraFirstColumnValuesType[$extranum] is array ".join(',',@{$ExtraFirstColumnValuesType[$extranum]}),2); + debug(" ExtraFirstColumnValuesTypeVal[$extranum] is array ".join(',',@{$ExtraFirstColumnValuesTypeVal[$extranum]}),2); + } + } + + # Deny URLWithQueryWithOnlyFollowingParameters and URLWithQueryWithoutFollowingParameters both set + if (@URLWithQueryWithOnly && @URLWithQueryWithout) { + error("URLWithQueryWithOnlyFollowingParameters and URLWithQueryWithoutFollowingParameters can't be both set at the same time"); + } + # Deny $ShowHTTPErrorsStats and $ShowSMTPErrorsStats both set + if ($ShowHTTPErrorsStats && $ShowSMTPErrorsStats) { + error("ShowHTTPErrorsStats and ShowSMTPErrorsStats can't be both set at the same time"); + } + + # Deny LogFile if contains a pipe and PurgeLogFile || ArchiveLogRecords set on + if (($PurgeLogFile || $ArchiveLogRecords) && $LogFile =~ /\|\s*$/) { + error("A pipe in log file name is not allowed if PurgeLogFile and ArchiveLogRecords are not set to 0"); + } + # If not a migrate, check if DirData is OK + if (! $MigrateStats && ! -d $DirData) { + if ($CreateDirDataIfNotExists) { + if ($Debug) { debug(" Make directory $DirData",2); } + my $mkdirok=mkdir "$DirData", 0766; + if (! $mkdirok) { error("$PROG failed to create directory DirData (DirData=\"$DirData\", CreateDirDataIfNotExists=$CreateDirDataIfNotExists)."); } + } + else { + error("AWStats database directory defined in config file by 'DirData' parameter ($DirData) does not exist or is not writable."); + } + } + + if ($LogType eq 'S') { $NOTSORTEDRECORDTOLERANCE=1000000; } +} + + +#------------------------------------------------------------------------------ +# Function: Common function used by init function of plugins +# Parameters: AWStats version required by plugin +# Input: $VERSION +# Output: None +# Return: '' if ok, "Error: xxx" if error +#------------------------------------------------------------------------------ +sub Check_Plugin_Version { + my $PluginNeedAWStatsVersion=shift; + if (! $PluginNeedAWStatsVersion) { return 0; } + $VERSION =~ /^(\d+)\.(\d+)/; + my $numAWStatsVersion=($1*1000)+$2; + $PluginNeedAWStatsVersion =~ /^(\d+)\.(\d+)/; + my $numPluginNeedAWStatsVersion=($1*1000)+$2; + if ($numPluginNeedAWStatsVersion > $numAWStatsVersion) { + return "Error: AWStats version $PluginNeedAWStatsVersion or higher is required. Detected $VERSION."; + } + return ''; +} + + +#------------------------------------------------------------------------------ +# Function: Return a checksum for an array of string +# Parameters: Array of string +# Input: None +# Output: None +# Return: Checksum number +#------------------------------------------------------------------------------ +sub CheckSum { + my $string=shift; + my $checksum=0; +# use MD5; +# $checksum = MD5->hexhash($string); + my $i=0; my $j=0; + while ($i < length($string)) { + my $c=substr($string,$i,1); + $checksum+=(ord($c)<<(8*$j)); + if ($j++ > 3) { $j=0; } + $i++; + } + return $checksum; +} + + +#------------------------------------------------------------------------------ +# Function: Load plugins files +# Parameters: None +# Input: $DIR @PluginsToLoad +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub Read_Plugins { + # Check plugin files in common possible directories : + # Windows and standard package: "$DIR/plugins" (plugins in same dir than awstats.pl) + # Redhat : "/usr/local/awstats/wwwroot/cgi-bin/plugins" + # Debian package : "/usr/share/awstats/plugins" + my @PossiblePluginsDir=("$DIR/plugins","/usr/local/awstats/wwwroot/cgi-bin/plugins","/usr/share/awstats/plugins"); + my %DirAddedInINC=(); + + foreach my $key (keys %NoLoadPlugin) { if ($NoLoadPlugin{$key} < 0) { push @PluginsToLoad, $key; } } + if ($Debug) { debug("Call to Read_Plugins with list: ".join(',',@PluginsToLoad)); } + foreach my $plugininfo (@PluginsToLoad) { + my ($pluginfile,$pluginparam)=split(/\s+/,$plugininfo,2); + $pluginfile =~ s/\.pm$//i; + $pluginfile =~ /([^\/\\]+)$/; + my $pluginname=$1; # pluginname is pluginfile without any path + # Check if plugin is not disabled + if ($NoLoadPlugin{$pluginname} && $NoLoadPlugin{$pluginname} > 0) { + if ($Debug) { debug(" Plugin load for '$pluginfile' has been disabled from parameters"); } + next; + } + if ($pluginname) { + if (! $PluginsLoaded{'init'}{"$pluginname"}) { # Plugin not already loaded + my %pluginisfor=('timehires'=>'u','ipv6'=>'u','hashfiles'=>'u','geoip'=>'u','geoipfree'=>'u', + 'geoip_region_maxmind'=>'mou','timezone'=>'ou', + 'decodeutfkeys'=>'o','hostinfo'=>'o','rawlog'=>'o','userinfo'=>'o','urlalias'=>'o','tooltips'=>'o'); + if ($pluginisfor{$pluginname}) { # If it's a known plugin, may be we don't need to load it + # Do not load "menu handler plugins" if output only and mainleft frame + if (! $UpdateStats && scalar keys %HTMLOutput && $FrameName eq 'mainleft' && $pluginisfor{$pluginname} !~ /m/) { $PluginsLoaded{'init'}{"$pluginname"}=1; next; } + # Do not load "update plugins" if output only + if (! $UpdateStats && scalar keys %HTMLOutput && $pluginisfor{$pluginname} !~ /o/) { $PluginsLoaded{'init'}{"$pluginname"}=1; next; } + # Do not load "output plugins" if update only + if ($UpdateStats && ! scalar keys %HTMLOutput && $pluginisfor{$pluginname} !~ /u/) { $PluginsLoaded{'init'}{"$pluginname"}=1; next; } + } + # Load plugin + foreach my $dir (@PossiblePluginsDir) { + my $searchdir=$dir; + if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } + my $pluginpath="${searchdir}${pluginfile}.pm"; + if (-s "$pluginpath") { + $PluginDir="${searchdir}"; # Set plugin dir + if ($Debug) { debug(" Try to init plugin '$pluginname' ($pluginpath) with param '$pluginparam'",1); } + if (! $DirAddedInINC{"$dir"}) { + push @INC, "$dir"; + $DirAddedInINC{"$dir"}=1; + } + my $loadret=0; + my $modperl=$ENV{"MOD_PERL"}? eval { require mod_perl; $mod_perl::VERSION >= 1.99 ? 2 : 1 } : 0; + if ($modperl == 2) { $loadret=require "$pluginpath"; } + else { $loadret=require "$pluginfile.pm"; } + if (! $loadret || $loadret =~ /^error/i) { + # Load failed, we stop here + error("Plugin load for plugin '$pluginname' failed with return code: $loadret"); + } + my $ret; # To get init return + my $initfunction="\$ret=Init_$pluginname('$pluginparam')"; + my $initret=eval("$initfunction"); + if ($initret eq 'xxx') { $initret='Error: The PluginHooksFunctions variable defined in plugin file does not contain list of hooked functions'; } + if (! $initret || $initret =~ /^error/i) { + # Init function failed, we stop here + error("Plugin init for plugin '$pluginname' failed with return code: ".($initret?"$initret":"$@ (A module required by plugin might be missing).")); + } + # Plugin load and init successfull + foreach my $elem (split(/\s+/,$initret)) { + # Some functions can only be plugged once + my @uniquefunc=('GetCountryCodeByName','GetCountryCodeByAddr','ChangeTime','GetTimeZoneTitle','GetTime','SearchFile','LoadCache','SaveHash','ShowMenu'); + my $isuniquefunc=0; + foreach my $function (@uniquefunc) { + if ("$elem" eq "$function") { + # We try to load a 'unique' function, so we check and stop if already loaded + foreach my $otherpluginname (keys %{$PluginsLoaded{"$elem"}}) { + error("Conflict between plugin '$pluginname' and '$otherpluginname'. They both implements the 'must be unique' function '$elem'.\nYou must choose between one of them. Using together is not possible."); + } + $isuniquefunc=1; + last; + } + } + if ($isuniquefunc) { + # TODO Use $PluginsLoaded{"$elem"}="$pluginname"; for unique func + $PluginsLoaded{"$elem"}{"$pluginname"}=1; + } + else { $PluginsLoaded{"$elem"}{"$pluginname"}=1; } + if ("$elem" =~ /SectionInitHashArray/) { $AtLeastOneSectionPlugin=1; } + } + $PluginsLoaded{'init'}{"$pluginname"}=1; + if ($Debug) { debug(" Plugin '$pluginname' now hooks functions '$initret'",1); } + last; + } + } + if (! $PluginsLoaded{'init'}{"$pluginname"}) { + error("AWStats config file contains a directive to load plugin \"$pluginname\" (LoadPlugin=\"$plugininfo\") but AWStats can't open plugin file \"$pluginfile.pm\" for read.\nCheck if file is in \"".($PossiblePluginsDir[0])."\" directory and is readable."); + } + } + else { + warning("Warning: Tried to load plugin \"$pluginname\" twice. Fix config file."); + } + } + else { + error("Plugin \"$pluginfile\" is not a valid plugin name."); + } + } + # In output mode, geo ip plugins are not loaded, so message changes are done here (can't be done in plugin init function) + if ($PluginsLoaded{'init'}{'geoip'} || $PluginsLoaded{'init'}{'geoipfree'}) { $Message[17]=$Message[25]=$Message[148]; } +} + +#------------------------------------------------------------------------------ +# Function: Read history file and create/update tmp history file +# Parameters: year,month,withupdate,withpurge,part_to_load[,lastlinenb,lastlineoffset,lastlinechecksum] +# Input: $DirData $PROG $FileSuffix $LastLine +# Output: None +# Return: Tmp history file name created/updated or '' if withupdate is 0 +#------------------------------------------------------------------------------ +sub Read_History_With_TmpUpdate { + + my $year=sprintf("%04i",shift||0); + my $month=sprintf("%02i",shift||0); + my $withupdate=shift||0; + my $withpurge=shift||0; + my $part=shift||''; + + my $xml=($BuildHistoryFormat eq 'xml'?1:0); + my $xmleb=''; my $xmlrb=''; + + my $lastlinenb=shift||0; + my $lastlineoffset=shift||0; + my $lastlinechecksum=shift||0; + + my %allsections=('general'=>1,'misc'=>2,'time'=>3,'visitor'=>4,'day'=>5, + 'domain'=>6,'cluster'=>7,'login'=>8,'robot'=>9,'worms'=>10,'emailsender'=>11,'emailreceiver'=>12, + 'session'=>13,'sider'=>14,'filetypes'=>15, + 'os'=>16,'browser'=>17,'screensize'=>18,'unknownreferer'=>19,'unknownrefererbrowser'=>20, + 'origin'=>21,'sereferrals'=>22,'pagerefs'=>23, + 'searchwords'=>24,'keywords'=>25, + 'errors'=>26); + my $order=(scalar keys %allsections)+1; + foreach (keys %TrapInfosForHTTPErrorCodes) { $allsections{"sider_$_"}=$order++; } + foreach (1..@ExtraName-1) { $allsections{"extra_$_"}=$order++; } + foreach (keys %{$PluginsLoaded{'SectionInitHashArray'}}) { $allsections{"plugin_$_"}=$order++; } + my $withread=0; + + # Variable used to read old format history files + my $readvisitorforbackward=0; + + # In standard use of AWStats, the DayRequired variable is always empty + if ($DayRequired) { if ($Debug) { debug("Call to Read_History_With_TmpUpdate [$year,$month,withupdate=$withupdate,withpurge=$withpurge,part=$part,lastlinenb=$lastlinenb,lastlineoffset=$lastlineoffset,lastlinechecksum=$lastlinechecksum] ($DayRequired)"); } } + else { if ($Debug) { debug("Call to Read_History_With_TmpUpdate [$year,$month,withupdate=$withupdate,withpurge=$withpurge,part=$part,lastlinenb=$lastlinenb,lastlineoffset=$lastlineoffset,lastlinechecksum=$lastlinechecksum]"); } } + + # Define SectionsToLoad (which sections to load) + my %SectionsToLoad = (); + if ($part eq 'all') { # Load all needed sections + my $order=1; + $SectionsToLoad{'general'}=$order++; + # When + $SectionsToLoad{'time'}=$order++; # Always loaded because needed to count TotalPages, TotalHits, TotalBandwidth + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowHostsStats) || $HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'} || $HTMLOutput{'unknownip'}) { $SectionsToLoad{'visitor'}=$order++; } # Must be before day, sider and session section + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && ($ShowDaysOfWeekStats || $ShowDaysOfMonthStats)) || $HTMLOutput{'alldays'}) { $SectionsToLoad{'day'}=$order++; } + # Who + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowDomainsStats) || $HTMLOutput{'alldomains'}) { $SectionsToLoad{'domain'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowAuthenticatedUsers) || $HTMLOutput{'alllogins'} || $HTMLOutput{'lastlogins'}) { $SectionsToLoad{'login'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowRobotsStats) || $HTMLOutput{'allrobots'} || $HTMLOutput{'lastrobots'}) { $SectionsToLoad{'robot'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowWormsStats) || $HTMLOutput{'allworms'} || $HTMLOutput{'lastworms'}) { $SectionsToLoad{'worms'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowEMailSenders) || $HTMLOutput{'allemails'} || $HTMLOutput{'lastemails'}) { $SectionsToLoad{'emailsender'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowEMailReceivers) || $HTMLOutput{'allemailr'} || $HTMLOutput{'lastemailr'}) { $SectionsToLoad{'emailreceiver'}=$order++; } + # Navigation + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowSessionsStats) || $HTMLOutput{'sessions'}) { $SectionsToLoad{'session'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowPagesStats) || $HTMLOutput{'urldetail'} || $HTMLOutput{'urlentry'} || $HTMLOutput{'urlexit'}) { $SectionsToLoad{'sider'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowFileTypesStats) || $HTMLOutput{'filetypes'}) { $SectionsToLoad{'filetypes'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOSStats) || $HTMLOutput{'osdetail'}) { $SectionsToLoad{'os'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowBrowsersStats) || $HTMLOutput{'browserdetail'}) { $SectionsToLoad{'browser'}=$order++; } + if ($UpdateStats || $MigrateStats || $HTMLOutput{'unknownos'}) { $SectionsToLoad{'unknownreferer'}=$order++; } + if ($UpdateStats || $MigrateStats || $HTMLOutput{'unknownbrowser'}) { $SectionsToLoad{'unknownrefererbrowser'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowScreenSizeStats)) { $SectionsToLoad{'screensize'}=$order++; } + # Referers + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOriginStats) || $HTMLOutput{'origin'}) { $SectionsToLoad{'origin'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOriginStats) || $HTMLOutput{'refererse'}) { $SectionsToLoad{'sereferrals'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowOriginStats) || $HTMLOutput{'refererpages'}) { $SectionsToLoad{'pagerefs'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowKeyphrasesStats) || $HTMLOutput{'keyphrases'} || $HTMLOutput{'keywords'}) { $SectionsToLoad{'searchwords'}=$order++; } + if (! $withupdate && $HTMLOutput{'main'} && $ShowKeywordsStats) { $SectionsToLoad{'keywords'}=$order++; } # If we update, dont need to load + # Others + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowMiscStats)) { $SectionsToLoad{'misc'}=$order++; } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && ($ShowHTTPErrorsStats || $ShowSMTPErrorsStats)) || $HTMLOutput{'errors'}) { $SectionsToLoad{'errors'}=$order++; } + foreach (keys %TrapInfosForHTTPErrorCodes) { + if ($UpdateStats || $MigrateStats || $HTMLOutput{"errors$_"}) { $SectionsToLoad{"sider_$_"}=$order++; } + } + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ShowClusterStats)) { $SectionsToLoad{'cluster'}=$order++; } + foreach (1..@ExtraName-1) { + if ($UpdateStats || $MigrateStats || ($HTMLOutput{'main'} && $ExtraStatTypes[$_]) || $HTMLOutput{"extra$_"}) { $SectionsToLoad{"extra_$_"}=$order++; } + } + foreach (keys %{$PluginsLoaded{'SectionInitHashArray'}}) { + if ($UpdateStats || $MigrateStats || $HTMLOutput{"plugin_$_"}) { $SectionsToLoad{"plugin_$_"}=$order++; } + } + } + else { # Load only required sections + my $order=1; + foreach (split(/\s+/,$part)) { $SectionsToLoad{$_}=$order++; } + } + + # Define SectionsToSave (which sections to save) + my %SectionsToSave = (); + if ($withupdate) { %SectionsToSave=%allsections; } + + if ($Debug) { + debug(" List of sections marked for load : ".join(' ',(sort { $SectionsToLoad{$a} <=> $SectionsToLoad{$b} } keys %SectionsToLoad)),2); + debug(" List of sections marked for save : ".join(' ',(sort { $SectionsToSave{$a} <=> $SectionsToSave{$b} } keys %SectionsToSave)),2); + } + + # Define value for filetowrite and filetoread (Month before Year kept for backward compatibility) + my $filetowrite=''; + my $filetoread=''; + if ($HistoryAlreadyFlushed{"$year$month"} && -s "$DirData/$PROG$month$year$FileSuffix.tmp.$$") { + # tmp history file was already flushed + $filetoread="$DirData/$PROG$month$year$FileSuffix.tmp.$$"; + $filetowrite="$DirData/$PROG$month$year$FileSuffix.tmp.$$.bis"; + } + else { + $filetoread="$DirData/$PROG$DayRequired$month$year$FileSuffix.txt"; + $filetowrite="$DirData/$PROG$month$year$FileSuffix.tmp.$$"; + } + if ($Debug) { debug(" History file to read is '$filetoread'",2); } + + # Is there an old data file to read or, if migrate, can we open the file for read + if (-s $filetoread || $MigrateStats) { $withread=1; } + + # Open files + if ($withread) { + open(HISTORY,$filetoread) || error("Couldn't open file \"$filetoread\" for read: $!","","",$MigrateStats); + binmode HISTORY; # Avoid premature EOF due to history files corrupted with \cZ or bin chars + } + if ($withupdate) { + open(HISTORYTMP,">$filetowrite") || error("Couldn't open file \"$filetowrite\" for write: $!"); + binmode HISTORYTMP; + if ($xml) { print HISTORYTMP "\n\n"; } + Save_History("header",$year,$month); + } + + # Loop on read file + my $xmlold=0; + if ($withread) { + my $countlines=0; + my $versionnum=0; + my @field=(); + while () { + chomp $_; s/\r//; + $countlines++; + + # Test if it's xml + if (! $xmlold && $_ =~ /^ int($field[1])) { $FirstTime{$year.$month}=int($field[1]); }; next; } + if ($field[0] eq 'LastTime' || $field[0] eq "${xmlrb}LastTime") { if (! $LastTime{$year.$month} || $LastTime{$year.$month} < int($field[1])) { $LastTime{$year.$month}=int($field[1]); }; next; } + if ($field[0] eq 'LastUpdate' || $field[0] eq "${xmlrb}LastUpdate") { + if ($LastUpdate < $field[1]) { + $LastUpdate=int($field[1]); + #$LastUpdateLinesRead=int($field[2]); + #$LastUpdateNewLinesRead=int($field[3]); + #$LastUpdateLinesCorrupted=int($field[4]); + }; + next; + } + if ($field[0] eq 'TotalVisits' || $field[0] eq "${xmlrb}TotalVisits") { + if (! $withupdate) { $MonthVisits{$year.$month}+=int($field[1]); } + # Save in MonthVisits also if migrate from a file < 4.x for backward compatibility + if ($MigrateStats && $versionnum < 4000 && ! $MonthVisits{$year.$month}) { + if ($Debug) { debug("File is version < 4000. We save ".int($field[1])." visits in DayXxx arrays",1); } + $DayHits{$year.$month."00"}+=0; + $DayVisits{$year.$month."00"}+=int($field[1]); + } + next; + } + if ($field[0] eq 'TotalUnique' || $field[0] eq "${xmlrb}TotalUnique") { if (! $withupdate) { $MonthUnique{$year.$month}+=int($field[1]); } next; } + if ($field[0] eq 'MonthHostsKnown' || $field[0] eq "${xmlrb}MonthHostsKnown") { if (! $withupdate) { $MonthHostsKnown{$year.$month}+=int($field[1]); } next; } + if ($field[0] eq 'MonthHostsUnknown' || $field[0] eq "${xmlrb}MonthHostsUnknown") { if (! $withupdate) { $MonthHostsUnknown{$year.$month}+=int($field[1]); } next; } + if (($field[0] eq 'END_GENERAL' || $field[0] eq "${xmleb}END_GENERAL") # END_GENERAL didn't exist for history files < 5.0 + || ($versionnum < 5000 && $SectionsToLoad{"general"} && $FirstTime{$year.$month} && $LastTime{$year.$month}) ) { + if ($Debug) { debug(" End of GENERAL section"); } + # Show migrate warning for backward compatibility + if ($versionnum < 5000 && ! $MigrateStats && ! $BadFormatWarning{$year.$month}) { + if ($FrameName ne 'mainleft') { + $BadFormatWarning{$year.$month}=1; + my $message="Warning: Data file '$filetoread' has an old history file format (version $versionnum). You should upgrade it...\nFrom command line: $PROG.$Extension -migrate=\"$filetoread\""; + if ($ENV{'GATEWAY_INTERFACE'} && $AllowToUpdateStatsFromBrowser) { $message.="\nFrom your browser with URL: http://".$ENV{"SERVER_NAME"}.$ENV{"SCRIPT_NAME"}."?migrate=$filetoread"; } + warning("$message"); + } + } + if (! ($versionnum < 5000) && $MigrateStats && ! $BadFormatWarning{$year.$month}) { + $BadFormatWarning{$year.$month}=1; + warning("Warning: You are migrating a file that is already a recent version (migrate not required for files version $versionnum).","","",1); + } + # If migrate and version < 4.x we need to include BEGIN_UNKNOWNIP into BEGIN_VISITOR for backward compatibility + if ($MigrateStats && $versionnum < 4000) { + if ($Debug) { debug("File is version < 4000. We add UNKNOWNIP in sections to load",1); } + $SectionsToLoad{'unknownip'}=99; + } + + delete $SectionsToLoad{'general'}; + if ($SectionsToSave{'general'}) { Save_History('general',$year,$month,$lastlinenb,$lastlineoffset,$lastlinechecksum); delete $SectionsToSave{'general'}; } + + # Test for backward compatibility + if ($versionnum < 5000 && ! $withupdate) { + # We must find another way to init MonthUnique MonthHostsKnown and MonthHostsUnknown + if ($Debug) { debug(" We ask to count MonthUnique, MonthHostsKnown and MonthHostsUnknown in visitor section because they are not stored in general section for this data file (version $versionnum)."); } + $readvisitorforbackward=($SectionsToLoad{"visitor"}?1:2); + $SectionsToLoad{"visitor"}=4; + } + else { + if (! scalar %SectionsToLoad) { + if ($Debug) { debug(" Stop reading history file. Got all we need."); } + last; + } + } + if ($versionnum >= 5000) { next; } # We can forget 'END_GENERAL' line and read next one + } + + # BEGIN_MISC + if ($field[0] eq 'BEGIN_MISC') { + if ($Debug) { debug(" Begin of MISC section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'misc'}) { + $countloaded++; + if ($field[1]) { $_misc_p{$field[0]}+=int($field[1]); } + if ($field[2]) { $_misc_h{$field[0]}+=int($field[2]); } + if ($field[3]) { $_misc_k{$field[0]}+=int($field[3]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_MISC' || $field[0] eq "${xmleb}END_MISC" || ! $_); + if ($field[0] ne 'END_MISC' && $field[0] ne "${xmleb}END_MISC") { error("History file \"$filetoread\" is corrupted (End of section MISC not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of MISC section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'misc'}; + if ($SectionsToSave{'misc'}) { + Save_History('misc',$year,$month); delete $SectionsToSave{'misc'}; + if ($withpurge) { %_misc_p=(); %_misc_h=(); %_misc_k=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + + # BEGIN_CLUSTER + if ($field[0] eq 'BEGIN_CLUSTER') { + if ($Debug) { debug(" Begin of CLUSTER section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'cluster'}) { + $countloaded++; + if ($field[1]) { $_cluster_p{$field[0]}+=int($field[1]); } + if ($field[2]) { $_cluster_h{$field[0]}+=int($field[2]); } + if ($field[3]) { $_cluster_k{$field[0]}+=int($field[3]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_CLUSTER' || $field[0] eq "${xmleb}END_CLUSTER" || ! $_); + if ($field[0] ne 'END_CLUSTER' && $field[0] ne "${xmleb}END_CLUSTER") { error("History file \"$filetoread\" is corrupted (End of section CLUSTER not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of CLUSTER section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'cluster'}; + if ($SectionsToSave{'cluster'}) { + Save_History('cluster',$year,$month); delete $SectionsToSave{'cluster'}; + if ($withpurge) { %_cluster_p=(); %_cluster_h=(); %_cluster_k=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + + # BEGIN_TIME + if ($field[0] eq 'BEGIN_TIME') { + my $monthpages=0;my $monthhits=0;my $monthbytes=0; + my $monthnotviewedpages=0;my $monthnotviewedhits=0;my $monthnotviewedbytes=0; + if ($Debug) { debug(" Begin of TIME section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0] ne '') { # Test on ne '' because field[0] is '0' for hour 0) + $count++; + if ($SectionsToLoad{'time'}) { + if ($withupdate || $MonthRequired eq 'all' || $MonthRequired eq "$month") { # Still required + $countloaded++; + if ($field[1]) { $_time_p[$field[0]]+=int($field[1]); } + if ($field[2]) { $_time_h[$field[0]]+=int($field[2]); } + if ($field[3]) { $_time_k[$field[0]]+=int($field[3]); } + if ($field[4]) { $_time_nv_p[$field[0]]+=int($field[4]); } + if ($field[5]) { $_time_nv_h[$field[0]]+=int($field[5]); } + if ($field[6]) { $_time_nv_k[$field[0]]+=int($field[6]); } + } + $monthpages+=int($field[1]); + $monthhits+=int($field[2]); + $monthbytes+=int($field[3]); + $monthnotviewedpages+=int($field[4]||0); + $monthnotviewedhits+=int($field[5]||0); + $monthnotviewedbytes+=int($field[6]||0); + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_TIME' || $field[0] eq "${xmleb}END_TIME" || ! $_); + if ($field[0] ne 'END_TIME' && $field[0] ne "${xmleb}END_TIME") { error("History file \"$filetoread\" is corrupted (End of section TIME not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of TIME section ($count entries, $countloaded loaded)"); } + $MonthPages{$year.$month}+=$monthpages; + $MonthHits{$year.$month}+=$monthhits; + $MonthBytes{$year.$month}+=$monthbytes; + $MonthNotViewedPages{$year.$month}+=$monthnotviewedpages; + $MonthNotViewedHits{$year.$month}+=$monthnotviewedhits; + $MonthNotViewedBytes{$year.$month}+=$monthnotviewedbytes; + delete $SectionsToLoad{'time'}; + if ($SectionsToSave{'time'}) { + Save_History('time',$year,$month); delete $SectionsToSave{'time'}; + if ($withpurge) { @_time_p=(); @_time_h=(); @_time_k=(); @_time_nv_p=(); @_time_nv_h=(); @_time_nv_k=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + + # BEGIN_ORIGIN + if ($field[0] eq 'BEGIN_ORIGIN') { + if ($Debug) { debug(" Begin of ORIGIN section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'origin'}) { + if ($field[0] eq 'From0') { $_from_p[0]+=$field[1]; $_from_h[0]+=$field[2]; } + elsif ($field[0] eq 'From1') { $_from_p[1]+=$field[1]; $_from_h[1]+=$field[2]; } + elsif ($field[0] eq 'From2') { $_from_p[2]+=$field[1]; $_from_h[2]+=$field[2]; } + elsif ($field[0] eq 'From3') { $_from_p[3]+=$field[1]; $_from_h[3]+=$field[2]; } + elsif ($field[0] eq 'From4') { $_from_p[4]+=$field[1]; $_from_h[4]+=$field[2]; } + elsif ($field[0] eq 'From5') { $_from_p[5]+=$field[1]; $_from_h[5]+=$field[2]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_ORIGIN' || $field[0] eq "${xmleb}END_ORIGIN" || ! $_); + if ($field[0] ne 'END_ORIGIN' && $field[0] ne "${xmleb}END_ORIGIN") { error("History file \"$filetoread\" is corrupted (End of section ORIGIN not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of ORIGIN section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'origin'}; + if ($SectionsToSave{'origin'}) { + Save_History('origin',$year,$month); delete $SectionsToSave{'origin'}; + if ($withpurge) { @_from_p=(); @_from_h=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_DAY + if ($field[0] eq 'BEGIN_DAY') { + if ($Debug) { debug(" Begin of DAY section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'day'}) { + $countloaded++; + if ($field[1]) { $DayPages{$field[0]}+=int($field[1]); } + $DayHits{$field[0]}+=int($field[2]); # DayHits always load (should be >0 and if not it's a day YYYYMM00 resulting of an old file migration) + if ($field[3]) { $DayBytes{$field[0]}+=int($field[3]); } + if ($field[4]) { $DayVisits{$field[0]}+=int($field[4]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_DAY' || $field[0] eq "${xmleb}END_DAY" || ! $_); + if ($field[0] ne 'END_DAY' && $field[0] ne "${xmleb}END_DAY") { error("History file \"$filetoread\" is corrupted (End of section DAY not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of DAY section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'day'}; + # WE DO NOT SAVE SECTION NOW BECAUSE VALUES CAN BE CHANGED AFTER READING VISITOR + #if ($SectionsToSave{'day'}) { # Must be made after read of visitor + # Save_History('day',$year,$month); delete $SectionsToSave{'day'}; + # if ($withpurge) { %DayPages=(); %DayHits=(); %DayBytes=(); %DayVisits=(); } + #} + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_VISITOR + if ($field[0] eq 'BEGIN_VISITOR') { + if ($Debug) { debug(" Begin of VISITOR section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + + # For backward compatibility + if ($readvisitorforbackward) { + if ($field[1]) { $MonthUnique{$year.$month}++; } + if ($MonthRequired ne 'all') { + if ($field[0] !~ /^\d+\.\d+\.\d+\.\d+$/ && $field[0] !~ /^[0-9A-F]*:/i) { $MonthHostsKnown{$year.$month}++; } + else { $MonthHostsUnknown{$year.$month}++; } + } + } + + # Process data saved in 'wait' arrays + if ($withupdate && $_waithost_e{$field[0]}){ + my $timehostl=int($field[4]||0); + my $timehosts=int($field[5]||0); + my $newtimehosts=($_waithost_s{$field[0]}?$_waithost_s{$field[0]}:$_host_s{$field[0]}); + my $newtimehostl=($_waithost_l{$field[0]}?$_waithost_l{$field[0]}:$_host_l{$field[0]}); + if ($newtimehosts > $timehostl + $VISITTIMEOUT ) { + if ($Debug) { debug(" Visit for $field[0] in 'wait' arrays is a new visit different than last in history",4); } + if ($field[6]) { $_url_x{$field[6]}++; } + $_url_e{$_waithost_e{$field[0]}}++; + $newtimehosts =~ /^(\d\d\d\d\d\d\d\d)/; $DayVisits{$1}++; + if ($timehosts && $timehostl) { $_session{GetSessionRange($timehosts,$timehostl)}++; } + if ($_waithost_s{$field[0]}) { + # First session found in log was followed by another one so it's finished + $_session{GetSessionRange($newtimehosts,$newtimehostl)}++; + } + # Here $_host_l $_host_s and $_host_u are correctly defined + } + else { + if ($Debug) { debug(" Visit for $field[0] in 'wait' arrays is following of last visit in history",4); } + if ($_waithost_s{$field[0]}) { + # First session found in log was followed by another one so it's finished + $_session{GetSessionRange(MinimumButNoZero($timehosts,$newtimehosts),$timehostl>$newtimehostl?$timehostl:$newtimehostl)}++; + # Here $_host_l $_host_s and $_host_u are correctly defined + } + else { + # We correct $_host_l $_host_s and $_host_u + if ($timehostl > $newtimehostl) { + $_host_l{$field[0]}=$timehostl; + $_host_u{$field[0]}=$field[6]; + } + if ($timehosts < $newtimehosts) { + $_host_s{$field[0]}=$timehosts; + } + } + } + delete $_waithost_e{$field[0]}; + delete $_waithost_l{$field[0]}; + delete $_waithost_s{$field[0]}; + delete $_waithost_u{$field[0]}; + } + + # Load records + if ($readvisitorforbackward!=2 && $SectionsToLoad{'visitor'}) { # if readvisitorforbackward==2 we do not load + my $loadrecord=0; + if ($withupdate) { + $loadrecord=1; + } + else { + if ($HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'}) { + if ((!$FilterIn{'host'} || $field[0] =~ /$FilterIn{'host'}/i) + && (!$FilterEx{'host'} || $field[0] !~ /$FilterEx{'host'}/i)) { $loadrecord=1; } + } + elsif ($MonthRequired eq 'all' || $field[2] >= $MinHit{'Host'}) { + if ($HTMLOutput{'unknownip'} && ($field[0] =~ /^\d+\.\d+\.\d+\.\d+$/ || $field[0] =~ /^[0-9A-F]*:/i)) { $loadrecord=1; } + elsif ($HTMLOutput{'main'} && ($MonthRequired eq 'all' || $countloaded < $MaxNbOf{'HostsShown'})) { $loadrecord=1; } + } + } + if ($loadrecord) { + if ($field[1]) { $_host_p{$field[0]}+=$field[1]; } + if ($field[2]) { $_host_h{$field[0]}+=$field[2]; } + if ($field[3]) { $_host_k{$field[0]}+=$field[3]; } + if ($field[4] && ! $_host_l{$field[0]}) { # We save last connexion params if not previously defined + $_host_l{$field[0]}=int($field[4]); + if ($withupdate) { # field[5] field[6] are used only for update + if ($field[5] && ! $_host_s{$field[0]}) { $_host_s{$field[0]}=int($field[5]); } + if ($field[6] && ! $_host_u{$field[0]}) { $_host_u{$field[0]}=$field[6]; } + } + } + $countloaded++; + } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_VISITOR' || $field[0] eq "${xmleb}END_VISITOR" || ! $_); + if ($field[0] ne 'END_VISITOR' && $field[0] ne "${xmleb}END_VISITOR") { error("History file \"$filetoread\" is corrupted (End of section VISITOR not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of VISITOR section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'visitor'}; + # WE DO NOT SAVE SECTION NOW TO BE SURE TO HAVE THIS LARGE SECTION NOT AT THE BEGINNING OF FILE + #if ($SectionsToSave{'visitor'}) { + # Save_History('visitor',$year,$month); delete $SectionsToSave{'visitor'}; + # if ($withpurge) { %_host_p=(); %_host_h=(); %_host_k=(); %_host_l=(); %_host_s=(); %_host_u=(); } + #} + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_UNKNOWNIP for backward compatibility + if ($field[0] eq 'BEGIN_UNKNOWNIP') { + my %iptomigrate=(); + if ($Debug) { debug(" Begin of UNKNOWNIP section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'unknownip'}) { + $iptomigrate{$field[0]}=$field[1]||0; + $countloaded++; + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_UNKNOWNIP' || $field[0] eq "${xmleb}END_UNKNOWNIP" || ! $_); + if ($field[0] ne 'END_UNKNOWNIP' && $field[0] ne "${xmleb}END_UNKNOWNIP") { error("History file \"$filetoread\" is corrupted (End of section UNKOWNIP not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of UNKOWNIP section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'visitor'}; + # THIS SECTION IS NEVER SAVED. ONLY READ FOR MIGRATE AND CONVERTED INTO VISITOR SECTION + foreach (keys %iptomigrate) { + $_host_p{$_}+=int($_host_p{'Unknown'}/$countloaded); + $_host_h{$_}+=int($_host_h{'Unknown'}/$countloaded); + $_host_k{$_}+=int($_host_k{'Unknown'}/$countloaded); + if ($iptomigrate{$_} > 0) { $_host_l{$_}=$iptomigrate{$_} }; + } + delete $_host_p{'Unknown'}; + delete $_host_h{'Unknown'}; + delete $_host_k{'Unknown'}; + delete $_host_l{'Unknown'}; + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_LOGIN + if ($field[0] eq 'BEGIN_LOGIN') { + if ($Debug) { debug(" Begin of LOGIN section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'login'}) { + $countloaded++; + if ($field[1]) { $_login_p{$field[0]}+=$field[1]; } + if ($field[2]) { $_login_h{$field[0]}+=$field[2]; } + if ($field[3]) { $_login_k{$field[0]}+=$field[3]; } + if (! $_login_l{$field[0]} && $field[4]) { $_login_l{$field[0]}=int($field[4]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_LOGIN' || $field[0] eq "${xmleb}END_LOGIN" || ! $_); + if ($field[0] ne 'END_LOGIN' && $field[0] ne "${xmleb}END_LOGIN") { error("History file \"$filetoread\" is corrupted (End of section LOGIN not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of LOGIN section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'login'}; + if ($SectionsToSave{'login'}) { + Save_History('login',$year,$month); delete $SectionsToSave{'login'}; + if ($withpurge) { %_login_p=(); %_login_h=(); %_login_k=(); %_login_l=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_DOMAIN + if ($field[0] eq 'BEGIN_DOMAIN') { + if ($Debug) { debug(" Begin of DOMAIN section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'domain'}) { + $countloaded++; + if ($field[1]) { $_domener_p{$field[0]}+=$field[1]; } + if ($field[2]) { $_domener_h{$field[0]}+=$field[2]; } + if ($field[3]) { $_domener_k{$field[0]}+=$field[3]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_DOMAIN' || $field[0] eq "${xmleb}END_DOMAIN" || ! $_); + if ($field[0] ne 'END_DOMAIN' && $field[0] ne "${xmleb}END_DOMAIN") { error("History file \"$filetoread\" is corrupted (End of section DOMAIN not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of DOMAIN section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'domain'}; + if ($SectionsToSave{'domain'}) { + Save_History('domain',$year,$month); delete $SectionsToSave{'domain'}; + if ($withpurge) { %_domener_p=(); %_domener_h=(); %_domener_k=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_SESSION + if ($field[0] eq 'BEGIN_SESSION') { + if ($Debug) { debug(" Begin of SESSION section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'session'}) { + $countloaded++; + if ($field[1]) { $_session{$field[0]}+=$field[1]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_SESSION' || $field[0] eq "${xmleb}END_SESSION" || ! $_); + if ($field[0] ne 'END_SESSION' && $field[0] ne "${xmleb}END_SESSION") { error("History file \"$filetoread\" is corrupted (End of section SESSION not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of SESSION section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'session'}; + # WE DO NOT SAVE SECTION NOW BECAUSE VALUES CAN BE CHANGED AFTER READING VISITOR + #if ($SectionsToSave{'session'}) { + # Save_History('session',$year,$month); delete $SectionsToSave{'session'}; } + # if ($withpurge) { %_session=(); } + #} + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_OS + if ($field[0] eq 'BEGIN_OS') { + if ($Debug) { debug(" Begin of OS section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'os'}) { + $countloaded++; + if ($field[1]) { $_os_h{$field[0]}+=$field[1]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_OS' || $field[0] eq "${xmleb}END_OS" || ! $_); + if ($field[0] ne 'END_OS' && $field[0] ne "${xmleb}END_OS") { error("History file \"$filetoread\" is corrupted (End of section OS not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of OS section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'os'}; + if ($SectionsToSave{'os'}) { + Save_History('os',$year,$month); delete $SectionsToSave{'os'}; + if ($withpurge) { %_os_h=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_BROWSER + if ($field[0] eq 'BEGIN_BROWSER') { + if ($Debug) { debug(" Begin of BROWSER section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'browser'}) { + $countloaded++; + if ($field[1]) { $_browser_h{$field[0]}+=$field[1]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_BROWSER' || $field[0] eq "${xmleb}END_BROWSER" || ! $_); + if ($field[0] ne 'END_BROWSER' && $field[0] ne "${xmleb}END_BROWSER") { error("History file \"$filetoread\" is corrupted (End of section BROWSER not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of BROWSER section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'browser'}; + if ($SectionsToSave{'browser'}) { + Save_History('browser',$year,$month); delete $SectionsToSave{'browser'}; + if ($withpurge) { %_browser_h=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_UNKNOWNREFERER + if ($field[0] eq 'BEGIN_UNKNOWNREFERER') { + if ($Debug) { debug(" Begin of UNKNOWNREFERER section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'unknownreferer'}) { + $countloaded++; + if (! $_unknownreferer_l{$field[0]}) { $_unknownreferer_l{$field[0]}=int($field[1]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_UNKNOWNREFERER' || $field[0] eq "${xmleb}END_UNKNOWNREFERER" || ! $_); + if ($field[0] ne 'END_UNKNOWNREFERER' && $field[0] ne "${xmleb}END_UNKNOWNREFERER") { error("History file \"$filetoread\" is corrupted (End of section UNKNOWNREFERER not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of UNKNOWNREFERER section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'unknownreferer'}; + if ($SectionsToSave{'unknownreferer'}) { + Save_History('unknownreferer',$year,$month); delete $SectionsToSave{'unknownreferer'}; + if ($withpurge) { %_unknownreferer_l=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_UNKNOWNREFERERBROWSER + if ($field[0] eq 'BEGIN_UNKNOWNREFERERBROWSER') { + if ($Debug) { debug(" Begin of UNKNOWNREFERERBROWSER section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'unknownrefererbrowser'}) { + $countloaded++; + if (! $_unknownrefererbrowser_l{$field[0]}) { $_unknownrefererbrowser_l{$field[0]}=int($field[1]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_UNKNOWNREFERERBROWSER' || $field[0] eq "${xmleb}END_UNKNOWNREFERERBROWSER" || ! $_); + if ($field[0] ne 'END_UNKNOWNREFERERBROWSER' && $field[0] ne "${xmleb}END_UNKNOWNREFERERBROWSER") { error("History file \"$filetoread\" is corrupted (End of section UNKNOWNREFERERBROWSER not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of UNKNOWNREFERERBROWSER section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'unknownrefererbrowser'}; + if ($SectionsToSave{'unknownrefererbrowser'}) { + Save_History('unknownrefererbrowser',$year,$month); delete $SectionsToSave{'unknownrefererbrowser'}; + if ($withpurge) { %_unknownrefererbrowser_l=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_SCREENSIZE + if ($field[0] eq 'BEGIN_SCREENSIZE') { + if ($Debug) { debug(" Begin of SCREENSIZE section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'screensize'}) { + $countloaded++; + if ($field[1]) { $_screensize_h{$field[0]}+=$field[1]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_SCREENSIZE' || $field[0] eq "${xmleb}END_SCREENSIZE" || ! $_); + if ($field[0] ne 'END_SCREENSIZE' && $field[0] ne "${xmleb}END_SCREENSIZE") { error("History file \"$filetoread\" is corrupted (End of section SCREENSIZE not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of SCREENSIZE section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'screensize'}; + if ($SectionsToSave{'screensize'}) { + Save_History('screensize',$year,$month); delete $SectionsToSave{'screensize'}; + if ($withpurge) { %_screensize_h=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_ROBOT + if ($field[0] eq 'BEGIN_ROBOT') { + if ($Debug) { debug(" Begin of ROBOT section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'robot'}) { + $countloaded++; + if ($field[1]) { $_robot_h{$field[0]}+=$field[1]; } + if ($versionnum < 5000 || ! $field[3]) { # For backward compatibility + if (! $_robot_l{$field[0]}) { $_robot_l{$field[0]}=int($field[2]); } + } + else { + $_robot_k{$field[0]}+=$field[2]; + if (! $_robot_l{$field[0]}) { $_robot_l{$field[0]}=int($field[3]); } + } + if ($field[4]) { $_robot_r{$field[0]}+=$field[4]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_ROBOT' || $field[0] eq "${xmleb}END_ROBOT" || ! $_); + if ($field[0] ne 'END_ROBOT' && $field[0] ne "${xmleb}END_ROBOT") { error("History file \"$filetoread\" is corrupted (End of section ROBOT not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of ROBOT section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'robot'}; + if ($SectionsToSave{'robot'}) { + Save_History('robot',$year,$month); delete $SectionsToSave{'robot'}; + if ($withpurge) { %_robot_h=(); %_robot_k=(); %_robot_l=(); %_robot_r=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_WORMS + if ($field[0] eq 'BEGIN_WORMS') { + if ($Debug) { debug(" Begin of WORMS section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'worms'}) { + $countloaded++; + if ($field[1]) { $_worm_h{$field[0]}+=$field[1]; } + $_worm_k{$field[0]}+=$field[2]; + if (! $_worm_l{$field[0]}) { $_worm_l{$field[0]}=int($field[3]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_WORMS' || $field[0] eq "${xmleb}END_WORMS" || ! $_); + if ($field[0] ne 'END_WORMS' && $field[0] ne "${xmleb}END_WORMS") { error("History file \"$filetoread\" is corrupted (End of section WORMS not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of WORMS section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'worms'}; + if ($SectionsToSave{'worms'}) { + Save_History('worms',$year,$month); delete $SectionsToSave{'worms'}; + if ($withpurge) { %_worm_h=(); %_worm_k=(); %_worm_l=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_EMAILS + if ($field[0] eq 'BEGIN_EMAILSENDER') { + if ($Debug) { debug(" Begin of EMAILSENDER section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'emailsender'}) { + $countloaded++; + if ($field[1]) { $_emails_h{$field[0]}+=$field[1]; } + if ($field[2]) { $_emails_k{$field[0]}+=$field[2]; } + if (! $_emails_l{$field[0]}) { $_emails_l{$field[0]}=int($field[3]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_EMAILSENDER' || $field[0] eq "${xmleb}END_EMAILSENDER" || ! $_); + if ($field[0] ne 'END_EMAILSENDER' && $field[0] ne "${xmleb}END_EMAILSENDER") { error("History file \"$filetoread\" is corrupted (End of section EMAILSENDER not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of EMAILSENDER section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'emailsender'}; + if ($SectionsToSave{'emailsender'}) { + Save_History('emailsender',$year,$month); delete $SectionsToSave{'emailsender'}; + if ($withpurge) { %_emails_h=(); %_emails_k=(); %_emails_l=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_EMAILR + if ($field[0] eq 'BEGIN_EMAILRECEIVER') { + if ($Debug) { debug(" Begin of EMAILRECEIVER section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'emailreceiver'}) { + $countloaded++; + if ($field[1]) { $_emailr_h{$field[0]}+=$field[1]; } + if ($field[2]) { $_emailr_k{$field[0]}+=$field[2]; } + if (! $_emailr_l{$field[0]}) { $_emailr_l{$field[0]}=int($field[3]); } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_EMAILRECEIVER' || $field[0] eq "${xmleb}END_EMAILRECEIVER" || ! $_); + if ($field[0] ne 'END_EMAILRECEIVER' && $field[0] ne "${xmleb}END_EMAILRECEIVER") { error("History file \"$filetoread\" is corrupted (End of section EMAILRECEIVER not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of EMAILRECEIVER section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'emailreceiver'}; + if ($SectionsToSave{'emailreceiver'}) { + Save_History('emailreceiver',$year,$month); delete $SectionsToSave{'emailreceiver'}; + if ($withpurge) { %_emailr_h=(); %_emailr_k=(); %_emailr_l=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_SIDER + if ($field[0] eq 'BEGIN_SIDER') { + if ($Debug) { debug(" Begin of SIDER section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'sider'}) { + my $loadrecord=0; + if ($withupdate) { + $loadrecord=1; + } + else { + if ($HTMLOutput{'main'}) { + if ($MonthRequired eq 'all') { $loadrecord=1; } + else { + if ($countloaded < $MaxNbOf{'PageShown'} && $field[1] >= $MinHit{'File'}) { $loadrecord=1; } + $TotalDifferentPages++; + } + } + else { # This is for $HTMLOutput = urldetail, urlentry or urlexit + if ($MonthRequired eq 'all' ) { + if ((!$FilterIn{'url'} || $field[0] =~ /$FilterIn{'url'}/) + && (!$FilterEx{'url'} || $field[0] !~ /$FilterEx{'url'}/)) { $loadrecord=1; } + } + else { + if ((!$FilterIn{'url'} || $field[0] =~ /$FilterIn{'url'}/) + && (!$FilterEx{'url'} || $field[0] !~ /$FilterEx{'url'}/) + && $field[1] >= $MinHit{'File'}) { $loadrecord=1; } + $TotalDifferentPages++; + } + } + # Posssibilite de mettre if ($FilterIn{'url'} && $field[0] =~ /$FilterIn{'url'}/) mais il faut gerer TotalPages de la meme maniere + if ($versionnum < 4000) { # For history files < 4.0 + $TotalEntries+=($field[2]||0); + } + else { + $TotalBytesPages+=($field[2]||0); + $TotalEntries+=($field[3]||0); + $TotalExits+=($field[4]||0); + } + } + if ($loadrecord) { + if ($field[1]) { $_url_p{$field[0]}+=$field[1]; } + if ($versionnum < 4000) { # For history files < 4.0 + if ($field[2]) { $_url_e{$field[0]}+=$field[2]; } + $_url_k{$field[0]}=0; + } + else { + if ($field[2]) { $_url_k{$field[0]}+=$field[2]; } + if ($field[3]) { $_url_e{$field[0]}+=$field[3]; } + if ($field[4]) { $_url_x{$field[0]}+=$field[4]; } + } + $countloaded++; + } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_SIDER' || $field[0] eq "${xmleb}END_SIDER" || ! $_); + if ($field[0] ne 'END_SIDER' && $field[0] ne "${xmleb}END_SIDER") { error("History file \"$filetoread\" is corrupted (End of section SIDER not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of SIDER section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'sider'}; + # WE DO NOT SAVE SECTION NOW BECAUSE VALUES CAN BE CHANGED AFTER READING VISITOR + #if ($SectionsToSave{'sider'}) { + # Save_History('sider',$year,$month); delete $SectionsToSave{'sider'}; + # if ($withpurge) { %_url_p=(); %_url_k=(); %_url_e=(); %_url_x=(); } + #} + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_FILETYPES + if ($field[0] eq 'BEGIN_FILETYPES') { + if ($Debug) { debug(" Begin of FILETYPES section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'filetypes'}) { + $countloaded++; + if ($field[1]) { $_filetypes_h{$field[0]}+=$field[1]; } + if ($field[2]) { $_filetypes_k{$field[0]}+=$field[2]; } + if ($field[3]) { $_filetypes_gz_in{$field[0]}+=$field[3]; } + if ($field[4]) { $_filetypes_gz_out{$field[0]}+=$field[4]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_FILETYPES' || $field[0] eq "${xmleb}END_FILETYPES" || ! $_); + if ($field[0] ne 'END_FILETYPES' && $field[0] ne "${xmleb}END_FILETYPES") { error("History file \"$filetoread\" is corrupted (End of section FILETYPES not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of FILETYPES section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'filetypes'}; + if ($SectionsToSave{'filetypes'}) { + Save_History('filetypes',$year,$month); delete $SectionsToSave{'filetypes'}; + if ($withpurge) { %_filetypes_h=(); %_filetypes_k=(); %_filetypes_gz_in=(); %_filetypes_gz_out=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_SEREFERRALS + if ($field[0] eq 'BEGIN_SEREFERRALS') { + if ($Debug) { debug(" Begin of SEREFERRALS section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'sereferrals'}) { + $countloaded++; + if ($versionnum < 5004) { # For history files < 5.4 + my $se=$field[0]; $se=~s/\./\\./g; + if ($SearchEnginesHashID{$se}) { + $_se_referrals_h{$SearchEnginesHashID{$se}}+=$field[1]||0; + } + else { + $_se_referrals_h{$field[0]}+=$field[1]||0; + } + } + elsif ($versionnum < 5091) { # For history files < 5.91 + my $se=$field[0]; $se=~s/\./\\./g; + if ($SearchEnginesHashID{$se}) { + $_se_referrals_p{$SearchEnginesHashID{$se}}+=$field[1]||0; + $_se_referrals_h{$SearchEnginesHashID{$se}}+=$field[2]||0; + } + else { + $_se_referrals_p{$field[0]}+=$field[1]||0; + $_se_referrals_h{$field[0]}+=$field[2]||0; + } + } else { + if ($field[1]) { $_se_referrals_p{$field[0]}+=$field[1]; } + if ($field[2]) { $_se_referrals_h{$field[0]}+=$field[2]; } + } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_SEREFERRALS' || $field[0] eq "${xmleb}END_SEREFERRALS" || ! $_); + if ($field[0] ne 'END_SEREFERRALS' && $field[0] ne "${xmleb}END_SEREFERRALS") { error("History file \"$filetoread\" is corrupted (End of section SEREFERRALS not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of SEREFERRALS section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'sereferrals'}; + if ($SectionsToSave{'sereferrals'}) { + Save_History('sereferrals',$year,$month); delete $SectionsToSave{'sereferrals'}; + if ($withpurge) { %_se_referrals_p=(); %_se_referrals_h=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_PAGEREFS + if ($field[0] eq 'BEGIN_PAGEREFS') { + if ($Debug) { debug(" Begin of PAGEREFS section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'pagerefs'}) { + my $loadrecord=0; + if ($withupdate) { + $loadrecord=1; + } + else { + if ((!$FilterIn{'refererpages'} || $field[0] =~ /$FilterIn{'refererpages'}/) + && (!$FilterEx{'refererpages'} || $field[0] !~ /$FilterEx{'refererpages'}/)) { $loadrecord=1; } + } + if ($loadrecord) { + if ($versionnum < 5004) { # For history files < 5.4 + if ($field[1]) { $_pagesrefs_h{$field[0]}+=int($field[1]); } + } else { + if ($field[1]) { $_pagesrefs_p{$field[0]}+=int($field[1]); } + if ($field[2]) { $_pagesrefs_h{$field[0]}+=int($field[2]); } + } + $countloaded++; + } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_PAGEREFS' || $field[0] eq "${xmleb}END_PAGEREFS" || ! $_); + if ($field[0] ne 'END_PAGEREFS' && $field[0] ne "${xmleb}END_PAGEREFS") { error("History file \"$filetoread\" is corrupted (End of section PAGEREFS not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of PAGEREFS section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'pagerefs'}; + if ($SectionsToSave{'pagerefs'}) { + Save_History('pagerefs',$year,$month); delete $SectionsToSave{'pagerefs'}; + if ($withpurge) { %_pagesrefs_p=(); %_pagesrefs_h=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_SEARCHWORDS + if ($field[0] eq 'BEGIN_SEARCHWORDS') { + if ($Debug) { debug(" Begin of SEARCHWORDS section ($MaxNbOf{'KeyphrasesShown'},$MinHit{'Keyphrase'})"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'searchwords'}) { + my $loadrecord=0; + if ($withupdate) { + $loadrecord=1; + } + else { + if ($HTMLOutput{'main'}) { + if ($MonthRequired eq 'all') { $loadrecord=1; } + else { + if ($countloaded < $MaxNbOf{'KeyphrasesShown'} && $field[1] >= $MinHit{'Keyphrase'}) { $loadrecord=1; } + $TotalDifferentKeyphrases++; + $TotalKeyphrases+=($field[1]||0); + } + } + elsif ($HTMLOutput{'keyphrases'}) { # Load keyphrases for keyphrases chart + if ($MonthRequired eq 'all' ) { $loadrecord=1; } + else { + if ($field[1] >= $MinHit{'Keyphrase'}) { $loadrecord=1; } + $TotalDifferentKeyphrases++; + $TotalKeyphrases+=($field[1]||0); + } + } + if ($HTMLOutput{'keywords'}) { # Load keyphrases for keywords chart + $loadrecord=2; + } + } + if ($loadrecord) { + if ($field[1]) { + if ($loadrecord==2) { + foreach (split(/\+/,$field[0])) { # field[0] is "val1+val2+..." + $_keywords{$_}+=$field[1]; + } + } + else { + $_keyphrases{$field[0]}+=$field[1]; + } + } + $countloaded++; + } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_SEARCHWORDS' || $field[0] eq "${xmleb}END_SEARCHWORDS" || ! $_); + if ($field[0] ne 'END_SEARCHWORDS' && $field[0] ne "${xmleb}END_SEARCHWORDS") { error("History file \"$filetoread\" is corrupted (End of section SEARCHWORDS not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of SEARCHWORDS section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'searchwords'}; + if ($SectionsToSave{'searchwords'}) { + Save_History('searchwords',$year,$month); delete $SectionsToSave{'searchwords'}; # This save searwords and keywords sections + if ($withpurge) { %_keyphrases=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_KEYWORDS + if ($field[0] eq 'BEGIN_KEYWORDS') { + if ($Debug) { debug(" Begin of KEYWORDS section ($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'})"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'keywords'}) { + my $loadrecord=0; + if ($MonthRequired eq 'all') { $loadrecord=1; } + else { + if ($countloaded < $MaxNbOf{'KeywordsShown'} && $field[1] >= $MinHit{'Keyword'}) { $loadrecord=1; } + $TotalDifferentKeywords++; + $TotalKeywords+=($field[1]||0); + } + if ($loadrecord) { + if ($field[1]) { $_keywords{$field[0]}+=$field[1]; } + $countloaded++; + } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_KEYWORDS' || $field[0] eq "${xmleb}END_KEYWORDS" || ! $_); + if ($field[0] ne 'END_KEYWORDS' && $field[0] ne "${xmleb}END_KEYWORDS") { error("History file \"$filetoread\" is corrupted (End of section KEYWORDS not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of KEYWORDS section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'keywords'}; + if ($SectionsToSave{'keywords'}) { + Save_History('keywords',$year,$month); delete $SectionsToSave{'keywords'}; + if ($withpurge) { %_keywords=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_ERRORS + if ($field[0] eq 'BEGIN_ERRORS') { + if ($Debug) { debug(" Begin of ERRORS section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{'errors'}) { + $countloaded++; + if ($field[1]) { $_errors_h{$field[0]}+=$field[1]; } + if ($field[2]) { $_errors_k{$field[0]}+=$field[2]; } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq 'END_ERRORS' || $field[0] eq "${xmleb}END_ERRORS" || ! $_); + if ($field[0] ne 'END_ERRORS' && $field[0] ne "${xmleb}END_ERRORS") { error("History file \"$filetoread\" is corrupted (End of section ERRORS not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of ERRORS section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{'errors'}; + if ($SectionsToSave{'errors'}) { + Save_History('errors',$year,$month); delete $SectionsToSave{'errors'}; + if ($withpurge) { %_errors_h=(); %_errors_k=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + # BEGIN_SIDER_xxx + foreach my $code (keys %TrapInfosForHTTPErrorCodes) { + if ($field[0] eq "BEGIN_SIDER_$code") { + if ($Debug) { debug(" Begin of SIDER_$code section"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0]) { + $count++; + if ($SectionsToLoad{"sider_$code"}) { + $countloaded++; + if ($field[1]) { $_sider404_h{$field[0]}+=$field[1]; } + if ($withupdate || $HTMLOutput{"errors$code"}) { + if ($field[2]) { $_referer404_h{$field[0]}=$field[2]; } + } + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq "END_SIDER_$code" || $field[0] eq "${xmleb}END_SIDER_$code" || ! $_); + if ($field[0] ne "END_SIDER_$code" && $field[0] ne "${xmleb}END_SIDER_$code") { error("History file \"$filetoread\" is corrupted (End of section SIDER_$code not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of SIDER_$code section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{"sider_$code"}; + if ($SectionsToSave{"sider_$code"}) { + Save_History("sider_$code",$year,$month); delete $SectionsToSave{"sider_$code"}; + if ($withpurge) { %_sider404_h=(); %_referer404_h=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + } + # BEGIN_EXTRA_xxx + foreach my $extranum (1..@ExtraName-1) { + if ($field[0] eq "BEGIN_EXTRA_$extranum") { + if ($Debug) { debug(" Begin of EXTRA_$extranum"); } + $field[0]=''; + my $count=0;my $countloaded=0; + do { + if ($field[0] ne '') { + $count++; + if ($SectionsToLoad{"extra_$extranum"}) { + if ($ExtraStatTypes[$extranum] =~ /P/i && $field[1]) { ${'_section_' . $extranum . '_p'}{$field[0]}+=$field[1]; } + ${'_section_' . $extranum . '_h'}{$field[0]}+=$field[2]; + if ($ExtraStatTypes[$extranum] =~ /B/i && $field[3]) { ${'_section_' . $extranum . '_k'}{$field[0]}+=$field[3]; } + if ($ExtraStatTypes[$extranum] =~ /L/i && ! ${'_section_' . $extranum . '_l'}{$field[0]} && $field[4]) { ${'_section_' . $extranum . '_l'}{$field[0]}=int($field[4]); } + $countloaded++; + } + } + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq "END_EXTRA_$extranum" || $field[0] eq "${xmleb}END_EXTRA_$extranum" || ! $_); + if ($field[0] ne "END_EXTRA_$extranum" && $field[0] ne "${xmleb}END_EXTRA_$extranum") { error("History file \"$filetoread\" is corrupted (End of section EXTRA_$extranum not found).\nRestore a recent backup of this file (data for this month will be restored to backup date), remove it (data for month will be lost), or remove the corrupted section in file (data for at least this section will be lost).","","",1); } + if ($Debug) { debug(" End of EXTRA_$extranum section ($count entries, $countloaded loaded)"); } + delete $SectionsToLoad{"extra_$extranum"}; + if ($SectionsToSave{"extra_$extranum"}) { + Save_History("extra_$extranum",$year,$month); delete $SectionsToSave{"extra_$extranum"}; + if ($withpurge) { %{'_section_' . $extranum . '_p'}=(); %{'_section_' . $extranum . '_h'}=(); %{'_section_' . $extranum . '_b'}=(); %{'_section_' . $extranum . '_l'}=(); } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + next; + } + } + + # BEGIN_PLUGINS + if ($AtLeastOneSectionPlugin && $field[0] =~ /^BEGIN_PLUGIN_(\w+)$/i) { + my $pluginname=$1; + my $found=0; + foreach (keys %{$PluginsLoaded{'SectionInitHashArray'}}) { + if ($pluginname eq $_) { + # The plugin for this section was loaded + $found=1; + my $issectiontoload=$SectionsToLoad{"plugin_$pluginname"}; + my $function="SectionReadHistory_$pluginname(\$issectiontoload,\$xmlold,\$xmleb,\$countlines)"; + eval("$function"); + delete $SectionsToLoad{"plugin_$pluginname"}; + if ($SectionsToSave{"plugin_$pluginname"}) { + Save_History("plugin_$pluginname",$year,$month); delete $SectionsToSave{"plugin_$pluginname"}; + if ($withpurge) { + my $function="SectionInitHashArray_$pluginname()"; + eval("$function"); + } + } + last; + } + } + if (! scalar %SectionsToLoad) { debug(" Stop reading history file. Got all we need."); last; } + # The plugin for this section was not loaded + if (! $found) { + do { + $_=; + chomp $_; s/\r//; + @field=split(/\s+/,($xmlold?CleanFromTags($_):$_)); $countlines++; + } + until ($field[0] eq "END_PLUGIN_$pluginname" || $field[0] eq "${xmleb}END_PLUGIN_$pluginname" || ! $_); + } + next; + } + + # For backward compatibility (ORIGIN section was "HitFromx" in old history files) + if ($SectionsToLoad{'origin'}) { + if ($field[0] eq 'HitFrom0') { $_from_p[0]+=0; $_from_h[0]+=$field[1]; next; } + if ($field[0] eq 'HitFrom1') { $_from_p[1]+=0; $_from_h[1]+=$field[1]; next; } + if ($field[0] eq 'HitFrom2') { $_from_p[2]+=0; $_from_h[2]+=$field[1]; next; } + if ($field[0] eq 'HitFrom3') { $_from_p[3]+=0; $_from_h[3]+=$field[1]; next; } + if ($field[0] eq 'HitFrom4') { $_from_p[4]+=0; $_from_h[4]+=$field[1]; next; } + if ($field[0] eq 'HitFrom5') { $_from_p[5]+=0; $_from_h[5]+=$field[1]; next; } + } + } + } + + if ($withupdate) { + # Process rest of data saved in 'wait' arrays (data for hosts that are not in history file or no history file found) + # This can change some values for day, sider and session sections + if ($Debug) { debug(" Processing data in 'wait' arrays",3); } + foreach (keys %_waithost_e) { + if ($Debug) { debug(" Visit in 'wait' array for $_ is a new visit",4); } + my $newtimehosts=($_waithost_s{$_}?$_waithost_s{$_}:$_host_s{$_}); + my $newtimehostl=($_waithost_l{$_}?$_waithost_l{$_}:$_host_l{$_}); + $_url_e{$_waithost_e{$_}}++; + $newtimehosts =~ /^(\d\d\d\d\d\d\d\d)/; $DayVisits{$1}++; + if ($_waithost_s{$_}) { + # There was also a second session in processed log + $_session{GetSessionRange($newtimehosts,$newtimehostl)}++; + } + } + } + + # Write all unwrote sections in section order ('general','time', 'day','sider','session' and other...) + foreach my $key (sort { $SectionsToSave{$a} <=> $SectionsToSave{$b} } keys %SectionsToSave) { + Save_History("$key",$year,$month,$lastlinenb,$lastlineoffset,$lastlinechecksum); + } + %SectionsToSave=(); + + # Update offset in map section and last data in general section then close files + if ($withupdate) { + if ($xml) { print HISTORYTMP "\n\n\n"; } + + # Update offset of sections in the MAP section + foreach (sort { $PosInFile{$a} <=> $PosInFile{$b} } keys %ValueInFile) { + if ($Debug) { debug(" Update offset of section $_=$ValueInFile{$_} in file at offset $PosInFile{$_}"); } + if ($PosInFile{"$_"}) { + seek(HISTORYTMP,$PosInFile{"$_"},0); print HISTORYTMP $ValueInFile{"$_"}; + } + } + # Save last data in general sections + if ($Debug) { debug(" Update MonthVisits=$MonthVisits{$year.$month} in file at offset $PosInFile{TotalVisits}"); } + seek(HISTORYTMP,$PosInFile{"TotalVisits"},0); print HISTORYTMP $MonthVisits{$year.$month}; + if ($Debug) { debug(" Update MonthUnique=$MonthUnique{$year.$month} in file at offset $PosInFile{TotalUnique}"); } + seek(HISTORYTMP,$PosInFile{"TotalUnique"},0); print HISTORYTMP $MonthUnique{$year.$month}; + if ($Debug) { debug(" Update MonthHostsKnown=$MonthHostsKnown{$year.$month} in file at offset $PosInFile{MonthHostsKnown}"); } + seek(HISTORYTMP,$PosInFile{"MonthHostsKnown"},0); print HISTORYTMP $MonthHostsKnown{$year.$month}; + if ($Debug) { debug(" Update MonthHostsUnknown=$MonthHostsUnknown{$year.$month} in file at offset $PosInFile{MonthHostsUnknown}"); } + seek(HISTORYTMP,$PosInFile{"MonthHostsUnknown"},0); print HISTORYTMP $MonthHostsUnknown{$year.$month}; + close(HISTORYTMP) || error("Failed to write temporary history file"); + } + if ($withread) { + close(HISTORY) || error("Command for pipe '$filetoread' failed"); + } + + # Purge data + if ($withpurge) { &Init_HashArray(); } + + # If update, rename tmp file bis into tmp file or set HistoryAlreadyFlushed + if ($withupdate) { + if ($HistoryAlreadyFlushed{"$year$month"}) { + debug("Rename tmp history file bis '$filetoread' to '$filetowrite'"); + if (rename($filetowrite,$filetoread)==0) { + error("Failed to update tmp history file $filetoread"); + } + } + else { + $HistoryAlreadyFlushed{"$year$month"}=1; + } + if (! $ListOfYears{"$year"} || $ListOfYears{"$year"} lt "$month") { $ListOfYears{"$year"}="$month"; } + } + + # For backward compatibility, if LastLine does not exist, set to LastTime + $LastLine||=$LastTime{$year.$month}; + + return ($withupdate?"$filetowrite":""); +} + +#------------------------------------------------------------------------------ +# Function: Save a part of history file +# Parameters: sectiontosave,year,month[,lastlinenb,lastlineoffset,lastlinechecksum] +# Input: $VERSION HISTORYTMP $nowyear $nowmonth $nowday $nowhour $nowmin $nowsec $LastLineNumber $LastLineOffset $LastLineChecksum +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub Save_History { + my $sectiontosave=shift||''; + my $year=shift||''; + my $month=shift||''; + + my $xml=($BuildHistoryFormat eq 'xml'?1:0); + my ($xmlbb,$xmlbs,$xmlbe,$xmlhb,$xmlhs,$xmlhe,$xmlrb,$xmlrs,$xmlre,$xmleb,$xmlee)=('','','','','','','','','','',''); + if ($xml) { ($xmlbb,$xmlbs,$xmlbe,$xmlhb,$xmlhs,$xmlhe,$xmlrb,$xmlrs,$xmlre,$xmleb,$xmlee)=("\n",'','','','','
    ','','
    ','','
    ',"\n" ); } + else { $xmlbs=' '; $xmlhs=' '; $xmlrs=' '; } + + my $lastlinenb=shift||0; + my $lastlineoffset=shift||0; + my $lastlinechecksum=shift||0; + if (! $lastlinenb) { # This happens for migrate + $lastlinenb=$LastLineNumber; + $lastlineoffset=$LastLineOffset; + $lastlinechecksum=$LastLineChecksum; + } + + if ($Debug) { debug(" Save_History [sectiontosave=$sectiontosave,year=$year,month=$month,lastlinenb=$lastlinenb,lastlineoffset=$lastlineoffset,lastlinechecksum=$lastlinechecksum]",1); } + my $spacebar=" "; + my %keysinkeylist=(); + + # Header + if ($sectiontosave eq 'header') { + if ($xml) { print HISTORYTMP "\n"; } + print HISTORYTMP "AWSTATS DATA FILE $VERSION\n"; + if ($xml) { print HISTORYTMP "\n"; } + print HISTORYTMP "# If you remove this file, all statistics for date $year-$month will be lost/reset.\n"; + if ($xml) { print HISTORYTMP "\n"; } + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Position (offset in bytes) in this file of beginning of each section for\n"; + print HISTORYTMP "# direct I/O access. If you made changes somewhere in this file, you should\n"; + print HISTORYTMP "# also remove completely the MAP section (AWStats will rewrite it at next\n"; + print HISTORYTMP "# update).\n"; + print HISTORYTMP "${xmlbb}BEGIN_MAP${xmlbs}".(26+(scalar keys %TrapInfosForHTTPErrorCodes)+(scalar @ExtraName?scalar @ExtraName-1:0)+(scalar keys %{$PluginsLoaded{'SectionInitHashArray'}}))."${xmlbe}\n"; + print HISTORYTMP "${xmlrb}POS_GENERAL${xmlrs}";$PosInFile{"general"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + # When + print HISTORYTMP "${xmlrb}POS_TIME${xmlrs}";$PosInFile{"time"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_VISITOR${xmlrs}";$PosInFile{"visitor"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_DAY${xmlrs}";$PosInFile{"day"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + # Who + print HISTORYTMP "${xmlrb}POS_DOMAIN${xmlrs}";$PosInFile{"domain"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_LOGIN${xmlrs}";$PosInFile{"login"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_ROBOT${xmlrs}";$PosInFile{"robot"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_WORMS${xmlrs}";$PosInFile{"worms"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_EMAILSENDER${xmlrs}";$PosInFile{"emailsender"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_EMAILRECEIVER${xmlrs}";$PosInFile{"emailreceiver"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + # Navigation + print HISTORYTMP "${xmlrb}POS_SESSION${xmlrs}";$PosInFile{"session"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_SIDER${xmlrs}";$PosInFile{"sider"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_FILETYPES${xmlrs}";$PosInFile{"filetypes"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_OS${xmlrs}";$PosInFile{"os"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_BROWSER${xmlrs}";$PosInFile{"browser"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_SCREENSIZE${xmlrs}";$PosInFile{"screensize"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_UNKNOWNREFERER${xmlrs}";$PosInFile{'unknownreferer'}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_UNKNOWNREFERERBROWSER${xmlrs}";$PosInFile{'unknownrefererbrowser'}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + # Referers + print HISTORYTMP "${xmlrb}POS_ORIGIN${xmlrs}";$PosInFile{"origin"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_SEREFERRALS${xmlrs}";$PosInFile{"sereferrals"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_PAGEREFS${xmlrs}";$PosInFile{"pagerefs"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_SEARCHWORDS${xmlrs}";$PosInFile{"searchwords"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_KEYWORDS${xmlrs}";$PosInFile{"keywords"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + # Others + print HISTORYTMP "${xmlrb}POS_MISC${xmlrs}";$PosInFile{"misc"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_ERRORS${xmlrs}";$PosInFile{"errors"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}POS_CLUSTER${xmlrs}";$PosInFile{"cluster"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + foreach (keys %TrapInfosForHTTPErrorCodes) { + print HISTORYTMP "${xmlrb}POS_SIDER_$_${xmlrs}";$PosInFile{"sider_$_"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + } + foreach (1..@ExtraName-1) { + print HISTORYTMP "${xmlrb}POS_EXTRA_$_${xmlrs}";$PosInFile{"extra_$_"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + } + foreach (keys %{$PluginsLoaded{'SectionInitHashArray'}}) { + print HISTORYTMP "${xmlrb}POS_PLUGIN_$_${xmlrs}";$PosInFile{"plugin_$_"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_MAP${xmlee}\n"; + } + + # General + if ($sectiontosave eq 'general') { + if ($LastUpdate < int("$nowyear$nowmonth$nowday$nowhour$nowmin$nowsec")) { $LastUpdate=int("$nowyear$nowmonth$nowday$nowhour$nowmin$nowsec"); } + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# LastLine = Date of last record processed - Last record line number in last log - Last record offset in last log - Last record signature value\n"; + print HISTORYTMP "# FirstTime = Date of first visit for history file\n"; + print HISTORYTMP "# LastTime = Date of last visit for history file\n"; + print HISTORYTMP "# LastUpdate = Date of last update - Nb of parsed records - Nb of parsed old records - Nb of parsed new records - Nb of parsed corrupted - Nb of parsed dropped\n"; + print HISTORYTMP "# TotalVisits = Number of visits\n"; + print HISTORYTMP "# TotalUnique = Number of unique visitors\n"; + print HISTORYTMP "# MonthHostsKnown = Number of hosts known\n"; + print HISTORYTMP "# MonthHostsUnKnown = Number of hosts unknown\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_GENERAL${xmlbs}8${xmlbe}\n"; + print HISTORYTMP "${xmlrb}LastLine${xmlrs}".($LastLine>0?$LastLine:$LastTime{$year.$month})." $lastlinenb $lastlineoffset $lastlinechecksum${xmlre}\n"; + print HISTORYTMP "${xmlrb}FirstTime${xmlrs}$FirstTime{$year.$month}${xmlre}\n"; + print HISTORYTMP "${xmlrb}LastTime${xmlrs}$LastTime{$year.$month}${xmlre}\n"; + print HISTORYTMP "${xmlrb}LastUpdate${xmlrs}$LastUpdate $NbOfLinesParsed $NbOfOldLines $NbOfNewLines $NbOfLinesCorrupted $NbOfLinesDropped${xmlre}\n"; + print HISTORYTMP "${xmlrb}TotalVisits${xmlrs}";$PosInFile{"TotalVisits"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}TotalUnique${xmlrs}";$PosInFile{"TotalUnique"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}MonthHostsKnown${xmlrs}";$PosInFile{"MonthHostsKnown"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmlrb}MonthHostsUnknown${xmlrs}";$PosInFile{"MonthHostsUnknown"}=tell HISTORYTMP;print HISTORYTMP "$spacebar${xmlre}\n"; + print HISTORYTMP "${xmleb}".(${xmleb}?"\n":"")."END_GENERAL${xmlee}\n"; # END_GENERAL on a new line following xml tag because END_ detection does not work like other sections + } + + # When + if ($sectiontosave eq 'time') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Hour - Pages - Hits - Bandwidth - Not viewed Pages - Not viewed Hits - Not viewed Bandwidth\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_TIME${xmlbs}24${xmlbe}\n"; + for (my $ix=0; $ix<=23; $ix++) { print HISTORYTMP "${xmlrb}$ix${xmlrs}".int($_time_p[$ix])."${xmlrs}".int($_time_h[$ix])."${xmlrs}".int($_time_k[$ix])."${xmlrs}".int($_time_nv_p[$ix])."${xmlrs}".int($_time_nv_h[$ix])."${xmlrs}".int($_time_nv_k[$ix])."${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_TIME${xmlee}\n"; + } + if ($sectiontosave eq 'day') { # This section must be saved after VISITOR section is read + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Date - Pages - Hits - Bandwidth - Visits\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_DAY${xmlbs}".(scalar keys %DayHits)."${xmlbe}\n"; + my $monthvisits=0; + foreach (sort keys %DayHits) { + if ($_ =~ /^$year$month/i) { # Found a day entry of the good month + my $page=$DayPages{$_}||0; + my $hits=$DayHits{$_}||0; + my $bytes=$DayBytes{$_}||0; + my $visits=$DayVisits{$_}||0; + print HISTORYTMP "${xmlrb}$_${xmlrs}$page${xmlrs}$hits${xmlrs}$bytes${xmlrs}$visits${xmlre}\n"; + $monthvisits+=$visits; + } + } + $MonthVisits{$year.$month}=$monthvisits; + print HISTORYTMP "${xmleb}END_DAY${xmlee}\n"; + } + + # Who + if ($sectiontosave eq 'domain') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'Domain'}\n"; } + print HISTORYTMP "# Domain - Pages - Hits - Bandwidth\n"; + print HISTORYTMP "# The $MaxNbOf{'Domain'} first Pages must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_DOMAIN${xmlbs}".(scalar keys %_domener_h)."${xmlbe}\n"; + # We save page list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'Domain'},$MinHit{'Domain'},\%_domener_h,\%_domener_p); + my %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + my $page=$_domener_p{$_}||0; + my $bytes=$_domener_k{$_}||0; # ||0 could be commented to reduce history file size + print HISTORYTMP "${xmlrb}$_${xmlrs}$page${xmlrs}$_domener_h{$_}${xmlrs}$bytes${xmlre}\n"; + } + foreach (keys %_domener_h) { + if ($keysinkeylist{$_}) { next; } + my $page=$_domener_p{$_}||0; + my $bytes=$_domener_k{$_}||0; # ||0 could be commented to reduce history file size + print HISTORYTMP "${xmlrb}$_${xmlrs}$page${xmlrs}$_domener_h{$_}${xmlrs}$bytes${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_DOMAIN${xmlee}\n"; + } + if ($sectiontosave eq 'visitor') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'HostsShown'}\n"; } + print HISTORYTMP "# Host - Pages - Hits - Bandwidth - Last visit date - [Start date of last visit] - [Last page of last visit]\n"; + print HISTORYTMP "# [Start date of last visit] and [Last page of last visit] are saved only if session is not finished\n"; + print HISTORYTMP "# The $MaxNbOf{'HostsShown'} first Hits must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_VISITOR${xmlbs}".(scalar keys %_host_h)."${xmlbe}\n"; + my $monthhostsknown=0; + # We save page list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'HostsShown'},$MinHit{'Host'},\%_host_h,\%_host_p); + my %keysinkeylist=(); + foreach my $key (@keylist) { + if ($key !~ /^\d+\.\d+\.\d+\.\d+$/ && $key !~ /^[0-9A-F]*:/i) { $monthhostsknown++; } + $keysinkeylist{$key}=1; + my $page=$_host_p{$key}||0; + my $bytes=$_host_k{$key}||0; + my $timehostl=$_host_l{$key}||0; + my $timehosts=$_host_s{$key}||0; + my $lastpage=$_host_u{$key}||''; + if ($timehostl && $timehosts && $lastpage) { + if (($timehostl+$VISITTIMEOUT) < $LastLine) { + # Session for this user is expired + if ($timehosts) { $_session{GetSessionRange($timehosts,$timehostl)}++; } + if ($lastpage) { $_url_x{$lastpage}++; } + delete $_host_s{$key}; + delete $_host_u{$key}; + print HISTORYTMP "${xmlrb}$key${xmlrs}$page${xmlrs}$_host_h{$key}${xmlrs}$bytes${xmlrs}$timehostl${xmlre}\n"; + } + else { + # If this user has started a new session that is not expired + print HISTORYTMP "${xmlrb}$key${xmlrs}$page${xmlrs}$_host_h{$key}${xmlrs}$bytes${xmlrs}$timehostl${xmlrs}$timehosts${xmlrs}$lastpage${xmlre}\n"; + } + } + else { + my $hostl=$timehostl||''; + print HISTORYTMP "${xmlrb}$key${xmlrs}$page${xmlrs}$_host_h{$key}${xmlrs}$bytes${xmlrs}$hostl${xmlre}\n"; + } + } + foreach my $key (keys %_host_h) { + if ($keysinkeylist{$key}) { next; } + if ($key !~ /^\d+\.\d+\.\d+\.\d+$/ && $key !~ /^[0-9A-F]*:/i) { $monthhostsknown++; } + my $page=$_host_p{$key}||0; + my $bytes=$_host_k{$key}||0; + my $timehostl=$_host_l{$key}||0; + my $timehosts=$_host_s{$key}||0; + my $lastpage=$_host_u{$key}||''; + if ($timehostl && $timehosts && $lastpage) { + if (($timehostl+$VISITTIMEOUT) < $LastLine) { + # Session for this user is expired + if ($timehosts) { $_session{GetSessionRange($timehosts,$timehostl)}++; } + if ($lastpage) { $_url_x{$lastpage}++; } + delete $_host_s{$key}; + delete $_host_u{$key}; + print HISTORYTMP "${xmlrb}$key${xmlrs}$page${xmlrs}$_host_h{$key}${xmlrs}$bytes${xmlrs}$timehostl${xmlre}\n"; + } + else { + # If this user has started a new session that is not expired + print HISTORYTMP "${xmlrb}$key${xmlrs}$page${xmlrs}$_host_h{$key}${xmlrs}$bytes${xmlrs}$timehostl${xmlrs}$timehosts${xmlrs}$lastpage${xmlre}\n"; + } + } + else { + my $hostl=$timehostl||''; + print HISTORYTMP "${xmlrb}$key${xmlrs}$page${xmlrs}$_host_h{$key}${xmlrs}$bytes${xmlrs}$hostl${xmlre}\n"; + } + } + $MonthUnique{$year.$month}=(scalar keys %_host_p); + $MonthHostsKnown{$year.$month}=$monthhostsknown; + $MonthHostsUnknown{$year.$month}=(scalar keys %_host_h) - $monthhostsknown; + print HISTORYTMP "${xmleb}END_VISITOR${xmlee}\n"; + } + if ($sectiontosave eq 'login') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'LoginShown'}\n"; } + print HISTORYTMP "# Login - Pages - Hits - Bandwidth - Last visit\n"; + print HISTORYTMP "# The $MaxNbOf{'LoginShown'} first Pages must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_LOGIN${xmlbs}".(scalar keys %_login_h)."${xmlbe}\n"; + # We save login list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'LoginShown'},$MinHit{'Login'},\%_login_h,\%_login_p); + my %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_login_p{$_}||0)."${xmlrs}".int($_login_h{$_}||0)."${xmlrs}".int($_login_k{$_}||0)."${xmlrs}".($_login_l{$_}||'')."${xmlre}\n"; + } + foreach (keys %_login_h) { + if ($keysinkeylist{$_}) { next; } + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_login_p{$_}||0)."${xmlrs}".int($_login_h{$_}||0)."${xmlrs}".int($_login_k{$_}||0)."${xmlrs}".($_login_l{$_}||'')."${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_LOGIN${xmlee}\n"; + } + if ($sectiontosave eq 'robot') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'RobotShown'}\n"; } + print HISTORYTMP "# Robot ID - Hits - Bandwidth - Last visit - Hits on robots.txt\n"; + print HISTORYTMP "# The $MaxNbOf{'RobotShown'} first Hits must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_ROBOT${xmlbs}".(scalar keys %_robot_h)."${xmlbe}\n"; + # We save robot list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'RobotShown'},$MinHit{'Robot'},\%_robot_h,\%_robot_h); + my %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_robot_h{$_})."${xmlrs}".int($_robot_k{$_})."${xmlrs}$_robot_l{$_}${xmlrs}".int($_robot_r{$_})."${xmlre}\n"; + } + foreach (keys %_robot_h) { + if ($keysinkeylist{$_}) { next; } + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_robot_h{$_})."${xmlrs}".int($_robot_k{$_})."${xmlrs}$_robot_l{$_}${xmlrs}".int($_robot_r{$_})."${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_ROBOT${xmlee}\n"; + } + if ($sectiontosave eq 'worms') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'WormsShown'}\n"; } + print HISTORYTMP "# Worm ID - Hits - Bandwidth - Last visit\n"; + print HISTORYTMP "# The $MaxNbOf{'WormsShown'} first Hits must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_WORMS${xmlbs}".(scalar keys %_worm_h)."${xmlbe}\n"; + # We save worm list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'WormsShown'},$MinHit{'Worm'},\%_worm_h,\%_worm_h); + my %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_worm_h{$_})."${xmlrs}".int($_worm_k{$_})."${xmlrs}$_worm_l{$_}${xmlre}\n"; + } + foreach (keys %_worm_h) { + if ($keysinkeylist{$_}) { next; } + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_worm_h{$_})."${xmlrs}".int($_worm_k{$_})."${xmlrs}$_worm_l{$_}${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_WORMS${xmlee}\n"; + } + if ($sectiontosave eq 'emailsender') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'EMailsShown'}\n"; } + print HISTORYTMP "# EMail - Hits - Bandwidth - Last visit\n"; + print HISTORYTMP "# The $MaxNbOf{'EMailsShown'} first Hits must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_EMAILSENDER${xmlbs}".(scalar keys %_emails_h)."${xmlbe}\n"; + # We save sender email list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emails_h,\%_emails_h); + my %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_emails_h{$_}||0)."${xmlrs}".int($_emails_k{$_}||0)."${xmlrs}$_emails_l{$_}${xmlre}\n"; + } + foreach (keys %_emails_h) { + if ($keysinkeylist{$_}) { next; } + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_emails_h{$_}||0)."${xmlrs}".int($_emails_k{$_}||0)."${xmlrs}$_emails_l{$_}${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_EMAILSENDER${xmlee}\n"; + } + if ($sectiontosave eq 'emailreceiver') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'EMailsShown'}\n"; } + print HISTORYTMP "# EMail - Hits - Bandwidth - Last visit\n"; + print HISTORYTMP "# The $MaxNbOf{'EMailsShown'} first hits must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_EMAILRECEIVER${xmlbs}".(scalar keys %_emailr_h)."${xmlbe}\n"; + # We save receiver email list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emailr_h,\%_emailr_h); + my %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_emailr_h{$_}||0)."${xmlrs}".int($_emailr_k{$_}||0)."${xmlrs}$_emailr_l{$_}${xmlre}\n"; + } + foreach (keys %_emailr_h) { + if ($keysinkeylist{$_}) { next; } + print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_emailr_h{$_}||0)."${xmlrs}".int($_emailr_k{$_}||0)."${xmlrs}$_emailr_l{$_}${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_EMAILRECEIVER${xmlee}\n"; + } + + # Navigation + if ($sectiontosave eq 'session') { # This section must be saved after VISITOR section is read + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Session range - Number of visits\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_SESSION${xmlbs}".(scalar keys %_session)."${xmlbe}\n"; + foreach (keys %_session) { print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_session{$_})."${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_SESSION${xmlee}\n"; + } + if ($sectiontosave eq 'sider') { # This section must be saved after VISITOR section is read + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'PageShown'}\n"; } + print HISTORYTMP "# URL - Pages - Bandwidth - Entry - Exit\n"; + print HISTORYTMP "# The $MaxNbOf{'PageShown'} first Pages must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_SIDER${xmlbs}".(scalar keys %_url_p)."${xmlbe}\n"; + # We save page list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'PageShown'},$MinHit{'File'},\%_url_p,\%_url_p); + %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + my $newkey=$_; + $newkey =~ s/([^:])\/\//$1\//g; # Because some targeted url were taped with 2 / (Ex: //rep//file.htm). We must keep http://rep/file.htm + print HISTORYTMP "${xmlrb}$newkey${xmlrs}".int($_url_p{$_}||0)."${xmlrs}".int($_url_k{$_}||0)."${xmlrs}".int($_url_e{$_}||0)."${xmlrs}".int($_url_x{$_}||0)."${xmlre}\n"; + } + foreach (keys %_url_p) { + if ($keysinkeylist{$_}) { next; } + my $newkey=$_; + $newkey =~ s/([^:])\/\//$1\//g; # Because some targeted url were taped with 2 / (Ex: //rep//file.htm). We must keep http://rep/file.htm + print HISTORYTMP "${xmlrb}$newkey ".int($_url_p{$_}||0)."${xmlrs}".int($_url_k{$_}||0)."${xmlrs}".int($_url_e{$_}||0)."${xmlrs}".int($_url_x{$_}||0)."${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_SIDER${xmlee}\n"; + } + if ($sectiontosave eq 'filetypes') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Files type - Hits - Bandwidth - Bandwidth without compression - Bandwidth after compression\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_FILETYPES${xmlbs}".(scalar keys %_filetypes_h)."${xmlbe}\n"; + foreach (keys %_filetypes_h) { + my $hits=$_filetypes_h{$_}||0; + my $bytes=$_filetypes_k{$_}||0; + my $bytesbefore=$_filetypes_gz_in{$_}||0; + my $bytesafter=$_filetypes_gz_out{$_}||0; + print HISTORYTMP "${xmlrb}$_${xmlrs}$hits${xmlrs}$bytes${xmlrs}$bytesbefore${xmlrs}$bytesafter${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_FILETYPES${xmlee}\n"; + } + if ($sectiontosave eq 'os') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# OS ID - Hits\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_OS${xmlbs}".(scalar keys %_os_h)."${xmlbe}\n"; + foreach (keys %_os_h) { print HISTORYTMP "${xmlrb}$_${xmlrs}$_os_h{$_}${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_OS${xmlee}\n"; + } + if ($sectiontosave eq 'browser') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Browser ID - Hits\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_BROWSER${xmlbs}".(scalar keys %_browser_h)."${xmlbe}\n"; + foreach (keys %_browser_h) { print HISTORYTMP "${xmlrb}$_${xmlrs}$_browser_h{$_}${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_BROWSER${xmlee}\n"; + } + if ($sectiontosave eq 'screensize') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Screen size - Hits\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_SCREENSIZE${xmlbs}".(scalar keys %_screensize_h)."${xmlbe}\n"; + foreach (keys %_screensize_h) { print HISTORYTMP "${xmlrb}$_${xmlrs}$_screensize_h{$_}${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_SCREENSIZE${xmlee}\n"; + } + + # Referer + if ($sectiontosave eq 'unknownreferer') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Unknown referer OS - Last visit date\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_UNKNOWNREFERER${xmlbs}".(scalar keys %_unknownreferer_l)."${xmlbe}\n"; + foreach (keys %_unknownreferer_l) { print HISTORYTMP "${xmlrb}$_${xmlrs}$_unknownreferer_l{$_}${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_UNKNOWNREFERER${xmlee}\n"; + } + if ($sectiontosave eq 'unknownrefererbrowser') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Unknown referer Browser - Last visit date\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_UNKNOWNREFERERBROWSER${xmlbs}".(scalar keys %_unknownrefererbrowser_l)."${xmlbe}\n"; + foreach (keys %_unknownrefererbrowser_l) { print HISTORYTMP "${xmlrb}$_${xmlrs}$_unknownrefererbrowser_l{$_}${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_UNKNOWNREFERERBROWSER${xmlee}\n"; + } + if ($sectiontosave eq 'origin') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Origin - Pages - Hits \n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_ORIGIN${xmlbs}6"."${xmlbe}\n"; + print HISTORYTMP "${xmlrb}From0${xmlrs}".int($_from_p[0])."${xmlrs}".int($_from_h[0])."${xmlre}\n"; + print HISTORYTMP "${xmlrb}From1${xmlrs}".int($_from_p[1])."${xmlrs}".int($_from_h[1])."${xmlre}\n"; + print HISTORYTMP "${xmlrb}From2${xmlrs}".int($_from_p[2])."${xmlrs}".int($_from_h[2])."${xmlre}\n"; + print HISTORYTMP "${xmlrb}From3${xmlrs}".int($_from_p[3])."${xmlrs}".int($_from_h[3])."${xmlre}\n"; + print HISTORYTMP "${xmlrb}From4${xmlrs}".int($_from_p[4])."${xmlrs}".int($_from_h[4])."${xmlre}\n"; # Same site + print HISTORYTMP "${xmlrb}From5${xmlrs}".int($_from_p[5])."${xmlrs}".int($_from_h[5])."${xmlre}\n"; # News + print HISTORYTMP "${xmleb}END_ORIGIN${xmlee}\n"; + } + if ($sectiontosave eq 'sereferrals') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Search engine referers ID - Pages - Hits\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_SEREFERRALS${xmlbs}".(scalar keys %_se_referrals_h)."${xmlbe}\n"; + foreach (keys %_se_referrals_h) { print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_se_referrals_p{$_}||0)."${xmlrs}$_se_referrals_h{$_}${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_SEREFERRALS${xmlee}\n"; + } + if ($sectiontosave eq 'pagerefs') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'RefererShown'}\n"; } + print HISTORYTMP "# External page referers - Pages - Hits\n"; + print HISTORYTMP "# The $MaxNbOf{'RefererShown'} first Pages must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_PAGEREFS${xmlbs}".(scalar keys %_pagesrefs_h)."${xmlbe}\n"; + # We save page list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'RefererShown'},$MinHit{'Refer'},\%_pagesrefs_h,\%_pagesrefs_p); + %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + my $newkey=$_; + $newkey =~ s/^http(s|):\/\/([^\/]+)\/$/http$1:\/\/$2/i; # Remove / at end of http://.../ but not at end of http://.../dir/ + print HISTORYTMP "${xmlrb}".XMLEncodeForHisto($newkey)."${xmlrs}".int($_pagesrefs_p{$_}||0)."${xmlrs}$_pagesrefs_h{$_}${xmlre}\n"; + } + foreach (keys %_pagesrefs_h) { + if ($keysinkeylist{$_}) { next; } + my $newkey=$_; + $newkey =~ s/^http(s|):\/\/([^\/]+)\/$/http$1:\/\/$2/i; # Remove / at end of http://.../ but not at end of http://.../dir/ + print HISTORYTMP "${xmlrb}".XMLEncodeForHisto($newkey)."${xmlrs}".int($_pagesrefs_p{$_}||0)."${xmlrs}$_pagesrefs_h{$_}${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_PAGEREFS${xmlee}\n"; + } + if ($sectiontosave eq 'searchwords') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'KeyphrasesShown'}\n"; } + print HISTORYTMP "# Search keyphrases - Number of search\n"; + print HISTORYTMP "# The $MaxNbOf{'KeyphrasesShown'} first number of search must be first (order not required for others)\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_SEARCHWORDS${xmlbs}".(scalar keys %_keyphrases)."${xmlbe}\n"; + # We will also build _keywords + %_keywords=(); + # We save key list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'},\%_keyphrases,\%_keyphrases); + %keysinkeylist=(); + foreach my $key (@keylist) { + $keysinkeylist{$key}=1; + my $keyphrase=$key; + print HISTORYTMP "${xmlrb}$keyphrase${xmlrs}$_keyphrases{$key}${xmlre}\n"; + foreach (split(/\+/,$key)) { $_keywords{$_}+=$_keyphrases{$key}; } # To init %_keywords + } + foreach my $key (keys %_keyphrases) { + if ($keysinkeylist{$key}) { next; } + my $keyphrase=$key; + print HISTORYTMP "${xmlrb}$keyphrase${xmlrs}$_keyphrases{$key}${xmlre}\n"; + foreach (split(/\+/,$key)) { $_keywords{$_}+=$_keyphrases{$key}; } # To init %_keywords + } + print HISTORYTMP "${xmleb}END_SEARCHWORDS${xmlee}\n"; + + # Now save keywords section + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOf{'KeywordsShown'}\n"; } + print HISTORYTMP "# Search keywords - Number of search\n"; + print HISTORYTMP "# The $MaxNbOf{'KeywordsShown'} first number of search must be first (order not required for others)\n"; + $ValueInFile{"keywords"}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_KEYWORDS${xmlbs}".(scalar keys %_keywords)."${xmlbe}\n"; + # We save key list in score sorted order to get a -output faster and with less use of memory. + &BuildKeyList($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'},\%_keywords,\%_keywords); + %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + my $keyword=$_; + print HISTORYTMP "${xmlrb}$keyword${xmlrs}$_keywords{$_}${xmlre}\n"; + } + foreach (keys %_keywords) { + if ($keysinkeylist{$_}) { next; } + my $keyword=$_; + print HISTORYTMP "${xmlrb}$keyword${xmlrs}$_keywords{$_}${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_KEYWORDS${xmlee}\n"; + + } + + # Other - Errors + if ($sectiontosave eq 'cluster') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Cluster ID - Pages - Hits - Bandwidth\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_CLUSTER${xmlbs}".(scalar keys %_cluster_h)."${xmlbe}\n"; + foreach (keys %_cluster_h) { print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_cluster_p{$_}||0)."${xmlrs}".int($_cluster_h{$_}||0)."${xmlrs}".int($_cluster_k{$_}||0)."${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_CLUSTER${xmlee}\n"; + } + if ($sectiontosave eq 'misc') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Misc ID - Pages - Hits - Bandwidth\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_MISC${xmlbs}".(scalar keys %MiscListCalc)."${xmlbe}\n"; + foreach (keys %MiscListCalc) { print HISTORYTMP "${xmlrb}$_${xmlrs}".int($_misc_p{$_}||0)."${xmlrs}".int($_misc_h{$_}||0)."${xmlrs}".int($_misc_k{$_}||0)."${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_MISC${xmlee}\n"; + } + if ($sectiontosave eq 'errors') { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# Errors - Hits - Bandwidth\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_ERRORS${xmlbs}".(scalar keys %_errors_h)."${xmlbe}\n"; + foreach (keys %_errors_h) { print HISTORYTMP "${xmlrb}$_${xmlrs}$_errors_h{$_}${xmlrs}".int($_errors_k{$_}||0)."${xmlre}\n"; } + print HISTORYTMP "${xmleb}END_ERRORS${xmlee}\n"; + } + # Other - Trapped errors + foreach my $code (keys %TrapInfosForHTTPErrorCodes) { + if ($sectiontosave eq "sider_$code") { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    \n"; } + print HISTORYTMP "# URL with $code errors - Hits - Last URL referer\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_SIDER_$code${xmlbs}".(scalar keys %_sider404_h)."${xmlbe}\n"; + foreach (keys %_sider404_h) { + my $newkey=$_; + my $newreferer=$_referer404_h{$_}||''; + print HISTORYTMP "${xmlrb}".XMLEncodeForHisto($newkey)."${xmlrs}$_sider404_h{$_}${xmlrs}".XMLEncodeForHisto($newreferer)."${xmlre}\n"; + } + print HISTORYTMP "${xmleb}END_SIDER_$code${xmlee}\n"; + } + } + # Other - Extra stats sections + foreach my $extranum (1..@ExtraName-1) { + if ($sectiontosave eq "extra_$extranum") { + print HISTORYTMP "\n"; + if ($xml) { print HISTORYTMP "
    $MaxNbOfExtra[$extranum]\n"; } + print HISTORYTMP "# Extra key - Pages - Hits - Bandwidth - Last access\n"; + print HISTORYTMP "# The $MaxNbOfExtra[$extranum] first number of hits are first\n"; + $ValueInFile{$sectiontosave}=tell HISTORYTMP; + print HISTORYTMP "${xmlbb}BEGIN_EXTRA_$extranum${xmlbs}".scalar (keys %{'_section_' . $extranum . '_h'})."${xmlbe}\n"; + &BuildKeyList($MaxNbOfExtra[$extranum],$MinHitExtra[$extranum],\%{'_section_' . $extranum . '_h'},\%{'_section_' . $extranum . '_p'}); + %keysinkeylist=(); + foreach (@keylist) { + $keysinkeylist{$_}=1; + my $page=${'_section_' . $extranum . '_p'}{$_}||0; + my $bytes=${'_section_' . $extranum . '_k'}{$_}||0; + my $lastaccess=${'_section_' . $extranum . '_l'}{$_}||''; + print HISTORYTMP "${xmlrb}$_${xmlrs}$page${xmlrs}", ${'_section_' . $extranum . '_h'}{$_}, "${xmlrs}$bytes${xmlrs}$lastaccess${xmlre}\n"; next; + } + foreach (keys %{'_section_' . $extranum . '_h'}) { + if ($keysinkeylist{$_}) { next; } + my $page=${'_section_' . $extranum . '_p'}{$_}||0; + my $bytes=${'_section_' . $extranum . '_k'}{$_}||0; + my $lastaccess=${'_section_' . $extranum . '_l'}{$_}||''; + print HISTORYTMP "${xmlrb}$_${xmlrs}$page${xmlrs}", ${'_section_' . $extranum . '_h'}{$_}, "${xmlrs}$bytes${xmlrs}$lastaccess${xmlre}\n"; next; + } + print HISTORYTMP "${xmleb}END_EXTRA_$extranum${xmlee}\n"; + } + } + + # Other - Plugin sections + if ($AtLeastOneSectionPlugin && $sectiontosave =~ /^plugin_(\w+)$/i) { + my $pluginname=$1; + if ($PluginsLoaded{'SectionInitHashArray'}{"$pluginname"}) { + my $function="SectionWriteHistory_$pluginname(\$xml,\$xmlbb,\$xmlbs,\$xmlbe,\$xmlrb,\$xmlrs,\$xmlre,\$xmleb,\$xmlee)"; + eval("$function"); + last; + } + } + + %keysinkeylist=(); +} + +#-------------------------------------------------------------------- +# Function: Rename all tmp history file into history +# Parameters: None +# Input: $DirData $PROG $FileSuffix +# $KeepBackupOfHistoricFile $SaveDatabaseFilesWithPermissionsForEveryone +# Output: None +# Return: 1 Ok, 0 at least one error (tmp files are removed) +#-------------------------------------------------------------------- +sub Rename_All_Tmp_History { + my $pid=$$; + my $renameok=1; + + if ($Debug) { debug("Call to Rename_All_Tmp_History (FileSuffix=$FileSuffix)"); } + + opendir(DIR,"$DirData"); + my $regfilesuffix=quotemeta($FileSuffix); + foreach (grep /^$PROG(\d\d\d\d\d\d)$regfilesuffix\.tmp\.$pid$/, sort readdir DIR) { + /^$PROG(\d\d\d\d\d\d)$regfilesuffix\.tmp\.$pid$/; + if ($renameok) { # No rename error yet + if ($Debug) { debug(" Rename new tmp history file $PROG$1$FileSuffix.tmp.$$ into $PROG$1$FileSuffix.txt",1); } + if (-s "$DirData/$PROG$1$FileSuffix.tmp.$$") { # Rename tmp files if size > 0 + if ($KeepBackupOfHistoricFiles) { + if (-s "$DirData/$PROG$1$FileSuffix.txt") { # History file already exists. We backup it + if ($Debug) { debug(" Make a backup of old history file into $PROG$1$FileSuffix.bak before",1); } + #if (FileCopy("$DirData/$PROG$1$FileSuffix.txt","$DirData/$PROG$1$FileSuffix.bak")) { + if (rename("$DirData/$PROG$1$FileSuffix.txt", "$DirData/$PROG$1$FileSuffix.bak")==0) { + warning("Warning: Failed to make a backup of \"$DirData/$PROG$1$FileSuffix.txt\" into \"$DirData/$PROG$1$FileSuffix.bak\"."); + } + if ($SaveDatabaseFilesWithPermissionsForEveryone) { + chmod 0666,"$DirData/$PROG$1$FileSuffix.bak"; + } + } + else { + if ($Debug) { debug(" No need to backup old history file",1); } + } + } + if (rename("$DirData/$PROG$1$FileSuffix.tmp.$$", "$DirData/$PROG$1$FileSuffix.txt")==0) { + $renameok=0; # At least one error in renaming working files + # Remove tmp file + unlink "$DirData/$PROG$1$FileSuffix.tmp.$$"; + warning("Warning: Failed to rename \"$DirData/$PROG$1$FileSuffix.tmp.$$\" into \"$DirData/$PROG$1$FileSuffix.txt\".\nWrite permissions on \"$PROG$1$FileSuffix.txt\" might be wrong".($ENV{'GATEWAY_INTERFACE'}?" for an 'update from web'":"")." or file might be opened."); + next; + } + if ($SaveDatabaseFilesWithPermissionsForEveryone) { + chmod 0666,"$DirData/$PROG$1$FileSuffix.txt"; + } + } + } + else { # Because of rename error, we remove all remaining tmp files + unlink "$DirData/$PROG$1$FileSuffix.tmp.$$"; + } + } + close DIR; + return $renameok; +} + +#------------------------------------------------------------------------------ +# Function: Load DNS cache file entries into a memory hash array +# Parameters: Hash array ref to load into, +# File name to load, +# File suffix to use +# Save to a second plugin file if not up to date +# Input: None +# Output: Hash array is loaded +# Return: 1 No DNS Cache file found, 0 OK +#------------------------------------------------------------------------------ +sub Read_DNS_Cache { + my $hashtoload=shift; + my $dnscachefile=shift; + my $filesuffix=shift; + my $savetohash=shift; + + my $dnscacheext=''; + my $filetoload=''; + my $timetoload = time(); + + if ($Debug) { debug("Call to Read_DNS_Cache [file=\"$dnscachefile\"]"); } + if ($dnscachefile =~ s/(\.\w+)$//) { $dnscacheext=$1; } + foreach my $dir ("$DirData",".","") { + my $searchdir=$dir; + if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } + if (-f "${searchdir}$dnscachefile$filesuffix$dnscacheext") { $filetoload="${searchdir}$dnscachefile$filesuffix$dnscacheext"; } + # Plugin call : Change filetoload + if ($PluginsLoaded{'SearchFile'}{'hashfiles'}) { SearchFile_hashfiles($searchdir,$dnscachefile,$filesuffix,$dnscacheext,$filetoload); } + if ($filetoload) { last; } # We found a file to load + } + + if (! $filetoload) { + if ($Debug) { debug(" No DNS Cache file found"); } + return 1; + } + + # Plugin call : Load hashtoload + if ($PluginsLoaded{'LoadCache'}{'hashfiles'}) { LoadCache_hashfiles($filetoload,$hashtoload); } + if (! scalar keys %$hashtoload) { + open(DNSFILE,"$filetoload") or error("Couldn't open DNS Cache file \"$filetoload\": $!"); + #binmode DNSFILE; # If we set binmode here, it seems that the load is broken on ActiveState 5.8 + # This is a fast way to load with regexp + %$hashtoload = map(/^(?:\d{0,10}\s+)?([0-9A-F:\.]+)\s+([^\s]+)$/oi,); + close DNSFILE; + if ($savetohash) { + # Plugin call : Save hash file (all records) with test if up to date to save + if ($PluginsLoaded{'SaveHash'}{'hashfiles'}) { SaveHash_hashfiles($filetoload,$hashtoload,1,0); } + } + } + if ($Debug) { debug(" Loaded ".(scalar keys %$hashtoload)." items from $filetoload in ".(time()-$timetoload)." seconds.",1); } + return 0; +} + +#------------------------------------------------------------------------------ +# Function: Save a memory hash array into a DNS cache file +# Parameters: Hash array ref to save, +# File name to save, +# File suffix to use +# Input: None +# Output: None +# Return: 0 OK, 1 Error +#------------------------------------------------------------------------------ +sub Save_DNS_Cache_File { + my $hashtosave=shift; + my $dnscachefile=shift; + my $filesuffix=shift; + + my $dnscacheext=''; + my $filetosave=''; + my $timetosave = time(); + my $nbofelemtosave=$NBOFLASTUPDATELOOKUPTOSAVE; + my $nbofelemsaved=0; + + if ($Debug) { debug("Call to Save_DNS_Cache_File [file=\"$dnscachefile\"]"); } + if (! scalar keys %$hashtosave) { + if ($Debug) { debug(" No data to save"); } + return 0; + } + if ($dnscachefile =~ s/(\.\w+)$//) { $dnscacheext=$1; } + $filetosave="$dnscachefile$filesuffix$dnscacheext"; + # Plugin call : Save hash file (only $NBOFLASTUPDATELOOKUPTOSAVE records) with no test if up to date + if ($PluginsLoaded{'SaveHash'}{'hashfiles'}) { SaveHash_hashfiles($filetosave,$hashtosave,0,$nbofelemtosave,$nbofelemsaved); } + if (! $nbofelemsaved) { + $filetosave="$dnscachefile$filesuffix$dnscacheext"; + if ($Debug) { debug(" Save data ".($nbofelemtosave?"($nbofelemtosave records max)":"(all records)")." into file $filetosave"); } + if (! open(DNSFILE,">$filetosave")) { + warning("Warning: Failed to open for writing last update DNS Cache file \"$filetosave\": $!"); + return 1; + } + binmode DNSFILE; + my $starttimemin=int($starttime/60); + foreach my $key (keys %$hashtosave) { + #if ($hashtosave->{$key} ne '*') { + my $ipsolved=$hashtosave->{$key}; + print DNSFILE "$starttimemin\t$key\t".($ipsolved eq 'ip'?'*':$ipsolved)."\n"; # Change 'ip' to '*' for backward compatibility + if (++$nbofelemsaved >= $NBOFLASTUPDATELOOKUPTOSAVE) { last; } + #} + } + close DNSFILE; + + if ($SaveDatabaseFilesWithPermissionsForEveryone) { + chmod 0666,"$filetosave"; + } + + } + if ($Debug) { debug(" Saved $nbofelemsaved items into $filetosave in ".(time()-$timetosave)." seconds.",1); } + return 0; +} + +#------------------------------------------------------------------------------ +# Function: Return time elapsed since last call in miliseconds +# Parameters: 0|1 (0 reset counter, 1 no reset) +# Input: None +# Output: None +# Return: Number of miliseconds elapsed since last call +#------------------------------------------------------------------------------ +sub GetDelaySinceStart { + if (shift) { $StartSeconds=0; } # Reset chrono + my ($newseconds, $newmicroseconds)=(time(),0); + # Plugin call : Return seconds and milliseconds + if ($PluginsLoaded{'GetTime'}{'timehires'}) { GetTime_timehires($newseconds, $newmicroseconds); } + if (! $StartSeconds) { $StartSeconds=$newseconds; $StartMicroseconds=$newmicroseconds; } + return (($newseconds-$StartSeconds)*1000+int(($newmicroseconds-$StartMicroseconds)/1000)); +} + +#------------------------------------------------------------------------------ +# Function: Reset all variables whose name start with _ because a new month start +# Parameters: None +# Input: $YearRequired All variables whose name start with _ +# Output: All variables whose name start with _ +# Return: None +#------------------------------------------------------------------------------ +sub Init_HashArray { + if ($Debug) { debug("Call to Init_HashArray"); } + # Reset global hash arrays + %FirstTime = %LastTime = (); + %MonthHostsKnown = %MonthHostsUnknown = (); + %MonthVisits = %MonthUnique = (); + %MonthPages = %MonthHits = %MonthBytes = (); + %MonthNotViewedPages = %MonthNotViewedHits = %MonthNotViewedBytes = (); + %DayPages = %DayHits = %DayBytes = %DayVisits = (); + # Reset all arrays with name beginning by _ + for (my $ix=0; $ix<6; $ix++) { $_from_p[$ix]=0; $_from_h[$ix]=0; } + for (my $ix=0; $ix<24; $ix++) { $_time_h[$ix]=0; $_time_k[$ix]=0; $_time_p[$ix]=0; $_time_nv_h[$ix]=0; $_time_nv_k[$ix]=0; $_time_nv_p[$ix]=0; } + # Reset all hash arrays with name beginning by _ + %_session = %_browser_h = (); + %_domener_p = %_domener_h = %_domener_k = %_errors_h = %_errors_k = (); + %_filetypes_h = %_filetypes_k = %_filetypes_gz_in = %_filetypes_gz_out = (); + %_host_p = %_host_h = %_host_k = %_host_l = %_host_s = %_host_u = (); + %_waithost_e = %_waithost_l = %_waithost_s = %_waithost_u = (); + %_keyphrases = %_keywords = %_os_h = %_pagesrefs_p = %_pagesrefs_h = %_robot_h = %_robot_k = %_robot_l = %_robot_r = (); + %_worm_h = %_worm_k = %_worm_l = %_login_p = %_login_h = %_login_k = %_login_l = %_screensize_h = (); + %_misc_p = %_misc_h = %_misc_k = (); + %_cluster_p = %_cluster_h = %_cluster_k = (); + %_se_referrals_p = %_se_referrals_h = %_sider404_h = %_referer404_h = %_url_p = %_url_k = %_url_e = %_url_x = (); + %_unknownreferer_l = %_unknownrefererbrowser_l = (); + %_emails_h = %_emails_k = %_emails_l = %_emailr_h = %_emailr_k = %_emailr_l = (); + for (my $ix=1; $ix < @ExtraName; $ix++) { + %{'_section_' . $ix . '_h'} = %{'_section_' . $ix . '_o'} = %{'_section_' . $ix . '_k'} = + %{'_section_' . $ix . '_l'} = %{'_section_' . $ix . '_p'} = (); + } + foreach my $pluginname (keys %{$PluginsLoaded{'SectionInitHashArray'}}) { + my $function="SectionInitHashArray_$pluginname()"; + eval("$function"); + } +} + +#------------------------------------------------------------------------------ +# Function: Change word separators of a keyphrase string into space and +# remove bad coded chars +# Parameters: stringtodecode +# Input: None +# Output: None +# Return: decodedstring +#------------------------------------------------------------------------------ +sub ChangeWordSeparatorsIntoSpace { + $_[0] =~ s/%0[ad]/ /ig; # LF CR + $_[0] =~ s/%2[02789abc]/ /ig; # space " ' ( ) * + , + $_[0] =~ s/%3a/ /ig; # : + $_[0] =~ tr/\+\'\(\)\"\*,:/ /s; # "&" and "=" must not be in this list +} + +#------------------------------------------------------------------------------ +# Function: Transforms & into & as needed in XML/XHTML +# Parameters: stringtoencode +# Return: encodedstring +#------------------------------------------------------------------------------ +sub XMLEncode { + if ($BuildReportFormat ne 'xhtml' && $BuildReportFormat ne 'xml') { return shift; } + my $string = shift; + $string =~ s/&/&/g; + return $string; +} + +#------------------------------------------------------------------------------ +# Function: Transforms & into & as needed in XML/XHTML +# Parameters: stringtoencode +# Return: encodedstring +#------------------------------------------------------------------------------ +sub XMLEncodeForHisto { + my $string = shift; + $string =~ s/\s/%20/g; + if ($BuildHistoryFormat ne 'xml') { return $string; } + $string =~ s/&/&/g; + $string =~ s//>/g; + return $string; +} + +#------------------------------------------------------------------------------ +# Function: Encode a binary string into an ASCII string +# Parameters: stringtoencode +# Return: encodedstring +#------------------------------------------------------------------------------ +sub EncodeString { + my $string = shift; +# use bytes; + $string =~ s/([\x2B\x80-\xFF])/sprintf ("%%%2x", ord($1))/eg; +# no bytes; + $string =~ tr/ /+/s; + return $string; +} + +#------------------------------------------------------------------------------ +# Function: Decode an only text string into a binary string +# Parameters: stringtodecode +# Input: None +# Output: None +# Return: decodedstring +#------------------------------------------------------------------------------ +sub DecodeEncodedString { + my $stringtodecode=shift; + $stringtodecode =~ tr/\+/ /s; + $stringtodecode =~ s/%([A-F0-9][A-F0-9])/pack("C", hex($1))/ieg; + return $stringtodecode; +} + +#------------------------------------------------------------------------------ +# Function: Decode an precompiled regex value to a common regex value +# Parameters: compiledregextodecode +# Input: None +# Output: None +# Return: standardregex +#------------------------------------------------------------------------------ +sub UnCompileRegex { + shift =~ /\(\?[-\w]*:(.*)\)/; + return $1; +} + +#------------------------------------------------------------------------------ +# Function: Clean a string of HTML tags to avoid 'Cross Site Scripting attacks' +# Parameters: stringtodecode +# Input: None +# Output: None +# Return: decodedstring +#------------------------------------------------------------------------------ +sub CleanFromCSSA { + my $stringtoclean=shift; + $stringtoclean =~ s//>/g; + return $stringtoclean; +} + +#------------------------------------------------------------------------------ +# Function: Clean tags in a string +# Parameters: stringtodecode +# Input: None +# Output: None +# Return: decodedstring +#------------------------------------------------------------------------------ +sub CleanFromTags { + my $stringtoclean=shift; + $stringtoclean =~ s/$regclean1/ /g; # Replace or with space + $stringtoclean =~ s/$regclean2//g; # Remove + return $stringtoclean; +} + +#------------------------------------------------------------------------------ +# Function: Copy one file into another +# Parameters: sourcefilename targetfilename +# Input: None +# Output: None +# Return: 0 if copy is ok, 1 else +#------------------------------------------------------------------------------ +sub FileCopy { + my $filesource = shift; + my $filetarget = shift; + if ($Debug) { debug("FileCopy($filesource,$filetarget)",1); } + open(FILESOURCE,"$filesource") || return 1; + open(FILETARGET,">$filetarget") || return 1; + binmode FILESOURCE; + binmode FILETARGET; + # ... + close(FILETARGET); + close(FILESOURCE); + if ($Debug) { debug(" File copied",1); } + return 0; +} + +#------------------------------------------------------------------------------ +# Function: Show flags for other language translations +# Parameters: Current languade id (en, fr, ...) +# Input: None +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub Show_Flag_Links { + my $CurrentLang = shift; + + # Build flags link + my $NewLinkParams=$QueryString; + my $NewLinkTarget=''; + if ($ENV{'GATEWAY_INTERFACE'}) { + $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)framename=[^&]*//i; + $NewLinkParams =~ s/(^|&)lang=[^&]*//i; + if ($FrameName eq 'mainright') { $NewLinkTarget=" target=\"_parent\""; } + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } + } + else { + $NewLinkParams=($SiteConfig?"config=$SiteConfig&":"")."year=$YearRequired&month=$MonthRequired&"; + } + if ($FrameName eq 'mainright') { $NewLinkParams.='framename=index&'; } + + foreach my $lng (split(/\s+/,$ShowFlagLinks)) { + $lng=$LangBrowserToLangAwstats{$lng}?$LangBrowserToLangAwstats{$lng}:$lng; + if ($lng ne $CurrentLang) { + my %lngtitle=('en','English','fr','French','de','German','it','Italian','nl','Dutch','es','Spanish'); + my $lngtitle=($lngtitle{$lng}?$lngtitle{$lng}:$lng); + my $flag=($LangAWStatsToFlagAwstats{$lng}?$LangAWStatsToFlagAwstats{$lng}:$lng); + print " \n"; + } + } +} + +#------------------------------------------------------------------------------ +# Function: Format value in bytes in a string (Bytes, Kb, Mb, Gb) +# Parameters: bytes (integer value or "0.00") +# Input: None +# Output: None +# Return: "x.yz MB" or "x.yy KB" or "x Bytes" or "0" +#------------------------------------------------------------------------------ +sub Format_Bytes { + my $bytes = shift||0; + my $fudge = 1; + # Do not use exp/log function to calculate 1024power, function make segfault on some unix/perl versions + if ($bytes >= ($fudge << 30)) { return sprintf("%.2f", $bytes/1073741824)." $Message[110]"; } + if ($bytes >= ($fudge << 20)) { return sprintf("%.2f", $bytes/1048576)." $Message[109]"; } + if ($bytes >= ($fudge << 10)) { return sprintf("%.2f", $bytes/1024)." $Message[108]"; } + if ($bytes < 0) { $bytes="?"; } + return int($bytes).(int($bytes)?" $Message[119]":""); +} + +#------------------------------------------------------------------------------ +# Function: Return " alt=string title=string" +# Parameters: string +# Input: None +# Output: None +# Return: "alt=string title=string" +#------------------------------------------------------------------------------ +sub AltTitle { + my $string = shift||''; + return " alt='$string' title='$string'"; +# return " alt=\"$string\" title=\"$string\""; +# return ($BuildReportFormat?"":" alt=\"$string\"")." title=\"$string\""; +} + +#------------------------------------------------------------------------------ +# Function: Tell if an email is a local or external email +# Parameters: email +# Input: $SiteDomain(exact string) $HostAliases(quoted regex string) +# Output: None +# Return: -1, 0 or 1 +#------------------------------------------------------------------------------ +sub IsLocalEMail { + my $email=shift||'unknown'; + if ($email !~ /\@(.*)$/) { return 0; } + my $domain=$1; + if ($domain =~ /^$SiteDomain$/i) { return 1; } + foreach (@HostAliases) { if ($domain =~ /$_/) { return 1; } } + return -1; +} + +#------------------------------------------------------------------------------ +# Function: Format a date according to Message[78] (country date format) +# Parameters: String date YYYYMMDDHHMMSS +# Option 0=LastUpdate and LastTime date +# 1=Arrays date except daymonthvalues +# 2=daymonthvalues date (only year month and day) +# Input: $Message[78] +# Output: None +# Return: Date with format defined by Message[78] and option +#------------------------------------------------------------------------------ +sub Format_Date { + my $date=shift; + my $option=shift||0; + my $year=substr("$date",0,4); + my $month=substr("$date",4,2); + my $day=substr("$date",6,2); + my $hour=substr("$date",8,2); + my $min=substr("$date",10,2); + my $sec=substr("$date",12,2); + my $dateformat=$Message[78]; + if ($option == 2) { + $dateformat =~ s/^[^ymd]+//g; + $dateformat =~ s/[^ymd]+$//g; + } + $dateformat =~ s/yyyy/$year/g; + $dateformat =~ s/yy/$year/g; + $dateformat =~ s/mmm/$MonthNumLib{$month}/g; + $dateformat =~ s/mm/$month/g; + $dateformat =~ s/dd/$day/g; + $dateformat =~ s/HH/$hour/g; + $dateformat =~ s/MM/$min/g; + $dateformat =~ s/SS/$sec/g; + return "$dateformat"; +} + +#------------------------------------------------------------------------------ +# Function: Return 1 if string contains only ascii chars +# Parameters: string +# Input: None +# Output: None +# Return: 0 or 1 +#------------------------------------------------------------------------------ +sub IsAscii { + my $string=shift; + if ($Debug) { debug("IsAscii($string)",5); } + if ($string =~ /^[\w\+\-\/\\\.%,;:=\"\'&?!\s]+$/) { + if ($Debug) { debug(" Yes",6); } + return 1; # Only alphanum chars (and _) or + - / \ . % , ; : = " ' & ? space \t + } + if ($Debug) { debug(" No",6); } + return 0; +} + +#------------------------------------------------------------------------------ +# Function: Return the lower value between 2 but exclude value if 0 +# Parameters: Val1 and Val2 +# Input: None +# Output: None +# Return: min(Val1,Val2) +#------------------------------------------------------------------------------ +sub MinimumButNoZero { + my ($val1,$val2)=@_; + return ($val1&&($val1<$val2||!$val2)?$val1:$val2); +} + +#------------------------------------------------------------------------------ +# Function: Add a val from sorting tree +# Parameters: keytoadd keyval [firstadd] +# Input: None +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub AddInTree { + my $keytoadd=shift; + my $keyval=shift; + my $firstadd=shift||0; + if ($firstadd==1) { # Val is the first one + if ($Debug) { debug(" firstadd",4); } + $val{$keyval}=$keytoadd; + $lowerval=$keyval; + if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } + return; + } + if ($val{$keyval}) { # Val is already in tree + if ($Debug) { debug(" val is already in tree",4); } + $egal{$keytoadd}=$val{$keyval}; + $val{$keyval}=$keytoadd; + if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } + return; + } + if ($keyval <= $lowerval) { # Val is a new one lower (should happens only when tree is not full) + if ($Debug) { debug(" keytoadd val=$keyval is lower or equal to lowerval=$lowerval",4); } + $val{$keyval}=$keytoadd; + $nextval{$keyval}=$lowerval; + $lowerval=$keyval; + if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } + return; + } + # Val is a new one higher + if ($Debug) { debug(" keytoadd val=$keyval is higher than lowerval=$lowerval",4); } + $val{$keyval}=$keytoadd; + my $valcursor=$lowerval; # valcursor is value just before keyval + while ($nextval{$valcursor} && ($nextval{$valcursor} < $keyval)) { $valcursor=$nextval{$valcursor}; } + if ($nextval{$valcursor}) { # keyval is between valcursor and nextval{valcursor} + $nextval{$keyval}=$nextval{$valcursor}; + } + $nextval{$valcursor}=$keyval; + if ($Debug) { debug(" lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",4); } +} + +#------------------------------------------------------------------------------ +# Function: Remove a val from sorting tree +# Parameters: None +# Input: $lowerval %val %egal +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub Removelowerval { + my $keytoremove=$val{$lowerval}; # This is lower key + if ($Debug) { debug(" remove for lowerval=$lowerval: key=$keytoremove",4); } + if ($egal{$keytoremove}) { + $val{$lowerval}=$egal{$keytoremove}; + delete $egal{$keytoremove}; + } + else { + delete $val{$lowerval}; + $lowerval=$nextval{$lowerval}; # Set new lowerval + } + if ($Debug) { debug(" new lower value=$lowerval, val size=".(scalar keys %val).", egal size=".(scalar keys %egal),4); } +} + +#------------------------------------------------------------------------------ +# Function: Build @keylist array +# Parameters: Size max for @keylist array, +# Min value in hash for select, +# Hash used for select, +# Hash used for order +# Input: None +# Output: None +# Return: @keylist response array +#------------------------------------------------------------------------------ +sub BuildKeyList { + my $ArraySize=shift||error("System error. Call to BuildKeyList function with incorrect value for first param","","",1); + my $MinValue=shift||error("System error. Call to BuildKeyList function with incorrect value for second param","","",1); + my $hashforselect=shift; + my $hashfororder=shift; + if ($Debug) { debug(" BuildKeyList($ArraySize,$MinValue,$hashforselect with size=".(scalar keys %$hashforselect).",$hashfororder with size=".(scalar keys %$hashfororder).")",3); } + delete $hashforselect->{0};delete $hashforselect->{''}; # Those is to protect from infinite loop when hash array has an incorrect null key + my $count=0; + $lowerval=0; # Global because used in AddInTree and Removelowerval + %val=(); %nextval=(); %egal=(); + foreach my $key (keys %$hashforselect) { + if ($count < $ArraySize) { + if ($hashforselect->{$key} >= $MinValue) { + $count++; + if ($Debug) { debug(" Add in tree entry $count : $key (value=".($hashfororder->{$key}||0).", tree not full)",4); } + AddInTree($key,$hashfororder->{$key}||0,$count); + } + next; + } + $count++; + if (($hashfororder->{$key}||0)<=$lowerval) { next; } + if ($Debug) { debug(" Add in tree entry $count : $key (value=".($hashfororder->{$key}||0)." > lowerval=$lowerval)",4); } + AddInTree($key,$hashfororder->{$key}||0); + if ($Debug) { debug(" Removelower in tree",4); } + Removelowerval(); + } + + # Build key list and sort it + if ($Debug) { debug(" Build key list and sort it. lowerval=$lowerval, nb elem val=".(scalar keys %val).", nb elem egal=".(scalar keys %egal).".",3); } + my %notsortedkeylist=(); + foreach my $key (values %val) { $notsortedkeylist{$key}=1; } + foreach my $key (values %egal) { $notsortedkeylist{$key}=1; } + @keylist=(); + @keylist=(sort {($hashfororder->{$b}||0) <=> ($hashfororder->{$a}||0) } keys %notsortedkeylist); + if ($Debug) { debug(" BuildKeyList End (keylist size=".(@keylist).")",3); } + return; +} + +#------------------------------------------------------------------------------ +# Function: Lock or unlock update +# Parameters: status (1 to lock, 0 to unlock) +# Input: $DirLock (if status=0) $PROG $FileSuffix +# Output: $DirLock (if status=1) +# Return: None +#------------------------------------------------------------------------------ +sub Lock_Update { + my $status=shift; + my $lock="$PROG$FileSuffix.lock"; + if ($status) { + # We stop if there is at least one lock file wherever it is + foreach my $key ($ENV{"TEMP"},$ENV{"TMP"},"/tmp","/",".") { + my $newkey =$key; + $newkey =~ s/[\\\/]$//; + if (-f "$newkey/$lock") { error("An AWStats update process seems to be already running for this config file. Try later.\nIf this is not true, remove manually lock file '$newkey/$lock'.","","",1); } + } + # Set lock where we can + foreach my $key ($ENV{"TEMP"},$ENV{"TMP"},"/tmp","/",".") { + if (! -d "$key") { next; } + $DirLock=$key; + $DirLock =~ s/[\\\/]$//; + if ($Debug) { debug("Update lock file $DirLock/$lock is set"); } + open(LOCK,">$DirLock/$lock") || error("Failed to create lock file $DirLock/$lock","","",1); + print LOCK "AWStats update started by process $$ at $nowyear-$nowmonth-$nowday $nowhour:$nowmin:$nowsec\n"; + close(LOCK); + last; + } + } + else { + # Remove lock + if ($Debug) { debug("Update lock file $DirLock/$lock is removed"); } + unlink("$DirLock/$lock"); + } + return; +} + +#------------------------------------------------------------------------------ +# Function: Signal handler to call Lock_Update to remove lock file +# Parameters: Signal name +# Input: None +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub SigHandler { + my $signame = shift; + print ucfirst($PROG)." process (ID $$) interrupted by signal $signame.\n"; + &Lock_Update(0); + exit 1; +} + +#------------------------------------------------------------------------------ +# Function: Convert an IPAddress into an integer +# Parameters: IPAddress +# Input: None +# Output: None +# Return: Int +#------------------------------------------------------------------------------ +sub Convert_IP_To_Decimal { + my ($IPAddress) = @_; + my @ip_seg_arr = split(/\./,$IPAddress); + my $decimal_ip_address = 256 * 256 *256 * $ip_seg_arr[0] + 256 * 256 * $ip_seg_arr[1] + 256 * $ip_seg_arr[2] + $ip_seg_arr[3]; + return($decimal_ip_address); +} + +#------------------------------------------------------------------------------ +# Function: Test there is at least on value in list not null +# Parameters: List of values +# Input: None +# Output: None +# Return: 1 There is at least one not null value, 0 else +#------------------------------------------------------------------------------ +sub AtLeastOneNotNull { + if ($Debug) { debug(" Call to AtLeastOneNotNull (".join('-',@_).")",3); } + foreach my $val (@_) { if ($val) { return 1; } } + return 0; +} + +#------------------------------------------------------------------------------ +# Function: Return the string to add in html tag to include popup javascript code +# Parameters: tooltip number +# Input: None +# Output: None +# Return: string with javascript code +#------------------------------------------------------------------------------ +sub Tooltip { + my $ttnb=shift; + return ($TOOLTIPON?" onmouseover=\"ShowTip($ttnb);\" onmouseout=\"HideTip($ttnb);\"":""); +} + +#------------------------------------------------------------------------------ +# Function: Insert a form filter +# Parameters: Name of filter field, default for filter field, default for exclude filter field +# Input: $StaticLinks, $QueryString, $SiteConfig, $DirConfig +# Output: HTML Form +# Return: None +#------------------------------------------------------------------------------ +sub ShowFormFilter { + my $fieldfiltername=shift; + my $fieldfilterinvalue=shift; + my $fieldfilterexvalue=shift; + if (! $StaticLinks) { + my $NewLinkParams=${QueryString}; + $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)output(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } + print "\n
    \n"; + print "\n"; + print "\n"; + print "\n"; + print ""; + print "\n"; + print "\n"; + print "\n"; + print ""; + print "
    $Message[79] :   $Message[153] :"; + print "\n"; + if ($SiteConfig) { print "\n"; } + if ($DirConfig) { print "\n"; } + if (@OnlyUsers) { + print "\n"; } + if (@OnlyLines) { print "\n"; } + if ($SiteDomain) { print "\n"; } + if ($QueryString =~ /(^|&)year=(\d\d\d\d)/i) { print "\n"; } + if ($QueryString =~ /(^|&)month=(\d\d)/i || $QueryString =~ /(^|&)month=(all)/i) { print "\n"; } + if ($QueryString =~ /(^|&)lang=(\w+)/i) { print "\n"; } + if ($QueryString =~ /(^|&)debug=(\d+)/i) { print "\n"; } + if ($QueryString =~ /(^|&)framename=(\w+)/i) { print "\n"; } + print "  
    \n"; + print "
    \n"; + print "
    \n"; + print "\n"; + } +} + +#------------------------------------------------------------------------------ +# Function: Write other user info (with help of plugin) +# Parameters: $user +# Input: $SiteConfig +# Output: URL link +# Return: None +#------------------------------------------------------------------------------ +sub ShowUserInfo { + my $user=shift; + # Call to plugins' function ShowInfoUser + foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoUser'}}) { + my $function="ShowInfoUser_$pluginname('$user')"; + eval("$function"); + } +} + +#------------------------------------------------------------------------------ +# Function: Write other cluster info (with help of plugin) +# Parameters: $clusternb +# Input: $SiteConfig +# Output: Cluster info +# Return: None +#------------------------------------------------------------------------------ +sub ShowClusterInfo { + my $user=shift; + # Call to plugins' function ShowInfoCluster + foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoCluster'}}) { + my $function="ShowInfoCluster_$pluginname('$user')"; + eval("$function"); + } +} + +#------------------------------------------------------------------------------ +# Function: Write other host info (with help of plugin) +# Parameters: $host +# Input: $LinksToWhoIs $LinksToWhoIsIp +# Output: None +# Return: None +#------------------------------------------------------------------------------ +sub ShowHostInfo { + my $host=shift; + # Call to plugins' function ShowInfoHost + foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoHost'}}) { + my $function="ShowInfoHost_$pluginname('$host')"; + eval("$function"); + } +} + +#------------------------------------------------------------------------------ +# Function: Write other url info (with help of plugin) +# Parameters: $url +# Input: %Aliases $MaxLengthOfShownURL $ShowLinksOnUrl $SiteDomain $UseHTTPSLinkForUrl +# Output: URL link +# Return: None +#------------------------------------------------------------------------------ +sub ShowURLInfo { + my $url=shift; + my $nompage=CleanFromCSSA($url); + + # Call to plugins' function ShowInfoURL + foreach my $pluginname (keys %{$PluginsLoaded{'ShowInfoURL'}}) { + my $function="ShowInfoURL_$pluginname('$url')"; + eval("$function"); + } + + if (length($nompage)>$MaxLengthOfShownURL) { $nompage=substr($nompage,0,$MaxLengthOfShownURL)."..."; } + if ($ShowLinksOnUrl) { + my $newkey=CleanFromCSSA($url); + if ($LogType eq 'W' || $LogType eq 'S') { # Web or streaming log file + if ($newkey =~ /^http(s|):/i) { # URL seems to be extracted from a proxy log file + print "".XMLEncode($nompage).""; + } + elsif ($newkey =~ /^\//) { # URL seems to be an url extracted from a web or wap server log file + $newkey =~ s/^\/$SiteDomain//i; + # Define urlprot + my $urlprot='http'; + if ($UseHTTPSLinkForUrl && $newkey =~ /^$UseHTTPSLinkForUrl/) { $urlprot='https'; } + print "".XMLEncode($nompage).""; + } + else { + print XMLEncode($nompage); + } + } + elsif ($LogType eq 'F') { # Ftp log file + print XMLEncode($nompage); + } + elsif ($LogType eq 'M') { # Smtp log file + print XMLEncode($nompage); + } + else { # Other type log file + print XMLEncode($nompage); + } + } + else { + print XMLEncode($nompage); + } +} + +#------------------------------------------------------------------------------ +# Function: Define value for PerlParsingFormat (used for regex log record parsing) +# Parameters: - +# Input: $LogFormat +# Output: @fieldlib +# Return: - +#------------------------------------------------------------------------------ +sub DefinePerlParsingFormat { + # Log records examples: + # Apache combined: 62.161.78.73 user - [dd/mmm/yyyy:hh:mm:ss +0000] "GET / HTTP/1.1" 200 1234 "http://www.from.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" + # Apache combined (408 error): my.domain.com - user [09/Jan/2001:11:38:51 -0600] "OPTIONS /mime-tmp/xxx file.doc HTTP/1.1" 408 - "-" "-" + # Apache combined (408 error): 62.161.78.73 user - [dd/mmm/yyyy:hh:mm:ss +0000] "-" 408 - "-" "-" + # Apache common_with_mod_gzip_info1: %h %l %u %t \"%r\" %>s %b mod_gzip: %{mod_gzip_compression_ratio}npct. + # Apache common_with_mod_gzip_info2: %h %l %u %t \"%r\" %>s %b mod_gzip: %{mod_gzip_result}n In:%{mod_gzip_input_size}n Out:%{mod_gzip_output_size}n:%{mod_gzip_compression_ratio}npct. + # Apache deflate: %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" (%{ratio}n) + # IIS: 2000-07-19 14:14:14 62.161.78.73 - GET / 200 1234 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+NT+5.0) http://www.from.com/from.htm + # WebStar: 05/21/00 00:17:31 OK 200 212.242.30.6 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) http://www.cover.dk/ "www.cover.dk" :Documentation:graphics:starninelogo.white.gif 1133 + # Squid extended: 12.229.91.170 - - [27/Jun/2002:03:30:50 -0700] "GET http://www.callistocms.com/images/printable.gif HTTP/1.1" 304 354 "-" "Mozilla/5.0 Galeon/1.0.3 (X11; Linux i686; U;) Gecko/0" TCP_REFRESH_HIT:DIRECT + if ($Debug) { debug("Call To DefinePerlParsingFormat (LogType='$LogType', LogFormat='$LogFormat')"); } + @fieldlib=(); + if ($LogFormat =~ /^[1-6]$/) { # Pre-defined log format + if ($LogFormat eq '1' || $LogFormat eq '6') { # Same than "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"". + # %u (user) is "([^\\[]+)" instead of "[^ ]+" because can contain space (Lotus Notes). referer and ua might be "". +# $PerlParsingFormat="([^ ]+) [^ ]+ ([^\\[]+) \\[([^ ]+) [^ ]+\\] \\\"([^ ]+) (.+) [^\\\"]+\\\" ([\\d|-]+) ([\\d|-]+) \\\"(.*?)\\\" \\\"([^\\\"]*)\\\""; + $PerlParsingFormat="([^ ]+) [^ ]+ ([^\\[]+) \\[([^ ]+) [^ ]+\\] \\\"([^ ]+) ([^ ]+) [^\\\"]+\\\" ([\\d|-]+) ([\\d|-]+) \\\"(.*?)\\\" \\\"([^\\\"]*)\\\""; + $pos_host=0;$pos_logname=1;$pos_date=2;$pos_method=3;$pos_url=4;$pos_code=5;$pos_size=6;$pos_referer=7;$pos_agent=8; + @fieldlib=('host','logname','date','method','url','code','size','referer','ua'); + } + elsif ($LogFormat eq '2') { # Same than "date time c-ip cs-username cs-method cs-uri-stem sc-status sc-bytes cs-version cs(User-Agent) cs(Referer)" + $PerlParsingFormat="(\\S+ \\S+) (\\S+) (\\S+) (\\S+) (\\S+) ([\\d|-]+) ([\\d|-]+) \\S+ (\\S+) (\\S+)"; + $pos_date=0;$pos_host=1;$pos_logname=2;$pos_method=3;$pos_url=4;$pos_code=5;$pos_size=6;$pos_agent=7;$pos_referer=8; + @fieldlib=('date','host','logname','method','url','code','size','ua','referer'); + } + elsif ($LogFormat eq '3') { + $PerlParsingFormat="([^\\t]*\\t[^\\t]*)\\t([^\\t]*)\\t([\\d|-]*)\\t([^\\t]*)\\t([^\\t]*)\\t([^\\t]*)\\t[^\\t]*\\t([^\\t]*)\\t([\\d]*)"; + $pos_date=0;$pos_method=1;$pos_code=2;$pos_host=3;$pos_agent=4;$pos_referer=5;$pos_url=6;$pos_size=7; + @fieldlib=('date','method','code','host','ua','referer','url','size'); + } + elsif ($LogFormat eq '4') { # Same than "%h %l %u %t \"%r\" %>s %b" + # %u (user) is "(.+)" instead of "[^ ]+" because can contain space (Lotus Notes). + $PerlParsingFormat="([^ ]+) [^ ]+ (.+) \\[([^ ]+) [^ ]+\\] \\\"([^ ]+) ([^ ]+) [^\\\"]+\\\" ([\\d|-]+) ([\\d|-]+)"; + $pos_host=0;$pos_logname=1;$pos_date=2;$pos_method=3;$pos_url=4;$pos_code=5;$pos_size=6; + @fieldlib=('host','logname','date','method','url','code','size'); + } + # This is a deprecated option, will be removed in a next version. + elsif ($LogFormat eq '5') { # Same than "c-ip cs-username c-agent sc-authenticated date time s-svcname s-computername cs-referred r-host r-ip r-port time-taken cs-bytes sc-bytes cs-protocol cs-transport s-operation cs-uri cs-mime-type s-object-source sc-status s-cache-info" + $PerlParsingFormat="([^\\t]*)\\t([^\\t]*)\\t([^\\t]*)\\t[^\\t]*\\t([^\\t]*\\t[^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t[^\\t]*\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t([^\\t]*)\\t[^\\t]*\\t[^\\t]*\\t([^\\t]*)\\t[^\\t]*"; + $pos_host=0;$pos_logname=1;$pos_agent=2;$pos_date=3;$pos_referer=4;$pos_size=5;$pos_method=6;$pos_url=7;$pos_code=8; + @fieldlib=('host','logname','ua','date','referer','size','method','url','code'); + } + } + else { # Personalized log format + my $LogFormatString=$LogFormat; + # Replacement for Notes format string that are not Apache + $LogFormatString =~ s/%vh/%virtualname/g; + # Replacement for Apache format string + $LogFormatString =~ s/%v(\s)/%virtualname$1/g; $LogFormatString =~ s/%v$/%virtualname/g; + $LogFormatString =~ s/%h(\s)/%host$1/g; $LogFormatString =~ s/%h$/%host/g; + $LogFormatString =~ s/%l(\s)/%other$1/g; $LogFormatString =~ s/%l$/%other/g; + $LogFormatString =~ s/\"%u\"/%lognamequot/g; + $LogFormatString =~ s/%u(\s)/%logname$1/g; $LogFormatString =~ s/%u$/%logname/g; + $LogFormatString =~ s/%t(\s)/%time1$1/g; $LogFormatString =~ s/%t$/%time1/g; + $LogFormatString =~ s/\"%r\"/%methodurl/g; + $LogFormatString =~ s/%>s/%code/g; + $LogFormatString =~ s/%b(\s)/%bytesd$1/g; $LogFormatString =~ s/%b$/%bytesd/g; + $LogFormatString =~ s/\"%{Referer}i\"/%refererquot/g; + $LogFormatString =~ s/\"%{User-Agent}i\"/%uaquot/g; + $LogFormatString =~ s/%{mod_gzip_input_size}n/%gzipin/g; + $LogFormatString =~ s/%{mod_gzip_output_size}n/%gzipout/g; + $LogFormatString =~ s/%{mod_gzip_compression_ratio}n/%gzipratio/g; + $LogFormatString =~ s/\(%{ratio}n\)/%deflateratio/g; + # Replacement for a IIS and ISA format string + $LogFormatString =~ s/cs-uri-query/%query/g; # Must be before cs-uri + $LogFormatString =~ s/date\stime/%time2/g; + $LogFormatString =~ s/c-ip/%host/g; + $LogFormatString =~ s/cs-username/%logname/g; + $LogFormatString =~ s/cs-method/%method/g; # GET, POST, SMTP, RETR STOR + $LogFormatString =~ s/cs-uri-stem/%url/g; $LogFormatString =~ s/cs-uri/%url/g; + $LogFormatString =~ s/sc-status/%code/g; + $LogFormatString =~ s/sc-bytes/%bytesd/g; + $LogFormatString =~ s/cs-version/%other/g; # Protocol + $LogFormatString =~ s/cs\(User-Agent\)/%ua/g; $LogFormatString =~ s/c-agent/%ua/g; + $LogFormatString =~ s/cs\(Referer\)/%referer/g; $LogFormatString =~ s/cs-referred/%referer/g; + $LogFormatString =~ s/sc-authenticated/%other/g; + $LogFormatString =~ s/s-svcname/%other/g; + $LogFormatString =~ s/s-computername/%other/g; + $LogFormatString =~ s/r-host/%virtualname/g; + $LogFormatString =~ s/r-ip/%other/g; + $LogFormatString =~ s/r-port/%other/g; + $LogFormatString =~ s/time-taken/%other/g; + $LogFormatString =~ s/cs-bytes/%other/g; + $LogFormatString =~ s/cs-protocol/%other/g; + $LogFormatString =~ s/cs-transport/%other/g; + $LogFormatString =~ s/s-operation/%method/g; # GET, POST, SMTP, RETR STOR + $LogFormatString =~ s/cs-mime-type/%other/g; + $LogFormatString =~ s/s-object-source/%other/g; + $LogFormatString =~ s/s-cache-info/%other/g; + # Added for MMS + $LogFormatString =~ s/protocol/%protocolmms/g; # cs-method might not be available + $LogFormatString =~ s/c-status/%codemms/g; # c-status used when sc-status not available + if ($Debug) { debug(" LogFormatString=$LogFormatString"); } + # $LogFormatString has an AWStats format, so we can generate PerlParsingFormat variable + my $i = 0; + my $LogSeparatorWithoutStar=$LogSeparator; $LogSeparatorWithoutStar =~ s/[\*\+]//g; + foreach my $f (split(/\s+/,$LogFormatString)) { + # Add separator for next field + if ($PerlParsingFormat) { $PerlParsingFormat.="$LogSeparator"; } + # Special for logname + if ($f =~ /%lognamequot$/) { + $pos_logname = $i; $i++; push @fieldlib, 'logname'; + $PerlParsingFormat .= "\\\"?([^\\\"]*)\\\"?"; # logname can be "value", "" and - in same log (Lotus notes) + } + # Date format + elsif ($f =~ /%time1$/ || $f =~ /%time1b$/) { # [dd/mmm/yyyy:hh:mm:ss +0000] or [dd/mmm/yyyy:hh:mm:ss], time1b kept for backward compatibility + $pos_date = $i; $i++; push @fieldlib, 'date'; + $pos_tz = $i; $i++; push @fieldlib, 'tz'; + $PerlParsingFormat .= "\\[([^$LogSeparatorWithoutStar]+)( [^$LogSeparatorWithoutStar]+)?\\]"; + } + elsif ($f =~ /%time2$/) { # yyyy-mm-dd hh:mm:ss + $pos_date = $i; $i++; push @fieldlib, 'date'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+\\s[^$LogSeparatorWithoutStar]+)"; # Need \s for Exchange log files + } + elsif ($f =~ /%time3$/) { # mon d hh:mm:ss or mon dd hh:mm:ss yyyy or day mon dd hh:mm:ss or day mon dd hh:mm:ss yyyy + $pos_date = $i; $i++; push @fieldlib, 'date'; + $PerlParsingFormat .= "(?:\\w\\w\\w )?(\\w\\w\\w \\s?\\d+ \\d\\d:\\d\\d:\\d\\d(?: \\d\\d\\d\\d)?)"; + } + elsif ($f =~ /%time4$/) { # ddddddddddddd + $pos_date = $i; $i++; push @fieldlib, 'date'; + $PerlParsingFormat .= "(\\d+)"; + } + # Special for methodurl and methodurlnoprot + elsif ($f =~ /%methodurl$/) { + $pos_method = $i; $i++; push @fieldlib, 'method'; + $pos_url = $i; $i++; push @fieldlib, 'url'; + $PerlParsingFormat .= "\\\"([^$LogSeparatorWithoutStar]+) ([^$LogSeparatorWithoutStar]+) [^\\\"]+\\\""; + } + elsif ($f =~ /%methodurlnoprot$/) { + $pos_method = $i; $i++; push @fieldlib, 'method'; + $pos_url = $i; $i++; push @fieldlib, 'url'; + $PerlParsingFormat .= "\\\"([^$LogSeparatorWithoutStar]+) ([^$LogSeparatorWithoutStar]+)\\\""; + } + # Common command tags + elsif ($f =~ /%virtualname$/) { + $pos_vh = $i; $i++; push @fieldlib, 'vhost'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%host_r$/) { + $pos_hostr = $i; $i++; push @fieldlib, 'hostr'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%host$/) { + $pos_host = $i; $i++; push @fieldlib, 'host'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%logname$/) { + $pos_logname = $i; $i++; push @fieldlib, 'logname'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%method$/) { + $pos_method = $i; $i++; push @fieldlib, 'method'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%url$/) { + $pos_url = $i; $i++; push @fieldlib, 'url'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%query$/) { + $pos_query = $i; $i++; push @fieldlib, 'query'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%code$/) { + $pos_code = $i; $i++; push @fieldlib, 'code'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%bytesd$/) { + $pos_size = $i; $i++; push @fieldlib, 'size'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%refererquot$/) { + $pos_referer = $i; $i++; push @fieldlib, 'referer'; + $PerlParsingFormat .= "\\\"([^\\\"]*)\\\""; # referer might be "" + } + elsif ($f =~ /%referer$/) { + $pos_referer = $i; $i++; push @fieldlib, 'referer'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%uaquot$/) { + $pos_agent = $i; $i++; push @fieldlib, 'ua'; + $PerlParsingFormat .= "\\\"([^\\\"]*)\\\""; # ua might be "" + } + elsif ($f =~ /%uabracket$/) { + $pos_agent = $i; $i++; push @fieldlib, 'ua'; + $PerlParsingFormat .= "\\\[([^\\\]]*)\\\]"; # ua might be [] + } + elsif ($f =~ /%ua$/) { + $pos_agent = $i; $i++; push @fieldlib, 'ua'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%gzipin$/ ) { + $pos_gzipin=$i;$i++; push @fieldlib, 'gzipin'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%gzipout/ ) { # Compare $f to /%gzipout/ and not to /%gzipout$/ like other fields + $pos_gzipout=$i;$i++; push @fieldlib, 'gzipout'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%gzipratio/ ) { # Compare $f to /%gzipratio/ and not to /%gzipratio$/ like other fields + $pos_compratio=$i;$i++; push @fieldlib, 'gzipratio'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%deflateratio/ ) { # Compare $f to /%deflateratio/ and not to /%deflateratio$/ like other fields + $pos_compratio=$i;$i++; push @fieldlib, 'deflateratio'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%email_r$/) { + $pos_emailr = $i; $i++; push @fieldlib, 'email_r'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%email$/) { + $pos_emails = $i; $i++; push @fieldlib, 'email'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%cluster$/) { + $pos_cluster = $i; $i++; push @fieldlib, 'clusternb'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + elsif ($f =~ /%timetaken$/) { + $pos_timetaken = $i; $i++; push @fieldlib, 'timetaken'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + # Special for protocolmms, used for method if method not already found (for MMS) + elsif ($f =~ /%protocolmms$/) { + if ($pos_method < 0) { + $pos_method = $i; $i++; push @fieldlib, 'method'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + } + # Special for codemms, used for code only if code not already found (for MMS) + elsif ($f =~ /%codemms$/) { + if ($pos_code < 0) { + $pos_code = $i; $i++; push @fieldlib, 'code'; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + } + # Extra tag + elsif ($f =~ /%extra(\d+)$/) { + $pos_extra[$1] = $i; $i++; push @fieldlib, "extra$1"; + $PerlParsingFormat .= "([^$LogSeparatorWithoutStar]+)"; + } + # Other tag + elsif ($f =~ /%other$/) { + $PerlParsingFormat .= "[^$LogSeparatorWithoutStar]+"; + } + elsif ($f =~ /%otherquot$/) { + $PerlParsingFormat .= "\\\"[^\\\"]*\\\""; + } + # Unknown tag (no parenthesis) + else { + $PerlParsingFormat .= "[^$LogSeparatorWithoutStar]+"; + } + } + if (! $PerlParsingFormat) { error("No recognized format tag in personalized LogFormat string"); } + } + if ($pos_host < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%host in your LogFormat string)."); } + if ($pos_date < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%time1 or \%time2 in your LogFormat string)."); } + if ($pos_method < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%methodurl or \%method in your LogFormat string)."); } + if ($pos_url < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%methodurl or \%url in your LogFormat string)."); } + if ($pos_code < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%code in your LogFormat string)."); } + if ($pos_size < 0) { error("Your personalized LogFormat does not include all fields required by AWStats (Add \%bytesd in your LogFormat string)."); } + $PerlParsingFormat=qr/^$PerlParsingFormat/; + if ($Debug) { debug(" PerlParsingFormat is $PerlParsingFormat"); } +} + + +sub ShowMenuCateg { + my ($categ,$categtext,$categicon,$frame,$targetpage,$linkanchor,$NewLinkParams,$NewLinkTarget)=(shift,shift,shift,shift,shift,shift,shift,shift); + $categicon=''; # Comment this to enabme category icons + my ($menu,$menulink,$menutext)=(shift,shift,shift); + my $linetitle=0; + # Call to plugins' function AddHTMLMenuLink + foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLMenuLink'}}) { + my $function="AddHTMLMenuLink_$pluginname('$categ',\$menu,\$menulink,\$menutext)"; + eval("$function"); + } + foreach my $key (%$menu) { if ($menu->{$key}>0) { $linetitle++; last; } } + if (! $linetitle) { return; } + # At least one entry in menu for this category, we can show categpry and entries + my $WIDTHMENU1=($FrameName eq 'mainleft'?$FRAMEWIDTH:150); + print "".($categicon?" ":"")."$categtext:\n"; + print ($frame?"\n":""); + foreach my $key (sort { $menu->{$a} <=> $menu->{$b} } keys %$menu) { + if ($menu->{$key}==0) { next; } + if ($menulink->{$key}==1) { print ($frame?"":""); print "$menutext->{$key}"; print ($frame?"\n":"   "); } + if ($menulink->{$key}==2) { print ($frame?"   \"...\" ":""); print "$menutext->{$key}\n"; print ($frame?"\n":"   "); } + } + print ($frame?"":"\n"); +} + + +sub ShowEmailSendersChart { + my $NewLinkParams=shift; + my $NewLinkTarget=shift; + my $MaxLengthOfShownEMail=48; + + my $total_p;my $total_h;my $total_k; + my $max_p;my $max_h;my $max_k; + my $rest_p;my $rest_h;my $rest_k; + + # Show filter form + #&ShowFormFilter("emailsfilter",$EmailsFilter); + # Show emails list + + print "$Center 
    \n"; + my $title; + if ($HTMLOutput{'allemails'} || $HTMLOutput{'lastemails'}) { + $title="$Message[131]"; + } + else { + $title="$Message[131] ($Message[77] $MaxNbOf{'EMailsShown'})   -   $Message[80]"; + if ($ShowEMailSenders =~ /L/i) { $title.="   -   $Message[9]"; } + } + &tab_head("$title",19,0,'emailsenders'); + print "$Message[131] : ".(scalar keys %_emails_h).""; + if ($ShowEMailSenders =~ /H/i) { print "$Message[57]"; } + if ($ShowEMailSenders =~ /B/i) { print "$Message[75]"; } + if ($ShowEMailSenders =~ /M/i) { print "$Message[106]"; } + if ($ShowEMailSenders =~ /L/i) { print "$Message[9]"; } + print "\n"; + print "Local External"; + $total_p=$total_h=$total_k=0; + $max_h=1; foreach (values %_emails_h) { if ($_ > $max_h) { $max_h = $_; } } + $max_k=1; foreach (values %_emails_k) { if ($_ > $max_k) { $max_k = $_; } } + my $count=0; + if (! $HTMLOutput{'allemails'} && ! $HTMLOutput{'lastemails'}) { &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emails_h,\%_emails_h); } + if ($HTMLOutput{'allemails'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emails_h,\%_emails_h); } + if ($HTMLOutput{'lastemails'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emails_h,\%_emails_l); } + foreach my $key (@keylist) { + my $newkey=$key; + if (length($key)>$MaxLengthOfShownEMail) { $newkey=substr($key,0,$MaxLengthOfShownEMail)."..."; } + my $bredde_h=0;my $bredde_k=0; + if ($max_h > 0) { $bredde_h=int($BarWidth*$_emails_h{$key}/$max_h)+1; } + if ($max_k > 0) { $bredde_k=int($BarWidth*$_emails_k{$key}/$max_k)+1; } + print ""; + my $direction=IsLocalEMail($key); + if ($direction > 0) { print "$newkey-> "; } + if ($direction == 0) { print "$newkey"; } + if ($direction < 0) { print " <-$newkey"; } + if ($ShowEMailSenders =~ /H/i) { print "$_emails_h{$key}"; } + if ($ShowEMailSenders =~ /B/i) { print "".Format_Bytes($_emails_k{$key}).""; } + if ($ShowEMailSenders =~ /M/i) { print "".Format_Bytes($_emails_k{$key}/($_emails_h{$key}||1)).""; } + if ($ShowEMailSenders =~ /L/i) { print "".($_emails_l{$key}?Format_Date($_emails_l{$key},1):'-').""; } + print "\n"; + #$total_p += $_emails_p{$key}; + $total_h += $_emails_h{$key}; + $total_k += $_emails_k{$key}; + $count++; + } + $rest_p=0; # $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other sender emails + print "$Message[2]"; + if ($ShowEMailSenders =~ /H/i) { print "$rest_h"; } + if ($ShowEMailSenders =~ /B/i) { print "".Format_Bytes($rest_k).""; } + if ($ShowEMailSenders =~ /M/i) { print "".Format_Bytes($rest_k/($rest_h||1)).""; } + if ($ShowEMailSenders =~ /L/i) { print " "; } + print "\n"; + } + &tab_end(); +} + + +sub ShowEmailReceiversChart { + my $NewLinkParams=shift; + my $NewLinkTarget=shift; + my $MaxLengthOfShownEMail=48; + + my $total_p;my $total_h;my $total_k; + my $max_p;my $max_h;my $max_k; + my $rest_p;my $rest_h;my $rest_k; + + # Show filter form + #&ShowFormFilter("emailrfilter",$EmailrFilter); + # Show emails list + + print "$Center 
    \n"; + my $title; + if ($HTMLOutput{'allemailr'} || $HTMLOutput{'lastemailr'}) { + $title="$Message[132]"; + } + else { + $title="$Message[132] ($Message[77] $MaxNbOf{'EMailsShown'})   -   $Message[80]"; + if ($ShowEMailReceivers =~ /L/i) { $title.="   -   $Message[9]"; } + } + &tab_head("$title",19,0,'emailreceivers'); + print "$Message[132] : ".(scalar keys %_emailr_h).""; + if ($ShowEMailReceivers =~ /H/i) { print "$Message[57]"; } + if ($ShowEMailReceivers =~ /B/i) { print "$Message[75]"; } + if ($ShowEMailReceivers =~ /M/i) { print "$Message[106]"; } + if ($ShowEMailReceivers =~ /L/i) { print "$Message[9]"; } + print "\n"; + print "Local External"; + $total_p=$total_h=$total_k=0; + $max_h=1; foreach (values %_emailr_h) { if ($_ > $max_h) { $max_h = $_; } } + $max_k=1; foreach (values %_emailr_k) { if ($_ > $max_k) { $max_k = $_; } } + my $count=0; + if (! $HTMLOutput{'allemailr'} && ! $HTMLOutput{'lastemailr'}) { &BuildKeyList($MaxNbOf{'EMailsShown'},$MinHit{'EMail'},\%_emailr_h,\%_emailr_h); } + if ($HTMLOutput{'allemailr'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emailr_h,\%_emailr_h); } + if ($HTMLOutput{'lastemailr'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'EMail'},\%_emailr_h,\%_emailr_l); } + foreach my $key (@keylist) { + my $newkey=$key; + if (length($key)>$MaxLengthOfShownEMail) { $newkey=substr($key,0,$MaxLengthOfShownEMail)."..."; } + my $bredde_h=0;my $bredde_k=0; + if ($max_h > 0) { $bredde_h=int($BarWidth*$_emailr_h{$key}/$max_h)+1; } + if ($max_k > 0) { $bredde_k=int($BarWidth*$_emailr_k{$key}/$max_k)+1; } + print ""; + my $direction=IsLocalEMail($key); + if ($direction > 0) { print "$newkey<- "; } + if ($direction == 0) { print "$newkey"; } + if ($direction < 0) { print " ->$newkey"; } + if ($ShowEMailReceivers =~ /H/i) { print "$_emailr_h{$key}"; } + if ($ShowEMailReceivers =~ /B/i) { print "".Format_Bytes($_emailr_k{$key}).""; } + if ($ShowEMailReceivers =~ /M/i) { print "".Format_Bytes($_emailr_k{$key}/($_emailr_h{$key}||1)).""; } + if ($ShowEMailReceivers =~ /L/i) { print "".($_emailr_l{$key}?Format_Date($_emailr_l{$key},1):'-').""; } + print "\n"; + #$total_p += $_emailr_p{$key}; + $total_h += $_emailr_h{$key}; + $total_k += $_emailr_k{$key}; + $count++; + } + $rest_p=0; # $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other receiver emails + print "$Message[2]"; + if ($ShowEMailReceivers =~ /H/i) { print "$rest_h"; } + if ($ShowEMailReceivers =~ /B/i) { print "".Format_Bytes($rest_k).""; } + if ($ShowEMailReceivers =~ /M/i) { print "".Format_Bytes($rest_k/($rest_h||1)).""; } + if ($ShowEMailReceivers =~ /L/i) { print " "; } + print "\n"; + } + &tab_end(); +} + +#------------------------------------------------------------------------------ +# Function: Calculate hash value of a string +# Parameters: $str +# Input: None +# Output: None +# Return: Hash value +# Author: E-Lane +#------------------------------------------------------------------------------ + +sub function_hash { + my $str=shift(); + my $c=substr $str,0 ,1; + my $i=1; + my $sum=0; + while ($c ne '') { + $sum+=ord($c); + $c=substr $str,$i,1; + $i++; + } + return $sum; +} + +#------------------------------------------------------------------------------ +# Function: Change all values %XX to its ASCII char +# Parameters: $str +# Input: None +# Output: None +# Return: String with ASCII chars +# Author: E-Lane +#------------------------------------------------------------------------------ + +sub ChangeToASCII { + my $stringtochange=shift; + $stringtochange =~ s/\%(..)/pack("c",hex($1))/ge; + $stringtochange =~ s/\+/ /g; + $stringtochange =~ s/\s+/ /g; + return $stringtochange; +} + + +#------------------------------------------------------------------------------ +# MAIN +#------------------------------------------------------------------------------ +($DIR=$0) =~ s/([^\/\\]+)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; +$DIR||='.'; $DIR =~ s/([^\/\\])[\\\/]+$/$1/; + +$starttime=time(); + +# Get current time (time when AWStats was started) +($nowsec,$nowmin,$nowhour,$nowday,$nowmonth,$nowyear,$nowwday,$nowyday) = localtime($starttime); +$nowweekofmonth=int($nowday/7); +$nowweekofyear=int(($nowyday-1+6-($nowwday==0?6:$nowwday-1))/7)+1; if ($nowweekofyear > 52) { $nowweekofyear = 1; } +$nowdaymod=$nowday%7; +$nowwday++; +$nowns=Time::Local::timegm(0,0,0,$nowday,$nowmonth,$nowyear); +if ($nowdaymod <= $nowwday) { if (($nowwday != 7) || ($nowdaymod != 0)) { $nowweekofmonth=$nowweekofmonth+1; } } +if ($nowdaymod > $nowwday) { $nowweekofmonth=$nowweekofmonth+2; } +# Change format of time variables +$nowweekofmonth="0$nowweekofmonth"; +if ($nowweekofyear < 10) { $nowweekofyear = "0$nowweekofyear"; } +if ($nowyear < 100) { $nowyear+=2000; } else { $nowyear+=1900; } +$nowsmallyear=$nowyear;$nowsmallyear =~ s/^..//; +if (++$nowmonth < 10) { $nowmonth = "0$nowmonth"; } +if ($nowday < 10) { $nowday = "0$nowday"; } +if ($nowhour < 10) { $nowhour = "0$nowhour"; } +if ($nowmin < 10) { $nowmin = "0$nowmin"; } +if ($nowsec < 10) { $nowsec = "0$nowsec"; } +$nowtime=int($nowyear.$nowmonth.$nowday.$nowhour.$nowmin.$nowsec); +# Get tomorrow time (will be used to discard some record with corrupted date (future date)) +my ($tomorrowsec,$tomorrowmin,$tomorrowhour,$tomorrowday,$tomorrowmonth,$tomorrowyear) = localtime($starttime+86400); +if ($tomorrowyear < 100) { $tomorrowyear+=2000; } else { $tomorrowyear+=1900; } +if (++$tomorrowmonth < 10) { $tomorrowmonth = "0$tomorrowmonth"; } +if ($tomorrowday < 10) { $tomorrowday = "0$tomorrowday"; } +if ($tomorrowhour < 10) { $tomorrowhour = "0$tomorrowhour"; } +if ($tomorrowmin < 10) { $tomorrowmin = "0$tomorrowmin"; } +if ($tomorrowsec < 10) { $tomorrowsec = "0$tomorrowsec"; } +$tomorrowtime=int($tomorrowyear.$tomorrowmonth.$tomorrowday.$tomorrowhour.$tomorrowmin.$tomorrowsec); + +# Allowed option +#Esto no srive para nada, porque no lo vuelven a usar, pero quedan registradas las opciones posibles. +my @AllowedCLIArgs=('migrate','config', +'logfile','output','runascli','update', +'staticlinks','staticlinksext','noloadplugin','loadplugin', +'hostfilter','urlfilter','refererpagesfilter', +'lang','month','year','framename','debug', +'showsteps','showdropped','showcorrupted','showunknownorigin', +'limitflush','confdir','updatefor', +'hostfilter','hostfilterex','urlfilter','urlfilterex','refererpagesfilter','refererpagesfilterex', +'pluginmode','filterrawlog','onlylines','onlyusers','onlyfiles','sitedomain'); + +#Comprobamos que el script se ejecuta desde la pagina lanza de dotlrn + +my $UrlOrigen = $ENV{'HTTP_REFERER'}; +my $PermissionError=0; +if ($UrlOrigen) { + my $ThisUrl = ($WrapperScript?"$WrapperScript":"$DirCgi$PROG.$Extension"); + my @AllowedLastUrls=('elane', "$ThisUrl"); + + open AllowedUrlsFile, "../../../config/AllowedUrls.conf"; + while () { + chomp $_; s/\r//; + push @AllowedLastUrls, $_; + open FILE, ">>salida.txt"; + print FILE "Leido: $_\n"; + close FILE; + } + close AllowedUrlsFile; + + + my $CompareString = ''; + + foreach (@AllowedLastUrls) { + $CompareString = qr/.*$_.*/i; + if ($UrlOrigen =~ /$CompareString/ ) { + $PermissionError=1; + last; + } + } +} + +if (not $PermissionError) { + #Codigo de error + print "Location: ../../../user-tracking/\n\n"; + exit; +} + + + +$QueryString=''; +# AWStats use GATEWAY_INTERFACE to known if ran as CLI or CGI. AWSTATS_DEL_GATEWAY_INTERFACE can +# be set to force AWStats to be ran as CLI even from a web page. +if ($ENV{'AWSTATS_DEL_GATEWAY_INTERFACE'}) { $ENV{'GATEWAY_INTERFACE'}=''; } +if ($ENV{'GATEWAY_INTERFACE'}) { # Run from a browser as CGI + # Prepare QueryString + if ($ENV{'CONTENT_LENGTH'}) { + binmode STDIN; + read(STDIN, $QueryString, $ENV{'CONTENT_LENGTH'}); + } + if ($ENV{'QUERY_STRING'}) { $QueryString = $ENV{'QUERY_STRING'}; } + + $QueryString = CleanFromCSSA($QueryString); + + #Modified by E-Lane + $QueryString = ChangeToASCII($QueryString); + + # No update but report by default when run from a browser + $UpdateStats=($QueryString=~/update=1/i?1:0); + + if ($QueryString =~ /config=([^&]+)/i) { $SiteConfig=&DecodeEncodedString("$1"); } + if ($QueryString =~ /logfile=([^&]+)/i) { $LogFile=&DecodeEncodedString("$1"); } + if ($QueryString =~ /diricons=([^&]+)/i) { $DirIcons=&DecodeEncodedString("$1"); } + if ($QueryString =~ /pluginmode=([^&]+)/i) { $PluginMode=&DecodeEncodedString("$1"); } + if ($QueryString =~ /configdir=([^&]+)/i) { $DirConfig=&DecodeEncodedString("$1"); } + # All filters + if ($QueryString =~ /hostfilter=([^&]+)/i) { $FilterIn{'host'}=&DecodeEncodedString("$1"); } # Filter on host list can also be defined with hostfilter=filter + if ($QueryString =~ /hostfilterex=([^&]+)/i) { $FilterEx{'host'}=&DecodeEncodedString("$1"); } # + if ($QueryString =~ /urlfilter=([^&]+)/i) { $FilterIn{'url'}=&DecodeEncodedString("$1"); } # Filter on URL list can also be defined with urlfilter=filter + if ($QueryString =~ /urlfilterex=([^&]+)/i) { $FilterEx{'url'}=&DecodeEncodedString("$1"); } # + if ($QueryString =~ /refererpagesfilter=([^&]+)/i) { $FilterIn{'refererpages'}=&DecodeEncodedString("$1"); } # Filter on referer list can also be defined with refererpagesfilter=filter + if ($QueryString =~ /refererpagesfilterex=([^&]+)/i) { $FilterEx{'refererpages'}=&DecodeEncodedString("$1"); } # + # All output + if ($QueryString =~ /output=allhosts:([^&]+)/i) { $FilterIn{'host'}=&DecodeEncodedString("$1"); } # Filter on host list can be defined with output=allhosts:filter to reduce number of lines read and showed + if ($QueryString =~ /output=lasthosts:([^&]+)/i) { $FilterIn{'host'}=&DecodeEncodedString("$1"); } # Filter on host list can be defined with output=lasthosts:filter to reduce number of lines read and showed + if ($QueryString =~ /output=urldetail:([^&]+)/i) { $FilterIn{'url'}=&DecodeEncodedString("$1"); } # Filter on URL list can be defined with output=urldetail:filter to reduce number of lines read and showed + if ($QueryString =~ /output=refererpages:([^&]+)/i) { $FilterIn{'refererpages'}=&DecodeEncodedString("$1"); } # Filter on referer list can be defined with output=refererpages:filter to reduce number of lines read and showed + + #All new Paramas OnlyXXX and sitedomain defined by E-Lane + if ($QueryString =~ /onlylines=([^&]+)/i) { + foreach my $elem (split(/\s+/,$1)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="ol".function_hash($elem); } + else { $FileSuffix.="ol$elem"; $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyLines, qr/$elem/i; } + } + } + if ($QueryString =~ /onlyusers=([^&]+)/i) { + foreach my $elem (split(/\s+/,$1)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="ou".function_hash($elem); } + else { $FileSuffix.="ou$elem"; $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyUsers, qr/$elem/i; } + } + } + if ($QueryString =~ /onlyfiles=([^&]+)/i) { + foreach my $elem (split(/\s+/,$1)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="of".function_hash($elem); } + else { $FileSuffix.="of$elem"; $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyFiles, qr/$elem/i; } + } + # next; + } + if ($QueryString =~ /sitedomain=([^&]+)/i) { + $SiteDomain=&DecodeEncodedString("$1"); + } + + # If migrate + if ($QueryString =~ /(^|-|&)migrate=([^&]+)/i) { + $MigrateStats=&DecodeEncodedString("$2"); + $MigrateStats =~ /^(.*)$PROG(\d{0,2})(\d\d)(\d\d\d\d)(.*)\.txt$/; + $SiteConfig=$5?$5:'xxx'; $SiteConfig =~ s/^\.//; # SiteConfig is used to find config file + } +} +else { # Run from command line + # Prepare QueryString + for (0..@ARGV-1) { + # If migrate + if ($ARGV[$_] =~ /(^|-|&)migrate=([^&]+)/i) { + $MigrateStats="$2"; + $MigrateStats =~ /^(.*)$PROG(\d{0,2})(\d\d)(\d\d\d\d)(.*)\.txt$/; + $SiteConfig=$5?$5:'xxx'; $SiteConfig =~ s/^\.//; # SiteConfig is used to find config file + next; + } + # TODO Check if ARGV is in @AllowedArg + if ($QueryString) { $QueryString .= '&'; } + my $NewLinkParams=$ARGV[$_]; $NewLinkParams =~ s/^-+//; + $QueryString .= "$NewLinkParams"; + } + + $QueryString = CleanFromCSSA($QueryString); + #Modified by E-Lane + $QueryString = ChangeToASCII($QueryString); + # Update with no report by default when run from command line + $UpdateStats=1; + + if ($QueryString =~ /config=([^&]+)/i) { $SiteConfig="$1"; } + if ($QueryString =~ /logfile=([^&]+)/i) { $LogFile="$1"; } + if ($QueryString =~ /diricons=([^&]+)/i) { $DirIcons="$1"; } + if ($QueryString =~ /pluginmode=([^&]+)/i) { $PluginMode="$1"; } + if ($QueryString =~ /configdir=([^&]+)/i) { $DirConfig="$1"; } + # All filters + if ($QueryString =~ /hostfilter=([^&]+)/i) { $FilterIn{'host'}="$1"; } # Filter on host list can also be defined with hostfilter=filter + if ($QueryString =~ /hostfilterex=([^&]+)/i) { $FilterEx{'host'}="$1"; } # + if ($QueryString =~ /urlfilter=([^&]+)/i) { $FilterIn{'url'}="$1"; } # Filter on URL list can also be defined with urlfilter=filter + if ($QueryString =~ /urlfilterex=([^&]+)/i) { $FilterEx{'url'}="$1"; } # + if ($QueryString =~ /refererpagesfilter=([^&]+)/i) { $FilterIn{'refererpages'}="$1"; } # Filter on referer list can also be defined with refererpagesfilter=filter + if ($QueryString =~ /refererpagesfilterex=([^&]+)/i) { $FilterEx{'refererpages'}="$1"; } # + # All output + if ($QueryString =~ /output=allhosts:([^&]+)/i) { $FilterIn{'host'}="$1"; } # Filter on host list can be defined with output=allhosts:filter to reduce number of lines read and showed + if ($QueryString =~ /output=lasthosts:([^&]+)/i) { $FilterIn{'host'}="$1"; } # Filter on host list can be defined with output=lasthosts:filter to reduce number of lines read and showed + if ($QueryString =~ /output=urldetail:([^&]+)/i) { $FilterIn{'url'}="$1"; } # Filter on URL list can be defined with output=urldetail:filter to reduce number of lines read and showed + if ($QueryString =~ /output=refererpages:([^&]+)/i) { $FilterIn{'refererpages'}="$1"; } # Filter on referer list can be defined with output=refererpages:filter to reduce number of lines read and showed + + #All new paramas OnlyXXX and sitedomain defined by E-Lane + if ($QueryString =~ /onlylines=([^&]+)/i) { + foreach my $elem (split(/\s+/,$1)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="ol".function_hash($elem); } + else { $FileSuffix.="ol$elem"; $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyLines, qr/$elem/i; } + } +# foreach my $elem (split(/\s+/,$1)) { +# if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="ol".function_hash($elem); } +# else { $FileSuffix.="ol$elem"; $elem='^'.quotemeta($elem).'$'; } +# if ($elem) { push @OnlyLines, qr/$elem/i; } +# } +# next; + } + if ($QueryString =~ /onlyusers=([^&]+)/i) { + foreach my $elem (split(/\s+/,$1)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="ou".function_hash($elem); } + else { $FileSuffix.="ou$elem"; $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyUsers, qr/$elem/i; } + } +# foreach my $elem (split(/\s+/,$1)) { +# if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="ou".function_hash($elem); } +# else { $FileSuffix.="ou$elem"; $elem='^'.quotemeta($elem).'$'; $FileSuffix.="$elem"; } +# if ($elem) { push @OnlyUsers, qr/$elem/i; } +# } +# next; + } + if ($QueryString =~ /onlyfiles=([^&]+)/i) { + foreach my $elem (split(/\s+/,$1)) { + if ($elem =~ /^REGEX\[(.*)\]$/i) { $elem=$1; $FileSuffix.="of".function_hash($elem); } + else { $FileSuffix.="of$elem"; $elem='^'.quotemeta($elem).'$'; } + if ($elem) { push @OnlyFiles, qr/$elem/i; } + } +# next; + } + if ($QueryString =~ /sitedomain=([^&]+)/i) { + $SiteDomain=$1; + } + + # If show options + if ($QueryString =~ /showsteps/i) { $ShowSteps=1; $QueryString=~s/showsteps[^&]*//i; } + if ($QueryString =~ /showcorrupted/i) { $ShowCorrupted=1; $QueryString=~s/showcorrupted[^&]*//i; } + if ($QueryString =~ /showdropped/i) { $ShowDropped=1; $QueryString=~s/showdropped[^&]*//i; } + if ($QueryString =~ /showunknownorigin/i) { $ShowUnknownOrigin=1; $QueryString=~s/showunknownorigin[^&]*//i; } +} +if ($QueryString =~ /(^|&)staticlinks/i) { $StaticLinks=".$SiteConfig"; } +if ($QueryString =~ /(^|&)staticlinks=([^&]+)/i) { $StaticLinks=".$2"; } # When ran from awstatsbuildstaticpages.pl +if ($QueryString =~ /(^|&)staticlinksext=([^&]+)/i) { $StaticExt="$2"; } +if ($QueryString =~ /(^|&)framename=([^&]+)/i) { $FrameName="$2"; } +if ($QueryString =~ /(^|&)debug=(\d+)/i) { $Debug=$2; } +if ($QueryString =~ /(^|&)updatefor=(\d+)/i) { $UpdateFor=$2; } +if ($QueryString =~ /(^|&)noloadplugin=([^&]+)/i) { foreach (split(/,/,$2)) { $NoLoadPlugin{"$_"}=1; } } +if ($QueryString =~ /(^|&)loadplugin=([^&]+)/i) { foreach (split(/,/,$2)) { $NoLoadPlugin{"$_"}=-1; } } +if ($QueryString =~ /(^|&)limitflush=(\d+)/i) { $LIMITFLUSH=$2; } +# Get/Define output +if ($QueryString =~ /(^|&)output(=[^&]*|)(.*)&output(=[^&]*|)(&|$)/i) { error("Only 1 output option is allowed","","",1); } +if ($QueryString =~ /(^|&)output(=[^&]*|)(&|$)/i) { + # At least one output expected. We define %HTMLOutput + my $outputlist="$2"; + if ($outputlist) { + $outputlist =~ s/^=//; + foreach my $outputparam (split(/,/,$outputlist)) { + $outputparam=~s/:(.*)$//; + if ($outputparam) { $HTMLOutput{lc($outputparam)}="$1"||1; } + } + } + # If on command line and no update + if (! $ENV{'GATEWAY_INTERFACE'} && $QueryString !~ /update/i) { $UpdateStats=0; } + # If no output defined, used default value + if (! scalar keys %HTMLOutput) { $HTMLOutput{'main'}=1; } +} +if ($ENV{'GATEWAY_INTERFACE'} && ! scalar keys %HTMLOutput) { $HTMLOutput{'main'}=1; } + +# Remove -output option with no = from QueryString +$QueryString=~s/(^|&)output(&|$)/$1/i; $QueryString=~s/&+$//; + +# Check year and month parameters +if ($QueryString =~ /(^|&)month=(year)/i) { error("month=year is a deprecated option. Use month=all instead."); } +if ($QueryString =~ /(^|&)year=(\d\d\d\d)/i) { $YearRequired=sprintf("%04d",$2); } +else { $YearRequired="$nowyear"; } +if ($QueryString =~ /(^|&)month=(\d{1,2})/i) { $MonthRequired=sprintf("%02d",$2); } +elsif ($QueryString =~ /(^|&)month=(all)/i) { $MonthRequired='all'; } +else { $MonthRequired="$nowmonth"; } +if ($QueryString =~ /(^|&)day=(\d{1,2})/i) { $DayRequired=sprintf("%02d",$2); } # day is a hidden option. Must not be used (Make results not understandable). Available for users that rename history files with day. +else { $DayRequired=''; } + +# Check parameter validity +# TODO + +# Print AWStats and Perl version +if ($Debug) { + debug(ucfirst($PROG)." - $VERSION - Perl $^X $]",1); + debug("DIR=$DIR PROG=$PROG",2); + debug("QUERY_STRING=$QueryString",2); + debug("HTMLOutput=".join(',',keys %HTMLOutput),1); + debug("YearRequired=$YearRequired, MonthRequired=$MonthRequired",2); + debug("UpdateFor=$UpdateFor",2); + debug("PluginMode=$PluginMode",2); + debug("DirConfig=$DirConfig",2); +} + +# Force SiteConfig if AWSTATS_FORCE_CONFIG is defined +if ($ENV{'AWSTATS_CONFIG'}) { $ENV{'AWSTATS_FORCE_CONFIG'}=$ENV{'AWSTATS_CONFIG'}; } # For backward compatibility +if ($ENV{'AWSTATS_FORCE_CONFIG'}) { + if ($Debug) { debug("AWSTATS_FORCE_CONFIG parameter is defined to '".$ENV{'AWSTATS_FORCE_CONFIG'}."'. $PROG will use this as config value."); } + $SiteConfig=$ENV{'AWSTATS_FORCE_CONFIG'}; +} + +if ((! $ENV{'GATEWAY_INTERFACE'}) && (! $SiteConfig)) { + &Read_Ref_Data('browsers','domains','operating_systems','robots','search_engines','worms'); + print "----- $PROG $VERSION (c) 2000-2004 Laurent Destailleur -----\n"; + print "AWStats is a free web server logfile analyzer to show you advanced web\n"; + print "statistics.\n"; + print "AWStats comes with ABSOLUTELY NO WARRANTY. It's a free software distributed\n"; + print "with a GNU General Public License (See LICENSE file for details).\n"; + print "\n"; + print "Syntax: $PROG.$Extension -config=virtualhostname [options]\n"; + print "\n"; + print " This runs $PROG in command line to update statistics of a web site, from\n"; + print " the log file defined in AWStats config file (with -update option), or build\n"; + print " a HTML report (with -output option).\n"; + print " First, $PROG tries to read $PROG.virtualhostname.conf as the config file.\n"; + print " If not found, $PROG tries to read $PROG.conf\n"; + print " Note 1: Config files ($PROG.virtualhostname.conf or $PROG.conf) must be\n"; + print " in /etc/awstats, /usr/local/etc/awstats, /etc or same directory than\n"; + print " awstats.pl script file.\n"; + print " Note 2: If AWSTATS_FORCE_CONFIG environment variable is defined, AWStats will\n"; + print " use it as the \"config\" value, whatever is the value on command line or URL.\n"; + print " See AWStats documentation for all setup instrutions.\n"; + print "\n"; + print "Options to update statistics:\n"; + print " -update to update statistics (default)\n"; + print " -showsteps to add benchmark information every $NBOFLINESFORBENCHMARK lines processed\n"; + print " -showcorrupted to add output for each corrupted lines found, with reason\n"; + print " -showdropped to add output for each dropped lines found, with reason\n"; + print " -logfile=x to change log to analyze whatever is 'LogFile' in config file\n"; + print " -updatefor=n to stop the update process after parsing n lines\n"; + print " Be care to process log files in chronological order when updating statistics.\n"; + print "\n"; + print "Options to show statistics:\n"; + print " -output to output main HTML report (no update made except with -update)\n"; + print " -output=x to output other report pages where x is:\n"; + print " alldomains to build page of all domains/countries\n"; + print " allhosts to build page of all hosts\n"; + print " lasthosts to build page of last hits for hosts\n"; + print " unknownip to build page of all unresolved IP\n"; + print " allemails to build page of all email senders (maillog)\n"; + print " lastemails to build page of last email senders (maillog)\n"; + print " allemailr to build page of all email receivers (maillog)\n"; + print " lastemailr to build page of last email receivers (maillog)\n"; + print " alllogins to build page of all logins used\n"; + print " lastlogins to build page of last hits for logins\n"; + print " allrobots to build page of all robots/spider visits\n"; + print " lastrobots to build page of last hits for robots\n"; + print " urldetail to list most often viewed pages \n"; + print " urldetail:filter to list most often viewed pages matching filter\n"; + print " urlentry to list entry pages\n"; + print " urlentry:filter to list entry pages matching filter\n"; + print " urlexit to list exit pages\n"; + print " urlexit:filter to list exit pages matching filter\n"; + print " osdetail to build page with os detailed versions\n"; + print " browserdetail to build page with browsers detailed versions\n"; + print " unknownbrowser to list 'User Agents' with unknown browser\n"; + print " unknownos to list 'User Agents' with unknown OS\n"; + print " refererse to build page of all refering search engines\n"; + print " refererpages to build page of all refering pages\n"; + #print " referersites to build page of all refering sites\n"; + print " keyphrases to list all keyphrases used on search engines\n"; + print " keywords to list all keywords used on search engines\n"; + print " errors404 to list 'Referers' for 404 errors\n"; + print " -staticlinks to have static links in HTML report page\n"; + print " -staticlinksext=xxx to have static links with .xxx extension instead of .html\n"; + print " -lang=LL to output a HTML report in language LL (en,de,es,fr,it,nl,...)\n"; + print " -month=MM to output a HTML report for an old month MM\n"; + print " -year=YYYY to output a HTML report for an old year YYYY\n"; + print " Those 'date' options doesn't allow you to process old log file. They only\n"; + print " allow you to see a past report for a chosen month/year period instead of\n"; + print " current month/year.\n"; + print "\n"; + print "Other options:\n"; + print " -debug=X to add debug informations lesser than level X (speed reduced)\n"; + print "\n"; + print "Now supports/detects:\n"; + print " Web/Ftp/Mail log analyze (and load balanced log files)\n"; + print " Reverse DNS lookup (IPv4 and IPv6) and GeoIP lookup\n"; + print " Number of visits, number of unique visitors\n"; + print " Visits duration and list of last visits\n"; + print " Authenticated users\n"; + print " Days of week and rush hours\n"; + print " Hosts list and unresolved IP addresses list\n"; + print " Most viewed, entry and exit pages\n"; + print " Files type and Web compression (mod_gzip, mod_deflate stats)\n"; + print " Screen size\n"; + print " Number of times site is 'added to favorites bookmarks'\n"; + print " Ratio of Browsers with support of: Java, Flash, RealG2 reader,\n"; + print " Quicktime reader, WMA reader, PDF reader\n"; + print " Configurable personalized reports\n"; + print " ".(scalar keys %DomainsHashIDLib)." domains/countries\n"; + print " ".(scalar keys %RobotsHashIDLib)." robots\n"; + print " ".(scalar keys %WormsHashLib)." worm's families\n"; + print " ".(scalar keys %OSHashLib)." operating systems\n"; + print " ".(scalar keys %BrowsersHashIDLib)." browsers\n"; + print " ".(scalar keys %SearchEnginesHashLib)." search engines (and keyphrases/keywords used from them)\n"; + print " All HTTP errors with last referrer\n"; + print " Report by day/month/year\n"; + print " Dynamic or static HTML or XHTML reports, static PDF reports\n"; + print " Indexed text or XML monthly database\n"; + print " And a lot of other advanced features and options...\n"; + print "New versions and FAQ at http://awstats.sourceforge.net\n"; + exit 2; +} +$SiteConfig||=$ENV{'SERVER_NAME'}; +#$ENV{'SERVER_NAME'}||=$SiteConfig; # For thoose who use __SERVER_NAME__ in conf file and use CLI. +$ENV{'AWSTATS_CURRENT_CONFIG'}=$SiteConfig; + +# Read config file (SiteConfig must be defined) +&Read_Config($DirConfig); + +# Check language +if ($QueryString =~ /(^|&)lang=([^&]+)/i) { $Lang="$2"; } +if (! $Lang || $Lang eq 'auto') { # If lang not defined or forced to auto + my $langlist=$ENV{'HTTP_ACCEPT_LANGUAGE'}||''; $langlist =~ s/;[^,]*//g; + if ($Debug) { debug("Search an available language among HTTP_ACCEPT_LANGUAGE=$langlist",1); } + foreach my $code (split(/,/,$langlist)) { # Search for a valid lang in priority + if ($LangBrowserToLangAwstats{$code}) { $Lang=$LangBrowserToLangAwstats{$code}; if ($Debug) { debug(" Will try to use Lang=$Lang",1); } last; } + $code =~ s/-.*$//; + if ($LangBrowserToLangAwstats{$code}) { $Lang=$LangBrowserToLangAwstats{$code}; if ($Debug) { debug(" Will try to use Lang=$Lang",1); } last; } + } +} +if (! $Lang || $Lang eq 'auto') { + if ($Debug) { debug(" No language defined or available. Will use Lang=en",1); } + $Lang='en'; +} + +# Check and correct bad parameters +&Check_Config(); +# Now SiteDomain is defined + +# Define frame name and correct variable for frames +if (! $FrameName) { + if ($ENV{'GATEWAY_INTERFACE'} && $UseFramesWhenCGI && $HTMLOutput{'main'} && ! $PluginMode) { $FrameName='index'; } + else { $FrameName='main'; } +} + +# Load Message files, Reference data files and Plugins +if ($Debug) { debug("FrameName=$FrameName",1); } +if ($FrameName ne 'index') { + &Read_Language_Data($Lang); + if ($FrameName ne 'mainleft') { + my %datatoload=(); + if ($UpdateStats) { # If update + if ($LevelForFileTypesDetection<2) { $datatoload{'mime'}=1; } # Only if need to filter on known extensions + if ($LevelForRobotsDetection) { $datatoload{'robots'}=1; } # ua + if ($LevelForWormsDetection) { $datatoload{'worms'}=1; } # url + if ($LevelForBrowsersDetection) { $datatoload{'browsers'}=1; } # ua + if ($LevelForOSDetection) { $datatoload{'operating_systems'}=1; } # ua + if ($LevelForRefererAnalyze) { $datatoload{'search_engines'}=1; } # referer + # if (...) { $datatoload{'referer_spam'}=1; } + } + if (scalar keys %HTMLOutput) { # If output + if ($ShowDomainsStats) { $datatoload{'domains'}=1; } + if ($ShowFileTypesStats) { $datatoload{'mime'}=1; } + if ($ShowRobotsStats) { $datatoload{'robots'}=1; } + if ($ShowWormsStats) { $datatoload{'worms'}=1; } + if ($ShowBrowsersStats) { $datatoload{'browsers'}=1; } + if ($ShowOSStats) { $datatoload{'operating_systems'}=1; } + if ($ShowOriginStats) { $datatoload{'search_engines'}=1; } + if ($ShowHTTPErrorsStats) { $datatoload{'status_http'}=1; } + if ($ShowSMTPErrorsStats) { $datatoload{'status_smtp'}=1; } + } + &Read_Ref_Data(keys %datatoload); + } + &Read_Plugins(); +} +# Here charset is defined, so we can send the http header (Need BuildReportFormat,PageCode) +if (! $HeaderHTTPSent && $ENV{'GATEWAY_INTERFACE'}) { http_head(); } # Run from a browser as CGI + +# Init other parameters +$NBOFLINESFORBENCHMARK--; +if ($ENV{'GATEWAY_INTERFACE'}) { $DirCgi=''; } +if ($DirCgi && !($DirCgi =~ /\/$/) && !($DirCgi =~ /\\$/)) { $DirCgi .= '/'; } +if (! $DirData || $DirData =~ /^\./) { + if (! $DirData || $DirData eq '.') { $DirData="$DIR"; } # If not defined or chosen to '.' value then DirData is current dir + elsif ($DIR && $DIR ne '.') { $DirData="$DIR/$DirData"; } +} +$DirData||='.'; # If current dir not defined then we put it to '.' +$DirData =~ s/[\\\/]+$//; + +if ($FirstDayOfWeek == 1) { @DOWIndex = (1,2,3,4,5,6,0); } +else { @DOWIndex = (0,1,2,3,4,5,6); } + +# Should we link to ourselves or to a wrapper script +$AWScript=($WrapperScript?"$WrapperScript":"$DirCgi$PROG.$Extension"); + +# Print html header (Need HTMLOutput,Expires,Lang,StyleSheet,HTMLHeadSectionExpires defined by Read_Config, PageCode defined by Read_Language_Data) +if (! $HeaderHTMLSent) { &html_head; } + +# AWStats output is replaced by a plugin output +if ($PluginMode) { + my $function="BuildFullHTMLOutput_$PluginMode()"; + eval("$function"); + if ($? || $@) { error("$@"); } + &html_end(0); + exit 0; +} + +# Security check +if ($AllowAccessFromWebToAuthenticatedUsersOnly && $ENV{'GATEWAY_INTERFACE'}) { + if ($Debug) { debug("REMOTE_USER=".$ENV{"REMOTE_USER"}); } + if (! $ENV{"REMOTE_USER"}) { + error("Access to statistics is only allowed from an authenticated session to authenticated users."); + } + if (@AllowAccessFromWebToFollowingAuthenticatedUsers) { + my $userisinlist=0; + my $currentuser=qr/^$ENV{"REMOTE_USER"}$/i; + $currentuser =~ s/\s/%20/g; # Allow authenticated user with space in name to be compared to allowed user list + foreach (@AllowAccessFromWebToFollowingAuthenticatedUsers) { + if (/$currentuser/o) { $userisinlist=1; last; } + } + if (! $userisinlist) { + error("User '".$ENV{"REMOTE_USER"}."' is not allowed to access statistics of this domain/config."); + } + } +} +if ($AllowAccessFromWebToFollowingIPAddresses && $ENV{'GATEWAY_INTERFACE'}) { + my $useripaddress=&Convert_IP_To_Decimal($ENV{"REMOTE_ADDR"}); + my @allowaccessfromipaddresses = split (/[\s,]+/, $AllowAccessFromWebToFollowingIPAddresses); + my $allowaccess = 0; + foreach my $ipaddressrange (@allowaccessfromipaddresses) { + if ($ipaddressrange !~ /^(\d+\.\d+\.\d+\.\d+)(?:-(\d+\.\d+\.\d+\.\d+))*$/) { + error("AllowAccessFromWebToFollowingIPAddresses is defined to '$AllowAccessFromWebToFollowingIPAddresses' but does not match the correct syntax: IPAddressMin[-IPAddressMax]"); + } + my $ipmin=&Convert_IP_To_Decimal($1); + my $ipmax=$2?&Convert_IP_To_Decimal($2):$ipmin; + # Is it an authorized ip ? + if (($useripaddress >= $ipmin) && ($useripaddress <= $ipmax)) { + $allowaccess = 1; + last; + } + } + if (! $allowaccess) { + error("Access to statistics is not allowed from your IP Address ".$ENV{"REMOTE_ADDR"}); + } +} +if (($UpdateStats || $MigrateStats) && (! $AllowToUpdateStatsFromBrowser) && $ENV{'GATEWAY_INTERFACE'}) { + error("".($UpdateStats?"Update":"Migrate")." of statistics has not been allowed from a browser (AllowToUpdateStatsFromBrowser should be set to 1)."); +} +if (scalar keys %HTMLOutput && $MonthRequired eq 'all') { + if (! $AllowFullYearView) { error("Full year view has not been allowed (AllowFullYearView is set to 0)."); } + if ($AllowFullYearView < 3 && $ENV{'GATEWAY_INTERFACE'}) { error("Full year view has not been allowed from a browser (AllowFullYearView should be set to 3)."); } +} + + +#------------------------------------------ +# MIGRATE PROCESS (Must be after reading config cause we need MaxNbOf... and Min...) +#------------------------------------------ +if ($MigrateStats) { + if ($Debug) { debug("MigrateStats is $MigrateStats",2); } + if ($MigrateStats !~ /^(.*)$PROG(\d{0,2})(\d\d)(\d\d\d\d)(.*)\.txt$/) { + error("AWStats history file name must match following syntax: ${PROG}MMYYYY[.config].txt","","",1); + } + $DirData="$1"; + $DayRequired="$2"; + $MonthRequired="$3"; + $YearRequired="$4"; + $FileSuffix="$5"; + # Correct DirData + if (! $DirData || $DirData =~ /^\./) { + if (! $DirData || $DirData eq '.') { $DirData="$DIR"; } # If not defined or chosen to '.' value then DirData is current dir + elsif ($DIR && $DIR ne '.') { $DirData="$DIR/$DirData"; } + } + $DirData||='.'; # If current dir not defined then we put it to '.' + $DirData =~ s/[\\\/]+$//; + print "Start migration for file '$MigrateStats'."; print $ENV{'GATEWAY_INTERFACE'}?"
    \n":"\n"; + if ($EnableLockForUpdate) { &Lock_Update(1); } + my $newhistory=&Read_History_With_TmpUpdate($YearRequired,$MonthRequired,1,0,'all'); + if (rename("$newhistory","$MigrateStats")==0) { + unlink "$newhistory"; + error("Failed to rename \"$newhistory\" into \"$MigrateStats\".\nWrite permissions on \"$MigrateStats\" might be wrong".($ENV{'GATEWAY_INTERFACE'}?" for a 'migration from web'":"")." or file might be opened."); + } + if ($EnableLockForUpdate) { &Lock_Update(0); } + print "Migration for file '$MigrateStats' successful."; print $ENV{'GATEWAY_INTERFACE'}?"
    \n":"\n"; + &html_end(1); + exit 0; +} + +# Output main frame page and exit. This must be after the security check. +if ($FrameName eq 'index') { + # Define the NewLinkParams for main chart + my $NewLinkParams=${QueryString}; + $NewLinkParams =~ s/(^|&)framename=[^&]*//i; + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } + # Exit if main frame + print "\n"; + print "\n"; + print "\n"; + print "<body>"; + print "Your browser does not support frames.<br />\n"; + print "You must set AWStats UseFramesWhenCGI parameter to 0\n"; + print "to see your reports.<br />\n"; + print "</body>\n"; + print "\n"; + &html_end(0); + exit 0; +} + +%MonthNumLib = ("01","$Message[60]","02","$Message[61]","03","$Message[62]","04","$Message[63]","05","$Message[64]","06","$Message[65]","07","$Message[66]","08","$Message[67]","09","$Message[68]","10","$Message[69]","11","$Message[70]","12","$Message[71]"); + +# Build ListOfYears list with all existing years +if ($Debug) { debug("Scan for last history files into DirData='$DirData'"); } +$lastyearbeforeupdate=0; +opendir(DIR,"$DirData"); +foreach (grep /^$PROG(\d\d)(\d\d\d\d)$FileSuffix\.txt(|\.gz)$/, sort readdir DIR) { + /^$PROG(\d\d)(\d\d\d\d)$FileSuffix\.txt(|\.gz)$/; + if (! $ListOfYears{"$2"} || "$1" gt $ListOfYears{"$2"}) { + $ListOfYears{"$2"}="$1"; # ListOfYears contains max month found + if ("$2" gt $lastyearbeforeupdate) { $lastyearbeforeupdate="$2"; } + } +} +close DIR; + +# Get value for LastLine +if ($lastyearbeforeupdate) { + # Read 'general' section of last history file for LastLine + &Read_History_With_TmpUpdate($lastyearbeforeupdate,$ListOfYears{$lastyearbeforeupdate},0,0,"general"); +} +if ($Debug) { + debug("Last year=$lastyearbeforeupdate - Last month=$ListOfYears{$lastyearbeforeupdate}"); + debug("LastLine=$LastLine"); + debug("LastLineNumber=$LastLineNumber"); + debug("LastLineOffset=$LastLineOffset"); + debug("LastLineChecksum=$LastLineChecksum"); +} + +# Init vars +&Init_HashArray(); + + +#------------------------------------------ +# UPDATE PROCESS +#------------------------------------------ +my $lastlinenb=0; my $lastlineoffset=0; my $lastlineoffsetnext=0; + +if ($Debug) { debug("UpdateStats is $UpdateStats",2); } +if ($UpdateStats && $FrameName ne 'index' && $FrameName ne 'mainleft') { # Update only on index page or when not framed to avoid update twice + + my %MonthNum = ("Jan","01","ene","01","Feb","02","feb","02","Mar","03","mar","03","Apr","04","abr","04","May","05","may","05","Jun","06","jun","06","Jul","07","jul","07","Aug","08","ago","08","Sep","09","sep","09","Oct","10","oct","10","Nov","11","nov","11","Dec","12","dic","12"); # MonthNum must be in english because used to translate log date in apache log files + + if (! scalar keys %HTMLOutput) { + print "Update for config \"$FileConfig\"\n"; + print "With data in log file \"$LogFile\"...\n"; + } + + my $lastprocessedyear=$lastyearbeforeupdate; + my $lastprocessedmonth=$ListOfYears{$lastyearbeforeupdate}||0; + my $lastprocessedyearmonth=sprintf("%04i%02i",$lastprocessedyear,$lastprocessedmonth); + + my @list; + # Init RobotsSearchIDOrder required for update process + @list=(); + if ($LevelForRobotsDetection >= 1) { + foreach (1..$LevelForRobotsDetection) { push @list,"list$_"; } + push @list,"listgen"; # Always added + } + foreach my $key (@list) { + push @RobotsSearchIDOrder,@{"RobotsSearchIDOrder_$key"}; + if ($Debug) { debug("Add ".@{"RobotsSearchIDOrder_$key"}." elements from RobotsSearchIDOrder_$key into RobotsSearchIDOrder",2); } + } + if ($Debug) { debug("RobotsSearchIDOrder has now ".@RobotsSearchIDOrder." elements",1); } + # Init SearchEnginesIDOrder required for update process + @list=(); + if ($LevelForSearchEnginesDetection >= 1) { + foreach (1..$LevelForSearchEnginesDetection) { push @list,"list$_"; } + push @list,"listgen"; # Always added + } + foreach my $key (@list) { + push @SearchEnginesSearchIDOrder,@{"SearchEnginesSearchIDOrder_$key"}; + if ($Debug) { debug("Add ".@{"SearchEnginesSearchIDOrder_$key"}." elements from SearchEnginesSearchIDOrder_$key into SearchEnginesSearchIDOrder",2); } + } + if ($Debug) { debug("SearchEnginesSearchIDOrder has now ".@SearchEnginesSearchIDOrder." elements",1); } + + # Complete HostAliases array + my $sitetoanalyze=quotemeta(lc($SiteDomain)); + if (! @HostAliases) { + warning("Warning: HostAliases parameter is not defined, $PROG choose \"$SiteDomain localhost 127.0.0.1\"."); + push @HostAliases,qr/^$sitetoanalyze$/i; push @HostAliases,qr/^localhost$/i; push @HostAliases,qr/^127\.0\.0\.1$/i; + } + else { unshift @HostAliases,qr/^$sitetoanalyze$/i; } # Add SiteDomain as first value + + # Optimize arrays + @HostAliases=&OptimizeArray(\@HostAliases,1); if ($Debug) { debug("HostAliases precompiled regex list is now @HostAliases",1); } + @SkipDNSLookupFor=&OptimizeArray(\@SkipDNSLookupFor,1); if ($Debug) { debug("SkipDNSLookupFor precompiled regex list is now @SkipDNSLookupFor",1); } + @SkipHosts=&OptimizeArray(\@SkipHosts,1); if ($Debug) { debug("SkipHosts precompiled regex list is now @SkipHosts",1); } + @SkipUserAgents=&OptimizeArray(\@SkipUserAgents,1); if ($Debug) { debug("SkipUserAgents precompiled regex list is now @SkipUserAgents",1); } + @SkipFiles=&OptimizeArray(\@SkipFiles,$URLNotCaseSensitive); if ($Debug) { debug("SkipFiles precompiled regex list is now @SkipFiles",1); } + @OnlyHosts=&OptimizeArray(\@OnlyHosts,1); if ($Debug) { debug("OnlyHosts precompiled regex list is now @OnlyHosts",1); } + @OnlyUserAgents=&OptimizeArray(\@OnlyUserAgents,1); if ($Debug) { debug("OnlyUserAgents precompiled regex list is now @OnlyUserAgents",1); } +#Params OnlyXXX defined by E-Lane + @OnlyUsers=&OptimizeArray(\@OnlyUsers,1); if ($Debug) { debug("OnlyUsers precompiled regex list is now @OnlyUsers",1); } + @OnlyLines=&OptimizeArray(\@OnlyLines,1); if ($Debug) { debug("OnlyLines precompiled regex list is now @OnlyLines",1); } + @OnlyFiles=&OptimizeArray(\@OnlyFiles,$URLNotCaseSensitive); if ($Debug) { debug("OnlyFiles precompiled regex list is now @OnlyFiles",1); } + # Precompile the regex search strings with qr + @RobotsSearchIDOrder=map{qr/$_/i} @RobotsSearchIDOrder; + @WormsSearchIDOrder=map{qr/$_/i} @WormsSearchIDOrder; + @BrowsersSearchIDOrder=map{qr/$_/i} @BrowsersSearchIDOrder; + @OSSearchIDOrder=map{qr/$_/i} @OSSearchIDOrder; + @SearchEnginesSearchIDOrder=map{qr/$_/i} @SearchEnginesSearchIDOrder; + my $miscquoted=quotemeta("$MiscTrackerUrl"); + my $defquoted=quotemeta("/$DefaultFile[0]"); + my $sitewithoutwww=lc($SiteDomain); $sitewithoutwww =~ s/www\.//; $sitewithoutwww=quotemeta($sitewithoutwww); + # Define precompiled regex + my $regmisc=qr/^$miscquoted/; + my $regfavico=qr/\/favicon\.ico$/i; + my $regrobot=qr/^\/robots\.txt$/i; + my $regtruncanchor=qr/#(\w*)$/; + my $regtruncurl=qr/([$URLQuerySeparators])(.*)$/; + my $regext=qr/\.(\w{1,6})$/; + my $regdefault; + if ($URLNotCaseSensitive) { $regdefault=qr/$defquoted$/i; } + else { $regdefault=qr/$defquoted$/; } + my $regipv4=qr/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; + my $regipv6=qr/^[0-9A-F]*:/i; + my $regvermsie=qr/msie([+_ ]|)([\d\.]*)/i; + my $regvernetscape=qr/netscape.?\/([\d\.]*)/i; + my $regvermozilla=qr/mozilla(\/|)([\d\.]*)/i; + my $regnotie=qr/webtv|omniweb|opera/i; + my $regnotnetscape=qr/gecko|compatible|opera|galeon|safari/i; + my $regreferer=qr/^(\w+):\/\/([^\/:]+)(:\d+|)/; + my $regreferernoquery=qr/^([^$URLQuerySeparators]+)/; + my $reglocal=qr/^(www\.|)$sitewithoutwww/i; + my $regget=qr/get/i; + my $regsent=qr/sent/i; + my $regput=qr/put/i; + + # Define value of $PerlParsingFormat and @fieldlib + &DefinePerlParsingFormat(); + + # Load DNS Cache Files + #------------------------------------------ + if ($DNSLookup) { + &Read_DNS_Cache(\%MyDNSTable,"$DNSStaticCacheFile","",1); # Load with save into a second plugin file if plugin enabled and second file not up to date. No use of FileSuffix + if ($DNSLookup == 1) { # System DNS lookup required + #if (! eval("use Socket;")) { error("Failed to load perl module Socket."); } + #use Socket; + &Read_DNS_Cache(\%TmpDNSLookup,"$DNSLastUpdateCacheFile","$FileSuffix",0); # Load with no save into a second plugin file. Use FileSuffix + } + } + + # Processing log + #------------------------------------------ + + if ($EnableLockForUpdate) { + # Trap signals to remove lock + $SIG{INT} = \&SigHandler; # 2 + #$SIG{KILL} = \&SigHandler; # 9 + #$SIG{TERM} = \&SigHandler; # 15 + # Set AWStats update lock + &Lock_Update(1); + } + + if ($Debug) { debug("Start Update process (lastprocessedmonth=$lastprocessedmonth, lastprocessedyear=$lastprocessedyear)"); } + + # Open log file + if ($Debug) { debug("Open log file \"$LogFile\""); } + open(LOG,"$LogFile") || error("Couldn't open server log file \"$LogFile\" : $!"); + binmode LOG; # Avoid premature EOF due to log files corrupted with \cZ or bin chars + + # Define local variables for loop scan + my @field=(); + my $counterforflushtest=0; + my $qualifdrop=''; + my $countedtraffic=0; + # Reset chrono for benchmark (first call to GetDelaySinceStart) + &GetDelaySinceStart(1); + if (! scalar keys %HTMLOutput) { print "Phase 1 : First bypass old records, searching new record...\n"; } + + # Can we try a direct seek access in log ? + my $line; + if ($LastLine && $LastLineNumber && $LastLineOffset && $LastLineChecksum) { + # Try a direct seek access to save time + if ($Debug) { debug("Try a direct access to LastLine=$LastLine, LastLineNumber=$LastLineNumber, LastLineOffset=$LastLineOffset, LastLineChecksum=$LastLineChecksum"); } + seek(LOG,$LastLineOffset,0); + if ($line=) { + chomp $line; $line =~ s/\r$//; + @field=map(/$PerlParsingFormat/,$line); + if ($Debug) { + my $string=''; + foreach (0..@field-1) { $string.="$fieldlib[$_]=$field[$_] "; } + if ($Debug) { debug(" Read line after direct access: $string",1); } + } + my $checksum=&CheckSum($line); + if ($Debug) { debug(" LastLineChecksum=$LastLineChecksum, Read line checksum=$checksum",1); } + if ($checksum == $LastLineChecksum ) { + if (! scalar keys %HTMLOutput) { print "Direct access after last parsed record (after line $LastLineNumber)\n"; } + $lastlinenb=$LastLineNumber; + $lastlineoffset=$LastLineOffset; + $lastlineoffsetnext=tell LOG; + $NewLinePhase=1; + } + else { + if (! scalar keys %HTMLOutput) { print "Direct access to last remembered record has fallen on another record.\nSo searching new records from beginning of log file...\n"; } + $lastlinenb=0; + $lastlineoffset=0; + $lastlineoffsetnext=0; + seek(LOG,0,0); + } + } + else { + if (! scalar keys %HTMLOutput) { print "Direct access to last remembered record is out of file.\nSo searching it from beginning of log file...\n"; } + $lastlinenb=0; + $lastlineoffset=0; + $lastlineoffsetnext=0; + seek(LOG,0,0); + } + } + else { + # No try of direct seek access + if (! scalar keys %HTMLOutput) { print "Searching new records from beginning of log file...\n"; } + $lastlinenb=0; + $lastlineoffset=0; + $lastlineoffsetnext=0; + } + + while ($line=) { + chomp $line; $line =~ s/\r$//; + if ($UpdateFor && $NbOfLinesParsed >= $UpdateFor) { last; } + $NbOfLinesParsed++; + + $lastlineoffset=$lastlineoffsetnext; $lastlineoffsetnext=tell LOG; + + if ($ShowSteps) { + if ((++$NbOfLinesShowsteps & $NBOFLINESFORBENCHMARK) == 0) { + my $delay=&GetDelaySinceStart(0); + print "$NbOfLinesParsed lines processed (".($delay>0?$delay:1000)." ms, ".int(1000*$NbOfLinesShowsteps/($delay>0?$delay:1000))." lines/second)\n"; + } + } + + # Parse line record to get all required fields + if (! (@field=map(/$PerlParsingFormat/,$line))) { + $NbOfLinesCorrupted++; + if ($ShowCorrupted) { + if ($line =~ /^#/ || $line =~ /^!/) { print "Corrupted record line ".($lastlinenb+$NbOfLinesParsed)." (comment line): $line\n"; } + elsif ($line =~ /^\s*$/) { print "Corrupted record line ".($lastlinenb+$NbOfLinesParsed)." (blank line)\n"; } + else { print "Corrupted record line ".($lastlinenb+$NbOfLinesParsed)." (record format does not match LogFormat parameter): $line\n"; } + } + if ($NbOfLinesParsed >= $NbOfLinesForCorruptedLog && $NbOfLinesParsed == $NbOfLinesCorrupted) { error("Format error",$line,$LogFile); } # Exit with format error + if ($line =~ /^__end_of_file__/i) { last; } # For test purpose only + next; + } + + if ($Debug) { + my $string=''; + foreach (0..@field-1) { $string.="$fieldlib[$_]=$field[$_] "; } + if ($Debug) { debug(" Correct format line ".($lastlinenb+$NbOfLinesParsed).": $string",4); } + } + + # Drop wrong virtual host name + #---------------------------------------------------------------------- + if ($pos_vh>=0 && $field[$pos_vh] !~ /^$SiteDomain$/i) { + my $skip=1; + foreach (@HostAliases) { + if ($field[$pos_vh] =~ /$_/) { $skip=0; last; } + } + if ($skip) { + $NbOfLinesDropped++; + if ($ShowDropped) { print "Dropped record (virtual hostname '$field[$pos_vh]' does not match SiteDomain='$SiteDomain' nor HostAliases parameters): $line\n"; } + next; + } + } + + # Drop wrong method/protocol + #--------------------------- + if ($LogType ne 'M') { $field[$pos_url] =~ s/\s/%20/g; } + if ($LogType eq 'W' && ($field[$pos_method] eq 'GET' || $field[$pos_method] eq 'POST' || $field[$pos_method] eq 'HEAD' || $field[$pos_method] =~ /OK/i || $field[$pos_method] =~ /ERR\!/i)) { + # HTTP request. Keep only GET, POST, HEAD, *OK* and ERR! for Webstar. Do not keep OPTIONS, TRACE + } + elsif (($LogType eq 'W' || $LogType eq 'S') && ($field[$pos_method] eq 'GET' || $field[$pos_method] eq 'mms' || $field[$pos_method] eq 'rtsp' || $field[$pos_method] eq 'http' || $field[$pos_method] eq 'RTP')) { + # Streaming request (windows media server, realmedia or darwin streaming server) + } + elsif ($LogType eq 'M' && $field[$pos_method] eq 'SMTP') { + # Mail request ('SMTP' for mail log with maillogconvert.pl preprocessor) + } + elsif ($LogType eq 'F' && ($field[$pos_method] eq 'RETR' || $field[$pos_method] eq 'o' || $field[$pos_method] =~ /$regget/o)) { + # FTP GET request + } + elsif ($LogType eq 'F' && ($field[$pos_method] eq 'STOR' || $field[$pos_method] eq 'i' || $field[$pos_method] =~ /$regsent/o || $field[$pos_method] =~ /$regput/o)) { + # FTP SENT request + } + else { + $NbOfLinesDropped++; + if ($ShowDropped) { print "Dropped record (method/protocol '$field[$pos_method]' not qualified when LogType=$LogType): $line\n"; } + next; + } + + $field[$pos_date] =~ tr/,-\/ \t/:::::/s; # " \t" is used instead of "\s" not known with tr + my @dateparts=split(/:/,$field[$pos_date]); # tr and split faster than @dateparts=split(/[\/\-:\s]/,$field[$pos_date]) + # Detected date format: dddddddddd, YYYY-MM-DD HH:MM:SS (IIS), MM/DD/YY\tHH:MM:SS, + # DD/Month/YYYY:HH:MM:SS (Apache), DD/MM/YYYY HH:MM:SS, Mon DD HH:MM:SS + if (! $dateparts[1]) { # Unix timestamp + ($dateparts[5],$dateparts[4],$dateparts[3],$dateparts[0],$dateparts[1],$dateparts[2]) = localtime(int($field[$pos_date])); + $dateparts[1]++;$dateparts[2]+=1900; + } + elsif ($dateparts[0] =~ /^....$/) { my $tmp=$dateparts[0]; $dateparts[0]=$dateparts[2]; $dateparts[2]=$tmp; } + elsif ($field[$pos_date] =~ /^..:..:..:/) { $dateparts[2]+=2000; my $tmp=$dateparts[0]; $dateparts[0]=$dateparts[1]; $dateparts[1]=$tmp; } + elsif ($dateparts[0] =~ /^...$/) { my $tmp=$dateparts[0]; $dateparts[0]=$dateparts[1]; $dateparts[1]=$tmp; $tmp=$dateparts[5]; $dateparts[5]=$dateparts[4]; $dateparts[4]=$dateparts[3]; $dateparts[3]=$dateparts[2]; $dateparts[2]=$tmp||$nowyear; } + if ($MonthNum{$dateparts[1]}) { $dateparts[1]=$MonthNum{$dateparts[1]}; } # Change lib month in num month if necessary + + # Now @dateparts is (DD,MM,YYYY,HH,MM,SS) and we're going to create $timerecord=YYYYMMDDHHMMSS + # Plugin call : Convert a @datepart into another @datepart + if ($PluginsLoaded{'ChangeTime'}{'timezone'}) { @dateparts=ChangeTime_timezone(\@dateparts); } + my $yearrecord=int($dateparts[2]); + my $monthrecord=int($dateparts[1]); + my $hourrecord=int($dateparts[3]); + my $yearmonthdayrecord=sprintf("$dateparts[2]%02i%02i",$dateparts[1],$dateparts[0]); + my $timerecord=((int("$yearmonthdayrecord")*100+$dateparts[3])*100+$dateparts[4])*100+$dateparts[5]; + + # Check date + #----------------------- + if ($LogType eq 'M' && $timerecord > $tomorrowtime) { + # Postfix/Sendmail does not store year, so we assume that year is year-1 if record is in future + $yearrecord--; + $yearmonthdayrecord=sprintf("$yearrecord%02i%02i",$dateparts[1],$dateparts[0]); + $timerecord=((int("$yearmonthdayrecord")*100+$dateparts[3])*100+$dateparts[4])*100+$dateparts[5]; + } + if ($timerecord < 10000000000000 || $timerecord > $tomorrowtime) { + $NbOfLinesCorrupted++; + if ($ShowCorrupted) { print "Corrupted record (invalid date, timerecord=$timerecord): $line\n"; } + next; # Should not happen, kept in case of parasite/corrupted line + } + if ($NewLinePhase) { +# TODO NOTSORTEDRECORDTOLERANCE does not work around midnight + if ($timerecord < ($LastLine - $NOTSORTEDRECORDTOLERANCE)) { + # Should not happen, kept in case of parasite/corrupted old line + $NbOfLinesCorrupted++; + if ($ShowCorrupted) { print "Corrupted record (date $timerecord lower than $LastLine-$NOTSORTEDRECORDTOLERANCE): $line\n"; } next; + } + } + else { + if ($timerecord <= $LastLine) { # Already processed + $NbOfOldLines++; + next; + } + # We found a new line. This will replace comparison "<=" with "<" between timerecord and LastLine (we should have only new lines now) + $NewLinePhase=1; # We will never enter here again + if ($ShowSteps) { + if ($NbOfLinesShowsteps > 1 && ($NbOfLinesShowsteps & $NBOFLINESFORBENCHMARK)) { + my $delay=&GetDelaySinceStart(0); + print "".($NbOfLinesParsed-1)." lines processed (".($delay>0?$delay:1000)." ms, ".int(1000*($NbOfLinesShowsteps-1)/($delay>0?$delay:1000))." lines/second)\n"; + } + &GetDelaySinceStart(1); $NbOfLinesShowsteps=1; + } + if (! scalar keys %HTMLOutput) { + print "Phase 2 : Now process new records (Flush history on disk after ".($LIMITFLUSH<<2)." hosts)...\n"; + #print "Phase 2 : Now process new records (Flush history on disk after ".($LIMITFLUSH<<2)." hosts or ".($LIMITFLUSH)." URLs)...\n"; + } + } + + # Convert URL for Webstar to common URL + if ($LogFormat eq '3') { + $field[$pos_url]=~s/:/\//g; + if ($field[$pos_code] eq '-') { $field[$pos_code]='200'; } + } + + # Here, field array, timerecord and yearmonthdayrecord are initialized for log record + if ($Debug) { debug(" This is a not already processed record ($timerecord)",4); } + + # We found a new line + #---------------------------------------- + if ($timerecord > $LastLine) { $LastLine = $timerecord; } # Test should always be true except with not sorted log files + + # Skip for some client host IP addresses, some URLs, other URLs + if (@SkipHosts && (&SkipHost($field[$pos_host]) || ($pos_hostr && &SkipHost($field[$pos_hostr])))) { $qualifdrop="Dropped record (host $field[$pos_host]".($pos_hostr?" and $field[$pos_hostr]":"")." not qualified by SkipHosts)"; } + elsif (@SkipFiles && &SkipFile($field[$pos_url])) { $qualifdrop="Dropped record (URL $field[$pos_url] not qualified by SkipFiles)"; } + elsif (@SkipUserAgents && $pos_agent >= 0 && &SkipUserAgent($field[$pos_agent])) { $qualifdrop="Dropped record (user agent '$field[$pos_agent]' not qualified by SkipUserAgents)"; } + elsif (@OnlyHosts && ! &OnlyHost($field[$pos_host]) && (! $pos_hostr || ! &OnlyHost($field[$pos_hostr]))) { $qualifdrop="Dropped record (host $field[$pos_host]".($pos_hostr?" and $field[$pos_hostr]":"")." not qualified by OnlyHosts)"; } + elsif (@OnlyFiles && ! &OnlyFile($field[$pos_url])) { $qualifdrop="Dropped record (URL $field[$pos_url] not qualified by OnlyFiles)"; } + elsif (@OnlyUserAgents && ! &OnlyUserAgent($field[$pos_agent])) { $qualifdrop="Dropped record (user agent '$field[$pos_agent]' not qualified by OnlyUserAgents)"; } +#Params OnlyXXX defined by E-Lane + elsif (@OnlyUsers && ! &OnlyUser($field[$pos_logname])) { $qualifdrop="Used record (user '$field[$pos_logname]' qualified by OnlyUsers)"; } + elsif (@OnlyLines && ! &OnlyLine($line)) { $qualifdrop="Used line ('$field[$pos_logname]' qualified by OnlyLines)"; } + if ($qualifdrop) { + $NbOfLinesDropped++; + if ($Debug) { debug("$qualifdrop: $line",4); } + if ($ShowDropped) { print "$qualifdrop: $line\n"; } + $qualifdrop=''; + next; + } + + # Record is approved + #------------------- + + # Is it in a new month section ? + #------------------------------- + if ((($monthrecord > $lastprocessedmonth) && ($yearrecord >= $lastprocessedyear)) || ($yearrecord > $lastprocessedyear)) { + # A new month to process + if ($lastprocessedmonth) { + # We save data of processed month + &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenb+$NbOfLinesParsed),$lastlineoffset,&CheckSum($line)); + $counterforflushtest=0; # We reset counterforflushtest + } + $lastprocessedyearmonth=sprintf("%04i%02i",$lastprocessedyear=$yearrecord,$lastprocessedmonth=$monthrecord); + } + + $countedtraffic=0; + $NbOfNewLines++; + + # Convert $field[$pos_size] + # if ($field[$pos_size] eq '-') { $field[$pos_size]=0; } + + # Define a clean target URL and referrer URL + # We keep a clean $field[$pos_url] and + # we store original value for urlwithnoquery, tokenquery and standalonequery + #--------------------------------------------------------------------------- + if ($URLNotCaseSensitive) { $field[$pos_url]=lc($field[$pos_url]); } + # Possible URL syntax for $field[$pos_url]: /mydir/mypage.ext?param1=x¶m2=y#aaa, /mydir/mypage.ext#aaa, / + my $urlwithnoquery; my $tokenquery; my $standalonequery; my $anchor=''; + if ($field[$pos_url] =~ s/$regtruncanchor//o) { $anchor=$1; } # Remove and save anchor + if ($URLWithQuery) { + $urlwithnoquery=$field[$pos_url]; + my $foundparam=($urlwithnoquery =~ s/$regtruncurl//o); + $tokenquery=$1||''; + $standalonequery=$2||''; + # For IIS setup, if pos_query is enabled we need to combine the URL to query strings + if (! $foundparam && $pos_query >=0 && $field[$pos_query] && $field[$pos_query] ne '-') { + $foundparam=1; + $tokenquery='?'; + $standalonequery=$field[$pos_query]; + # Define query + $field[$pos_url] .= '?'.$field[$pos_query]; + } + if ($foundparam) { + # Keep only params that are defined in URLWithQueryWithOnlyFollowingParameters + my $newstandalonequery=''; + if (@URLWithQueryWithOnly) { + foreach (@URLWithQueryWithOnly) { + foreach my $p (split(/&/,$standalonequery)) { + if ($URLNotCaseSensitive) { if ($p =~ /^$_=/i) { $newstandalonequery.="$p&"; last; } } + else { if ($p =~ /^$_=/) { $newstandalonequery.="$p&"; last; } } + } + } + chop $newstandalonequery; + } + # Remove params that are marked to be ignored in URLWithQueryWithoutFollowingParameters + elsif (@URLWithQueryWithout) { + foreach my $p (split(/&/,$standalonequery)) { + my $found=0; + foreach (@URLWithQueryWithout) { + #if ($Debug) { debug(" Check if '$_=' is param '$p' to remove it from query",5); } + if ($URLNotCaseSensitive) { if ($p =~ /^$_=/i) { $found=1; last; } } + else { if ($p =~ /^$_=/) { $found=1; last; } } + } + if (! $found) { $newstandalonequery.="$p&"; } + } + chop $newstandalonequery; + } + else { $newstandalonequery=$standalonequery; } + # Define query + $field[$pos_url]=$urlwithnoquery; + if ($newstandalonequery) { $field[$pos_url].="$tokenquery$newstandalonequery"; } + } + } + else { + # Trunc parameters of URL + $field[$pos_url] =~ s/$regtruncurl//o; + $urlwithnoquery=$field[$pos_url]; + $tokenquery=$1||''; + $standalonequery=$2||''; + # For IIS setup, if pos_query is enabled we need to use it for query strings + if ($pos_query >=0 && $field[$pos_query] && $field[$pos_query] ne '-') { + $tokenquery='?'; + $standalonequery=$field[$pos_query]; + } + } + if ($URLWithAnchor && $anchor) { $field[$pos_url].="#$anchor"; } # Restore anchor + # Here now urlwithnoquery is /mydir/mypage.ext, /mydir, /, /page#XXX + # Here now tokenquery is '' or '?' or ';' + # Here now standalonequery is '' or 'param1=x' + + # Define page and extension + #-------------------------- + my $PageBool=1; + # Extension + my $extension; + if ($urlwithnoquery =~ /$regext/o || ($urlwithnoquery =~ /[\\\/]$/ && $DefaultFile[0] =~ /$regext/o)) { + $extension=($LevelForFileTypesDetection>=2 || $MimeHashFamily{$1})?lc($1):'Unknown'; + if ($NotPageList{$extension}) { $PageBool=0; } + } + else { + $extension='Unknown'; + } + + # Analyze: misc tracker (must be before return code) + #--------------------------------------------------- + if ($urlwithnoquery =~ /$regmisc/o) { + if ($Debug) { debug(" Found an URL that is a MiscTracker record with standalonequery=$standalonequery",2); } + my $foundparam=0; + foreach (split(/&/,$standalonequery)) { + if ($_ =~ /^screen=(\d+)x(\d+)/i) { $foundparam++; $_screensize_h{"$1x$2"}++; next; } + #if ($_ =~ /cdi=(\d+)/i) { $foundparam++; $_screendepth_h{"$1"}++; next; } + if ($_ =~ /^nojs=(\w+)/i) { $foundparam++; if ($1 eq 'y') { $_misc_h{"JavascriptDisabled"}++; } next; } + if ($_ =~ /^java=(\w+)/i) { $foundparam++; if ($1 eq 'true') { $_misc_h{"JavaEnabled"}++; } next; } + if ($_ =~ /^shk=(\w+)/i) { $foundparam++; if ($1 eq 'y') { $_misc_h{"DirectorSupport"}++; } next; } + if ($_ =~ /^fla=(\w+)/i) { $foundparam++; if ($1 eq 'y') { $_misc_h{"FlashSupport"}++; } next; } + if ($_ =~ /^rp=(\w+)/i) { $foundparam++; if ($1 eq 'y') { $_misc_h{"RealPlayerSupport"}++; } next; } + if ($_ =~ /^mov=(\w+)/i) { $foundparam++; if ($1 eq 'y') { $_misc_h{"QuickTimeSupport"}++; } next; } + if ($_ =~ /^wma=(\w+)/i) { $foundparam++; if ($1 eq 'y') { $_misc_h{"WindowsMediaPlayerSupport"}++; } next; } + if ($_ =~ /^pdf=(\w+)/i) { $foundparam++; if ($1 eq 'y') { $_misc_h{"PDFSupport"}++; } next; } + } + if ($foundparam) { $_misc_h{"TotalMisc"}++; } + } + + # Analyze: favicon (countedtraffic=>1) + #------------------------------------- + if ($pos_referer >= 0 && $field[$pos_referer] && $urlwithnoquery =~ /$regfavico/o) { + if (($field[$pos_code] != 404 || $urlwithnoquery !~ /\/.+\/favicon\.ico$/i) && ($field[$pos_agent] =~ /MSIE/)) { + # We don't count one hit if (not on root and error) and MSIE + # If error not on root, another hit will be made on root. If not MSIE, hit are made not only for "Adding". + $_misc_h{'AddToFavourites'}++; # Hit on favicon on root or without error, we count it + } + $countedtraffic=1; # favicon is the only case not counted anywhere + } + + # Analyze: Worms (countedtraffic=>1 if worm) + #------------------------------------------- + if (! $countedtraffic) { + if ($LevelForWormsDetection) { + foreach (@WormsSearchIDOrder) { + if ($field[$pos_url] =~ /$_/) { + # It's a worm + my $worm=&UnCompileRegex($_); + if ($Debug) { debug(" Record is a hit from a worm identified by '$worm'",2); } + $worm=$WormsHashID{$worm}||'unknown'; + $_worm_h{$worm}++; + $_worm_k{$worm}+=int($field[$pos_size]); + $_worm_l{$worm}=$timerecord; + $countedtraffic=1; + if ($PageBool) { $_time_nv_p[$hourrecord]++; } + $_time_nv_h[$hourrecord]++; + $_time_nv_k[$hourrecord]+=int($field[$pos_size]); + last; + } + } + } + } + + # Analyze: Status code (countedtraffic=>1 if error) + #-------------------------------------------------- + if (! $countedtraffic) { + if ($LogType eq 'W' || $LogType eq 'S') { # HTTP record or Stream record + if ($ValidHTTPCodes{$field[$pos_code]}) { # Code is valid + if ($field[$pos_code] == 304) { $field[$pos_size]=0; } + } + else { # Code is not valid + if ($field[$pos_code] !~ /^\d\d\d$/) { $field[$pos_code]=999; } + $_errors_h{$field[$pos_code]}++; + $_errors_k{$field[$pos_code]}+=int($field[$pos_size]); + foreach my $code (keys %TrapInfosForHTTPErrorCodes) { + if ($field[$pos_code] == $code) { + # This is an error code which referrer need to be tracked + my $newurl=substr($field[$pos_url],0,$MaxLengthOfStoredURL); + $newurl =~ s/[$URLQuerySeparators].*$//; + $_sider404_h{$newurl}++; + my $newreferer=$field[$pos_referer]; + if (! $URLReferrerWithQuery) { $newreferer =~ s/[$URLQuerySeparators].*$//; } + $_referer404_h{$newurl}=$newreferer; + last; + } + } + if ($Debug) { debug(" Record stored in the status code chart (status code=$field[$pos_code])",2); } + $countedtraffic=1; + if ($PageBool) { $_time_nv_p[$hourrecord]++; } + $_time_nv_h[$hourrecord]++; + $_time_nv_k[$hourrecord]+=int($field[$pos_size]); + } + } + elsif ($LogType eq 'M') { # Mail record + if (! $ValidSMTPCodes{$field[$pos_code]}) { # Code is not valid + $_errors_h{$field[$pos_code]}++; + $_errors_k{$field[$pos_code]}+=int($field[$pos_size]); # Size is often 0 when error + if ($Debug) { debug(" Record stored in the status code chart (status code=$field[$pos_code])",2); } + $countedtraffic=1; + if ($PageBool) { $_time_nv_p[$hourrecord]++; } + $_time_nv_h[$hourrecord]++; + $_time_nv_k[$hourrecord]+=int($field[$pos_size]); + } + } + elsif ($LogType eq 'F') { # FTP record + } + } + + # Analyze: Robot from robot database (countedtraffic=>1 if robot) + #---------------------------------------------------------------- + if (! $countedtraffic) { + if ($pos_agent >= 0) { + if ($DecodeUA) { $field[$pos_agent] =~ s/%20/_/g; } # This is to support servers (like Roxen) that writes user agent with %20 in it + $UserAgent=$field[$pos_agent]; + + if ($LevelForRobotsDetection) { + + my $uarobot=$TmpRobot{$UserAgent}; + if (! $uarobot) { + #study $UserAgent; Does not increase speed + foreach (@RobotsSearchIDOrder) { + if ($UserAgent =~ /$_/) { + my $bot=&UnCompileRegex($_); + $TmpRobot{$UserAgent}=$uarobot="$bot"; # Last time, we won't search if robot or not. We know it is. + if ($Debug) { debug(" UserAgent '$UserAgent' is added to TmpRobot with value '$bot'",2); } + last; + } + } + if (! $uarobot) { # Last time, we won't search if robot or not. We know it's not. + $TmpRobot{$UserAgent}=$uarobot='-'; + } + } + if ($uarobot ne '-') { + # If robot, we stop here + if ($Debug) { debug(" UserAgent '$UserAgent' contains robot ID '$uarobot'",2); } + $_robot_h{$uarobot}++; + $_robot_k{$uarobot}+=int($field[$pos_size]); + $_robot_l{$uarobot}=$timerecord; + if ($urlwithnoquery =~ /$regrobot/o) { $_robot_r{$uarobot}++; } + $countedtraffic=1; + if ($PageBool) { $_time_nv_p[$hourrecord]++; } + $_time_nv_h[$hourrecord]++; + $_time_nv_k[$hourrecord]+=int($field[$pos_size]); + } + } + } + } + + # Analyze: Robot from "hit on robots.txt" file (countedtraffic=>1 if robot) + # ------------------------------------------------------------------------- + if (! $countedtraffic) { + if ($urlwithnoquery =~ /$regrobot/o) { + if ($Debug) { debug(" It's an unknown robot",2); } + $_robot_h{'unknown'}++; + $_robot_k{'unknown'}+=int($field[$pos_size]); + $_robot_l{'unknown'}=$timerecord; + $_robot_r{'unknown'}++; + $countedtraffic=1; + if ($PageBool) { $_time_nv_p[$hourrecord]++; } + $_time_nv_h[$hourrecord]++; + $_time_nv_k[$hourrecord]+=int($field[$pos_size]); + } + } + + # Analyze: File type - Compression + #--------------------------------- + if (! $countedtraffic) { + if ($LevelForFileTypesDetection) { + $_filetypes_h{$extension}++; + $_filetypes_k{$extension}+=int($field[$pos_size]); # TODO can cause a warning + # Compression + if ($pos_gzipin>=0 && $field[$pos_gzipin]) { # If in and out in log + my ($notused,$in)=split(/:/,$field[$pos_gzipin]); + my ($notused1,$out,$notused2)=split(/:/,$field[$pos_gzipout]); + if ($out) { + $_filetypes_gz_in{$extension}+=$in; + $_filetypes_gz_out{$extension}+=$out; + } + } + elsif ($pos_compratio>=0 && ($field[$pos_compratio] =~ /(\d+)/)) { # Calculate in/out size from percentage + if ($fieldlib[$pos_compratio] eq 'gzipratio') { + # with mod_gzip: % is size (before-after)/before (low for jpg) ?????????? + $_filetypes_gz_in{$extension}+=int($field[$pos_size]*100/((100-$1)||1)); + } else { + # with mod_deflate: % is size after/before (high for jpg) + $_filetypes_gz_in{$extension}+=int($field[$pos_size]*100/($1||1)); + } + $_filetypes_gz_out{$extension}+=int($field[$pos_size]); + } + } + + # Analyze: Date - Hour - Pages - Hits - Kilo + #------------------------------------------- + if ($PageBool) { + # Replace default page name with / only ('if' is to increase speed when only 1 value in @DefaultFile) + if (@DefaultFile > 1) { foreach my $elem (@DefaultFile) { if ($field[$pos_url] =~ s/\/$elem$/\//o) { last; } } } + else { $field[$pos_url] =~ s/$regdefault/\//o; } + # FirstTime and LastTime are First and Last human visits (so changed if access to a page) + $FirstTime{$lastprocessedyearmonth}||=$timerecord; + $LastTime{$lastprocessedyearmonth}=$timerecord; + $DayPages{$yearmonthdayrecord}++; + $_url_p{$field[$pos_url]}++; #Count accesses for page (page) + $_url_k{$field[$pos_url]}+=int($field[$pos_size]); + $_time_p[$hourrecord]++; #Count accesses for hour (page) + # TODO Use an id for hash key of url + # $_url_t{$_url_id} + } + $_time_h[$hourrecord]++; + $_time_k[$hourrecord]+=int($field[$pos_size]); + $DayHits{$yearmonthdayrecord}++; #Count accesses for hour (hit) + $DayBytes{$yearmonthdayrecord}+=int($field[$pos_size]); #Count accesses for hour (kb) + + # Analyze: Login + #--------------- + if ($pos_logname>=0 && $field[$pos_logname] && $field[$pos_logname] ne '-') { + $field[$pos_logname] =~ s/ /_/g; # This is to allow space in logname + if ($LogFormat eq '6') { $field[$pos_logname] =~ s/^\"//; $field[$pos_logname] =~ s/\"$//;} # logname field has " with Domino 6+ + if ($AuthenticatedUsersNotCaseSensitive) { $field[$pos_logname]=lc($field[$pos_logname]); } + + # We found an authenticated user + if ($PageBool) { $_login_p{$field[$pos_logname]}++; } #Count accesses for page (page) + $_login_h{$field[$pos_logname]}++; #Count accesses for page (hit) + $_login_k{$field[$pos_logname]}+=int($field[$pos_size]); #Count accesses for page (kb) + $_login_l{$field[$pos_logname]}=$timerecord; + } + } + + # Do DNS lookup + #-------------- + my $Host=$field[$pos_host]; + my $HostResolved=''; + + if (! $countedtraffic) { + my $ip=0; + if ($DNSLookup) { # DNS lookup is 1 or 2 + if ($Host =~ /$regipv4/o) { $ip=4; } # IPv4 + elsif ($Host =~ /$regipv6/o) { $ip=6; } # IPv6 + if ($ip) { + # Check in static DNS cache file + $HostResolved=$MyDNSTable{$Host}; + if ($HostResolved) { + if ($Debug) { debug(" DNS lookup asked for $Host and found in static DNS cache file: $HostResolved",4); } + } + elsif ($DNSLookup==1) { + # Check in session cache (dynamic DNS cache file + session DNS cache) + $HostResolved=$TmpDNSLookup{$Host}; + if (! $HostResolved) { + if (@SkipDNSLookupFor && &SkipDNSLookup($Host)) { + $HostResolved=$TmpDNSLookup{$Host}='*'; + if ($Debug) { debug(" No need of reverse DNS lookup for $Host, skipped at user request.",4); } + } + else { + if ($ip == 4) { + my $lookupresult=gethostbyaddr(pack("C4",split(/\./,$Host)),AF_INET); # This is very slow, may spend 20 seconds + if (! $lookupresult || $lookupresult =~ /$regipv4/o || ! IsAscii($lookupresult)) { + $TmpDNSLookup{$Host}=$HostResolved='*'; + } + else { + $TmpDNSLookup{$Host}=$HostResolved=$lookupresult; + } + if ($Debug) { debug(" Reverse DNS lookup for $Host done: $HostResolved",4); } + } + elsif ($ip == 6) { + if ($PluginsLoaded{'GetResolvedIP'}{'ipv6'}) { + my $lookupresult=GetResolvedIP_ipv6($Host); + if (! $lookupresult || ! IsAscii($lookupresult)) { + $TmpDNSLookup{$Host}=$HostResolved='*'; + } + else { + $TmpDNSLookup{$Host}=$HostResolved=$lookupresult; + } + } else { + $TmpDNSLookup{$Host}=$HostResolved='*'; + warning("Reverse DNS lookup for $Host not available without ipv6 plugin enabled."); + } + } + else { error("Bad value vor ip"); } + } + } + } + else { + $HostResolved='*'; + if ($Debug) { debug(" DNS lookup by static DNS cache file asked for $Host but not found.",4); } + } + } + else { + if ($Debug) { debug(" DNS lookup asked for $Host but this is not an IP address.",4); } + $DNSLookupAlreadyDone=$LogFile; + } + } + else { + if ($Host =~ /$regipv4/o) { $HostResolved='*'; $ip=4; } # IPv4 + elsif ($Host =~ /$regipv6/o) { $HostResolved='*'; $ip=6; } # IPv6 + if ($Debug) { debug(" No DNS lookup asked.",4); } + } + + # Analyze: Country (Top-level domain) + #------------------------------------ + if ($Debug) { debug(" Search country (Host=$Host HostResolved=$HostResolved ip=$ip)",4); } + my $Domain='ip'; + # Set $HostResolved to host and resolve domain + if ($HostResolved eq '*') { + # $Host is an IP address and is not resolved (failed or not asked) or resolution gives an IP address + $HostResolved = $Host; + # Resolve Domain + if ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoipfree'}) { $Domain=GetCountryCodeByAddr_geoipfree($HostResolved); } + elsif ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoip'}) { $Domain=GetCountryCodeByAddr_geoip($HostResolved); } + if ($AtLeastOneSectionPlugin) { + foreach my $pluginname (keys %{$PluginsLoaded{'SectionProcessHost'}}) { + my $function="SectionProcessHost_$pluginname(\$HostResolved)"; + eval("$function"); + } + } + } + else { + # $Host was already a host name ($ip=0, $Host=name, $HostResolved='') or has been resolved ($ip>0, $Host=ip, $HostResolved defined) + $HostResolved = lc($HostResolved?$HostResolved:$Host); + # Resolve Domain + if ($ip) { # If we have ip, we use it in priority instead of hostname + if ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoipfree'}) { $Domain=GetCountryCodeByAddr_geoipfree($Host); } + elsif ($PluginsLoaded{'GetCountryCodeByAddr'}{'geoip'}) { $Domain=GetCountryCodeByAddr_geoip($Host); } + elsif ($HostResolved =~ /\.(\w+)$/) { $Domain=$1; } + if ($AtLeastOneSectionPlugin) { + foreach my $pluginname (keys %{$PluginsLoaded{'SectionProcessHostname'}}) { + my $function="SectionProcessHostname_$pluginname(\$Host)"; + eval("$function"); + } + } + } + else { + if ($PluginsLoaded{'GetCountryCodeByName'}{'geoipfree'}) { $Domain=GetCountryCodeByName_geoipfree($HostResolved); } + elsif ($PluginsLoaded{'GetCountryCodeByName'}{'geoip'}) { $Domain=GetCountryCodeByName_geoip($HostResolved); } + elsif ($HostResolved =~ /\.(\w+)$/) { $Domain=$1; } + if ($AtLeastOneSectionPlugin) { + foreach my $pluginname (keys %{$PluginsLoaded{'SectionProcessHostname'}}) { + my $function="SectionProcessHostname_$pluginname(\$HostResolved)"; + eval("$function"); + } + } + } + } + # Store country + if ($PageBool) { $_domener_p{$Domain}++; } + $_domener_h{$Domain}++; + $_domener_k{$Domain}+=int($field[$pos_size]); + + # Analyze: Host, URL entry+exit and Session + #------------------------------------------ + if ($PageBool) { + my $timehostl=$_host_l{$HostResolved}; + if ($timehostl) { + # A visit for this host was already detected +# TODO everywhere there is $VISITTIMEOUT +# $timehostl =~ /^\d\d\d\d\d\d(\d\d)/; my $daytimehostl=$1; +# if ($timerecord > ($timehostl+$VISITTIMEOUT+($dateparts[3]>$daytimehostl?$NEWDAYVISITTIMEOUT:0))) { + if ($timerecord > ($timehostl+$VISITTIMEOUT)) { + # This is a second visit or more + if (! $_waithost_s{$HostResolved}) { + # This is a second visit or more + # We count 'visit','exit','entry','DayVisits' + if ($Debug) { debug(" This is a second visit for $HostResolved.",4); } + my $timehosts=$_host_s{$HostResolved}; + my $page=$_host_u{$HostResolved}; + if ($page) { $_url_x{$page}++; } + $_url_e{$field[$pos_url]}++; + $DayVisits{$yearmonthdayrecord}++; + # We can't count session yet because we don't have the start so + # we save params of first 'wait' session + $_waithost_l{$HostResolved}=$timehostl; + $_waithost_s{$HostResolved}=$timehosts; + $_waithost_u{$HostResolved}=$page; + } + else { + # This is third visit or more + # We count 'session','visit','exit','entry','DayVisits' + if ($Debug) { debug(" This is a third visit or more for $HostResolved.",4); } + my $timehosts=$_host_s{$HostResolved}; + my $page=$_host_u{$HostResolved}; + if ($page) { $_url_x{$page}++; } + $_url_e{$field[$pos_url]}++; + $DayVisits{$yearmonthdayrecord}++; + if ($timehosts) { $_session{GetSessionRange($timehosts,$timehostl)}++; } + } + # Save new session properties + $_host_s{$HostResolved}=$timerecord; + $_host_l{$HostResolved}=$timerecord; + $_host_u{$HostResolved}=$field[$pos_url]; + } + elsif ($timerecord > $timehostl) { + # This is a same visit we can count + if ($Debug) { debug(" This is same visit still running for $HostResolved. host_l/host_u changed to $timerecord/$field[$pos_url]",4); } + $_host_l{$HostResolved}=$timerecord; + $_host_u{$HostResolved}=$field[$pos_url]; + } + elsif ($timerecord == $timehostl) { + # This is a same visit we can count + if ($Debug) { debug(" This is same visit still running for $HostResolved. host_l/host_u changed to $timerecord/$field[$pos_url]",4); } + $_host_u{$HostResolved}=$field[$pos_url]; + } + elsif ($timerecord < $_host_s{$HostResolved}) { + # Should happens only with not correctly sorted log files + if ($Debug) { debug(" This is same visit still running for $HostResolved with start not in order. host_s changed to $timerecord (entry page also changed if first visit)",4); } + if (! $_waithost_s{$HostResolved}) { + # We can reorder entry page only if it's the first visit found in this update run (The saved entry page was $_waithost_e if $_waithost_s{$HostResolved} is not defined. If second visit or more, entry was directly counted and not saved) + $_waithost_e{$HostResolved}=$field[$pos_url]; + } + else { + # We can't change entry counted as we dont't know what was the url counted as entry + } + $_host_s{$HostResolved}=$timerecord; + } + else { + if ($Debug) { debug(" This is same visit still running for $HostResolved with hit between start and last hits. No change",4); } + } + } + else { + # This is a new visit (may be). First new visit found for this host. We save in wait array the entry page to count later + if ($Debug) { debug(" New session (may be) for $HostResolved. Save in wait array to see later",4); } + $_waithost_e{$HostResolved}=$field[$pos_url]; + # Save new session properties + $_host_u{$HostResolved}=$field[$pos_url]; + $_host_s{$HostResolved}=$timerecord; + $_host_l{$HostResolved}=$timerecord; + } + $_host_p{$HostResolved}++; + } + $_host_h{$HostResolved}++; + $_host_k{$HostResolved}+=int($field[$pos_size]); + + # Analyze: Browser - OS + #---------------------- + if ($pos_agent >= 0 && $UserAgent) { + + if ($LevelForBrowsersDetection) { + + # Analyze: Browser + #----------------- + my $uabrowser=$TmpBrowser{$UserAgent}; + if (! $uabrowser) { + my $found=1; + # IE ? + if ($UserAgent =~ /$regvermsie/o && $UserAgent !~ /$regnotie/o) { + $_browser_h{"msie$2"}++; + $TmpBrowser{$UserAgent}="msie$2"; + } + # Netscape 6.x, 7.x ... ? + elsif ($UserAgent =~ /$regvernetscape/o) { + $_browser_h{"netscape$1"}++; + $TmpBrowser{$UserAgent}="netscape$1"; + } + # Netscape 3.x, 4.x ... ? + elsif ($UserAgent =~ /$regvermozilla/o && $UserAgent !~ /$regnotnetscape/o) { + $_browser_h{"netscape$2"}++; + $TmpBrowser{$UserAgent}="netscape$2"; + } + # Other known browsers ? + else { + $found=0; + foreach (@BrowsersSearchIDOrder) { # Search ID in order of BrowsersSearchIDOrder + if ($UserAgent =~ /$_/) { + my $browser=&UnCompileRegex($_); + # TODO If browser is in a family, use version + $_browser_h{"$browser"}++; + $TmpBrowser{$UserAgent}="$browser"; + $found=1; + last; + } + } + } + # Unknown browser ? + if (!$found) { + $_browser_h{'Unknown'}++; + $TmpBrowser{$UserAgent}='Unknown'; + my $newua=$UserAgent; $newua =~ tr/\+ /__/; + $_unknownrefererbrowser_l{$newua}=$timerecord; + } + } + else { + $_browser_h{$uabrowser}++; + if ($uabrowser eq 'Unknown') { + my $newua=$UserAgent; $newua =~ tr/\+ /__/; + $_unknownrefererbrowser_l{$newua}=$timerecord; + } + } + + } + + if ($LevelForOSDetection) { + + # Analyze: OS + #------------ + my $uaos=$TmpOS{$UserAgent}; + if (! $uaos) { + my $found=0; + # in OSHashID list ? + foreach (@OSSearchIDOrder) { # Search ID in order of OSSearchIDOrder + if ($UserAgent =~ /$_/) { + my $osid=$OSHashID{&UnCompileRegex($_)}; + $_os_h{"$osid"}++; + $TmpOS{$UserAgent}="$osid"; + $found=1; + last; + } + } + # Unknown OS ? + if (!$found) { + $_os_h{'Unknown'}++; + $TmpOS{$UserAgent}='Unknown'; + my $newua=$UserAgent; $newua =~ tr/\+ /__/; + $_unknownreferer_l{$newua}=$timerecord; + } + } + else { + $_os_h{$uaos}++; + if ($uaos eq 'Unknown') { + my $newua=$UserAgent; $newua =~ tr/\+ /__/; + $_unknownreferer_l{$newua}=$timerecord; + } + } + + } + + } + else { + $_browser_h{'Unknown'}++; + $_os_h{'Unknown'}++; + } + + # Analyze: Referer + #----------------- + my $found=0; + if ($pos_referer >= 0 && $LevelForRefererAnalyze && $field[$pos_referer]) { + + # Direct ? + if ($field[$pos_referer] eq '-' || $field[$pos_referer] eq 'bookmarks') { # "bookmarks" is sent by Netscape, '-' by all others browsers + # Direct access + if ($PageBool) { $_from_p[0]++; } + $_from_h[0]++; + $found=1; + } + else { + $field[$pos_referer] =~ /$regreferer/o; + my $refererprot=$1; + my $refererserver=($2||'').(! $3 || $3 eq ':80'?'':$3); # refererserver is www.xxx.com or www.xxx.com:81 but not www.xxx.com:80 + # HTML link ? + if ($refererprot =~ /^http/i) { + #if ($Debug) { debug(" Analyze referer refererprot=$refererprot refererserver=$refererserver",5); } + + # Kind of origin + if (!$TmpRefererServer{$refererserver}) { # is "=" if same site, "search egine key" if search engine, not defined otherwise + if ($refererserver =~ /$reglocal/o) { + # Intern (This hit came from another page of the site) + if ($Debug) { debug(" Server '$refererserver' is added to TmpRefererServer with value '='",2); } + $TmpRefererServer{$refererserver}='='; + $found=1; + } + else { + foreach (@HostAliases) { + if ($refererserver =~ /$_/) { + # Intern (This hit came from another page of the site) + if ($Debug) { debug(" Server '$refererserver' is added to TmpRefererServer with value '='",2); } + $TmpRefererServer{$refererserver}='='; + $found=1; + last; + } + } + if (! $found) { + # Extern (This hit came from an external web site). + + if ($LevelForSearchEnginesDetection) { + + foreach (@SearchEnginesSearchIDOrder) { # Search ID in order of SearchEnginesSearchIDOrder + if ($refererserver =~ /$_/) { + my $key=&UnCompileRegex($_); + if (! $NotSearchEnginesKeys{$key} || $refererserver !~ /$NotSearchEnginesKeys{$key}/i) { + # This hit came from the search engine $key + if ($Debug) { debug(" Server '$refererserver' is added to TmpRefererServer with value '$key'",2); } + $TmpRefererServer{$refererserver}=$SearchEnginesHashID{$key}; + $found=1; + } + last; + } + } + + } + } + } + } + + if ($TmpRefererServer{$refererserver}) { + if ($TmpRefererServer{$refererserver} eq '=') { + # Intern (This hit came from another page of the site) + if ($PageBool) { $_from_p[4]++; } + $_from_h[4]++; + $found=1; + } + else { + # This hit came from a search engine + if ($PageBool) { $_from_p[2]++; $_se_referrals_p{$TmpRefererServer{$refererserver}}++; } + $_from_h[2]++; + $_se_referrals_h{$TmpRefererServer{$refererserver}}++; + $found=1; + if ($PageBool && $LevelForKeywordsDetection) { + # we will complete %_keyphrases hash array + my @refurl=split(/\?/,$field[$pos_referer],2); # TODO Use \? or [$URLQuerySeparators] ? + if ($refurl[1]) { + # Extract params of referer query string (q=cache:mmm:www/zzz+aaa+bbb q=aaa+bbb/ccc key=ddd%20eee lang_en ie=UTF-8 ...) + if ($SearchEnginesKnownUrl{$TmpRefererServer{$refererserver}}) { # Search engine with known URL syntax + my @paramlist=split(/&/,$KeyWordsNotSensitive?lc($refurl[1]):$refurl[1]); + foreach my $param (@paramlist) { + if ($param =~ s/^$SearchEnginesKnownUrl{$TmpRefererServer{$refererserver}}//) { + # We found good parameter + # Now param is keyphrase: "cache:mmm:www/zzz+aaa+bbb/ccc+ddd%20eee'fff,ggg" + $param =~ s/^(cache|related):[^\+]+//; # Should be useless since this is for hit on 'not pages' + &ChangeWordSeparatorsIntoSpace($param); # Change [ aaa+bbb/ccc+ddd%20eee'fff,ggg ] into [ aaa bbb/ccc ddd eee fff ggg] + $param =~ s/^ +//; $param =~ s/ +$//; $param =~ tr/ /\+/s; + if ((length $param) > 0) { $_keyphrases{$param}++; } + last; + } + } + } + elsif ($LevelForKeywordsDetection >= 2) { # Search engine with unknown URL syntax + my @paramlist=split(/&/,$KeyWordsNotSensitive?lc($refurl[1]):$refurl[1]); + foreach my $param (@paramlist) { + my $foundexcludeparam=0; + foreach my $paramtoexclude (@WordsToCleanSearchUrl) { + if ($param =~ /$paramtoexclude/i) { $foundexcludeparam=1; last; } # Not the param with search criteria + } + if ($foundexcludeparam) { next; } + # We found good parameter + $param =~ s/.*=//; + # Now param is keyphrase: "aaa+bbb/ccc+ddd%20eee'fff,ggg" + $param =~ s/^(cache|related):[^\+]+//; # Should be useless since this is for hit on 'not pages' + &ChangeWordSeparatorsIntoSpace($param); # Change [ aaa+bbb/ccc+ddd%20eee'fff,ggg ] into [ aaa bbb/ccc ddd eee fff ggg ] + $param =~ s/^ +//; $param =~ s/ +$//; $param =~ tr/ /\+/s; + if ((length $param) > 2) { $_keyphrases{$param}++; last; } + } + } + } # End of if refurl[1] + } + } + } # End of if ($TmpRefererServer) + else { + # This hit came from a site other than a search engine + if ($PageBool) { $_from_p[3]++; } + $_from_h[3]++; + # http://www.mysite.com/ must be same referer than http://www.mysite.com but .../mypage/ differs of .../mypage + #if ($refurl[0] =~ /^[^\/]+\/$/) { $field[$pos_referer] =~ s/\/$//; } # Code moved in Save_History + # TODO: lowercase the value for referer server to have refering server not case sensitive + if ($URLReferrerWithQuery) { + if ($PageBool) { $_pagesrefs_p{$field[$pos_referer]}++; } + $_pagesrefs_h{$field[$pos_referer]}++; + } + else { + # We discard query for referer + if ($field[$pos_referer]=~/$regreferernoquery/o) { + if ($PageBool) { $_pagesrefs_p{"$1"}++; } + $_pagesrefs_h{"$1"}++; + } + else { + if ($PageBool) { $_pagesrefs_p{$field[$pos_referer]}++; } + $_pagesrefs_h{$field[$pos_referer]}++; + } + } + $found=1; + } + } + + # News Link ? + if (! $found && $refererprot =~ /^news/i) { + $found=1; + if ($PageBool) { $_from_p[5]++; } + $_from_h[5]++; + } + } + } + + # Origin not found + if (!$found) { + if ($ShowUnknownOrigin) { print "Unknown origin: $field[$pos_referer]\n"; } + if ($PageBool) { $_from_p[1]++; } + $_from_h[1]++; + } + + # Analyze: EMail + #--------------- + if ($pos_emails>=0 && $field[$pos_emails]) { + if ($field[$pos_emails] eq '<>') { $field[$pos_emails]='Unknown'; } + elsif ($field[$pos_emails] !~ /\@/) { $field[$pos_emails].="\@$SiteDomain"; } + $_emails_h{lc($field[$pos_emails])}++; #Count accesses for sender email (hit) + $_emails_k{lc($field[$pos_emails])}+=int($field[$pos_size]); #Count accesses for sender email (kb) + $_emails_l{lc($field[$pos_emails])}=$timerecord; + } + if ($pos_emailr>=0 && $field[$pos_emailr]) { + if ($field[$pos_emailr] !~ /\@/) { $field[$pos_emailr].="\@$SiteDomain"; } + $_emailr_h{lc($field[$pos_emailr])}++; #Count accesses for receiver email (hit) + $_emailr_k{lc($field[$pos_emailr])}+=int($field[$pos_size]); #Count accesses for receiver email (kb) + $_emailr_l{lc($field[$pos_emailr])}=$timerecord; + } + } + + # Check cluster + #-------------- + if ($pos_cluster>=0) { + if ($PageBool) { $_cluster_p{$field[$pos_cluster]}++; } #Count accesses for page (page) + $_cluster_h{$field[$pos_cluster]}++; #Count accesses for page (hit) + $_cluster_k{$field[$pos_cluster]}+=int($field[$pos_size]); #Count accesses for page (kb) + } + + # Analyze: Extra + #--------------- + foreach my $extranum (1..@ExtraName-1) { + if ($Debug) { debug(" Process extra analyze $extranum",4); } + + # Check code + my $conditionok=0; + foreach my $condnum (0..@{$ExtraCodeFilter[$extranum]}-1) { + if ($Debug) { debug(" Check code '$field[$pos_code]' must be '$ExtraCodeFilter[$extranum][$condnum]'",5); } + if ($field[$pos_code] eq "$ExtraCodeFilter[$extranum][$condnum]") { $conditionok=1; last; } + } + if (! $conditionok && @{$ExtraCodeFilter[$extranum]}) { next; } # End for this section + if ($Debug) { debug(" No check on code or code is OK. Now we check other conditions.",5); } + + # Check conditions + $conditionok=0; + foreach my $condnum (0..@{$ExtraConditionType[$extranum]}-1) { + my $conditiontype=$ExtraConditionType[$extranum][$condnum]; + my $conditiontypeval=$ExtraConditionTypeVal[$extranum][$condnum]; + if ($conditiontype eq 'URL') { + if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in '$urlwithnoquery'",5); } + if ($urlwithnoquery =~ /$conditiontypeval/) { $conditionok=1; last; } + } + elsif ($conditiontype eq 'QUERY_STRING') { + if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in '$standalonequery'",5); } + if ($standalonequery =~ /$conditiontypeval/) { $conditionok=1; last; } + } + elsif ($conditiontype eq 'REFERER') { + if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in '$field[$pos_referer]'",5); } + if ($field[$pos_referer] =~ /$conditiontypeval/) { $conditionok=1; last; } + } + elsif ($conditiontype eq 'UA') { + if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in '$field[$pos_agent]'",5); } + if ($field[$pos_agent] =~ /$conditiontypeval/) { $conditionok=1; last; } + } + elsif ($conditiontype eq 'HOST') { + if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in '$field[$pos_host]'",5); } + if ($HostResolved =~ /$conditiontypeval/) { $conditionok=1; last; } + } + elsif ($conditiontype =~ /extra(\d+)/i) { + if ($Debug) { debug(" Check condition '$conditiontype' must contain '$conditiontypeval' in '$field[$pos_extra[$1]]'",5); } + if ($field[$pos_extra[$1]] =~ /$conditiontypeval/) { $conditionok=1; last; } + } + else { error("Wrong value of parameter ExtraSectionCondition$extranum"); } + } + if (! $conditionok && @{$ExtraConditionType[$extranum]}) { next; } # End for this section + if ($Debug) { debug(" No condition or condition is OK. Now we extract value for first column of extra chart.",5); } + + # Determine actual column value to use. + my $rowkeyval; + my $rowkeyok=0; + foreach my $rowkeynum (0..@{$ExtraFirstColumnValuesType[$extranum]}-1) { + my $rowkeytype=$ExtraFirstColumnValuesType[$extranum][$rowkeynum]; + my $rowkeytypeval=$ExtraFirstColumnValuesTypeVal[$extranum][$rowkeynum]; + if ($rowkeytype eq 'URL') { + if ($urlwithnoquery =~ /$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } + } + elsif ($rowkeytype eq 'QUERY_STRING') { + if ($Debug) { debug(" Extract value from '$standalonequery' with regex '$rowkeytypeval'.",5); } + if ($standalonequery =~ /$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } + } + elsif ($rowkeytype eq 'REFERER') { + if ($field[$pos_referer] =~ /$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } + } + elsif ($rowkeytype eq 'UA') { + if ($field[$pos_agent] =~ /$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } + } + elsif ($rowkeytype eq 'HOST') { + if ($HostResolved =~ /$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } + } + elsif ($rowkeytype =~ /extra(\d+)/i) { + if ($field[$pos_extra[$1]] =~ /$rowkeytypeval/) { $rowkeyval = "$1"; $rowkeyok = 1; last; } + } + else { error("Wrong value of parameter ExtraSectionFirstColumnValues$extranum"); } + } + if (! $rowkeyok) { next; } # End for this section + if ($Debug) { debug(" Key val was found: $rowkeyval",5); } + + # Here we got all values to increase counters + if ($PageBool && $ExtraStatTypes[$extranum] =~ /P/i) { ${'_section_' . $extranum . '_p'}{$rowkeyval}++; } + ${'_section_' . $extranum . '_h'}{$rowkeyval}++; # Must be set + if ($ExtraStatTypes[$extranum] =~ /B/i) { ${'_section_' . $extranum . '_k'}{$rowkeyval}+=int($field[$pos_size]); } + if ($ExtraStatTypes[$extranum] =~ /L/i) { + if (${'_section_' . $extranum . '_l'}{$rowkeyval}||0 < $timerecord) { ${'_section_' . $extranum . '_l'}{$rowkeyval}=$timerecord; } + } + # Check to avoid too large extra sections + if (scalar keys %{'_section_' . $extranum . '_h'} > $ExtraTrackedRowsLimit) { + error(<= 20000) { + #if (++$counterforflushtest >= 1) { + if ((scalar keys %_host_u) > ($LIMITFLUSH<<2) || (scalar keys %_url_p) > $LIMITFLUSH) { + # warning("Warning: Try to run AWStats update process more frequently to analyze smaler log files."); + if ($^X =~ /activestate/i || $^X =~ /activeperl/i) { + # We don't flush if perl is activestate to avoid slowing process because of memory hole + } + else { + # Clean tmp hash arrays + #%TmpDNSLookup = (); + %TmpOS = %TmpRefererServer = %TmpRobot = %TmpBrowser = (); + # We flush if perl is not activestate + print "Flush history file on disk"; + if ((scalar keys %_host_u) > ($LIMITFLUSH<<2)) { print " (unique hosts reach flush limit of ".($LIMITFLUSH<<2).")"; } + if ((scalar keys %_url_p) > $LIMITFLUSH) { print " (unique url reach flush limit of ".($LIMITFLUSH).")"; } + print "\n"; + if ($Debug) { + debug("End of set of $counterforflushtest records: Some hash arrays are too large. We flush and clean some.",2); + print " _host_p:".(scalar keys %_host_p)." _host_h:".(scalar keys %_host_h)." _host_k:".(scalar keys %_host_k)." _host_l:".(scalar keys %_host_l)." _host_s:".(scalar keys %_host_s)." _host_u:".(scalar keys %_host_u)."\n"; + print " _url_p:".(scalar keys %_url_p)." _url_k:".(scalar keys %_url_k)." _url_e:".(scalar keys %_url_e)." _url_x:".(scalar keys %_url_x)."\n"; + print " _waithost_e:".(scalar keys %_waithost_e)." _waithost_l:".(scalar keys %_waithost_l)." _waithost_s:".(scalar keys %_waithost_s)." _waithost_u:".(scalar keys %_waithost_u)."\n"; + } + &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenb+$NbOfLinesParsed),$lastlineoffset,&CheckSum($_)); + &GetDelaySinceStart(1); $NbOfLinesShowsteps=1; + } + } + $counterforflushtest=0; + } + + } # End of loop for processing new record. + + if ($Debug) { + debug(" _host_p:".(scalar keys %_host_p)." _host_h:".(scalar keys %_host_h)." _host_k:".(scalar keys %_host_k)." _host_l:".(scalar keys %_host_l)." _host_s:".(scalar keys %_host_s)." _host_u:".(scalar keys %_host_u)."\n",1); + debug(" _url_p:".(scalar keys %_url_p)." _url_k:".(scalar keys %_url_k)." _url_e:".(scalar keys %_url_e)." _url_x:".(scalar keys %_url_x)."\n",1); + debug(" _waithost_e:".(scalar keys %_waithost_e)." _waithost_l:".(scalar keys %_waithost_l)." _waithost_s:".(scalar keys %_waithost_s)." _waithost_u:".(scalar keys %_waithost_u)."\n",1); + debug("End of processing log file (AWStats memory cache is TmpDNSLookup=".(scalar keys %TmpDNSLookup)." TmpBrowser=".(scalar keys %TmpBrowser)." TmpOS=".(scalar keys %TmpOS)." TmpRefererServer=".(scalar keys %TmpRefererServer)." TmpRobot=".(scalar keys %TmpRobot).")",1); + } + + # Save current processed month $lastprocessedmonth + # If lastprocessedmonth > 0 means there is at least one approved new record in log or at least one existing history file + if ($lastprocessedmonth) { # TODO: Do not save if we are sure a flush was just already done + # Get last line + seek(LOG,$lastlineoffset,0); + my $line=; + chomp $line; $line =~ s/\r$//; + if (! $NbOfLinesParsed) { + # TODO If there was no lines parsed (log was empty), we only update LastUpdate line with YYYYMMDDHHMMSS 0 0 0 0 0 + &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenb+$NbOfLinesParsed),$lastlineoffset,&CheckSum($line)); + } + else { + &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,1,1,"all",($lastlinenb+$NbOfLinesParsed),$lastlineoffset,&CheckSum($line)); + } + } + + if ($Debug) { debug("Close log file \"$LogFile\""); } + close LOG || error("Command for pipe '$LogFile' failed"); + + # Process the Rename - Archive - Purge phase + my $renameok=1; my $archiveok=1; + + # Open Log file for writing if PurgeLogFile is on + if ($PurgeLogFile == 1) { + if ($ArchiveLogRecords == 1) { + $ArchiveFileName="$DirData/${PROG}_archive$FileSuffix.log"; + open(LOG,"+<$LogFile") || error("Enable to archive log records of \"$LogFile\" into \"$ArchiveFileName\" because source can't be opened for read and write: $!
    \n"); + } + else { + open(LOG,"+<$LogFile"); + } + binmode LOG; + } + + # Rename all HISTORYTMP files into HISTORYTXT + &Rename_All_Tmp_History; + + # Purge Log file if option is on and all renaming are ok + if ($PurgeLogFile == 1) { + # Archive LOG file into ARCHIVELOG + if ($ArchiveLogRecords == 1) { + if ($Debug) { debug("Start of archiving log file"); } + open(ARCHIVELOG,">>$ArchiveFileName") || error("Couldn't open file \"$ArchiveFileName\" to archive log: $!"); + binmode ARCHIVELOG; + while () { + if (! print ARCHIVELOG $_) { $archiveok=0; last; } + } + close(ARCHIVELOG) || error("Archiving failed during closing archive: $!"); + if ($SaveDatabaseFilesWithPermissionsForEveryone) { chmod 0666,"$ArchiveFileName"; } + if ($Debug) { debug("End of archiving log file"); } + } + # If rename and archive ok + if ($renameok && $archiveok) { + if ($Debug) { debug("Purge log file"); } + my $bold=($ENV{'GATEWAY_INTERFACE'}?'':''); + my $unbold=($ENV{'GATEWAY_INTERFACE'}?'':''); + my $br=($ENV{'GATEWAY_INTERFACE'}?'
    ':''); + truncate(LOG,0) || warning("Warning: $bold$PROG$unbold couldn't purge logfile \"$bold$LogFile$unbold\".$br\nChange your logfile permissions to allow write for your web server CGI process or change PurgeLogFile=1 into PurgeLogFile=0 in configure file and think to purge sometimes manually your logfile (just after running an update process to not loose any not already processed records your log file contains)."); + } + close(LOG); + } + + if ($DNSLookup==1 && $DNSLookupAlreadyDone) { + # DNSLookup warning + my $bold=($ENV{'GATEWAY_INTERFACE'}?'':''); + my $unbold=($ENV{'GATEWAY_INTERFACE'}?'':''); + my $br=($ENV{'GATEWAY_INTERFACE'}?'
    ':''); + warning("Warning: $bold$PROG$unbold has detected that some hosts names were already resolved in your logfile $bold$DNSLookupAlreadyDone$unbold.$br\nIf DNS lookup was already made by the logger (web server), you should change your setup DNSLookup=$DNSLookup into DNSLookup=0 to increase $PROG speed."); + } + if ($DNSLookup==1 && $NbOfNewLines) { + # Save new DNS last update cache file + Save_DNS_Cache_File(\%TmpDNSLookup,"$DirData/$DNSLastUpdateCacheFile","$FileSuffix"); # Save into file using FileSuffix + } + + if ($EnableLockForUpdate) { + # Remove lock + &Lock_Update(0); + # Restore signals handler + $SIG{INT} = 'DEFAULT'; # 2 + #$SIG{KILL} = 'DEFAULT'; # 9 + #$SIG{TERM} = 'DEFAULT'; # 15 + } + +} +# End of log processing if ($UPdateStats) + + +#--------------------------------------------------------------------- +# SHOW REPORT +#--------------------------------------------------------------------- + +if (scalar keys %HTMLOutput) { + + my $max_p; my $max_h; my $max_k; my $max_v; + my $total_u; my $total_v; my $total_p; my $total_h; my $total_k; my $total_e; my $total_x; my $total_s; my $total_l; my $total_r; + my $average_u; my $average_v; my $average_p; my $average_h; my $average_k; my $average_s; + my $rest_p; my $rest_h; my $rest_k; my $rest_e; my $rest_x; my $rest_s; my $rest_l; my $rest_r; + my $average_nb; + + # Define the NewLinkParams for main chart + my $NewLinkParams=${QueryString}; + $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)output(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)framename=[^&]*//i; + my $NewLinkTarget=''; + if ($DetailedReportsOnNewWindows) { $NewLinkTarget=" target=\"awstatsbis\""; } + if (($FrameName eq 'mainleft' || $FrameName eq 'mainright') && $DetailedReportsOnNewWindows < 2) { + $NewLinkParams.="&framename=mainright"; + $NewLinkTarget=" target=\"mainright\""; + } + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } + + if ($FrameName ne 'mainleft') { + + # READING DATA + #------------- + &Init_HashArray(); + + # Loop on each month of year + for (my $ix=12; $ix>=1; $ix--) { + my $monthix=sprintf("%02s",$ix); + if ($MonthRequired eq 'all' || $monthix eq $MonthRequired) { + &Read_History_With_TmpUpdate($YearRequired,$monthix,0,0,"all"); # Read full history file + } + elsif (($HTMLOutput{'main'} && $ShowMonthStats) || $HTMLOutput{'alldays'}) { + &Read_History_With_TmpUpdate($YearRequired,$monthix,0,0,"general time"); # Read general and time sections. + } + } + } + + # HTMLHeadSection + if ($FrameName ne 'index' && $FrameName ne 'mainleft') { + print " \n\n"; + print "$HTMLHeadSection\n"; + print "\n"; + } + + # Call to plugins' function AddHTMLBodyHeader + foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLBodyHeader'}}) { + my $function="AddHTMLBodyHeader_$pluginname()"; + eval("$function"); + } + + my $WIDTHMENU1=($FrameName eq 'mainleft'?$FRAMEWIDTH:150); + + # TOP BAN + #--------------------------------------------------------------------- + if ($ShowMenu || $FrameName eq 'mainleft') { + my $frame=($FrameName eq 'mainleft'); + + if ($Debug) { debug("ShowTopBan",2); } + print "$Center \n"; + + if ($FrameName ne 'mainleft') { + my $NewLinkParams=${QueryString}; + $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)year=[^&]*//i; + $NewLinkParams =~ s/(^|&)month=[^&]*//i; + $NewLinkParams =~ s/(^|&)framename=[^&]*//i; + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + my $NewLinkTarget=''; + if ($FrameName eq 'mainright') { $NewLinkTarget=" target=\"_parent\""; } + print "
    \n"; + } + + if ($QueryString !~ /buildpdf/i) { + print "\n"; + print "
    \n"; + print "\n"; + } + else { + print "
    \n"; + } + + if ($FrameName ne 'mainright') { + # Print Statistics Of + if ($FrameName eq 'mainleft') { print ""; } + else { print ""; } + + # Logo and flags + if ($FrameName ne 'mainleft') { + if ($LogoLink =~ "http://awstats.sourceforge.net") { + print ""; + } + print "\n"; + } + if ($FrameName ne 'mainleft') { + # Print Last Update + print ""; + print ""; + + # Logo and flags + if ($FrameName eq 'mainright') { + if ($LogoLink =~ "http://awstats.sourceforge.net") { + print ""; + } + + print "\n"; + # Print selected period of analysis (month and year required) + print ""; + print "\n"; + } + if ($QueryString !~ /buildpdf/i) { + print "
    $Message[7]:
    $SiteDomain
    $Message[7]: $SiteDomain"; + } + else { + print ""; + } + if (! $StaticLinks) { print "
    "; Show_Flag_Links($Lang); } + print "
    $Message[35]: "; + if ($LastUpdate) { print Format_Date($LastUpdate,0); } + else { + # Here NbOfOldLines = 0 (because LastUpdate is not defined) + if (! $UpdateStats) { print "$Message[24]"; } + else { print "No qualified records found in log ($NbOfLinesCorrupted corrupted, $NbOfLinesDropped dropped)"; } + + } + print ""; + # Print Update Now link + if ($AllowToUpdateStatsFromBrowser && ! $StaticLinks) { + my $NewLinkParams=${QueryString}; + $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)framename=[^&]*//i; + if ($FrameName eq 'mainright') { $NewLinkParams.="&framename=mainright"; } + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } + print "       "; + print "$Message[74]"; + } + print "\n"; + } + else { + print "\n"; + } + if (! $StaticLinks) { print "
    "; Show_Flag_Links($Lang); } + print "
    $Message[133]:"; + if ($ENV{'GATEWAY_INTERFACE'} || !$StaticLinks) { + print "\n"; + print "\n"; + print "\n"; + if ($SiteConfig) { print "\n"; } + if ($DirConfig) { print "\n"; } + if ($QueryString =~ /onlyusers=([^&]+)/i) { + my $temp_3=$1; + $temp_3=~ s/\Q%20\E/ /g; + $temp_3=~ s/\+/ /g; + $temp_3=~ s/\Q%2B\E/ /g; + print "\n"; + } + if ($QueryString =~ /onlylines=([^&]+)/i) { + my $temp_4=$1; + $temp_4=~ s/\Q%20\E/ /g; + $temp_4=~ s/\+/ /g; + $temp_4=~ s/\Q%2B\E/ /g; + print "\n"; + } + if ($SiteDomain) { print "\n"; } + if ($QueryString =~ /lang=(\w+)/i) { print "\n"; } + if ($QueryString =~ /debug=(\d+)/i) { print "\n"; } + if ($FrameName eq 'mainright') { print "\n"; } + print ""; + } + else { + print ""; + if ($MonthRequired eq 'all') { print "$Message[6] $YearRequired"; } + else { print "$Message[5] $MonthNumLib{$MonthRequired} $YearRequired"; } + print ""; + } + print "
    \n"; + print "
    \n"; + } + else { + print "\n"; + } + + if ($FrameName ne 'mainleft') { print "
    \n"; } + else { print "
    \n"; } + print "\n"; + } + + # Call to plugins' function AddHTMLMenuHeader + foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLMenuHeader'}}) { + my $function="AddHTMLMenuHeader_$pluginname()"; + eval("$function"); + } + + # MENU + #--------------------------------------------------------------------- + if ($ShowMenu || $FrameName eq 'mainleft') { + my $frame=($FrameName eq 'mainleft'); + + if ($Debug) { debug("ShowMenu",2); } + + # Print menu links + if (($HTMLOutput{'main'} && $FrameName ne 'mainright') || $FrameName eq 'mainleft') { # If main page asked + # Define link anchor + my $linkanchor=($FrameName eq 'mainleft'?"$AWScript?${NewLinkParams}":""); + if ($linkanchor && ($linkanchor !~ /framename=mainright/)) { $linkanchor.="framename=mainright"; } + $linkanchor =~ s/&$//; $linkanchor=XMLEncode("$linkanchor"); + # Define target + my $targetpage=($FrameName eq 'mainleft'?" target=\"mainright\"":""); + # Print Menu + my $linetitle; # TODO a virer + if (! $PluginsLoaded{'ShowMenu'}{'menuapplet'}) { + my $menuicon=0; # TODO a virer + # Menu HTML + print "\n"; + if ($FrameName eq 'mainleft' && $ShowMonthStats) { print ($frame?"":""); print "$Message[128]"; print ($frame?"\n":"   "); } + my %menu=(); my %menulink=(); my %menutext=(); + # When + %menu=('month'=>$ShowMonthStats?1:0,'daysofmonth'=>$ShowDaysOfMonthStats?2:0,'daysofweek'=>$ShowDaysOfWeekStats?3:0,'hours'=>$ShowHoursStats?4:0); + %menulink=('month'=>1,'daysofmonth'=>1,'daysofweek'=>1,'hours'=>1); + %menutext=('month'=>$Message[162],'daysofmonth'=>$Message[138],'daysofweek'=>$Message[91],'hours'=>$Message[20]); + ShowMenuCateg('when',$Message[93],'menu4.png',$frame,$targetpage,$linkanchor,$NewLinkParams,$NewLinkTarget,\%menu,\%menulink,\%menutext); + # Who + %menu=('countries'=>$ShowDomainsStats?1:0,'alldomains'=>$ShowDomainsStats?2:0,'visitors'=>$ShowHostsStats?3:0,'allhosts'=>$ShowHostsStats?4:0,'lasthosts'=>($ShowHostsStats =~ /L/i)?5:0,'unknownip'=>$ShowHostsStats?6:0,'logins'=>$ShowAuthenticatedUsers?7:0,'alllogins'=>$ShowAuthenticatedUsers?8:0,'lastlogins'=>($ShowAuthenticatedUsers =~ /L/i)?9:0,'emailsenders'=>$ShowEMailSenders?10:0,'allemails'=>$ShowEMailSenders?11:0,'lastemails'=>($ShowEMailSenders =~ /L/i)?12:0,'emailreceivers'=>$ShowEMailReceivers?13:0,'allemailr'=>$ShowEMailReceivers?14:0,'lastemailr'=>($ShowEMailReceivers =~ /L/i)?15:0,'robots'=>$ShowRobotsStats?16:0,'allrobots'=>$ShowRobotsStats?17:0,'lastrobots'=>($ShowRobotsStats =~ /L/i)?18:0,'worms'=>$ShowWormsStats?19:0); + %menulink=('countries'=>1,'alldomains'=>2,'visitors'=>1,'allhosts'=>2,'lasthosts'=>2,'unknownip'=>2,'logins'=>1,'alllogins'=>2,'lastlogins'=>2,'emailsenders'=>1,'allemails'=>2,'lastemails'=>2,'emailreceivers'=>1,'allemailr'=>2,'lastemailr'=>2,'robots'=>1,'allrobots'=>2,'lastrobots'=>2,'worms'=>1); + %menutext=('countries'=>$Message[148],'alldomains'=>$Message[80],'visitors'=>$Message[81],'allhosts'=>$Message[80],'lasthosts'=>$Message[9],'unknownip'=>$Message[45],'logins'=>$Message[94],'alllogins'=>$Message[80],'lastlogins'=>$Message[9],'emailsenders'=>$Message[131],'allemails'=>$Message[80],'lastemails'=>$Message[9],'emailreceivers'=>$Message[132],'allemailr'=>$Message[80],'lastemailr'=>$Message[9],'robots'=>$Message[53],'allrobots'=>$Message[80],'lastrobots'=>$Message[9],'worms'=>$Message[136]); + ShowMenuCateg('who',$Message[92],'menu5.png',$frame,$targetpage,$linkanchor,$NewLinkParams,$NewLinkTarget,\%menu,\%menulink,\%menutext); + # Navigation + $linetitle=&AtLeastOneNotNull($ShowSessionsStats,$ShowPagesStats,$ShowFileTypesStats,$ShowFileSizesStats,$ShowOSStats,$ShowBrowsersStats,$ShowScreenSizeStats); + if ($linetitle) { print "".($menuicon?" ":"")."$Message[72]:\n"; } + if ($linetitle) { print ($frame?"\n":""); } + if ($ShowSessionsStats) { print ($frame?"":""); print "$Message[117]"; print ($frame?"\n":"   "); } + if ($ShowFileTypesStats) { print ($frame?"":""); print "$Message[73]"; print ($frame?"\n":"   "); } + if ($ShowPagesStats) { print ($frame?"":""); print "$Message[29]\n"; print ($frame?"\n":"   "); } + if ($ShowPagesStats) { print ($frame?"   \"...\" ":""); print "$Message[80]\n"; print ($frame?"\n":"   "); } + if ($ShowPagesStats =~ /E/i) { print ($frame?"   \"...\" ":""); print "$Message[104]\n"; print ($frame?"\n":"   "); } + if ($ShowPagesStats =~ /X/i) { print ($frame?"   \"...\" ":""); print "$Message[116]\n"; print ($frame?"\n":"   "); } + if ($ShowOSStats) { print ($frame?"":""); print "$Message[59]"; print ($frame?"\n":"   "); } + if ($ShowOSStats) { print ($frame?"   \"...\" ":""); print "$Message[58]\n"; print ($frame?"\n":"   "); } + if ($ShowOSStats) { print ($frame?"   \"...\" ":""); print "$Message[0]\n"; print ($frame?"\n":"   "); } + if ($ShowBrowsersStats) { print ($frame?"":""); print "$Message[21]"; print ($frame?"\n":"   "); } + if ($ShowBrowsersStats) { print ($frame?"   \"...\" ":""); print "$Message[58]\n"; print ($frame?"\n":"   "); } + if ($ShowBrowsersStats) { print ($frame?"   \"...\" ":""); print "$Message[0]\n"; print ($frame?"\n":"   "); } + if ($ShowScreenSizeStats) { print ($frame?"":""); print "$Message[135]"; print ($frame?"\n":"   "); } + if ($linetitle) { print ($frame?"":"\n"); } + # Referers + %menu=('referer'=>$ShowOriginStats?1:0,'refererse'=>$ShowOriginStats?2:0,'refererpages'=>$ShowOriginStats?3:0,'keys'=>($ShowKeyphrasesStats || $ShowKeywordsStats)?4:0,'keyphrases'=>$ShowKeyphrasesStats?5:0,'keywords'=>$ShowKeywordsStats?6:0); + %menulink=('referer'=>1,'refererse'=>2,'refererpages'=>2,'keys'=>1,'keyphrases'=>2,'keywords'=>2); + %menutext=('referer'=>$Message[37],'refererse'=>$Message[126],'refererpages'=>$Message[127],'keys'=>$Message[14],'keyphrases'=>$Message[120],'keywords'=>$Message[121]); + ShowMenuCateg('referers',$Message[23],'menu7.png',$frame,$targetpage,$linkanchor,$NewLinkParams,$NewLinkTarget,\%menu,\%menulink,\%menutext); + # Others + %menu=('filetypes'=>($ShowFileTypesStats =~ /C/i)?1:0,'misc'=>$ShowMiscStats?2:0,'errors'=>($ShowHTTPErrorsStats||$ShowSMTPErrorsStats)?3:0,'clusters'=>$ShowClusterStats?5:0); + %menulink=('filetypes'=>1,'misc'=>1,'errors'=>1,'clusters'=>1); + %menutext=('filetypes'=>$Message[98],'misc'=>$Message[139],'errors'=>($ShowSMTPErrorsStats?$Message[147]:$Message[32]),'clusters'=>$Message[155]); + foreach (keys %TrapInfosForHTTPErrorCodes) { + $menu{"errors$_"}=$ShowHTTPErrorsStats?4:0; + $menulink{"errors$_"}=2; + $menutext{"errors$_"}=$Message[31]; + } + ShowMenuCateg('others',$Message[2],'menu8.png',$frame,$targetpage,$linkanchor,$NewLinkParams,$NewLinkTarget,\%menu,\%menulink,\%menutext); + # Extra/Marketing + %menu=(); + %menulink=(); + %menutext=(); + foreach (1..@ExtraName-1) { + $menu{"extra$_"}=1; + $menulink{"extra$_"}=1; + $menutext{"extra$_"}=$ExtraName[$_]; + } + ShowMenuCateg('extra',$Message[134],'',$frame,$targetpage,$linkanchor,$NewLinkParams,$NewLinkTarget,\%menu,\%menulink,\%menutext); + print "\n"; + } + else { + # Menu Applet + if ($frame) { } + else {} + } + #print ($frame?"":"
    \n"); + print "
    \n"; + } + # Print Back link + elsif (! $HTMLOutput{'main'}) { + print "\n"; + $NewLinkParams =~ s/(^|&)hostfilter=[^&]*//i; + $NewLinkParams =~ s/(^|&)urlfilter=[^&]*//i; + $NewLinkParams =~ s/(^|&)refererpagesfilter=[^&]*//i; + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/&$//; + if (! $DetailedReportsOnNewWindows || $FrameName eq 'mainright' || $QueryString =~ /buildpdf/i) { + print "\n"; + } + else { + print "\n"; + } + print "
    $Message[76]
    $Message[118]
    \n"; + print "\n"; + } + } + + # Call to plugins' function AddHTMLMenuFooter + foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLMenuFooter'}}) { + my $function="AddHTMLMenuFooter_$pluginname()"; + eval("$function"); + } + + # Exit if left frame + if ($FrameName eq 'mainleft') { + &html_end(0); + exit 0; + } + + # FirstTime LastTime TotalVisits TotalUnique TotalPages TotalHits TotalBytes TotalHostsKnown TotalHostsUnknown + my $FirstTime=0; + my $LastTime=0; + $TotalUnique=$TotalVisits=$TotalPages=$TotalHits=$TotalBytes=0; + $TotalNotViewedPages=$TotalNotViewedHits=$TotalNotViewedBytes=0; + $TotalHostsKnown=$TotalHostsUnknown=0; + my $beginmonth=$MonthRequired;my $endmonth=$MonthRequired; + if ($MonthRequired eq 'all') { $beginmonth=1;$endmonth=12; } + for (my $month=$beginmonth; $month<=$endmonth; $month++) { + my $monthix=sprintf("%02s",$month); + if ($FirstTime{$YearRequired.$monthix} && ($FirstTime == 0 || $FirstTime > $FirstTime{$YearRequired.$monthix})) { $FirstTime = $FirstTime{$YearRequired.$monthix}; } + if ($LastTime < ($LastTime{$YearRequired.$monthix}||0)) { $LastTime = $LastTime{$YearRequired.$monthix}; } + $TotalHostsKnown+=$MonthHostsKnown{$YearRequired.$monthix}||0; # Wrong in year view + $TotalHostsUnknown+=$MonthHostsUnknown{$YearRequired.$monthix}||0; # Wrong in year view + $TotalUnique+=$MonthUnique{$YearRequired.$monthix}||0; # Wrong in year view + $TotalVisits+=$MonthVisits{$YearRequired.$monthix}||0; + $TotalPages+=$MonthPages{$YearRequired.$monthix}||0; + $TotalHits+=$MonthHits{$YearRequired.$monthix}||0; + $TotalBytes+=$MonthBytes{$YearRequired.$monthix}||0; + $TotalNotViewedPages+=$MonthNotViewedPages{$YearRequired.$monthix}||0; + $TotalNotViewedHits+=$MonthNotViewedHits{$YearRequired.$monthix}||0; + $TotalNotViewedBytes+=$MonthNotViewedBytes{$YearRequired.$monthix}||0; + } + # TotalHitsErrors TotalBytesErrors + my $TotalHitsErrors=0; my $TotalBytesErrors=0; + foreach (keys %_errors_h) { $TotalHitsErrors+=$_errors_h{$_}; $TotalBytesErrors+=$_errors_k{$_}; } + # TotalEntries (if not already specifically counted, we init it from _url_e hash table) + if (!$TotalEntries) { foreach (keys %_url_e) { $TotalEntries+=$_url_e{$_}; } } + # TotalExits (if not already specifically counted, we init it from _url_x hash table) + if (!$TotalExits) { foreach (keys %_url_x) { $TotalExits+=$_url_x{$_}; } } + # TotalBytesPages (if not already specifically counted, we init it from _url_k hash table) + if (!$TotalBytesPages) { foreach (keys %_url_k) { $TotalBytesPages+=$_url_k{$_}; } } + # TotalKeyphrases (if not already specifically counted, we init it from _keyphrases hash table) + if (!$TotalKeyphrases) { foreach (keys %_keyphrases) { $TotalKeyphrases+=$_keyphrases{$_}; } } + # TotalKeywords (if not already specifically counted, we init it from _keywords hash table) + if (!$TotalKeywords) { foreach (keys %_keywords) { $TotalKeywords+=$_keywords{$_}; } } + # TotalSearchEnginesPages (if not already specifically counted, we init it from _se_referrals_p hash table) + if (!$TotalSearchEnginesPages) { foreach (keys %_se_referrals_p) { $TotalSearchEnginesPages+=$_se_referrals_p{$_}; } } + # TotalSearchEnginesHits (if not already specifically counted, we init it from _se_referrals_h hash table) + if (!$TotalSearchEnginesHits) { foreach (keys %_se_referrals_h) { $TotalSearchEnginesHits+=$_se_referrals_h{$_}; } } + # TotalRefererPages (if not already specifically counted, we init it from _pagesrefs_p hash table) + if (!$TotalRefererPages) { foreach (keys %_pagesrefs_p) { $TotalRefererPages+=$_pagesrefs_p{$_}; } } + # TotalRefererHits (if not already specifically counted, we init it from _pagesrefs_h hash table) + if (!$TotalRefererHits) { foreach (keys %_pagesrefs_h) { $TotalRefererHits+=$_pagesrefs_h{$_}; } } + # TotalDifferentPages (if not already specifically counted, we init it from _url_p hash table) + $TotalDifferentPages||=scalar keys %_url_p; + # TotalDifferentKeyphrases (if not already specifically counted, we init it from _keyphrases hash table) + $TotalDifferentKeyphrases||=scalar keys %_keyphrases; + # TotalDifferentKeywords (if not already specifically counted, we init it from _keywords hash table) + $TotalDifferentKeywords||=scalar keys %_keywords; + # TotalDifferentSearchEngines (if not already specifically counted, we init it from _se_referrals_h hash table) + $TotalDifferentSearchEngines||=scalar keys %_se_referrals_h; + # TotalDifferentReferer (if not already specifically counted, we init it from _pagesrefs_h hash table) + $TotalDifferentReferer||=scalar keys %_pagesrefs_h; + + # Define firstdaytocountaverage, lastdaytocountaverage, firstdaytoshowtime, lastdaytoshowtime + my $firstdaytocountaverage=$nowyear.$nowmonth."01"; # Set day cursor to 1st day of month + my $firstdaytoshowtime=$nowyear.$nowmonth."01"; # Set day cursor to 1st day of month + my $lastdaytocountaverage=$nowyear.$nowmonth.$nowday; # Set day cursor to today + my $lastdaytoshowtime=$nowyear.$nowmonth."31"; # Set day cursor to last day of month + if ($MonthRequired eq 'all') { + $firstdaytocountaverage=$YearRequired."0101"; # Set day cursor to 1st day of the required year + } + if (($MonthRequired ne $nowmonth && $MonthRequired ne 'all') || $YearRequired ne $nowyear) { + if ($MonthRequired eq 'all') { + $firstdaytocountaverage=$YearRequired."0101"; # Set day cursor to 1st day of the required year + $firstdaytoshowtime=$YearRequired."1201"; # Set day cursor to 1st day of last month of required year + $lastdaytocountaverage=$YearRequired."1231"; # Set day cursor to last day of the required year + $lastdaytoshowtime=$YearRequired."1231"; # Set day cursor to last day of last month of required year + } + else { + $firstdaytocountaverage=$YearRequired.$MonthRequired."01"; # Set day cursor to 1st day of the required month + $firstdaytoshowtime=$YearRequired.$MonthRequired."01"; # Set day cursor to 1st day of the required month + $lastdaytocountaverage=$YearRequired.$MonthRequired."31"; # Set day cursor to last day of the required month + $lastdaytoshowtime=$YearRequired.$MonthRequired."31"; # Set day cursor to last day of the required month + } + } + if ($Debug) { + debug("firstdaytocountaverage=$firstdaytocountaverage, lastdaytocountaverage=$lastdaytocountaverage",1); + debug("firstdaytoshowtime=$firstdaytoshowtime, lastdaytoshowtime=$lastdaytoshowtime",1); + } + + # Call to plugins' function AddHTMLContentHeader + foreach my $pluginname (keys %{$PluginsLoaded{'AddHTMLContentHeader'}}) { + my $function="AddHTMLContentHeader_$pluginname()"; + eval("$function"); + } + + # Output particular part + #----------------------- + if (scalar keys %HTMLOutput == 1) { + + if ($HTMLOutput{'alldomains'}) { + print "$Center 
    \n"; + # Show domains list + my $title=''; my $cpt=0; + if ($HTMLOutput{'alldomains'}) { $title.="$Message[25]"; $cpt=(scalar keys %_domener_h); } + &tab_head("$title",19,0,'domains'); + print " $Message[17]"; + if ($ShowDomainsStats =~ /P/i) { print "$Message[56]"; } + if ($ShowDomainsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowDomainsStats =~ /B/i) { print "$Message[75]"; } + print " "; + print "\n"; + $total_p=$total_h=$total_k=0; + $max_h=1; foreach (values %_domener_h) { if ($_ > $max_h) { $max_h = $_; } } + $max_k=1; foreach (values %_domener_k) { if ($_ > $max_k) { $max_k = $_; } } + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,1,\%_domener_h,\%_domener_p); + foreach my $key (@keylist) { + my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; + if ($max_h > 0) { $bredde_p=int($BarWidth*$_domener_p{$key}/$max_h)+1; } # use max_h to enable to compare pages with hits + if ($_domener_p{$key} && $bredde_p==1) { $bredde_p=2; } + if ($max_h > 0) { $bredde_h=int($BarWidth*$_domener_h{$key}/$max_h)+1; } + if ($_domener_h{$key} && $bredde_h==1) { $bredde_h=2; } + if ($max_k > 0) { $bredde_k=int($BarWidth*($_domener_k{$key}||0)/$max_k)+1; } + if ($_domener_k{$key} && $bredde_k==1) { $bredde_k=2; } + my $newkey=lc($key); + if ($newkey eq 'ip' || ! $DomainsHashIDLib{$newkey}) { + print "$Message[0]$newkey"; + } + else { + print "$DomainsHashIDLib{$newkey}$newkey"; + } + if ($ShowDomainsStats =~ /P/i) { print "$_domener_p{$key}"; } + if ($ShowDomainsStats =~ /H/i) { print "$_domener_h{$key}"; } + if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($_domener_k{$key}).""; } + print ""; + if ($ShowDomainsStats =~ /P/i) { print "
    \n"; } + if ($ShowDomainsStats =~ /H/i) { print "
    \n"; } + if ($ShowDomainsStats =~ /B/i) { print ""; } + print ""; + print "\n"; + $total_p += $_domener_p{$key}; + $total_h += $_domener_h{$key}; + $total_k += $_domener_k{$key}||0; + $count++; + } + $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other domains (known or not) + print " $Message[2]"; + if ($ShowDomainsStats =~ /P/i) { print "$rest_p"; } + if ($ShowDomainsStats =~ /H/i) { print "$rest_h"; } + if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } + print " "; + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'}) { + print "$Center 
    \n"; + # Show filter form + &ShowFormFilter("hostfilter",$FilterIn{'host'},$FilterEx{'host'}); + # Show hosts list + my $title=''; my $cpt=0; + if ($HTMLOutput{'allhosts'}) { $title.="$Message[81]"; $cpt=(scalar keys %_host_h); } + if ($HTMLOutput{'lasthosts'}) { $title.="$Message[9]"; $cpt=(scalar keys %_host_h); } + &tab_head("$title",19,0,'hosts'); + print ""; + if ($FilterIn{'host'} || $FilterEx{'host'}) { # With filter + if ($FilterIn{'host'}) { print "$Message[79] '$FilterIn{'host'}'"; } + if ($FilterIn{'host'} && $FilterEx{'host'}) { print " - "; } + if ($FilterEx{'host'}) { print " Exlude $Message[79] '$FilterEx{'host'}'"; } + if ($FilterIn{'host'} || $FilterEx{'host'}) { print ": "; } + print "$cpt $Message[81]"; + if ($MonthRequired ne 'all') { + if ($HTMLOutput{'allhosts'} || $HTMLOutput{'lasthosts'}) { print "
    $Message[102]: $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]"; } + } + } + else { # Without filter + if ($MonthRequired ne 'all') { print "$Message[102] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]"; } + else { print "$Message[102] : ".(scalar keys %_host_h); } + } + print ""; + &ShowHostInfo('__title__'); + if ($ShowHostsStats =~ /P/i) { print "$Message[56]"; } + if ($ShowHostsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowHostsStats =~ /B/i) { print "$Message[75]"; } + if ($ShowHostsStats =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + my $count=0; + if ($HTMLOutput{'allhosts'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_host_h,\%_host_p); } + if ($HTMLOutput{'lasthosts'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_host_h,\%_host_l); } + foreach my $key (@keylist) { + my $host=CleanFromCSSA($key); + print "".($_robot_l{$key}?'':'')."$host".($_robot_l{$key}?'':'').""; + &ShowHostInfo($key); + if ($ShowHostsStats =~ /P/i) { print "".($_host_p{$key}?$_host_p{$key}:" ").""; } + if ($ShowHostsStats =~ /H/i) { print "$_host_h{$key}"; } + if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($_host_k{$key}).""; } + if ($ShowHostsStats =~ /L/i) { print "".($_host_l{$key}?Format_Date($_host_l{$key},1):'-').""; } + print "\n"; + $total_p += $_host_p{$key}; + $total_h += $_host_h{$key}; + $total_k += $_host_k{$key}||0; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalHits / $total_h - $TotalBytes / $total_h",2); } + $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other visitors (known or not) + print "$Message[2]"; + &ShowHostInfo(''); + if ($ShowHostsStats =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } + if ($ShowHostsStats =~ /H/i) { print "$rest_h"; } + if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } + if ($ShowHostsStats =~ /L/i) { print " "; } + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'unknownip'}) { + print "$Center 
    \n"; + &tab_head("$Message[45]",19,0,'unknownwip'); + print "".(scalar keys %_host_h)." $Message[1]"; + &ShowHostInfo('__title__'); + if ($ShowHostsStats =~ /P/i) { print "$Message[56]"; } + if ($ShowHostsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowHostsStats =~ /B/i) { print "$Message[75]"; } + if ($ShowHostsStats =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_host_h,\%_host_p); + foreach my $key (@keylist) { + my $host=CleanFromCSSA($key); + print "$host"; + &ShowHostInfo($key); + if ($ShowHostsStats =~ /P/i) { print "".($_host_p{$key}?$_host_p{$key}:" ").""; } + if ($ShowHostsStats =~ /H/i) { print "$_host_h{$key}"; } + if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($_host_k{$key}).""; } + if ($ShowHostsStats =~ /L/i) { print "".($_host_l{$key}?Format_Date($_host_l{$key},1):'-').""; } + print "\n"; + $total_p += $_host_p{$key}; + $total_h += $_host_h{$key}; + $total_k += $_host_k{$key}||0; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalHits / $total_h - $TotalBytes / $total_h",2); } + $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other visitors (known or not) + print "$Message[82]"; + &ShowHostInfo(''); + if ($ShowHostsStats =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } + if ($ShowHostsStats =~ /H/i) { print "$rest_h"; } + if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } + if ($ShowHostsStats =~ /L/i) { print " "; } + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'allemails'} || $HTMLOutput{'lastemails'}) { + &ShowEmailSendersChart($NewLinkParams,$NewLinkTarget); + &html_end(1); + } + if ($HTMLOutput{'allemailr'} || $HTMLOutput{'lastemailr'}) { + &ShowEmailReceiversChart($NewLinkParams,$NewLinkTarget); + &html_end(1); + } + if ($HTMLOutput{'alllogins'} || $HTMLOutput{'lastlogins'}) { + print "$Center 
    \n"; + my $title=''; + if ($HTMLOutput{'alllogins'}) { $title.="$Message[94]"; } + if ($HTMLOutput{'lastlogins'}) { $title.="$Message[9]"; } + &tab_head("$title",19,0,'logins'); + print "$Message[94] : ".(scalar keys %_login_h).""; + &ShowUserInfo('__title__'); + if ($ShowAuthenticatedUsers =~ /P/i) { print "$Message[56]"; } + if ($ShowAuthenticatedUsers =~ /H/i) { print "$Message[57]"; } + if ($ShowAuthenticatedUsers =~ /B/i) { print "$Message[75]"; } + if ($ShowAuthenticatedUsers =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + my $count=0; + if ($HTMLOutput{'alllogins'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_login_h,\%_login_p); } + if ($HTMLOutput{'lastlogins'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Host'},\%_login_h,\%_login_l); } + foreach my $key (@keylist) { + print "$key"; + &ShowUserInfo($key); + if ($ShowAuthenticatedUsers =~ /P/i) { print "".($_login_p{$key}?$_login_p{$key}:" ").""; } + if ($ShowAuthenticatedUsers =~ /H/i) { print "$_login_h{$key}"; } + if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($_login_k{$key}).""; } + if ($ShowAuthenticatedUsers =~ /L/i) { print "".($_login_l{$key}?Format_Date($_login_l{$key},1):'-').""; } + print "\n"; + $total_p += $_login_p{$key}||0; + $total_h += $_login_h{$key}; + $total_k += $_login_k{$key}||0; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalHits / $total_h - $TotalBytes / $total_h",2); } + $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other logins and/or anonymous + print "$Message[125]"; + &ShowUserInfo(''); + if ($ShowAuthenticatedUsers =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } + if ($ShowAuthenticatedUsers =~ /H/i) { print "$rest_h"; } + if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($rest_k).""; } + if ($ShowAuthenticatedUsers =~ /L/i) { print " "; } + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'allrobots'} || $HTMLOutput{'lastrobots'}) { + print "$Center 
    \n"; + my $title=''; + if ($HTMLOutput{'allrobots'}) { $title.="$Message[53]"; } + if ($HTMLOutput{'lastrobots'}) { $title.="$Message[9]"; } + &tab_head("$title",19,0,'robots'); + print "".(scalar keys %_robot_h)." $Message[51]"; + if ($ShowRobotsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowRobotsStats =~ /B/i) { print "$Message[75]"; } + if ($ShowRobotsStats =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=$total_r=0; + my $count=0; + if ($HTMLOutput{'allrobots'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Robot'},\%_robot_h,\%_robot_h); } + if ($HTMLOutput{'lastrobots'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Robot'},\%_robot_h,\%_robot_l); } + foreach my $key (@keylist) { + print "".($RobotsHashIDLib{$key}?$RobotsHashIDLib{$key}:$key).""; + if ($ShowRobotsStats =~ /H/i) { print "".($_robot_h{$key}-$_robot_r{$key}).($_robot_r{$key}?"+$_robot_r{$key}":"").""; } + if ($ShowRobotsStats =~ /B/i) { print "".Format_Bytes($_robot_k{$key}).""; } + if ($ShowRobotsStats =~ /L/i) { print "".($_robot_l{$key}?Format_Date($_robot_l{$key},1):'-').""; } + print "\n"; + #$total_p += $_robot_p{$key}||0; + $total_h += $_robot_h{$key}; + $total_k += $_robot_k{$key}||0; + $total_r += $_robot_r{$key}||0; + $count++; + } + # For bots we need to count Totals + my $TotalPagesRobots = 0; #foreach (values %_robot_p) { $TotalPagesRobots+=$_; } + my $TotalHitsRobots = 0; foreach (values %_robot_h) { $TotalHitsRobots+=$_; } + my $TotalBytesRobots = 0; foreach (values %_robot_k) { $TotalBytesRobots+=$_; } + my $TotalRRobots = 0; foreach (values %_robot_r) { $TotalRRobots+=$_; } + $rest_p=0; #$rest_p=$TotalPagesRobots-$total_p; + $rest_h=$TotalHitsRobots-$total_h; + $rest_k=$TotalBytesRobots-$total_k; + $rest_r=$TotalRRobots-$total_r; + if ($Debug) { debug("Total real / shown : $TotalPagesRobots / $total_p - $TotalHitsRobots / $total_h - $TotalBytesRobots / $total_k",2); } + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0 || $rest_r > 0) { # All other robots + print "$Message[2]"; + if ($ShowRobotsStats =~ /H/i) { print "$rest_h"; } + if ($ShowRobotsStats =~ /B/i) { print "".(Format_Bytes($rest_k)).""; } + if ($ShowRobotsStats =~ /L/i) { print " "; } + print "\n"; + } + &tab_end("* $Message[156]".($TotalRRobots?" $Message[157]":"")); + &html_end(1); + } + if ($HTMLOutput{'urldetail'} || $HTMLOutput{'urlentry'} || $HTMLOutput{'urlexit'}) { + # Call to plugins' function ShowPagesFilter + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesFilter'}}) { + my $function="ShowPagesFilter_$pluginname()"; + eval("$function"); + } + print "$Center 
    \n"; + # Show filter form + &ShowFormFilter("urlfilter",$FilterIn{'url'},$FilterEx{'url'}); + # Show URL list + my $title=''; my $cpt=0; + if ($HTMLOutput{'urldetail'}) { $title=$Message[19]; $cpt=(scalar keys %_url_p); } + if ($HTMLOutput{'urlentry'}) { $title=$Message[104]; $cpt=(scalar keys %_url_e); } + if ($HTMLOutput{'urlexit'}) { $title=$Message[116]; $cpt=(scalar keys %_url_x); } + &tab_head("$title",19,0,'urls'); + print ""; + if ($FilterIn{'url'} || $FilterEx{'url'}) { + if ($FilterIn{'url'}) { print "$Message[79] $FilterIn{'url'}"; } + if ($FilterIn{'url'} && $FilterEx{'url'}) { print " - "; } + if ($FilterEx{'url'}) { print "Exclude $Message[79] $FilterEx{'url'}"; } + if ($FilterIn{'url'} || $FilterEx{'url'}) { print ": "; } + print "$cpt $Message[28]"; + if ($MonthRequired ne 'all') { + if ($HTMLOutput{'urldetail'}) { print "
    $Message[102]: $TotalDifferentPages $Message[28]"; } + } + } + else { print "$Message[102]: $cpt $Message[28]"; } + print ""; + if ($ShowPagesStats =~ /P/i) { print "$Message[29]"; } + if ($ShowPagesStats =~ /B/i) { print "$Message[106]"; } + if ($ShowPagesStats =~ /E/i) { print "$Message[104]"; } + if ($ShowPagesStats =~ /X/i) { print "$Message[116]"; } + # Call to plugins' function ShowPagesAddField + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { + my $function="ShowPagesAddField_$pluginname('title')"; + eval("$function"); + } + print " \n"; + $total_p=$total_k=$total_e=$total_x=0; + my $count=0; + if ($HTMLOutput{'urlentry'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'File'},\%_url_e,\%_url_e); } + elsif ($HTMLOutput{'urlexit'}) { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'File'},\%_url_x,\%_url_x); } + else { &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'File'},\%_url_p,\%_url_p); } + $max_p=1; $max_k=1; + foreach my $key (@keylist) { + if ($_url_p{$key} > $max_p) { $max_p = $_url_p{$key}; } + if ($_url_k{$key}/($_url_p{$key}||1) > $max_k) { $max_k = $_url_k{$key}/($_url_p{$key}||1); } + } + foreach my $key (@keylist) { + print ""; + &ShowURLInfo($key); + print ""; + my $bredde_p=0; my $bredde_e=0; my $bredde_x=0; my $bredde_k=0; + if ($max_p > 0) { $bredde_p=int($BarWidth*($_url_p{$key}||0)/$max_p)+1; } + if (($bredde_p==1) && $_url_p{$key}) { $bredde_p=2; } + if ($max_p > 0) { $bredde_e=int($BarWidth*($_url_e{$key}||0)/$max_p)+1; } + if (($bredde_e==1) && $_url_e{$key}) { $bredde_e=2; } + if ($max_p > 0) { $bredde_x=int($BarWidth*($_url_x{$key}||0)/$max_p)+1; } + if (($bredde_x==1) && $_url_x{$key}) { $bredde_x=2; } + if ($max_k > 0) { $bredde_k=int($BarWidth*(($_url_k{$key}||0)/($_url_p{$key}||1))/$max_k)+1; } + if (($bredde_k==1) && $_url_k{$key}) { $bredde_k=2; } + if ($ShowPagesStats =~ /P/i) { print "$_url_p{$key}"; } + if ($ShowPagesStats =~ /B/i) { print "".($_url_k{$key}?Format_Bytes($_url_k{$key}/($_url_p{$key}||1)):" ").""; } + if ($ShowPagesStats =~ /E/i) { print "".($_url_e{$key}?$_url_e{$key}:" ").""; } + if ($ShowPagesStats =~ /X/i) { print "".($_url_x{$key}?$_url_x{$key}:" ").""; } + # Call to plugins' function ShowPagesAddField + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { + my $function="ShowPagesAddField_$pluginname('$key')"; + eval("$function"); + } + print ""; + # alt and title are not provided to reduce page size + if ($ShowPagesStats =~ /P/i) { print "
    "; } + if ($ShowPagesStats =~ /B/i) { print "
    "; } + if ($ShowPagesStats =~ /E/i) { print "
    "; } + if ($ShowPagesStats =~ /X/i) { print ""; } + print "\n"; + $total_p += $_url_p{$key}; + $total_e += $_url_e{$key}; + $total_x += $_url_x{$key}; + $total_k += $_url_k{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalPages / $total_p - $TotalEntries / $total_e - $TotalExits / $total_x - $TotalBytesPages / $total_k",2); } + $rest_p=$TotalPages-$total_p; + $rest_k=$TotalBytesPages-$total_k; + $rest_e=$TotalEntries-$total_e; + $rest_x=$TotalExits-$total_x; + if ($rest_p > 0 || $rest_e > 0 || $rest_k > 0) { + print "$Message[2]"; + if ($ShowPagesStats =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } + if ($ShowPagesStats =~ /B/i) { print "".($rest_k?Format_Bytes($rest_k/($rest_p||1)):" ").""; } + if ($ShowPagesStats =~ /E/i) { print "".($rest_e?$rest_e:" ").""; } + if ($ShowPagesStats =~ /X/i) { print "".($rest_x?$rest_x:" ").""; } + # Call to plugins' function ShowPagesAddField + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { + my $function="ShowPagesAddField_$pluginname('')"; + eval("$function"); + } + print " \n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'unknownos'}) { + print "$Center 
    \n"; + my $title="$Message[46]"; + &tab_head("$title",19,0,'unknownos'); + print "User agent (".(scalar keys %_unknownreferer_l).")$Message[9]\n"; + $total_l=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,1,\%_unknownreferer_l,\%_unknownreferer_l); + foreach my $key (@keylist) { + my $useragent=CleanFromCSSA($key); + print "$useragent"; + print "".Format_Date($_unknownreferer_l{$key},1).""; + print "\n"; + $total_l+=1; + $count++; + } + $rest_l=(scalar keys %_unknownreferer_l)-$total_l; + if ($rest_l > 0) { + print "$Message[2]"; + print "-"; + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'unknownbrowser'}) { + print "$Center 
    \n"; + my $title="$Message[50]"; + &tab_head("$title",19,0,'unknownbrowser'); + print "User agent (".(scalar keys %_unknownrefererbrowser_l).")$Message[9]\n"; + $total_l=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,1,\%_unknownrefererbrowser_l,\%_unknownrefererbrowser_l); + foreach my $key (@keylist) { + my $useragent=CleanFromCSSA($key); + print "$useragent".Format_Date($_unknownrefererbrowser_l{$key},1)."\n"; + $total_l+=1; + $count++; + } + $rest_l=(scalar keys %_unknownrefererbrowser_l)-$total_l; + if ($rest_l > 0) { + print "$Message[2]"; + print "-"; + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'osdetail'}) { + # Show os versions + print "$Center 
    "; + my $title="$Message[59]"; + &tab_head("$title",19,0,'osversions'); + print "$Message[58]"; + print "$Message[57]$Message[15]"; + print " "; + print "\n"; + $total_h=0; + my $count=0; + &BuildKeyList(MinimumButNoZero(scalar keys %_os_h,500),1,\%_os_h,\%_os_h); + my %keysinkeylist=(); + $max_h=1; + # Count total by family + my %totalfamily_h=(); + my $TotalFamily=0; + OSLOOP: foreach my $key (@keylist) { + $total_h+=$_os_h{$key}; + if ($_os_h{$key} > $max_h) { $max_h = $_os_h{$key}; } + foreach my $family (@OSFamily) { if ($key =~ /^$family/i) { $totalfamily_h{$family}+=$_os_h{$key}; $TotalFamily+=$_os_h{$key}; next OSLOOP; } } + } + # Write records grouped in a browser family + foreach my $family (@OSFamily) { + my $p=' '; + if ($total_h) { $p=int($totalfamily_h{$family}/$total_h*1000)/10; $p="$p %"; } + my $familyheadershown=0; + foreach my $key (reverse sort keys %_os_h) { + if ($key =~ /^$family(.*)/i) { + if (! $familyheadershown) { + print "".uc($family).""; + print "".int($totalfamily_h{$family})."$p "; + print "\n"; + $familyheadershown=1; + } + $keysinkeylist{$key}=1; + my $ver=$1; + my $p=' '; + if ($total_h) { $p=int($_os_h{$key}/$total_h*1000)/10; $p="$p %"; } + print ""; + print ""; + print "$OSHashLib{$key}"; + my $bredde_h=0; + if ($max_h > 0) { $bredde_h=int($BarWidth*($_os_h{$key}||0)/$max_h)+1; } + if (($bredde_h==1) && $_os_h{$key}) { $bredde_h=2; } + print "$_os_h{$key}$p"; + print ""; + # alt and title are not provided to reduce page size + if ($ShowOSStats) { print "
    "; } + print ""; + print "\n"; + $count++; + } + } + } + # Write other records + my $familyheadershown=0; + foreach my $key (@keylist) { + if ($keysinkeylist{$key}) { next; } + if (! $familyheadershown) { + my $p=' '; + if ($total_h) { $p=int(($total_h-$TotalFamily)/$total_h*1000)/10; $p="$p %"; } + print "".uc($Message[2]).""; + print "".($total_h-$TotalFamily)."$p "; + print "\n"; + $familyheadershown=1; + } + my $p=' '; + if ($total_h) { $p=int($_os_h{$key}/$total_h*1000)/10; $p="$p %"; } + print ""; + if ($key eq 'Unknown') { + print "$Message[0]"; + } + else { + my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; + my $libos=$OSHashLib{$keywithoutcumul}||$keywithoutcumul; + my $nameicon=$keywithoutcumul; $nameicon =~ s/[^\w]//g; + print "$libos"; + } + my $bredde_h=0; + if ($max_h > 0) { $bredde_h=int($BarWidth*($_os_h{$key}||0)/$max_h)+1; } + if (($bredde_h==1) && $_os_h{$key}) { $bredde_h=2; } + print "$_os_h{$key}$p"; + print ""; + # alt and title are not provided to reduce page size + if ($ShowOSStats) { print "
    "; } + print ""; + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'browserdetail'}) { + # Show browsers versions + print "$Center 
    "; + my $title="$Message[21]"; + &tab_head("$title",19,0,'browsersversions'); + print "$Message[58]"; + print "$Message[111]$Message[57]$Message[15]"; + print " "; + print "\n"; + $total_h=0; + my $count=0; + &BuildKeyList(MinimumButNoZero(scalar keys %_browser_h,500),1,\%_browser_h,\%_browser_h); + my %keysinkeylist=(); + $max_h=1; + # Count total by family + my %totalfamily_h=(); + my $TotalFamily=0; + BROWSERLOOP: foreach my $key (@keylist) { + $total_h+=$_browser_h{$key}; + if ($_browser_h{$key} > $max_h) { $max_h = $_browser_h{$key}; } + foreach my $family (keys %BrowsersFamily) { if ($key =~ /^$family/i) { $totalfamily_h{$family}+=$_browser_h{$key}; $TotalFamily+=$_browser_h{$key}; next BROWSERLOOP; } } + } + # Write records grouped in a browser family + foreach my $family (sort { $BrowsersFamily{$a} <=> $BrowsersFamily{$b} } keys %BrowsersFamily) { + my $p=' '; + if ($total_h) { $p=int($totalfamily_h{$family}/$total_h*1000)/10; $p="$p %"; } + my $familyheadershown=0; + foreach my $key (reverse sort keys %_browser_h) { + if ($key =~ /^$family(.*)/i) { + if (! $familyheadershown) { + print "".uc($family).""; + print " ".int($totalfamily_h{$family})."$p "; + print "\n"; + $familyheadershown=1; + } + $keysinkeylist{$key}=1; + my $ver=$1; + my $p=' '; + if ($total_h) { $p=int($_browser_h{$key}/$total_h*1000)/10; $p="$p %"; } + print ""; + print ""; + print "".ucfirst($family)." ".($ver?"$ver":"?").""; + print "".($BrowsersHereAreGrabbers{$family}?"$Message[112]":"$Message[113]").""; + my $bredde_h=0; + if ($max_h > 0) { $bredde_h=int($BarWidth*($_browser_h{$key}||0)/$max_h)+1; } + if (($bredde_h==1) && $_browser_h{$key}) { $bredde_h=2; } + print "$_browser_h{$key}$p"; + print ""; + # alt and title are not provided to reduce page size + if ($ShowBrowsersStats) { print "
    "; } + print ""; + print "\n"; + $count++; + } + } + } + # Write other records + my $familyheadershown=0; + foreach my $key (@keylist) { + if ($keysinkeylist{$key}) { next; } + if (! $familyheadershown) { + my $p=' '; + if ($total_h) { $p=int(($total_h-$TotalFamily)/$total_h*1000)/10; $p="$p %"; } + print "".uc($Message[2]).""; + print " ".($total_h-$TotalFamily)."$p "; + print "\n"; + $familyheadershown=1; + } + my $p=' '; + if ($total_h) { $p=int($_browser_h{$key}/$total_h*1000)/10; $p="$p %"; } + print ""; + if ($key eq 'Unknown') { + print "$Message[0]?"; + } + else { + my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; + my $libbrowser=$BrowsersHashIDLib{$keywithoutcumul}||$keywithoutcumul; + my $nameicon=$BrowsersHashIcon{$keywithoutcumul}||"notavailable"; + print "$libbrowser".($BrowsersHereAreGrabbers{$key}?"$Message[112]":"$Message[113]").""; + } + my $bredde_h=0; + if ($max_h > 0) { $bredde_h=int($BarWidth*($_browser_h{$key}||0)/$max_h)+1; } + if (($bredde_h==1) && $_browser_h{$key}) { $bredde_h=2; } + print "$_browser_h{$key}$p"; + print ""; + # alt and title are not provided to reduce page size + if ($ShowBrowsersStats) { print "
    "; } + print ""; + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'refererse'}) { + print "$Center 
    \n"; + my $title="$Message[40]"; + &tab_head("$title",19,0,'refererse'); + print "$TotalDifferentSearchEngines $Message[122]"; + print "$Message[56]$Message[15]"; + print "$Message[57]$Message[15]"; + print "\n"; + $total_s=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Refer'},\%_se_referrals_h,((scalar keys %_se_referrals_p)?\%_se_referrals_p:\%_se_referrals_h)); # before 5.4 only hits were recorded + foreach my $key (@keylist) { + my $newreferer=CleanFromCSSA($SearchEnginesHashLib{$key}||$key); + my $p_p; my $p_h; + if ($TotalSearchEnginesPages) { $p_p=int($_se_referrals_p{$key}/$TotalSearchEnginesPages*1000)/10; } + if ($TotalSearchEnginesHits) { $p_h=int($_se_referrals_h{$key}/$TotalSearchEnginesHits*1000)/10; } + print "$newreferer"; + print "".($_se_referrals_p{$key}?$_se_referrals_p{$key}:' ').""; + print "".($_se_referrals_p{$key}?"$p_p %":' ').""; + print "$_se_referrals_h{$key}"; + print "$p_h %"; + print "\n"; + $total_p += $_se_referrals_p{$key}; + $total_h += $_se_referrals_h{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalSearchEnginesPages / $total_p - $TotalSearchEnginesHits / $total_h",2); } + $rest_p=$TotalSearchEnginesPages-$total_p; + $rest_h=$TotalSearchEnginesHits-$total_h; + if ($rest_p > 0 || $rest_h > 0) { + my $p_p;my $p_h; + if ($TotalSearchEnginesPages) { $p_p=int($rest_p/$TotalSearchEnginesPages*1000)/10; } + if ($TotalSearchEnginesHits) { $p_h=int($rest_h/$TotalSearchEnginesHits*1000)/10; } + print "$Message[2]"; + print "".($rest_p?$rest_p:' ').""; + print "".($rest_p?"$p_p %":' ').""; + print "$rest_h"; + print "$p_h %"; + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'refererpages'}) { + print "$Center 
    \n"; + # Show filter form + &ShowFormFilter("refererpagesfilter",$FilterIn{'refererpages'},$FilterEx{'refererpages'}); + my $title="$Message[41]"; my $cpt=0; + $cpt=(scalar keys %_pagesrefs_h); + &tab_head("$title",19,0,'refererpages'); + print ""; + if ($FilterIn{'refererpages'} || $FilterEx{'refererpages'}) { + if ($FilterIn{'refererpages'}) { print "$Message[79] $FilterIn{'refererpages'}"; } + if ($FilterIn{'refererpages'} && $FilterEx{'refererpages'}) { print " - "; } + if ($FilterEx{'refererpages'}) { print "Exclude $Message[79] $FilterEx{'refererpages'}"; } + if ($FilterIn{'refererpages'} || $FilterEx{'refererpages'}) { print ": "; } + print "$cpt $Message[28]"; + #if ($MonthRequired ne 'all') { + # if ($HTMLOutput{'refererpages'}) { print "
    $Message[102]: $TotalDifferentPages $Message[28]"; } + #} + } + else { print "$Message[102]: $cpt $Message[28]"; } + print ""; + print "$Message[56]$Message[15]"; + print "$Message[57]$Message[15]"; + print "\n"; + $total_s=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Refer'},\%_pagesrefs_h,((scalar keys %_pagesrefs_p)?\%_pagesrefs_p:\%_pagesrefs_h)); + foreach my $key (@keylist) { + my $nompage=CleanFromCSSA($key); + if (length($nompage)>$MaxLengthOfShownURL) { $nompage=substr($nompage,0,$MaxLengthOfShownURL)."..."; } + my $p_p; my $p_h; + if ($TotalRefererPages) { $p_p=int($_pagesrefs_p{$key}/$TotalRefererPages*1000)/10; } + if ($TotalRefererHits) { $p_h=int($_pagesrefs_h{$key}/$TotalRefererHits*1000)/10; } + print ""; + &ShowURLInfo($key); + print ""; + print "".($_pagesrefs_p{$key}?$_pagesrefs_p{$key}:' ')."".($_pagesrefs_p{$key}?"$p_p %":' ').""; + print "".($_pagesrefs_h{$key}?$_pagesrefs_h{$key}:' ')."".($_pagesrefs_h{$key}?"$p_h %":' ').""; + print "\n"; + $total_p += $_pagesrefs_p{$key}; + $total_h += $_pagesrefs_h{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalRefererPages / $total_p - $TotalRefererHits / $total_h",2); } + $rest_p=$TotalRefererPages-$total_p; + $rest_h=$TotalRefererHits-$total_h; + if ($rest_p > 0 || $rest_h > 0) { + my $p_p; my $p_h; + if ($TotalRefererPages) { $p_p=int($rest_p/$TotalRefererPages*1000)/10; } + if ($TotalRefererHits) { $p_h=int($rest_h/$TotalRefererHits*1000)/10; } + print "$Message[2]"; + print "".($rest_p?$rest_p:' ').""; + print "".($rest_p?"$p_p %":' ').""; + print "$rest_h"; + print "$p_h %"; + print "\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'keyphrases'}) { + print "$Center 
    \n"; + &tab_head($Message[43],19,0,'keyphrases'); + print "$TotalDifferentKeyphrases $Message[103]$Message[14]$Message[15]\n"; + $total_s=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Keyphrase'},\%_keyphrases,\%_keyphrases); + foreach my $key (@keylist) { + my $mot; + # Convert coded keywords (utf8,...) to be correctly reported in HTML page. + if ($PluginsLoaded{'DecodeKey'}{'decodeutfkeys'}) { $mot=CleanFromCSSA(DecodeKey_decodeutfkeys($key,$PageCode||'iso-8859-1')); } + else { $mot = CleanFromCSSA(DecodeEncodedString($key)); } + my $p; + if ($TotalKeyphrases) { $p=int($_keyphrases{$key}/$TotalKeyphrases*1000)/10; } + print "".XMLEncode($mot)."$_keyphrases{$key}$p %\n"; + $total_s += $_keyphrases{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalKeyphrases / $total_s",2); } + $rest_s=$TotalKeyphrases-$total_s; + if ($rest_s > 0) { + my $p; + if ($TotalKeyphrases) { $p=int($rest_s/$TotalKeyphrases*1000)/10; } + print "$Message[124]$rest_s"; + print "$p %\n"; + } + &tab_end(); + &html_end(1); + } + if ($HTMLOutput{'keywords'}) { + print "$Center 
    \n"; + &tab_head($Message[44],19,0,'keywords'); + print "$TotalDifferentKeywords $Message[13]$Message[14]$Message[15]\n"; + $total_s=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,$MinHit{'Keyword'},\%_keywords,\%_keywords); + foreach my $key (@keylist) { + my $mot; + # Convert coded keywords (utf8,...) to be correctly reported in HTML page. + if ($PluginsLoaded{'DecodeKey'}{'decodeutfkeys'}) { $mot=CleanFromCSSA(DecodeKey_decodeutfkeys($key,$PageCode||'iso-8859-1')); } + else { $mot = CleanFromCSSA(DecodeEncodedString($key)); } + my $p; + if ($TotalKeywords) { $p=int($_keywords{$key}/$TotalKeywords*1000)/10; } + print "".XMLEncode($mot)."$_keywords{$key}$p %\n"; + $total_s += $_keywords{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalKeywords / $total_s",2); } + $rest_s=$TotalKeywords-$total_s; + if ($rest_s > 0) { + my $p; + if ($TotalKeywords) { $p=int($rest_s/$TotalKeywords*1000)/10; } + print "$Message[30]$rest_s"; + print "$p %\n"; + } + &tab_end(); + &html_end(1); + } + foreach my $code (keys %TrapInfosForHTTPErrorCodes) { + if ($HTMLOutput{"errors$code"}) { + print "$Center 
    \n"; + &tab_head($Message[47],19,0,"errors$code"); + print "URL (".(scalar keys %_sider404_h).")$Message[49]$Message[23]\n"; + $total_h=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,1,\%_sider404_h,\%_sider404_h); + foreach my $key (@keylist) { + my $nompage=XMLEncode(CleanFromCSSA($key)); + #if (length($nompage)>$MaxLengthOfShownURL) { $nompage=substr($nompage,0,$MaxLengthOfShownURL)."..."; } + my $referer=XMLEncode(CleanFromCSSA($_referer404_h{$key})); + print "$nompage"; + print "$_sider404_h{$key}"; + print "".($referer?"$referer":" ").""; + print "\n"; + $total_s += $_sider404_h{$key}; + $count++; + } + # TODO Build TotalErrorHits + # if ($Debug) { debug("Total real / shown : $TotalErrorHits / $total_h",2); } + # $rest_h=$TotalErrorHits-$total_h; + # if ($rest_h > 0) { + # my $p; + # if ($TotalErrorHits) { $p=int($rest_h/$TotalErrorHits*1000)/10; } + # print "$Message[30]"; + # print "$rest_h"; + # print "..."; + # print "\n"; + # } + &tab_end(); + &html_end(1); + } + } + if ($HTMLOutput{'info'}) { + # Not yet available + print "$Center 
    "; + &html_end(1); + } + + my $htmloutput=''; + foreach my $key (keys %HTMLOutput) { $htmloutput=$key; } + if ($htmloutput =~ /^plugin_(\w+)$/) { + my $pluginname=$1; + print "$Center 
    "; + my $function="AddHTMLGraph_$pluginname()"; + eval("$function"); + &html_end(1); + } + } + + # Output main page + #----------------- + + if ($HTMLOutput{'main'}) { + + # SUMMARY + #--------------------------------------------------------------------- + if ($ShowMonthStats) { + if ($Debug) { debug("ShowSummary",2); } + #print "$Center 
    \n"; + my $title="$Message[128]"; + &tab_head("$title",0,0,'month'); + + my $NewLinkParams=${QueryString}; + $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)year=[^&]*//i; + $NewLinkParams =~ s/(^|&)month=[^&]*//i; + $NewLinkParams =~ s/(^|&)framename=[^&]*//i; + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } + my $NewLinkTarget=''; + if ($FrameName eq 'mainright') { $NewLinkTarget=" target=\"_parent\""; } + + # Ratio + my $RatioVisits=0; my $RatioPages=0; my $RatioHits=0; my $RatioBytes=0; + if ($TotalUnique > 0) { $RatioVisits=int($TotalVisits/$TotalUnique*100)/100; } + if ($TotalVisits > 0) { $RatioPages=int($TotalPages/$TotalVisits*100)/100; } + if ($TotalVisits > 0) { $RatioHits=int($TotalHits/$TotalVisits*100)/100; } + if ($TotalVisits > 0) { $RatioBytes=int(($TotalBytes/1024)*100/($LogType eq 'M'?$TotalHits:$TotalVisits))/100; } + + my $colspan=5; + my $w='20'; + if ($LogType eq 'W' || $LogType eq 'S') { $w='17'; $colspan=6; } + + # Show first/last + print ""; + print "$Message[133]\n"; + print ($MonthRequired eq 'all'?"$Message[6] $YearRequired":"$Message[5] ".$MonthNumLib{$MonthRequired}." $YearRequired"); + print "\n"; + print ""; + print "$Message[8]\n"; + print "".($FirstTime?Format_Date($FirstTime,0):"NA").""; + print "\n"; + print ""; + print "$Message[9]\n"; + print "".($LastTime?Format_Date($LastTime,0):"NA")."\n"; + print "\n"; + + # Show main indicators title row + print ""; + if ($LogType eq 'W' || $LogType eq 'S') { print " "; } + if ($ShowMonthStats =~ /U/i) { print "$Message[11]"; } else { print " "; } + if ($ShowMonthStats =~ /V/i) { print "$Message[10]"; } else { print " "; } + if ($ShowMonthStats =~ /P/i) { print "$Message[56]"; } else { print " "; } + if ($ShowMonthStats =~ /H/i) { print "$Message[57]"; } else { print " "; } + if ($ShowMonthStats =~ /B/i) { print "$Message[75]"; } else { print " "; } + print "\n"; + # Show main indicators values for viewed traffic + print ""; + if ($LogType eq 'M') { + print "$Message[165]"; + print " 
     \n"; + print " 
     \n"; + if ($ShowMonthStats =~ /H/i) { print "$TotalHits".($LogType eq 'M'?"":"
    ($RatioHits ".lc($Message[57]."/".$Message[12]).")"); } else { print " "; } + if ($ShowMonthStats =~ /B/i) { print "".Format_Bytes(int($TotalBytes))."
    ($RatioBytes $Message[108]/".lc($Message[($LogType eq 'M'?149:12)]).")"; } else { print " "; } + } + else { + if ($LogType eq 'W' || $LogType eq 'S') { print "$Message[160] *"; } + if ($ShowMonthStats =~ /U/i) { print "".($MonthRequired eq 'all'?"<= $TotalUnique
    $Message[129]":"$TotalUnique
     ").""; } else { print " "; } + if ($ShowMonthStats =~ /V/i) { print "$TotalVisits
    ($RatioVisits $Message[52])"; } else { print " "; } + if ($ShowMonthStats =~ /P/i) { print "$TotalPages
    ($RatioPages ".lc($Message[56]."/".$Message[12]).")"; } else { print " "; } + if ($ShowMonthStats =~ /H/i) { print "$TotalHits".($LogType eq 'M'?"":"
    ($RatioHits ".lc($Message[57]."/".$Message[12]).")"); } else { print " "; } + if ($ShowMonthStats =~ /B/i) { print "".Format_Bytes(int($TotalBytes))."
    ($RatioBytes $Message[108]/".lc($Message[($LogType eq 'M'?149:12)]).")"; } else { print " "; } + } + print "\n"; + # Show main indicators values for not viewed traffic values + if ($LogType eq 'M' || $LogType eq 'W' || $LogType eq 'S') { + print ""; + if ($LogType eq 'M') { + print "$Message[166]"; + print " 
     \n"; + print " 
     \n"; + if ($ShowMonthStats =~ /H/i) { print "$TotalNotViewedHits"; } else { print " "; } + if ($ShowMonthStats =~ /B/i) { print "".Format_Bytes(int($TotalNotViewedBytes)).""; } else { print " "; } + } + else { + if ($LogType eq 'W' || $LogType eq 'S') { print "$Message[161] *"; } + print " 
     \n"; + if ($ShowMonthStats =~ /P/i) { print "$TotalNotViewedPages"; } else { print " "; } + if ($ShowMonthStats =~ /H/i) { print "$TotalNotViewedHits"; } else { print " "; } + if ($ShowMonthStats =~ /B/i) { print "".Format_Bytes(int($TotalNotViewedBytes)).""; } else { print " "; } + } + print "\n"; + } + &tab_end($LogType eq 'W' || $LogType eq 'S'?"* $Message[159]":""); + } + + # BY MONTH + #--------------------------------------------------------------------- + if ($ShowMonthStats) { + + if ($Debug) { debug("ShowMonthStats",2); } + print "$Center 
    \n"; + my $title="$Message[162]"; + &tab_head("$title",0,0,'month'); + print "\n"; + print "
    \n"; + + $average_nb=$average_u=$average_v=$average_p=$average_h=$average_k=0; + $total_u=$total_v=$total_p=$total_h=$total_k=0; + + $max_v=$max_p=$max_h=$max_k=1; + # Define total and max + for (my $ix=1; $ix<=12; $ix++) { + my $monthix=sprintf("%02s",$ix); + $total_u+=$MonthUnique{$YearRequired.$monthix}||0; + $total_v+=$MonthVisits{$YearRequired.$monthix}||0; + $total_p+=$MonthPages{$YearRequired.$monthix}||0; + $total_h+=$MonthHits{$YearRequired.$monthix}||0; + $total_k+=$MonthBytes{$YearRequired.$monthix}||0; + #if (($MonthUnique{$YearRequired.$monthix}||0) > $max_v) { $max_v=$MonthUnique{$YearRequired.$monthix}; } + if (($MonthVisits{$YearRequired.$monthix}||0) > $max_v) { $max_v=$MonthVisits{$YearRequired.$monthix}; } + #if (($MonthPages{$YearRequired.$monthix}||0) > $max_p) { $max_p=$MonthPages{$YearRequired.$monthix}; } + if (($MonthHits{$YearRequired.$monthix}||0) > $max_h) { $max_h=$MonthHits{$YearRequired.$monthix}; } + if (($MonthBytes{$YearRequired.$monthix}||0) > $max_k) { $max_k=$MonthBytes{$YearRequired.$monthix}; } + } + # Define average + # TODO + + # Show bars for month + if ($PluginsLoaded{'ShowGraph'}{'graphapplet'}) { + my @blocklabel=(); + for (my $ix=1; $ix<=12; $ix++) { + my $monthix=sprintf("%02s",$ix); + push @blocklabel,"$MonthNumLib{$monthix}\�$YearRequired"; + } + my @vallabel=("$Message[11]","$Message[10]","$Message[56]","$Message[57]","$Message[75]"); + my @valcolor=("$color_u","$color_v","$color_p","$color_h","$color_k"); + my @valmax=($max_v,$max_v,$max_h,$max_h,$max_k); + my @valtotal=($total_u,$total_v,$total_p,$total_h,$total_k); + my @valaverage=(); + #my @valaverage=($average_v,$average_p,$average_h,$average_k); + my @valdata=(); + my $xx=0; + for (my $ix=1; $ix<=12; $ix++) { + my $monthix=sprintf("%02s",$ix); + $valdata[$xx++]=$MonthUnique{$YearRequired.$monthix}||0; + $valdata[$xx++]=$MonthVisits{$YearRequired.$monthix}||0; + $valdata[$xx++]=$MonthPages{$YearRequired.$monthix}||0; + $valdata[$xx++]=$MonthHits{$YearRequired.$monthix}||0; + $valdata[$xx++]=$MonthBytes{$YearRequired.$monthix}||0; + } + ShowGraph_graphapplet("$title","month",$ShowMonthStats,\@blocklabel,\@vallabel,\@valcolor,\@valmax,\@valtotal,\@valaverage,\@valdata); + } + else { + print "\n"; + print ""; + print "\n"; + for (my $ix=1; $ix<=12; $ix++) { + my $monthix=sprintf("%02s",$ix); + my $bredde_u=0; my $bredde_v=0;my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; + if ($max_v > 0) { $bredde_u=int(($MonthUnique{$YearRequired.$monthix}||0)/$max_v*$BarHeight)+1; } + if ($max_v > 0) { $bredde_v=int(($MonthVisits{$YearRequired.$monthix}||0)/$max_v*$BarHeight)+1; } + if ($max_h > 0) { $bredde_p=int(($MonthPages{$YearRequired.$monthix}||0)/$max_h*$BarHeight)+1; } + if ($max_h > 0) { $bredde_h=int(($MonthHits{$YearRequired.$monthix}||0)/$max_h*$BarHeight)+1; } + if ($max_k > 0) { $bredde_k=int(($MonthBytes{$YearRequired.$monthix}||0)/$max_k*$BarHeight)+1; } + print "\n"; + } + print ""; + print "\n"; + # Show lib for month + print ""; +# if (!$StaticLinks) { +# print ""; +# } +# else { + print ""; +# } + for (my $ix=1; $ix<=12; $ix++) { + my $monthix=sprintf("%02s",$ix); +# if (!$StaticLinks) { +# print ""; +# } +# else { + print ""; +# } + } +# if (!$StaticLinks) { +# print ""; +# } +# else { + print ""; +# } + print "\n"; + print "
     "; + if ($ShowMonthStats =~ /U/i) { print ""; } + if ($ShowMonthStats =~ /V/i) { print ""; } + if ($QueryString !~ /buildpdf/i) { print " "; } + if ($ShowMonthStats =~ /P/i) { print ""; } + if ($ShowMonthStats =~ /H/i) { print ""; } + if ($ShowMonthStats =~ /B/i) { print ""; } + print " 
    << $MonthNumLib{$monthix}
    $YearRequired
    ".(! $StaticLinks && $monthix==$nowmonth && $YearRequired==$nowyear?'':''); + print "$MonthNumLib{$monthix}
    $YearRequired"; + print (! $StaticLinks && $monthix==$nowmonth && $YearRequired==$nowyear?'':'')."
    >> 
    \n"; + } + print "
    \n"; + + # Show data array for month + if ($AddDataArrayMonthStats) { + print "\n"; + print ""; + if ($ShowMonthStats =~ /U/i) { print ""; } + if ($ShowMonthStats =~ /V/i) { print ""; } + if ($ShowMonthStats =~ /P/i) { print ""; } + if ($ShowMonthStats =~ /H/i) { print ""; } + if ($ShowMonthStats =~ /B/i) { print ""; } + print "\n"; + for (my $ix=1; $ix<=12; $ix++) { + my $monthix=sprintf("%02s",$ix); + print ""; + print ""; + if ($ShowMonthStats =~ /U/i) { print ""; } + if ($ShowMonthStats =~ /V/i) { print ""; } + if ($ShowMonthStats =~ /P/i) { print ""; } + if ($ShowMonthStats =~ /H/i) { print ""; } + if ($ShowMonthStats =~ /B/i) { print ""; } + print "\n"; + } + # Average row + # TODO + # Total row + print ""; + if ($ShowMonthStats =~ /U/i) { print ""; } + if ($ShowMonthStats =~ /V/i) { print ""; } + if ($ShowMonthStats =~ /P/i) { print ""; } + if ($ShowMonthStats =~ /H/i) { print ""; } + if ($ShowMonthStats =~ /B/i) { print ""; } + print "\n"; + print "
    $Message[5]$Message[11]$Message[10]$Message[56]$Message[57]$Message[75]
    ".(! $StaticLinks && $monthix==$nowmonth && $YearRequired==$nowyear?'':''); + print "$MonthNumLib{$monthix} $YearRequired"; + print (! $StaticLinks && $monthix==$nowmonth && $YearRequired==$nowyear?'':'')."",$MonthUnique{$YearRequired.$monthix}?$MonthUnique{$YearRequired.$monthix}:"0","",$MonthVisits{$YearRequired.$monthix}?$MonthVisits{$YearRequired.$monthix}:"0","",$MonthPages{$YearRequired.$monthix}?$MonthPages{$YearRequired.$monthix}:"0","",$MonthHits{$YearRequired.$monthix}?$MonthHits{$YearRequired.$monthix}:"0","",Format_Bytes(int($MonthBytes{$YearRequired.$monthix}||0)),"
    $Message[102]$total_u$total_v$total_p$total_h".Format_Bytes($total_k)."
    \n
    \n"; + } + + print "
    \n"; + print "\n"; + &tab_end(); + } + + print "\n \n\n"; + + # BY DAY OF MONTH + #--------------------------------------------------------------------- + if ($ShowDaysOfMonthStats) { + if ($Debug) { debug("ShowDaysOfMonthStats",2); } + print "$Center 
    \n"; + my $title="$Message[138]"; + &tab_head("$title",0,0,'daysofmonth'); + print ""; + print "\n"; + print "
    \n"; + + my $NewLinkParams=${QueryString}; + $NewLinkParams =~ s/(^|&)update(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)staticlinks(=\w*|$)//i; + $NewLinkParams =~ s/(^|&)year=[^&]*//i; + $NewLinkParams =~ s/(^|&)month=[^&]*//i; + $NewLinkParams =~ s/(^|&)framename=[^&]*//i; + $NewLinkParams =~ tr/&/&/s; $NewLinkParams =~ s/^&//; $NewLinkParams =~ s/&$//; + if ($NewLinkParams) { $NewLinkParams="${NewLinkParams}&"; } + my $NewLinkTarget=''; + if ($FrameName eq 'mainright') { $NewLinkTarget=" target=\"_parent\""; } + + $average_nb=$average_u=$average_v=$average_p=$average_h=$average_k=0; + $total_u=$total_v=$total_p=$total_h=$total_k=0; + # Define total and max + $max_v=$max_h=$max_k=0; # Start from 0 because can be lower than 1 + foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + $total_v+=$DayVisits{$year.$month.$day}||0; + $total_p+=$DayPages{$year.$month.$day}||0; + $total_h+=$DayHits{$year.$month.$day}||0; + $total_k+=$DayBytes{$year.$month.$day}||0; + if (($DayVisits{$year.$month.$day}||0) > $max_v) { $max_v=$DayVisits{$year.$month.$day}; } + #if (($DayPages{$year.$month.$day}||0) > $max_p) { $max_p=$DayPages{$year.$month.$day}; } + if (($DayHits{$year.$month.$day}||0) > $max_h) { $max_h=$DayHits{$year.$month.$day}; } + if (($DayBytes{$year.$month.$day}||0) > $max_k) { $max_k=$DayBytes{$year.$month.$day}; } + } + # Define average + foreach my $daycursor ($firstdaytocountaverage..$lastdaytocountaverage) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + $average_nb++; # Increase number of day used to count + $average_v+=($DayVisits{$daycursor}||0); + $average_p+=($DayPages{$daycursor}||0); + $average_h+=($DayHits{$daycursor}||0); + $average_k+=($DayBytes{$daycursor}||0); + } + if ($average_nb) { + $average_v=$average_v/$average_nb; + $average_p=$average_p/$average_nb; + $average_h=$average_h/$average_nb; + $average_k=$average_k/$average_nb; + if ($average_v > $max_v) { $max_v=$average_v; } + #if ($average_p > $max_p) { $max_p=$average_p; } + if ($average_h > $max_h) { $max_h=$average_h; } + if ($average_k > $max_k) { $max_k=$average_k; } + } + else { + $average_v="?"; + $average_p="?"; + $average_h="?"; + $average_k="?"; + } + + # Show bars for day + if ($PluginsLoaded{'ShowGraph'}{'graphapplet'}) { + my @blocklabel=(); + foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + my $bold=($day==$nowday && $month==$nowmonth && $year==$nowyear?':':''); + my $weekend=(DayOfWeek($day,$month,$year)=~/[06]/?'!':''); + push @blocklabel,"$day�$MonthNumLib{$month}$weekend$bold"; + } + my @vallabel=("$Message[10]","$Message[56]","$Message[57]","$Message[75]"); + my @valcolor=("$color_v","$color_p","$color_h","$color_k"); + my @valmax=($max_v,$max_h,$max_h,$max_k); + my @valtotal=($total_v,$total_p,$total_h,$total_k); + $average_v=sprintf("%.2f",$average_v); + $average_p=sprintf("%.2f",$average_p); + $average_h=sprintf("%.2f",$average_h); + $average_k=(int($average_k)?Format_Bytes(sprintf("%.2f",$average_k)):"0.00"); + my @valaverage=($average_v,$average_p,$average_h,$average_k); + my @valdata=(); + my $xx=0; + foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + $valdata[$xx++]=$DayVisits{$year.$month.$day}||0; + $valdata[$xx++]=$DayPages{$year.$month.$day}||0; + $valdata[$xx++]=$DayHits{$year.$month.$day}||0; + $valdata[$xx++]=$DayBytes{$year.$month.$day}||0; + } + ShowGraph_graphapplet("$title","daysofmonth",$ShowDaysOfMonthStats,\@blocklabel,\@vallabel,\@valcolor,\@valmax,\@valtotal,\@valaverage,\@valdata); + } + else { + print "\n"; + print "\n"; + foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + my $bredde_v=0; my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; + if ($max_v > 0) { $bredde_v=int(($DayVisits{$year.$month.$day}||0)/$max_v*$BarHeight)+1; } + if ($max_h > 0) { $bredde_p=int(($DayPages{$year.$month.$day}||0)/$max_h*$BarHeight)+1; } + if ($max_h > 0) { $bredde_h=int(($DayHits{$year.$month.$day}||0)/$max_h*$BarHeight)+1; } + if ($max_k > 0) { $bredde_k=int(($DayBytes{$year.$month.$day}||0)/$max_k*$BarHeight)+1; } + print "\n"; + } + print ""; + # Show average value cell + print "\n"; + print "\n"; + # Show lib for day + print ""; + foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + my $dayofweekcursor=DayOfWeek($day,$month,$year); + print ""; + print (! $StaticLinks && $day==$nowday && $month==$nowmonth && $year==$nowyear?'':''); + print "$day
    ".$MonthNumLib{$month}.""; + print (! $StaticLinks && $day==$nowday && $month==$nowmonth && $year==$nowyear?'
    ':''); + print "\n"; + } + print "
    "; + print "\n"; + print "\n"; + print "
    "; + if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } + print " "; + my $bredde_v=0; my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; + if ($max_v > 0) { $bredde_v=int($average_v/$max_v*$BarHeight)+1; } + if ($max_h > 0) { $bredde_p=int($average_p/$max_h*$BarHeight)+1; } + if ($max_h > 0) { $bredde_h=int($average_h/$max_h*$BarHeight)+1; } + if ($max_k > 0) { $bredde_k=int($average_k/$max_k*$BarHeight)+1; } + $average_v=sprintf("%.2f",$average_v); + $average_p=sprintf("%.2f",$average_p); + $average_h=sprintf("%.2f",$average_h); + $average_k=(int($average_k)?Format_Bytes(sprintf("%.2f",$average_k)):"0.00"); + if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } + print "
     $Message[96]
    \n"; + } + print "
    \n"; + + # Show data array for days + if ($AddDataArrayShowDaysOfMonthStats) { + print "\n"; + print ""; + if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } + print ""; + foreach my $daycursor ($firstdaytoshowtime..$lastdaytoshowtime) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + my $dayofweekcursor=DayOfWeek($day,$month,$year); + print ""; + print ""; + if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } + print "\n"; + } + # Average row + print ""; + if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } + print "\n"; + # Total row + print ""; + if ($ShowDaysOfMonthStats =~ /V/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /P/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /H/i) { print ""; } + if ($ShowDaysOfMonthStats =~ /B/i) { print ""; } + print "\n"; + print "
    $Message[4]$Message[10]$Message[56]$Message[57]$Message[75]
    ".(! $StaticLinks && $day==$nowday && $month==$nowmonth && $year==$nowyear?'':''); + print Format_Date("$year$month$day"."000000",2); + print (! $StaticLinks && $day==$nowday && $month==$nowmonth && $year==$nowyear?'':'')."",$DayVisits{$year.$month.$day}?$DayVisits{$year.$month.$day}:"0","",$DayPages{$year.$month.$day}?$DayPages{$year.$month.$day}:"0","",$DayHits{$year.$month.$day}?$DayHits{$year.$month.$day}:"0","",Format_Bytes(int($DayBytes{$year.$month.$day}||0)),"
    $Message[96]$average_v$average_p$average_h$average_k
    $Message[102]$total_v$total_p$total_h".Format_Bytes($total_k)."
    \n
    "; + } + + print "
    \n"; + print "\n"; + &tab_end(); + } + + # BY DAY OF WEEK + #------------------------- + if ($ShowDaysOfWeekStats) { + if ($Debug) { debug("ShowDaysOfWeekStats",2); } + print "$Center 
    \n"; + my $title="$Message[91]"; + &tab_head("$title",18,0,'daysofweek'); + print ""; + print ""; + print "
    \n"; + + $max_h=$max_k=0; # Start from 0 because can be lower than 1 + # Get average value for day of week + my @avg_dayofweek_nb=(); my @avg_dayofweek_p=(); my @avg_dayofweek_h=(); my @avg_dayofweek_k=(); + foreach my $daycursor ($firstdaytocountaverage..$lastdaytocountaverage) { + $daycursor =~ /^(\d\d\d\d)(\d\d)(\d\d)/; + my $year=$1; my $month=$2; my $day=$3; + if (! DateIsValid($day,$month,$year)) { next; } # If not an existing day, go to next + my $dayofweekcursor=DayOfWeek($day,$month,$year); + $avg_dayofweek_nb[$dayofweekcursor]++; # Increase number of day used to count for this day of week + $avg_dayofweek_p[$dayofweekcursor]+=($DayPages{$daycursor}||0); + $avg_dayofweek_h[$dayofweekcursor]+=($DayHits{$daycursor}||0); + $avg_dayofweek_k[$dayofweekcursor]+=($DayBytes{$daycursor}||0); + } + for (@DOWIndex) { + if ($avg_dayofweek_nb[$_]) { + $avg_dayofweek_p[$_]=$avg_dayofweek_p[$_]/$avg_dayofweek_nb[$_]; + $avg_dayofweek_h[$_]=$avg_dayofweek_h[$_]/$avg_dayofweek_nb[$_]; + $avg_dayofweek_k[$_]=$avg_dayofweek_k[$_]/$avg_dayofweek_nb[$_]; + #if ($avg_dayofweek_p[$_] > $max_p) { $max_p = $avg_dayofweek_p[$_]; } + if ($avg_dayofweek_h[$_] > $max_h) { $max_h = $avg_dayofweek_h[$_]; } + if ($avg_dayofweek_k[$_] > $max_k) { $max_k = $avg_dayofweek_k[$_]; } + } + else { + $avg_dayofweek_p[$_]="?"; + $avg_dayofweek_h[$_]="?"; + $avg_dayofweek_k[$_]="?"; + } + } + + # Show bars for days of week + if ($PluginsLoaded{'ShowGraph'}{'graphapplet'}) { + my @blocklabel=(); + for (@DOWIndex) { push @blocklabel,($Message[$_+84].($_=~/[06]/?"!":"")); } + my @vallabel=("$Message[56]","$Message[57]","$Message[75]"); + my @valcolor=("$color_p","$color_h","$color_k"); + my @valmax=(int($max_h),int($max_h),int($max_k)); + my @valtotal=($total_p,$total_h,$total_k); + $average_p=sprintf("%.2f",$average_p); + $average_h=sprintf("%.2f",$average_h); + $average_k=(int($average_k)?Format_Bytes(sprintf("%.2f",$average_k)):"0.00"); + my @valaverage=($average_p,$average_h,$average_k); + my @valdata=(); + my $xx=0; + for (@DOWIndex) { + $valdata[$xx++]=$avg_dayofweek_p[$_]||0; + $valdata[$xx++]=$avg_dayofweek_h[$_]||0; + $valdata[$xx++]=$avg_dayofweek_k[$_]||0; + # Round to be ready to show array + $avg_dayofweek_p[$_]=sprintf("%.2f",$avg_dayofweek_p[$_]); + $avg_dayofweek_h[$_]=sprintf("%.2f",$avg_dayofweek_h[$_]); + $avg_dayofweek_k[$_]=sprintf("%.2f",$avg_dayofweek_k[$_]); + # Remove decimal part that are .0 + if ($avg_dayofweek_p[$_] == int($avg_dayofweek_p[$_])) { $avg_dayofweek_p[$_]=int($avg_dayofweek_p[$_]); } + if ($avg_dayofweek_h[$_] == int($avg_dayofweek_h[$_])) { $avg_dayofweek_h[$_]=int($avg_dayofweek_h[$_]); } + } + ShowGraph_graphapplet("$title","daysofweek",$ShowDaysOfWeekStats,\@blocklabel,\@vallabel,\@valcolor,\@valmax,\@valtotal,\@valaverage,\@valdata); + } + else { + print "\n"; + print "\n"; + for (@DOWIndex) { + my $bredde_p=0; my $bredde_h=0; my $bredde_k=0; + if ($max_h > 0) { $bredde_p=int($avg_dayofweek_p[$_]/$max_h*$BarHeight)+1; } + if ($max_h > 0) { $bredde_h=int($avg_dayofweek_h[$_]/$max_h*$BarHeight)+1; } + if ($max_k > 0) { $bredde_k=int($avg_dayofweek_k[$_]/$max_k*$BarHeight)+1; } + $avg_dayofweek_p[$_]=sprintf("%.2f",$avg_dayofweek_p[$_]); + $avg_dayofweek_h[$_]=sprintf("%.2f",$avg_dayofweek_h[$_]); + $avg_dayofweek_k[$_]=sprintf("%.2f",$avg_dayofweek_k[$_]); + # Remove decimal part that are .0 + if ($avg_dayofweek_p[$_] == int($avg_dayofweek_p[$_])) { $avg_dayofweek_p[$_]=int($avg_dayofweek_p[$_]); } + if ($avg_dayofweek_h[$_] == int($avg_dayofweek_h[$_])) { $avg_dayofweek_h[$_]=int($avg_dayofweek_h[$_]); } + print "\n"; + } + print "\n"; + print "\n"; + for (@DOWIndex) { + print "".(! $StaticLinks && $_==($nowwday-1) && $MonthRequired==$nowmonth && $YearRequired==$nowyear?'':''); + print $Message[$_+84]; + print (! $StaticLinks && $_==($nowwday-1) && $MonthRequired==$nowmonth && $YearRequired==$nowyear?'':'').""; + } + print "\n
    "; + if ($ShowDaysOfWeekStats =~ /P/i) { print ""; } + if ($ShowDaysOfWeekStats =~ /H/i) { print ""; } + if ($ShowDaysOfWeekStats =~ /B/i) { print ""; } + print "
    \n"; + } + print "
    \n"; + + # Show data array for days of week + if ($AddDataArrayShowDaysOfWeekStats) { + print "\n"; + print ""; + if ($ShowDaysOfWeekStats =~ /P/i) { print ""; } + if ($ShowDaysOfWeekStats =~ /H/i) { print ""; } + if ($ShowDaysOfWeekStats =~ /B/i) { print ""; } + for (@DOWIndex) { + print ""; + print ""; + if ($ShowDaysOfWeekStats =~ /P/i) { print ""; } + if ($ShowDaysOfWeekStats =~ /H/i) { print ""; } + if ($ShowDaysOfWeekStats =~ /B/i) { print ""; } + print "\n"; + } + print "
    $Message[4]$Message[56]$Message[57]$Message[75]
    ".(! $StaticLinks && $_==($nowwday-1) && $MonthRequired==$nowmonth && $YearRequired==$nowyear?'':''); + print $Message[$_+84]; + print "",$avg_dayofweek_p[$_],"",$avg_dayofweek_h[$_],"",Format_Bytes($avg_dayofweek_k[$_]),"
    \n
    \n"; + } + + print "
    "; + print "\n"; + &tab_end(); + } + + # BY HOUR + #---------------------------- + if ($ShowHoursStats) { + if ($Debug) { debug("ShowHoursStats",2); } + print "$Center 
    \n"; + my $title="$Message[20]"; + if ($PluginsLoaded{'GetTimeZoneTitle'}{'timezone'}) { $title.=" (GMT ".(GetTimeZoneTitle_timezone()>=0?"+":"").int(GetTimeZoneTitle_timezone()).")"; } + &tab_head("$title",19,0,'hours'); + print "\n"; + print "
    \n"; + + $max_h=$max_k=1; + for (my $ix=0; $ix<=23; $ix++) { + #if ($_time_p[$ix]>$max_p) { $max_p=$_time_p[$ix]; } + if ($_time_h[$ix]>$max_h) { $max_h=$_time_h[$ix]; } + if ($_time_k[$ix]>$max_k) { $max_k=$_time_k[$ix]; } + } + + # Show bars for hour + if ($PluginsLoaded{'ShowGraph'}{'graphapplet'}) { + my @blocklabel=(0..23); + my @vallabel=("$Message[56]","$Message[57]","$Message[75]"); + my @valcolor=("$color_p","$color_h","$color_k"); + my @valmax=(int($max_h),int($max_h),int($max_k)); + my @valtotal=($total_p,$total_h,$total_k); + my @valaverage=($average_p,$average_h,$average_k); + my @valdata=(); + my $xx=0; + for (0..23) { + $valdata[$xx++]=$_time_p[$_]||0; + $valdata[$xx++]=$_time_h[$_]||0; + $valdata[$xx++]=$_time_k[$_]||0; + } + ShowGraph_graphapplet("$title","hours",$ShowHoursStats,\@blocklabel,\@vallabel,\@valcolor,\@valmax,\@valtotal,\@valaverage,\@valdata); + } + else { + print "\n"; + print "\n"; + for (my $ix=0; $ix<=23; $ix++) { + my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; + if ($max_h > 0) { $bredde_p=int($BarHeight*$_time_p[$ix]/$max_h)+1; } + if ($max_h > 0) { $bredde_h=int($BarHeight*$_time_h[$ix]/$max_h)+1; } + if ($max_k > 0) { $bredde_k=int($BarHeight*$_time_k[$ix]/$max_k)+1; } + print "\n"; + } + print "\n"; + # Show hour lib + print ""; + for (my $ix=0; $ix<=23; $ix++) { + print "\n"; # width=19 instead of 18 to avoid a MacOS browser bug. + } + print "\n"; + # Show clock icon + print "\n"; + for (my $ix=0; $ix<=23; $ix++) { + my $hrs=($ix>=12?$ix-12:$ix); + my $hre=($ix>=12?$ix-11:$ix+1); + my $apm=($ix>=12?"pm":"am"); + print "\n"; + } + print "\n"; + print "
    "; + if ($ShowHoursStats =~ /P/i) { print ""; } + if ($ShowHoursStats =~ /H/i) { print ""; } + if ($ShowHoursStats =~ /B/i) { print ""; } + print "
    $ix
    \"$hrs:00
    \n"; + } + print "
    \n"; + + # Show data array for hours + if ($AddDataArrayShowHoursStats) { + print "\n"; + print ""; + print ""; + print "
    \n"; + + print "\n"; + print ""; + if ($ShowHoursStats =~ /P/i) { print ""; } + if ($ShowHoursStats =~ /H/i) { print ""; } + if ($ShowHoursStats =~ /B/i) { print ""; } + print ""; + for (my $ix=0; $ix<=11; $ix++) { + my $monthix=($ix<10?"0$ix":"$ix"); + print ""; + print ""; + if ($ShowHoursStats =~ /P/i) { print ""; } + if ($ShowHoursStats =~ /H/i) { print ""; } + if ($ShowHoursStats =~ /B/i) { print ""; } + print "\n"; + } + print "
    $Message[20]$Message[56]$Message[57]$Message[75]
    $monthix",$_time_p[$monthix]?$_time_p[$monthix]:"0","",$_time_h[$monthix]?$_time_h[$monthix]:"0","",Format_Bytes(int($_time_k[$monthix])),"
    \n"; + + print "
     
    \n"; + + print "\n"; + print ""; + if ($ShowHoursStats =~ /P/i) { print ""; } + if ($ShowHoursStats =~ /H/i) { print ""; } + if ($ShowHoursStats =~ /B/i) { print ""; } + print "\n"; + for (my $ix=12; $ix<=23; $ix++) { + my $monthix=($ix<10?"0$ix":"$ix"); + print ""; + print ""; + if ($ShowHoursStats =~ /P/i) { print ""; } + if ($ShowHoursStats =~ /H/i) { print ""; } + if ($ShowHoursStats =~ /B/i) { print ""; } + print "\n"; + } + print "
    $Message[20]$Message[56]$Message[57]$Message[75]
    $monthix",$_time_p[$monthix]?$_time_p[$monthix]:"0","",$_time_h[$monthix]?$_time_h[$monthix]:"0","",Format_Bytes(int($_time_k[$monthix])),"
    \n"; + + print "
    \n"; + print "
    \n"; + } + + print "
    \n"; + &tab_end(); + } + + print "\n \n\n"; + + # BY COUNTRY/DOMAIN + #--------------------------- + if ($ShowDomainsStats) { + if ($Debug) { debug("ShowDomainsStats",2); } + print "$Center 
    \n"; + my $title="$Message[25] ($Message[77] $MaxNbOf{'Domain'})   -   $Message[80]"; + &tab_head("$title",19,0,'countries'); + print " $Message[17]"; + if ($ShowDomainsStats =~ /P/i) { print "$Message[56]"; } + if ($ShowDomainsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowDomainsStats =~ /B/i) { print "$Message[75]"; } + print " "; + print "\n"; + $total_p=$total_h=$total_k=0; + $max_h=1; foreach (values %_domener_h) { if ($_ > $max_h) { $max_h = $_; } } + $max_k=1; foreach (values %_domener_k) { if ($_ > $max_k) { $max_k = $_; } } + my $count=0; + &BuildKeyList($MaxNbOf{'Domain'},$MinHit{'Domain'},\%_domener_h,\%_domener_p); + foreach my $key (@keylist) { + my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; + if ($max_h > 0) { $bredde_p=int($BarWidth*$_domener_p{$key}/$max_h)+1; } # use max_h to enable to compare pages with hits + if ($_domener_p{$key} && $bredde_p==1) { $bredde_p=2; } + if ($max_h > 0) { $bredde_h=int($BarWidth*$_domener_h{$key}/$max_h)+1; } + if ($_domener_h{$key} && $bredde_h==1) { $bredde_h=2; } + if ($max_k > 0) { $bredde_k=int($BarWidth*($_domener_k{$key}||0)/$max_k)+1; } + if ($_domener_k{$key} && $bredde_k==1) { $bredde_k=2; } + my $newkey=lc($key); + if ($newkey eq 'ip' || ! $DomainsHashIDLib{$newkey}) { + print "$Message[0]$newkey"; + } + else { + print "$DomainsHashIDLib{$newkey}$newkey"; + } + if ($ShowDomainsStats =~ /P/i) { print "".($_domener_p{$key}?$_domener_p{$key}:' ').""; } + if ($ShowDomainsStats =~ /H/i) { print "$_domener_h{$key}"; } + if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($_domener_k{$key}).""; } + print ""; + if ($ShowDomainsStats =~ /P/i) { print "
    \n"; } + if ($ShowDomainsStats =~ /H/i) { print "
    \n"; } + if ($ShowDomainsStats =~ /B/i) { print ""; } + print ""; + print "\n"; + $total_p += $_domener_p{$key}; + $total_h += $_domener_h{$key}; + $total_k += $_domener_k{$key}||0; + $count++; + } + $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other domains (known or not) + print " $Message[2]"; + if ($ShowDomainsStats =~ /P/i) { print "$rest_p"; } + if ($ShowDomainsStats =~ /H/i) { print "$rest_h"; } + if ($ShowDomainsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } + print " "; + print "\n"; + } + &tab_end(); + } + + # BY HOST/VISITOR + #-------------------------- + if ($ShowHostsStats) { + if ($Debug) { debug("ShowHostsStats",2); } + print "$Center 
    \n"; + my $title="$Message[81] ($Message[77] $MaxNbOf{'HostsShown'})   -   $Message[80]   -   $Message[9]   -   $Message[45]"; + &tab_head("$title",19,0,'visitors'); + print ""; + print ""; + if ($MonthRequired ne 'all') { print "$Message[81] : $TotalHostsKnown $Message[82], $TotalHostsUnknown $Message[1] - $TotalUnique $Message[11]"; } + else { print "$Message[81] : ".(scalar keys %_host_h).""; } + &ShowHostInfo('__title__'); + if ($ShowHostsStats =~ /P/i) { print "$Message[56]"; } + if ($ShowHostsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowHostsStats =~ /B/i) { print "$Message[75]"; } + if ($ShowHostsStats =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + my $count=0; + &BuildKeyList($MaxNbOf{'HostsShown'},$MinHit{'Host'},\%_host_h,\%_host_p); + foreach my $key (@keylist) { + print ""; + print "$key"; + &ShowHostInfo($key); + if ($ShowHostsStats =~ /P/i) { print "".($_host_p{$key}||" ").""; } + if ($ShowHostsStats =~ /H/i) { print "$_host_h{$key}"; } + if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($_host_k{$key}).""; } + if ($ShowHostsStats =~ /L/i) { print "".($_host_l{$key}?Format_Date($_host_l{$key},1):'-').""; } + print "\n"; + $total_p += $_host_p{$key}; + $total_h += $_host_h{$key}; + $total_k += $_host_k{$key}||0; + $count++; + } + $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other visitors (known or not) + print ""; + print "$Message[2]"; + &ShowHostInfo(''); + if ($ShowHostsStats =~ /P/i) { print "$rest_p"; } + if ($ShowHostsStats =~ /H/i) { print "$rest_h"; } + if ($ShowHostsStats =~ /B/i) { print "".Format_Bytes($rest_k).""; } + if ($ShowHostsStats =~ /L/i) { print " "; } + print "\n"; + } + &tab_end(); + } + + # BY SENDER EMAIL + #---------------------------- + if ($ShowEMailSenders) { + &ShowEmailSendersChart($NewLinkParams,$NewLinkTarget); + } + + # BY RECEIVER EMAIL + #---------------------------- + if ($ShowEMailReceivers) { + &ShowEmailReceiversChart($NewLinkParams,$NewLinkTarget); + } + + # BY LOGIN + #---------------------------- + if ($ShowAuthenticatedUsers) { + if ($Debug) { debug("ShowAuthenticatedUsers",2); } + print "$Center 
    \n"; + my $title="$Message[94] ($Message[77] $MaxNbOf{'LoginShown'})   -   $Message[80]"; + if ($ShowAuthenticatedUsers =~ /L/i) { $title.="   -   $Message[9]"; } + &tab_head("$title",19,0,'logins'); + print "$Message[94] : ".(scalar keys %_login_h).""; + &ShowUserInfo('__title__'); + if ($ShowAuthenticatedUsers =~ /P/i) { print "$Message[56]"; } + if ($ShowAuthenticatedUsers =~ /H/i) { print "$Message[57]"; } + if ($ShowAuthenticatedUsers =~ /B/i) { print "$Message[75]"; } + if ($ShowAuthenticatedUsers =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + $max_h=1; foreach (values %_login_h) { if ($_ > $max_h) { $max_h = $_; } } + $max_k=1; foreach (values %_login_k) { if ($_ > $max_k) { $max_k = $_; } } + my $count=0; + &BuildKeyList($MaxNbOf{'LoginShown'},$MinHit{'Login'},\%_login_h,\%_login_p); + foreach my $key (@keylist) { + my $bredde_p=0;my $bredde_h=0;my $bredde_k=0; + if ($max_h > 0) { $bredde_p=int($BarWidth*$_login_p{$key}/$max_h)+1; } # use max_h to enable to compare pages with hits + if ($max_h > 0) { $bredde_h=int($BarWidth*$_login_h{$key}/$max_h)+1; } + if ($max_k > 0) { $bredde_k=int($BarWidth*$_login_k{$key}/$max_k)+1; } + print "$key"; + &ShowUserInfo($key); + if ($ShowAuthenticatedUsers =~ /P/i) { print "".($_login_p{$key}?$_login_p{$key}:" ").""; } + if ($ShowAuthenticatedUsers =~ /H/i) { print "$_login_h{$key}"; } + if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($_login_k{$key}).""; } + if ($ShowAuthenticatedUsers =~ /L/i) { print "".($_login_l{$key}?Format_Date($_login_l{$key},1):'-').""; } + print "\n"; + $total_p += $_login_p{$key}; + $total_h += $_login_h{$key}; + $total_k += $_login_k{$key}; + $count++; + } + $rest_p=$TotalPages-$total_p; + $rest_h=$TotalHits-$total_h; + $rest_k=$TotalBytes-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other logins + print "".($PageDir eq 'rtl'?"":"")."$Message[125]".($PageDir eq 'rtl'?"":"").""; + &ShowUserInfo(''); + if ($ShowAuthenticatedUsers =~ /P/i) { print "".($rest_p?$rest_p:" ").""; } + if ($ShowAuthenticatedUsers =~ /H/i) { print "$rest_h"; } + if ($ShowAuthenticatedUsers =~ /B/i) { print "".Format_Bytes($rest_k).""; } + if ($ShowAuthenticatedUsers =~ /L/i) { print " "; } + print "\n"; + } + &tab_end(); + } + + # BY ROBOTS + #---------------------------- + if ($ShowRobotsStats) { + if ($Debug) { debug("ShowRobotStats",2); } + print "$Center 
    \n"; + &tab_head("$Message[53] ($Message[77] $MaxNbOf{'RobotShown'})   -   $Message[80]   -   $Message[9]",19,0,'robots'); + print "".(scalar keys %_robot_h)." $Message[51]*"; + if ($ShowRobotsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowRobotsStats =~ /B/i) { print "$Message[75]"; } + if ($ShowRobotsStats =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=$total_r=0; + my $count=0; + &BuildKeyList($MaxNbOf{'RobotShown'},$MinHit{'Robot'},\%_robot_h,\%_robot_h); + foreach my $key (@keylist) { + print "".($PageDir eq 'rtl'?"":"").($RobotsHashIDLib{$key}?$RobotsHashIDLib{$key}:$key).($PageDir eq 'rtl'?"":"").""; + if ($ShowRobotsStats =~ /H/i) { print "".($_robot_h{$key}-$_robot_r{$key}).($_robot_r{$key}?"+$_robot_r{$key}":"").""; } + if ($ShowRobotsStats =~ /B/i) { print "".Format_Bytes($_robot_k{$key}).""; } + if ($ShowRobotsStats =~ /L/i) { print "".($_robot_l{$key}?Format_Date($_robot_l{$key},1):'-').""; } + print "\n"; + #$total_p += $_robot_p{$key}; + $total_h += $_robot_h{$key}; + $total_k += $_robot_k{$key}||0; + $total_r += $_robot_r{$key}||0; + $count++; + } + # For bots we need to count Totals + my $TotalPagesRobots = 0; #foreach (values %_robot_p) { $TotalPagesRobots+=$_; } + my $TotalHitsRobots = 0; foreach (values %_robot_h) { $TotalHitsRobots+=$_; } + my $TotalBytesRobots = 0; foreach (values %_robot_k) { $TotalBytesRobots+=$_; } + my $TotalRRobots = 0; foreach (values %_robot_r) { $TotalRRobots+=$_; } + $rest_p=0; #$rest_p=$TotalPagesRobots-$total_p; + $rest_h=$TotalHitsRobots-$total_h; + $rest_k=$TotalBytesRobots-$total_k; + $rest_r=$TotalRRobots-$total_r; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0 || $rest_r > 0) { # All other robots + print "$Message[2]"; + if ($ShowRobotsStats =~ /H/i) { print "".($rest_h-$rest_r).($rest_r?"+$rest_r":"").""; } + if ($ShowRobotsStats =~ /B/i) { print "".(Format_Bytes($rest_k)).""; } + if ($ShowRobotsStats =~ /L/i) { print " "; } + print "\n"; + } + &tab_end("* $Message[156]".($TotalRRobots?" $Message[157]":"")); + } + + # BY WORMS + #---------------------------- + if ($ShowWormsStats) { + if ($Debug) { debug("ShowWormsStats",2); } + print "$Center 
    \n"; + &tab_head("$Message[163] ($Message[77] $MaxNbOf{'WormsShown'})",19,0,'worms'); + print ""; + print "".(scalar keys %_worm_h)." $Message[164]*"; + print "$Message[167]"; + if ($ShowWormsStats =~ /H/i) { print "$Message[57]"; } + if ($ShowWormsStats =~ /B/i) { print "$Message[75]"; } + if ($ShowWormsStats =~ /L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + my $count=0; + &BuildKeyList($MaxNbOf{'WormsShown'},$MinHit{'Worm'},\%_worm_h,\%_worm_h); + foreach my $key (@keylist) { + print ""; + print "".($PageDir eq 'rtl'?"":"").($WormsHashLib{$key}?$WormsHashLib{$key}:$key).($PageDir eq 'rtl'?"":"").""; + print "".($PageDir eq 'rtl'?"":"").($WormsHashTarget{$key}?$WormsHashTarget{$key}:$key).($PageDir eq 'rtl'?"":"").""; + if ($ShowWormsStats =~ /H/i) { print "".$_worm_h{$key}.""; } + if ($ShowWormsStats =~ /B/i) { print "".Format_Bytes($_worm_k{$key}).""; } + if ($ShowWormsStats =~ /L/i) { print "".($_worm_l{$key}?Format_Date($_worm_l{$key},1):'-').""; } + print "\n"; + #$total_p += $_worm_p{$key}; + $total_h += $_worm_h{$key}; + $total_k += $_worm_k{$key}||0; + $count++; + } + # For worms we need to count Totals + my $TotalPagesWorms = 0; #foreach (values %_worm_p) { $TotalPagesWorms+=$_; } + my $TotalHitsWorms = 0; foreach (values %_worm_h) { $TotalHitsWorms+=$_; } + my $TotalBytesWorms = 0; foreach (values %_worm_k) { $TotalBytesWorms+=$_; } + $rest_p=0; #$rest_p=$TotalPagesRobots-$total_p; + $rest_h=$TotalHitsWorms-$total_h; + $rest_k=$TotalBytesWorms-$total_k; + if ($rest_p > 0 || $rest_h > 0 || $rest_k > 0) { # All other worms + print ""; + print "$Message[2]"; + print "-"; + if ($ShowWormsStats =~ /H/i) { print "".($rest_h).""; } + if ($ShowWormsStats =~ /B/i) { print "".(Format_Bytes($rest_k)).""; } + if ($ShowWormsStats =~ /L/i) { print " "; } + print "\n"; + } + &tab_end("* $Message[158]"); + } + + print "\n \n\n"; + + # BY SESSION + #---------------------------- + if ($ShowSessionsStats) { + if ($Debug) { debug("ShowSessionsStats",2); } + print "$Center 
    \n"; + my $title="$Message[117]"; + &tab_head($title,19,0,'sessions'); + my $Totals=0; foreach (@SessionsRange) { $average_s+=($_session{$_}||0)*$SessionsAverage{$_}; $Totals+=$_session{$_}||0; } + if ($Totals) { $average_s=int($average_s/$Totals); } + else { $average_s='?'; } + print "$Message[10]: $TotalVisits - $Message[96]: $average_s s$Message[10]$Message[15]\n"; + $average_s=0; + $total_s=0; + my $count=0; + foreach my $key (@SessionsRange) { + my $p=0; + if ($TotalVisits) { $p=int($_session{$key}/$TotalVisits*1000)/10; } + $total_s+=$_session{$key}||0; + print "$key"; + print "".($_session{$key}?$_session{$key}:" ").""; + print "".($_session{$key}?"$p %":" ").""; + print "\n"; + $count++; + } + $rest_s=$TotalVisits-$total_s; + if ($rest_s > 0) { # All others sessions + my $p=0; + if ($TotalVisits) { $p=int($rest_s/$TotalVisits*1000)/10; } + print "$Message[0]"; + print "$rest_s"; + print "".($rest_s?"$p %":" ").""; + print "\n"; + } + &tab_end(); + } + + # BY FILE TYPE + #------------------------- + if ($ShowFileTypesStats) { + if ($Debug) { debug("ShowFileTypesStatsCompressionStats",2); } + print "$Center 
    \n"; + my $Totalh=0; foreach (keys %_filetypes_h) { $Totalh+=$_filetypes_h{$_}; } + my $Totalk=0; foreach (keys %_filetypes_k) { $Totalk+=$_filetypes_k{$_}; } + my $title="$Message[73]"; + if ($ShowFileTypesStats =~ /C/i) { $title.=" - $Message[98]"; } + &tab_head("$title",19,0,'filetypes'); + print "$Message[73]"; + if ($ShowFileTypesStats =~ /H/i) { print "$Message[57]$Message[15]"; } + if ($ShowFileTypesStats =~ /B/i) { print "$Message[75]$Message[15]"; } + if ($ShowFileTypesStats =~ /C/i) { print "$Message[100]$Message[101]$Message[99]"; } + print "\n"; + my $total_con=0; my $total_cre=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,1,\%_filetypes_h,\%_filetypes_h); + foreach my $key (@keylist) { + my $p_h=' '; my $p_k=' '; + if ($Totalh) { $p_h=int($_filetypes_h{$key}/$Totalh*1000)/10; $p_h="$p_h %"; } + if ($Totalk) { $p_k=int($_filetypes_k{$key}/$Totalk*1000)/10; $p_k="$p_k %"; } + if ($key eq 'Unknown') { + print "$Message[0]"; + } + else { + my $nameicon=$MimeHashIcon{$key}||"notavailable"; + my $nametype=$MimeHashLib{$MimeHashFamily{$key}||""}||" "; + print "$key"; + print "$nametype"; + } + if ($ShowFileTypesStats =~ /H/i) { print "$_filetypes_h{$key}$p_h"; } + if ($ShowFileTypesStats =~ /B/i) { print "".Format_Bytes($_filetypes_k{$key})."$p_k"; } + if ($ShowFileTypesStats =~ /C/i) { + if ($_filetypes_gz_in{$key}) { + my $percent=int(100*(1-$_filetypes_gz_out{$key}/$_filetypes_gz_in{$key})); + printf("%s%s%s (%s%)",Format_Bytes($_filetypes_gz_in{$key}),Format_Bytes($_filetypes_gz_out{$key}),Format_Bytes($_filetypes_gz_in{$key}-$_filetypes_gz_out{$key}),$percent); + $total_con+=$_filetypes_gz_in{$key}; + $total_cre+=$_filetypes_gz_out{$key}; + } + else { + print "   "; + } + } + print "\n"; + $count++; + } + # Add total (only usefull if compression is enabled) + if ($ShowFileTypesStats =~ /C/i) { + my $colspan=3; + if ($ShowFileTypesStats =~ /H/i) { $colspan+=2; } + if ($ShowFileTypesStats =~ /B/i) { $colspan+=2; } + print ""; + print "$Message[98]"; + if ($ShowFileTypesStats =~ /C/i) { + if ($total_con) { + my $percent=int(100*(1-$total_cre/$total_con)); + printf("%s%s%s (%s%)",Format_Bytes($total_con),Format_Bytes($total_cre),Format_Bytes($total_con-$total_cre),$percent); + } + else { + print "   "; + } + } + print "\n"; + } + &tab_end(); + } + + # BY FILE SIZE + #------------------------- + if ($ShowFileSizesStats) { + + } + + # BY FILE/URL + #------------------------- + if ($ShowPagesStats) { + if ($Debug) { debug("ShowPagesStats (MaxNbOf{'PageShown'}=$MaxNbOf{'PageShown'} TotalDifferentPages=$TotalDifferentPages)",2); } + print "$Center   
    \n"; + my $title="$Message[19] ($Message[77] $MaxNbOf{'PageShown'})   -   $Message[80]"; + if ($ShowPagesStats =~ /E/i) { $title.="   -   $Message[104]"; } + if ($ShowPagesStats =~ /X/i) { $title.="   -   $Message[116]"; } + &tab_head("$title",19,0,'urls'); + print "$TotalDifferentPages $Message[28]"; + if ($ShowPagesStats =~ /P/i) { print "$Message[29]"; } + if ($ShowPagesStats =~ /B/i) { print "$Message[106]"; } + if ($ShowPagesStats =~ /E/i) { print "$Message[104]"; } + if ($ShowPagesStats =~ /X/i) { print "$Message[116]"; } + # Call to plugins' function ShowPagesAddField + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { + my $function="ShowPagesAddField_$pluginname('title')"; + eval("$function"); + } + print " \n"; + $total_p=$total_e=$total_x=$total_k=0; + $max_p=1; $max_k=1; + my $count=0; + &BuildKeyList($MaxNbOf{'PageShown'},$MinHit{'File'},\%_url_p,\%_url_p); + foreach my $key (@keylist) { + if ($_url_p{$key} > $max_p) { $max_p = $_url_p{$key}; } + if ($_url_k{$key}/($_url_p{$key}||1) > $max_k) { $max_k = $_url_k{$key}/($_url_p{$key}||1); } + } + foreach my $key (@keylist) { + print ""; + &ShowURLInfo($key); + print ""; + my $bredde_p=0; my $bredde_e=0; my $bredde_x=0; my $bredde_k=0; + if ($max_p > 0) { $bredde_p=int($BarWidth*($_url_p{$key}||0)/$max_p)+1; } + if (($bredde_p==1) && $_url_p{$key}) { $bredde_p=2; } + if ($max_p > 0) { $bredde_e=int($BarWidth*($_url_e{$key}||0)/$max_p)+1; } + if (($bredde_e==1) && $_url_e{$key}) { $bredde_e=2; } + if ($max_p > 0) { $bredde_x=int($BarWidth*($_url_x{$key}||0)/$max_p)+1; } + if (($bredde_x==1) && $_url_x{$key}) { $bredde_x=2; } + if ($max_k > 0) { $bredde_k=int($BarWidth*(($_url_k{$key}||0)/($_url_p{$key}||1))/$max_k)+1; } + if (($bredde_k==1) && $_url_k{$key}) { $bredde_k=2; } + if ($ShowPagesStats =~ /P/i) { print "$_url_p{$key}"; } + if ($ShowPagesStats =~ /B/i) { print "".($_url_k{$key}?Format_Bytes($_url_k{$key}/($_url_p{$key}||1)):" ").""; } + if ($ShowPagesStats =~ /E/i) { print "".($_url_e{$key}?$_url_e{$key}:" ").""; } + if ($ShowPagesStats =~ /X/i) { print "".($_url_x{$key}?$_url_x{$key}:" ").""; } + # Call to plugins' function ShowPagesAddField + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { + my $function="ShowPagesAddField_$pluginname('$key')"; + eval("$function"); + } + print ""; + if ($ShowPagesStats =~ /P/i) { print "
    "; } + if ($ShowPagesStats =~ /B/i) { print "
    "; } + if ($ShowPagesStats =~ /E/i) { print "
    "; } + if ($ShowPagesStats =~ /X/i) { print ""; } + print "\n"; + $total_p += $_url_p{$key}; + $total_e += $_url_e{$key}; + $total_x += $_url_x{$key}; + $total_k += $_url_k{$key}; + $count++; + } + $rest_p=$TotalPages-$total_p; + $rest_e=$TotalEntries-$total_e; + $rest_x=$TotalExits-$total_x; + $rest_k=$TotalBytesPages-$total_k; + if ($rest_p > 0 || $rest_k > 0 || $rest_e > 0 || $rest_x > 0) { # All other urls + print "$Message[2]"; + if ($ShowPagesStats =~ /P/i) { print "$rest_p"; } + if ($ShowPagesStats =~ /B/i) { print "".($rest_k?Format_Bytes($rest_k/($rest_p||1)):" ").""; } + if ($ShowPagesStats =~ /E/i) { print "".($rest_e?$rest_e:" ").""; } + if ($ShowPagesStats =~ /X/i) { print "".($rest_x?$rest_x:" ").""; } + # Call to plugins' function ShowPagesAddField + foreach my $pluginname (keys %{$PluginsLoaded{'ShowPagesAddField'}}) { + my $function="ShowPagesAddField_$pluginname('')"; + eval("$function"); + } + print " \n"; + } + &tab_end(); + } + + # BY OS + #---------------------------- + if ($ShowOSStats) { + if ($Debug) { debug("ShowOSStats",2); } + print "$Center 
    \n"; + my $Totalh=0; my %new_os_h=(); + OSLOOP: foreach my $key (keys %_os_h) { + $Totalh+=$_os_h{$key}; + foreach my $family (@OSFamily) { if ($key =~ /^$family/i) { $new_os_h{"${family}cumul"}+=$_os_h{$key}; next OSLOOP; } } + $new_os_h{$key}+=$_os_h{$key}; + } + my $title="$Message[59] ($Message[77] $MaxNbOf{'OsShown'})   -   $Message[80]/$Message[58]   -   $Message[0]"; + &tab_head("$title",19,0,'os'); + print " $Message[59]$Message[57]$Message[15]\n"; + $total_h=0; + my $count=0; + &BuildKeyList($MaxNbOf{'OsShown'},$MinHit{'Os'},\%new_os_h,\%new_os_h); + foreach my $key (@keylist) { + my $p=' '; + if ($Totalh) { $p=int($new_os_h{$key}/$Totalh*1000)/10; $p="$p %"; } + if ($key eq 'Unknown') { + print "$Message[0]$_os_h{$key}$p\n"; + } + else { + my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; + my $libos=$OSHashLib{$keywithoutcumul}||$keywithoutcumul; + my $nameicon=$keywithoutcumul; $nameicon =~ s/[^\w]//g; + # TODO Use OSFamilyLib + if ($libos eq 'win') { $libos="Windows"; } + if ($libos eq 'mac') { $libos="Macintosh"; } + print "$libos$new_os_h{$key}$p\n"; + } + $total_h += $new_os_h{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $Totalh / $total_h",2); } + $rest_h=$Totalh-$total_h; + if ($rest_h > 0) { + my $p; + if ($Totalh) { $p=int($rest_h/$Totalh*1000)/10; } + print ""; + print " "; + print "$Message[2]$rest_h"; + print "$p %\n"; + } + &tab_end(); + } + + # BY BROWSER + #---------------------------- + if ($ShowBrowsersStats) { + if ($Debug) { debug("ShowBrowsersStats",2); } + print "$Center 
    \n"; + my $Totalh=0; my %new_browser_h=(); + BROWSERLOOP: foreach my $key (keys %_browser_h) { + $Totalh+=$_browser_h{$key}; + foreach my $family (keys %BrowsersFamily) { if ($key =~ /^$family/i) { $new_browser_h{"${family}cumul"}+=$_browser_h{$key}; next BROWSERLOOP; } } + $new_browser_h{$key}+=$_browser_h{$key}; + } + my $title="$Message[21] ($Message[77] $MaxNbOf{'BrowsersShown'})   -   $Message[80]/$Message[58]   -   $Message[0]"; + &tab_head("$title",19,0,'browsers'); + print " $Message[21]$Message[111]$Message[57]$Message[15]\n"; + $total_h=0; + my $count=0; + &BuildKeyList($MaxNbOf{'BrowsersShown'},$MinHit{'Browser'},\%new_browser_h,\%new_browser_h); + foreach my $key (@keylist) { + my $p=' '; + if ($Totalh) { $p=int($new_browser_h{$key}/$Totalh*1000)/10; $p="$p %"; } + if ($key eq 'Unknown') { + print "$Message[0]?$_browser_h{$key}$p\n"; + } + else { + my $keywithoutcumul=$key; $keywithoutcumul =~ s/cumul$//i; + my $libbrowser=$BrowsersHashIDLib{$keywithoutcumul}||$keywithoutcumul; + my $nameicon=$BrowsersHashIcon{$keywithoutcumul}||"notavailable"; + if ($BrowsersFamily{$keywithoutcumul}) { $libbrowser="$libbrowser"; } + print "".($PageDir eq 'rtl'?"":"")."$libbrowser".($PageDir eq 'rtl'?"":"")."".($BrowsersHereAreGrabbers{$key}?"$Message[112]":"$Message[113]")."$new_browser_h{$key}$p\n"; + } + $total_h += $new_browser_h{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $Totalh / $total_h",2); } + $rest_h=$Totalh-$total_h; + if ($rest_h > 0) { + my $p; + if ($Totalh) { $p=int($rest_h/$Totalh*1000)/10; } + print ""; + print " "; + print "$Message[2] $rest_h"; + print "$p %\n"; + } + &tab_end(); + } + + # BY SCREEN SIZE + #---------------------------- + if ($ShowScreenSizeStats) { + if ($Debug) { debug("ShowScreenSizeStats",2); } + print "$Center 
    \n"; + my $Totalh=0; foreach (keys %_screensize_h) { $Totalh+=$_screensize_h{$_}; } + my $title="$Message[135] ($Message[77] $MaxNbOf{'ScreenSizesShown'})"; + &tab_head("$title",0,0,'screensizes'); + print "$Message[135]$Message[15]\n"; + my $total_h=0; + my $count=0; + &BuildKeyList($MaxNbOf{'ScreenSizesShown'},$MinHit{'ScreenSize'},\%_screensize_h,\%_screensize_h); + foreach my $key (@keylist) { + my $p=' '; + if ($Totalh) { $p=int($_screensize_h{$key}/$Totalh*1000)/10; $p="$p %"; } + $total_h+=$_screensize_h{$key}||0; + print ""; + if ($key eq 'Unknown') { + print "$Message[0]"; + print "$p"; + } + else { + my $screensize=$key; + print "$screensize"; + print "$p"; + } + print "\n"; + $count++; + } + $rest_h=$Totalh-$total_h; + if ($rest_h > 0) { # All others sessions + my $p=0; + if ($Totalh) { $p=int($rest_h/$Totalh*1000)/10; } + print "$Message[2]"; + print "".($rest_h?"$p %":" ").""; + print "\n"; + } + &tab_end(); + } + + print "\n \n\n"; + + # BY REFERENCE + #--------------------------- + if ($ShowOriginStats) { + if ($Debug) { debug("ShowOriginStats",2); } + print "$Center 
    \n"; + my $Totalp=0; foreach (0..5) { $Totalp+=($_ != 4 || $IncludeInternalLinksInOriginSection)?$_from_p[$_]:0; } + my $Totalh=0; foreach (0..5) { $Totalh+=($_ != 4 || $IncludeInternalLinksInOriginSection)?$_from_h[$_]:0; } + &tab_head($Message[36],19,0,'referer'); + my @p_p=(0,0,0,0,0,0); + if ($Totalp > 0) { + $p_p[0]=int($_from_p[0]/$Totalp*1000)/10; + $p_p[1]=int($_from_p[1]/$Totalp*1000)/10; + $p_p[2]=int($_from_p[2]/$Totalp*1000)/10; + $p_p[3]=int($_from_p[3]/$Totalp*1000)/10; + $p_p[4]=int($_from_p[4]/$Totalp*1000)/10; + $p_p[5]=int($_from_p[5]/$Totalp*1000)/10; + } + my @p_h=(0,0,0,0,0,0); + if ($Totalh > 0) { + $p_h[0]=int($_from_h[0]/$Totalh*1000)/10; + $p_h[1]=int($_from_h[1]/$Totalh*1000)/10; + $p_h[2]=int($_from_h[2]/$Totalh*1000)/10; + $p_h[3]=int($_from_h[3]/$Totalh*1000)/10; + $p_h[4]=int($_from_h[4]/$Totalh*1000)/10; + $p_h[5]=int($_from_h[5]/$Totalh*1000)/10; + } + print "$Message[37]"; + if ($ShowOriginStats =~ /P/i) { print "$Message[56]$Message[15]"; } + if ($ShowOriginStats =~ /H/i) { print "$Message[57]$Message[15]"; } + print "\n"; + #------- Referrals by direct address/bookmarks + print "$Message[38]"; + if ($ShowOriginStats =~ /P/i) { print "".($_from_p[0]?$_from_p[0]:" ")."".($_from_p[0]?"$p_p[0] %":" ").""; } + if ($ShowOriginStats =~ /H/i) { print "".($_from_h[0]?$_from_h[0]:" ")."".($_from_h[0]?"$p_h[0] %":" ").""; } + print "\n"; + #------- Referrals by news group + print "$Message[107]"; + if ($ShowOriginStats =~ /P/i) { print "".($_from_p[5]?$_from_p[5]:" ")."".($_from_p[5]?"$p_p[5] %":" ").""; } + if ($ShowOriginStats =~ /H/i) { print "".($_from_h[5]?$_from_h[5]:" ")."".($_from_h[5]?"$p_h[5] %":" ").""; } + print "\n"; + #------- Referrals by search engines + print "$Message[40] - $Message[80]
    \n"; + if (scalar keys %_se_referrals_h) { + print "\n"; + $total_p=0; $total_h=0; + my $count=0; + &BuildKeyList($MaxNbOf{'RefererShown'},$MinHit{'Refer'},\%_se_referrals_h,((scalar keys %_se_referrals_p)?\%_se_referrals_p:\%_se_referrals_h)); + foreach my $key (@keylist) { + my $newreferer=CleanFromCSSA($SearchEnginesHashLib{$key}||$key); + print ""; + print ""; + print ""; + print "\n"; + $total_p += $_se_referrals_p{$key}; + $total_h += $_se_referrals_h{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalSearchEnginesPages / $total_p - $TotalSearchEnginesHits / $total_h",2); } + $rest_p=$TotalSearchEnginesPages-$total_p; + $rest_h=$TotalSearchEnginesHits-$total_h; + if ($rest_p > 0 || $rest_h > 0) { + print ""; + print ""; + print ""; + print "\n"; + } + print "
    - $newreferer".($_se_referrals_p{$key}?$_se_referrals_p{$key}:'0')."$_se_referrals_h{$key}
    - $Message[2]$rest_p$rest_h
    "; + } + print "\n"; + if ($ShowOriginStats =~ /P/i) { print "".($_from_p[2]?$_from_p[2]:" ")."".($_from_p[2]?"$p_p[2] %":" ").""; } + if ($ShowOriginStats =~ /H/i) { print "".($_from_h[2]?$_from_h[2]:" ")."".($_from_h[2]?"$p_h[2] %":" ").""; } + print "\n"; + #------- Referrals by external HTML link + print "$Message[41] - $Message[80]
    \n"; + if (scalar keys %_pagesrefs_h) { + print "\n"; + $total_p=0; $total_h=0; + my $count=0; + &BuildKeyList($MaxNbOf{'RefererShown'},$MinHit{'Refer'},\%_pagesrefs_h,((scalar keys %_pagesrefs_p)?\%_pagesrefs_p:\%_pagesrefs_h)); + foreach my $key (@keylist) { + print ""; + print ""; + print ""; + print "\n"; + $total_p += $_pagesrefs_p{$key}; + $total_h += $_pagesrefs_h{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalRefererPages / $total_p - $TotalRefererHits / $total_h",2); } + $rest_p=$TotalRefererPages-$total_p; + $rest_h=$TotalRefererHits-$total_h; + if ($rest_p > 0 || $rest_h > 0) { + print ""; + print ""; + print ""; + print "\n"; + } + print "
    - "; + &ShowURLInfo($key); + print "".($_pagesrefs_p{$key}?$_pagesrefs_p{$key}:'0')."$_pagesrefs_h{$key}
    - $Message[2]$rest_p$rest_h
    "; + } + print "\n"; + if ($ShowOriginStats =~ /P/i) { print "".($_from_p[3]?$_from_p[3]:" ")."".($_from_p[3]?"$p_p[3] %":" ").""; } + if ($ShowOriginStats =~ /H/i) { print "".($_from_h[3]?$_from_h[3]:" ")."".($_from_h[3]?"$p_h[3] %":" ").""; } + print "\n"; + #------- Referrals by internal HTML link + if ($IncludeInternalLinksInOriginSection) { + print "$Message[42]"; + if ($ShowOriginStats =~ /P/i) { print "".($_from_p[4]?$_from_p[4]:" ")."".($_from_p[4]?"$p_p[4] %":" ").""; } + if ($ShowOriginStats =~ /H/i) { print "".($_from_h[4]?$_from_h[4]:" ")."".($_from_h[4]?"$p_h[4] %":" ").""; } + print "\n"; + } + #------- Unknown origin + print "$Message[39]"; + if ($ShowOriginStats =~ /P/i) { print "".($_from_p[1]?$_from_p[1]:" ")."".($_from_p[1]?"$p_p[1] %":" ").""; } + if ($ShowOriginStats =~ /H/i) { print "".($_from_h[1]?$_from_h[1]:" ")."".($_from_h[1]?"$p_h[1] %":" ").""; } + print "\n"; + &tab_end(); + } + + print "\n \n\n"; + + # BY SEARCH KEYWORDS AND/OR KEYPHRASES + #------------------------------------- + if ($ShowKeyphrasesStats) { print "$Center "; } + if ($ShowKeywordsStats) { print "$Center "; } + if ($ShowKeyphrasesStats || $ShowKeywordsStats) { print "
    \n"; } + if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print ""; } + if ($ShowKeyphrasesStats) { + # By Keyphrases + if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; + $total_s=0; + my $count=0; + &BuildKeyList($MaxNbOf{'KeyphrasesShown'},$MinHit{'Keyphrase'},\%_keyphrases,\%_keyphrases); + foreach my $key (@keylist) { + my $mot; + # Convert coded keywords (utf8,...) to be correctly reported in HTML page. + if ($PluginsLoaded{'DecodeKey'}{'decodeutfkeys'}) { $mot=CleanFromCSSA(DecodeKey_decodeutfkeys($key,$PageCode||'iso-8859-1')); } + else { $mot = CleanFromCSSA(DecodeEncodedString($key)); } + my $p; + if ($TotalKeyphrases) { $p=int($_keyphrases{$key}/$TotalKeyphrases*1000)/10; } + print "\n"; + $total_s += $_keyphrases{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalKeyphrases / $total_s",2); } + $rest_s=$TotalKeyphrases-$total_s; + if ($rest_s > 0) { + my $p; + if ($TotalKeyphrases) { $p=int($rest_s/$TotalKeyphrases*1000)/10; } + print ""; + print "\n"; + } + &tab_end(); + if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; } + } + if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print ""; } + if ($ShowKeywordsStats) { + # By Keywords + if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; + $total_s=0; + my $count=0; + &BuildKeyList($MaxNbOf{'KeywordsShown'},$MinHit{'Keyword'},\%_keywords,\%_keywords); + foreach my $key (@keylist) { + my $mot; + # Convert coded keywords (utf8,...) to be correctly reported in HTML page. + if ($PluginsLoaded{'DecodeKey'}{'decodeutfkeys'}) { $mot=CleanFromCSSA(DecodeKey_decodeutfkeys($key,$PageCode||'iso-8859-1')); } + else { $mot = CleanFromCSSA(DecodeEncodedString($key)); } + my $p; + if ($TotalKeywords) { $p=int($_keywords{$key}/$TotalKeywords*1000)/10; } + print "\n"; + $total_s += $_keywords{$key}; + $count++; + } + if ($Debug) { debug("Total real / shown : $TotalKeywords / $total_s",2); } + $rest_s=$TotalKeywords-$total_s; + if ($rest_s > 0) { + my $p; + if ($TotalKeywords) { $p=int($rest_s/$TotalKeywords*1000)/10; } + print ""; + print "\n"; + } + &tab_end(); + if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "\n"; } + } + if ($ShowKeyphrasesStats && $ShowKeywordsStats) { print "
    \n"; } + if ($Debug) { debug("ShowKeyphrasesStats",2); } + &tab_head("$Message[120] ($Message[77] $MaxNbOf{'KeyphrasesShown'})
    $Message[80]",19,($ShowKeyphrasesStats && $ShowKeywordsStats)?95:70,'keyphrases'); + print "
    $TotalDifferentKeyphrases $Message[103]$Message[14]$Message[15]
    ".XMLEncode($mot)."$_keyphrases{$key}$p %
    $Message[124]$rest_s$p %
      \n"; } + if ($Debug) { debug("ShowKeywordsStats",2); } + &tab_head("$Message[121] ($Message[77] $MaxNbOf{'KeywordsShown'})
    $Message[80]",19,($ShowKeyphrasesStats && $ShowKeywordsStats)?95:70,'keywords'); + print "
    $TotalDifferentKeywords $Message[13]$Message[14]$Message[15]
    ".XMLEncode($mot)."$_keywords{$key}$p %
    $Message[30]$rest_s$p %
    \n"; } + + print "\n \n\n"; + + # BY MISC + #---------------------------- + if ($ShowMiscStats) { + if ($Debug) { debug("ShowMiscStats",2); } + print "$Center 
    \n"; + my $Totalh=0; my %new_browser_h=(); + if ($_misc_h{'AddToFavourites'}) { + foreach my $key (keys %_browser_h) { + $Totalh+=$_browser_h{$key}; + if ($key =~ /^msie/i) { $new_browser_h{"msiecumul"}+=$_browser_h{$key}; } + } + if ($new_browser_h{'msiecumul'}) { $_misc_h{'AddToFavourites'}=int(0.5+$_misc_h{'AddToFavourites'}*$Totalh/$new_browser_h{'msiecumul'}); } + } + my $title="$Message[139]"; + &tab_head("$title",19,0,'misc'); + print "$Message[139]"; + print " "; + print " "; + print "\n"; + my %label=('AddToFavourites'=>$Message[137],'JavascriptDisabled'=>$Message[168],'JavaEnabled'=>$Message[140],'DirectorSupport'=>$Message[141], + 'FlashSupport'=>$Message[142],'RealPlayerSupport'=>$Message[143],'QuickTimeSupport'=>$Message[144], + 'WindowsMediaPlayerSupport'=>$Message[145],'PDFSupport'=>$Message[146]); + foreach my $key (@MiscListOrder) { + my $mischar=substr($key,0,1); + if ($ShowMiscStats !~ /$mischar/i) { next; } + my $total=0; + my $p; + if ($MiscListCalc{$key} eq 'v') { $total=$TotalVisits; } + if ($MiscListCalc{$key} eq 'u') { $total=$TotalUnique; } + if ($MiscListCalc{$key} eq 'hm') { $total=$_misc_h{'TotalMisc'}||0; } + if ($total) { $p=int($_misc_h{$key}/$total*1000)/10; } + print ""; + print "".($PageDir eq 'rtl'?"":"").$label{$key}.($PageDir eq 'rtl'?"":"").""; + if ($MiscListCalc{$key} eq 'v') { print "".($_misc_h{$key}||0)." / $total $Message[12]"; } + if ($MiscListCalc{$key} eq 'u') { print "".($_misc_h{$key}||0)." / $total $Message[18]"; } + if ($MiscListCalc{$key} eq 'hm') { print "-"; } + print "".($total?"$p %":" ").""; + print "\n"; + } + &tab_end(); + } + + # BY HTTP STATUS + #---------------------------- + if ($ShowHTTPErrorsStats) { + if ($Debug) { debug("ShowHTTPErrorsStats",2); } + print "$Center 
    \n"; + my $title="$Message[32]"; + &tab_head("$title",19,0,'errors'); + print "$Message[32]*$Message[57]$Message[15]$Message[75]\n"; + $total_h=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,1,\%_errors_h,\%_errors_h); + foreach my $key (@keylist) { + my $p=int($_errors_h{$key}/$TotalHitsErrors*1000)/10; + print ""; + if ($TrapInfosForHTTPErrorCodes{$key}) { print "$key"; } + else { print "$key"; } + print "".($httpcodelib{$key}?$httpcodelib{$key}:'Unknown error')."$_errors_h{$key}$p %".Format_Bytes($_errors_k{$key}).""; + print "\n"; + $total_h+=$_errors_h{$key}; + $count++; + } + &tab_end("* $Message[154]"); + } + + # BY SMTP STATUS + #---------------------------- + if ($ShowSMTPErrorsStats) { + if ($Debug) { debug("ShowSMTPErrorsStats",2); } + print "$Center 
    \n"; + my $title="$Message[147]"; + &tab_head("$title",19,0,'errors'); + print "$Message[147]$Message[57]$Message[15]$Message[75]\n"; + $total_h=0; + my $count=0; + &BuildKeyList($MaxRowsInHTMLOutput,1,\%_errors_h,\%_errors_h); + foreach my $key (@keylist) { + my $p=int($_errors_h{$key}/$TotalHitsErrors*1000)/10; + print ""; + print "$key"; + print "".($smtpcodelib{$key}?$smtpcodelib{$key}:'Unknown error')."$_errors_h{$key}$p %".Format_Bytes($_errors_k{$key}).""; + print "\n"; + $total_h+=$_errors_h{$key}; + $count++; + } + &tab_end(); + } + + # BY CLUSTER + #---------------------------- + if ($ShowClusterStats) { + if ($Debug) { debug("ShowClusterStats",2); } + print "$Center 
    \n"; + my $title="$Message[155]"; + &tab_head("$title",19,0,'clusters'); + print "$Message[155]"; + &ShowClusterInfo('__title__'); + if ($ShowClusterStats =~ /P/i) { print "$Message[56]$Message[15]"; } + if ($ShowClusterStats =~ /H/i) { print "$Message[57]$Message[15]"; } + if ($ShowClusterStats =~ /B/i) { print "$Message[75]$Message[15]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + # Cluster feature might have been enable in middle of month so we recalculate + # total for cluster section only, to calculate ratio, instead of using global total + foreach my $key (keys %_cluster_h) { + $total_p+=int($_cluster_p{$key}||0); + $total_h+=int($_cluster_h{$key}||0); + $total_k+=int($_cluster_k{$key}||0); + } + my $count=0; + foreach my $key (keys %_cluster_h) { + my $p_p=int($_cluster_p{$key}/$total_p*1000)/10; + my $p_h=int($_cluster_h{$key}/$total_h*1000)/10; + my $p_k=int($_cluster_k{$key}/$total_k*1000)/10; + print ""; + print "Computer $key"; + &ShowClusterInfo($key); + if ($ShowClusterStats =~ /P/i) { print "".($_cluster_p{$key}?$_cluster_p{$key}:" ")."$p_p %"; } + if ($ShowClusterStats =~ /H/i) { print "$_cluster_h{$key}$p_h %"; } + if ($ShowClusterStats =~ /B/i) { print "".Format_Bytes($_cluster_k{$key})."$p_k %"; } + print "\n"; + $count++; + } + &tab_end(); + } + + # BY EXTRA SECTIONS + #---------------------------- + foreach my $extranum (1..@ExtraName-1) { + if ($Debug) { debug("ExtraName$extranum",2); } + print "$Center 
    "; + my $title=$ExtraName[$extranum]; + &tab_head("$title",19,0,"extra$extranum"); + print ""; + print "".$ExtraFirstColumnTitle[$extranum].""; + if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "$Message[56]"; } + if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "$Message[57]"; } + if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "$Message[75]"; } + if ($ExtraStatTypes[$extranum] =~ m/L/i) { print "$Message[9]"; } + print "\n"; + $total_p=$total_h=$total_k=0; + #$max_h=1; foreach (values %_login_h) { if ($_ > $max_h) { $max_h = $_; } } + #$max_k=1; foreach (values %_login_k) { if ($_ > $max_k) { $max_k = $_; } } + my $count=0; + if ($ExtraStatTypes[$extranum] =~ m/P/i) { + &BuildKeyList($MaxNbOfExtra[$extranum],$MinHitExtra[$extranum],\%{'_section_' . $extranum . '_h'},\%{'_section_' . $extranum . '_p'}); + } + else { + &BuildKeyList($MaxNbOfExtra[$extranum],$MinHitExtra[$extranum],\%{'_section_' . $extranum . '_h'},\%{'_section_' . $extranum . '_h'}); + } + foreach my $key (@keylist) { + my $firstcol = CleanFromCSSA(DecodeEncodedString($key)); + $total_p+=${'_section_' . $extranum . '_p'}{$key}; + $total_h+=${'_section_' . $extranum . '_h'}{$key}; + $total_k+=${'_section_' . $extranum . '_k'}{$key}; + print ""; + printf("$ExtraFirstColumnFormat[$extranum]", $firstcol, $firstcol, $firstcol, $firstcol, $firstcol); + if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "" . ${'_section_' . $extranum . '_p'}{$key} . ""; } + if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "" . ${'_section_' . $extranum . '_h'}{$key} . ""; } + if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "" . Format_Bytes(${'_section_' . $extranum . '_k'}{$key}) . ""; } + if ($ExtraStatTypes[$extranum] =~ m/L/i) { print "" . (${'_section_' . $extranum . '_l'}{$key}?Format_Date(${'_section_' . $extranum . '_l'}{$key},1):'-') . ""; } + print "\n"; + $count++; + } + if ($ExtraAddAverageRow[$extranum]) { + print ""; + print "$Message[96]"; + if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "" . ($count?($total_p/$count):" ") . ""; } + if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "" . ($count?($total_h/$count):" ") . ""; } + if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "" . ($count?Format_Bytes($total_k/$count):" ") . ""; } + if ($ExtraStatTypes[$extranum] =~ m/L/i) { print " "; } + print "\n"; + } + if ($ExtraAddSumRow[$extranum]) { + print ""; + print "$Message[102]"; + if ($ExtraStatTypes[$extranum] =~ m/P/i) { print "" . ($total_p) . ""; } + if ($ExtraStatTypes[$extranum] =~ m/H/i) { print "" . ($total_h) . ""; } + if ($ExtraStatTypes[$extranum] =~ m/B/i) { print "" . Format_Bytes($total_k) . ""; } + if ($ExtraStatTypes[$extranum] =~ m/L/i) { print " "; } + print "\n"; + } + &tab_end(); + } + + &html_end(1); + } +} +else { + print "Jumped lines in file: $lastlinenb\n"; + if ($lastlinenb) { print " Found $lastlinenb already parsed records.\n"; } + print "Parsed lines in file: $NbOfLinesParsed\n"; + print " Found $NbOfLinesDropped dropped records,\n"; + print " Found $NbOfLinesCorrupted corrupted records,\n"; + print " Found $NbOfOldLines old records,\n"; + print " Found $NbOfNewLines new qualified records.\n"; +} + +#sleep 10; + +0; # Do not remove this line + + +#------------------------------------------------------- +# ALGORITHM SUMMARY +# +# Read_Config(); +# Check_Config() and Init variables +# if 'frame not index' +# &Read_Language_Data($Lang); +# if 'frame not mainleft' +# &Read_Ref_Data(); +# &Read_Plugins(); +# html_head +# +# If 'migrate' +# We create/update tmp file with +# &Read_History_With_TmpUpdate(year,month,UPDATE,NOPURGE,"all"); +# Rename the tmp file +# html_end +# Exit +# End of 'migrate' +# +# Get last history file name +# Get value for $LastLine $LastLineNumber $LastLineOffset $LastLineChecksum with +# &Read_History_With_TmpUpdate(lastyear,lastmonth,NOUPDATE,NOPURGE,"general"); +# +# &Init_HashArray() +# +# If 'update' +# Loop on each new line in log file +# lastlineoffset=lastlineoffsetnext; lastlineoffsetnext=file pointer position +# If line corrupted, skip --> next on loop +# Drop wrong virtual host --> next on loop +# Drop wrong method/protocol --> next on loop +# Check date --> next on loop +# If line older than $LastLine, skip --> next on loop +# So it's new line +# $LastLine = time or record +# Skip if url is /robots.txt --> next on loop +# Skip line for @SkipHosts --> next on loop +# Skip line for @SkipFiles --> next on loop +# Skip line for @SkipUserAgent --> next on loop +# Skip line for not @OnlyHosts --> next on loop +# Skip line for not @OnlyFiles --> next on loop +# Skip line for not @OnlyUserAgent --> next on loop +# Skip line for not @OnlyUsers --> next on loop +# Skip line for not @OnlyLines --> next on loop +# So it's new line approved +# If other month/year, create/update tmp file and purge data arrays with +# &Read_History_With_TmpUpdate(lastprocessedyear,lastprocessedmonth,UPDATE,PURGE,"all",lastlinenb,lastlineoffset,CheckSum($_)); +# Define a clean Url and Query (set urlwithnoquery, tokenquery and standalonequery and $field[$pos_url]) +# Define PageBool and extension +# Analyze: Misc tracker --> complete %misc +# Analyze: Add to favorites --> complete %_misc, countedtraffic=1 (not counted anywhere) +# If (!countedtraffic) Analyze: Worms --> complete %_worms, countedtraffic=1 +# If (!countedtraffic) Analyze: Status code --> complete %_error_, %_sider404, %_referrer404 --> countedtraffic=1 +# If (!countedtraffic) Analyze: Robots known --> complete %_robot, countedtraffic=1 +# If (!countedtraffic) Analyze: Robots unknown on robots.txt --> complete %_robot, countedtraffic=1 +# If (!countedtraffic) Analyze: File types - Compression +# If (!countedtraffic) Analyze: Date - Hour - Pages - Hits - Kilo +# If (!countedtraffic) Analyze: Login +# If (!countedtraffic) Do DNS Lookup +# If (!countedtraffic) Analyze: Country +# If (!countedtraffic) Analyze: Host - Url - Session +# If (!countedtraffic) Analyze: Browser - OS +# If (!countedtraffic) Analyze: Referer +# If (!countedtraffic) Analyze: EMail +# Analyze: Cluster +# Analyze: Extra (must be after 'Define a clean Url and Query') +# If too many records, we flush data arrays with +# &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,UPDATE,PURGE,"all",lastlinenb,lastlineoffset,CheckSum($_)); +# End of loop +# Create/update tmp file +# Seek to lastlineoffset to read and get last line into $_ +# &Read_History_With_TmpUpdate($lastprocessedyear,$lastprocessedmonth,UPDATE,PURGE,"all",lastlinenb,lastlineoffset,CheckSum($_)) +# Rename all tmp files +# End of 'update' +# +# &Init_HashArray() +# +# If 'output' +# Loop for each month of required year +# &Read_History_With_TmpUpdate($YearRequired,monthloop,NOUPDATE,NOPURGE,"all" or "general time" if not required month) +# End of loop +# Show data arrays in HTML page +# html_end +# End of 'output' +#------------------------------------------------------- + +#------------------------------------------------------- +# DNS CACHE FILE FORMATS SUPPORTED BY AWSTATS +# Format /etc/hosts x.y.z.w hostname +# Format analog UT/60 x.y.z.w hostname +#------------------------------------------------------- + +#------------------------------------------------------- +# IP Format (d=decimal on 16 bits, x=hexadecimal on 16 bits) +# +# 13.1.68.3 IPv4 (d.d.d.d) +# 0:0:0:0:0:0:13.1.68.3 IPv6 (x:x:x:x:x:x:d.d.d.d) +# ::13.1.68.3 +# 0:0:0:0:0:FFFF:13.1.68.3 IPv6 (x:x:x:x:x:x:d.d.d.d) +# ::FFFF:13.1.68.3 IPv6 +# +# 1070:0:0:0:0:800:200C:417B IPv6 +# 1070:0:0:0:0:800:200C:417B IPv6 +# 1070::800:200C:417B IPv6 +#------------------------------------------------------- Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-al.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-al.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-al.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,133 @@ +# Vargjet e mesazheve n� Shqip. Ju lutem m� kontaktoni p�r korrigjime (artonberisha@radiokosova.net, http://www.radiokosova.net) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Panjohur +message1=Panjohur (IP e Pazgjidhur) +message2=Tjera +message3=Paraqit Detajet +message4=Dit�s +message5=Muajit +message6=Viti +message7=Statistikat p�r +message8=Vizita e par� +message9=Vizita e fundit +message10=Numri i vizitave +message11=Vizitor t� p�rbashk�t +message12=Vizita +message13=Fjali t� ndryshme +message14=K�rkesa +message15=P�rqind +message16=Trafiku +message17=Vendet +message18=Vizitor� +message19=Faqe-URL +message20=Or�s +message21=Shfletues +message22=Gabime HTTP +message23=D�rguest +message24=Pafreskuar +message25=Vizitor�t sipas Vendeve +message26=Strehues +message27=Faqe +message28=Faqe t� ndryshme-url +message29=Paraqitur +message30=Fjali tjera +message31=Faqet q� nuk jan� gjetur +message32=HTTP kodi gabimeve +message33=Botimi Netscape +message34=Botimi IE +message35=Freskimi Fundit +message36=Lidhu te faqja nga +message37=Origjina +message38=Adresa direkte/Shenjime +message39=Origjin� e Panjohur +message40=Nyjet nga K�rkuest +message41=Nyjet nga Faqet e jashtme (Faqe tjera n'p�rjashtim me K�rkuest) +message42=Nyjet nga faqet e mbrendshme (Mbrenda faqes) +message43=Kryefrazat e k�rkuara +message44=Kryefjalit� e p�rdorura nga k�rkuest +message45=Adresa IP e pazgjidhur +message46=SO i panjohur(p�rdoruesi) +message47=Nevojitur mirpo nuk jan� gjetur URL't(HTTP kodi 404) +message48=IP Adresa +message49=Gabimet gjat� hyrjes +message50=Shfletuest e panjohur(P�rdoruest) +message51=Robotat e ndrysh�m +message52=Vizita/Vizitor +message53=Robota/Vizitor marimange +message54=AWStats - Analizues falas p�r �do faqe +message55=Prej +message56=Faqe +message57=Hyrje +message58=Botimet +message59=Sistemi Operues +message60=Jan +message61=Shk +message62=Mar +message63=Pr +message64=Maj +message65=Q�r +message66=Korr +message67=Gush +message68=Sht +message69=Tet +message70=N�n +message71=Dhjet +message72=Lundrimi +message73=Tipi Vargjeve +message74=Freskoje +message75=Transmetim +message76=Prapa te faqja kryesore +message77=Top +message78=dd mmm yyyy - HH:MM:SS +message79=Filteri +message80=Lista +message81=Strehuest +message82=Njohur +message83=Robotat +message84=Diel +message85=H�n +message86=Mar +message87=Mer +message88=Enj +message89=Pre +message90=Sht +message91=Jav�s +message92=Kush vizitoi +message93=Rezultatet Sipas +message94=V�rtetimet +message95=Min +message96=Mesatarja +message97=Maks +message98=Ngjeshja e Faqes +message99=Transmetimi i Ruajtur +message100=Ngjeshe +message101=Ngjeshja +message102=Shuma +message103=Kryefraza t� ndryshme +message104=Hyrjet +message105=Kodi +message106=Sasia mesatare +message107=Lidhjet nga lajm�ruest +message108=KB +message109=MB +message110=GB +message111=Rr�mbyes +message112=Po +message113=Jo +message114=WhoIs info +message115=N'rregull +message116=Dalje +message117=Zgjatja e Vizit�s +message118=Mbylle dritaren +message119=Bajta +message120=Kryefrazat e K�rkuara +message121=Kryefjalit e K�rkuara +message122=Makinat e ndryshme k�rkuese +message123=Nga Faqet e ndryshme +message124=Fraza tjera +message125=Hyrjet tjera (dhe/ose t'panjohurit) +message126=Makinat k�rkuese +message127=Faqet drejtuese +message128=P�gjith�sia +message129=Valuta �sht� pavler� n� shiqimin 'Vjetor' +message130=Vitit \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ar.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ar.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ar.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,169 @@ +# Arabic message file (SanDan u2canbe@hotmail.com) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=windows-1256 +PageDir=rtl +message0=����� +message1=����� (����� IP ��� �����) +message2=���� +message3=������ �������� +message4=��� +message5=��� +message6=��� +message7=������� � +message8=��� ����� +message9=��� ����� +message10=��� �������� +message11=������ +message12=����� +message13=����� ��� ������ +message14=��� +message15=������ +message16=���� +message17=�������\����� +message18=������ +message19=����� ������� +message20=������� +message21=����� ������ +message22= +message23=�������� +message24=�� ��� ������� (See 'Build/Update' on awstats_setup.html page) +message25=������ �������\����� +message26=������ +message27=����� +message28=����� ����� ������ +message29=����� +message30=����� ���� +message31=����� ��� ������ +message32=��� ���� HTTP +message33=����� ������ +message34=����� �������� +message35=��� ����� +message36=���� ������� �� ���� +message37=������ +message38=���� ����� \ ���� ������ +message39=���� ����� +message40=����� �� ������ ��� +message41=����� �� ����� ������ (��� ������ �����) +message42=����� �� ����� ������ (����� �� ���� ������) +message43=��� ����� ��������� �� ������ ����� +message44=����� ����� ��������� �� ������ ����� +message45=������ IP �� ��� ������� +message46=���� ����� ����� +message47=����� ������ ��� ��� ������ (��� HTTP 404 ) +message48=����� IP +message49=���� ��� +message50=����� ����� +message51=����� ����� +message52=������\���� +message53=������ �����\������ +message54=���� ����� ����� �������� ������ +message55=�� +message56=����� +message57=����� +message58=������� +message59=����� ������� +message60=������ +message61=������ +message62=���� +message63=����� +message64=���� +message65=����� +message66=����� +message67=����� +message68=������ +message69=������ +message70=������ +message71=������ +message72=������ +message73=��� ����� +message74=��� ���� +message75=����� +message76=������ ������ ��������� +message77=���� +message78=dd mmm yyyy - HH:MM +message79=���� +message80=���� ������� +message81=������ +message82=����� +message83=����� +message84=����� +message85=������� +message86=�������� +message87=�������� +message88=������ +message89=������ +message90=����� +message91=���� ������� +message92=�� +message93=��� +message94=���������� �������� +message95=��� +message96=���� +message97=���� +message98=������ ������ +message99=����� ������� +message100=�������� ���� +message101=����� �������� +message102=������ +message103=��� ��� ������ +message104=���� +message105=��� +message106=���� ����� +message107=����� �� ������� ������� +message108=�.� +message109=�.� +message110=�.� +message111=���� +message112=��� +message113=�� +message114=������ +message115=����� +message116=���� +message117=��� �������� +message118=���� ������� +message119=���� +message120=��� ���� ��� +message121=��� ���� ��� +message122=������ ��� ����� ������ +message123=����� ����� ������ +message124=��� ���� +message125=����� ����� ���� ���� +message126=������ ��� ����� +message127=����� ����� +message128=������� +message129=������ ������� ��� ������ �� ��� ����� +message130=������� ��� ������� +message131=���� ������ +message132=���� �������� +message133=����� �������� +message134=����\����� +message135=��� ������ +message136=���� �� �����\���� +message137=����� ��� ������� (������) +message138=���� ����� +message139=��� ����� +message140=����� ���� ������ +message141=����� ���� ������������� ������� +message142=����� ���� ������ +message143=����� ���� ����� ����� +message144=����� ���� �� ���� ���� +message145=����� ���� �� ����� ����� +message146=����� ���� �� PDF +message147=���� ����� �� SMTP +message148=��� +message149=���� +message150=��� +message151=��� +message152=��� +message153=���� ������� +message154=������ ������ ����� ��� ���� ���� HTTP ��� ����� �� ��� ������ +message155=������ +message156=��������� ������ ����� ��� ���� ���� ��� ����� �� ��� ������ +message157=������� ��� + �� ����� ����� ���� 'robots.txt' +message158=������� ����� ������ ����� ��� ���� ���� ��� ����� �� ��� ������ +message159=������ ��� �������� �� ���� ������� ��������� �� ������� ����� �� ���� ���� �� HTTP +message160=������ �������� +message161=������ ��� �������� +message162=�������� ������ +message163=������� ����� +message164=������� ��� ������ Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ba.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ba.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ba.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,114 @@ +# Bosnian message file (vljubovic@smartnet.ba) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-2 +message0=Nepoznat +message1=nepoznatih (IP adresa nije razrije�ena) +message2=Ostalo +message3=Vidi detalje +message4=Dan +message5=Mjesec +message6=Godina +message7=Statistika za +message8=Prvi posjet +message9=Zadnji posjet +message10=Broj posjeta +message11=Jedinstvenih posjetilaca +message12=Posjet +message13=Klju�na rije� +message14=Pretraga +message15=Procenat +message16=Saobra�aj +message17=Domeni/Zemlje +message18=Posjetitelji +message19=Stranice/URL +message20=Sati (Serversko vrijeme) +message21=Browseri (preglednici) +message22=HTTP Gre�ke +message23=Refereri (linkovi) +message24=Klju�ne rije�i pretrage +message25=Domeni/zemlje posjetitelja +message26=ra�unara +message27=stranica +message28=razli�ite stranice +message29=Pristup +message30=Ostale rije�i +message31=Neprona�ene stranice +message32=HTTP Kodovi gre�ke +message33=Verzije Netscape-a +message34=Verzije IE-a +message35=Posljednje osvje�avanje +message36=Link na sajt sa: +message37=Odakle je korisnik do�ao +message38=Direktan pristup / Bookmarks +message39=Nepoznato porijeklo +message40=Link sa Internet pretra�iva�a +message41=Link sa eksterne stranice (drugi web sajtovi sem pretra�iva�a) +message42=Link sa vlastite stranice (druga stranica unutar istog sajta) +message43=klju�nih rije�i kori�tenih na pretra�iva�ima +message44= +message45=Nerazrije�ena IP Adresa +message46=Nepoznat OS (polje Referer) +message47=Zahtjevan URL koji nije prona�en (HTTP kod 404) +message48=IP Adresa +message49=Gre�ke Pogodci +message50=Nepoznat preglednik (polje Referer) +message51=Roboti posjetitelji +message52=posjeta/posjetitelju +message53=Posjetitelji roboti/spideri +message54=Besplatan analizator logova za napredne web statistike +message55=od +message56=Stranica +message57=Pogodaka +message58=Verzije +message59=Operativni sistem +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Maj +message65=Jun +message66=Jul +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Dec +message72=Navigacija +message73=Dnevna statistika +message74=Osvje�i sada! +message75=Bajta +message76=Nazad na glavnu stranicu +message77=Prvih +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Puna lista +message81=Ra�unari +message82=poznatih +message83=Roboti +message84=Sun +message85=Mon +message86=Tue +message87=Wed +message88=Thu +message89=Fri +message90=Sat +message91=Days of week +message92=Who +message93=When +message94=Authenticated users +message95=Min +message96=Average +message97=Max +message98=Web compression +message99=bandwidth saved +message100=Before compression +message101=After compression +message102=Total +message103=different keyphrases +message104=Entry pages +message105=Code +message106=Average size +message107=Links from a NewsGroup +message108=KB +message109=MB +message110=GB \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-bg.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-bg.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-bg.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,159 @@ +# Bulgarian message file translated by Aryan(aryan@bgns.net) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=windows-1251 +message0=��������� +message1=��������� (��������������� ip-������) +message2=����� +message3=������� +message4=��� +message5=����� +message6=������ +message7=���������� �� +message8=������������ ��������� +message9=����. ��������� +message10=���� ��������� +message11=�������� ���������� +message12=��������e +message13=�������� ������� ���� +message14=������� +message15=������� +message16=������ +message17=�������/������� +message18=���������� +message19=��������-URL +message20=�� ������ +message21=�������� +message22=HTTP ������ +message23=��������� +message24=������ �� � ���������� +message25=���������� �� �������/������� +message26=������� +message27=�������� +message28=�������� ��������-url +message29=����������� +message30=����� ������� ���� +message31=��������� �������� +message32=HTTP ������ �� ������ +message33=Netscape ������ +message34=IE ������ +message35=�������� ���������� +message36=������ ��� ����� �� +message37=�������� +message38=�������� ������ / Bookmarks +message39=���������� �������� +message40=������ �� �������� �������� +message41=������ �� ������ �������� (����� ������� ����� ��������) +message42=������ �� �������� �������� (����� �������� �� �����) +message43=������� ����� ���������� � ���������� +message44=������� ���� ���������� � ���������� +message45=��������������� IP ������ +message46=��������� �� (���� "useragent") +message47=��������, �� ��������� URL-� (HTTP ��� 404) +message48=IP ����� +message49=������ ������ +message50=��������� �������� (���� "useragent") +message51=�������� ������ +message52=���������/��������� +message53=����������� ������ +message54=��������� �������-���������� �� ��������� ��� ���������� � ������ ����� +message55=�� +message56=�������� +message57=���� +message58=������ +message59=����������� ������� (��) +message60=��� +message61=��� +message62=��� +message63=��� +message64=��� +message65=��� +message66=��� +message67=��� +message68=��� +message69=��� +message70=��� +message71=��� +message72=��������� +message73=������ ��� +message74=������ ���� +message75=��������� ������ +message76=������� � �������� +message77=��� +message78=dd mmm yyyy - HH:MM +message79=������ +message80=����� ������ +message81=������� +message82=�������� +message83=������ +message84=��� +message85=��� +message86=��� +message87=��� +message88=��� +message89=��� +message90=��� +message91=�� ��� �� ��������� +message92=��� +message93=���� +message94=����������� ����������� +message95=���. +message96=������ +message97=����. +message98=��� ��������� +message99=������� ������ +message100=��������� �� +message101=�������� �� ����������� +message102=���� +message103=�������� ������� ����� +message104=������� +message105=��� +message106=������������� ������ +message107=������ �� ���������� ����� +message108=KB +message109=MB +message110=GB +message111=���� �����(Grabber) +message112=�� +message113=�� +message114=WhoIs ���� +message115=OK +message116=�������� +message117=�������. �� ����������� +message118=������� ��������� +message119=����� (Bytes) +message120=������� ������� ����� +message121=������� ������� ���� +message122=�������� ��������� �������� +message123=�������� ��������� ������� +message124=����� ����� +message125=����� ���������� (�/��� �������� �����������) +message126=��������� �������� +message127=��������� ������� +message128=������� +message129=�� � �������� ����� �������� �� '�������' ������� +message130=������ �� ����� +message131=EMail �� ��������� +message132=EMail �� ���������� +message133=��������� ������ +message134=������������/��������� +message135=������� �� ������� +message136=Worm/����� ����� +message137=�������� ��� ������ (�������������) +message138=�� ��� �� ������ +message139=����� +message140=�������� � ��������� �� Java +message141=�������� � ��������� �� Macromedia Director +message142=�������� � ��������� �� Flash +message143=�������� � ��������� �� Real audio playing +message144=�������� � ��������� �� Quicktime audio playing +message145=�������� � ��������� �� Windows Media audio playing +message146=�������� � ��������� �� PDF +message147=SMTP ������ �� ������ +message148=������� +message149=���� +message150=������ +message151=����� +message152=�������� +message153=��������� ������ +message154=�������� �������� ��� �������� ������ ��� ������, "�����������" �� ������������, � ������ ���� �� �������� � ���� �������. +message155=������� \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-br.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-br.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-br.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,150 @@ +# Portuguese (Brazilian) message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +# by Osmany Washington (osmany@xtms.net) +message0=Desconhecido +message1=Desconhecido (ip n�o resolvido) +message2=Outros visitantes +message3=Ver detalhes +message4=Dia +message5=M�s +message6=Ano +message7=Estat�sticas da +message8=Primeira visita +message9=�ltima visita +message10=N�mero de visitas +message11=Visitantes �nicos +message12=Visita +message13=Palavra(s) chave(s) +message14=Pesquisa +message15=Por cento +message16=Tr�fego +message17=Dom�nios/Pa�ses +message18=Visitantes +message19=P�ginas/URL +message20=Horas +message21=Browsers +message22=Erros HTTP +message23=Refer�ncias +message24=Busca Palavras +message25=Visitas dom�nios/pa�ses +message26=hosts +message27=p�ginas +message28=paginas diferentes +message29=Acesso +message30=Outras palavras +message31=P�ginas n�o existentes +message32=Erros HTTP +message33=Vers�es Netscape +message34=Vers�es MS Internet Explorer +message35=�ltima Atualiza��o +message36=Conectado a partir de +message37=Origem +message38=Endere�o direto / Favoritos +message39=Origem Desconhecida +message40=Link de um Buscador +message41=Link de uma p�gina externa (outros sites que n�o buscadores) +message42=Link de uma p�gina interna (outras p�ginas no mesmo site) +message43=Frases usadas em buscadores +message44=Palavras usadas em mecanismos de busca +message45=Endere�o IP n�o resolvido +message46=Sistemas Operacional Desconhecido (Campo Referer) +message47=URLs solicitadas e n�o encontradas (HTTP code 404) +message48=Endere�o IP +message49=Erro Hits +message50=Browsers Desconhecidos(Campo Referer) +message51=Buscadores Visitantes +message52=visitas/visitante +message53=Buscadores/Spiders visitantes +message54=Estat�sticas de acesso ao servidor WEB +message55=de +message56=P�ginas +message57=Hits +message58=Vers�es +message59=Sistema Operacional +message60=Jan +message61=Fev +message62=Mar +message63=Abr +message64=Mai +message65=Jun +message66=Jul +message67=Ago +message68=Set +message69=Out +message70=Nov +message71=Dez +message72=Navega��o +message73=Tipos de Arquivos +message74=Atualiza Agora +message75=Bytes +message76=Retorna � p�gina inicial +message77=Primeiros +message78=dd mmm yyyy - HH:MM +message79=Filtro +message80=Lista completa +message81=Hosts +message82=Conhecido(a)(s) +message83=Rob�s +message84=Dom +message85=Seg +message86=Ter +message87=Qua +message88=Qui +message89=Sex +message90=Sab +message91=Dias da semana +message92=Quem +message93=Quando +message94=Usu�rios autenticados +message95=Min +message96=Med +message97=Max +message98=Compress�o Web +message99=Banda economizada +message100=Antes da compress�o +message101=Depois da compress�o +message102=Total +message103=frases(s) diferente(s) +message104=P�ginas de entrada +message105=C�digo +message106=Tamanho m�dio +message107=Links de um NewsGroup +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Sim +message113=N�o +message114=informa��o WhoIs (Quem �) +message115=OK +message116=Sair +message117=Dura��o das visitas +message118=Fechar janela +message119=Bytes +message120=Busca por Frases +message121=Busca por Palavras +message122=diferente refer�ncias em mecanismos de busca +message123=diferente refer�ncias em sites +message124=Outras frases +message125=Outros logins (e/ou usu�rios an�nimos) +message126=Refer�ncia em mecanismos de busca +message127=Refer�ncia em sites +message128=Sum�rio +message129=Valor exato n�o dispon�vel na visualiza��o 'Ano' +message130=Disposi��es do valor dos dados +message131=EMail Origin�rio +message132=EMail Destinat�rio +message133=Per�odo reportado +message134=Extra/Marketing +message135=Tamanhos de tela +message136=Ataques de Worm/Virus +message137=Adicionar em favoritos +message138=Dias do M�s +message139=Variados +message140=Browsers com suporte ao Java +message141=Browsers com suporte ao Macromedia Director +message142=Browsers com suporte ao Flash +message143=Browsers com suporte ao Real �udio +message144=Browsers com suporte ao Quicktime �udio +message145=Browsers com suporte ao Windows Media �udio +message146=Browsers com suporte ao PDF \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ca.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ca.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ca.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,167 @@ +# Catalan message file (Temu-BCN temujinnn@hotmail.com) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Desconegut +message1=Desconegut (Adre�a IP desconeguda) +message2=Altres +message3=Veure detalls +message4=Dia +message5=Mes +message6=Any +message7=Estad�stiques del lloc +message8=Primera visita +message9=�ltima visita +message10=Nombre de visites +message11=Visitants diferents +message12=Visita +message13=Paraula clau (keyword) +message14=Cerques +message15=Percentatge +message16=Tr�fic +message17=Dominis/Pa�sos +message18=Visitants +message19=P�gines/URLs +message20=Visites per Hores +message21=Navegadors +message22= +message23=Enlla�os +message24=Mai utilitzats (Miri 'Build/Update' a la p�gina awstats_setup.html) +message25=Visites por Dominis/Pa�sos +message26=servidors +message27=p�gines +message28=p�gines diferents +message29=Accessos +message30=Altres paraules +message31=P�gines no trobades +message32=Codis d'error del Protocol HTTP +message33=Versions de Netscape +message34=Versions de MS Internet Explorer +message35=�ltima actualitzaci� +message36=Connectat al lloc desde +message37=Origen de l'enlla� +message38=Des de direcci� directa o Preferits +message39=Origen desconegut +message40=Enlla�os des d'algun motor de cerca +message41=Enlla�os des de p�gines externes (excepte motors de cerca) +message42=Enlla�os des de p�gines internes (altres p�gines del lloc) +message43=Paraules clau utilitzades pel motor de cerca +message44=Paraules utilitzades pel motor de cerca +message45=Direcci� IP no identificada +message46=Sistema Operatiu desconegut (camp de refer�ncia) +message47=URLs sol�licitades per� no trobades (codi 404 del protocol HTTP) +message48=Direcci� IP +message49=Sol�licituds err�nies +message50=Navegadors desconeguts (camp de refer�ncia) +message51=Visites de Robots +message52=Visites/Visitant +message53=Visites de Robots/Spiders (indexadors) +message54=Analitzador gratu�t de hist�rics per a estad�stiques Web avan�ades +message55=de +message56=P�gines +message57=Sol�licituds +message58=Versions +message59=Sistemes Operatius +message60=Gen +message61=Feb +message62=Mar +message63=Abr +message64=Mai +message65=Jun +message66=Jul +message67=Ago +message68=Sep +message69=Oct +message70=Nov +message71=Des +message72=Navegaci� +message73=Tipus de fitxer +message74=Actualitzar ara +message75=Ample de banda +message76=Tornar a la p�gina principal +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filtre +message80=Llista completa +message81=Servidors +message82=Coneguts +message83=Robots +message84=Diu +message85=Dil +message86=Dim +message87=Dmc +message88=Djs +message89=Div +message90=Dis +message91=Dies de la setmana +message92=Qui +message93=Quan +message94=Usuaris Autentificats +message95=Min +message96=Mitja +message97=Max +message98=Compressi� Web +message99=Ample de banda estalviat +message100=Abans de la compressi� +message101=Despr�s de la compressi� +message102=Total +message103=Paraules clau diferents +message104=P�gina d'entrada +message105=Codi +message106=Volum mitj� +message107=Enlla�os des d'un grup de not�cies +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=S� +message113=No +message114=Informaci� WhoIs +message115=Acceptar +message116=Sortida +message117=Durada de les visites +message118=Tancar finestra +message119=Bytes +message120=Motors de cerca frases clau +message121=Motors de cerca paraules clau +message122=enlla�os des de motors de cerca diferents +message123=enlla�os des d'altres llocs +message124=Altres frases de cerca +message125=Altres usuaris (i/o usuaris an�nims) +message126=Enlla�os des de motors de cerca +message127=Llocs d'enlla�os +message128=Sumari +message129=Valor exacte no disponible a la vista d'any +message130=Matrius de dades +message131=EMail del emissor +message132=EMail del receptor +message133=Per�ode reportat +message134=Extra/Marketing +message135=Mides de pantalla +message136=Atacs de Cucs/Virus +message137=Inclosos a favorits (estimat) +message138=Dies del mes +message139=Miscel�lanis +message140=Cercadors amb suport Java +message141=Cercadors amb suport Macromedia Director +message142=Cercadors amb suport Flash +message143=Cercadors amb suport de reproducci� Real �udio +message144=Cercadors amb suport de reproducci� Quicktime audio +message145=Cercadors amb suport de reproducci� Windows Media audio +message146=Cercadors amb suport PDF +message147=Codis d'error SMTP +message148=Pa�sos +message149=Correus +message150=Volum +message151=Primer +message152=�ltim +message153=Excloure filtre +message154=Els codis mostrats aqu� son donats per sol�licituds o tr�fic "no vist" per els visitants, es troben en aquest apartat. +message155=Cluster +message156=Els Robots comptats aqu� son donats per sol�licituds o tr�fic "no vist" per els visitants, es troben en aquest apartat. +message157=N�meros despr�s de + son sol�licituds correctes en els arxius �robots.txt�. +message158=Els Cucs comptats aqu� son donats per sol�licituds o tr�fic "no vist" per els visitants, es troben en aquest apartat. +message159=El tr�fic no vist es tr�fic generat per robots, cucs o respostes de codi especial d'estat HTTP. +message160=Tr�fic vist +message161=Tr�fic no vist +message162=Hist�ric Mensual +message163=Cucs +message164=Cucs diferents \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cn.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cn.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cn.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,168 @@ +# Chinese (simplified) message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=gb2312 +message0=�޷���֪ +message1=�޷���֪(���ܷ�����������) +message2=���� +message3=�鿴��ϸ���� +message4=���� +message5=�� +message6=�� +message7=ͳ����վ +message8=�״βι����� +message9=����ι����� +message10=�ι��˴� +message11=�ι��� +message12=�ι� +message13=���ؼ��ִ� +message14=���� +message15=�ٷֱ� +message16=����ͳ�� +message17=�������� +message18=�ι��� +message19=URL ��ַ +message20=ÿСʱ������� +message21=����� +message22=HTTP ���� +message23=�������� +message24=��δ���� +message25=�ι��ߵ��������� +message26=������ +message27=��ҳ�� +message28=����ͬ����ҳ +message29=��ȡ���� +message30=��ͬ���ִ� +message31=�Ҳ�������ҳ +message32=HTTP ������ +message33=Netscape �汾 +message34=IE �汾 +message35=������� +message36=������վ�ķ��� +message37=��Դ��ַ +message38=��ַ�ɲι���������������ǩȡ�� +message39=�޷���֪����ķ��� +message40=������������ +message41=���Դ���վ���������ҳ (����������) +message42=����վ�ڲ����� +message43=��վ�����Ĺؼ��־� +message44=��վ�����Ĺؼ��ִ� +message45=�޷��������IP��ַ +message46=�޷���֪����ҵϵͳ +message47=�Ҳ�������ַ���� (HTTP ������ 404) +message48=IP ��ַ +message49=������� +message50=�޷���֪������� +message51=�������� +message52=�ι��˴�/�ι��� +message53=����������վ�Ļ����� +message54=��ҳ��¼����ϵͳ +message55=��� +message56=��ҳ�� +message57=�ļ��� +message58=�汾 +message59=����ϵͳ +message60=һ�� +message61=���� +message62=���� +message63=���� +message64=���� +message65=���� +message66=���� +message67=���� +message68=���� +message69=ʮ�� +message70=ʮһ�� +message71=ʮ���� +message72=�����ͳ�� +message73=�ļ���� +message74=�������� +message75=�ֽ� +message76=�ص���ҳ +message77=ǰ +message78=yyyy�� mmm dd�� HH:MM +message79=���� +message80=ȫ���г� +message81=���� +message82=������ɹ� +message83=����������վ +message84=�� +message85=һ +message86=�� +message87=�� +message88=�� +message89=�� +message90=�� +message91=�����ڼ� +message92=���ι��� +message93=���ι�ʱ�� +message94=��������û� +message95=��С +message96=ƽ���� +message97=��� +message98=��ҳׯ�� +message99=��ʡ�˵Ĵ��� +message100=ׯ��ǰ +message101=ׯ���� +message102=���� +message103=����ͬ�Ĺؼ��־� +message104=��վ�� +message105=���� +message106=ƽ����С +message107=������Ⱥ������ +message108=K�ֽ� +message109=M�ֽ� +message110=G�ֽ� +message111=�������������ҳץȡ�� +message112=�� +message113=�� +message114=WhoIs ��Ѷ +message115=OK +message116=��վ�� +message117=ÿ�βι�����ʱ�� +message118=�رմ˴��� +message119=���ֽ� +message120=���������Ķ��� +message121=���������Ĺؼ��� +message122=����ͬ����������ת��ι��ߵ���վ +message123=����ͬ��������վת��ι��ߵ���վ +message124=�������� +message125=������¼ (����������¼) +message126=����Щ��������ת�� +message127=����Щ������վת�� +message128=ժҪ +message129=��ȫ��ͳ��ʱ���޷�׼ȷ��֪�ι��ߵ���Ŀ +message130=����ֵ���� +message131=��������ַ +message132=��������ַ +message133=�������� +message134=�ر�/�г� +message135=��Ļ��С +message136=���/���� ���� +message137=���뵽�ղؼ�(����) +message138=������ͳ�� +message139=���� +message140=�����֧�� Java +message141=�����֧�� Macromedia Director +message142=�����֧�� Flash +message143=�����֧�� Real audio ���� +message144=�����֧�� Quicktime audio ���� +message145=�����֧�� Windows Media audio ���� +message146=�����֧�� PDF +message147=SMTP������� +message148=���һ���� +message149=�ʼ� +message150=��С +message151=��һ�� +message152=��ĩһ�� +message153=������ +message154=�����������������������������������ˣ��������ȣ� +message155=��Ⱥ +message156=�����г���������������˲����ġ����������������δ����������ͼ���� +message157=��+���������Ϊ�ɹ��ġ�robots.txt�����ʴ��� +message158=�����г����������ġ����������������δ����������ͼ���� +message159=���������������������������ˣ���没�������������ͷ�������HTTP��Ӧ +message160=��������� +message161=����������� +message162=������ʷͳ�� +message163=��� +message164=��ͬ����� Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cy.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cy.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cy.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,137 @@ +# Welsh message file (jim@hebffinia.com) +# Cyfieithiad gan Maredudd ap Rheinallt +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Anhysbys +message1=Anhysbys (cyfeiriad IP heb ei ganfod) +message2=Eraill +message3=Gweld manylion +message4=Dydd +message5=Mis +message6=Blwyddyn +message7=Ystadegau o +message8=Ymweliad cyntaf +message9=Ymweliad diwethaf +message10=Cyfanswm ymweliadau +message11=Ymwelwyr unigryw +message12=Ymweliad +message13=allweddeiriau gwahanol +message14=Chwilio +message15=Y Cant +message16=Traffig +message17=Parthau/Gwledydd +message18=Ymwelwyr +message19=Tudalennau-URL +message20=Oriau +message21=Poryddion +message22=Gwallau HTTP +message23=Atgyfeirwyr +message24=Byth wedi'i diweddaru +message25=Parthau/Gwledydd Ymwelwyr +message26=gwesteiwyr +message27=tudalennau +message28=Gwahanol dudalennau-URL +message29=Tudalennau a welwyd +message30=Geiriau eraill +message31=Tudalennau heb eu canfod +message32=Codau gwallau HTTP +message33=Fersiynau Netscape +message34=Fersiynau IE +message35=Diweddariad diwethaf +message36=Cyswllt i'r wefan o +message37=Tardd +message38=Cyfeiriad uniongyrchol / Nodau tudalen +message39=Tardd anhysbys +message40=Cysylltau o Beiriant Chwilio +message41=Cysylltau o dudalen allanol (gwefannau eraill ac eithrio peiriannau chwilio) +message42=Cysylltau o dudalen fewnol (tudalen arall ar yr un wefan) +message43=Allweddfrawddegau a ddefnyddiwyd mewn periannau chilio +message44=Allweddeiriau a ddefnyddiwyd mewn periannau chilio +message45=Cyfeiriad IP heb ei ganfod +message46=System Weithredu anhysbys (maes Atgyfeiriwr) +message47=URLau a geisiwydwyd ond na chanfuwyd (côd HTTP 404) +message48=Cyfeiriad IP +message49=Gwall Trawiad +message50=Poryddion anhysbys (maes Atgyfeiriwr) +message51=Robotiaid ar ymweliad +message52=Ymweliadau/ymwelydd +message53=Ymwelwyr robot a phry cop +message54=Yn Rhad ac am Ddim: Dadansoddydd Ffeiliau Log Amser Real ar gyfer Ystadegau Gwe Uwch +message55=o +message56=Tudalennau +message57=Trawiadau +message58=Fersiynau +message59=Systemau Gweithredu +message60=Ion +message61=Chwef +message62=Mawrth +message63=Ebr +message64=Mai +message65=Meh +message66=Gorff +message67=Awst +message68=Medi +message69=Hydref +message70=Tach +message71=Rhagfyr +message72=Gwe-lywio +message73=Math o ffeil +message74=Diweddaru yn awr +message75=Beitiau +message76=Yn ôl i'r brif dudalen +message77=Pwysicach hyd at +message78=dd mmm bbbb - AA:MM +message79=Hidlydd +message80=Rhestr Lawn +message81=Gwesteiwyr +message82=Hysbys +message83=Robotiaid +message84=Sul +message85=Llun +message86=Mawrth +message87=Mercher +message88=Iau +message89=Gwe +message90=Sad +message91=Diwrnodau'r wythnos +message92=Pwy +message93=Pryd +message94=Defnyddwyr Dilys +message95=Lleiafswm +message96=Cyfartaledd +message97=Mwyafswm +message98=Cywasgedd GWe +message99=Lled band a arbedwyd +message100=Cyn cywasgu +message101=Wedi Cywasgu +message102=Cyfanswm +message103=allweddfrawddegau gwahanol +message104=Tudalennau mynediad +message105=Côd +message106=Maint ar gyfartaledd +message107=Cysylltau oddi wrth Grŵp Newyddion +message108=KB +message109=MB +message110=GB +message111=Grabwr +message112=Yes +message113=No +message114=Gwybodaeth Dynodi +message115=Iawn +message116=Gadael +message117=Parhau ag Ymweliadau +message118=Cau ffenest +message119=Beitiau +message120=Allweddfrawddegau Chwilio +message121=Allweddeiriau Chwilio +message122=peiriannau chwilio gwahanol yn atgyfeirio +message123=gwefannau gwahanol yn atgyfeirio +message124=Brawddegau Eraill +message125=Mewnbynnau eraill (ac/neu ddefnyddwyr di-enw) +message126=Peiriannau Chwilio Atgyfeirio +message127=Gwefannau Atgyfeirio +message128=Crynodeb +message129=Union werth ddim ar gael tra'n defnyddio modd gweld 'Blwyddyn' +message130=Araeau gwerthoedd data +message131=Ebost yr anfonydd +message132=Ebost y derbynnydd +message133=Cyfnod adrodd \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cz.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cz.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-cz.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,174 @@ +# Czech message file (js@cvut.cz) +# win->iso conversion and czech corrections (one@one.cz) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-2 +message0=Nezn�m� +message1=Nezn�m� (nep�elo�en� IP) +message2=Ostatn� +message3=Prohl�dnout detaily +message4=Den +message5=M�s�c +message6=Rok +message7=Statistika pro +message8=Prvn� n�v�t�va +message9=Posledn� n�v�t�va +message10=Po�et n�v�t�v +message11=Unik�tn� n�v�t�vy +message12=N�v�t�va +message13=v�razu +message14=Hled�n� +message15=Procenta +message16=Traffic +message17=Dom�ny/zem� +message18=N�v�t�vy +message19=Str�nky/URL +message20=Hodiny +message21=Browsery (prohl�e�e) +message22= +message23=Reference +message24=Nebylo aktualizov�no (Viz 'Build/Update' v awstats_setup.html) +message25=N�v�t�vy dom�ny/zem� +message26=host� +message27=str�nek +message28=r�zn�ch str�nek-url +message29=Zobrazeno +message30=Jin� slova +message31=Nenalezen� str�nky +message32=Chybov� k�dy HTTP +message33=Verze Netscape +message34=Verze MS Internet Explorer +message35=Posledn� aktualizace +message36=P��stup z +message37=P�vod +message38=P��m� adresa / Obl�ben� (Bookmark) +message39=Nezn�m� p�vod +message40=Odkaz z Internetov�ho vyhled�va�e +message41=Odkaz z jin� str�nky (jin� str�nky ne� vyhled�va�e) +message42=Odkaz z vlastn� str�nky (jin� str�nka na serveru) +message43=Slovn� spojen� pou�it� ve vyhled�va�i +message44=V�razy pou�it� ve vyhled�va�i +message45=Nep�elo�en� IP adresa +message46=Nezn�m� OS (polo�ka prohl�e�e) +message47=Po�adovan�, ale nenalezen� URL (HTTP 404) +message48=IP Addresa +message49=Chyba Dotazu +message50=nezn�m� browser (prohl�e�) (polo�ka Referer) +message51=p��stup� robot� +message52=n�v�t�v/n�v�t�vn�ka +message53=Roboti +message54=Voln� �iriteln� n�stroj pro anal�zu web statistik +message55=z +message56=Str�nek +message57=Hity +message58=Verze +message59=OS +message60=Led +message61=�no +message62=B�e +message63=Dub +message64=Kv� +message65=�er +message66=�vc +message67=Srp +message68=Z�� +message69=��j +message70=Lis +message71=Pro +message72=Navigace +message73=Typ souboru +message74=Aktualizovat nyn� +message75=Bajt� +message76=Zp�t na hlavn� str�nku +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filtr +message80=�pln� seznam +message81=Host� +message82=Zn�m� +message83=Robot� +message84=Ne +message85=Po +message86=�t +message87=St +message88=�t +message89=P� +message90=So +message91=Dny v t�dnu +message92=Kdo +message93=Kdy +message94=P�ihl�en� u�ivatel� +message95=Min +message96=Pr�m�r +message97=Max +message98=Web komprese +message99=u�et�en� p�smo (bandwith) +message100=P�ed kompres� +message101=Po kompresi +message102=Celkem +message103=r�zn�ch slovn�ch spojen� +message104=Vstupn� str�nky +message105=K�d +message106=Pr�m�rn� velikost +message107=Odkaz z diskuzn�ch skupin (News) +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Ano +message113=Ne +message114=WhoIs info +message115=OK +message116=V�stupn� str�nky +message117=Trv�n� n�v�t�v +message118=Zav�i okno +message119=Byt� +message120=Hledan� slovn� spojen� +message121=Hledan� v�razy +message122=r�zn�ch odkaz� z internetov�ch vyhled�va�� +message123=r�zn�ch odkazuj�c�ch str�nek +message124=Ostatn� fr�ze +message125=Ostatn� loginy (a/o anonymn� u�ivatel�) +message126=Odkazuj�c� vyhled�va�e +message127=Odkazuj�c� str�nky +message128=Souhrn +message129=P�esn� hodnota nen� v 'Ro�n�m' zobrazen� dostupn� +# tohle jeste nevim jak prelozit +message130=Hodnoty datov�ch matic +message131=Adresa odes�latele +message132=Adresa p��jemce +message133=Zobrazen� �asov� �sek +message134=Extra/Marketing +message135=Rozli�en� obrazovky +message136=�toky �erv�/vir� +message137=Obl�ben� (odhad) +message138=Dny v m�s�ci +message139=R�zn� +message140=Prohl�e�e s podporou Javy +message141=Prohl�e�e s podporou Macromedia Director +message142=Prohl�e�e s podporou Flash +message143=Prohl�e�e s podporou p�ehr�v�n� Real audio +message144=Prohl�e�e s podporou p�ehr�v�n� Quicktime audio +message145=Prohl�e�e s podporou p�ehr�v�n� Windows Media audio +message146=Prohl�e�e s podporou PDF +message147=K�dy chyb SMTP +message148=Zem� +message149=Zpr�vy +message150=Velikost +message151=K�estn� +message152=P��jmen� +message153=Odfiltrov�no +message154=K�dy zde uveden� d�vaj� z�t� "nezobrazovanou" od n�v�t�v, �ili nejsou uvedeny v jin�ch grafech. +message155=Cluster +message156=Roboti zde uveden� d�vaj� z�t� "nezobrazovanou" od n�v�t�v, �ili nejsou uvedeny v jin�ch grafech. +# tohle jeste nevim jak prelozit +message157=��sla po + je �sp�n� p�idan� z�t� z "robots.txt". +message158=�ervov� zde uveden� d�vaj� z�t� "nezobrazovanou" od n�v�t�v, �ili nejsou uvedeny v jin�ch grafech. +message159=Nezobrazovan� z�t�, v�etn� z�t�e od robot�, �erv� nebo odpov�d� na HTTP stavovov� k�dy. +message160=Zobrazovan� z�t� +message161=Nezobrazovan� z�t� +message162=Za m�s�c +message163=�ervi +message164=r�zn� +message165=�sp�ne zaslan� emaily +message166=odm�tnut� emaily +message167=Citliv� c�le \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-de.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-de.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-de.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,167 @@ +# German message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Unbekannt +message1=Unbekannte (IP konnte nicht aufgelöst werden ) +message2=Sonstige +message3=Details anzeigen +message4=Tag +message5=Monat +message6=Jahr +message7=Statistik für +message8=Erster Zugriff +message9=Letzter Zugriff +message10=Anzahl der Besuche +message11=Unterschiedliche Besucher +message12=Besuch +message13=Suchbegriffe +message14=Häufigkeit +message15=Prozent +message16=Datenvolumen +message17=Domains/Länder +message18=Besucher +message19=Seiten-URL +message20=Stunden (Serverzeit) +message21=Browser +message22=HTTP Fehlermeldungen +message23=Verweise +message24=Noch nie aktualisiert +message25=Domains/Länder der Besucher +message26=Rechner +message27=Seiten +message28=Unterschiedliche Seiten +message29=Zugriffe +message30=Weitere Suchbegriffe +message31=Nicht gefundene Seiten +message32=HTTP Fehlercodes +message33=Netscape Versionen +message34=Internet Explorer Versionen +message35=Zuletzt aktualisiert +message36=Woher die Besucher kamen +message37=Herkunft +message38=Direkter Zugriff/Bookmarks +message39=Herkunft unbekannt +message40=Links von einer Internet-Suchmaschine +message41=Links von einer externen Seite (keine Suchmaschinen) +message42=Links von einer internen Seite innerhalb der Web Site +message43=Suchausdrücke (Suchmaschinen) +message44=Suchbegriffe (Suchmaschinen) +message45=Unaufgelöste IP Adressen +message46=Unbekanntes Betriebssystem +message47=Nicht auffindbare Seiten (Fehler 404) +message48=IP Adresse +message49=Fehlerhafte Zugriffe +message50=Unbekannter Browser +message51=Zugriffe durch Suchmaschinen +message52=Besuche/Besucher +message53=Robots/Spiders (Suchmaschinen) +message54=Kostenloses Programm zur Echtzeitanalyse für moderne Webstatistiken +message55=von +message56=Seiten +message57=Zugriffe +message58=Versionen +message59=Betriebssysteme +message60=Jan +message61=Feb +message62=März +message63=Apr +message64=Mai +message65=Juni +message66=Juli +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Dez +message72=Navigation +message73=Datei-Typen +message74=Jetzt aktualisieren +message75=Bytes +message76=Zurück zur Hauptseite +message77=Top +message78=dd.mm.yyyy - HH:MM +message79=Filter +message80=Gesamte Liste +message81=Rechner +message82=Bekannte +message83=Robots +message84=So +message85=Mo +message86=Di +message87=Mi +message88=Do +message89=Fr +message90=Sa +message91=Wochentage +message92=Wer +message93=Wann +message94=beglaubigte Benutzer +message95=Minimum +message96=Durchschnitt +message97=Maximum +message98=Kompressionsrate +message99=gesparte Bandbreite +message100=unkomprimiert +message101=komprimiert +message102=Total +message103=verschiedene Suchbegriffe +message104=Einstiegsseiten +message105=Code +message106=durchschnitt. Größe +message107=Links aus einer News Gruppe +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Ja +message113=Nein +message114=Whois Informationen +message115=OK +message116=Exit Seiten +message117=Aufenthaltsdauer +message118=Fenster schliessen +message119=Bytes +message120=Suchausdrücke +message121=Suchbegriffe +message122=Suchmaschinen +message123=Websites +message124=Weitere Suchausdrücke +message125=Unbekannte Benutzer +message126=Suchmaschinen +message127=Websites +message128=Zusammenfassung +message129=Der genaue Wert ist nicht in der 'Year'-Ansicht verfügbar +message130=Datenwert Arrays +message131=Email Sender +message132=Email Empfänger +message133=Zeitraum +message134=Extra/Marketing +message135=Bildschirmauflösungen +message136=Wurm/Virus Angriffe +message137=Zu Favoriten hinzugefügt (Schätzung) +message138=Tage im Monat +message139=Verschiedenes +message140=Browser mit Unterstützung für JAVA +message141=Browser mit Unterstützung für Macromedia Director +message142=Browser mit Unterstützung für Flash +message143=Browser mit Unterstützung für Real Audio Klangwiedergabe +message144=Browser mit Unterstützung für Quicktime Klangwiedergabe +message145=Browser mit Unterstützung für Windows Media Klangwiedergabe +message146=Browser mit Unterstützung für PDF +message147=Browser mit Unterstützung für SMTP Fehlercodes +message148=Länder +message149=Mails +message150=Größe +message151=Erste +message152=Letzte +message153=Filter +message154=Die Codes die hier angezeigt werden zeigen Treffer oder Traffic welchen Besucher "nicht gesehen" haben und sind in den übrigen Diagrammen nicht enthalten. +message155=Cluster +message156=Die Robots die hier angezeigt werden zeigen Treffer oder Traffic welchen Besucher "nicht gesehen" haben und sind in den übrigen Diagrammen nicht enthalten. +message157=Zahlen hinter + sind erfolgreiche Treffer auf die "robots.txt"-Datei +message158=Die Würmer die hier angezeigt werden zeigen Treffer oder Traffic welchen Besucher "nicht gesehen" haben und sind in den übrigen Diagrammen nicht enthalten +message159=Nicht gesehener Traffic ist Traffic welcher von Robots, W�rmern oder Antworten mit speziellem HTTP-Statuscode +message160=gesehener Traffic +message161=nicht gesehener Traffic +message162=Monatliche Historie +message163=Würmer +message164=unterschiedliche Würmer Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-dk.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-dk.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-dk.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# Danish message file by Ole Stanstrup (revised and amended by soren@dacafe.com) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Ukendt +message1=Ukendt (uopløst IP-adresse) +message2=Andre +message3=Se detaljer +message4=Dag +message5=Måned +message6=�r +message7=Statistik for +message8=Første besøg +message9=Sidste besøg +message10=Antal besøg +message11=Unikke besøgende +message12=Besøg +message13=forskellige søgeord +message14=Søg +message15=Procent +message16=Trafik resume +message17=Domæner/Lande +message18=Besøgende +message19=Sider/URL +message20=Klokkeslæt (Servertid) +message21=Browsere +message22= +message23=Henvisende sider +message24=Aldrig opdateret (Se 'Build/Update' i awstats_setup.html) +message25=Besøgende domæner/lande +message26=hosts +message27=sider +message28=forskellige sider/URL +message29=Viste sider +message30=Andre ord +message31=Ikke fundne sider +message32=HTTP statuskoder +message33=Netscape versioner +message34=IE versioner +message35=Seneste opdatering +message36=Forbundet til websitet fra +message37=Oprindelse +message38=Direkte adgang/via bogmærker +message39=Ukendt oprindelse +message40=Links fra en internet søgemaskine +message41=Links fra en ekstern side (andre websites, undtagen søgemaskiner) +message42=Links fra en intern side (anden side på samme site) +message43=Anvendte søgesætninger på søgemaskiner +message44=Anvendte søgeord på søgemaskiner +message45=Uopløste IP-adresser +message46=Ukendte OS (useragent felt) +message47=Krævet, men ikke fundet URL (HTTP-kode 404) +message48=IP-adresse +message49=Fejl Hits +message50=Ukendte browsere (useragent felt) +message51=forskellige robotter +message52=besøg/besøgende +message53=Robotter/Spiders besøgende +message54=Gratis realtidsanalyse af logfiler med avancerede web-statistikker +message55=af +message56=Sider +message57=Hits +message58=Versioner +message59=Operativsystemer +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Maj +message65=Jun +message66=Jul +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Dec +message72=Navigation +message73=Filtyper +message74=Opdater nu +message75=Båndbredde +message76=Tilbage til forsiden +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Komplet liste +message81=Hosts +message82=Kendte +message83=Robotter +message84=Søn +message85=Man +message86=Tir +message87=Ons +message88=Tor +message89=Fre +message90=Lør +message91=Dage i ugen +message92=Hvem +message93=Hvornår +message94=Godkendte brugere +message95=Min +message96=Gennemsnit +message97=Max +message98=Webkomprimering +message99=Båndbredde sparet +message100=Før komprimering +message101=Efter komprimering +message102=Total +message103=forskellige søgesætninger +message104=Indgangssider +message105=Kode +message106=Gennemsnitsstørrelse +message107=Links fra en nyhedsgruppe +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Ja +message113=Nej +message114=WhoIs information +message115=OK +message116=Udgangssider +message117=Besøgets varighed +message118=Luk vindue +message119=Bytes +message120=Søgning Søgesætninger +message121=Søgning Søgeord +message122=forskellige henvisende søgemaskiner +message123=forskellige henvisende sites +message124=Andre sætninger +message125=Andre logins (og/eller anonyme brugere) +message126=Henvisende søgemaskiner +message127=Henvisende web-steder +message128=Sammendrag +message129=Præcis værdi ikke tilgængelig ved 'helårlig' visning +message130=Ordnet liste +message131=Afsenderens E-mail +message132=Modtagerens E-mail +message133=Rapporteret periode +message134=Ekstra +message135=Skærmopløsninger +message136=Orme/Virus angreb +message137=Tilføjet til Foretrukne (estimeret) +message138=Dage i måneden +message139=Diverse +message140=Browsere med Java understøttelse +message141=Browsere med Macromedia Director understøttelse +message142=Browsere med Flash Player understøttelse +message143=Browsere med RealPlayer understøttelse +message144=Browsere med Quicktime audio understøttelse +message145=Browsere med Windows Mediaplayer understøttelse +message146=Browsere med PDF understøttelse +message147=SMTP Fejlkoder +message148=Lande +message149=E-Mails +message150=Størrelse +message151=Først +message152=Sidst +message153=Exclude filter +message154=Koder, der er vist her, gav hits eller trafik, der 'ikke er set' af besøgende, så de medtages ikke i andre tabeller. +message155=Cluster +message156=Robotter, der er vist her, gav hits eller trafik, der 'ikke er set' af besøgende, så de medtages ikke i andre tabeller. +message157=Tallet efter + er antallet af succesfulde hits på 'robots.txt'-filer. +message158=Orme, der er vist her, gav hits eller trafik, der 'ikke er set' af besøgende, så de medtages ikke i andre tabeller. +message159='Ikke set trafik' er trafik genereret af robotter, orme eller svar med speciel HTTP statuskode. +message160=Set trafik +message161=Ikke set trafik +message162=Månedlig historie +message163=Orme +message164=forskellige orme +message165=Antal succesfuldt afsendte e-mails +message166=Antal fejlede/afviste e-mails +message167=Sårbare systemer +message168=Browsere med Javascript slået fra Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-en.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-en.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-en.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# English message file (eldy@users.sourceforge.net) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Unknown +message1=Unknown (unresolved ip) +message2=Others +message3=View details +message4=Day +message5=Month +message6=Year +message7=Statistics for +message8=First visit +message9=Last visit +message10=Number of visits +message11=Unique visitors +message12=Visit +message13=different keywords +message14=Search +message15=Percent +message16=Traffic +message17=Domains/Countries +message18=Visitors +message19=Pages-URL +message20=Hours +message21=Browsers +message22= +message23=Referers +message24=Never updated (See 'Build/Update' on awstats_setup.html page) +message25=Visitors domains/countries +message26=hosts +message27=pages +message28=different pages-url +message29=Viewed +message30=Other words +message31=Pages not found +message32=HTTP Status codes +message33=Netscape versions +message34=IE versions +message35=Last Update +message36=Connect to site from +message37=Origin +message38=Direct address / Bookmarks +message39=Unknown Origin +message40=Links from an Internet Search Engine +message41=Links from an external page (other web sites except search engines) +message42=Links from an internal page (other page on same site) +message43=Keyphrases used on search engines +message44=Keywords used on search engines +message45=Unresolved IP Address +message46=Unknown OS (useragent field) +message47=Required but not found URLs (HTTP code 404) +message48=IP Address +message49=Error Hits +message50=Unknown browsers (useragent field) +message51=different robots +message52=visits/visitor +message53=Robots/Spiders visitors +message54=Free realtime logfile analyzer for advanced web statistics +message55=of +message56=Pages +message57=Hits +message58=Versions +message59=Operating Systems +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=May +message65=Jun +message66=Jul +message67=Aug +message68=Sep +message69=Oct +message70=Nov +message71=Dec +message72=Navigation +message73=File type +message74=Update now +message75=Bandwidth +message76=Back to main page +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Full list +message81=Hosts +message82=Known +message83=Robots +message84=Sun +message85=Mon +message86=Tue +message87=Wed +message88=Thu +message89=Fri +message90=Sat +message91=Days of week +message92=Who +message93=When +message94=Authenticated users +message95=Min +message96=Average +message97=Max +message98=Web compression +message99=Bandwidth saved +message100=Compression on +message101=Compression result +message102=Total +message103=different keyphrases +message104=Entry +message105=Code +message106=Average size +message107=Links from a NewsGroup +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Yes +message113=No +message114=Info. +message115=OK +message116=Exit +message117=Visits duration +message118=Close window +message119=Bytes +message120=Search Keyphrases +message121=Search Keywords +message122=different refering search engines +message123=different refering sites +message124=Other phrases +message125=Other logins (and/or anonymous users) +message126=Refering search engines +message127=Refering sites +message128=Summary +message129=Exact value not available in 'Year' view +message130=Data value arrays +message131=Sender EMail +message132=Receiver EMail +message133=Reported period +message134=Extra/Marketing +message135=Screen sizes +message136=Worm/Virus attacks +message137=Add to favorites (estimated) +message138=Days of month +message139=Miscellaneous +message140=Browsers with Java support +message141=Browsers with Macromedia Director Support +message142=Browsers with Flash Support +message143=Browsers with Real audio playing support +message144=Browsers with Quicktime audio playing support +message145=Browsers with Windows Media audio playing support +message146=Browsers with PDF support +message147=SMTP Error codes +message148=Countries +message149=Mails +message150=Size +message151=First +message152=Last +message153=Exclude filter +message154=Codes shown here gave hits or traffic "not viewed" by visitors, so they are not included in other charts. +message155=Cluster +message156=Robots shown here gave hits or traffic "not viewed" by visitors, so they are not included in other charts. +message157=Numbers after + are successful hits on "robots.txt" files. +message158=Worms shown here gave hits or traffic "not viewed" by visitors, so they are not included in other charts. +message159=Not viewed traffic includes traffic generated by robots, worms, or replies with special HTTP status codes. +message160=Viewed traffic +message161=Not viewed traffic +message162=Monthly history +message163=Worms +message164=different worms +message165=Mails successfully sent +message166=Mails failed/refused +message167=Sensitive targets +message168=Javascript disabled \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-es.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-es.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-es.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,167 @@ +# Spanish message file (Temu-BCN temujinnn@hotmail.com) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Desconocido +message1=Desconocido (Direcci�n IP desconocida) +message2=Otros +message3=Ver detalles +message4=D�a +message5=Mes +message6=A�o +message7=Estad�sticas del sitio +message8=Primera visita +message9=�ltima visita +message10=N�mero de visitas +message11=Visitantes distintos +message12=Visita +message13=Palabras diferentes +message14=B�squedas +message15=Porcentaje +message16=Tr�fico +message17=Dominios/Pa�ses +message18=Visitantes +message19=P�ginas/URLs +message20=Visitas por Horas +message21=Navegadores +message22= +message23=Enlaces +message24=Nunca actualizado (Vea 'Build/Update' en la p�gina awstats_setup.html) +message25=Visitas por Dominios/Pa�ses +message26=servidores +message27=p�ginas +message28=p�ginas diferentes +message29=Accesos +message30=Otras palabras +message31=Paginas no encontradas +message32=C�digos de error HTTP +message33=Versiones de Netscape +message34=Versiones de MS Internet Explorer +message35=�ltima actualizaci�n +message36=Conectado al sitio desde +message37=Origen del enlace +message38=Desde direcci�n directa o Favoritos +message39=Origen desconocido +message40=Enlaces desde alg�n motor de b�squeda +message41=Enlaces desde p�ginas externas (exceptuando motores de b�squeda) +message42=Enlaces desde p�ginas internas (otras p�ginas del sitio) +message43=Frases clave utilizadas por el motor de b�squeda +message44=Palabras clave utilizadas por el motor de b�squeda +message45=Direcci�n IP no identificada +message46=Sistema Operativo desconocido (campo de referencia) +message47=URLs solicitadas pero no encontradas (c�digo 404 del protocolo HTTP) +message48=Direcci�n IP +message49=Solicitudes err�neas +message50=Navegadores desconocidos (campo de referencia) +message51=Visitas de Robots +message52=Visitas/Visitante +message53=Visitas de Robots/Spiders +message54=Analizador gratuito de hist�ricos para estad�sticas Web avanzadas +message55=de +message56=P�ginas +message57=Solicitudes +message58=Versiones +message59=Sistemas Operativos +message60=Ene +message61=Feb +message62=Mar +message63=Abr +message64=May +message65=Jun +message66=Jul +message67=Ago +message68=Sep +message69=Oct +message70=Nov +message71=Dic +message72=Navegaci�n +message73=Tipo de fichero +message74=Actualizar ahora +message75=Ancho de banda +message76=Volver a la p�gina principal +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filtro +message80=Lista completa +message81=Servidores +message82=Conocidos +message83=Robots +message84=Dom +message85=Lun +message86=Mar +message87=Mie +message88=Jue +message89=Vie +message90=Sab +message91=D�as de la semana +message92=Quien +message93=Cuando +message94=Usuarios Autentificados +message95=Min +message96=Media +message97=Max +message98=Compresi�n Web +message99=Ancho de banda ahorrado +message100=Antes de la compresi�n +message101=Despu�s de la compresi�n +message102=Total +message103=Frases clave diferentes +message104=Pagina de entrada +message105=C�digo +message106=Tama�o medio +message107=Enlaces desde grupos de noticias +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=S� +message113=No +message114=Informaci�n WhoIs +message115=Aceptar +message116=Salida +message117=Duraci�n de las visitas +message118=Cerrar ventana +message119=Bytes +message120=Buscadores de frases clave +message121=Buscadores de palabras clave +message122=enlaces desde buscadores diferentes +message123=enlaces desde sitios diferentes +message124=Otras cadenas de b�squeda +message125=Otros usuarios (y/o usuarios an�nimos) +message126=Enlaces desde buscadores +message127=Sitios de enlaces +message128=Sumario +message129=Valor exacto no disponible en la vista por a�os +message130=Matrices de datos +message131=Email del emisor +message132=Email del receptor +message133=Per�odo reportado +message134=Extra/Marketing +message135=Tama�os de pantalla +message136=Ataques de Gusano/Virus +message137=A�adido a favoritos (estimado) +message138=D�as del mes +message139=Miscel�neos +message140=Buscadores con soporte Java +message141=Buscadores con soporte Macromedia Director +message142=Buscadores con soporte Flash +message143=Buscadores con soporte de reproductor Real audio +message144=Buscadores con soporte de reproductor Quicktime audio +message145=Buscadores con soporte de reproductor Windows Media audio +message146=Buscadores con soporte PDF +message147=C�digos de error SMTP +message148=Pa�ses +message149=Correos +message150=Tama�o +message151=Primero +message152=Ultimo +message153=Excluir Filtro +message154=Los c�digos mostrados aqu� son dados por solicitudes o tr�fico "no visto" por los visitantes, se encuentran en este apartado. +message155=Cluster +message156=Los Robots contados aqu� son dados por solicitudes o tr�fico "no visto" por los visitantes, se encuentran en este apartado. +message157=N�meros despu�s de + son solicitudes correctas en los archivos �robots.txt�. +message158=Los Gusanos contados aqu� son dados por solicitudes o tr�fico "no visto" por los visitantes, se encuentran en este apartado. +message159=El trafico no visto es trafico generado por robots, gusanos o respuestas de c�digo especial de estado HTTP. +message160=Trafico visto +message161=Trafico no visto +message162=Hist�rico Mensual +message163=Gusanos +message164=Gusanos diferentes \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-et.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-et.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-et.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,137 @@ +# Estonian message file Andrei Kolu(antik@nek.ee) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Tundmatu +message1=Tundmatut (domeeninimeta ip-d) +message2=Teised +message3=Täpsem ülevaade +message4=Päev +message5=Kuu +message6=Aasta +message7=Statistika +message8=Esimene Külastus +message9=Viimane Külastus +message10=Külastuste arv +message11=üksik-külastajat +message12=Külastus +message13=erinevat märksõna +message14=Otsi +message15=Protsent +message16=Traffik +message17=Domeenid/Riigid +message18=Külastajaid +message19=Lehekülgi-URL-e +message20=Tunnid +message21=Brauserid +message22=HTTP Vead +message23=Referers +message24=Pole varem uuendatud +message25=Külastajaid domeenis/riike +message26=Külastajaid +message27=lehekülgi +message28=erinevat lehekülge- url-i +message29=Vaadatud +message30=Muud sõnad +message31=Lehekülgi mida pole leitud +message32=HTTP veakoodid +message33=Netscape versioonid +message34=IE versioonid +message35=Viimati Uuendatud +message36=Lingitud teise kodulehekülje kaudu +message37=Päritolu +message38=Otsene aadress / Järjehoidjad +message39=Tundmatu päritolu +message40=Lingid Interneti otsingusüsteemidelt +message41=Lingid välistelt lehekülgedelt (muud koduleheküljed väljaarvatud otsingusüsteemid) +message42=Lingid sisemistelt lehekülgedelt (muud koduleheküljed samalt serverilt) +message43=Otsingusüsteemides kasutatud märgulaused +message44=Otsingusüsteemides kasutatud märgusänad +message45=Domeeninimeta IP Aadress +message46=Tundmatu OS (useragent field) +message47=Nõutud, kuid leidmata URL-id (HTTP kood 404) +message48=IP Aadress +message49=Vigaseid tabamusi +message50=Tundmatud brauserid (useragent field) +message51=erinevad robotid +message52=külastust/külastaja kohta +message53=Robotid +message54=Tasuta reaalajas Weebiserveri logifailide statistika analüüsija +message55=millest +message56=Lehekülgi +message57=Tabamusi +message58=Versioone +message59=Operatsioonisüsteemid +message60=Jaan +message61=Veeb +message62=Märt +message63=Apr +message64=Mai +message65=Juun +message66=Juul +message67=Aug +message68=Sept +message69=Okt +message70=Nov +message71=Dets +message72=Navigatsioon +message73=Failitüübid +message74=Uuendada +message75=Läbilase +message76=Tagasi pealehele +message77=TOP +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Täisnimekiri +message81=Külastajad +message82=Teada +message83=Robotid +message84=Püh +message85=Esm +message86=Tei +message87=Kol +message88=Nel +message89=Ree +message90=Lau +message91=Nädalapäevad +message92=Kes +message93=Millal +message94=Autoriseerinud kasutajad +message95=Min. +message96=Keskmine +message97=Maks. +message98=Pakkimine +message99=Salvestatud läbilase +message100=Enne pakkimist +message101=Pärast pakkimist +message102=Kokku +message103=erinevat märksõna +message104=Esimesena läbi vaadatud +message105=Kood +message106=Keskmine suurus +message107=Lingid UudisteGruppidest +message108=KB +message109=MB +message110=GB +message111=Allalaadija +message112=Jah +message113=Ei +message114=WhoIs info +message115=OK +message116=Väljumisi +message117=Külastuste kestvus +message118=Sulge aken +message119=Baiti +message120=Otsitavad märklaused +message121=Otsitavad märksõnad +message122=erinevad suunavad otsingusüsteemid +message123=erinevad suunavad leheküljed +message124=Muud märksõnad +message125=Muud logimised (ja/või anonüümsed kasutajad) +message126=Suunavad otsingusüsteemid +message127=Suunavad leheküljed +message128=Kokkuvõte +message129=Täpne väärtus 'Aasta' ülevaates pole saadaval +message130=Andmete massiiv +message131=Saatja EMail +message132=Vastuvötja EMail +message133=Perioodi aruanne +message134=Lisa Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-eu.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-eu.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-eu.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,125 @@ +# Basque - Euskara message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +# aktor - aktor@aktornet.ath.cx +message0=Ezezaguna +message1=IP helbide ezezagunekoa +message2=Beste batzuk +message3=Xehetasunak ikusi +message4=Eguna +message5=Hilabetea +message6=Urtea +message7=Lekuko estadistikak +message8=Lehenengo bisita +message9=Azken bisita +message10=Bisita kopurua +message11=Bisitari desberdinak +message12=Bisita +message13=Gako-hitz +message14=Bilaketak +message15=Ehunekoa +message16=Trafiko +message17=Domeinuak/Herriak +message18=Bisitariak +message19=Orriak/URLak +message20=Orduko bisitak +message21=Nabigatzaileak +message22=Akatsak +message23=Loturak (Links) +message24=Bilaketarako hitz gakoa +message25=Domeinuko/Herrialdeko bisitak +message26=zerbitzariak +message27=orriak +message28=orri desberdinak +message29=Sarbideak +message30=Beste hitz batzuk +message31=Aurki gabeko orriak +message32=HTTP akats kodeak +message33=Netscape bertsioak +message34=MS Internet Explorer bertsioak +message35=Azken eguneratzea +message36=Lekurako loturak (links) +message37=Lotura-iturburua +message38=Helbide zuzenetik edo Gogokoetatik +message39=Iturburu ezezaguna +message40=Bilaketa-tresnaren batetik loturak +message41=Kanpoko horrietatik loturak (bilaketa-tresnak salbuesten) +message42=Barneko horrietatik loturak (gunearen beste orriak) +message43=Bilaketa-tresna erabilitako gako-esaldiak +message44=Bilaketa-tresna erabilitako gako-hitzak +message45=IP helbide ezezaguna +message46=Sistema Eragile ezezaguna (useragent) +message47=Eskatutako baina bilatugabeko URLak (404 kodea HTTP protokoloan) +message48=IP Helbidea +message49=Hits okerrak +message50=Bilatzaile ezezagunak (useragent) +message51=Robot bisitak +message52=Bisitak/Bisitariak +message53=Robot bisitak/Armiarmak +message54=Web estatistika aurreratuentzat doako 'log' aztertzailea +message55=de +message56=Orriak +message57=Hits +message58=Bertsioak +message59=Sistema Eragileak +message60=Urt +message61=Ots +message62=Mar +message63=Api +message64=Mai +message65=Eka +message66=Uzt +message67=Abu +message68=Ira +message69=Urr +message70=Aza +message71=Abe +message72=Nabigazioa +message73=Fitxategi mota +message74=Eguneratu orain +message75=Bytes +message76=Orri nagusira itzuli +message77=Gora +message78=dd mmm yyyy - HH:MM +message79=Iragazki +message80=Zerrenda osoa +message81=Zerbitzariak +message82=Ezagunak +message83=Robotak +message84=Igandea +message85=Astelehena +message86=Asteartea +message87=Asteazkena +message88=Osteguna +message89=Ostirala +message90=Larunbata +message91=Asteko egunak +message92=Nork +message93=Noiz +message94=Erabiltzaile Baimenduak +message95=Gut +message96=Batazbeste +message97=Geh +message98=Web konpresioa +message99=Banda-zabalera aurreztua +message100=Konpresio aurretik +message101=Konpresio ondoren +message102=Guztira +message103=Gako-esaldi ezberdinak +message104=Sarrerako orria +message105=Kodea +message106=BatazBesteko neurria +message107=NewsGroup-etik loturak +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Bai +message113=Ez +message114=Whois informazioa +message115=Onartu +message116=Irteera +message117=Bisiteen iraupena +message118=Leihoa itxi +message119=Bytes +message120=Esaldi bilaketa-tresna +message121=Gako-hitz bilaketa-tresna \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-fi.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-fi.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-fi.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# Finnish message file (skyde@welho.com) +# Original by (zebi@kanetti.com) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Tuntematon +message1=Tuntematon (Selvitt�m�t�n IP) +message2=Muut +message3=Katso tiedot +message4=P�iv� +message5=Kuukausi +message6=Vuosi +message7=Statistiikat: +message8=Ensimm�inen vierailu +message9=Viimeisin vierailu +message10=Vierailujen m��r� +message11=Uniikkia vierailijaa +message12=Vierailu +message13=eri hakusanaa +message14=Hakuja +message15=Prosentti +message16=Liikenne +message17=Domainit/maat +message18=Vierailija +message19=Sivujen URL +message20=Tunnit +message21=Selaimet +message22=HTTP Virheet +message23=Viittaajat +message24=P�ivitt�m�t�n +message25=Vierailijoiden domainit/maat +message26=hostit +message27=sivut +message28=eri sivua +message29=Ladatut sivut +message30=Muut sanat +message31=Sivuja ei l�ytynyt +message32=HTTP-virhekoodit +message33=Netscapen versiot +message34=IE:n versiot +message35=Edellinen p�ivitys +message36=Sivuille saavuttu osoitteesta: +message37=Alkuper� +message38=Suora osoite / Kirjanmerkit +message39=Tuntematon alkuper� +message40=Linkit Internetin hakukoneista +message41=Linkit ulkopuolisilta sivuilta (poislukien hakukoneet) +message42=Linkit sis�isilt� sivuilta (omasta domainista) +message43=Hakukoneissa k�ytetyt hakulauseet +message44=Hakukoneissa k�ytetyt hakusanat +message45=Selvitt�m�t�n IP-osoite +message46=Tuntematon k�ytt�j�rjestelm� (k�ytt�j�n mukana l�hetetty tieto) +message47=Pyydetyt, mutta ei l�ytyneet osoitteet (HTTP virhekoodi 404) +message48=IP-osoite +message49=Virheosumat +message50=Tuntemattomia selaimia (k�ytt�j�n mukana l�hetetty tieto) +message51=Vierailleet robotit +message52=k�ynti�/vierailija +message53=Robotteja/"Spider" -vierailijoita +message54=Ilmainen reaaliaikainen lokitiedoston analysoija kehittyneiden web-tilastojen laadintaan +message55=josta +message56=Sivuja +message57=Osumia +message58=Versiot +message59=K�ytt�j�rjestelm�t +message60=Tammi +message61=Helmi +message62=Maalis +message63=Huhti +message64=Touko +message65=Kes� +message66=Hein� +message67=Elo +message68=Syys +message69=Loka +message70=Marras +message71=Joulu +message72=Navigaatio +message73=Tiedostotyyppi +message74=P�ivit� nyt +message75=Kaista +message76=Takaisin p��sivulle +message77=Yleisimm�t +message78=dd.mm.yyyy - HH:MM +message79=Filtteri +message80=T�ysi lista +message81=Hosteja +message82=Tunnettuja +message83=Robotteja +message84=Su +message85=Ma +message86=Ti +message87=Ke +message88=To +message89=Pe +message90=La +message91=Viikonp�iv�t +message92=Kuka +message93=Milloin +message94=Kirjautuneet k�ytt�j�t +message95=Minimi +message96=Keskiarvo +message97=Maksimi +message98=Pakkaus +message99=Kaistaa s��stetty +message100=Pakkaus k�yt�ss� +message101=Pakattuna +message102=Yhteens� +message103=eri hakulausetta +message104=Saapumissivu +message105=Koodi +message106=Keskim��r�inen koko +message107=Linkit uutisryhmist� +message108=Kt +message109=Mt +message110=Gt +message111=Grabber +message112=Kyll� +message113=Ei +message114=WhoIs -tiedot +message115=OK +message116=Poistumissivu +message117=Vierailujen kestot +message118=Sulje ikkuna +message119=Tavua +message120=Hakulauseet +message121=Hakusanat +message122=eri viittaavaa hakukonetta +message123=eri viittaavaa sivustoa +message124=Muut lausekkeet +message125=Anonyymit k�ytt�j�t +message126=Viittaavat hakukoneet +message127=Viittaavat sivustot +message128=Yhteenveto +message129=Tarkkaa arvoa ei saatavilla vuosin�kym�ss� +message130=Data value arrays +message131=L�hett�j�n EMail-osoite +message132=Vastaanottajan EMail-osoite +message133=Raportin aikav�li +message134=Extra/Markkinointi +message135=N�yt�n resoluutiot +message136=Mato-/Virushy�kk�ykset +message137=Lis�tty suosikkeihin (arvio) +message138=Kuukausi p�ivitt�in +message139=Sekalaista +message140=Selaimet Java -tuella +message141=Selaimet Macromedia Director -tuella +message142=Selaimet Flash -tuella +message143=Selaimet Real audio -tuella +message144=Selaimet Quicktime audio -tuella +message145=Selaimet Windows Media audio -tuella +message146=Selaimet PDF -tuella +message147=SMTP-virhekoodit +message148=Maat +message149=Viesti� +message150=Koko +message151=Ensimm�inen +message152=Viimeinen +message153=Exclude filter +message154=T�ss� luetellut koodit luetaan "ei n�ytetty" -liikenteeksi, eik� niit� ole n�inollen sis�llytetty muihin tilastoihin. +message155=Ryp�s +message156=T�ss� luetellut robotit luetaan "ei n�ytetty" -liikenteeksi, eik� niit� ole n�inollen sis�llytetty muihin tilastoihin. +message157=Luvut + -merkin j�lkeen ovat onnistuneita osumia "robots.txt"-tiedostoihin. +message158=T�ss� luetellut madot luetaan "ei n�ytetty" -liikenteeksi, eik� niit� ole n�inollen sis�llytetty muihin tilastoihin. +message159="Ei n�ytetty"-liikenne sis�lt�� hakurobottien, matojen ja poikkeavien HTTP-tilakoodien aiheuttaman liikenteen. +message160=N�ytetty liikenne +message161=Ei n�ytetty liikenne +message162=Kuukausittaittaiset tilastot +message163=Matoja +message164=erilaista matoa +message165=Viesti� l�hetetty onnistuneesti +message166=Viesti� ep�onnistunut/torjuttu +message167=Herkki� kohteita Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-fr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-fr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-fr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# French message file (eldy@users.sourceforge.net) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Inconnu +message1=Inconnus (IP non r�solue) +message2=Autres +message3=Voir d�tails +message4=Jour +message5=Mois +message6=Ann�e +message7=Statistiques de +message8=Premi�re visite +message9=Derni�re visite +message10=Visites +message11=Visiteurs diff�rents +message12=Visite +message13=mots cl� diff�rents +message14=Recherche +message15=Pourcentage +message16=Trafic +message17=Domaines/Pays +message18=Visiteurs +message19=Pages-URL +message20=Heures +message21=Navigateurs +message22= +message23=Origine/Referer +message24=Jamais mis � jour (Voir 'Build/Update', page awstats_setup.html) +message25=Domaines/pays visiteurs +message26=des h�tes +message27=des pages +message28=pages diff�rentes +message29=Pages vues +message30=Autres mots +message31=Pages non trouv�es +message32=Codes Status HTTP +message33=Versions de Netscape +message34=Versions de MS Internet Explorer +message35=Derni�re mise � jour +message36=Connexions au site par +message37=Origine de la connexion +message38=Adresse directe / Bookmarks +message39=Origine inconnue +message40=Lien depuis un moteur de recherche Internet +message41=Lien depuis une page externe (autres sites, hors moteurs) +message42=Lien depuis une page interne (autre page du site) +message43=Phrases cl�s de recherche +message44=Mots cl�s de recherche +message45=Adresses IP non r�solues +message46=OS non reconnus (champ useragent brut) +message47=URLs du site demand�es non trouv�es (Code HTTP 404) +message48=Adresse IP +message49=Hits en �chec +message50=Navigateurs non reconnus (champ useragent brut) +message51=robots diff�rents +message52=visites/visiteur +message53=Visiteurs Robots/Spiders +message54=Analyseur de log libre pour statistiques Web avanc�es +message55=sur +message56=Pages +message57=Hits +message58=Versions +message59=Syst�mes exploitation +message60=Jan +message61=F�v +message62=Mar +message63=Avr +message64=Mai +message65=Juin +message66=Juil +message67=Ao�t +message68=Sep +message69=Oct +message70=Nov +message71=D�c +message72=Navigation +message73=Types de fichiers +message74=Mise � jour imm�diate +message75=Bande passante +message76=Retour page principale +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filtre +message80=Liste compl�te +message81=H�tes +message82=Connus +message83=Robots +message84=Dim +message85=Lun +message86=Mar +message87=Mer +message88=Jeu +message89=Ven +message90=Sam +message91=Jours de la semaine +message92=Qui +message93=Quand +message94=Logins utilises +message95=Min +message96=Moyenne +message97=Max +message98=Compression web +message99=Bande-passante �conomis�e +message100=Compression sur +message101=R�sultat compression +message102=Total +message103=phrases cl� diff�rentes +message104=Entr�e +message105=Code +message106=Taille moyenne +message107=Lien depuis un NewsGroup +message108=Ko +message109=Mo +message110=Go +message111=Aspirateur +message112=Oui +message113=Non +message114=Info. +message115=OK +message116=Sortie +message117=Dur�e des visites +message118=Fermer +message119=Octets +message120=Phrases cl�s +message121=Mots cl�s +message122=moteurs de recherche diff�rents +message123=sites diff�rents +message124=Autres phrases +message125=Autres logins (et/ou utilisateurs anonymes) +message126=Moteurs de recherche +message127=Sites r�f�renceurs +message128=R�sum� +message129=Valeur exacte indisponible en vue 'annuelle' +message130=Tableaux des valeurs +message131=EMail Emetteur +message132=EMail Destinataire +message133=P�riode d'analyse +message134=Extra/Marketing +message135=R�solution �cran +message136=Attaques Worm/Virus +message137=Ajout aux favoris (estimation) +message138=Jours du mois +message139=Divers +message140=Navigateurs avec support Java actif +message141=Navigateurs avec support Macromedia Director +message142=Navigateurs avec support Flash +message143=Navigateurs avec support audio Real +message144=Navigateurs avec support audio QuickTime +message145=Navigateurs avec support audio Windows Media +message146=Navigateurs avec support PDF +message147=Codes Erreurs SMTP +message148=Pays +message149=Mails +message150=Taille +message151=Premier +message152=Dernier +message153=Filtre exclusion +message154=Les codes pr�sent�es ici sont � l'origine de hits ou de traffic "non vus" par les visiteurs donc non repr�sent�s dans les autres tableaux. +message155=Cluster +message156=Les robots pr�sent�s ici sont � l'origine de hits ou de traffic "non vus" par les visiteurs donc non repr�sent�s dans les autres tableaux. +message157=Les nombres apr�s le + indiquent les hits avec succ�s sur les fichiers "robots.txt". +message158=Les vers pr�sent�s ici sont � l'origine de hits ou de traffic "non vus" par les visiteurs donc non repr�sent�s dans les autres tableaux. +message159=Le trafic 'non vu' est le trafic g�n�r� par les robots, vers ou r�ponses HTTP avec code retour sp�cial. +message160=Trafic 'vu' +message161=Trafic 'non vu' +message162=Historique mensuel +message163=Vers +message164=vers differents +message165=Mails transf�r�s +message166=Mails en �chec/refus�s +message167=Cibles sensibles +message168=Javascript d�sactiv� \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-gl.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-gl.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-gl.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,170 @@ +# Galician message file by Ignacio Agulló (agullo@ati.es) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Descoñecido +message1=Descoñecido (IP non resolto) +message2=Outros +message3=Ver detalles +message4=Día +message5=Mes +message6=Ano +message7=Estatísticas de +message8=Primeira visita +message9=última visita +message10=Número de visitas +message11=Visitantes distintos +message12=Visita +message13=palabras clave distintas +message14=Procura +message15=Porcentaxe +message16=Tráfico +message17=Dominios/Países +message18=Visitantes +message19=Páxinas/URLs +message20=Horas +message21=Navegadores +message22=Erros +message23=Enlaces +message24=Nunca actualizado +message25=Visitas por dominios/países +message26=máquinas +message27=páxinas +message28=distintas páxinas/urls +message29=Vistas +message30=Outras palabras +message31=Páxinas non atopadas +message32=Códigos de status HTTP +message33=Versións de Netscape Navigator +message34=Versións de MS Internet Explorer +message35=última actualización +message36=Procedencia das conexións ó sitio +message37=Orixe +message38=Enderezo directo/Favoritos +message39=Orixe descoñecida +message40=Enlaces dende procuradores de Internet +message41=Enlaces dende páxinas externas (outros sitios web exceptuando procuradores) +message42=Enlaces dende páxinas internas (outras páxinas no mesmo sitio) +message43=Frases clave usadas por procuradores +message44=Palabras clave usadas polo procurador +message45=Enderezo IP non resolto +message46=SO descoñecido (campo do axente do usuario) +message47=URLs solicitadas pero non atopadas (código HTTP 404) +message48=Enderezo IP +message49=Accesos erróneos +message50=Navegadores descoñecidos (campo do axente do usuario) +message51=robots diferentes +message52=visitas/visitante +message53=Visitantes Robots/Arañas +message54=Analizador gratuíto de rexistros para estadísticas Web avanzadas +message55=de +message56=Páxinas +message57=Accesos +message58=Versións +message59=Sistemas Operativos +message60=Xan +message61=Feb +message62=Mar +message63=Abr +message64=Mai +message65=Xuñ +message66=Xul +message67=Ago +message68=Set +message69=Out +message70=Nov +message71=Dec +message72=Navegación +message73=Tipo de ficheiros +message74=Actualizar agora +message75=Ancho de banda +message76=Volver á páxina principal +message77=Primeiros +message78=dd mmm yyyy - HH:MM +message79=Filtro +message80=Lista completa +message81=Máquinas +message82=Coñecidos +message83=Robots +message84=Dom +message85=Lun +message86=Mar +message87=Mer +message88=Xov +message89=Ven +message90=Sab +message91=Días da semana +message92=Quen +message93=Cando +message94=Usuarios Autentificados +message95=Mín +message96=Media +message97=Máx +message98=Compresión web +message99=Ancho de banda aforrado +message100=Compresión +message101=Resultado da compresión +message102=Total +message103=frases clave distintas +message104=Entrada +message105=Código +message106=Tamaño medio +message107=Grupos de noticias +message108=KO +message109=MO +message110=GO +message111=Capturador +message112=Sí +message113=Non +message114=Infor. +message115=Aceptar +message116=Saída +message117=Duración das visitas +message118=Pechar fiestra +message119=Octetos +message120=Frases clave de procura +message121=Palabras clave de procura +message122=diferentes procuradores referintes +message123=diferentes sitios referentes +message124=Outras frases +message125=Outros identificadores (e/ou usuarios anónimos) +message126=Procuradores referentes +message127=Sitios referentes +message128=Resumo +message129=Valor exacto non dispoñible na vista por anos +message130=Matrices de valores de datos +message131=Enderezo do emisor +message132=Enderezo do receptor +message133=Período rexistrado +message134=Extra/Mercadotecnia +message135=Tamaños de pantalla +message136=Ataques de Vermes/Virus +message137=Engadido a favoritos (estimado) +message138=Días do mes +message139=Miscelánea +message140=Navegadores con soporte Java +message141=Navegadores con soporte Macromedia Director +message142=Navegadores con soporte Flash +message143=Navegadores con soporte de reproductor Real audio +message144=Navegadores con soporte de reproductor Quicktime audio +message145=Navegadores con soporte de reproductor Windows Media audio +message146=Navegadores con soporte PDF +message147=Códigos de erro SMTP +message148=Países +message149=Correos +message150=Tamaño +message151=Primeiro +message152=último +message153=Excluir Filtro +message154=Os códigos amosados aquí contan accesos ou tráfico "non visto" por visitantes, logo están aillados nesta táboa. +message155=Grupo +message156=Os robots amosados aquí fixeron accesos ou tráfico "non visto" polos visitantes, polo tanto non se inclúen en outras táboas. +message157=Os números despois do + son accesos hachados en arquivos "robots.txt". +message158=Os gusanos amosados aquí fixeron accesos ou tráfico "non visto" polos visitantes, polo tanto non se inclúen en outras táboas. +message159=O tráfico non visto é tráfico xerado por robots, gusanos ou respostas con códigos especiais de estado de HTTP. +message160=Tráfico visto +message161=Tráfico non visto +message162=Historial mensual +message163=Gusanos +message164=gusanos distintos +message165=Mensaxes enviadas con éxito +message166=Mensaxes fallidas/rexeitadas +message167=obxectivos sensibles Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-gr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-gr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-gr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,115 @@ +# Greek message file +# Current maintainer: "Giannis Stoilis" +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-7 +message0=������� +message1=������� (�� ������������� ip) +message2=����� +message3=�������� ����������� +message4=����� +message5=����� +message6=���� +message7=���������� ��� +message8=����� �������� +message9=��������� �������� +message10=������� ���������� +message11=��������� ���������� +message12=�������� +message13=����-������ +message14=��������� +message15=������� +message16=Traffic +message17=���������/����� +message18=���������� +message19=�������/URL +message20=���� +message21=������������� +message22=�������� HTTP +message23=����������� +message24=������� ���������� +message25=���������/����� ���������� +message26=��������� +message27=������� +message28=������������ ������� +message29=�������� +message30=���� ������� +message31=Pages not found +message32=������� ��������� HTTP +message33=�������� Netscape +message34=�������� MS Internet Explorer +message35=��������� �������� +message36=������� ��� ���� ��� +message37=��������� +message38=����� ��������� / ��������� +message39=������� ��������� +message40=��������� ��� ������ ���������� ��� Internet +message41=��������� ��� ��������� ������ (����� ��������� ����� ����� ������� ����������) +message42=��������� ��� ��������� ������ (���� ������ ���� ���� �������� ����) +message43=������� ��� ���������������� �� ������� ���������� +message44=������ ��� ���������������� �� ������� ���������� +message45=����������� IP ��� ��� �������������� +message46=������� ����������� ������� (����� ����������) +message47=����������� ���� ����� �� ������� URL (������� HTTP 404) +message48=��������� IP +message49=�������� ��������� +message50=�������� ������������� (����� ����������) +message51=������ ���������� +message52=����������/��������� +message53=���������� ������/������� +message54=��������� �������� ���������� ����������� ������ ��� ��������� ���������� ������� WWW +message55=��� +message56=������� +message57=��������� +message58=�������� +message59=�/� +message60=��� +message61=��� +message62=��� +message63=��� +message64=��� +message65=���� +message66=���� +message67=��� +message68=��� +message69=��� +message70=��� +message71=��� +message72=�������� +message73=����� ������� +message74=�������� ���� +message75=Bytes +message76=��������� ���� �������� ������ +message77=Top +message78=dd mmm yyyy - HH:MM +message79=������ +message80=������ ����� +message81=����������� +message82=������� +message83=������ +message84=��� +message85=��� +message86=��� +message87=��� +message88=��� +message89=��� +message90=��� +message91=������ ��� ��������� +message92=����� +message93=���� +message94=�������������� ������� +message95=�������� +message96=����� ���� +message97=������� +message98=�������� ����� +message99=����� ��� �������������� +message100=���� �� �������� +message101=���� �� �������� +message102=������ +message103=������������ ������� +message104=������� ������� +message105=������� +message106=���� ������� +message107=��������� ��� NewsGroup +message108=KB +message109=MB +message110=GB Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-he.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-he.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-he.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,161 @@ +# Hebrew message file (shimi@shimi.net) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-8-i +PageDir=rtl +message0=�� ���� +message1=�� ������ (IP �� ������) +message2=����� +message3=��� ����� +message4=��� +message5=���� +message6=��� +message7=��������� +message8=����� ����� +message9=����� ����� +message10=���� �������� +message11=������ �������� (Unique) +message12=����� +message13=����� ���� ����� +message14=��� +message15=������ +message16=����� +message17=��������/������ +message18=������ +message19=������-���� +message20=���� +message21=������� +message22= +message23=����� (Referers) +message24=����� �� ����� +message25=��������/������ ������� +message26=������ (hosts) +message27=���� +message28=��� ����� ����� +message29=���� +message30=����� ����� +message31=���� ��� ����� +message32=���� ����� HTTP +message33=������� ������� +message34=������� �������� +message35=����� ����� +message36=������� ���� ��� +message37=���� +message38=���� ����� / �������� +message39=���� �� ���� +message40=������� ����� ����� +message41=������� ����� �������� (����� ����� - ���� ����� �����) +message42=������� ����� ������� (���� ����� ����) +message43=������� ������� ��� ������ ����� +message44=����� ���� ������� ��� ������ ����� +message45=����� IP �� ������� +message46=����� ����� �� ����� (���� UserAgent) +message47=Required but not found URLs (HTTP code 404) +message48=����� IP +message49=���� ����� +message50=������� �� ������ (���� UserAgent) +message51=������� ����� +message52=�������/���� +message53=������ �������/�������� +message54=���� ���-��� �� ���� ��� ���� ���������� ����� ������� +message55=of +message56=���� +message57=����� +message58=������� +message59=������ ����� +message60=����� +message61=������ +message62=��� +message63=����� +message64=��� +message65=���� +message66=���� +message67=������ +message68=������ +message69=������� +message70=������ +message71=����� +message72=����� +message73=���� ������ +message74=���� ����� +message75=���� �� +message76=���� ��� ����� +message77=������� +message78=dd mmm yyyy - HH:MM +message79=����� +message80=����� ���� +message81=������ +message82=������ +message83=������� +message84=����� +message85=��� +message86=����� +message87=����� +message88=����� +message89=���� +message90=��� +message91=��� ����� +message92=�� +message93=��� +message94=������� ������ +message95=������� +message96=����� +message97=������� +message98=����� Web +message99=���� �� ���� +message100=����� ����� +message101=����� ������ +message102=�� ��� +message103=������ ���� ����� +message104=�� ����� +message105=��� +message106=���� ����� +message107=������� ���������� +message108=�������� +message109=������� +message110=�������� +message111=���� +message112=�� +message113=�� +message114=���� +message115=OK +message116=�� ����� +message117=����� ������� +message118=���� ���� +message119=���� +message120=������ ���� �������� +message121=����� ���� �������� +message122=������ ������ ����� ����� +message123=������ ������ ����� +message124=������� ����� +message125=������ ����� (�/�� ������� ���������) +message126=������ ����� ����� +message127=������ ������ ����� +message128=����� +message129=��� ������ �� ����� ������ '���' +message130=Data value arrays +message131=����� ���-���� �� ����� +message132=����� ���-���� �� ����� +message133=����� ������ +message134=����/����� +message135=���� ��� +message136=������ �������/������ +message137=����� �������� (�����) +message138=��� ����� +message139=����� +message140=������� �� ����� � Java +message141=������� �� ����� � Macromedia Director +message142=������� �� ����� ����� +message143=������� �� ����� � Real audio +message144=������� �� ����� � Quicktime audio +message145=������� �� ����� � Windows Media audio +message146=������� �� ����� � PDF +message147=���� ������ SMTP +message148=������ +message149=��-������ +message150=���� +message151=����� +message152=����� +message153=����� ���� +message154=����� �������� ��� ���� ����� �� ������ "��� �����" �� ��� ������, ���� �� ������� ����� ��. +message155=Cluster +message156=������� ������� ��� ���� ����� �� ������ �"�� �����" �� ��� ������ �������, �� ��� �� ������� �������� ������ \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-hu.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-hu.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-hu.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,151 @@ +# Hungarian message file (gabor.funk@hunetkft.hu) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-2 +message0=Ismeretlen +message1=Ismeretlen (feloldatlan ip) +message2=Egyebek +message3=R�szletek +message4=Nap +message5=H�nap +message6=�v +message7=Statisztikai alap +message8=Els� l�togat�s +message9=Utols� l�togat�s +message10=L�togat�sok sz�ma +message11=Egyedi l�togat� +message12=L�togat�s +message13=K�l�nb�z� kulcssz� +message14=Keres�s +message15=Sz�zal�k +message16=Forgalom +message17=Tartom�nyok-Orsz�gok +message18=L�togat�k +message19=Oldalak/URL +message20=�r�k +message21=B�ng�sz�k +message22=HTTP hib�k +message23=Hivatkoz�sok +message24=Nem friss�tett +message25=L�togat�k tartom�nyok/orsz�gok szerint +message26=host +message27=oldal +message28=k�l�nb�z� oldalak-url +message29=let�lt�tt oldalak +message30=Egy�b szavak +message31=Nem tal�lt oldalak +message32=HTTP hibak�dok +message33=Netscape verzi�k +message34=IE verzi�k +message35=Utols� friss�t�s +message36=Csatlakoz�sok sz�rmaz�si helyei +message37=Sz�rmaz�si hely +message38=Direkt el�r�s / k�nyvjelz� +message39=Ismeretlen eredet� +message40=Internet keres�kb�l +message41=Linkek k�ls� oldalakr�l (a keres�ket kiv�ve) +message42=Bels� linkek (oldalon bel�l) +message43=Keres�motorokban haszn�lt kifejez�sek +message44=Keres�motorokban haszn�lt kulcsszavak +message45=Feloldatlan IP c�mek +message46=Ismeretlen OS (Hivatkoz� mez�) +message47=Ig�nyelt, de nem tal�lt URL-ek (HTTP code 404) +message48=IP c�m +message49=Hib�s k�r�sek +message50=Ismeretlen b�ng�sz�k (Hivatkoz� mez�) +message51=L�togat� robotok +message52=l�togat�s/l�togat� +message53=Robot/Spider l�togat�k +message54=Ingyenes, val�sidej� napl�f�jl analiz�tor fejlett web statisztik�k k�sz�t�s�hez +message55=/ +message56=Oldalak +message57=Tal�latok +message58=Verzi�k +message59=Oper�ci�s Rendszerek +message60=Jan +message61=Feb +message62=M�r +message63=�pr +message64=M�j +message65=J�n +message66=J�l +message67=Aug +message68=Szept +message69=Okt +message70=Nov +message71=Dec +message72=Navig�ci� +message73=F�jlt�pusok +message74=Friss�t�s +message75=Adatmennyis�g +message76=Vissza a f�oldalra +message77=TOP +message78=yyyy mmm dd - HH:MM +message79=Sz�r� +message80=Teljes lista +message81=Host-ok +message82=ismert +message83=Robotok +message84=V +message85=H +message86=K +message87=Sze +message88=Cs +message89=P +message90=Szo +message91=Heti bont�s +message92=Ki +message93=Mikor +message94=Bejelentkezett felhaszn�l�k +message95=Min +message96=�tlag +message97=Max +message98=Web t�m�r�t�s +message99=Nyert s�vsz�less�g +message100=T�m�r�t�s bekapcsolva +message101=T�m�r�t�s eredm�nye +message102=�sszesen +message103=k�l�nb�z� kifejez�s +message104=Bel�p� oldalak +message105=K�d +message106=�tlagm�ret +message107=Kapcsol�d�s h�rcsoportb�l +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Igen +message113=Nem +message114=WhoIs inform�ci�k +message115=OK +message116=Kil�p� oldalak +message117=L�togat�sok hossza +message118=Ablak bez�r�sa +message119=B�jt +message120=Kifejez�sek keres�se +message121=Kulcsszavak keres�se +message122=k�l�nb�z� hivatkoz� keres�motor +message123=k�l�nb�z� hivatkoz� oldal +message124=Egy�b kifejez�sek +message125=Egy�b, vagy "Anonymous" l�togat�k +message126=Hivatkoz� keres�motorok +message127=Hivatkoz� oldalak +message128=�sszes�t�s +message129=Pontos �rt�k nem �ll rendelkez�sre "�ves" n�zetben +message130=Adat �rt�k t�mb�k +message131=K�ld� E-Mail c�me +message132=Fogad� E-Mail c�me +message133=Statisztikai id�szak +message134=Extra/Marketing +message135=K�perny�m�retek +message136=Worm/Virus k�r�sek +message137=Hozz�ad�s a kedvencekhez (becsl�s) +message138=Napi bont�s +message139=Vegyes +message140=B�ng�sz�k Java t�mogat�ssal +message141=B�ng�sz�k Macromedia Director t�mogat�ssal +message142=B�ng�sz�k Flash t�mogat�ssal +message143=B�ng�sz�k Real audio t�mogat�ssal +message144=B�ng�sz�k Quicktime audio t�mogat�ssal +message145=B�ng�sz�k Windows Media audio t�mogat�ssal +message146=B�ng�sz�k PDF t�mogat�ssal +message147=SMTP hibak�dok Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-id.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-id.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-id.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,136 @@ +# Indonesian message file (oleh Steven Haryanto) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Tidak Diketahui +message1=Tidak Diketahui (IP tidak teresolve) +message2=Lainnya +message3=Lihat Rincian +message4=Hari +message5=Bulan +message6=Tahun +message7=Statistik untuk +message8=Kunjungan Pertama +message9=Kunjungan Terakhir +message10=Jumlah Kunjungan +message11=Pengunjung Unik +message12=Kunjungan +message13=Kata Kunci +message14=Pencarian +message15=Persen +message16=Trafik +message17=Domain/Negara +message18=Pengunjung +message19=Halaman-URL +message20=Jam (Waktu Server) +message21=Browser +message22=Error HTTP +message23=Referer +message24=Tidak pernah diupdate +message25=Domain/negara pengunjung +message26=host +message27=halaman +message28=halaman-url unik +message29=Halaman yang Dilihat +message30=Kata lain +message31=Halaman tidak ditemukan (not found) +message32=Kode error HTTP +message33=Versi Netscape +message34=Versi IE +message35=Terakhir diupdate +message36=Asal koneksi dari +message37=Asal +message38=Direct address / Bookmark +message39=Asal tidak diketahui +message40=Link dari Search Engine +message41=Link dari situs lain (yang bukan search engine) +message42=Link dari situs sendiri (situs yang sama dengan halaman yang diakses) +message43=Frase yang dipakai di search engine +message44=Kata kunci yang dipakai di search engine +message45=Alamat IP yang tidak teresolve +message46=OS tidak diketahui (field useragent) +message47=URL tidak ditemukan (kode HTTP 404) +message48=Alamat IP +message49=Jumlah Hit Error +message50=Browser tidak diketahui (field useragent) +message51=robot unik +message52=kunjungan/pengunjung +message53=Robot/Spider +message54=Tool gratis penganalisis log realtime dan penghasil statistik web advanced +message55=dari +message56=Halaman +message57=Hit +message58=Versi +message59=Sistem Operasi +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Mei +message65=Jun +message66=Jul +message67=Agu +message68=Sep +message69=Okt +message70=Nov +message71=Des +message72=Navigasi +message73=Jenis File +message74=Update Sekarang +message75=Bandwidth +message76=Kembali ke halaman utama +message77=Kembali Ke Atas +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Daftar Lengkap +message81=Host +message82=Diketahui +message83=Robot +message84=Min +message85=Sen +message86=Sel +message87=Rab +message88=Kam +message89=Jum +message90=Sab +message91=Hari +message92=Siapa +message93=Kapan +message94=User yang memiliki password +message95=Min +message96=Rata-Rata +message97=Maks +message98=Kompresi web +message99=Penghematan bandwidth +message100=Sebelum kompresi +message101=Sesudah kompresi +message102=Total +message103=Frase unik +message104=Halaman masuk (entry page) +message105=Kode +message106=Ukuran rata-rata +message107=Link dari newsgroup +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Ya +message113=Tidak +message114=Info WhoIs +message115=OK +message116=Halaman keluar (exit page) +message117=Lama kunjungan +message118=Tutup window +message119=Byte +message120=Frase Pencarian +message121=Kata Kunci Pencarian +message122=search engine referer unik +message123=situs referer unik +message124=Frase lain +message125=Login lain (dan/atau user anonim) +message126=Search engine referer +message127=Situs referer +message128=Ringkasan +message129=Nilai pasti tidak tersedia di tampilan 'Tahunan' +message130=Array nilai data +message131=Email Pengirim +message132=Email Penerima +message133=Periode Laporan \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-is.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-is.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-is.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,167 @@ +# Icelandic message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=��ekkt +message1=��ekkt (Ekki t�kst a� fletta upp ip vistfangi) +message2=Anna� +message3=N�nari uppl�singar +message4=Dagur +message5=M�nu�ur +message6=�r +message7=T�lulegar uppl�singar um +message8=Fyrsta innlit +message9=S��asta innlit +message10=Fj�ldi innlita +message11=Fj�ldi gesta +message12=Innlit +message13=�nnur lykilor� +message14=Leit +message15=Pr�sent +message16=Umfer� +message17=L�n/l�nd +message18=Gestir +message19=Vefs��ur-URL +message20=Klukkustundir +message21=Vafrar +message22=HTTP Villur +message23=Tilv�sandi sl�� +message24=Ekki veri� uppf�rt +message25=L�n/land gests +message26=V�lar +message27=S��ur +message28=Mismunandi uppflettingar +message29=Sko�a� +message30=�nnur or� +message31=S��ur finnast ekki +message32=HTTP Villubo� +message33=Netscape �tg�fa +message34=IE �tg�fa +message35=S��ast uppf�rt +message36=Tengdist vefsetri fr� +message37=Uppruni +message38=Beinar tengingar / Fl�tiv�sun +message39=Uppruni ��ekktur +message40=Tilv�sanir fr� leitarv�lum +message41=Tilv�sanir utan vefs (anna� en leitarv�l) +message42=Tilv�sanir innan vefs (�nnur s��a innan �essa vefs) +message43=Setningar �r leit +message44=Or� �r leit +message45=��ekkt IP vistfang +message46=��ekkt St�rikerfi (useragent field) +message47=Skr�r sem �ska� var eftir en fundust ekki (HTTP code 404) +message48=IP tala +message49=Villa S�tt +message50=��ekktir vafrar (useragent field) +message51=A�rar leitarv�lar +message52=Innlit/Gestir +message53=Leitarv�la/Skri�v�la gestir +message54=�keypis raunt�ma skr�argreinir fyrir vefi. +message55=af +message56=S��ur +message57=Skr�r +message58=�tg�fa +message59=St�rikerfi +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Ma� +message65=J�n +message66=J�l +message67=�gu +message68=Sep +message69=Okt +message70=N�v +message71=Des +message72=Hva�/hvernig +message73=Tegund skr�ar +message74=Uppf�ra +message75=Bandv�dd +message76=Til baka +message77=Efstu +message78=dd mmm yyyy - HH:MM +message79=S�a +message80=Heildarlisti +message81=V�lar +message82=�ekktir +message83=Leitarv�lar +message84=Sun +message85=M�n +message86=�ri +message87=Mi� +message88=Fim +message89=F�s +message90=Lau +message91=Vikudagar +message92=Hva�an +message93=T�mabil +message94=Innskr��ir notendur +message95=Minnsta +message96=Me�altal +message97=H�sta +message98=�j�ppun vefs +message99=Sp�ru� bandv�dd +message100=Virk �j�ppun +message101=Ni�ursta�a �j�ppunar +message102=Samtals +message103=Mismunandi lykilsetningar +message104=Innkoma +message105=Code +message106=Me�altals st�r� +message107=Tenglar fr� fr�ttah�pum +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=J� +message113=Nei +message114=Uppl�singar um l�n +message115=OK +message116=Endar +message117=Lengd innlits +message118=Loka glugga +message119=Bytes +message120=Setningar �r leit +message121=Or� �r leit +message122=A�rar tilv�sandi leitarv�lar +message123=A�rir tilv�sandi vefir +message124=A�rar setningar +message125=A�rar innskr�ningar (og/e�a gestir) +message126=Tilv�sandi leitarv�lar +message127=Tilv�sandi vefsetur +message128=Samantekt +message129=Ekki er til n�kv�mt gildi �egar formi� '�r' er nota� +message130=Data value arrays +message131=P�stfang sendanda +message132=P�stfang vi�takanda +message133=Sk�rslut�mabil +message134=Anna�/Marka�sm�l +message135=Skj�st�r�ir +message136=Ormar og v�rusar +message137=B�kamerki (��tla�) +message138=M�na�ardagar +message139=�mislegt +message140=Vafrar me� Java stu�ning +message141=Vafrar me� Macromedia Director stu�ning +message142=Vafrar me� Flash stu�ning +message143=Vafrar me� Real audio stu�ning +message144=Vafrar me� Quicktime stu�ning +message145=Vafrar me� Windows Media stu�ning +message146=Vafrar me� PDF stu�ning +message147=SMTP Villun�mer +message148=L�nd +message149=Br�f +message150=St�r� +message151=Fyrsta +message152=S��asta +message153=�tilokunars�a +message154=�essir k��ar ���a a� gestir hafi � raun ekki s�� s��urnar, svo �eir eru ekki taldir me� annars sta�ar en h�r. +message155=Klasi +message156=�essar heims�knir komu ekki fr� raunverulegum gestum, svo ��r eru ekki taldar me� annars sta�ar en h�r. +message157=T�lur eftir + t�kna "robots.txt" skr�r. +message158=�essar heims�knir komu ekki fr� raunverulegum gestum, svo ��r eru ekki taldar me� annars sta�ar en h�r. +message159=Engin augu t�knar umfer� vegna leitarv�la, v�rusa og s�rstakra HTTP k��a +message160=Augu +message161=Engin augu +message162=M�na�arleg saga +message163=Ormar +message164=a�rir ormar \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-it.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-it.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-it.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,177 @@ +# Italian message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +# PaniC! - panic@freemail.it +# Francesco Potorti - pot@gnu.org +# iDave - idave@idave.it +# Salvo - salvo@scicli.com +# CereS - ceres@divxmania.it +# StarKnight - starknight@starkingdom.it +message0=Sconosciuti +message1=Sconosciuti (ip non risolto) +message2=Altri +message3=Mostra dettagli +message4=Giorno +message5=Mese +message6=Anno +message7=Statistiche di +message8=Prima visita +message9=Ultima visita +message10=Numero di visite +message11=Visitatori diversi +message12=Visita +message13=parole chiave diverse +message14=Ricerche +message15=Percentuale +message16=Traffico +message17=Domini/Nazioni +message18=Visitatori +message19=Pagine-URL +message20=Ore +message21=Browser +message22= +message23=Provenienza +message24=Non aggiornato (Vedi 'Build/Update' sulla pagina awstats_setup.html) +message25=Domini o nazioni dei visitatori +message26=origini +message27=pagine accedute +message28=pagine-url diverse +message29=Accessi +message30=Altre parole +message31=Pagine non trovate +message32=Codici di errore HTTP +message33=Versioni di Netscape +message34=Versioni di Internet Explorer +message35=Ultimo aggiornamento +message36=Provenienza delle connessioni +message37=Provenienza +message38=Accessi diretti o via segnalibro +message39=Accessi di origine sconosciuta +message40=Accessi da motore di ricerca +message41=Accessi da pagina esterna (altri siti eccetto i motori di ricerca) +message42=Accessi da pagina interna (altra pagina dello stesso sito) +message43=Frasi usate nei motori di ricerca +message44=Parole usate nei motori di ricerca +message45=Indirizzi IP non risolti +message46=Sistemi operativi sconosciuti (campo Provenienza) +message47=URL richieste ma non trovate (codice HTTP 404) +message48=Indirizzo IP +message49=Accessi con errore +message50=Browser sconosciuti (campo Provenienza) +message51=robot diversi +message52=visite/visitatore +message53=Accessi di robot e spider +message54=Analizzatore libero in tempo reale di statistiche di accesso a server web +message55=su +message56=Pagine +message57=Accessi +message58=Versioni +message59=Sistemi operativi +message60=Gen +message61=Feb +message62=Mar +message63=Apr +message64=Mag +message65=Giu +message66=Lug +message67=Ago +message68=Set +message69=Ott +message70=Nov +message71=Dic +message72=Navigazione +message73=Tipi di file +message74=Aggiorna +message75=Banda usata +message76=Pagina principale +message77=Prime +message78=dd mmm yyyy / HH:MM +message79=Filtro +message80=Elenco completo +message81=Hosts +message82=Conosciuti +message83=Robots +message84=Dom +message85=Lun +message86=Mar +message87=Mer +message88=Gio +message89=Ven +message90=Sab +message91=Giorni della settimana +message92=Chi +message93=Quando +message94=Utenti autenticati +message95=Min +message96=Media +message97=Max +message98=Compressione Web +message99=Banda risparmiata +message100=Prima della compressione +message101=Dopo la compressione +message102=Totale +message103=frasi chiave diverse +message104=Pagine iniziali +message105=Codice +message106=Dimensione media +message107=Accessi da un NewsGroup +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Si +message113=No +message114=Informazioni +message115=OK +message116=Pagine d'uscita +message117=Durata delle visite +message118=Chiudi questa finestra +message119=Bytes +message120=Frasi cercate +message121=Parole cercate +message122=differenti motori di ricerca +message123=differenti siti +message124=Altre frasi +message125=Altre login (e/o utenti anonimi) +message126=Motori di ricerca +message127=Siti +message128=Sommario +message129=Valori esatti non disponibili nella vista 'Anno' +message130=Tabelle dei valori +message131=EMail del mittente +message132=EMail del ricevente +message133=Periodo di riferimento +message134=Extra/Marketing +message135=Risoluzione video +message136=Worm/Attacchi di virus +message137=Aggiungi ai preferiti (stimato) +message138=Giorni del mese +message139=Informazioni Varie +message140=Browsers con supporto per Java +message141=Browsers con supporto per Macromedia Director +message142=Browsers con supporto per Flash +message143=Browsers con supporto audio per Real Player +message144=Browsers con supporto audio per Quicktime Player +message145=Browsers con supporto audio per Windows Media Player +message146=Browsers con supporto PDF +message147=Codici di errore SMTP +message148=Nazioni +message149=Mail +message150=Dimensione +message151=Prima +message152=Ultima +message153=Escludi +message154=I codici elencati hanno generato accessi o traffico "non visualizzato" dai visitatori, pertanto non vengono inclusi negli altri grafici. +message155=Raggruppato +message156=I robots elencati hanno generato accessi o traffico "non visualizzato" dai visitatori, pertanto non vengono inclusi negli altri grafici. +message157=I numeri dopo il + rappresentano gli accessi effettuati verso i file "robots.txt". +message158=I worm elencati hanno generato accessi o traffico "non visualizzato" dai visitatori, pertanto non vengono inclusi negli altri grafici. +message159=Il traffico "non visualizzato" � il traffico generato da robots, worm oppure da risposte con codici di errore HTTP speciali. +message160=Traffico visualizzato +message161=Traffico non visualizzato +message162=Riepilogo mensile +message163=Worm +message164=worm diversi +message165=Mail inviate correttamente +message166=Mail fallite/rifiutate +message167=Obiettivi sensibili +message168=Javascript disabilitato \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-jp.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-jp.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-jp.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# Japanese message file (info@kchosting.jp) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=UTF-8 +message0=不明 +message1=不明(ipが解りません) +message2=その他 +message3=詳細を見る +message4=日 +message5=月 +message6=年 +message7=統計 +message8=最初の訪問 +message9=最後の訪問 +message10=訪問数 +message11=訪問者 +message12=訪問 +message13=キーワード +message14=検索 +message15=パーセント +message16=容量 +message17=ドメイン/国名 +message18=訪問者 +message19=URLページ +message20=時間 +message21=ブラウザ +message22=HTTPエラー +message23=参照 +message24=更新なし +message25=訪問者・ドメイン/国名 +message26=ホスト +message27=ページ +message28=ページ +message29=アクセス +message30=他の言葉 +message31=ページが見つかりません +message32=HTTPエラーコード +message33=Netscapeバージョン +message34=IEバージョン +message35=最終の更新 +message36=このサイトへのアクセス元 +message37=アクセス元 +message38=直接URLを入力/お気に入りからのアクセス +message39=起点が不明 +message40=インターネット検索エンジンからのリンク +message41=外部ページからのリンク(検索エンジンを除く他のホームページ) +message42=内部ページからのリンク(同じサイトの他のページ) +message43=検索エンジンの文字列(キーフレーズ) +message44=検索エンジンの文字列(キーワード) +message45=不明なIPアドレス +message46=不明なOS(参照フィールド) +message47=要求されたURLは見つかりません(HTTPコード404) +message48=未解決のIPアドレス +message49=エラー 件数 +message50=不明ブラウザ(参照フィールド) +message51=ロボットの訪問 +message52=訪問/訪問者 +message53=ロボット/スパイダーの訪問者 +message54=上級web統計のフリーリアルタイムログファイル分析 +message55=の +message56=ページ +message57=件数 +message58=バージョン +message59=オペレーティングシステム +message60=1月 +message61=2月 +message62=3月 +message63=4月 +message64=5月 +message65=6月 +message66=7月 +message67=8月 +message68=9月 +message69=10月 +message70=11月 +message71=12月 +message72=ナビゲーション +message73=ファイルの種類 +message74=更新する +message75=バイト +message76=メインページに戻る +message77=トップ +message78= yyyy年 mmm dd日 - HH:MM +message79=フィルター +message80=全リスト +message81=ホスト +message82=既知 +message83=ロボット +message84=日曜日 +message85=月曜日 +message86=火曜日 +message87=水曜日 +message88=木曜日 +message89=金曜日 +message90=土曜日 +message91=曜日 +message92=だれ +message93=いつ +message94=認証されたユーザー +message95=最小 +message96=平均 +message97=最大 +message98=Web圧縮 +message99=帯域幅の保存 +message100=圧縮前 +message101=圧縮後 +message102=合計 +message103=キーフレーズ +message104=入り口 +message105=コード +message106=平均サイズ +message107=ニュースグループからのリンク +message108=Kb +message109=Mb +message110=Gb +message111=Grabber +message112=Yes +message113=No +message114=WhoIs情報 +message115=OK +message116=出口 +message117=訪問の長さ +message118=ウィンドーを閉じる +message119=バイト +message120=検索文字列(キーフレーズ) +message121=検索文字列(キーワード) +message122=検索エンジン +message123=ホームページ +message124=他のフレーズ +message125=他のログイン +message126=検索エンジン +message127=ホームページ +message128=サマリー +message129=「年」ビューでは精密な数字はありません +message130=データ配列関数 +message131=送信者のEMail +message132=受信者のEMail +message133=表示するレポート +message134=エキストラ/マーケティング +message135=画面解像度 +message136=ワーム/ウィルス攻撃 +message137=お気に入りに追加 +message138=日付 +message139=その他 +message140=Java 対応ブラウザー +message141=Macromedia Director 対応ブラウザー +message142=Flash 対応ブラウザー +message143=Real Audio 対応ブラウザー +message144=Quicktime Audio 対応ブラウザー +message145=Windows Media 対応ブラウザー +message146=PDF 対応ブラウザー +message147=SMTP エラーコード +message148=国 +message149=メール +message150=サイズ +message151=最初 +message152=最後 +message153=除外フィルター +message154=このチャートのコードは訪問者によるアクセスではありませんので他のチャートに含まれていません。 +message155=クラスター +message156=ロボットによるアクセスは訪問者の閲覧とは違いますので他のチャートに含まれていません。 +message157=+の後の数字は「robots.txt」の表示が成功した回数です。 +message158=ワームによるアクセスは訪問者の閲覧とは違いますので他のチャートに含まれていません。 +message159=閲覧に含まれないアクセスはロボット、ワームなどによるものです。 +message160=閲覧アクセス +message161=閲覧に含まれないアクセス +message162=月 +message163=ワーム +message164=その他のワーム +message165=Mails successfully sent +message166=Mails failed/refused +message167=Sensitive targets \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-kr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-kr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-kr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,114 @@ +# Korean message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=euc-kr +message0=�˼����� +message1=�˼�����(�˼����� ip) +message2=��Ÿ +message3=�ڼ��� ���� +message4=�� +message5=  +message6=�� +message7=��� +message8=ó�� ���� +message9=������ ���� +message10=���� ȸ�� +message11=�����ں� +message12=���� +message13=Ű���� +message14=ã�� +message15=�ۼ�Ʈ +message16=Traffic +message17=������/���� +message18=�湮�� +message19=������/URL +message20=�ð� +message21=������ +message22=HTTP ���� +message23=���۷� +message24=ã�� Ű���� +message25=�湮�� ������/���� +message26=ȣ��Ʈ +message27=������ +message28=�ٸ� ������ +message29=�б� ȸ�� +message30=�ٸ� �ܾ� +message31=����� ������ +message32=HTTP ���� �ڵ� +message33=�ݽ������� ���� +message34=MS ���ͳ� �ͽ��÷η� ���� +message35= +message36=���� ����Ʈ�� ��� +message37=�ּ� +message38=���� �ּ� / �ϸ�ũ +message39= +message40=���� �˻� �������� ���� +message41=�ܺ����������� ���� (�˻������� ������ �ٸ� ������Ʈ) +message42=�������������� ��ũ(���� ����Ʈ�� �ٸ� ������) +message43=�˻��������� ���� Ű���� +message44= +message45=�˼����� IP �ּ� +message46=�˼����� OS (�䷯�� �ʵ�) +message47=�������� �ʴ� URL ���ӽõ� (HTTP �ڵ� 404) +message48=IP �ּ� +message49=���ӿ��� ȸ�� +message50=�˼����� ������ (���۷� �ʵ�) +message51=�湮���� �ι�Ʈ +message52=����/�湮�� +message53=�ι�Ʈ/�����̴� �湮�� +message54=�������� �� ��踦 ���� �����ο� �ǽð� �α����� +message55=- +message56=���� ������ +message57=��ȸ�� +message58=���� +message59=OS +message60=1�� +message61=2�� +message62=3�� +message63=4�� +message64=5�� +message65=6�� +message66=7�� +message67=8�� +message68=9�� +message69=10�� +message70=11�� +message71=12�� +message72= +message73= +message74=Update now +message75=Bytes +message76=Back to main page +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Full list +message81=Hosts +message82=Known +message83=Robots +message84=Sun +message85=Mon +message86=Tue +message87=Wed +message88=Thu +message89=Fri +message90=Sat +message91=Days of week +message92=Who +message93=When +message94=Authenticated users +message95=Min +message96=Average +message97=Max +message98=Web compression +message99=bandwidth saved +message100=Before compression +message101=After compression +message102=Total +message103=different keyphrases +message104=Entry pages +message105=Code +message106=Average size +message107=Links from a NewsGroup +message108=��뷮(Kb) +message109=MB +message110=GB \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-lv.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-lv.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-lv.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,170 @@ +# Latvie�u valodas zi�ojumu fils (madmaster@gobbo.caves.lv) +# Updated by edvinsma@inbox.lv 2004/01/24 00:40:00 +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=windows-1257 +message0=Nezin�ms +message1=Nezin�ms (neatpaz�ts ip) +message2=Citi +message3=Apskat�t izv�rsti +message4=Diena +message5=M�nesis +message6=Gads +message7=Statistika +message8=Pirmais apmekl�jums +message9=P�d�jais apmekl�jums +message10=Viz��u skaits +message11=Unik�lie apmekl�t�ji +message12=Apmekl�jums +message13=at��ir�gi(s) atsl�gv�rdi(s) +message14=Mekl�t +message15=Procenti +message16=Trafiks +message17=Domaini/Valstis +message18=Apmekl�t�ji +message19=Lapas-URL +message20=Stundas +message21=P�rl�kprogrammas +message22=HTTP K��das +message23=Nor�d�t�ji +message24=Mekl�t Atsl�gv�rdus +message25=Apmekl�t�ju domaini/valstis +message26=hosti +message27=lapas +message28=at��ir�gas lapas +message29=Skat�tas lapas +message30=Citi v�rdi +message31=Neatrastas lapas +message32=HTTP K��du kodi +message33=Netscape versijas +message34=IE versijas +message35=P�d�jais jaunin�jums +message36=Pievienoties saitei no +message37=Ori�in�li +message38=Tie�� adrese / Gr�matz�mes +message39=Or�in�ls nezin�ms +message40=Nor�des no Interneta Mekl��anas Sait�m +message41=Nor�des no �r�j�m lap�m (citas web lapas iz�emot mekl��anas saites) +message42=Links from an internal page (cita lapa �aj� pa�� sait�) +message43=Atsl�gv�rdi kas lietoti mekl��anas sait�s +message44=Kb +message45=Neatpaz�tas IP Addreses +message46=Nezin�ms OS (Nor�des Lauks) +message47=Piepras�ts bet neatrasts URLs (HTTP kods 404) +message48=IP Addrese +message49=K�uda Tr�p�jumi +message50=Nezin�mi p�rl�ki (Nor�des lauks) +message51=Apmekl�ju�ie roboti +message52=apmekl�jumi/apmekl�t�ji +message53=Roboti/Zirnek�i apmekl�t�ji +message54=Br�vs re�l� laika logfailu analizators advanc�tai web statistikai +message55=no +message56=Lapas +message57=Tr�p�jumi +message58=Versijas +message59=Oper�ciju Sist�mas +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Mai +message65=J�n +message66=J�l +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Dec +message72=Navig�cija +message73=Failu tips +message74=Atjaunot +message75=Baiti +message76=Atpaka� uz galveno lapu +message77=Aug�a +message78=dd mmm yyyy - HH:MM +message79=Filtrs +message80=Pilns saraksts +message81=Hosti +message82=Zin�ms +message83=Roboti +message84=Sv +message85=Pir +message86=Ot +message87=Tr +message88=Ce +message89=Pkt +message90=Se +message91=Ned��as dienas +message92=Kas +message93=Kad +message94=Autentific�tie lietot�ji +message95=Min +message96=Vid +message97=Maks +message98=Web sal�dzin�jums +message99=saglab�tais joslas platums +message100=Pirms kompresijas +message101=P�c kompresijas +message102=Kop� +message103=At��ir�gi atsl�gv�rdi +message104=Iejas lapas +message105=Kods +message106=Vid�jais izm�rs +message107=Saites no Zi�u grup�m +message108=KB +message109=MB +message110=GB +message111=Sav�c�js +message112=J� +message113=N� +message114=WhoIs inform�cija +message115=OK +message116=Izejas pages +message117=Apmekl�juma ilgums +message118=Aizv�rt logu +message119=Baiti +message120=Mekl��ans atsl�gfr�zes +message121=Mekl��anas atsl�gv�rdi +message122=Citas mekl�t�ju lapas ar atsauc�m +message123=Citas lapas ar atsauc�m +message124=Citas fr�zes +message125=Anon�mie lietot�ji +message126=Mekl�t�ju lapas ar atsauc�m +message127=Lapas ar atsauc�m +message128=Kopsavilkums +message129=Prec�za v�rt�ba sada�� "Gads" nav pieejama +message130=Datu v�r�bu kopnes +message131=S�t�t�ja adrese +message132=Sa��m�ja adrese +message133=Atskaites periods +message134=Papildus/M�rketings +message135=Ekr�na iz��ir�anas sp�ja +message136=V�rusu uzbrukumi +message137=Pievienots izlasei +message138=M�ne�a dienas +message139=Da��di +message140=P�rl�kprogrammas ar Java atbalstu +message141=P�rl�kprogrammas ar Macromedia Director atbalstu +message142=P�rl�kprogrammas ar Flash atbalstu +message143=P�rl�kprogrammas ar RealAudio atbalstu +message144=P�rl�kprogrammas ar QuickTime atbalstu +message145=P�rl�kprogrammas ar Windows Media atbalstu +message146=P�rl�kprogrammas ar PDF atbalstu +message147=SMTP k��du kodi +message148=Valstis +message149=E-pasti +message150=Izm�rs +message151=S�kums +message152=Beigas +message153=Izsl�g�anas filtrs +message154=�eit kodi par�da ��vienus vai trafiku, ko nav apskat�ju�i lietot�ji, t�p�c vi�i nav iek�auti cit�s diagramm�s. +message155=Puduris +message156=�eit uzr�d�tie roboti ir rad�ju�i tr�pijumus vai "nepskat�to" trafiku, t�p�c tie nav iek�auti cit�s diagramm�s. +message157=Skaitlis p�c "+" ir veiksm�go ��vienu skaits robots.txt failam. +message158=�ie ir uzr�d�ti tr�pijumi vai trafiks ko rad�ja t�kla t�rpi vai ar� "neapskat�t�s" lapas, t�p�c tie nav iek�auti cit�s +diagramm�s. +message159="Neapskat�to" trafiku �ener� roboti, t�kla t�rpi, vai ar� atbildes ar specialo HTTP statusa kodu. +message160=Apskat�ts trafiks +message161=Nav apskat�ts trafiks +message162=M�ne�a atskaite +message163=T�kla t�rpi +message164=Da��di t�kla t�rpi Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nb.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nb.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nb.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# Norwegian Bokm�l message file (by Vemund F Jensen ) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-1 +message0=Ukjent +message1=Ukjente (fant ikke vertsnavn) +message2=Andre +message3=Vis detaljer +message4=Dag +message5=M�ned +message6=�r +message7=Statistikk for +message8=F�rste bes�k +message9=Siste bes�k +message10=Antall bes�k +message11=Unike gjester +message12=Bes�k +message13=forskjellige s�keord +message14=S�k +message15=Prosent +message16=Trafikk +message17=Domene/land +message18=Gjester +message19=Sider/url-er +message20=Timefordeling +message21=Nettlesere +message22= +message23=Referenter +message24=Aldri oppdatert +message25=Bes�kendes domener/land +message26=verter +message27=sider +message28=forskjellige sider/url-er +message29=Viste sider +message30=Andre ord +message31=Manglende sider +message32=HTTP statuskoder +message33=Netscape-versjoner +message34=IE-versjoner +message35=Siste oppdatering +message36=Koblet til siden fra +message37=Opphav +message38=Direkteadresse/bokmerke +message39=Ukjent opphav +message40=Lenker fra s�kemotorer +message41=Lenker fra eksterne sider (andre nettsteder unntatt s�kemotorer) +message42=Lenker fra interne sider (andre sider p� samme nettsted) +message43=S�keuttrykk brukt i s�kemotorer +message44=S�keord brukt i s�kemotorer +message45=Ukjent vertsnavn +message46=Ukjent operativsystem (referentfelt) +message47=Dokument ikke funnet (HTTP feilkode 404) +message48=IP-adresse +message49=Feiltreff +message50=Ukjent nettleser (referentfelt) +message51=ulike roboter +message52=bes�k/gjest +message53=Robotbes�k +message54=Gratis sanntids logganalysator for avansert webstatistikk +message55=av +message56=Sider +message57=Treff +message58=Versjoner +message59=Operativsystemer +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Mai +message65=Jun +message66=Jul +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Des +message72=Navigasjon +message73=Filtype +message74=Oppdater n� +message75=Datamengde +message76=Tilbake til hovedsiden +message77=�verste +message78=yyyy-mm-dd - HH:MM +message79=Filter +message80=Full liste +message81=Verter +message82=kjente +message83=Roboter +message84=S�n +message85=Man +message86=Tir +message87=Ons +message88=Tor +message89=Fre +message90=L�r +message91=Ukedagsfordeling +message92=Hvem +message93=N�r +message94=Autentiserte brukere +message95=Min. +message96=Snitt +message97=Maks. +message98=Komprimering +message99=B�ndbredde spart +message100=Komprimering p� +message101=Komprimeringsresultat +message102=Total +message103=forskjellige s�keuttrykk +message104=Inngangssider +message105=Kode +message106=Gjennomsnittst�rrelse +message107=Lenker fra diskusjonsgrupper +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Ja +message113=Nei +message114=Info +message115=OK +message116=Utgangssider +message117=Bes�kslengde +message118=Lukk vindu +message119=Bytes +message120=S�keuttrykk +message121=S�keord +message122=forskjellige refererende s�kemotorer +message123=forskjellige refererende nettsteder +message124=Andre uttrykk +message125=Andre p�logginger (og/eller anonyme brukere) +message126=Refererende s�kemotorer +message127=Refererende nettsteder +message128=Sammendrag +message129=N�yaktig antall ikke tilgjengelig i �rssammendraget +message130=Verditabeller +message131=E-post (avsender) +message132=E-post (mottaker) +message133=Rapportperiode +message134=Ekstra +message135=Skjermst�rrelser +message136=Orm-/virusangrep +message137=Lagt til favoritter (estimat) +message138=M�nedsoversikt +message139=Forskjellig +message140=Nettlesere med st�tte for Java +message141=Nettlesere med st�tte for Macromedia Director +message142=Nettlesere med st�tte for Flash +message143=Nettlesere med st�tte for Real lydavspilling +message144=Nettlesere med st�tte for Quicktime lydavspilling +message145=Nettlesere med st�tte for Windows Media lydavspilling +message146=Nettlesere med st�tte for PDF +message147=SMTP feilkoder +message148=Land +message149=Meldinger +message150=St�rrelse +message151=F�rste +message152=Siste +message153=Sperrefilter +message154=Disse kodene gav treff eller trafikk som ikke ble vist i nettleseren, og er ikke inkludert i andre oversikter. +message155=Klynge +message156=Roboter vist her gav treff eller trafikk som ikke ble vist i nettleseren, og er ikke inkludert i andre oversikter. +message157=Antall etter + er treff p� "robots.txt"-filer. +message158=Ormer vist her gav treff eller trafikk som ikke ble vist i nettleseren, og er ikke inkludert i andre oversikter. +message159=Ikke-vist trafikk er trafikk generert av roboter, ormer eller HTTP-trafikk med spesielle statuskoder. +message160=Vist trafikk +message161=Ikke-vist trafikk +message162=�rsoversikt +message163=Ormer +message164=Ulike ormer +message165=Vellykkede e-postforsendelser +message166=Mislykkede/avviste e-postforsendelser +message167=Sensitive m�l \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nl.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nl.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nl.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,170 @@ +# Dutch message file (door Amedee Van Gasse - amedee.be) +# Addon by Marcel Huijkman - marcel.huijkman@raketnet.nl +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Onbekend +message1=Onbekend (Onbekend ip) +message2=Andere +message3=Bekijk details +message4=Dag +message5=Maand +message6=Jaar +message7=Statistieken van +message8=Eerste bezoek +message9=Laatste bezoek +message10=Aantal bezoeken +message11=Unieke bezoekers +message12=Bezoek +message13=Trefwoorden +message14=Zoek +message15=Procent +message16=Verkeer +message17=Domeinen/Landen +message18=Bezoekers +message19=Pagina's/URL +message20=Uren +message21=Browsers +message22=HTTP Foutmeldingen +message23=Verwijzing +message24=Zoek trefwoorden +message25=Bezoekers domeinen/landen +message26=hosts +message27=pagina's +message28=verschillende pagina's +message29=Toegang +message30=Andere woorden +message31=Niet gevonden pagina's +message32=HTTP foutmelding codes +message33=Netscape versies +message34=MS Internet Explorer versies +message35=Laatste Update +message36=Verbinding naar site vanaf +message37=Herkomst +message38=Direkt adres / Bookmarks +message39=Herkomst onbekend +message40=Link vanuit een Internet Zoek Machine +message41=Link vanuit een externe pagina (andere web sites behalve zoek machines) +message42=Link vanuit een interne pagina (andere pagina van dezelfde site) +message43=gebruikte trefwoorden bij zoek machines +message44=XXXX44 +message45=niet vertaald IP Adres +message46=Onbekend OS (Referer veld) +message47=Verplicht maar niet gevonden URLs (HTTP code 404) +message48=IP Adres +message49=Fout Hits +message50=Onbekende browsers (Referer veld) +message51=Bezoekende robots +message52=bezoeken/bezoeker +message53=Robots/Spiders bezoekers +message54=Gratis realtime logbestand analyzer voor geavanceerde web statistieken +message55=van +message56=Pagina's +message57=Hits +message58=Versies +message59=OS +message60=Januari +message61=Februari +message62=Maart +message63=April +message64=Mei +message65=Juni +message66=Juli +message67=Augustus +message68=September +message69=Oktober +message70=November +message71=December +message72=Navigatie +message73=Bestandstypen +message74=Nu verversen +message75=Bytes +message76=Terug naar hoofdpagina +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Volledige lijst +message81=Hosts +message82=Bekend +message83=Robots +message84=Zon +message85=Maa +message86=Din +message87=Woe +message88=Don +message89=Vrij +message90=Zat +message91=Weekdagen +message92=Wie +message93=Wanneer +message94=Ingelogde bezoekers +message95=Min +message96=Gemiddeld +message97=Max +message98=Web compressie +message99=Bespaarde bandbreedte +message100=Voor compressie +message101=Na compressie +message102=Totaal +message103=verschillende trefzinnen +message104=Binnenkomst pagina's +message105=Code +message106=Gemiddelde grootte +message107=Links vanuit een Nieuwsgroep +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Ja +message113=Nee +message114=WhoIs info +message115=OK +message116=Uitgang +message117=Duur bezoeken +message118=Sluit venster +message119=Bytes +message120=Zoek Trefzinnen +message121=Zoek Trefwoorden +message122=verschillende verwijzende zoekmachines +message123=verschillende verwijzende sites +message124=Andere zinnen +message125=Andere logins (en/of anonieme gebruikers) +message126=Verwijzende zoekmachines +message127=Verwijzende sites +message128=Samenvatting +message129=Exacte waarde niet beschikbaar in "Jaar"-overzicht +message130=Data value arrays +message131=Afzender EMail +message132=Ontvanger EMail +message133=Gerapporteerde periode +message134=Extra/Marketing +message135=Screen sizes +message136=Worm/Virus attacks +message137=Add to favorites (estimated) +message138=Dagen van maand +message139=Overigen +message140=Browsers met Java ondersteuning +message141=Browsers met Macromedia Director ondersteuning +message142=Browsers met Flash ondersteuning +message143=Browsers met Real audio playing ondersteuning +message144=Browsers met Quicktime audio playing ondersteuning +message145=Browsers met Windows Media audio playing ondersteuning +message146=Browsers met PDF ondersteuning +message147=SMTP Error codes +message148=Landen +message149=Mails +message150=Grootte +message151=Eerste +message152=Laatste +message153=Uitsluiten filter +message154=Deze codes geven "niet bekeken" door bezoekers, daarom worden ze niet in andere tabellen getoond +message155=Cluster +message156=Robots geven "niet bekeken" door bezoekers, daarom worden ze niet in andere tabellen getoond +message157=Getallen achter + zijn geslaagde hits op "robots.txt" bestanden. +message158=Worms geven "niet bekeken" door bezoekers, daarom worden ze niet in andere tabellen getoond +message159=Niet bekeken verkeer is verkeer dat gegenereerd werd door robots, worms of antwoorden met een speciale HTTP status code. +message160=Bekeken verkeer +message161=Niet bekeken verkeer +message162=Maandelijkse historie +message163=Wormen +message164=verschillende wormen +message165=Successvolle mails +message166=Geweigerde of slechte mails Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nn.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nn.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-nn.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,159 @@ +# Norwegian Nynorsk message file (by Karl Ove Hufthammer ) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-1 +message0=Ukjent +message1=ukjente (fann ikkje vertsnamn) +message2=Andre +message3=Vis detaljar +message4=Dag +message5=M�nad +message6=�r +message7=Statistikk for +message8=F�rste bes�k +message9=Siste bes�k +message10=Talet p� bes�k +message11=Unike gjestar +message12=Bes�k +message13=forskjellige s�kjeord +message14=S�k +message15=Prosent +message16=Trafikk +message17=Domene/land +message18=Gjestar +message19=Sider +message20=Timar +message21=Nettlesarar +message22=HTTP-feil +message23=Referentar +message24=Aldri oppdatert +message25=Domene/land +message26=vertar +message27=sider +message28=forskjellige sider +message29=Viste sider +message30=Andre ord +message31=Manglande sider +message32=HTTP-feilkodar +message33=Netscape-versjonar +message34=IE-versjonar +message35=Siste oppdatering +message36=Kopla til sida fr� +message37=Opphav +message38=Direkteadresse/bokmerke +message39=Ukjent opphav +message40=Lenkjer fr� s�kjemotorar +message41=Lenkjer fr� eksterne sider (ikkje s�kjemotorar) +message42=Lenkjer fr� interne sider (sider p� same nettstad) +message43=S�kjeuttrykk brukt +message44=S�kjeord brukt +message45=Ukjente vertsnamn (IP-adresse) +message46=Ukjente OS (referentfelt) +message47=Manglande sider (HTTP-feilkode 404) +message48=IP-adresse +message49=Feiltreff +message50=Ukjente nettlesarar +message51=forskjellige robotar +message52=bes�k/gjest +message53=Robotbes�k +message54=Gratis logganalysator for avansert vevstatistikk +message55=av +message56=Sider +message57=Treff +message58=Versjonar +message59=Operativsystem +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Mai +message65=Jun +message66=Jul +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Des +message72=Navigasjon +message73=Filtypar +message74=Oppdater no +message75=Bandbreidd +message76=Tilbake til hovudsida +message77=�vste +message78=yyyy-mm-dd - HH:MM +message79=Berre vis +message80=Full liste +message81=Vertar +message82=kjente +message83=Robotar +message84=S�. +message85=M�. +message86=Ty. +message87=On. +message88=To. +message89=Fr. +message90=La. +message91=Dagar i veka +message92=Kven +message93=N�r +message94=Autentiserte brukarar +message95=Min. +message96=Snitt +message97=Maks. +message98=Komprimering +message99=Bandbreidd spart +message100=Komprimering p� +message101=Komprimeringsresultat +message102=Totalt +message103=forskjellige s�kjeuttrykk +message104=Inngangssider +message105=Kode +message106=Snittstorleik +message107=Lenkjer fr� njusgrupper +message108=KiB +message109=MiB +message110=GiB +message111=Hentar +message112=Ja +message113=Nei +message114=WhoIs-info +message115=OK +message116=Utgangssider +message117=Bes�kslengd +message118=Lukk vindauge +message119=Byte +message120=S�kjeuttrykk +message121=S�kjeord +message122=forskjellige s�kjemotorar +message123=forskjellige nettstadar +message124=Andre uttrykk +message125=Andre p�logginar (og/eller anonyme brukarar) +message126=S�kjemotorar +message127=Nettstadar +message128=Samandrag +message129=N�yaktige tal finst ikkje for �rsoversikta +message130=Verditabellar +message131=E-post (avsendar) +message132=E-post (mottakar) +message133=Rapportperiode +message134=Ekstra +message135=Skjermstorleik +message136=Orm- og virus�tak +message137=Lagt til i bokmerkesamling (ikkje n�yaktig) +message138=Dagar i m�naden +message139=Ymse +message140=Nettlesarar med Java-st�tte +message141=Nettlesarar med Macromedia Director-st�tte +message142=Nettlesarar med Flash-st�tte +message143=Nettlesarar med RealAudio-lydst�tte +message144=Nettlesarar med QuickTime-lydst�tte +message145=Nettlesarar med Windows Media-lydst�tte +message146=Nettlesarar med PDF-st�tte +message147=SMTP-feilkodar +message148=Land +message149=E-postar +message150=Storleik +message151=F�rste +message152=Siste +message153=Ikkje vis +message154=* Kodar her gav treff eller trafikk �ikkje sett� av gjestane, og blir derfor vist for seg. +message155=Klynge \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-pl.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-pl.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-pl.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# Polish message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-2 +message0=Nieznane +message1=Nieznane (brak odwzorowania IP w DNS) +message2=Inne +message3=Szczeg�y... +message4=Dzie� +message5=Miesi�c +message6=Rok +message7=Statystyki +message8=Pierwsza wizyta +message9=Ostatnia wizyta +message10=Ilo�� wizyt +message11=Unikalnych go�ci +message12=wizyt +message13=S�owo kluczowe +message14=Szukanych +message15=Procent +message16=Ruch +message17=Domeny/Kraje +message18=Go�cie +message19=Stron/URL-i +message20=Rozk�ad godzinny +message21=Przegl�darki +message22=B��dy HTTP +message23=Referenci +message24=Wyszukiwarki - s�owa kluczowe +message25=Domeny/narodowo�� Internaut�w +message26=hosty +message27=strony +message28=r�nych stron +message29=Dost�p +message30=Inne s�owa +message31=Strona nie znaleziona +message32=Kody b��d�w HTTP +message33=Wersje Netscape'a +message34=Wersje MS IE +message35=Ostatnio uaktualnione +message36=�r�d�a po��cze� +message37=Pochodzenie +message38=Dost�p bezpo�redni lub z Ulubionych/Bookmark�w +message39=Pochodzenie nieznane +message40=Link z zagranicznej wyszukiwarki internetowej +message41=Link zewn�trzny +message42=Link wewn�trzny (z serwera, na kt�rym jest strona) +message43=Frazy u�yte w wyszukiwarkach internetowcyh +message44=S�owa kluczowe u�yte w wyszukiwarkach internetowcyh +message45=Nieznane (brak odwzorowania IP w DNS) +message46=Nieznany system operacyjny +message47=Nie znaleziony (B��d HTTP 404) +message48=Adres IP +message49=Ilo�� b��d�w +message50=Nieznane przegl�darki +message51=Roboty sieciowe +message52=wizyt/go�ci +message53=Roboty sieciowe +message54=Analizator log�w on-line +message55=z +message56=Strony +message57=��dania +message58=Wersje +message59=Systemy operacyjne +message60=Sty +message61=Lut +message62=Mar +message63=Kwi +message64=Maj +message65=Cze +message66=Lip +message67=�ie +message68=Wrz +message69=Pa� +message70=Lis +message71=Gru +message72=Nawigacja +message73=Typy plikow +message74=Aktualizuj +message75=Bajt�w +message76=Z powrotem +message77=Najcz�stsze +message78=dd mmm yyyy - HH:MM +message79=Filtr +message80=Pe�na lista +message81=Hosty +message82=Znane +message83=Roboty sieciowe +message84=Ni +message85=Pn +message86=Wt +message87=�r +message88=Cz +message89=Pt +message90=So +message91=Dni tygodnia +message92=Kto +message93=Kiedy +message94=Dopuszczeni +message95=Min +message96=�rednio +message97=Max +message98=Kompresja +message99=Pasmo zaoszcz�dzone +message100=Przed skompresowaniem +message101=Po skompresowaniu +message102=Razem +message103=r�ne frazy +message104=Wej�cia ze stron +message105=Kod +message106=�rednia wielko�� +message107=Linki z grup dyskusyjnych +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Tak +message113=Nie +message114=Informacja Whois +message115=OK +message116=Strony wyjscia +message117=Czasy wizyt +message118=Zamknij okno +message119=Bajt�w +message120=Poszukiwane frazy +message121=Poszukiwane s�owa kluczowe +message122=r�n(e)/(ych) wyszukiwar(ki)/(ek) +message123=r�nych stron +message124=Inne frazy +message125=U�ytkownicy anonimowi +message126=Link z zagranicznej wyszukiwarki internetowej +message127=Linki z innych stron +message128=Podsumowanie +message129=Dok�adna wrto�� nie jest dost�pna w widoku rocznym +message130=Tablice z warto�ciami danych +message131=Nadawca wiadomo�ci pocztowych +message132=Odbiorca wiadomo�ci pocztowych +message133=Raportowany okres +message134=Extra/Marketing +message135=Rozmiary ekran�w +message136=Ataki Robak�w internetowych/Wirus�w +message137=Dodaj do ulubionych (szacunkowo) +message138=Dni miesi�ca +message139=Rozmaito�ci +message140=Przegl�darki z obs�ug� Java +message141=Przegl�darki z obs�ug� Macromedia Director +message142=Przegl�darki z obs�ug� Flash +message143=Przegl�darki z obs�ug� odtwarzacza Real audio +message144=Przegl�darki z obs�ug� odtwarzacza Quicktime audio +message145=Przegl�darki z obs�ug� odtwarzacza Windows Media audio +message146=Przegl�darki z obs�ug� PDF +message147=Kody b��d�w SMTP +message148=Kraje +message149=Wiadomo�ci pocztowe +message150=Wielko�� +message151=Pierwszy +message152=Ostatni +message153=Filtr wykluczaj�cy +message154=Pokazane tutaj kody dotycz� ��da� lub ruchu "nieogl�danego" przez go�ci, dlatego nie s� zawarte w innych zestawieniach. +message155=Klaster +message156=Pokazane tutaj roboty sieciowe dotycz� ��da� lub ruchu "nieogl�danego" przez go�ci, dlatego nie s� zawarte w innych zestawieniach. +message157=Liczby po + dotycz� zako�czonych powodzeniem ��da� do plik�w "robots.txt". +message158=Pokazane tutaj robaki internetowe dotycz� ��da� lub ruchu "nieogl�danego" przez go�ci, dlatego nie s� zawarte w innych zestawieniach. +message159=Ruch nieogl�dany zawiera ruch generowany przez roboty, robaki internetowe lub odpowiedzi ze specjalymi kodami statusu HTTP. +message160=Ruch ogl�dany +message161=Ruch nieogl�dany +message162=Historia miesi�czna +message163=Robaki internetowe +message164=r�ne robaki internetowe +message165=Wiadomo�ci pocztowe wys�ane prawid�owo +message166=Wiadomo�ci pocztowe nie wys�ane/odrzucone +message167=Wra�liwe cele \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-pt.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-pt.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-pt.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,167 @@ +# Portuguese message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Desconhecido +message1=Desconhecido (ip n�o resolvido) +message2=Outros visitantes +message3=Ver detalhes +message4=Dia +message5=M�s +message6=Ano +message7=Estat�sticas de +message8=Primeira visita +message9=�ltima visita +message10=Numero de visitas +message11=Visitantes �nicos +message12=Visita +message13=Palavra chave +message14=Pesquisa +message15=Percentagem +message16=Tr�fego +message17=Dom�nios/Pa�ses +message18=Visitantes +message19=P�ginas/URL +message20=Horas +message21=Visualizadores +message22=Erros HTTP +message23=Referencias +message24=Busca Palavras +message25=Visitas dom�nios/pa�ses +message26=hosts +message27=p�ginas +message28=paginas diferentes +message29=Acesso +message30=Outras palavras +message31=P�ginas n�o encontradas +message32=Erros HTTP +message33=Vers�es Netscape +message34=Vers�es MS Internet Explorer +message35=Ultima Actualiza��o +message36=Ligado a partir de +message37=Origem +message38=Endere�o directo / Favoritos +message39=Origem desconhecida +message40=Liga��es de um motor de busca +message41=Liga��es de p�ginas externas (outros que n�o motores de busca) +message42=Liga��es de p�ginas internas (p�ginas no mesmo site) +message43=Frases usadas em motores de busca +message44=Palavras usadas em motores de busca +message45=Endere�o IP n�o resolvido +message46=SO Desconhecido (Campo Referer) +message47=URLs solicitadas e n�o encontradas (HTTP code 404) +message48=Endere�o IP +message49=Erro Hits +message50=Browsers Desconhecidos (Campo Referer) +message51=Motores visitantes +message52=visitas/visitante +message53=Motores/Spiders +message54=Ferramenta de An�lise de ficheiros de log em realtime para estat�sticas avan�adas +message55=de +message56=P�ginas +message57=Hits +message58=Vers�es +message59=SO +message60=Jan +message61=Fev +message62=Mar +message63=Abr +message64=Mai +message65=Jun +message66=Jul +message67=Ago +message68=Set +message69=Out +message70=Nov +message71=Dez +message72=Navega��o +message73=Tipos de Arquivos +message74=Actualizar +message75=Bytes +message76=Retorna � p�gina inicial +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filtro +message80=Lista completa +message81=Hosts +message82=Conhecido(a)(s) +message83=Rob�s +message84=Dom +message85=Seg +message86=Ter +message87=Qua +message88=Qui +message89=Sex +message90=Sab +message91=Dias da semana +message92=Quem +message93=Quando +message94=Utilizadores autenticados +message95=Min +message96=Med +message97=Max +message98=Compress�o Web +message99=Banda economizada +message100=Antes da compress�o +message101=Depois da compress�o +message102=Total +message103=palavras-chave(s) diferente(s) +message104=P�ginas de entrada +message105=C�digo +message106=Dimens�o m�dia +message107=Liga��es de um NewsGroup +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Sim +message113=N�o +message114=Info. +message115=OK +message116=Sair +message117=Dura��o da visita +message118=Fechar janela +message119=Bytes +message120=Frases de busca +message121=Palavras de busca +message122=Referenciados por diferentss motores de busca +message123=Referenciados por diferentes p�ginas +message124=Outras frases +message125=Outros logins (e/ou utilizadores an�nimos) +message126=Motores de busca referenciadores +message127=P�ginas referenciadoras +message128=Resumo +message129=Valor exacto n�o dispon�vel em vista 'Ano' +message130=Lista de valores +message131=Sender EMail +message132=Receiver EMail +message133=Per�odo considerado +message134=Extra/Marketing +message135=Tamanhos de ecr� +message136=Ataques de Worm/Virus +message137=Adicionar a favoritos (estimado) +message138=Dias do m�s +message139=Diversos +message140=Browsers com suporte Java +message141=Browsers com suporte Macromedia Director +message142=Browsers com suporte Flash +message143=Browsers com suporte para audio Real +message144=Browsers com suporte para audio Quicktime +message145=Browsers com suporte para audio Windows Media +message146=Browsers com suporte para PDF +message147=C�digos de erro SMTP +message148=Pa�ses +message149=Correios +message150=Tamanho +message151=Primeiro +message152=�ltimo +message153=Filtro de exclus�o +message154=C�digos mostrados aqui deram 'hits' ou tr�fego "n�o visto" pelos visitantes, por isso n�o ser�o incluidos em outros gr�ficos. +message155=Cluster +message156=Robots mostrados aqui deram 'hits' ou tr�fego "n�o visto" pelos visitantes, por isso n�o ser�o incluidos em outros gr�ficos. +message157=Valores ap�s + s�o 'hits' directos em ficheiros "robots.txt". +message158=Worms mostrados aqui deram 'hits' ou tr�fego "n�o visto" pelos visitantes, por isso n�o ser�o incluidos em outros gr�ficos. +message159=Tr�fego "n�o visto" � tr�fego gerado por robots, worms ou respostas a c�digos de status HTTP especiais. +message160=Tr�fego visualizado +message161=Tr�fego n�o visualizado +message162=Hist�rico mensal +message163=Worms +message164=Worms diferentes Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ro.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ro.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ro.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,114 @@ +# Romanian message file (Codre Adrian - Florin Radulescu ) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=iso-8859-2 +message0=Necunoscute +message1=Necunoscute (adres� ip nerezolvat�) +message2=Alte +message3=Detalii +message4=Ziua +message5=Luna +message6=Anul +message7=Statistici pentru: +message8=Prima vizit� +message9=Ultima vizit� +message10=Num�rul de vizite +message11=Vizitatori unici +message12=Vizit� +message13=Cuv�nt cheie +message14=C�utare +message15=Procent +message16=Trafic +message17=Domenii/��ri +message18=Vizitatori +message19=Pagini-URL +message20=Ore (Timp server) +message21=Browsere +message22=Erori HTTP +message23=Referiri +message24=C�utare Cuvinte cheie +message25=Domenii vizitatori/��ri +message26=gazde +message27=pagini +message28=pagini diferite +message29=Contor vizualiz�ri +message30=Alte cuvinte +message31=Pagini neg�site +message32=Coduri de eroare HTTP +message33=Versiuni Netscape +message34=Versiuni IE +message35=Ultima actualizare +message36=Conectare de la +message37=Origine +message38=Adres� direct� / Semn de carte +message39=Origine necunoscut� +message40=Leg�tur� de la un motor de c�utare +message41=Legatur� de la o pagin� extern� (alt site cu excep�ia motoarelor de c�utare) +message42=Leg�tur� de la o pagin� intern� (alt� pagin� de pe acela�i site) +message43=Cuvinte c�utate cu motoare de c�utare +message44= +message45=IP nerezolvat +message46=Sistem de operare necunoscut +message47=Pagini cerute dar neg�site (cod eroare HTTP num�rul 404) +message48=Adres� IP +message49=Eroare Acces�ri +message50=Browsere necunoscute +message51=Robo�i +message52=vizite/vizitatori +message53=Robo�i/Motoare de c�utare +message54=Analizator de trafic �n timp real pentru statistici web avansate +message55=din +message56=Pagini +message57=Acces�ri +message58=Versiuni +message59=Sisteme de operare +message60=Ian +message61=Feb +message62=Mar +message63=Apr +message64=Mai +message65=Iun +message66=Iul +message67=Aug +message68=Sep +message69=Oct +message70=Nov +message71=Dec +message72=Navigare +message73=Statistici zilnice +message74=Actualizeaz� acum +message75=Octe�i +message76=�napoi la pagina principal� +message77=Primele +message78=dd mm yyyy - HH:MM +message79=Filtru +message80=Toat� lista +message81=Gazde +message82=Cunoscute +message83=Robo�i +message84=Dum +message85=Lun +message86=Mar +message87=Mie +message88=Joi +message89=Vin +message90=Sam +message91=Zilele s�pt�m�nii +message92=Cine +message93=C�nd +message94=Utilizatori autentificati +message95=Min +message96=Medie +message97=Max +message98=Compresie web +message99=Band� economisit� +message100=Inainte de compresie +message101=Dupa compresie +message102=Total +message103=fraze cheie diferite +message104=Pagin� de intrare +message105=Cod +message106=Trafic mediu +message107=Legaturi de la un grup de News +message108=KB +message109=MB +message110=GB \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ru.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ru.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ru.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,151 @@ +# Russian message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=windows-1251 +message0=���������� +message1=����������� (unresolved ip) +message2=������ +message3=��������� +message4=���� +message5=����� +message6=��� +message7=���������� ��� +message8=������ ��������� +message9=��������� ��������� +message10=���������� ����������� +message11=���������� ����������� +message12=���������� +message13=�������� ����� +message14=����� +message15=������� +message16=������ +message17=������/������ +message18=���������� +message19=��������/URL +message20=����� (�� �������) +message21=�������� +message22=������ HTTP +message23=������� +message24=����� � ����������� +message25=��������� � ������/������ +message26=������ +message27=������� +message28=��������� �������� +message29=������ +message30=������ ����� +message31=�� ��������� �������� +message32=���� ������ HTTP +message33=������ Netscape +message34=������ IE +message35=��������� ���������� +message36=������ �� ���� +message37=������ +message38=����� ������/�������� +message39=������ � ��������� ������ +message40=������ � ���������� ������� +message41=������ � ������� ������� (������ �����, �� ����. �����������) +message42=������ �� ����� (������ �������� �� ���� �������) +message43=�������� �����, ������������ � ����������� +message44=�������� �����, ������������ � ����������� +message45=IP ��� ����� ������ +message46=����������� �� +message47=��������� �� �� ������� (HTTP 404) +message48=IP ����� +message49=��������� ������� +message50=����������� ��������� +message51=������ +message52=������� �� ���������� +message53=������ +message54=���������� ���������� ������� ������ Web-������� � ������ ��������� ������� +message55=�� +message56=������� +message57=�������� +message58=������ +message59=������������ ������� +message60=��� +message61=��� +message62=��� +message63=��� +message64=��� +message65=��� +message66=��� +message67=��� +message68=��� +message69=��� +message70=��� +message71=��� +message72=���������� +message73=���� ������ +message74=�������� +message75=���� +message76=������� � ������� �������� +message77=������ +message78=dd mmm yyyy - HH:MM +message79=������ +message80=���� ������ +message81=����� +message82=��������� +message83=������ +message84=�� +message85=�� +message86=�� +message87=�� +message88=�� +message89=�� +message90=�� +message91=��� ������ +message92=��� +message93=����� +message94=������������� ���������� +message95=���������� +message96=������� +message97=����������� +message98=������ +message99=����������� ����� +message100=����� ����������� +message101=����� ��������� +message102=���� +message103=��������� �������� ����� +message104=����������� ������ +message105=����� +message106=������� ������ +message107=������ �� News Group +message108=KB +message109=MB +message110=GB +message111=���������� +message112=�� +message113=��� +message114=WhoIs ���� +message115=OK +message116=����������� ��������� +message117=����������������� ������� +message118=������� ���� +message119=���� +message120=��������� ����� +message121=��������� ����� +message122=��������� ���������� +message123=��������� ����������� ����� +message124=������ ����� +message125=��������� ������������ +message126=����������� ���������� +message127=����������� ����� +message128=������� ������� +message129=������ �������� � ������� "���" ���������� +message130=������� �������� ������ +message131=����� ����������� +message132=����� ���������� +message133=�������� ������ +message134=�������������/��������� +message135=���������� ������ +message136=�������� ����� +message137=�������� � �������� +message138=�� ���� ������ +message139=������ +message140=�������� � ���������� Java +message141=�������� � ���������� Macromedia Director +message142=�������� � ���������� Flash +message143=�������� � ���������� RealAudio +message144=�������� � ���������� QuickTime +message145=�������� � ���������� Windows Media +message146=�������� � ���������� PDF +message147=���� ������ SMTP Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-se.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-se.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-se.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,170 @@ +# Swedish message file +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Okänd +message1=Okända (ip-adress ej uppslagen) +message2=Övriga +message3=Visa detaljer +message4=Dag +message5=Månad +message6=År +message7=Statistik för +message8=Första besök +message9=Senaste besök +message10=Antal besök +message11=Unika besökare +message12=Besök +message13=Nyckelord +message14=Sök +message15=Procent +message16=Trafik +message17=Domäner/Länder +message18=Besökare +message19=Sidor/URL +message20=Tidpunkt (Servertid) +message21=Webbläsare +message22=HTTP-fel +message23=Refererande sidor +message24=Söktermer +message25=Besökandes domäner/länder +message26=hosts +message27=sidor +message28=olika sidor +message29=Besökta sidor +message30=Övriga ord +message31=Sidan hittades inte +message32=HTTP-felmeddelanden +message33=Netscape-versioner +message34=IE-versioner +message35=Senaste uppdatering +message36=Besökarna nådde siten genom +message37=Ursprung +message38=Direkt adress / Bokmärken +message39=Okänt ursprung +message40=Länkar från sökmotorer +message41=Länkar från externa sidor (andra webbsidor med undantag för sökmotorer) +message42=Länkar från interna sidor (annan sida på samma sajt) +message43=Nyckelord som använts på sökmotorer +message44= +message45=Ip-adress ej uppslagen +message46=Okänt OS (Referer-fält) +message47=Efterfrågade men ej funna URL:er (HTTP fel 404) +message48=IP-adress +message49=Fel träffar +message50=Okända webbläsare (Referer-fält) +message51=Besökande webbrobotar/spindlar +message52=besök/besökare +message53=Besökande webbrobotar/spindlar +message54=Gratis loggfilsanalysator för avancerad realtids webbstatistik +message55=av +message56=Sidor +message57=Träffar +message58=Versioner +message59=Operativsystem +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Maj +message65=Jun +message66=Jul +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Dec +message72=Navigation +message73=Filtyper +message74=Uppdatera nu +message75=Byte +message76=Tillbaka till förstasidan +message77=Topp +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Fullständig lista +message81=Besökare +message82=Kända +message83=Robotar +message84=Sön +message85=Mån +message86=Tis +message87=Ons +message88=Tor +message89=Fre +message90=Lör +message91=Veckodagar +message92=Vem +message93=När +message94=Verifierade användare +message95=Min +message96=Medel +message97=Max +message98=Webkomprimering +message99=Sparad bandbredd +message100=Före komprimering +message101=Efter komprimering +message102=Totalt +message103=olika söksträngar +message104=Entrésidor +message105=Kod +message106=Medelstorlek +message107=Länkar från en NewsGroup +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Ja +message113=Nej +message114=WhoIs information +message115=OK +message116=Avslut +message117=Besökets Längd +message118=Stäng Fönster +message119=Bytes +message120=Söknyckelfraser +message121=Söknyckelord +message122=olika refererande sökmotorer +message123=olika refererande siter +message124=Andra fraser +message125=Andra logins (och/eller anonyma användare) +message126=Refererande sökmotorer +message127=Refererande siter +message128=Summering +message129=Exakt värde inte tillgängligt i 'År' vy +message130=Datavärde vektor +message131=Avsändare Epost +message132=Mottagare Epost +message133=Rapporterad period +message134=Extra/Marknadsföring +message135=Skärmstorlekar +message136=Maskar/Virus attacker +message137=Lägg till i Favoriter (estimerat) +message138=Dag i månad +message139=Diverse +message140=Webbläsare med Java stöd +message141=Webbläsare med Macromedia Director stöd +message142=Webbläsare med Flash stöd +message143=Webbläsare som kan spela upp Real audio +message144=Webbläsare som kan spela upp Quicktime audio +message145=Webbläsare som kan spela upp Windows Media audio +message146=Webbläsare med PDF stöd +message147=SMTP Felkoder +message148=Länder +message149=E-post meddelanden +message150=Storlek +message151=Första +message152=Sista +message153=Exclude filter +message154=Koder som visas i detta diagram resulterade i trafik som "ej uppvisats" f�r besökare och särredovisas därför i detta diagram. +message155=Kluster +message156=Robotar visade här gav träffar eller trafik "ej uppvisad" för besökare, så de är inte inkluderade i andra diagram. +message157=Siffror efter + är antalet lyckade träffar på "robots.txt"-filer. +message158=Maskar visade här gav träffar "ej uppvisade" för besökare, så de är inte inkluderade i andra diagram. +message159=Ej uppvisad trafik inkluderar trafik genererad av robotar, maskar och svar med HTTP-felkoder. +message160=Uppvisad trafik +message161=Ej uppvisad trafik +message162=Månadshistorik +message163=Maskar +message164=olika maskar +message165=Lyckat skickade mail +message166=Felaktiga/avvisade mail +message167=K�nsliga m�ltavlor Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-si.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-si.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-si.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,171 @@ +# Slovenian message file (lado@prim-nov.si) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=windows-1250 +message0=Neznanih +message1=Neznanih (nepoznan IP) +message2=Drugi +message3=Glej detajle +message4=Dan +message5=Mesec +message6=Leto +message7=Statistike za +message8=Prvi obisk +message9=Zadnji obisk +message10=�t. obiskov +message11=Razli�nih obiskovalcev +message12=Obisk +message13=razli�nih keywords +message14=Iskanje +message15=procentov +message16=Promet +message17=Domene/Dr�ave +message18=Obiskovalcev +message19=Strani-URL +message20=Promet po urah dneva +message21=Browserji +message22= +message23=Refererji +message24=Nikoli osve�en (Glej 'Build/Update' na awstats_setup.html strani) +message25=Obiskovalcev iz domene/dr�ave +message26=obiskovalcev +message27=Strani +message28=razli�nih strani-urljev +message29=Obiskane strani +message30=Druge besede +message31=Strani, ki niso bile najdene +message32=HTTP statusne kode +message33=Netscape verzij +message34=IE verzij +message35=Zadnja osve�itev +message36=Connect to site from +message37=Izvor +message38=Direct naslovi / zaznambe +message39=Neznan izvor +message40=Povezave z Internet iskalnikov +message41=Povezave z zunanjih strani (z drugih portalov, razen iskalnikov) +message42=Povezave z internih strani +message43=Iskalne fraze uporabljene na iskalnikih +message44=Iskalni termini uporabljeni na iskalnikih +message45=Nepoznani IP naslovi +message46=Nepoznan OS (polje useragent) +message47=Potrebni URLji, ki niso najdeni (HTTP koda 404) +message48=IP Naslov +message49=Napaka Zadetkov +message50=Neznani browserji (polje useragent) +message51=razli�ni roboti +message52=obiskov/obiskovalca +message53=Robotov/spiderjev +message54=Brezpla�en realtime logfile analizator za web statistike +message55=od +message56=strani +message57=Zadetkov +message58=Po verzijah +message59=Operacijski sistemi +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Maj +message65=Jun +message66=Jul +message67=Avg +message68=Sep +message69=Okt +message70=Nov +message71=Dec +message72=Navigacija +message73=Tip datoteke +message74=Osve�i zdaj +message75=Promet +message76=Nazaj na glavno stran +message77=Top +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=Cela lista +message81=Obiskovalcev +message82=Znanih +message83=Robotov +message84=Ned +message85=Pon +message86=Tor +message87=Sre +message88=�et +message89=Pet +message90=Sob +message91=Promet po dnevih v tednu +message92=Kdo +message93=�asovni pregled +message94=Prijavljenih uporabnikov +message95=Min +message96=Povpre�no +message97=Max +message98=Web compression +message99=Bandwidth saved +message100=Compression on +message101=Compression result +message102=Skupaj +message103=razli�nih fraz +message104=Vpis +message105=Koda +message106=Povpre�na velikost +message107=Povezav iz NewsGroup +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=Da +message113=Ne +message114=Info. +message115=OK +message116=Izhod +message117=Trajanje obiskov +message118=Zapri okno +message119=Bytov +message120=Iskalne fraze +message121=Iskalni termini +message122=razli�nih iskalnikov +message123=razli�nih web strani +message124=Druge fraze +message125=Druge prijave (in/ali anonimni uporabniki) +message126=Iskalniki +message127=Portali +message128=Zbirno poro�ilo +message129=Natan�na vrednost v pogledu 'Leto' ni na voljo +message130=Data value arrays +message131=EMail po�iljatelja +message132=EMail prejemnika +message133=Obobje poro�ila +message134=Ekstra/Marketing +message135=Velikosti ekranov +message136=Worm/Virus napadi +message137=Add to favorites (pribli�no) +message138=Promet po dnevih v mesecu +message139=Razno +message140=Browserji s podporo Javi +message141=Browserji s podporo Macromedia Directorju +message142=Browserji s podporo Flashu +message143=Browserji s podporo predvajanju Real audija +message144=Browserji s podporo igranju Quicktime audija +message145=Browserji s podporo igranju Windows Media audija +message146=Browserji z podporo PDFjem +message147=SMTP Error kode +message148=Dr�ave +message149=Sporo�il +message150=Velikost +message151=Prvi +message152=Zadnji +message153=Filter za izlo�anje +message154=Tu prikazane kode generirajo promet, ko ga obiskovalci ne vidijo, za to ta promet ni vklju�en v drugih pregledih. +message155=Cluster +message156=Tu prikazani roboti generirajo promet, ki ga obiskovalci ne vidijo, zato ta promet ni vklju�en v drugih pregledih. +message157=�tevilke po + so uspe�ni zadetki "robots.txt" datotek. +message158=Tu prikazani wormi generirajo promet, ki ga obiskovalci ne vidijo, zato ta promet ni vklju�en v drugih pregledih. +message159=Promet brez ogledov predstavlja promet generiran z roboti, wormi, ali odgovori z HTTP statustnimi kodami. +message160=Promet z ogledi +message161=Promet brez ogledov +message162=Promet po mesecih +message163=Wormi +message164=razli�nih wormov +message165=Uspe�no poslanih sporo�il +message166=Neuspe�no poslana/zavrnjena sporo�ila +message167=Ob�utljive tar�e Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-sk.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-sk.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-sk.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,151 @@ +# Slovak message file (lecram@lecram.sk) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=windows-1250 +message0=Nezn�my +message1=Nezn�my (neprelo�en� IP) +message2=Ostatn� +message3=Prehliadnu� detaily +message4=De� +message5=Mesiac +message6=Rok +message7=�tatistika pre +message8=Prv� n�v�teva +message9=Posledn� n�v�teva +message10=Po�et n�v�tev +message11=Unik�tne n�v�tevy +message12=N�v�teva +message13=V�razy +message14=Hlad�nie +message15=Percenta +message16=Traffic +message17=Dom�ny/krajina +message18=N�v�tevy +message19=Str�nky/URL +message20=Hodiny +message21=Browsery (prehliada�e) +message22=HTTP Chyby +message23=Referencie +message24=H�adan� v�razy +message25=N�v�tevy dom�ny/krajiny +message26=hosts +message27=str�nok +message28=r�zne str�nky +message29=Pr�stup +message30=In� slov� +message31=Nen�jden� str�nky +message32=Chybov� k�dy HTTP +message33=Verzie Netscape +message34=Verzie MS Internet Explorer +message35=Posledn� aktualiz�cia +message36=Konekcia z +message37=P�vod +message38=Piama adresa / Obl�ben� (Bookmark) +message39=Nezn�m� p�vod +message40=Odkaz z Internetov�ho vyhlad�va�a +message41=Odkaz z inej str�nky (ine str�nky ako vyhlad�va�e) +message42=Odkaz z vlastnej str�nky (in� str�nka na servery) +message43=V�razy pou�it� vo vyhlad�va�i +message44=Vyhlad�van� slov� +message45=Neprelo�en� IP adresa +message46=Nezn�m� OS (polo�ka Referer) +message47=Po�adovan�, ale nen�jden� URL (HTTP 404) +message48=IP Addresa +message49=Chyba Dotazov +message50=nezn�m� browser (prehliada�) (polo�ka Referer) +message51=N�v�tevnos� robotov +message52=n�v�tev/n�v�tevn�ka +message53=Roboti +message54=Volne �iriteln� n�stroj pre anal�zu web �tatist�k +message55=z +message56=Str�nok +message57=Hity +message58=Verzia +message59=OS +message60=Jan +message61=Feb +message62=Mar +message63=Apr +message64=Maj +message65=Jun +message66=Jul +message67=Aug +message68=Sep +message69=Okt +message70=Nov +message71=Dec +message72=Navig�cia +message73=Typy s�borov +message74=Aktualizova� +message75=Bajtov +message76=Sp� na hlavn� str�nku +message77=Hore +message78=dd mmm yyyy - HH:MM +message79=Filter +message80=�plny v�pis +message81=Hosts +message82=Zn�me +message83=Roboti +message84=Ned +message85=Pon +message86=Uto +message87=Str +message88=�tv +message89=Pia +message90=Sob +message91=Dni v ty�dni +message92=Kto +message93=Kedy +message94=Prihl�sen� u�ivatelia +message95=Min +message96=Priemer +message97=Max +message98=Web kompresia +message99=�sporen� ��rka p�sma +message100=Pred kompresiou +message101=Po kompresii +message102=Celkom +message103=different keyphrases +message104=Vsupn� str�nky +message105=K�d +message106=Priemern� velkos� +message107=Linky z NewsGroup +message108=KB +message109=MB +message110=GB +message111=Zachycova� +message112=�no +message113=Nie +message114=WhoIs inform�cie +message115=OK +message116=Exit str�nky +message117=Trvanie n�v�tevy +message118=Zavrie� okno +message119=Bytov +message120=H�adaj Kl��ov� fr�zy +message121=H�adaj Kl��ov� slov� +message122=odkazy z r�znych vyhlad�va�ov +message123=odkazy z r�znych str�nok +message124=In� fr�zy +message125=Anonymn� u��vatel +message126=Odkazy z vyh�ad�va�ov +message127=Odkazy zo str�nok +message128=S�hrn +message129=V zobrazen� 'Rok' nie je dostupn� presn� hodnota +message130=Data value arrays +message131=E-mail odosielatela +message132=E-mail prijemcu +message133=Zobrazen� �asov� �sek +message134=Extra/Marketing +message135=Ve�kosti obrazovky +message136=Worm/Virus napadnutia +message137=Prida� do ob��ben�ch +message138=Dni v mesiaci +message139=R�zne +message140=Prehliada�e s Java podporou +message141=Prehliada�e s Macromedia Director podporou +message142=Prehliada�e s Flash podporou +message143=Prehliada�e s Real audio playing podporou +message144=Prehliada�e s Quictime audio playing podporou +message145=Prehliada�e s Windows Media audio playing podporou +message146=Prehliada�e s PDF podporou +message147=SMTP Error k�dy \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-sr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-sr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-sr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,168 @@ +# Serbian message file (Tomislav Loncar, tomo@inecco.net; Bojan Suzic, bojans@teol.net; Mihailo Stefanović, mst@mikis.org) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=utf-8 +message0=Непознато +message1=непознатих (IP адреса није разрешена) +message2=Остало +message3=Види детаље +message4=Дан +message5=Мeсец +message6=Година +message7=Статистике за +message8=Прва посета +message9=Последња посета +message10=Број посета +message11=Јединствених посетилаца +message12=посета +message13=кључних речи +message14=Претрага +message15=Проценат +message16=Саобраћај +message17=Домени/земље +message18=посетилаца +message19=Странице/URL +message20=Часова (серверско време) +message21=Прегледници +message22=HTTP грешке +message23=Везе +message24=Није ажурирано +message25=Домени/земље посетилаца +message26=рачунара +message27=страница +message28=различитих страница +message29=Приступ +message30=Остале речи +message31=Непронађене странице +message32=HTTP кодови грешака +message33=Верзије Netscape-a +message34=Верзије IE-a +message35=Ажурирано +message36=Спољне везе: +message37=Како је корисник дошао +message38=Директан приступ +message39=Непознато порeкло +message40=Везе са интернет претраживача +message41=Везе са спољних страница (осим интернет претраживача) +message42=Везе са властитих страница (остале странице унутар вашег сајта) +message43=Фраза коришћених на претраживачима +message44=Кључне речи коришћене на претраживачима +message45=Неразрешена IP адреса +message46=Непознат оперативни систем +message47=Захтевана локација није пронађена (HTTP грешка 404) +message48=IP адреса +message49=Погодака са грешкама +message50=Непознат интернет прегледник +message51=робота посетилаца +message52=Посета по посетиоцу +message53=Посетиоци роботи +message54=Бесплатни анализатор посета за напредне веб статистике +message55=од +message56=Страница +message57=Погодака +message58=Верзије +message59=Оперативни систем +message60=Јан +message61=Феб +message62=Мар +message63=Апр +message64=Мај +message65=Јун +message66=Јул +message67=Авг +message68=Сеп +message69=Окт +message70=Нов +message71=Дец +message72=Навигација +message73=Врсте датотека +message74=Ажурирај сада +message75=Проток +message76=Назад на главну страну +message77=првих +message78=dd mmm yyyy - HH:MM +message79=Филтер +message80=Пуна листа +message81=Рачунари +message82=познатих +message83=Роботи +message84=Нед +message85=Пон +message86=Уто +message87=Сре +message88=Чет +message89=Пет +message90=Суб +message91=Дани у недељи +message92=Ко +message93=Када +message94=Пријављени корисници +message95=Минимално +message96=просечно +message97=Максимално +message98=Веб компресија +message99=Уштеда саобраћаја +message100=Пре компресије +message101=Након компресије +message102=Укупно +message103=различитих кључних фраза +message104=Улазне странице +message105=Код +message106=Просечна величина +message107=Везе са дискусионих група +message108=KB +message109=MB +message110=GB +message111=Масовно преузимање страна (grabber) +message112=Да +message113=Не +message114=WhoIs информације +message115=У реду +message116=Излаз +message117=Трајање посета +message118=Затвори прозор +message119=Бајтова +message120=Фразе за претрагу +message121=Кључне речи за претрагу +message122=различитих претраживача са везом +message123=различитих сајтова са везом +message124=Остале фразе +message125=Остале пријаве (и/или анонимни корисници) +message126=Претраживачи са везама +message127=Сајтови са везама +message128=Преглед +message129=Тачна вредност није доступна у годишњем прегледу +message130=Вредности поља +message131=Е-пошта пошиљаоца +message132=Е-пошта примаоца +message133=Период обухваћен извештајем +message134=Додатно/маркетинг +message135=Величине екрана +message136=Напади црва/вируса +message137=Додавања у омиљене локације (оквирно) +message138=Дани у месецу +message139=Разно +message140=Прегледници са Java подршком +message141=Прегледници са Macromedia Director подршком +message142=Прегледници са Flash подршком +message143=Прегледници са Real audio подршком +message144=Прегледници са Quicktime audio подршком +message145=Прегледници са Windows Media audio подршком +message146=Прегледници са PDF подршком +message147=SMTP кодови грешака +message148=Земље +message149=Порука +message150=Величина +message151=Први +message152=Последњи +message153=Exclude filter +message154=Овде приказани кодови су направили посете или саобраћај који корисници нису видели, па зато нису укључени у остале извештаје. +message155=Кластер +message156=Овде приказани роботи су направили посете или саобраћај који корисници нису видели, па зато нису укључени у остале извештаје. +message157=Бројеви приказани иза + су успешни погодци на "robots.txt" датотеке. +message158=Овде приказани црви су направили посете или саобраћај који корисници нису видели, па зато нису укључени у остале извештаје. +message159=Неприказан саобраћај је саобраћај који су направили роботи, црви, или одговори са специјалним HTTP статус кодовима. +message160=Приказаног саобраћаја +message161=Неприказаног саобраћаја +message162=Месечне статистике +message163=Црви +message164=различитих црва Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-th.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-th.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-th.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,172 @@ +# Thai message file (kamthorn@users.sourceforge.net) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=utf-8 +message0=ไม่ทราบ +message1=ไม่ทราบ (ไอพีไม่สามารถค้นกลับได้) +message2=อื่นๆ +message3=แสดงรายละเอียด +message4=วัน +message5=เดือน +message6=ปี +message7=สถิติสำหรับ +message8=เยี่ยมชมครั้งแรก +message9=เยี่ยมชมล่าสุด +message10=จำนวนการเยี่ยมชม +message11=ผู้เยี่ยมชม (ไม่ซ้ำ IP) +message12=การเยี่ยมชม +message13=คำสำคัญที่แตกต่างกัน +message14=ค้นหา +message15=ร้อยละ +message16=ปริมาณข้อมูล +message17=โดเมน/ประเทศ +message18=ผู้เยี่ยมชม +message19=หน้า-URL +message20=แยกตามชั่วโมง +message21=บราวเซอร์ +message22= +message23=ผู้อ้างอิง +message24=ยังไม่เคยถูกปรับปรุง (ดู 'Build/Update' ในหน้าเว็บ awstats_setup.html) +message25=โดเมน/ประเทศ ของผู้เยี่ยมชม +message26=โฮสต์ +message27=หน้าเว็บ +message28=หน้า-url ที่แตกต่างกัน +message29=เข้าชม +message30=คำอื่นๆ +message31=หน้าที่ไม่พบ +message32=รหัสสถานะ HTTP +message33=รุ่นของเน็ตสเคป +message34=รุ่นของ IE +message35=ปรับปรุงล่าสุด +message36=เชื่อมต่อมายังไซต์นี้ จาก +message37=ต้นทาง +message38=เข้ามาโดยตรง / บุ๊คมาร์ค +message39=ไม่ทราบที่มา +message40=ลิงก์มาจากเสิร์ชเอนจิ้นบนอินเทอร์เน็ต +message41=ลิงก์มาจากหน้าเว็บภายนอก (เว็บอื่นๆ ที่ไม่ใช่เสิร์ชเอนจิ้น) +message42=ลิงก์มาจากหน้าเว็บภายใน (หน้าอื่นๆ บนไซต์เดียวกัน) +message43=ประโยคสำคัญที่ใช้บนเสิร์ชเอนจิ้น +message44=คำสำคัญที่ใช้บนเสิร์ชเอนจิ้น +message45=ที่อยู่ไอพีที่ค้นกลับไม่ได้ +message46=โอเอสที่ไม่รู้จัก (useragent field) +message47=URL ที่ถูกเรียกใช้แต่ไม่มี (รหัส HTTP 404) +message48=ที่อยู่ IP +message49=จำนวนครั้งที่ผิดพลาด +message50=บราวเซอร์ที่ไม่รู้จัก (useragent field) +message51=โรบ็อตที่แตกต่างกัน +message52=จำนวนการเข้าชม/ผู้เยี่ยมชม +message53=จำนวนผู้เยี่ยมชมที่เป็น โรบ็อต/สไปเดอร์ +message54=ตัววิเคราะห์แฟ้มปูมบันทึกตามเวลาจริงฟรี สำหรับสถิติเว็บขั้นสูง +message55=ของ +message56=หน้า +message57=ครั้ง +message58=รุ่น +message59=ระบบปฏิบัติการ +message60=ม.ค. +message61=ก.พ. +message62=มี.ค. +message63=เม.ย. +message64=พ.ค. +message65=มิ.ย. +message66=ก.ค. +message67=ส.ค. +message68=ก.ย. +message69=ต.ค. +message70=พ.ย. +message71=ธ.ค. +message72=การเข้าเยี่ยมชม +message73=ชนิดแฟ้ม +message74=ปรับปรุงเดี๋ยวนี้ +message75=แบนด์วิดธ์ +message76=กลับสู่หน้าหลัก +message77=สูงสุด +message78=dd mmm yyyy - HH:MM +message79=ตัวกรอง +message80=ทุกรายการ +message81=แยกตามโฮสต์ +message82=รู้จัก +message83=โรบ็อต +message84=อา. +message85=จ. +message86=อ. +message87=พ. +message88=พฤ. +message89=ศ. +message90=ส. +message91=แยกตามวันในสัปดาห์ +message92=เป็นใคร +message93=เมื่อไหร่ +message94=ผู้ใช้ที่ได้รับสิทธิอนุญาต +message95=น้อยที่สุด +message96=เฉลี่ย +message97=สูงที่สุด +message98=การบีบอัดเว็บ +message99=ประหยัดแบนด์วิดธ์ได้ +message100=เปิดใช้การบีบอัด +message101=ผลลัพธ์การบีบอัด +message102=ทั้งหมด +message103=ประโยคสำคัญที่แตกต่างกัน +message104=เข้า +message105=รหัส +message106=ขนาดเฉลี่ย +message107=ลิงก์จากกลุ่มข่าว +message108=KB +message109=MB +message110=GB +message111=Grabber +message112=ใช่ +message113=ไม่ใช่ +message114=Info. +message115=ตกลง +message116=ออก +message117=ระยะเวลาที่เยี่ยมชม +message118=ปิดกรอบนี้ +message119=ไบต์ +message120=ประโยคค้นหา +message121=คำค้นหา +message122=เสิร์ชเอนจิ้นที่อ้างอิงมาที่แตกต่างกัน +message123=ไซต์ที่อ้างอิงมาที่แตกต่างกัน +message124=ประโยคอื่น +message125=ผู้เข้าใช้อื่น (และ/หรือผู้ใช้ที่ไม่ออกนาม) +message126=เสิร์ชเอนจิ้นที่อ้างอิงมา +message127=ไซต์ที่อ้างอิงมา +message128=โดยสรุป +message129=ค่าเจาะจงที่ไม่อยู่ในมุมมองแบบ 'ปี' +message130=อาเรย์ของค่าข้อมูล +message131=ผู้ส่งอีเมล +message132=ผู้รับอีเมล +message133=ช่วงที่รายงาน +message134=พิเศษ/เพื่อการค้า +message135=ขนาดจอภาพ +message136=การโจมตีโดยหนอนหรือไวรัส +message137=Add to favorites (estimated) +message138=แยกตามวันที่ +message139=Miscellaneous +message140=บราวเซอร์ที่สนับสนุนจาวา +message141=บราวเซอร์ที่สนับสนุนแมโครมีเดียไดเรกเตอร์ +message142=บราวเซอร์ที่สนับสนุนแฟลช +message143=บราวเซอร์ที่สนับสนุนตัวเล่นเรียลออดิโอ +message144=บราวเซอร์ที่สนับสนุนตัวเล่นควิกไทม์ออดิโอ +message145=บราวเซอร์ที่สนับสนุนตัวเล่นวินโดวส์มีเดียออดิโอ +message146=บราวเซอร์ที่สนับสนุน PDF +message147=รหัสข้อผิดพลาด SMTP +message148=แยกตามประเทศ +message149=เมล +message150=ขนาด +message151=แรกสุด +message152=หลังสุด +message153=ตัวกรองออก +message154=รหัสที่แสดงนี้ให้ค่าจำนวนครั้งและปริมาณข้อมูลในกลุ่ม "ไม่แสดง" โดยผู้เยี่ยมชม ดังนั้นค่าเหล่านี้จะไม่ถูกนำไปรวมในชาร์ตอื่นอีก +message155=คลัสเตอร์ +message156=โรบ็อตที่แสดงนี้ให้ค่าจำนวนครั้งและปริมาณข้อมูลในกลุ่ม "ไม่แสดง" โดยผู้เยี่ยมชม ดังนั้นค่าเหล่านี้จะไม่ถูกนำไปรวมในชาร์ตอื่นอีก +message157=จำนวนที่อยู่หลัง + คือจำนวนครั้งที่อ่านไฟล์ "robots.txt" สำเร็จ +message158=หนอนที่แสดงนี้ให้ค่าจำนวนครั้งและปริมาณข้อมูลในกลุ่ม "ไม่แสดง" โดยผู้เข้าเยี่ยมชม ดังนั้นค่าเหล่านี้จะไม่ถูกนำไปรวมกับชาร์ตอื่นอีก +message159=ปริมาณของข้อมูลที่ไม่ถูกแสดง ประกอบด้วยปริมาณข้อมูลที่ถูกสร้างโดยโรบ็อต หนอน หรือการตอบกลับด้วยรหัสสถานะพิเศษของ HTTP +message160=ปริมาณของข้อมูลที่ถูกแสดง +message161=ปริมาณของข้อมูลที่ไม่ถูกแสดง +message162=ประวัติรายเดือน +message163=จำนวนหนอน +message164=หนอนที่แตกต่างกัน +message165=เมลที่ส่งได้สำเร็จ +message166=เมลที่ล้มเหลวหรือถูกปฏิเสธ +message167=Sensitive targets +message168=ปิดการใช้งาน JavaScript Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-tr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-tr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-tr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,113 @@ +# Turkish message file by giray@pultar.org +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +message0=Bilinmeyen +message1=Bilinmeyen (��z�lemeyen ip) +message2=Di�erleri +message3=Detaylar� G�r +message4=G�n +message5=Ay +message6=Y�l: +message7=Site +message8=�lk ziyaret +message9=Son ziyaret +message10=Ziyaret�i say�s� +message11=Ayr� Ziyaret�i +message12=Ziyaret +message13=Anahtar S�zc�k +message14=Arama +message15=Y�zde +message16=Trafik +message17=Alan Adlar�/�lkeler +message18=Ziyaret�iler +message19=Sayfalar-URL +message20=Ziyaret Saatleri (Sunucu saati) +message21=Taray�c�lar +message22=HTTP Hatalar� +message23=Y�nlendirenler +message24=Aramada kullan�lan Anahtar S�zc�kler +message25=Ziyaret�ilerin alan adlar�/�lkeleri +message26=) bilgisayar +message27=) sayfa +message28=farkl� sayfalar +message29=Eri�im +message30=Di�er kelimeler +message31=Bulunamayan Sayfalar +message32=HTTP Hata kodlar� +message33=Netscape s�r�mleri +message34=IE s�r�mleri +message35=Son �statistik G�ncellemesi +message36=Siteye ba�lant� yapanlar +message37=K�ken +message38=Do�rudan adres / Yer imi +message39=K�keni bilinmeyen +message40=�nternet arama motorundan ba�lant� +message41=D�� sayfalardan ba�lant�lar (arama motorlar� hari� di�er veb siteleri) +message42=��ten sayfalar (ayn� sitede bulunan ba�ka sayfalardan ba�lant�lar) +message43=) kullan�lan anahtar s�zc�kler (arama motorlar�nda) +message44= +message45=��z�lemeyen IP Adresleri +message46=Bilinmeyen ��letim SistemiS (Y�nlendiren alan�nda) +message47=Gereken fakat bulunmayan URLler (HTTP kodu 404) +message48=IP Adresi +message49=Hata Hit say�s� +message50=Bilimeney Taray�c�lar (Y�nlendiren alan�nda) +message51=Ziyaret eden robotlar +message52=ziyaret say�s�/ziyaret�i say�s� +message53=Robot/�r�mcek ziyaretleri +message54=Geli�mi� veb i�tatistikleri i�in �zg�r, ger�ek zamanl� k�t�k analizi program� +message55=( toplam +message56=Sayfa +message57=Hit +message58=S�r�mler +message59=��letim Sistemleri +message60=Oca +message61=�ub +message62=Mar +message63=Nis +message64=May +message65=Haz +message66=Tem +message67=Agu +message68=Eyl +message69=Eki +message70=Kas +message71=Ara +message72=Gezinim +message73=G�nl�k istatistikler +message74=�imdi g�ncelle +message75=Bayt +message76=Ana sayfaya d�n +message77=En s�k kullan�lan +message78=dd mmm yyyy - HH:MM +message79=S�zge� +message80=T�m liste +message81=Hosts +message82=Known +message83=Robots +message84=Sun +message85=Mon +message86=Tue +message87=Wed +message88=Thu +message89=Fri +message90=Sat +message91=Days of week +message92=Who +message93=When +message94=Authenticated users +message95=Min +message96=Average +message97=Max +message98=Web compression +message99=bandwidth saved +message100=Before compression +message101=After compression +message102=Total +message103=different keyphrases +message104=Entry pages +message105=Code +message106=Average size +message107=Links from a NewsGroup +message108=KB +message109=MB +message110=GB Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-tw.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-tw.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-tw.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,189 @@ +# Chinese (traditionnal) message file +# (by Geoffrey Hoo geoffrey.hoo@NOSPAMmyrealbox.com, remove "NOSPAM" to contact) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=big5 +message0=�L�k�o�� +message1=�L�k�o�� (����ϸѺ���W��) +message2=��L +message3=�˵��ԲӸ�� +message4=�P�� +message5=��� +message6=�~��: +message7=�έp���� +message8=�������[��� +message9=�̪���[��� +message10=���[���� +message11=���[�� +message12=���[���� +message13=������r�� +message14=�j�M +message15=�ʤ��� +message16=�y�q�έp +message17=����ΰ�a +message18=���X�� +message19=������ URL ���} +message20=�C�p�� +message21=�s���� +message22=HTTP ���~ +message23=�ѦҸ�T +message24=�q����s +message25=���[�̪�����ΰ�a +message26=�D�� +message27=������ +message28=�Ӥ��P������ +message29=�s������ +message30=���P���r�� +message31=�䤣�쪺���� +#message32=HTTP ���~�X +message32=HTTP ���A�X +message33=Netscape ���� +message34=IE ���� +message35=�̪��s +message36=�s����������k +message37=�ӷ����} +message38=���}�Ѱ��[�̦ۦ��J�A�αq���Ҩ��X +message39=�L�k�o���s������k +message40=�q�j�M�����s�� +message41=�q�������~����L (�ëD�O�j�M������) �����s�� +message42=�q�����������s�� +message43=�����j�M������r�y +message44=�����j�M������r�� +message45=�L�k�ϸ�Ķ��IP��} +message46=�L�k�o�����@�~�t�� +message47=�䤣�쪺���}�s�� (HTTP ���~�X 404) +message48=IP ��} +message49=���~���� +message50=�L�k�o�����s���� +message51=�Ӻ��C�� +message52=���[����/���[�� +message53=�j�M�������������C�� +message54=�����������R�t�� +message55=�ө� +message56=������ +#message57=�ɮ׼� +message57=�I���� +message58=���� +message59=�@�~�t�� +#message60=�@�� +#message61=�G�� +#message62=�T�� +#message63=�|�� +#message64=���� +#message65=���� +#message66=�C�� +#message67=�K�� +#message68=�E�� +#message69=�Q�� +#message70=�Q�@�� +#message71=�Q�G�� +message60=1�� +message61=2�� +message62=3�� +message63=4�� +message64=5�� +message65=6�� +message66=7�� +message67=8�� +message68=9�� +message69=10�� +message70=11�� +message71=12�� +message72=�s�����έp +message73=�ɮ����O +message74=�ߧY��s +message75=�줸�� +message76=�^��D�� +message77=�e +message78=yyyy�~ mmm dd�� HH:MM +#message79=�L�o +message79=�]�t +message80=�����C�X +message81=�D�� +message82=�Ӹ�Ķ���\ +message83=�j�M�������� +message84=�� +message85=�@ +message86=�G +message87=�T +message88=�| +message89=�� +message90=�� +message91=�P���X +message92=�����[�� +message93=�����[�ɶ� +message94=ų�O�X���ϥΪ� +message95=�̤p +message96=������ +message97=�̤j +message98=�������Y +message99=�`�٤F���W�e +message100=���Y�e +message101=���Y�� +message102=�`�� +message103=�Ӥ��P������r�y +message104=�J���B +message105=�s�X +message106=�����j�p +message107=�q�s�D�s�ճs�� +#message108=K�Ӧ줸�� +#message109=M�Ӧ줸�� +#message110=G�Ӧ줸�� +message108=KB +message109=MB +message110=GB +message111=��������� +message112=�O +message113=�_ +message114=WhoIs ��T +message115=OK +message116=�X���B +message117=�C�����[�Ҫ�ɶ� +message118=���������� +#message119=�Ӧ줸�� +message119=Bytes +message120=�ΥH�j�M������r�y +message121=�ΥH�j�M������r�� +message122=�Ӥ��P���j�M�����श���[�̨�o�� +message123=�Ӥ��P����L�����श���[�̨�o�� +message124=��L�r�y +message125=��L�n�� (�]�t�ΦW�n��) +message126=�Ѩ��Ƿj�M�����श +message127=�Ѩ��Ǩ�L�����श +message128=���n +message129=�@���~�έp�ɡA�L�k�ǽT�o�����[�̪��ƥ� +message130=Data value arrays +message131=�o�H�H�l�} +message132=���H�H�l�} +message133=������ +message134=�B�~ / ������ +message135=�ù��j�p +message136=į��/�f�r ���� +message137=�[�J�ڪ��̷R (���p) +message138=�C�� +message139=���� +message140=�s������� Java +message141=�s������� Macromedia Director +message142=�s������� Flash +message143=�s������� Real audio playing +message144=�s������� Quicktime audio playing +message145=�s������� Windows Media audio playing +message146=�s������� PDF +message147=SMTP ���~�X +message148=��a +message149=�l��� +message150=�j�p +message151=���� +message152=�̪� +message153=�L�o +#message154=* Codes shown here gave hits or traffic "not viewed" by visitors, so are isolated in this chart. +message154=�o�Ǫ��A�X�|�W�[���[��"�ݤ���"���I���Ʃάy�q, �ҥH���]�A�b��L�έp��. +message155=Cluster +message156=�o�Ƿj�������H(Robots)�|�W�[���[��"�ݤ���"���I���Ʃάy�q, �ҥH���]�A�b��L�έp��. +message157="+" �᪺�Ʀr�O "robots.txt" ���I����. +message158=�o��į�η|�W�[���[��"�ݤ���"���I���Ʃάy�q, �ҥH���]�A�b��L�έp��. +message159="�ݤ���"���y�q�O�ѷj�������H(Robots),į�ΩίS�O�� HTTP �^�ФޭP��. +message160=���q�y�q +message161="�ݤ���"���y�q +message162=�C��O�� +message163=į�� +message164=���P��į�� \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ua.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ua.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/awstats-ua.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,157 @@ +# Ukrainian message file (roman@elsyst.km.ua) +# $Revision: 1.1 $ - $Date: 2005/03/01 17:35:40 $ +PageCode=windows-1251 +message0=���i����� +message1=���i����� (�� ������� ����������� IP) +message2=I��i +message3=�������i��... +message4=���� +message5=�i���� +message6=�i� +message7=���������� ����� +message8=������ �i��� +message9=������i� �i��� +message10=�i���i��� �i���i� +message11=��i������� �i��i�����i� +message12=�i��� +message13=�i���� �������� ��i� +message14=����� +message15=�i������ +message16=�������� ����i� +message17=������/����� +message18=�i��i�����i +message19=����i���-URL� +message20=������ ���� +message21=�������� ��������� +message22=������� HTTP +message23=�������i +message24=�� ������������ +message25=������/����� �i��i�����i� +message26=����i� +message27=����i��� +message28=�i���� ����i���-URLi� +message29=����������� +message30=I��i ����� +message31=�� �������i ����i��� +message32=���� ������� HTTP +message33=����i� Netscape +message34=����i� IE +message35=������ ��������� +message36=�����, ����� �i��i�����i ���������� �� ���� +message37=���������� +message38=������ ������ / �������� +message39=������� �������� �� ����������� +message40=��������� � ��������� ����� +message41=��������� � ����i��i� ����i��� (� i���� ����i� �� �������� ��������� �����) +message42=��������� � �����i��i� ����i��� (i���� ����i��� �� ����� � ����i) +message43=������i �����, �� ����� ��i��������� ����� �� �������i� �����i +message44=������i �����, �� ����� ��i��������� ����� �� �������i� �����i +message45=IP-������, ��i �� ������� ����������� � i���� +message46=���i���� �� +message47=�������i, ��� ���������i URL-� (HTTP ��� 404) +message48=IP-������ +message49=������� ��������� +message50=���i���i ����������i +message51=�i���� �����i� +message52=�i���/�i��i����� +message53=������ ��� ������-�i��i�����i +message54=������������ ����i����� ��������i� ��� ��������� ���������� ����i� +message55=� +message56=����i��� +message57=�������� +message58=����i� +message59=������i��i ������� +message60=�i� +message61=��� +message62=��� +message63=��i +message64=��� +message65=��� +message66=��� +message67=��� +message68=��� +message69=��� +message70=��� +message71=��� +message72=���i���i� +message73=���� ����i� +message74=������� +message75=����i� +message76=����� �� ������� ����i��� +message77=���������i�i +message78=dd mmm yyyy - HH:MM +message79=�i���� +message80=���� ������ +message81=����� +message82=�i����� +message83=������ +message84=�� +message85=�� +message86=�� +message87=�� +message88=�� +message89=�� +message90=�� +message91=��i ����� +message92=��� +message93=���� +message94=�����������i ����������i +message95=�i�. +message96=� ���������� +message97=����. +message98=��������� +message99=������i� +message100=���������� +message101=��������� ��������� +message102=������� +message103=�i���� ���� +message104=��i� +message105=��� +message106=������i� ����i� +message107=��������� � ���� ����� +message108=�� +message109=�� +message110=�� +message111=������ +message112=��� +message113=�i +message114=I�������i� � ���� WhoIs +message115=OK +message116=���i� +message117=������i��� �i���i� +message118=�������� �i��� +message119=����i� +message120=�����: ������i ����� +message121=�����: ������i ����� +message122=�i���� ��������� �����-�������i� +message123=�i���� ����i�-�������i� +message124=I��i ����� +message125=I��i i���� ����������i� (i/��� ����i��i ����������i) +message126=�������i ������-�������i� +message127=�����-�������i +message128=�i������ +message129=����� �������� ���������� � �i��i� ���������i +message130=������ ������� ����� +message131=���������� ������ �i��������� +message132=���������� ������ ���������� +message133=��i���� ���i�� +message134=���������/��������� +message135=������ ������ +message136=����� �i���i�/����'��i� +message137=������� �� '���������' +message138=��i �i���� +message139=�i��� +message140=�������� � �i�������� Java +message141=�������� � �i�������� Macromedia Director +message142=�������� � �i�������� Flash +message143=�������� � �i�������� ����������� Real audio +message144=�������� � �i�������� ����������� Quicktime audio +message145=�������� � �i�������� ����������� Windows Media audio +message146=�������� � �i�������� PDF +message147=���� ������� SMTP +message148=����� +message149=����� +message150=����i� +message151=������ +message152=������i� +message153=�i���� ���������� \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_f/awstats-tt-cz.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_f/awstats-tt-cz.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_f/awstats-tt-cz.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,34 @@ + + +
    +
    +
    +Po�et r�yn�ch host� (IP addresa), kte�� se p�ipojili. +
    +
    +
    +
    +
    +
    +Celkov� sou�et dat p�enesen�ch po ftp.
    +Jednotky jsou v KB, MB or GB (KiloBytes, MegaBytes or GigaBytes) +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +V�echny �asov� statistiky vych�zej� z �asu na serveru.
    +
    +
    +Tato data jsou: pr�m�rn� hodnoty (vych�z� z dat mezi prvn�m a posledn�m emailem). +
    +
    +Tato data jsou: sou�ty (vych�z� z dat mezi prvn�m a posledn�m emailem) +
    +
    +
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_f/awstats-tt-en.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_f/awstats-tt-en.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_f/awstats-tt-en.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,34 @@ + + +
    +
    +
    +Number of different client hosts (IP addresses) used to connect. +
    +
    +
    +
    +
    +
    +This is the total amount of data transfered by ftp downloads.
    +Units are in KB, MB or GB (KiloBytes, MegaBytes or GigaBytes) +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +All time related statistics are based on server time.
    +
    +
    +Here, reported data are: average values (calculated from all data between the first and last email in analyzed range) +
    +
    +Here, reported data are: cumulative sums (calculated from all data between the first and last email in analyzed range) +
    +
    +
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_m/awstats-tt-en.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_m/awstats-tt-en.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_m/awstats-tt-en.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,68 @@ + + +
    +
    +
    +Number of different client hosts (IP addresses) who sent mails. +
    +
    +
    +
    +Number of times an email was transfered by success.
    +
    +
    +This is the total amount of data transfered by mails.
    +Units are in KB, MB or GB (KiloBytes, MegaBytes or GigaBytes) +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +All time related statistics are based on server time.
    +
    +
    +Here, reported data are: average values (calculated from all data between the first and last email in analyzed range) +
    +
    +Here, reported data are: cumulative sums (calculated from all data between the first and last email in analyzed range) +
    +
    +
    + +
    Success: Non standard success response
    +
    Success: System status, or system help repl
    +
    Success: Help message
    +
    Success: Service ready
    +
    Success: Service closing transmission channel
    +
    Success: Your ISP mail server have successfully executes a command and the DNS is reporting a positive delivery
    +
    Success: Your message to a specified email address is not local to the mail server, but it will accept and forward the message to a different recipient email address
    +
    Success: Recipient cannot be verified but mail server accepts the message and attempts delivery
    + +
    Success: Indicates mail server is ready to accept the message or instruct your mail client to send the message body after the mail server have received the message headers.
    + +
    Temporary error: This may be a reply to any command if the service knows it must shut down.
    +
    Temporary error: Your ISP mail server indicates that an email address does not exist, mailbox is busy or mail temporarly refused. It could be the network connection went down while sending, or it could also happen if the remote mail server does not want to accept mail from you for some reason i.e. (IP address, From address, Recipient, etc.)
    +
    Temporary error: Your ISP mail server indicates that the mailing has been interrupted, usually due to overloading from too many messages or transient failure is one in which the message sent is valid, but some temporary event prevents the successful sending of the message. Sending in the future may be successful
    +
    Temporary error: Your ISP mail server indicates, probable overloading from too many messages and sending in the future may be successful
    +
    Temporary error: Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up it could go over the max number of messages per connection. To see if this is the case you can try submitting only a few messages to that domain at a time and then keep increasing the number until you find the maximum number accepted by the server
    + +
    Permanent error: Syntax error, command unrecognized or command line too long
    +
    Permanent error: Syntax error in parameters or arguments
    +
    Permanent error: Command not implemented
    +
    Permanent error: Server encountered bad sequence of commands
    +
    Permanent error: Command parameter not implemented
    +
    Permanent error: You must be pop-authenticated before you can use this SMTP server and you must use your mail address for the Sender/From field.
    +
    Permanent error: Access denied. A sendmailism ?
    +
    Permanent error: Sending an email to recipients outside of your domain are not allowed or your mail server does not know that you have access to use it for relaying messages and authentication is required. Or to prevent the sending of SPAM some mail servers will not allow (relay) send mail to any e-mail using another company�s network and computer resources.
    +
    Permanent error: User not local: please try or Invalid Address: Relay request denied
    +
    Permanent error: Requested mail action aborted: exceeded storage allocation. ISP mail server indicates, probable overloading from too many messages.
    +
    Permanent error: Requested mail action not taken: mailbox name not allowed. Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up (being sent) for a domain, it could go over the maximum number of messages per connection and/or some change to the message and/or destination must be made for successful delivery.
    +
    Permanent error: Requested mail action rejected: access denied
    +
    Permanent error: Too many duplicate messages. Resource temporarily unavailable Indicates (probable) that there is some kind of anti-spam system on the mail server.
    + +
    This is an unknown error. A such error is not reported by the mail server but by the maillogconvert.pl tool when it detects in the log that the sending was not successfull and the log file does not contains any explanation of the error.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_m/awstats-tt-fr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_m/awstats-tt-fr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_m/awstats-tt-fr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,68 @@ + + +
    +
    +
    +Nombre de hotes (adresses IP) utilis�s pour envoy�s un mail.
    +
    +
    +
    +
    +Nombre de fois qu'un email a �t� transf�r� avec succ�s.
    +
    +
    +Nombre d'octets repr�sentant le volume des mails transf�r�s.
    +Les unit�s sont en Ko, Mo ou Go (Kilooctets, Megaoctets or Gigaoctets) +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +Toutes les statistiques en rapport avec le temps sont bas�es sur les heures du serveur.
    +
    +
    +Ici les donn�es rapport�es sont des: valeurs moyennes (calcul�es � partir des donn�es entre le premier et dernier email de la p�riode analys�e) +
    +
    +Ici les donn�es rapport�es sont des: sommes cumul�es (calcul�es � partir des donn�es entre le premier et dernier email de la p�riode analys�e) +
    +
    +
    + +
    Success: Non standard success response
    +
    Success: System status, or system help repl
    +
    Success: Help message
    +
    Success: Service ready
    +
    Success: Service closing transmission channel
    +
    Success: Your ISP mail server have successfully executes a command and the DNS is reporting a positive delivery
    +
    Success: Your message to a specified email address is not local to the mail server, but it will accept and forward the message to a different recipient email address
    +
    Success: Recipient cannot be verified but mail server accepts the message and attempts delivery
    + +
    Success: Indicates mail server is ready to accept the message or instruct your mail client to send the message body after the mail server have received the message headers.
    + +
    Temporary error: This may be a reply to any command if the service knows it must shut down.
    +
    Temporary error: Your ISP mail server indicates that an email address does not exist, mailbox is busy or mail temporarly refused. It could be the network connection went down while sending, or it could also happen if the remote mail server does not want to accept mail from you for some reason i.e. (IP address, From address, Recipient, etc.)
    +
    Temporary error: Your ISP mail server indicates that the mailing has been interrupted, usually due to overloading from too many messages or transient failure is one in which the message sent is valid, but some temporary event prevents the successful sending of the message. Sending in the future may be successful
    +
    Temporary error: Your ISP mail server indicates, probable overloading from too many messages and sending in the future may be successful
    +
    Temporary error: Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up it could go over the max number of messages per connection. To see if this is the case you can try submitting only a few messages to that domain at a time and then keep increasing the number until you find the maximum number accepted by the server
    + +
    Permanent error: Syntax error, command unrecognized or command line too long
    +
    Permanent error: Syntax error in parameters or arguments
    +
    Permanent error: Command not implemented
    +
    Permanent error: Server encountered bad sequence of commands
    +
    Permanent error: Command parameter not implemented
    +
    Permanent error: You must be pop-authenticated before you can use this SMTP server and you must use your mail address for the Sender/From field.
    +
    Permanent error: Access denied. A sendmailism ?
    +
    Permanent error: Sending an email to recipients outside of your domain are not allowed or your mail server does not know that you have access to use it for relaying messages and authentication is required. Or to prevent the sending of SPAM some mail servers will not allow (relay) send mail to any e-mail using another company�s network and computer resources.
    +
    Permanent error: User not local: please try or Invalid Address: Relay request denied
    +
    Permanent error: Requested mail action aborted: exceeded storage allocation. ISP mail server indicates, probable overloading from too many messages.
    +
    Permanent error: Requested mail action not taken: mailbox name not allowed. Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up (being sent) for a domain, it could go over the maximum number of messages per connection and/or some change to the message and/or destination must be made for successful delivery.
    +
    Permanent error: Requested mail action rejected: access denied
    +
    Permanent error: Too many duplicate messages. Resource temporarily unavailable Indicates (probable) that there is some kind of anti-spam system on the mail server.
    + +
    This is an unknown error. A such error is not reported by the mail server but by the maillogconvert.pl tool when it detects in the log that the sending was not successfull and the log file does not contains any explanation of the error.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-al.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-al.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-al.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,69 @@ + + +
    +Vizita �sht� p�rkufizuar si vizitor risi (Shfletimin apo Shiqimin e faqes) t� cil�t nuk e kan vizituar faqen q� nga #VisitTimeOut# min. +
    +
    +Numri i klient�ve strehues (IP adresa) t� cil�t erdh�n ta vizitojn� faqen (dhe q� shfletuan se paku nj� faqe).
    +K�to t'dh�na tregojn� numrin e personave t� ndrysh�m fizik� t� cil�t arrit�n faqen n� �do dit�. +
    +
    +Hera e faqeve q� �sht� shiquar (Shuma e t� gjitha vizitave).
    +Kjo pjes e t'dh�nave ndryshon nga "Hyrjet" n� at� m�nyr i numron vet�m faqet HTML kund�r atyre p�r figur dhe t� tjera. +
    +
    +Hera e faqes, figur�s, vargut q� �sht� shiquar ose shkarkuar nga dikush.
    +K�to t'dh�na jan� ofruar vet�m si referenc�, pasi q� numri i shiqimeve "Faqe" �sht� menduar p�r q�llime tregtie. +
    +
    +Kjo informat� trtegon sasin� e t'dh�nave shkarkuar nga t� gjitha faqet, figurat dhe vargjet mbrenda nj� Faq�sie.
    +Njesit� jan� n� KB, MB ose GB (KiloBajt, MegaBajta or GigaBajta) +
    +
    +#PROG# e njeh �do lidhje n� faqe search nga #SearchEnginesArray# Makinat K�rkuese n� Internet m� t� popullarizuara si dhe Tregues (si Yahoo, Altavista, Lycos, Google, Voila, etj...). +
    +
    +Lista e t� gjitha faqeve jashta faq�s q� nyj�zuan (dhe hyrje) te faqja e juaj (Vet�m #MaxNbOfRefererShown# faqe m� t� shpeshta). +Nyjet q� jan� p�rdor nga rezultatet e makinave k�rkuese jan� p�rjashtu k�tu sepse ato p�rfshi n� rreshtat e tabelave. +
    +
    +Kjo tabel� tregon kryefrazat dhe kryefjalit� m� t� shpeshta q� jan� p�rdorur ta gjejn� faqen t�nde nga Makinat K�rkuese dhe tregues n� Internet. +(kryefjal� nga #SearchEnginesArray# Makinat K�rkuese dhe Treguest m� t� popullarizuar jan� njohur nga #PROG#, si Yahoo, Altavista, Lycos, Google, Voila, etj...).
    +V�shtri se shuma e kryefalive mund t� jet m� i madh se sa shume p�r kryefraza (numri real i k�rkesave) sepse ndoshta dy fjali jan� p�rdor n� t� njejtin K�rkues, k�rkuese �sht� numruar dy her� p�r fjali (nj� her� p�r �do fjal�). +
    +
    +Robotat (rrall� emruar si Marimanga) jan� vizita automatike kompjuterike p�rdorur nga shum� Makina K�rkuese q� e Shiqon faqen t�nga p�r tregues dhe radhitje, grumbullon statistika n� Faqet e Internetit dhe/ose shiqon n�se faqja e juaj�sht� ende n� linje.
    +#PROG# Ka mund�si q� t'i njoh� #RobotArray# robota. +
    +
    +T� gjitha vizitat jan� bazuar nga koha reale e Sh�rbyesit.
    +
    +
    +K�tu, t'dh�nat e raportuara jan�: valutat mesatare (llogaritur nga t'dh�ant nd�rmjet vizites s� par� dhe t� fundit) +
    +
    +K�tu, t'dh�nat e raportuara jan�: Shuma grumbulluese (llogaritur nga t'dh�ant nd�rmjet vizites s� par� dhe t� fundit) +
    +
    +Disa zgjatje t� vizitave jan� 'panjohur' sepse gjithmon� ato nuk mund t� llogariten. Kjo �sht� arsya kryesore p�r k�t�:
    +- vizita nuk ishte p�rfundur kur 'freskimi' ndodhi.
    +- vizita filloi n� or�n e fundit (pas 23:00) te fundi i dit�s s� muajit (Nj� arsye teknike parandalon #PROG# p�r llogaritjen e nj� zgjatje t� nj� mbledhje t� till�) +
    + +
    Nuk ka p�rshkrim p�r k�t� gabim.
    +
    K�rkesa �sht� kuptuar nga sh�rbyesi por do t� kryesohet m� von�.
    +
    Sh�rbyesi ka kryesuar mirpo atje nuk ka dokument p�r ta d�rguar.
    +
    P�rmbajtje gjysore.
    +
    Dokumenti i k�rkuar ishte larguar dhe tani nj� adres tjet�r �sht� p�rgjigj.
    +
    Nuk ka p�rshkrim p�r k�t� gabim.
    +
    Gabim sintaksor, sh�rbyesi nuk e ka kuptuar k�rkesen.
    +
    Provoi q� ta arrij nj� URL ku nj� hyrje/parull� �sht� nevojitur.
    Numri i madh n� k�t� gj� d.m.th. se (si psh. Grepi) �sht� duke provuar q� ta then, ose p�r t� hyr n� faqen t�nde t� siguruar (si shembull, duke shpresuar se duke provu parulla t� ndryshme mund t� hyn� n� hapsiren e siguruar).
    +
    Provoi q� ta arrij nj� URL pa trajtur p�r arritje, edhe me parull� (p�r shembull, nj� URL mbrenda Treguesit jo e p�rkufizuar si "shfletuese".).
    +
    Provoi q� ta arrij nj� URL joekzistuese. Ky gabim shpesh dmth nj� nyje pavler� diku n� faqen t�nde ekziston ose vizitori e ka gabuar nj� URL t� caktuar.
    +
    Sh�rbyesi shfryt�zoi shum� koh� ti p�rgjigjet k�rkes�s. Ky gabim shpesh p�rfshin skriptat (CGI, PHP) e ngadalsh�m q� sh�rbyesi �sht� detyru q� ta zhduk Faqe sh�rbyesin jasht�zakonisht t� dyndur.
    +
    Gabim i mbrendsh�m. Ky gabim shpesh shkaktohet nga nj� program CGI q� p�rfundoi parregull (psh trajtim i keq).
    +
    K�rkes e panjohur.
    +
    Kodi i kthyer nga nj� sh�rbyes HTTP q� punon si port� prokurie kur realisht, sh�rbyesi shenjuar nuk p�rgjigjet suksesh�m te k�rkesat e klient�ve.
    +
    Gabim mbrenda sh�rbyesit.
    +
    Parta tejkaloi koh�n.
    +
    Botimi i HTTP Nuk �sht� i P�rkrahur
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ba.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ba.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ba.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,54 @@ + + +
    +Novi posjet se defini�e kao svaki novi dolaze�i posjetitelj (koji pregleda stranicu) koji se nije konektovao na va� sajt u toku posljednjih #VisitTimeOut# minuta. +
    +
    +Broj korisni�kih ra�unara (IP adresa) koji su posje�ivali sajt (i vidjeli najmanje jednu stranicu).
    +Ovaj podatak govori o broju fizi�ki razli�itih osoba koji su posjetili sajt tokom jednog dana. +
    +
    +Koliko puta je jedna stranica sajta bila pregledana (Suma za sve posjetitelje tokom svih posjeta).
    +Ovaj podatak se razlikuje od "pogodaka" po tome �to broji samo HTML stranice za razliku od slika i drugih datoteka. +
    +
    +Koliko puta je jedna stranica, slika, datoteka sajta bila pregledana ili downloadovana od strane nekoga.
    +Ovaj podatak slu�i samo kao referenca, po�to je broj "stranica" znatno korisniji za razne marketin�ke potrebe. +
    +
    +Ova informacija govori o koli�ini downloadiranih podataka za sve stranice, slike i datoteke u okviru va�eg sajta.
    +Jedinice su Kb, Mb ili Gb (kilobajti, megabajti ili gigabajti). Ovaj podatak je koristan kako biste pratili ostvareni transfer sa va�e stranice. +
    +
    +#PROG# prepoznaje svaki pristup va�em sajtu nakon pretrage pomo�u #SearchEnginesArray# najpopularnijih Internet pretra�iva�a i direktorija (kao �to su Yahoo, Altavista, Lycos, Google, Voila, itd...). +
    +
    +Lista svih vanjskih stranica na kojima se nalazi link koji je korisnik upotrijebio da bi do�ao na va�u stranicu (Samo #MaxNbOfRefererShown# naj�e��ih linkova je prikazano). +Linkovi koji su rezultat pretra�iva�a su isklju�eni jer smo ih ve� prikazali u prethodnom redu ove tabele. +
    +
    +Ova tabela prikazuje listu klju�nih rije�i koje se naj�e��e koriste za pronala�enje va�eg sajta pomo�u Internet pretra�iva�a ili direktorija. +(#PROG# prepoznaje klju�ne rije�i #SearchEnginesArray# naj�e��ih pretra�iva�a i direktorija, me�u kojima su i Yahoo, Altavista, Lycos, Google, Voila, itd...). +
    +
    +Roboti (koji se ponekad nazivaju Spideri) su ra�unarski programi koje koriste mnogi pretra�iva�i kako bi analizirali va�u stranicu i time (1) indeksirali i rangirali va�u stranicu, (2) prikupili statistike o Web stranicama i/ili (3) provjerili da li je va� sajt jo� uvijek online.
    +#PROG# mo�e prepoznati do #RobotArray# robota. +
    + +
    Nema opisa za ovu gre�ku.
    +
    Server je razumio zahtjev, ali �e ga obraditi kasnije.
    +
    Server je obradio zahtjev ali nema �ta da po�alje korisniku.
    +
    Djelomi�an sadr�aj (korisnik je prekinuo otvaranje stranice).
    +
    Tra�eni dokument je premje�ten na novo mjesto i nova adresa je data korisniku (redirekcija).
    +
    Tra�eni dokument je premje�ten na novo mjesto i nova adresa je data korisniku (redirekcija).
    +
    Sintaksna gre�ka, server nije razumio zahtjev.
    +
    Korisnik je poku�ao otvoriti URL za koji je potrebno dati login/�ifru.
    Veliki broj pod ovom stavkom mo�e zna�iti da neko (npr. hacker) poku�ava provaliti u va� sajt (npr. isprobavaju�i razne kombinacije logina/�ifre za ulazak).
    +
    Korisnik je poku�ao otvoriti URL koji je pode�en da mu se ne mo�e pristupiti, �ak ni sa loginom/�ifrom (npr. URL unutar direktorija koji nije definisan kao pristupa�an.).
    +
    Korisnik je poku�ao pristupiti nepostoje�em URLu. Ova gre�ka obi�no zna�i da negdje na va�em sajtu postoji neispravan link ili da je korisnik neispravno ukucao odre�eni URL.
    +
    Serveru je trebalo previ�e vremena da odgovori na zahtjev. Kod ove gre�ke se obi�no radi ili o sporoj CGI skripti koju je server morao prekinuti, o sporoj konekciji korisnika ili o ekstremnom zagu�enju saobra�aja na web serveru.
    +
    Interna gre�ka. Ovu gre�ku uzrokuje CGI program koji sadr�i neku gre�ku te je prekinuo rad abnormalno.
    +
    Zahtjevana je nepoznata akcija.
    +
    Ovaj kod vra�a HTTP server koji radi kao proxy ili gateway, i to ako stvarni server ne odgovori uspje�no na zahtjev klijenta.
    +
    Interna gre�ka na serveru.
    +
    Ovaj kod vra�a HTTP server koji radi kao gateway, i to ako prilikom kontaktiranja stvarnog servera istekne predvi�eno vrijeme (gateway timeout).
    +
    Klijent zahtjeva verziju HTTPa koja nije podr�ana.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-bg.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-bg.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-bg.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,70 @@ + + + +
    +���� ��������� �� ������ ��� ����� ��� ������ ��������� (���������� ��������), ����� �� � ��������� ���� ���������� #VisitTimeOut# min. +
    +
    +����� �� ����������� ������� (IP ������), ����� �� �������� ����� (� �� ���������� ���� ���� ��������).
    +���� ����� �������� ���� �� ���������� ��������� ����, �������� ����� ��� ����� ���� ���. +
    +
    +����� ���� ���� �������� �� ����� � ���������� (���� �� ������ ���������� �� ������ ���������).
    +���� ����� �� ���������� �� "������" �� ����, �� ��������� ���� HTML �������� (��� ���������� � ������� ������ �������). +
    +
    +����� ���� ��������, �������� ��� ���� ���� �� ����� � ��������� ��� ������ �� ���������.
    +���� ����� �� ���� ���������, ��� ���� ���� �� ������������ "��������" ����� �� ����� �� ������������ ��������. +
    +
    +���� ���������� �� ������ �� ������������ ����� ������� � ������ ��������, ��������������� ��� ������ ����.
    +������� ������� �� � KB, MB ��� GB (���������, ��������� ��� ���������) +
    +
    +#PROG# ���������� ����� ������ �� ����� ���� ���� ����������� �� #SearchEnginesArray# ����������� �������� (���� Yahoo, Altavista, Lycos, Google, Voila, � �.�....). +
    +
    +������ �� ������ ������ �������� ���������� �� ������ (� ����) ��� ������ ���� (���� #MaxNbOfRefererShown#-�� ���-����� ���������� ������ �������� �� ��������). +��������, ���������� ���� �������� �� ���������� �� ���������, �.�. ���� �� �������� � ��������� ��� �� ���� �������. +
    +
    +��������� ������� ������ � ���-����� ������������ ������� ����� ��� ���� ���������� �� �������� �� ������ ���� � ������� �� �������� ��������. +(��������� ���� �� #SearchEnginesArray# ���-����������� �������� �� ���������� �� #PROG#, ���� Yahoo, Altavista, Lycos, Google, Voila, � �.�...).
    +���.: ������ ���� �� ���������� �� ������� ���� ���� �� ��������� ���� �� ���������� �� ������� ����� (���������� ���� �� ����������), ������ ��� �� ��������� 2 ��. ���� ��� ���� � ���� ������� �� ��������� 2 �������� �� ���� (�� ������ �� ����� ����). +
    +
    +�������� (�������� � ���� �����) �� �������������� ���������� ���������� ���������� �� ���������� �� �������� ����� �� �� ����������� � �������������: �� ������� ���������� �� ��� ��������� �/��� ���������� ���� ������ �� � ������.
    +#PROG# ���� �� ��������� �� #RobotArray# ������. +
    +
    +������ ������� ���������� �� �������� �� �������� ����� �� �������.
    +
    +
    +������������ ����� ��: ������������� ��������� (��������� �� ������ ����� ����� ��������� � ���������� ���������) +
    +
    +������������ ����� ��: ���������� ���� (��������� �� ������ ����� ����� ��������� � ���������� ���������) +
    +
    +����� ��������� �� ��������������� �� ����������� �� '����������' ������ �������� ����� �� ����� ���������. ��������� ������� �� ���� �:
    +- ����������� ��� �� � ����������, ������ � ������������ '����������'.
    +- ����������� � ��������� � ���������� ��� (���� 23:00) �� ���������� ��� �� ������ (�� ���������� ������� #PROG# � �������������� �� ������� ����������������� �� ������ �����). +
    + +
    ���� �������� �� ���� ������.
    +
    �������� �� ���� ���������� ��-����� �� �������.
    +
    �������� �������� ��������, �� �� �� ������� ����.
    +
    �������� ����������
    +
    � �������� �� �������� ������ �� ������ ������ ����� �� ���������� ��������.
    +
    ���� �������� �� ���� ������.
    +
    ����������� ������, �������� �� ������� ������ ������.
    +
    �������� �� �� ���������� URL ������� � ���/������.
    ����������� ������ ��������� ����� �� ��������� ���� �� ������������ �/��� ���������� ������ �� ������ ����.
    +
    �������� �� �� ���������� URL ���������� � �� ����������� ����������� (��������, URL ����� � ����������, ����� �� � ���������� �� "�������".).
    +
    �������� �� �� ���������� ������������� URL. ���� ������� �������������� �� ��������� ������ � ����� ��� �������� ������� �� ���������� URL �����.
    +
    �������� � ������� ������ ����� ����� �� �� �������� �� ��������. ���� ������ ���������� �������� ��� ����� CGI ������, ����� �������� �� � �������� �� �������� ��� ���������� ���������� ��� ������ ������.
    +
    �������� ������. ���� ������ ���������� � ��������� �� CGI �������� ����� � ���������� ���������� �� ����������(coredump ��������).
    +
    �������� �������� � ���������.
    +
    ��� �� ������, ������ �� HTTP ������, ������� ���� ������ ��� gateway, ������ ��������-��� �� � ��������� ������� �� ����������� ������.
    +
    �������� ������ �� �������.
    +
    ��������(Gateway) ����������.
    +
    HTTP �������� �� �� ��������.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ca.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ca.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ca.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,68 @@ + + +
    +Es considera una nova visita per cada nou visitant que consulta una p�gina i que hagi accedit al lloc en els �ltims #VisitTimeOut# mins.. +
    +
    +Nombre de clients (adreces IP) que entren a un lloc (i que com a m�nim visiten una p�gina).
    +Aquesta xifra reflecteix el nombre de persones f�siques diferents que han accedit al lloc en un dia. +
    +
    +Nombre de vegades que una p�gina del lloc ha estat visualitzada (La suma de tots els visitants inclouen visites m�ltiples).
    +Aquest comptador es distingeix de "hits" perqu� nom�s conta les p�gines HTML, i no pas els gr�fics o altres arxius o fitxers. +
    +
    +El nombre de vegades que una p�gina, imatge, arxiu o fitxer d'un lloc �s visualitzat o descarregat per visitant.
    +Aquest comptador serveix de refer�ncia, per� el comptador de "p�gines" representa una dada mercadot�cnica generalment m�s �til, i per tant, m�s recomanada. +
    +
    +El nombre de kilo bytes descagarregats pels visitants del lloc.
    +Es refereix al volum de dades descarregades per totes les p�gines, imatges i arxius o fitxers mesurats en bytes. +
    +
    +El programa #PROG# �s capa� de recon�ixer una visita a un lloc despr�s de cadascuna de les cerques des de qualsevol dels #SearchEnginesArray# motors de cerca i directoris Internet m�s populars (Yahoo, Altavista, Lycos, Google, Terra, etc...). +
    +
    +Llista de p�gines de llocs externs utilitzades para accedir o enlla�ar-se amb el seu lloc (Nom�s les #MaxNbOfRefererShown# p�gines m�s utilitzades es troben numerades). +Els enlla�os emprats pels motors de cerca o directoris s�n exclosos perqu� ja han estat comptabilitzats a l'anterior apartat. +
    +
    +Aquesta taula mostra la llista de les paraules clau m�s utilitzades en els motors de cerca i directoris Internet per trobar el seu lloc. +(El programa #PROG# reconeix paraules claus util.litzades en els #SearchEnginesArray# motors de cerca m�s populars, com Yahoo, Altavista, Lycos, Google, Voila, Terra etc...). +
    +
    +Els Robots son visitants autom�tics que escanejan o viatgen pel seu lloc per a indexar-lo, o jerarquitzar-lo, per tal de recollir estad�stiques de llocs Web, o per verificar si el seu lloc es troba connectat a la Xarxa.
    +El programa #PROG# reconeix fins a #RobotArray# robots. +
    +
    +Els temps relacionats amb les estad�stiques estan basats en temps de servidor.
    +
    +
    +Aqu�, les dates reportades son: valors medis (calculat desde totes les dates entre les primeres y les ultimes visites en la franja analitzada) +
    +
    +Aqu�, les dates reportades son: sumes acumulatives (calculat desde totes les dates entre les primeres y les ultimes visites en la franja analitzada) +
    +
    +Algunes Duracions de les visites son 'desconegudes' perqu� no poden ser calculades sempre. La ra� principal d'ax� es:
    +- La visita no va acab� quan es va fer 'l'actualizaci�'.
    +- La visita va comen�ar en la hora anterior (despr�s de les 23:00) del passat dia de un mes (la ra� t�cnica de prevenir a #PROG# de la duraci� calculada de tales sessions) +
    + +
    Error sense descripci�.
    +
    La petici� ha estat computada per� el servidor la processar� m�s tard.
    +
    El servidor ha processat la petici� per� no existeixen documents per enviar.
    +
    Contingut parcial.
    +
    El document sol�licitat ha estat reubicat i es troba en una URL proporcionada en la mateixa resposta.
    +
    Error sense descripci�.
    +
    Error de sintaxis, el servidor no ha ent�s la seva petici�.
    +
    Nombre d'intents per accedir a una URL que exigeix una combinaci� usuari/contrasenya que ha estat inv�lida..
    Un nombre d'intents molt elevat pot suggerir la possibilitat que un hacker (o pirata) ha intentat entrar a una zona restringida del lloc (p.e., intentant m�ltiples combinacions de usuari/contrasenya).
    +
    Nombre d'intents per accedir a una URL configurada per a no ser accessible ni amb una combinaci� usuari/contrasenya (p.e., una URL pr�viament definida com a "no navegable").
    +
    Nombre d'intents per accedir a una URL inexistent. Sovint, aquests es refereixen a un enlla� (link) no v�lid o a un error mecanogr�fic quan el visitant tecleja una URL err�nia.
    +
    El servidor ha trigat massa temps a respondre a una petici�. Sovint, �s degut a un programa CGI molt lent, el qual ha estat abandonat pel servidor, o b� per un servidor molt saturat.
    +
    Error intern. Aquest error generalment �s provocat per una terminaci� anormal o prematura d'un programa CGI (p.e., un CGI corromput o malm�s).
    +
    Petici� desconeguda pel servidor.
    +
    Codi retornat per un servidor de protocol HTTP que funciona com a proxy o pont (gateway) quan el servidor objectiu no funciona o no interpreta correctament la petici� del client (o visitant).
    +
    Error intern del servidor.
    +
    Passarel�la fora de l�nia.
    +
    Versi� de protocol HTTP no suportada.
    \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-cn.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-cn.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-cn.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,49 @@ + +
    +���ֶ�Ϊ�ι���վ�����˴Σ�����ͬ��ַ���������վ��ʱ����������#VisitTimeOut#���ӲŻ��ټ�¼һ�Ρ� +
    +
    +���ֶ�Ϊ�ι���վ���������ԴӲ�ͬ�ļ����IP�������վ�ĸ�����������վ�������� +
    +
    +���ֶ�Ϊ���вι������вι�����ҳ���ʵ��ܴ�����ֻ��¼��ҳ(.html��������ͼƬ��CSS���ļ�)�ķ��ʴ����� +
    +
    +���ֶ�Ϊ�����ȡ���ܴ�����������ҳ�ļ���ͼƬ�ļ���Ӱ���ļ��ȡ�
    +��Щ���ݽ������ο�������ҳ������ Page View������������ҵ���� +
    +
    +���ֶ�Ϊ�������ļ����ݵ�����������������ҳ�ļ���ͼƬ�ļ���Ӱ���ļ��ȡ� +
    +
    +���ֶ�Ϊ��¼ʹ���ߴ���Щ��Ѱ��վ�������վ��#PROG# ���Զ������ʹ�õ�#SearchEnginesArray#���������棬��(Yahoo! Google...)�� +
    +
    +��ʾ������վ����ҳ����������������վ����ҳ�б� +ϵͳ���г��ϳ������ǰ#MaxNbOfRefererShown#����ҳ��ַ�� +
    +
    +��������ʾʹ��������Ѱ��վ�нϳ�ʹ�õĹؼ�����������վ��ϵͳ���¼�ʹ�õ�#SearchEnginesArray#����Ѱ��վ�ؼ��ʡ� +
    +
    +��Ѱ��վ�Ļ�����(Robots)���Զ�����Ѱ��վ�ڵ��������ݡ�
    +#PROG#��¼�ϳ�ʹ�õ�#RobotArray#����������Ѱ��վ�ļ�¼�� +
    + +
    û�й�����������������
    +
    ��ҳ���������˽�ʹ���ߵ�����
    +
    ��ҳ�������Ĵ�����ʹ���ߵ����󣬵���ȴû���ļ����ͳ�
    +
    ��ҳ���ݶ�ȡ����ȫ
    +
    ��Ѱ����ҳ�Ѿ��Ƶ������ط����������Ѿ���Ѱ����
    +
    ��ҳԭ���Ҳ����������Ѿ��ڱ�ĵط��ҵ���
    +
    �﷨������ҳ���������˽�ʹ���ߵ�����
    +
    �����������������������ҳ��ַ����������
    +
    ����������δ�����������ҳ��ַ����������
    +
    ���������������ڵ���ҳ��ַ����������
    +
    ��ҳ����������̫��ʱ�䴦���������
    +
    �ڲ���������������һ���� CGI ����������
    +
    ���˽�����
    +
    ������������������ط�������ҳ������û�гɹ����ظ��ͻ���
    +
    �ڲ���������������
    +
    ͨѶ��ʱ
    +
    ��� HTTP �İ汾û��֧��
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-cz.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-cz.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-cz.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,54 @@ + + +
    +Nov� n�v�t�vn�ci jsou definov�ni jako ka�d� p�ich�zej�c� (prohl�ej�c� si neboproch�zej�c�), kdo +se na str�nky nep�ipojil posledn�ch #VisitTimeOut# min. +
    +
    +Po�et klient� (IP address), kte�� p�i�li na str�nky (a kte�� si prohl�dli alespo� jednu str�nku). +Toto ��slo odpov�d� ��slu r�zn�ch fyzick�ch osob, kte�� nav�t�vili str�nky kter�koli jeden den. +
    +
    +Po�et kolikr�t byla str�nka na tomto serveru shl�dnuta (Sou�et za v�echny nav�t�vuj�c� a jejich n�v�t�vy). +To se li�� od Hit� tak, �e jsou zapo��t�ny jen str�nky (ne obr�zky a ostatn�...). +
    +
    +Po�et kolikr�t byla str�nka, obr�zek, soubor na tomto serveru st�hnuta (Sou�et za v�echny nav�t�vuj�c� a jejich n�v�t�vy). +Toto ��slo je uv�d�no kv�li porovn�n� se Str�nkami. +
    +
    +Velikost v�ech str�nek, obr�zk� a soubor� sta�en�ch z tohoto serveru. +
    +
    +#PROG# rozpozn� p��stup na server od vyhled�v�n� z #SearchEnginesArray# nejzn�m�j��ch internetov�ch vyhled�va�� a seznam� (jako je Yahoo, Altavista, Lycos, Google, Voila, atd...). +
    +
    +Seznam v�ech extern�ch str�nek (mimo server), kter� byly pou�ity jako odkaz na tento server (Je zobrazeno jen #MaxNbOfRefererShown# nej�ast�j��ch). +Odkazy pou�it� z vyhled�va�� nejsou za�azeny, nebo� je obsahuje jin� �daj. +
    +
    +Tato tabulka zobrazuje seznam nej�ast�ji zad�van�ch v�raz�, kter� byly zad�vany ve vyhled�va��ch k nalezen� tohoto serveru. +(V�razy od #SearchEnginesArray# mnejzn�m�j��ch vyhled�va�� a seznam� jsou #PROG# rozpozn�ny, jako je Yahoo, Altavista, Lycos, Google, Voila, atd...). +
    +
    +Roboti (n�kdy ozna�ov�ni jako pavouci nebo �muchalov�) jsou po��ta�ov� automat. n�v�t�vn�ci pou�ivan� mnoha vyhled�vac�mi slu�bami k (1) indexov�n� a hodnocen�, (2) sb�r�n� statistik z web� a/nebo (3) k zji�t�n�, zda str�nky st�le existuj�.
    +#PROG# je schopen rozpoznat #RobotArray# robot�. +
    + +
    Bylo vytvo�eno nov� m�sto s daty a odesl�no.
    +
    Po�adavek byl rozezn�n, ale bude vy��zen pozd�ji.
    +
    Po�adavek byl rozezn�n, ale nen� co odeslat zp�t.
    +
    Dotaz byl zpracov�n jen ��ste�n�.
    +
    Po�adovan� dokument byl p�esunut a adresa byla odesl�na.
    +
    Dokument se do�asn� nach�z� na jin� adrese.
    +
    Syntaktick� chyba, chybn� po�adavek.
    +
    Po�adavek neobsahoval ��danou autorizaci jm�no/heslo pro vstup na str�nky. Pokud se vyskytuje �asto pokou�� se n�kdo o pr�lom-hack.
    +
    Po�adavek byl odm�tnut serverem (nep��stupn� data, neviditeln� adres��...).
    +
    Pokus o vstup na neexistuj�c� str�nku nebo soubor.
    +
    Cel� po�adavek nebyl serveru od klienta zasl�n v po�adovan�m �ase (chyba klienta nebo serveru nebo skriptu).
    +
    Chyba serveru (�asto se vyskytuje p�i chybn�m zpracov�n� skriptu).
    +
    Po�adavek, kter� byl zasl�n nen� mo�no vy��dit, nebo� ho server neum� zpracovat.
    +
    Server p�ijal �patn� po�adavek od jin�ho serveru (proxy nebo br�ny).
    +
    Chyba serveru, slu�ba nen� k dispozici.
    +
    Vypr�el �asov� interval u proxy serveru nebo br�ny.
    +
    Nepodporovan� verze protokolu HTTP.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-de.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-de.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-de.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,62 @@ + +
    +Ein neuer Besucher wird definiert als jeder neue Besucher, der eine Seite abgerufen hat und der auf Ihre Web Site in den letzten #VisitTimeOut# min. nicht zugegriffen hat. +
    +
    +Anzahl der Rechner (IP-Adressen), die Ihre Web Site besuchten und mindestens eine Seite aufgerufen haben.
    +Diese Anzahl entspricht der Zahl an unterschiedlichen physikalischen Personen, die Ihre Web Site an irgendeinem Tag besuchten. +
    +
    +Anzahl der insgesamt angezeigten Seiten Ihrer Web Site (Summe aller Zugriffe von allen Besuchern).
    +Diese Zahl unterscheidet sich von den "Zugriffen", da nur HTML Seiten und keine Grafiken oder andere Dateien gezählt werden. +
    +
    +Anzahl der insgesamt angezeigten oder heruntergeladenen Seiten, Grafiken, Dateien Ihrer Web Site.
    +Diese Zahl wird nur als Referenz angegeben, da meistens die Anzahl der angezeigten "Seiten" für Marketingzwecke bevorzugt wird. +
    +
    +Dieser Wert entspricht der Menge an Daten, die aufgrund aller Seiten, Grafiken und Dateien Ihrer Web Site übertragen worden sind.
    +Einheiten sind in Kb, Mb oder Gb (KiloBytes, MegaBytes oder GigaBytes) +
    +
    +#PROG# erkennt jeden Zugriff auf Ihre Web Site aufgrund einer Suche von einer der #SearchEnginesArray# beliebtesten Internet-Suchmaschinen und -Verzeichnisse (wie z.B. Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Eine Liste aller externen Seiten, von denen ein Verweis auf Ihre Web Site erfolgte (nur die #MaxNbOfRefererShown# am häufigsten aufgetretenen externen Seiten werden angezeigt). +Verweise aufgrund eines Suchergebnisses einer Suchmaschine werden hier nicht aufgeführt, da diese bereits in der vorherigen Tabellenzeile angegeben worden sind. +
    +
    +Diese Tabelle zeigt die Liste der am häufigsten verwendeten Schlüsselwörter, um Ihre Web Site mit einer Internet-Suchmaschine bzw. -Verzeichnis zu finden. +(#PROG# erkennt die Schlüsselwörter der #SearchEnginesArray# beliebtesten Internet-Suchmaschinen und -Verzeichnisse, wie z.B. Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Robots (manchmal auch als Spider bezeichnet) sind automatische Computerbesucher, die von vielen Suchmaschinen eingesetzt werden, um Ihre Web Seite aufzunehmen und auszuwerten.
    +#PROG# ist in der Lage, bis zu #RobotArray# Robots zu erkennen. +
    +
    +Alle zeitbezogenen Statistiken basieren auf der Serverzeit.
    +
    +
    +Die angezeigten Werte sind Durchschnittswerte (berechnet aus allen Werten zwischen dem ersten und letzten Besuch) +
    +
    +Die angezeigten Werte sind Summenwerte (berechnet aus allen Werten zwischen dem ersten und letzten Besuch) +
    + +
    Für diesen Fehler liegt keine Beschreibung vor.
    +
    Die Anfrage wurde vom Server akzeptiert, aber sie wird erst später verarbeitet.
    +
    Der Server hat die Anfrage verarbeitet, aber es wurde kein Ergebnis übertragen.
    +
    Unvollständiger Inhalt.
    +
    Das angeforderte Dokument wurde verschoben und ist nun unter der angegebenen Adresse erreichbar.
    +
    Für diesen Fehler liegt keine Beschreibung vor.
    +
    Syntaxfehler, der Server kann die Anfrage nicht verarbeiten.
    +
    Es wurde versucht, auf eine URL zuzugreifen, für die eine Authentifizierung notwendig war.
    Eine hohe Anzahl kann darauf hindeuten, daß jemand (z.B. ein Hacker) vesucht, sich unerlaubten Zugang zu Ihrer Web Site zu verschaffen, indem er z.B. verschiedene Login/Passwort Kombinationen durchprobiert.
    +
    Es wurde versucht, auf eine unerreichbare URL zuzugreifen, für die selbst eine Authentifizierung nicht ausreicht (z.B. eine URL innerhalb eines für Browserzugriffe gesperrten Verzeichnisses).
    +
    Es wurde versucht, auf eine ungültige URL zuzugreifen. Dieser Fehler bedeutet meistens, daß es einen ungültigen Link irgendwo in Ihrer Web Site gibt oder daß ein Besucher einen Schreibfehler bei einer URL gemacht hat.
    +
    Der Server benötigte zu viel Zeit, um auf eine Anfrage zu reagieren. Dieser Fehler bezieht sich meistens auf ein langsam arbeitendes CGI-Skript, welches durch den Server vorzeitig abgebrochen werden mußte, oder einen überlasteten Web Server.
    +
    Interner Fehler. Dieser Fehler wird meist durch ein CGI-Skript verursacht, das z.B. durch einen Programmfehler unerwarteterweise beendet worden ist.
    +
    Unbekannte Art der Anfrage.
    +
    Dieser Fehler wird von einem HTTP-Server gemeldet, der als ein Proxy oder Gateway fungiert, wenn der eigentliche Zielserver auf die Anfrage nicht erfolgreich geantwortet hat.
    +
    Interner Serverfehler.
    +
    Gateway Zeitüberschreitung.
    +
    HTTP-Version wird nicht unterstützt.
    \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-dk.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-dk.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-dk.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,75 @@ + + +
    +Et nyt besøg defineres som hver ny indkommende besøger, der ser eller browser en side, og ikke har været inde på hjemmesiden i #VisitTimeOut# minutter. +
    +
    +Antal besøgende (IP-adresser), som har besøgt hjemmesiden (og som har fået vist mindst en side).
    +Dette refererer til antallet af forskellige, fysiske personer, der har fået vist siden. +
    +
    +Antal gange en side på hjemmesiden har været vist. (Summen af alle sider for alle besøgende).
    +Sider adskiller sig fra hits, idet det kun er html-sider, men ikke billeder eller andre filer, der tæller. +
    +
    +Antal gange en side, fil eller et billede på hjemmesiden er blevet vist eller hentet af nogen.
    +Hits er kun med som reference, idet det oftest er Sider eller Besøg (eller Unikke besøg), man reelt ønsker statistik for. +
    +
    +Dette er mængden af data hentet (sider, billeder og filer) fra hjemmesiden.
    +Enhederne er KB, MB eller GB (KiloBytes, MegaBytes eller GigaBytes) +
    +
    +#PROG# kan se, hvis en besøgende har fundet hjemmesiden gennem en søgning fra en af de #SearchEnginesArray# mest brugte Internet søgemaskiner eller kataloger (så som Google, Yahoo, Altavista, Lycos, Voila etc.). +
    +
    +En liste med alle eksterne sider, der linker til (og er blevet brugt til at komme ind på) din hjemmeside (kun de #MaxNbOfRefererShown# mest anvendte eksterne sider vises).
    +Links fra søgemaskiner er ikke medregnet, da de er medtaget for sig selv i en separat tabel. +
    +
    +Denne tabel viser de mest benyttede søgesætninger og søgeord, som anvendes for at finde din hjemmeside gennem søgemaskiner og kataloger. +(søgeord fra de #SearchEnginesArray# mest populære søgemaskiner og kataloger genkendes af #PROG#, så som Google, Yahoo, Altavista, Lycos, Voila etc.).
    +Bemærk at det samlede antal søgninger ud fra søgeord kan være større end det samlede antal søgninger ud fra søgesætninger (det reelle antal søgninger), da to søgeord brugt i samme søgning tæller to gange (en gang for hvert ord). +
    +
    +Robotter (også kaldet Spiders) er automatiske computerbesøgende, som anvendes af mange søgemaskiner. De scanner hjemmesider for at indeksere og rangordne dem, samle statistik om hjemmesider og/eller se om din hjemmeside eksisterer endnu.
    +#PROG# genkender op til #RobotArray# søgerobotter. +
    +
    +Al tidsrelateret statistik baseres på servertiden (OBS: ved IIS-servere er klokkeslætsangivelser normalt altid baseret på UTC-tid). +
    +
    +Her vises gennemsnit (beregnet ud fra alle data mellem første og sidste besøg i det analyserede udsnit). +
    +
    +Her vises sammenlagte summer (beregnet ud fra alle data mellem første og sidste besøg i det analyserede udsnit). +
    +
    +Besøgenes længde er undertiden 'ukendt', fordi de ikke altid kan beregnes. Følgende er hovedårsagerne til dette:
    +- Besøget var ikke afsluttet, da 'opdateringen' fandt sted.
    +- Besøget startede den sidste time (efter kl. 23:00) på den sidste dag i måneden (En teknisk årsag forhindrer #PROG# i at beregne varigheden af sådanne besøg). +
    +
    +Orme er automatiske computerbesøgende, der i virkeligheden består af eksterne servere, der er inficeret med en virus, som forsøger at lave et specifikt hit på din server for at inficere den også. +I de fleste tilfælde udnytter sådanne orme huller i kommercielle eller ikke-opdaterede servere. Hvis dit system ikke er defineret som et sårbart system i forhold til ormen, kan du normalt bare ignorere disse hits.
    +Der er kun meget få 'server orme' i verden, men de er meget aktive til tider. +#PROG# er i stand til at genkende #WormsArray# kendte orme-signaturer (Nimda, Code Red osv.). +
    + +
    Ingen beskrivelse af denne fejl.
    +
    Serveren forstod forespørgslen, som udføres senere.
    +
    Serveren har udført forespørgslen, men der er ikke noget dokument at sende.
    +
    Partielt indhold.
    +
    Sider er flyttet og den nye URL er givet i svaret.
    +
    Ingen beskrivelse af denne fejl.
    +
    Syntaksfejl, serveren forstod ikke forespørgslen.
    +
    Der er blevet forespurgt en URL hvor brugernavn/kode var krævet.
    Et højt antal her kan betyde, at nogen (måske en hacker) forsøger at komme ind på dit site (f.eks. ved at prøve forskellige kombinationer af brugernavne/koder).
    +
    Der er blevet forespurgt en URL der er opsat ikke tilgængelig, selv med et korrekt brugernavn/kode (for eksempel en URL i et bibliotek, der er defineret som ikke 'browsable'.).
    +
    Der er blevet forespurgt en ikke eksisterende URL. Denne fejl skyldes ofte, at der er en forkert link på hjemmesiden, eller at en besøgende har tastet en forkert URL.
    +
    Serveren har taget for lang tid om at besvare forespørgslen. Dette skyldes ofte et langsomt cgi-script, eller at serveren er overbelastet.
    +
    Intern fejl. Dette skyldes ofte, at et cgi-script er afsluttet unormalt (med coredump f.eks.).
    +
    Ukendt forespørgsel.
    +
    Kode returneret af en HTTP server, der fungerer som proxy eller gateway, når den rigtige destinationsserver ikke svarer rigtigt på en klientforespørgsel.
    +
    Intern serverfejl.
    +
    Gateway timeout
    +
    HTTP-version understøttes ikke.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-en.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-en.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-en.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,76 @@ + + +
    +A new visits is defined as each new incoming visitor (viewing or browsing a page) who was not connected to your site during last #VisitTimeOut# mn. +
    +
    +Number of client hosts (IP address) who came to visit the site (and who viewed at least one page).
    +This data refers to the number of different physical persons who had reached the site. +
    +
    +Number of times a page of the site is viewed (Sum for all visitors for all visits).
    +This piece of data differs from "hits" in that it counts only HTML pages as oppose to images and other files. +
    +
    +Number of times a page, image, file of the site is viewed or downloaded by someone.
    +This piece of data is provided as a reference only, since the number of "pages" viewed is often prefered for marketing purposes. +
    +
    +This piece of information refers to the amount of data downloaded by all pages, images and files within your site.
    +Units are in KB, MB or GB (KiloBytes, MegaBytes or GigaBytes) +
    +
    +#PROG# recognizes each access to your site after a search from the #SearchEnginesArray# most popular Internet Search Engines and Directories (such as Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +List of all external pages which were used to link (and enter) to your site (Only the #MaxNbOfRefererShown# most often used external pages are shown). +Links used by the results of the search engines are excluded here because they have already been included on the previous line within this table. +
    +
    +This table shows the list of the most frequent keyphrases or keywords used to find your site from Internet Search Engines and Directories. +(Keywords from the #SearchEnginesArray# most popular Search Engines and Directories are recognized by #PROG#, such as Yahoo, Altavista, Lycos, Google, Voila, etc...).
    +Note that total number of searches for keywords might be greater than total number of searches for keyphrases (real number of searches) because when 2 keywords were used on same search, search is counted twice for keywords (once for each word). +
    +
    +Robots (sometimes refer to Spiders) are automatic computer visitors used by many search engines that scan your web site to index it and rank it, collect statistics on Internet Web sites and/or see if your site is still online.
    +#PROG# is able to recognize up to #RobotArray# robots. +
    +
    +All time related statistics are based on server time.
    +
    +
    +Here, reported data are: average values (calculated from all data between the first and last visit in analyzed range) +
    +
    +Here, reported data are: cumulative sums (calculated from all data between the first and last visit in analyzed range) +
    +
    +Some Visits durations are 'unknown' because they can't always be calculated. This is the major reason for this:
    +- Visit was not finished when 'update' occured.
    +- Visit started the last hour (after 23:00) of the last day of a month (A technical reason prevents #PROG# from calculating duration of such sessions) +
    +
    +Worms are automatic computer visitors that are in fact external servers, infected by a virus, that try +to make particular hits on your server to infect it. In most cases, such worms exploit some bugs of not up to date +or commercial servers. If your system is not the sensitive target of the worm, you can simply ignore those hits.
    +There is very few 'server worms' in the world but they are very active at some times. +#PROG# is able to recognize #WormsArray# known worm's signatures (nimda,code red,...). +
    + +
    No description for this error.
    +
    Request was understood by server but will be processed later.
    +
    Server has processed the request but there is no document to send.
    +
    Partial content.
    +
    Requested document was moved and is now at another address given in answer.
    +
    No description for this error.
    +
    Syntax error, server didn't understand request.
    +
    Tried to reach an URL where a login/password pair was required.
    A high number within this item could mean that someone (such as a hacker) is attempting to crack, or enter into your site (hoping to enter a secured area by trying different login/password pairs, for instance).
    +
    Tried to reach an URL not configured to be reachable, even with an login/password pair (for example, an URL within a directory not defined as "browsable".).
    +
    Tried to reach a non existing URL. This error often means that there is an invalid link somewhere in your site or that a visitor mistyped a certain URL.
    +
    Server has taken too much time to respond to a request. This error frequently involves either a slow CGI script which the server was required to kill or an extremely congested web server.
    +
    Internal error. This error is often caused by a CGI program that had finished abnormally (coredump for example).
    +
    Unknown requested action.
    +
    Code returned by a HTTP server that works as a proxy or gateway when a real, targeted server doesn't answer successfully to the client's request.
    +
    Internal server error.
    +
    Gateway Time-out.
    +
    HTTP Version Not Supported.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-es.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-es.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-es.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,68 @@ + + +
    +Se considera un nueva vista por cada nuevo visitante que consulta una p�gina y que no haya accedido al sitio en los �ltimos #VisitTimeOut# mins.. +
    +
    +N�mero de Servidores (direcciones IP) que entran a un sitio (y que por lo menos visitan una p�gina).
    +Esta cifra refleja el n�mero de personas f�sicas diferentes que hayan accedido al sitio en un d�a. +
    +
    +N�mero de ocasiones que una p�gina del sitio ha sido vista (La suma de todos los visitantes incluyendo m�ltiples visitas).
    +Este contador se distingue de "hits" porque cuenta s�lo las p�ginas HTML y no los gr�ficos u otros archivos o ficheros. +
    +
    +El n�mero de ocasiones que una p�gina, imagen, archivo o fichero de un sitio es visto o descargado por un visitante.
    +Este contador sirve de referencia, pero el contador de "p�ginas" representa un dato mercadot�cnico generalmente m�s �til y por lo tanto se recomienda. +
    +
    +El n�mero de kilo bytes descargados por los visitantes del sitio.
    +Se refiere al volumen de datos descargados por todas las p�ginas, im�genes y archivos o ficheros medidos en kilo bytes. +
    +
    +El programa #PROG# es capaz de reconocer una visita a su sitio luego de cada b�squeda desde cualquiera de los #SearchEnginesArray# motores de b�squeda y directorios Internet m�s populares (Yahoo, Altavista, Lycos, Google, Terra, etc...). +
    +
    +Lista de p�ginas de sitios externos utilizadas para acceder o enlazarse con su sitio (S�lo las #MaxNbOfRefererShown# p�ginas m�s utilizadas se encuentras enumeradas). +Los enlaces utilizados por los motores de b�squeda o directorios son excluidos porque ya han sido contabilizados en el rubro anterior. +
    +
    +Esta tabla muestra la lista de las palabras clave m�s utilizadas en los motores de b�squeda y directorios Internet para encontrar su sitio. +(El programa #PROG# reconoce palabras clave usadas en los #SearchEnginesArray# motores de b�squeda m�s populares, tales como Yahoo, Altavista, Lycos, Google, Voila, Terra etc...). +
    +
    +Los Robots son visitantes autom�ticos que escanean o viajan por su sitio para indexarlo, o jerarquizarlo, para recopilar estad�sticas de sitios Web, o para verificar si su sitio se encuentra conectado a la Red.
    +El programa #PROG# reconoce hasta #RobotArray# robots. +
    +
    +Todos los tiempos relacionados con las estadísticas están basados en tiempos de servidor.
    +
    +
    +Aqu�, las fechas reportadas son: valores medios (calculado desde todos los datos entre las primeras y los ultimas visitas en el rango analizado) +
    +
    +Aqu�, las fechas reportadas son: sumas acumulativas (calculado desde todos los datos entre las primeras y los ultimas visitas en el rango analizado) +
    +
    +Algunas Duraciones de las visitas son 'desconocidas' porque no pueden ser calculadas siempre. La raz�n principal de esto es:
    +- La visita no fue acabada cuando ocurri� la 'actualizaci�n'.
    +- La visita comenz� en la hora anterior (despu�s de las 23:00) del pasado d�a de un mes (la raz�n t�cnica de previene a #PROG# de la duraci�n calculada de tales sesiones) +
    + +
    Error sin descripci�n.
    +
    La solicitud ha sido computada pero el servidor la procesar� m�s tarde.
    +
    El servidor ha procesado la solicitud pero no existen documentos para enviar.
    +
    Contenido parcial.
    +
    El documento solicitado ha sido reubicado y se encuentra en un URL proporcionado en la misma respuesta.
    +
    Error sin descripci�n.
    +
    Error de sintaxis, el servidor no ha comprendido su solicitud.
    +
    N�mero de intentos por acceder un URL que exige una combinaci�n usuario/contrase�a que ha sido invalida..
    Un n�mero de intentos muy elevado pudiera sugerir la posibilidad de que un hacker (o pirata) ha intentado entrar a una zona restringida del sitio (p.e., intentando m�ltiples combinaciones de usuario/contrase�a).
    +
    N�mero de intentos por acceder un URL configurado para no ser accesible, a�n con una combinaci�n usuario/contrase�a (p.e., un URL previamente definido como "no navegable").
    +
    N�mero de intentos por acceder un URL inexistente. Frecuentemente, �stos se refieren ya sea a un enlace (link) inv�lido o a un error mecanogr�fico cuando el visitante tecle� el URL equivocado.
    +
    El servidor ha tardado demasiado tiempo para responder a una solicitud. Frecuentemente se debe ya sea a un programa CGI muy lento, el cual tuvo que ser abandonado por el servidor, o bien por un servidor sobre-saturado.
    +
    Error interno. Este error generalmente es causado por una terminaci�n anormal o prematura de un programa CGI (p.e., un CGI corrompido o da�ado).
    +
    Solicitud desconocida por el servidor.
    +
    C�digo retornado por un servidor de protocolo HTTP el cual funciona como proxy o puente (gateway) cuando el servidor objetivo no funciona o no interpreta adecuadamente la solicitud del cliente (o visitante).
    +
    Error interno del servidor.
    +
    Pasarela fuera de linea.
    +
    Versi�n de protocolo HTTP no soportada.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-fi.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-fi.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-fi.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,69 @@ + + +
    +T�ss� uudeksi vierailuksi on laskettu sivustolle saapunut vierailija (sivuja selannut), joka ei ole ollut yhteydess� sivustoon viimeisen #VisitTimeOut# minuutin aikana. +
    +
    +Asiakaskoneiden (IP-osoitteiden) m��r�, jotka ovat k�yneet sivustoilla (ja selanneet ainakin yht� sivua).
    +T�m� tieto viittaa eri fyysisten henkil�iden m��r��n, jotka ovat k�yneet sivustolla. +
    +
    +N�ytettyjen sivujen m��r�. (kaikkien vierailujen aikana n�ytettyjen sivujen yhteism��r�).
    +T�m� tieto eroaa kohdasta "osumat" siin�, ett� mukaan lasketaan ainoastaan HTML-sivut, ei kuvia tai muita tiedostoja. +
    +
    +N�ytettyjen tai ladattujen sivujen, kuvien ja tiedostojen yhteism��r�.
    +T�m� tieto tarjotaan ainoastaan viitteeksi, koska markkinointitarkoituksissa suositaan yleens� n�ytettyjen "sivujen" m��r��. +
    +
    +T�m� tieto viittaa sivustoltasi sivujen, kuvien ja tiedostojen muodossa ladatun datan m��r��n.
    +Yksikk�n� Kt, Mt tai Gt (Kilotavu, Megatavu tai Gigatavu) +
    +
    +#PROG# tunnistaa #SearchEnginesArray# suosituimman hakukoneen (kuten Yahoo, Altavista, Lycos, Google, Voila, jne...) hakutulosten avulla sivustolle l�yt�neet. +
    +
    +Luettelo ulkopuolisista sivuista, joilta l�ytyy linkki (jota on seurattu) sivustollesi (N�kyviss� ainoastaan #MaxNbOfRefererShown# useimmin k�ytetty� ulkopuolista sivua). +Hakukoneiden hakutuloksista l�ytyvi� linkkej� ei ole sis�llytetty mukaan, koska n�m� n�kyv�t jo t�m�n taulukon edellisell� rivill�. +
    +
    +T�st� taulukosta n�hd��n luettelo yleisimmist� hakulauseista tai hakusanoista, joiden avulla sivustoillesi on l�ydetty Internetin hakukoneiden ja hakemistojen avulla. +(#PROG# tunnistaa hakusanat #SearchEnginesArray#:sta suosituimmasta hakukoneesta ja hakemistosta, kuten Yahoo, Altavista, Lycos, Google, Voila, jne...).
    +Huomaa, ett� hakusanojen kokonaism��r� voi olla suurempi kuin hakulauseiden (todellinen hakujen m��r�), koska silloin kun kahta hakusanaa on k�ytetty samassa haussa, lasketaan t�m� hakusana-tilastossa kahdesti (jokainen hakusana erikseen). +
    +
    +Robotit (k�ytet��n joskus my�s nimityst� "Spider") ovat automaattisia tietokonevierailijoita, joita useat hakukoneet k�ytt�v�t indeksoidakseen, arvostellakseen ja ker�t�kseen tilastoa sivustoista ja/tai tutkiakseen viel�k� sivustot ovat saatavilla.
    +#PROG# tunnistaa jopa #RobotArray# robottia. +
    +
    +Kaikki kelloaikoihin liittyv�t tilastot perustuvat palvelimen kelloon.
    +
    +
    +T�ss� kerrotut tiedot ovat: keskim��r�isi� arvoja (laskettu kaikkien ensimm�isen ja viimeisimm�n vierailun v�listen tietojen perusteella) +
    +
    +T�ss� kerrotut tiedot ovat: kumulatiivisia summia (laskettu kaikkien ensimm�isen ja viimeisimm�n vierailun v�listen tietojen perusteella) +
    +
    +Jotkut Vierailujen kestot ovat 'tuntemattomia', koska niit� ei aina voida laskea. P��asiallinen syy t�lle on:
    +- Vierailu ei ollut loppunut 'p�ivityksen' tapahtuessa.
    +- Vierailu alkoi kuukauden viimeisen vuorokauden viimesen tunnin aikana (klo 23:00 j�lkeen) (Tekniset syyt est�v�t laskutoimituksen t�llaisessa tapauksessa) +
    + +
    T�lle virheelle ei ole kuvausta.
    +
    Palvelin on ymm�rt�nyt palvelupyynn�n, mutta se k�sitell��n my�hemmin.
    +
    Palvelin on k�sitellyt pyynn�n, mutta l�hetett�v�ksi ei ole mit��n tietoa.
    +
    Osittainen sis�lt�.
    +
    Pyydetty tiedosto on siirretty toiseen, vastauksessa kerrottuun osoitteeseen.
    +
    T�lle virheelle ei ole kuvausta.
    +
    Kielioppivirhe. Palvelin ei ymm�rt�nyt palvelupyynt��.
    +
    Pyydetty URL, johon tarvitaan tunnus/salasana -kaksikko.
    Suuri m��r� n�it� virheit� saattaa tarkoittaa sit�, ett� joku (kuten hakkeri) yritt�� murtautua, tai p��st� sivustoille (toivoen p��tyv�ns� suojatulle alueelle kokeilemalla eri tunnus/salasana -pareja, esimerkiksi).
    +
    Tried to reach an URL not configured to be reachable, even with an login/password pair (for example, an URL within a directory not defined as "browsable".).
    +
    Pyydetty URL, jota ei ole olemassa. T�m� virhe tarkoittaa usein sit�, ett� jossakin sivustollasi on virheellinen linkki, tai ett� vierailija on kirjoittanut URL:n v��rin.
    +
    Server has taken too much time to respond to a request. This error frequently involves either a slow CGI script which the server was required to kill or an extremely congested web server.
    +
    Sis�inen virhe. T�m� virhe on usein ep�normaalisti keskeytyneen CGI-ohjelman aiheuttama (tuloksena esim. coredump).
    +
    Pyydetty toiminto tuntematon.
    +
    V�lityspalvelimena tai yhdysk�yt�v�n� toimivan HTTP-palvelimen palauttama koodi, kun todellinen kohteena ollut palvelin ei vastannut palvelupyynt��n hyv�ksytt�v�sti.
    +
    Palvelimen sis�inen virhe.
    +
    Yhdysk�yt�v�n aikaraja t�yttynyt.
    +
    HTTP-versio ei tuettu.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-fr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-fr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-fr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,77 @@ + + +
    +On consid�re une nouvelle visite pour chaque arriv�e d'un visiteur consultant une page et ne s'�tant pas connect� dans les derni�res #VisitTimeOut# mn. +
    +
    +Nombre de hotes (adresse IP) utilis�s pour acc�der au site (et voir au moins une page).
    +Ce chiffre refl�te le nombre de personnes physiques diff�rentes ayant un jour acc�d�es au site. +
    +
    +Nombre de fois qu une page du site est vue (Cumul de tout visiteur, toute visite).
    +Ce compteur diff�re des "hits" car il ne comptabilise que les pages HTML et non les images ou autres fichiers. +
    +
    +Nombre de fois qu une page, image, fichier du site est vu ou t�l�charg� par un visiteur.
    +Ce compteur est donn� � titre indicatif, le compteur "pages" etant pr�f�r�. +
    +
    +Nombre d'octets t�l�charg�s lors des visites du site.
    +Il s'agit aussi bien du volume de donn�es du au chargement des pages et images que des fichiers t�l�charg�s. +
    +
    +#PROG# est capable de reconnaitre l'acces au site issu d'une recherche depuis les #SearchEnginesArray# moteurs de recherche Internet les plus connus (Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Liste des pages de sites externes contenant un lien suivi pour acc�der � ce site (Seules les #MaxNbOfRefererShown# pages externes les plus utilis�es sont affich�es). +Les liens issus du r�sultat d'un moteur de recherche connu n'apparaissent pas ici, car comptabilis�s � part sur la ligne juste au-dessus. +
    +
    +Ce tableau offre la liste des phrases ou mots cl�s les plus souvent utilis�s pour retrouver et acc�der au site depuis +un moteur de recherche Internet (Les recherches depuis #SearchEnginesArray# moteurs de recherche parmi les plus populaires sont reconnues, comme Yahoo, Altavista, Lycos, Google, Voila, etc...).
    +Notez que le nombre total de recherche de mots cl�s peut �tre sup�rieur au nombre total de recherche de phrases cl�s (nombre r�el de recherche) dans la mesure o� une recherche est compt�e 2 fois (1 pour chaque mot) si 2 mots furent utilis�s comme crit�res. +
    +
    +Les robots sont des automates visiteurs scannant le site dans le but de l'indexer, d'obtenir des statistiques sur les sites Web Internet ou de v�rifier sa disponibili�.
    +#PROG# reconnait #RobotArray# robots. +
    +
    +Toutes les statistiques en rapport avec le temps sont bas�es sur les heures du serveur.
    +
    +
    +Ici les donn�es rapport�es sont des: valeurs moyennes (calcul�es � partir des donn�es entre la premi�re et derni�re visite de la p�riode analys�e) +
    +
    +Ici les donn�es rapport�es sont des: sommes cumul�es (calcul�es � partir des donn�es entre la premi�re et derni�re visite de la p�riode analys�e) +
    +
    +Certaines Dur�e de visites sont 'inconnues' car elles ne peuvent pas toujours etre calcul�es. En voici les raisons principales:
    +- La visite n'�taient pas termin�e lorsque la mise � jour eut lieu (Sera compt�e � la prochaine mise � jour).
    +- La visite a commenc� la derniere heure (apr�s 23:00) du dernier jour du mois (Un raison technique emp�che #PROG# de calculer la dur�e des visites de telles sessions). +
    +
    +Les Vers (Worms) sont des visiteurs automatiques qui sont en fait des serveurs externes infect�s par un virus, +r�alisant des hits particuliers sur votre serveur afin de l'infecter � son tour. Dans la plupart des cas, de telles +attacks exploitent des bugs des serveurs commerciaux et non � jour. +Si votre system n'est pas celui indiqu� comme cible sensible du vers, vous pouvez ignorer de tel hits.
    +Il existe tr�s peu de 'vers serveur' mais il sont tr�s actifs � certaines p�riode. +#PROG# reconnait #WormsArray# signatures de vers connus (nimda,code red,...). +
    + +
    Contenu partiel renvoy�.
    +
    La requ�te a �t� enregistr�e par le serveur mais sera ex�cut�e plus tard.
    +
    Le serveur a trait� la demande mais il n'existe aucun document � renvoyer.
    +
    Contenu partiel renvoy�.
    +
    Le document r�clam� a �t� d�plac� et se trouve maintenant � une autre adresse mentionn�e dans la r�ponse.
    +
    Aucun descriptif pour cette erreur.
    +
    Erreur de syntaxe, le serveur n'a pas compris la requ�te.
    +
    Tentatives d'acc�s � une URL n�cessitant identification avec un login/mot de passe invalide.
    Un nombre trop �l�v� peut mettre en �vidence une tentative de crackage brute du site (par acc�s r�p�t� de diff�rents logins/mots de passe).
    +
    Tentatives d'acc�s � une URL non configur�e pour etre accessible, m�me avec une identification (par exemple, une URL d'un r�pertoire non d�fini comme �tant "listable").
    +
    Tentatives d'acc�s � une URL inexistante. Il s'agit donc d'un lien invalide sur le site ou d'une faute de frappe d'un visiteur qui a saisie une mauvaise URL directement.
    +
    Le serveur mis un temps trop important pour r�pondre � la requ�te. Il peut s'agir d'un script CGI trop lent sur le serveur forc� d'abandonner le traitement ou d'une saturation du site.
    +
    Erreur interne au serveur. Cette erreur est le plus souvant renvoy� lors de l'arr�t anormal d'un script CGI (par exemple suite � un coredump du CGI).
    +
    Le serveur ne prend pas en charge l'action demand�e.
    +
    Code renvoy� par un serveur HTTP qui fonctionne comme proxy ou gateway lorsque le serveur r�el consult� ne r�agit pas avec succ�s � la demande du client.
    +
    Erreur interne au serveur.
    +
    Gateway Time-out.
    +
    Version HTTP non support�.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-gl.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-gl.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-gl.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,74 @@ + + +
    +Unha nova visita defínese por cada novo visitante entrante (accedendo a unha páxina) que non estivera conectado ó sitio durante os últimos #VisitTimeOut# mins.. +
    +
    +Número de máquinas cliente (enderezos IP) que viñeron a visitar o sitio (e que miraron polo menos unha páxina).
    +Este dato refire o número de diferentes persoas físicas que accederan o sitio. +
    +
    +Número de veces que unha páxina deste sitio é vista (Suma de tódolos visitantes para tódalas visitas).
    +Esta dato difire de "accesos" en que somente conta páxinas HTML e non imaxes e outros ficheiros. +
    +
    +Número de veces que unha páxina, imaxe ou ficheiro do sitio e vista ou descargada por alguén.
    +Este dato provese como referencia somente, dado que o número de "páxinas" vistas +é a miudo preferido para propósitos de mercadotecnia. +
    +
    +Este dato refírese á cantidade de datos descargados de tódalas páxinas, imaxes e ficheiros no sitio.
    +As unidades están en KB, MB ou GB (Kilooctetos, Megaoctetos ou Gigaoctetos) +
    +
    +#PROG# recoñece cada acceso ó sitio feito despois dunha procura dende os #SearchEnginesArray# Procuradores e Directorios mais populares da Interrede (como Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Lista de tódalas páxinas externas que foron usadas para enlazar (e entrar) ó sitio (Somente as #MaxNbOfRefererShown# páxinas externas máis frecuentemente usadas son amosadas). +Os enlaces usados polos resultados dos procuradores son excluídos aquí porque xa foron incluídos na liña anterior desta táboa. +
    +
    +Esta táboa amosa a lista de mais frecuentes palabras ou frases clave usadas para atopa-lo sitio dende Procuradores e Directorios da Interrede. (Palabras clave dos #SearchEnginesArray# Procuradores e Directorios mais populares son recoñecidas por #PROG#, como Yahoo, Altavista, Lycos, Google, Voila, etc...).
    +Decátese de que o número total de procuras por palabras clave pode ser maior co número total de procuras por frases clave (número real de procuras) porque cando dúas palabras clave sexan usadas na mesma procura, a procura e contada dúas veces por palabras clave (unha vez por cada palabra). +
    +
    +Os Robots (ás veces refírese a Arañas) son ordenadores automáticos visitantes usados por moitos procuradores que exploran o sitio web para indicalo e clasificalo, recoller estatísticas sobre sitios web da Interrede e/ou mirar se o sitio de vostede está aínda en liña.
    +#PROG# é capaz de recoñecer ata #RobotArray# robots. +
    +
    +Tódalas estadísticas feitas en relación ó tempo están baseadas na hora do servidor.
    +
    +
    +Aquí, os datos expostos son valores medios (calculados a partir de tódolos datos entre a primeira e última visita no rango analizado) +
    +
    +Aquí, os datos expostos son sumas acumulativas (calculados a partir de tódolos datos entre a primeira e última visita en un rango analizado) +
    +
    +Algunhas Duracións de visitas son 'descoñecidas' porque non sempre poden ser calculadas. As principais razóns disto son:
    +- A visita non rematara cando a 'actualización' ocurríu.
    +- A visita escomenzóu na derradeira hora (despois das 23:00) do derradeiro día dun mes (Unha razón técnica evita que #PROG# calcule a duración de tales sesións) +
    +
    +Os Gusanos son ordenadores automáticos visitantes que son de feito servidores externos, infectados por un virus, que intentan realizar accesos particulares no servidor para infectalo. Na maioría dos casos, ditos gusanos explotan algúns erros de servidores sen actualizar ou comerciais. Se o sistema non é o obxectivo sensible do gusano, pódese sinxelamente ignorar estes accesos.
    +Hai moi poucos 'gusanos de servidor' no mundo pero están moi activos ás veces. #PROG# é capaz de recoñecer #WormsArray# sinaturas de gusanos coñecidos (nimda, code red, ...). +
    +
    Error sen descripción.
    +
    A petición foi comprendida polo servidor pero se procesará máis tarde.
    +
    O servidor procesóu a petición pero non hai documento para enviar.
    +
    Contido parcial.
    +
    O documento pedido foi reubicado e está agora noutro enderezo amosado na resposta.
    +
    Error sen descripción.
    +
    Error de sintaxe, o servidor non comprendéu a petición.
    +
    Intentos de acceder un URL onde un par identificador/contrasinal foi requirido.
    Un número alto neste apartado podería significar que alguén (como un intruso) está intentando romper ou introducirse no sitio (esperando entrar nunha área segura probando diferentes pares identificador/contrasinal, por exemplo).
    +
    Intentos de acceder a un URL non configurado para ser accesible, nin siquera con un par identificador/contrasinal (por exemplo, un URL nun directorio non definido como "navegable").
    +
    Intentos de acceder un URL non existente. Este erro a miúdo significa que hai un enlace inválido nalgures no sitio ou que un visitante escribíu mal un certo URL
    +
    O servidor tardóu demasiado tempo para responder unha petición. Este erro frecuentemente implica ben un lento guión (script) CGI que o servidor foi requirido para matar ou ben un servidor web extremadamente conxestionado.
    +
    Erro interno. Este erro é a miúdo causado por un programa CGI que finalizóu anormalmente (volcado de núcleo, por exemplo).
    +
    Acción requirida descoñecida
    +
    Código retornado por un servidor HTTP que funciona como atallo ou pasarela cando un servidor real destinatario non responde axeitadamente á petición do cliente
    +
    Erro interno do servidor.
    +
    A pasarela non responde.
    +
    Versión de HTTP non soportada.
    + + Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-hu.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-hu.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-hu.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,70 @@ + +
    +�j l�togat�snak sz�m�t minden olyan �j be�rkezett l�togat� aki megtekint egy oldalt �s a legutols� l�togat�sa �ta eltelt legal�bb #VisitTimeOut# perc. +
    +
    +Azon egyedi sz�m�t�g�pek sz�ma (IP c�mek) akik az oldalon j�rtak (�s legal�bb egy oldalt megn�ztek).
    +Ez az adat a fizikailag k�l�nb�z� g�pekre vonatkozik ahonnan az oldalt l�togatt�k b�rmelyik nap. +
    +
    +Az oldal �sszes�tett tal�latai (�sszes l�togat� �sszes l�togat�sa).
    +Ez annyiban k�l�nb�zik a "tal�latok"-t�l, hogy csak a HTML oldalak tal�latait �sszes�ti, a k�peket �s egy�b f�jlokat nem. +
    +
    +Oldalak, k�pek, f�jlok �sszes�tett tal�latai �s let�lt�sei.
    +Ez az �sszes�t�s csak referencia c�lokat szolg�l, hiszen marketing szempontb�l az "oldalak tal�latai" adat az �rdekesebb. +
    +
    +Ez az adat az �sszes let�lt�tt adatmennyis�get jelzi bele�rtve az �sszes oldalt, k�pet �s f�jlt +kilob�jt, megab�jt illetve gigab�jt-ban (Kb, Mb, Gb). +
    +
    +Az #PROG# felismeri, ha az oldalakat a #SearchEnginesArray# legismertebb keres�programok egyik�n kereszt�l �rt�k el (p�ld�ul Yahoo, Altavista, Lycos, Google, Voila, stb...). +
    +
    +Az olyan k�ls� oldalak list�ja, amely erre a honlapra mutat, vagy rajtuk kereszt�l �rkezett a k�r�s (Csak a leggyakoribb #MaxNbOfRefererShown# k�ls� oldal). +A keres�k�n kereszt�l �rkezett tal�latok itt nincsenek list�zva, azok az el�z� r�szben tal�lhat�ak. +
    +
    +Ebben a t�bl�zatban tal�lhat�ak a keres�programokban leggyakrabban haszn�lt kulcsszavak �s kifejez�sek amelyeken kereszt�l ezen honlapot megtal�lt�k. +(Az #PROG# a #SearchEnginesArray# leggyakoribb keres�motort ismeri. P�ld�ul Yahoo, Altavista, Lycos, Google, Voila, stb...).
    +Az �sszes keresett kulcssz� sz�ma nagyobb mint a keresett kifejez�sek� (azaz az igazi keres�sek sz�m��) mert +2 keresett kulcssz� eset�n a keres�s k�tszer sz�m�t (egyszer-egyszer mindk�t sz�ra). +
    +
    +A robot-ok (spider-nek vagy webcrawler-nek is mondj�k) automatikus sz�m�t�g�p l�togat�k melyet sz�mos keres�program haszn�l arra hogy az oldalt �tn�zze, index-elje �s kategoriz�lja, statisztik�t gy�jts�n a weboldalakr�l �s/vagy megn�zze, hogy a honlap m�g mindig el�rhet�-e.
    +Az #PROG# #RobotArray# k�l�nb�z� robotot ismer fel. +
    +
    +Minden itt felt�ntetett id�nek a szerverid� szolg�lt alapul. +
    +
    +Az itteni adat �tlagos �rt�k (az els� �s az utols� l�togat�s k�z�tti id�szakra) +
    +
    +Az itteni adat �sszegzett adat (az els� �s az utols� l�togat�s k�z�tti id�szakra) +
    +
    +N�ha a l�togat�si id�szak "ismeretlen"-nek l�tszik, mert nem mindig kisz� +m�that�. Ennek f� okai:
    +- A l�togat�s nem fejez�d�tt be a friss�t�skor.
    +- A l�togat�s a h�nap utols� napj�nak utols� �r�j�ban kezd�d�tt (23:00 ut�n). +
    + +
    Nincs hibale�r�s.
    +
    A k�r�st felismerte a szerver, de csak a k�s�bbiekben feldolgozva v�gre.
    +
    A szerver feldolgozta a k�r�st, de az nem eredm�nyezett kimeneti dokumentumot.
    +
    R�sztartalom.
    +
    A k�rt dokumentum helye megv�ltozott, �j c�m a v�laszban.
    +
    Nincs hibale�r�s.
    +
    Szintaktikai hiba, a szerver nem �rtette a k�r�st.
    +
    Jelsz�v�dett tartalom sikertelen el�r�se.
    Nagysz�m� ilyen hiba jelentheti azt, hogy valaki (egy hacker) megpr�b�l el�rni egy jelsz�v�dett oldalt felhaszn�l�i nevek �s jelszavak folyamatos pr�b�lgat�s�val.
    +
    Nem tall�zhat� k�nyvt�r (m�g felhaszn�l� azonos�t� �s jelsz� ismeret�ben sem) (p�ld�ul egy k�nyvt�ron bel�li "tall�z�sra" nem enged�lyezett link).
    +
    Nem l�tez� oldal (URL). �rv�nytelen link, mely lehet az oldalon bel�l, m�s k�ls� oldalon, vagy csak a l�togat� v�tett hib�t a be�r�s k�zben.
    +
    A szerver t�l sok�ig nem v�laszolt. �ltal�ban lass� CGI program vagy nagyon leterhelt szerver eset�n fordul el�.
    +
    Bels� hiba. �ltal�ban CGI program abnorm�lis fut�sa ut�n keletkezik (pl. coredump).
    +
    Ismeretlen k�r�st�pus.
    +
    Proxy szerver hibak�d, melyet a t�voli szerver sikeres v�lasz�nak hi�ny�ban k�ld a k�r�st k�ld� kliensnek.
    +
    Bels� szerverhiba.
    +
    Gateway id�t�ll�p�s.
    +
    Nem t�mogatott verzi�j� HTTP k�r�s.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-is.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-is.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-is.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,69 @@ + + +
    +Nýtt innlit er skilgreint þannig: Gestur sem ekki hefur komið inn á síðustu #VisitTimeOut# mínútum (vafrandi eða lesandi). +
    +
    +Fjöldi véla (IP vistfanga) sem litu inn á vefinn (Að lágmarki ein vefsíða sótt).
    +Gögnin gefa til kynna fjölda einkvæmra gesta sem litu inn á síðuna. +
    +
    +Hversu oft síða hefur verið skoðuð (Samtals allir gestir og öll innlit).
    +Munurinn á þessu gögnum og "skrár" liggur í því að eingöngu eru taldar HTML síður en ekki myndir eða annars konar skrár. +
    +
    +Hversu oft síða, mynd eða skrá á vefnum er skoðuð eða sótt af einhverju(m).
    +Þetta er einungis haft með til upplýsingar þar sem fjöldi "gesta" og fjöldi "innlita" eru betri markaðsgögn. +
    +
    +Gögnin gefa mynd af því gagnamagni sem sótt er af vefnum, síðum, myndum og skrám.
    +Einingar eru í KB, MB eða GB(Kílóbæti, Megabæti eða Gígabæti) +
    +
    +#PROG# greinir hvert innlit á vefinn eftir leit í #SearchEnginesArray# vinsælustu leitarvélunum (Yahoo, Altavista, Lycos, Google, Voila, o.s.frv.). +
    +
    +Listi yfir allar utanvefs tilvísannir á öðrum vefum sem notaðar hafa verið til að sækja/líta inn á vefinn (Einungis #MaxNbOfRefererShown# oftast notuðu tilvísanirnar). +Tilvísanir sem notaðar hafa verið við útreikninga í tengslum við innlit frá leitarvélum eru ekki reiknaðar inn í þessar niðurstöður, þar sem þeir hafa verið notaðir í línunni fyrir ofan. +
    +
    +Taflan sýnir þau leitarorð og setningar sem oftast hefur verið leitað eftir á leitarvélum til að finna vefinn. +Leitarorð frá #SearchEnginesArray# algengustu leitarvélunum sem #PROG# þekkir, svo sem Yahoo, Altavista, Lycos, Google, Voila, o.s.frv.).
    +Ath ber að samtala leita með leitarorðum getur verið hærra en samtala leita með setningum (réttur fjöldi leita) því að ef notuð eru tvö orð í leit er leitin talin tvisvar sem orðaleit en einu sinni sem setningaleit. +
    +
    +Leitarvélar(robots eða spiders) eru 'sjálfvirkir gestir' notaðir af mörgum leitarvélum sem skoða, skrásetja og flokka innihald/gögn vefsins. Safna tölulegum upplýsingum um tilvísannir og/eða hvort hægt er að sækja síðuna/vefinn.
    +#PROG# þekkir #RobotArray# leitarvélar. +
    +
    +Allar tölulegar upplýsingar varðandi tíma eru tengdar tíma þjónustuvélar.
    +
    +
    +Niðurstaða samantektar: meðaltal (Reiknað út frá öllum gögnum frá fyrsta innliti til þess síðasta) +
    +
    +Niðurstaða samantektar: samanteknar samtöluri (Reiknað út frá öllum gögnum frá fyrsta innliti til þess síðasta) +
    +
    +Lengd innlita er ekki alltaf hægt að reikna. Helstu ástæður þess eru eftirfarandi:
    +- Innliti var ekki lokið þegar tölfræðin var reiknuð.
    +- Innlit byrjar á síðasta klukkutíma (eftir kl 23:00) sólarhrings síðasta dags mánaðar (Tæknileg ástæða innan #PROG# kemur í veg fyrir að slík innlit séu reiknuð) +
    + +
    Lýsingu á villunni vantar.
    +
    Þjónninn skildi beiðnina en afgreiðir hana síðar.
    +
    Þjónninn hefur afgreitt beiðnina en það vantar skránna til að senda.
    +
    Einungis hluti skráar afgreiddur.
    +
    Umbeðin skrá hefur verið færð á nýtt veffang sem sent var með afgreiðslunni.
    +
    Lýsingu á villunni vantar.
    +
    Stílvilla, þjónninn skildi ekki beiðnina.
    +
    Beðið var um afgreiðslu á síðu þar sem aðgangsstýringar er krafist.
    Ef mikið er um þetta getur það bent til þess að tilraunir séu gerðar til að brjótast inn á síðu/skrá með mörgum samsetningum af notendanöfnum og lykilorðum(til að fá aðgang að gögnum sem háð aðgangsstýringum).
    +
    Beðið var um afgreiðslu á síðu/skrá sem ekki á að vera aðgengilegt með eða án aðgangsstýringa(notendanafi og lykilorði) (Gæti verið mappa sem ekki er merkt "vafranleg".).
    +
    Beðið var um síðu/skrá sem ekki er hægt að afgreiða. Villan kemur oft upp þegar hlekkur á vefsíðu inniheldur stílvillu eða gestur slær inn í vafrann sinn vitlausa slóð.
    +
    Þjónninn hefur tekið of langann tíma í beiðnina. Þessi villa getur gefið til kynna mikið álag, hægann CGI hugbúnað, timeout villur á þjóni(stilla) eða illa skrifaðan hugbúnað.
    +
    Innri villa hefur komið upp á þjóni, villan gefur til kynna að hugbúnaður hafi endað keyrslu óeðlilega.
    +
    Umbeðin afgreiðsla er ekki þekkt.
    +
    Villuboð sem skilað er af vefþjóni sem þjónar sem safnari eða gátt þegar umbeðin þjónustuvél svarar ekki fyrirspurnum frá gestum.
    +
    Innri villa hefur komið upp á þjóni.
    +
    Samband rofnaði við gátt.
    +
    HTTP útgáfa er ekki studd.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-it.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-it.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-it.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,69 @@ + + +
    +Si considera una nuova visita per ogni arrivo di un visitatore che visualizza o consulta una pagina e non si è connesso negli ultimi #VisitTimeOut# minuti. +
    +
    +Numero di client hosts (indirizzi IP) utilizzati per accedere al sito (e visualizzare almeno una pagina).
    +Questa cifra riflette il numero di persone fisiche differenti che un giorno hanno visitato il sito. +
    +
    +Numero di volte che una pagina del sito è stata vista (somma di tutti i visitatori, per tutte le visite).
    +Questo valore è diverso dagli "hits" perchè considera solamente le pagine HTML e non le immagini o gli altri elementi. +
    +
    +Numero di volte che una pagina, immagine o elemento del sito è visto o scaricato da un visitatore.
    +Questo valore è indicativo, in quanto il contatore "pagine" a volte è più significativo ai fini commerciali. +
    +
    +Numero totale di kilobytes scaricati dal sito durante le visite.
    +Indica il volume di traffico dovute alle richieste di caricamento delle pagine, delle immagini e degli altri elementi scaricati. +
    +
    +#PROG# è capace di riconoscere gli accessi al sito provenienti dalle ricerche dei #SearchEnginesArray# motori di ricerca Internet più conosciuti (Yahoo, Altavista, Lycos, Google, Voila, ecc...). +
    +
    +Elenco delle pagine di siti esterni contenenti un link che è stato seguito per accedere a questo sito (solo le #MaxNbOfRefererShown# pagine esterne più utilizzate sono visualizzate). +I link risultanti da una ricerca di un motore conosciuto non appaiono qui, dato che sono conteggiati a parte sulla linea subito sopra. +
    +
    +Questa tabella offre la lista delle parole o frasi più frequentemente utilizzate per rintracciare e accedere al sito a partire da +un motore di ricerca Internet (sono riconosciute le ricerche dei #SearchEnginesArray# motori di ricerca più popolari, come Yahoo, Altavista, Lycos, Google, Voila, ecc...).
    +Notare che il numero di ricerche sulle parole potrebbe essere maggiore del numero riportato nelle frasi (il numero reale di ricerche) perch� quando la stessa parola compare pi� volte su diverse frasi, nell'elenco delle parole viene conteggiata pi� volte (una volta per frase). +
    +
    +I robots sono dei visitatori automatici che perlustrano il sito al fine di indicizzarlo, di ottenere delle statistiche sui siti Web Internet o di verificarne l'accessibilità.
    +#PROG# riconosce #RobotArray# robots. +
    +
    +Gli orari visualizzati sono basati sul fuso orario del server.
    +
    +
    +I valori riportati sono: valori medi (calcolati prendendo in considerazione tutti i dati tra la prima e l'ultima visita) +
    +
    +I valori riportati sono: cumulativi (calcolati prendendo in considerazione tutti i dati tra la prima e l'ultima visita) +
    +
    +Alcune durate delle visite sono 'sconosciute' perch� non possono essere sempre calcolate. Questi sono i casi pi� ricorrenti:
    +- La visita non era ancora conclusa quando sono state aggiornate ('update' di awstats) le statistiche.
    +- La visita � iniziata durante l'ultima ora (dopo le 23:00) dell'ultimo giorno del mese (Una ragione tecnica impedisce ad #PROG# di calcolare la durata di queste sessioni) +
    + +
    Contenuto parziale restituito.
    +
    La richiesta è stata registrata del server ma sarà eseguita più tardi.
    +
    Il server ha processato la richiesta ma non esiste alcun documento da ritornare.
    +
    Contenuto parziale restituito.
    +
    Il documento richiesto è stato spostato e si trova al momento a un altro indirizzo, indicato nella risposta.
    +
    Il documento richiesto è stato spostato e si trova al momento a un altro indirizzo, indicato nella risposta.
    +
    Errore di sintassi, il server non ha compreso la richiesta.
    +
    Tentativo di accesso non autorizzato a un URL che richiede un'autenticazione con un login o una parola di accesso.
    Un numero troppo elevato può evidenziare un tentativo di accesso mediante forza bruta al sito (a seguito di accesso ripetuto con differenti nomi di login o parole di accesso).
    +
    Tentativo di accesso a un URL non configurato per essere accessibile, anche se corretto (ad esempio, un URL di una directory indicata come non "listabile").
    +
    Tentativo di accesso a una risorsa o URL inesistente. SI tratta dunque di un link non valido sul sito o di un errore di battitura del visitatore che ha indicato un URL non corretto.
    +
    Il server ha impiegato un tempo troppo lungo per rispondere alla richiesta. Può trattarsi di uno script CGI troppo lento obbligato ad abbandonare la richiesta, o di un timeout dato dalla saturazione del sito.
    +
    Errore interno del server. Questo errore è quello ritornato più di frequente durante la terminazione anormale di uno script CGI (per esempio in seguito a un coredump del CGI).
    +
    Il server non prende in carico l'azione richiesta.
    +
    Codice ritornato da un server HTTP che funziona da proxy o gateway quando il server reale chiamato non risponde alla richiesta del client.
    +
    Errore interno del server.
    +
    Time-out del gateway.
    +
    Versione HTTP non supportata.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-jp.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-jp.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-jp.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,63 @@ + + +
    +#VisitTimeOut# 分前までの訪問数。 +
    +
    +最低1ページを訪問したクライアントホスト(IPアドレス)。
    +これは訪問者の実数です。 +
    +
    +
    +ページが表示された回数(すべての訪問者と訪問の合計)。
    +このデータは「件数」とは違い、HTMLファイルのみが入っています。 +
    +
    +ページ、画像、ファイルが表示された回数。
    +参照程度にお使いください。 +
    +
    +すべてのページ、画像、ファイルのダウンロードによるデータ転送量。
    +単位は KB 、MB または GB 。 +
    +
    +人気のある検索エンジン(Yahoo、Altavista、Lycos、Google、Voilaなど)での検索によるアクセス。 +
    +
    +ユーザー(コンピュータ)がこのサイトについての情報を得た外部ページ。 +
    +
    +このサイトにアクセスするために検索エンジンで入力されたキーワードのリスト。 +
    +
    +ロボット(別名スパイダー)とは、ウェブ中を動き回って全てのコンテンツを中央サーバー上に保存するコンピューター・プログラム。
    +
    +これらのデータはサーバー時間に基づいています。
    +
    +
    +最初から最後までの訪問で集めたデータによって計算した平均数。 +
    +
    +最初から最後までの訪問で集めたデータによって計算した総数。 +
    + +
    POST が成功。またはPUT が新しいオブジェクトを作成。
    +
    要求は、受付たが、処理未完了。
    +
    サーバーは要求を受付けたが、返す情報がない。
    +
    サーバーは、情報の一部を得た。
    +
    要求された情報は、恒久的に移動した。
    +
    要求された情報は、一時的に移動した。
    +
    要求を実行できない。(構文が不正)
    +
    情報の要求に認証を必要とする。または、認証の拒否。
    +
    要求の拒否。認証が不完全。
    +
    要求された情報(ファイル)がない。
    +
    サーバーが待機時間内にクライアントが要求を送れなかった。
    +
    予期しないサーバーエラーのため、要求を実行できなかった。
    +
    サーバーは、要求された機能をサポートしていない。
    +
    クライアントより見て、ゲートウエイまたはプロキシーサーバの接続先サーバの応答が妥当でないことを示す。
    +
    サービス(サーバー)が高負荷。Retry-Afterヘッダに示す時間後には緩和される。応答文中にRetry-Afterヘッダがなければ、クライアントは応答を500番と同等に扱う必要がある。
    +
    ゲートウエイまたはプロキシの応答がゲートウエイの指定時間内に得られない。
    +
    HTTP バージョンをサポートしていない。
    + + + Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-kr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-kr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-kr.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,62 @@ + + +
    +���ο� �湮�� ������(#VisitTimeOut# ���̳�) +����� ����Ʈ�� �������� ����(���ų� ����¡ ���� ����) ���ο� +�湮���� ��Ÿ���ϴ�. +
    +
    +Ŭ���̾�Ʈ ȣ��Ʈ ��(IP �ּ�)�� �湮�� ����Ʈ ���� ��Ÿ���ϴ�.(�ּ��� �� �������� �� ����Ʈ)
    +�� �ڷ�� �Ϻ� ���������� �ٸ� ��������� ��Ÿ���ϴ�. +
    +
    +����Ʈ���� ��(view) ������ ȸ���� ��Ÿ���ϴ�. +(��� �湮���� ��)
    + �� �ڷ�� �̹���, ���ϰ� �޸� HTML ������������ "��ȸ��(hit)"�ʹ� �ٸ��ϴ�. +
    +
    +������, �̹���, ������ ���ų� �ٿ�ε��� ȸ���� ��Ÿ���ϴ�.
    +�� �ڷ�� ���������θ� �����˴ϴ�. �ֳ��ϸ� �� "������"�� ���� �������� �������� ���� �� �ֱ� �����Դϴ�. +
    +
    +�� �������� �ٿ�ε��� ��� ������, �̹���, ���� ���� Kb������ ��Ÿ���ϴ�. +
    +
    +#PROG# �� #SearchEnginesArray#�� �˻����� ����� ����Ʈ�� ���� ������ �ĺ��� �� �ֽ��ϴ�. +
    +
    +����� ����Ʈ�� ��ũ�� ��� �ܺ� ������
    +(#MaxNbOfRefererShown#�� ���� ���� ���Ǵ� �ܺ� �������� ��Ÿ���ϴ�.) + �˻� ������ ���� ����������� ���� ��ũ�� ���⿡�� ���ܵ˴ϴ�. + (�� ���̺��� ������ �̹� ���� �ֽ��ϴ�.) +
    +
    +�� ���̺��� ����� ����Ʈ���� ���� ���� ���Ǵ� Ű���� ����� �����ݴϴ�. + (���� ��ȣ�ϴ� �˻����� Yahoo, Altavista, Lycos, Google, Voila��� ���� +#SearchEnginesArray#�� Ű���带 #PROG#�� �ĺ��� �� �ֽ��ϴ�. +
    +
    +�κ�Ʈ (���δ� �����̴��� ����)�� ���� �˻� �������� ���Ǵ� +�ڵ�ȭ�� ������ �����Դϴ�. �� ������ (1) ������Ʈ�� ���ȭ�ϰ� +������ �ο��ϰ� (2) ���ͳ� �� ����Ʈ�� ��踦 �����ϰ� (3) ����� +����Ʈ�� ������ ��밡������ �����մϴ�.
    +#PROG#�� #RobotArray# �κ�Ʈ�� �ĺ��� �� �ֽ��ϴ�. +
    + +
    �� ������ ���� ������ �����ϴ�.
    +
    ��û�� ������ ���� ���̻� ����� �� �����ϴ�.
    +
    ������ ��û�� ó�������� ������ ������ �����ϴ�.
    +
    �Ϻ� ����.
    +
    ��û�� ������ �Ű����� �ٸ� �ּҸ� ����մϴ�.
    +
    �� ������ ���� ������ �����ϴ�.
    +
    ���� ����, ������ �� ��û�� �� �� �����ϴ�.
    +
    URL�� ������ ���ؼ��� �α���/�н����� �� �ʿ��մϴ�.
    �� �׸��� �ְ��� ������ ũ���� �õ��ϰų� ����� ����Ʈ�� ������ �õ��ϰ� �ִ� ��(�ٸ� �α���/�н����带 ����Ͽ� �õ��ϴ°�) �� �ǹ��մϴ�.
    +
    ��밡���ϰ� �����Ǿ� ���� �ʴ� URL�� ���� ���ӽõ� ���� �Դϴ�. (���� ���, ���丮���Դ��� "����¡"�� ���ǵ��� ���� ����Դϴ�.)
    +
    �������� �ʴ� URL�� ���� ���� �õ� �����Դϴ�. �� ������ ���� ����� ����Ʈ ��򰡿��� �߸��� ��ũ�� �־� �湮�ڵ��� �߸��� URL�� �����ϴ� ��쿡 �߻��մϴ�.
    +
    �������� ��û�� ���� �ʹ� ���� ���� �ð��� �䱸�մϴ�. �� ������ ���� ���� CGI ��ũ��Ʈ �����̰ų� ������ ��뷮�� ���� ��쿡 �߻��մϴ�.
    +
    ���� ����. �� ������ ���� CGI���α׷��� ������������ ����Ǿ��� �� �߻��մϴ�.
    +
    ��û�� ������ �˼� �����ϴ�.
    +
    HTTP ������ ���� �ݼ۵� �ڵ尡 �����ó� ����Ʈ���̷� �����մϴ�. ��� ������ Ŭ���̾�Ʈ�� ��û�� ��Ȯ�ϰ� ������ ���� ���մϴ�.
    +
    ���� ���� ����.
    +
    ����Ʈ���� �ð��ʰ�.
    +
    HTTP ������ �������� �ʽ��ϴ�.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nb.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nb.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nb.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,62 @@ + + +
    +Ett nytt bes�k er en ny gjest som ikke har v�rt tilkoplet nettstedet siste #VisitTimeOut# min. +
    +
    +Antall klientverter (IP-adresser) som har bes�kt nettstedet, og har sett minst en side).
    +Denne informasjonen gjelder antallet forskjellige personer som har bes�kt siden. +
    +
    +Antall ganger en side p� nettstedet har blitt vist.
    +Denne informasjonen skiller seg fra �treff� ved � bare telle HTML-sider, og ikke bilder og andre filer. +
    +
    +Antall ganger en side, et bilde eller en fil p� nettstedet har blitt vist eller lastet ned. +
    +
    +Denne informasjonen viser hvor mye data som har blitt lastet ned totalt (sider, bilder eller andre filer).
    +Enhetene er KB, MB eller GB (kilobyte, megabyte eller gigabyte) +
    +
    +#PROG# kan se n�r et bes�k p� nettstedet ditt kommer fra et s�k p� de #SearchEnginesArray# mest popul�re s�kemotorene og emnekatalogane (f.eks. Yahoo, Altavista, Lycos, Google og Kvasir). +
    +
    +Liste over alle eksterne sider som har lenker til nettstedet ditt (bare de #MaxNbOfRefererShown# mest brukte eksterne sider blir vist). +Lenker fra s�kemotorer er ikke inkludert her, siden disse allerede er oppf�rt i forrige del av denne tabellen. +
    +
    +Denne tabellen viser de mest brukte s�keordene brukt til � finna nettstedet ditt i s�kemotorer og emnekataloger. +(S�keord fra de #SearchEnginesArray# mest popul�re s�kemotorene og emnekatalogene kan leses av #PROG#, f.eks. Yahoo, Altavista, Lycos, Google, og Kvasir). +
    +
    +Roboter blir brukt av mange s�kemotorer som bes�ker nettstedet ditt for � indeksere og rangere det, samle statistikk om nettsteder, og/eller se om nettstedet fremdeles er tilgjengelig.
    +#PROG# kjenner til #RobotArray# roboter. +
    +
    +All tidsrelatert statistikk er basert p� tjenertid.
    +
    +
    +Rapporterte tall er gjennomsnittsverdier (regnet ut fra alle data mellom f�rste og siste bes�k) +
    +
    +Rapporterte tall er kumulative summer (regnet ut fra alle data mellom f�rste og siste bes�k) +
    + +
    Ingen beskrivelse av denne feilen.
    +
    Foresp�rselen var forst�tt av tjeneren men vil bli prosessert senere.
    +
    Tjeneren har prosessert foresp�rselen men har ikke noe innhold � sende.
    +
    Delvis innhold.
    +
    Det forespurte dokumentet er flyttet, og finnes n� p� en annen side. Brukeren blir automatisk videresendt til den nye adressen.
    +
    Ingen beskrivelse av denne feilen.
    +
    Syntaksfeil. Tjeneren forsto ikke foresp�rselen.
    +
    Pr�vde � hente en side som var passordbeskyttet.
    Mange slike feilmeldinger kan bety at noen pr�ver � bryte seg inn p� nettstedet ditt.
    +
    Pr�vde � hente en side som er utilgjengelig (selv med passord) (for eksempel en katalog som er definert som ikke lesbar).
    +
    Pr�vde � hente en ikke-eksisterende side. Denne feilen betyr oftest at det er en lenke en eller annen plass p� nettstedet ditt (eller p� en ekstern side) som ikke fungerer, og som m� oppdateres.
    +
    Tjeneren har brukt for mye tid p� � svare p� en foresp�rsel. Denne feilen gjelder enten et tregt CGI-skript tjenaren m�tte avslutte, eller tungt trafikkert tjenar.
    +
    Intern feil. Denne feilen kommer ofte av CGI-skript som har blitt avsluttet unormalt.
    +
    Ukjent foresp�rsel.
    +
    Kode returnert av ein HTTP-tjener som fungerer som proxy eller systemport n�r en ekte tjener ikke svarer p� foresp�rselen.
    +
    Intern tjenerfeil.
    +
    Systemport tidsavbrutt.
    +
    St�tter ikke HTTP-versjonen.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nl.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nl.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nl.txt 1 Mar 2005 17:35:40 -0000 1.1 @@ -0,0 +1,53 @@ + +
    +Een nieuw bezoek is elke binnenkomende bezoeker (die een pagina bekijkt) die de laatste #VisitTimeOut# mn niet met uw site verbonden was. +
    +
    +Aantal client hosts (IP adres) die de site bezochten (en minimaal een pagina bekeken).
    +Dit geeft aan hoeveel verschillende fysieke personen de site op een bepaalde dag bezocht hebben. +
    +
    +Aantal malen dat een pagina van de site bekeken is (Som voor alle bezoekers voor alle bezoeken).
    +Dit onderdeel verschilt van "hits" in het feit dat het alleen HTML pagina's telt, in tegenstelling tot plaatjes en andere bestanden. +
    +
    +Aantal malen dat een pagina, plaatje of bestand op de site door iemand is bekeken of gedownload.
    +Dit onderdeel is alleen als referentie gegeven, omdat het aantal bekeken "pagina's" voor marketingdoeleinden de voorkeur heeft. +
    +
    +Aantal door uw bezoekers gedownloade kibibytes.
    +Dit onderdeel geeft de hoeveelheid gedownloade gegevens in alle pagina's, plaatjes en bestanden van uw site, gemeten in KiBs. +
    +
    +Dit programma, #PROG#, herkent elke benadering van uw site na een zoekopdracht van de #SearchEnginesArray# meest populaire Internet zoekmachines (zoals Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Lijst van alle externe pagina's die zijn gebruikt om naar uw site te linken (of deze te benaderen) (Alleen de #MaxNbOfRefererShown# meest gebruikte externe pagina's zijn getoond. +Links gebruikt door de resultaten van zoekmachines worden hiet niet getoond omdat deze al zijn opgenomen in de vorige regel van deze tabel. +
    +
    +Deze tabel toont de lijst van keywords die het meest zijn gebruikt om uw site te vindein in Internet zoekmachines. +(Keywords van de #SearchEnginesArray# meest populaire zoekmachines worden door #PROG# herkend, zoals Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Robots (soms Spiders genoemd) zijn automatische bezoekcomputers die door veel zoekmachines worden gebruikt om uw site te scannen om (1) deze te indexeren, (2) statistieken over Internet sites te verzamelen en/of (3) te kijken of site nog steeds on-line is.
    +Dit programma, #PROG#, is in staat maximaal #RobotArray# robots te herkennen. +
    + +
    Geen beschrijving voor deze foutmelding.
    +
    De server heeft het verzoek begrepen, maar zal deze later behandelen.
    +
    De server heeft het verzoek verwerkt, maar er is geen document om te verzenden.
    +
    Gedeeltelijke inhoud.
    +
    Het aangevraagde document is verplaatst en is nu op een andere locatie die in het antwoord gegeven is.
    +
    Geen beschrijving voor deze foutmelding.
    +
    "Taalfout", de server begreep het verzoek niet.
    +
    Er is gepoogd een URL waarvoor een usernaam/wachtwoord noodzakelijk is te benaderen.
    Een hoog aantal van deze meldingen kan betekenen dat iemand (zoals een hacker) probeert uw site te kraken, of uw site binnen te komen (pogend een beveiligd onderdeel van uw site te benaderen door verschillende usernamen/wachtwoorden te proberen, bijvoorbeeld).
    +
    Er is gepoogd een URL die is ingesteld om niet benaderbaar te zijn, zelfs met usernaam/wachtwoord te benaderen (bijvoorbeeld, een URL in een directory die niet "doorbladerbaar" is).
    +
    Er is gepoogd een niet bestaande URL te benaderen. Deze fout betekent vaak dat er een ongeldige link in uw site zit of dat een bezoeker een URL foutief heeft ingevoerd.
    +
    De server heeft er te lang over gedaan om een antwoord op een aanvraag te geven. Het kan een CGI script zijn dat zo traag is dat de server hem heeft moeten afbreken of een overbelaste web server.
    +
    Interne fout. Deze error wordt vaak veroorzaakt door een CGI programma dat abnormaal is beeindigd (een core dump, bijvoorbeeld).
    +
    Onbekende actie aangevraagd.
    +
    Melding die door een proxy of gateway HTTP server wordt gegeven als een echte doelserver niet succesvol op de aanvraag van een client antwoordt.
    +
    Interne server fout.
    +
    Gateway time-out.
    +
    HTTP versie niet ondersteund.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nn.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nn.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-nn.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,68 @@ + + +
    +Eit nytt bes�k er ein ny gjest som ikkje har vore tilkopla nettstaden siste #VisitTimeOut# minutt. +
    +
    +Talet p� klientvertar (IP-adresser) som har bes�kt nettstaden, og har sett minst �i side).
    +Denne informasjonen gjeld talet p� forskjellige personar som har bes�kt sida. +
    +
    +Talet p� gongar ei side p� nettstaden har blitt vist.
    +Denne informasjonen skil seg fr� �treff� ved � berre telja HTML-sider, og ikkje bilde og andre filer. +
    +
    +Talet p� gongar ei side, eit bilde eller ei fil p� nettstaden har blitt vist eller lasta ned. +
    +
    +Denne informasjonen viser kor mykje data som har blitt lasta ned totalt (sider, bilde eller andre filer).
    +Einingane er KiB, MiB eller GiB (kibibyte, mebibyte eller gibibyte) +
    +
    +#PROG# kan sj� n�r eit bes�k p� nettstaden din kjem fr� eit s�k p� dei #SearchEnginesArray# mest popul�re s�kjemotorane og emnekatalogane (f.eks. Yahoo, Altavista, Lycos, Google og Kvasir). +
    +
    +Liste over alle eksterne sider som har lenkjer til nettstaden din (berre dei #MaxNbOfRefererShown# mest brukte eksterne sider blir vist). +Lenkjer fr� s�kjemotorar er ikkje tatt med her, d� desse allereie er oppf�rt i tidlegare i tabellen. +
    +
    +Denne tabellen viser dei mest brukte s�kjeorda og s�kjeuttrykka brukt til � finna nettstaden i s�kjemotorar og emnekatalogar. +(S�kjeord fr� dei #SearchEnginesArray# mest popul�re s�kjemotorane og emnekatalogane kan lesast av #PROG#, f.eks. Yahoo, Altavista, Lycos, Google, og Kvasir).
    +Merk at talet p� s�kjeord kan vera h�gare enn talet p� s�kjeuttrykk, for n�r to eller fleire s�kjeord blir brukt i same s�k, vil kvart ord telja med i oversikta over s�kjeord. +
    +
    +Robotar blir brukt av mange s�kjemotorar som bes�kjer nettstaden din for � indeksera og rangera han, samla statistikk om nettstader, og/eller sj� om nettstaden framleis er tilgjengeleg.
    +#PROG# kjenner til #RobotArray# robotar. +
    +
    +All tidsrelatert statistikk er basert p� tenartida.
    +
    +
    +Rapporterte tal er gjennomsnittsverdiar (rekna ut fr� all data mellom f�rste og siste bes�k i analyseperioden) +
    +
    +Rapporterte tal er kumulative summar (rekna ut fr� all data mellom f�rste og siste bes�k i analyseperioden) +
    +
    +Nokre bes�kslengder er �ukjente� fordi dei ikkje kan reknast ut. Hovudgrunnane for dette er:
    +– Bes�ket er ikkje ferdig n�r rapportoppdateringa skjer.
    +– Bes�ket starta etter klokka 23:00 p� den siste dagen i m�naden. (Tekniske grunnar hindrar AWStats � rekna ut bes�kslengda i desse tilfella.) +
    + +
    Inga beskriving av denne feilen.
    +
    F�respurnaden vart forst�tt av tenaren men vil bli prosessert seinare.
    +
    Tenaren har prosessert f�respurnaden men har ikkje noko innhald � senda.
    +
    Delvis innhald.
    +
    Det f�respurte dokumentet er flytta, og finst no p� ei anna sida. Brukaren blir auomatisk vidaresendt til den nye adressa.
    +
    Inga beskriving av denne feilen.
    +
    Syntaksfeil. Tenaren forsto ikkje f�respurnaden.
    +
    Pr�vde � henta ei side som var passordsikra.
    Mange slike feilmeldingar kan tyda p� at nokon pr�ver � bryta seg inn p� nettstaden din.
    +
    Pr�vde � henta side som er utilgjengeleg (sj�lv med passord) (for eksempel ein katalog som er definert som ikkje lesbar).
    +
    Pr�vde � henta ei ikkje-eksisterande side. Denne feilen tyder oftast at det er ei lenkje ein eller annan plass p� nettstaden din (eller p� ei ekstern side) som ikkje fungerer, og som m� oppdaterast.
    +
    Tenaren har brukt for mykje tid p� � svara p� ein f�respurnad. Denne feilen gjeld enten eit treigt CGI-skript tenaren m�tte avslutta, eller tungt trafikkert tenar.
    +
    Intern feil. Denne feiled kjem ofte av CGI-skript som har blitt avslutta unormalt.
    +
    Ukjent f�respurnad.
    +
    Kode returnert av ein HTTP-tenar som fungerer som proxy eller systemport n�r ein ekte tenar ikkje svarer p� f�respurnaden.
    +
    Intern tenarfeil.
    +
    Systemport tidsavbroten.
    +
    St�ttar ikkje HTTP-versjonen.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-pl.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-pl.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-pl.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,68 @@ + + +
    +Wizyty ka�dego nowego go�cia, kt�ry ogl�da� stron� i nie ��czy� si� z ni� przez ostatnie #VisitTimeOut# mn. +
    +
    +Adres numeryczny hosta klienta (tzw. adres IP) odwiedzaj�cego t� stron�.
    +Ten numer mo�e by� identyczny dla kilku r�nych Internaut�w kt�rzy odwiedzili stron� tego samego dnia. +
    +
    +�rednia liczba obejrzanych stron przypadaj�ca na jednego Internaut�. (Suma go�ci, wszystkich wizyt).
    +Ten licznik r�ni si� od kolumny z prawej, gdy� zlicza on tylko strony html (bez obrazk�w i innych plik�w). +
    +
    +Liczba wszystkich stron, obrazk�w, d�wi�k�w, plik�w, kt�re zosta�y obejrzane lub �ci�gni�te przez kogo�.
    +Warto�� jest jedynie orientacyjna, zaleca si� spogl�da� na licznik "strony". +
    +
    +Liczba kilobajt�w �ci�gni�tych przez Internaut�w.
    +Jest to suma wszystkich �ci�gni�tych danych (strony html, obrazki, d�wi�ki). +
    +
    +#PROG# rozr�nia dost�p do stron z zagranicznych wyszukiwarek dzi�ki #SearchEnginesArray# najpopularniejszym przegl�darkom internetowym (Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Lista wszystkich stron spoza serwera z kt�rych trafiono na ten serwer (wy�wietlanych jest #MaxNbOfRefererShown# stron z kt�rych najcz�ciej si� odwo�ywano. +
    +
    +Ta kolumna pokazuje list� najcz�ciej u�ywanych s��w kluczowych, dzi�ki kt�rym znaleziono t� stron� w wyszukiwarkach. +(#PROG# rozr�nia zapytania s��w kluczowych z #SearchEnginesArray# najpopularniejszych wyszukiwarek, takich jak Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    +Roboty s� programami sieciowymi skanuj�cymi strony w celu zebrania/aktualizacji danych (np. s�owa kluczowe do wyszukiwarek), lub sprawdzaj�cymi czy strona nadal istnieje w sieci.
    +#PROG# rozr�nia obecnie #RobotArray# rob�w. +
    +
    +Wszystkie statystyki bazuj� na czasie serwera.
    +
    +
    +Here, reported data are: average values (calculated from all data between the first and last visit) +
    +
    +Here, reported data are: cumulative sums (calculated from all data between the first and last visit) + +
    +
    +Pewne d�ugo�ci wizyt s� podane jako nieznae, gdy� nie zawsze mog� zosta� obliczone. Najcz�ciej wynika to z:
    +- Wizyta jeszcze trwa�a podczas aktualizacji statystyki,
    +- Wizyta rozpocz�a si� po 23:00 ostatniego dnia miesi�ca (ze wzgl�d�w technicznych #PROG# nie przelicza d�ugo�ci takich sesji) +
    + +
    Zlecenie POST zosta�o zrealizowane pomy�lnie.
    +
    ��danie zosta�o odebrane poprawnie, lecz b�dzie p�niej zrealizowane przez serwer.
    +
    Serwer przetworzy� ��danie, lecz nie posiada �adnych danych do wys�ania.
    +
    Cz�ciowa zawarto��.
    +
    Dokument zosta� przeniesiony pod inny adres.
    +
    Dokument zosta� czasowo przeniesiony pod inny adres.
    +
    Zlecenie by�o b��dne, lub niemo�liwe do zrealizowania przez serwer.
    B��d powstaje wtedy, kiedy serwer WWW otrzymuje do wykonania instrukcj�, kt�rej nie rozumie.
    +
    B��d autoryzacji. Strona wymaga podania has�a i loginu - b��d pokazuje si� wtedy, gdy kt�re� z tych danych si� nie zgadza lub zosta�y podane niew�a�ciwiwe.
    Je�li liczba ta jest du�a, jest to sygna� dla webmastera, i� kto� pr�buje z�ama� has�o do strony nim zabezpieczonej.
    +
    B��d wyst�puje wtedy, gdy katalog/strona do kt�rego si� odwo�ywano nie ma ustawionych w�a�ciwych praw dost�pu, lub prawa te nie pozwalaj� na obejrzenie zawarto�ci katalogu/strony.
    +
    Spr�buj wpisa� nie istniej�cy adres URL (np. adres tej strony ze skasowan� jedn� literk�). Znaczy to, �e posiadasz gdzie� na swoich stronach b��dny link, lub link odnosz�cy si� do nieistniej�cej strony.
    +
    Przegl�darka nie wys�a�a ��da� do serwera w czasie jego oczekiwania. Mo�esz powt�rzy� ��danie bez jego modyfikacji w czasie p�niejszym.
    +
    B��d wewn�trzny. Ten b��d cz�sto pojawia si�, gdy aplikacja CGI nie zako�czy�a si� normalnie (podobno ka�dy program zawiera przynajmniej jeden b��d...:-).
    +
    Serwer nie umo�liwia obs�ugi mechanizmu.
    +
    Serwer jest chwilowo przeci��ony i nie mo�e obs�u�y� zlecenia.
    +
    Serwer zdecydowa� si� przerwa� oczekiwanie na inny zas�b lub us�ug�, i z tego powodu nie m�g� obs�u�y� zlecenia.
    +
    Serwer docelowy nie otrzyma� odpowiedzi od serwera proxy, lub bramki.
    +
    Nie obs�ugiwana wesja protoko�u HTTP.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ro.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ro.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ro.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,86 @@ + + +
    + O noua vizita este definita ca fiind orice acces al unui vizitator + care nu a fost conectat la site in ultimele #VisitTimeOut# mn. +
    +
    +Numarul de masini client (adresa IP) care vin sa viziteze + site-ul (si care au vizionat cel putin o pagina).
    +Aceste date se refera la numarul de persoane fizice diferite + care au ajuns pe site in oricare din zile. +
    +
    + De cate ori o pagina a site-ului este vizionata (suma pentru + toti vizitatorii si toate vizitele).
    Aceasta informatie difera de + "Accesari" deoarece numara doar paginile HTML si nu si imaginile sau alte + tipuri de fisiere. +
    +
    + De cate ori o pagina, imagine, fisier de pe site a fost + vizionata sau descarcata (download) de catre + cineva.
    + Aceasta informatie este furnizata doar ca referinta deoarece pentru + marketing este de multe ori preferat numarul de "pagini" vazute. +
    +
    + Aceasta informatie contine traficul total de date pentru toate + paginile, imaginile si fisierele de pe site.
    + Unitatea de masura este KB, MB sau GB (KiloBytes, MegaBytes sau GigaBytes) +
    +
    + #PROG# recunoaste accesele la site rezultate dintr-o cautare efectuata cu ajutorul a + #SearchEnginesArray# din cele mai cunoscute motoare de cautare si repertoare +(ca Yahoo, Altavista, Lycos, Google, Voila, etc...). +
    +
    + Lista tuturor paginilor externe care au fost punctul de plecare (si de intrare) + in site (sunt listate doar primele #MaxNbOfRefererShown# in ordinea numarului de utilizari). + Intrarile pe site din rezultatul generat de motoarele de cautare sunt excluse aici deoarece + ele au fost deja incluse in precedenta linie a acestui tabel. +
    +
    + Acest tabel contine lista celor mai frecvente cuvinte cheie care au fost + utilizate de motoarele de cautare sau repertoare pentru a gasi acest site. + (Cuvintele cheie folosite de cele mai cunoscute #SearchEnginesArray# + motoare de cautare sau repertoare - Yahoo, Altavista, Lycos, Google, Voila, etc... - + sunt recunoscute de #PROG#). +
    +
    + Robotii sunt programe vizitator automate utilizate de multe motoare de cautare + si care scaneaza situl web pentru a-l indexa si evalua, pentru a colecta statistici + despre siturile web din Internet si/sau pentru a verifica daca situl este online.
    +#PROG# recunoaste #RobotArray# roboti. +
    +
    + Toate statisticile referitoare la timp sunt bazate pe timpul din masina care gazduieste + serverul web.
    +
    +
    + Aici, datele listate sunt: valori medii (calculate din toate datele intre prima + si ultima vizita) +
    +
    + Aici, datele listate sunt: insumari cumulative (calculate din toate datele intre + prima si ultima vizita) +
    + +
    Nici o descriere pentru aceasta eroare.
    +
    Cererea a fost inteleasa de server dar va fi procesata mai tarziu.
    +
    Serverul a procesat cererea dar nu exista nici un document de trimis.
    +
    Continut partial.
    +
    Documentul cerut a fost mutat si este acum la o alta adresa continuta in raspuns.
    +
    Nici o descriere pentru aceasta eroare.
    +
    Eroare de sintaxa, serverul nu a inteles cererea.
    +
    Incercare de a accesa un URL unde este necesara autentificarea cu user/parola.
    Un numar mare in acest loc poate insemna ca cineva (de exemplu un hacker) incearca sa sparga sau sa intre in site (sperand sa intre intr-o zona securizata incercand de exemplu diferite perechi user/parola).
    +
    Incercare de a accesa un URL care nu a fost configurat sa fie atins, nici macar cu o autentificare user/parola (de exemplu un URL dintr-un director care nu este definit ca accesibil).
    +
    Incercare de a accesa un URL inexistent. Aceasta eroare inseamna adesea ca exista o legatura invalida undeva pe site sau ca un vizitator a tastat gresit un URL.
    +
    Serverul a consumat prea mult timp pentru a raspunde cererii. Aceasta eroare indica adesea un script CGI lent pe care serverul a incercat sa-l aborteze sau un server web extrem de incarcat.
    +
    Eroare interna. Aceasta eroare este deseori cauzata de un program CGI care s-a terminat anormal (de exemplu prin coredump).
    +
    Cerere de actiune necunoscuta.
    +
    Cod returnat de un server HTTP care lucreaza ca un proxy sau gateway in cazul in care un server tinta real nu a raspuns cu succes cererii client.
    +
    Eroare interna server.
    +
    Depasire timp la Gateway.
    +
    Versiune HTTP nesuportata.
    + + Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ru.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ru.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ru.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,53 @@ + + +
    +����� ����������� ��������� ��������� ����������, �������� �� ���� �� ����� ����� #VisitTimeOut# �����. +
    +
    +���������� ������ (IP �������), ������� �������� ���� (��� ���������� ��� ������� ���� ��������).
    +������ ����� �������� ���������� ��������� �����������, �������� �� ���� � ������� ������ ���. +
    +
    +���������� ������������� ������� ����� (����� ���� �����������).
    +��� ������ ���������� �� "�����", ��� ��� ����� ������ ������ HTML-�������� ��� ����� ������� � ������ ������. +
    +
    +���������� �������, ����������� � ������ �����, ������� ���� ����������� ��� ������� ������������.
    +��� ������ ��������� ������ ��� ���������, �.�. ���������� ������������� "�������" ������� ������ ��� ������������ ������� �����. +
    +
    +����� ������� ����� ���� �������, �����������������, ��������� � �����. +
    +
    +#PROG# ���������� ������ ��������� ���������� ����� ������#SearchEnginesArray# �������� ���������� ��������� �������� � ��������� (�����, ��� Yahoo, Altavista, Lycos, Google, Yandex, � ��...). +
    +
    +������ ���� ������� �������, �� ������� ���� ��������� ������ �� ������ ���� (�������� ������ #MaxNbOfRefererShown# �������� ���������� ������� �������). ������ � ��������� �������� ����� �� ����������. +
    +
    +����� ������� �������� ���������������� �������� �����, �������������� ��� ������ � ��������� ������� � ���������. +(#PROG# ���������� �������� ����� � #SearchEnginesArray# ��������� �������� � ���������). +
    +
    +������ (������ ���������� �������) - ��� �������������� ������������ ����������, ������������ ������� ���������� ��������� ��� ����, ����� (1) ������������� � ����������� ��������, (2) �������� ���������� �� ������ �/��� (3) ��������, �������� �� �� ��� ��� ���� �������� on-line.
    +#PROG# ���������� �� #RobotArray# �������. +
    + +
    ��� ������ ������ ��� ��������.
    +
    ������ ������ ��� ����� ��������, �� ����� ��������� �������.
    +
    ������ ��������� ������, �� �� ��������� ������ ��� �������� ����������.
    +
    ��������� ����������.
    +
    �������� ��� ��������� � ��������� �� ������, ������������ � ������.
    +
    ��� ������ ������ ��� ��������.
    +
    �������������� ������, ������ �� ����� ���������� ������.
    +
    ������� ������� � URL ��� +�����/������ �����������.
    ������� ���������� ������ ������ ������� � ���, ��� ����� (��������, �����) ������� ���������� � �������� ������� ����� � ������� �������� ��������� ��������� ������ � ������.
    +
    ������� ������� � URL ������� �� ��� �������� ��� ������� (���� � ��������� ������ � ������) (� �������, �����������, ������� �� ���� �������� ��� "browsable").
    +
    ������� ������� � ��������������� URL. ������ ������ ������� � ������������ �������� ������ �� ������ ����� ��� ���������� ������ � �������� �����.
    +
    ������ �������� ������� ����� ������� �� ���������� ������ �� ������. ��� ������ ��������� � ������� ���� ���������� CGI �������, ������� ������ ���������, �� ���������� ������, ���� ��� ������ ����������� �������.
    +
    ���������� ������. ����� ������ ���������� ����� CGI ��������, ������� ����������� � �������.
    +
    ����������� ��������� ��������.
    +
    ���, ������������ HTTP ��������, ������� �������� � �������� proxy ��� �����, ����� ��������� ������ ����������� ������� �� ������ �������
    +
    ���������� ������ �������.
    +
    ����-��� �����.
    +
    ������ ������ HTTP �� ��������������.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-se.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-se.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-se.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,62 @@ + +
    +Ett nytt bes�k �r en bes�kare (som tittar p� en sida) som inte varit inne p� sajten p� #VisitTimeOut# minuter. +
    +
    +Antal bes�kare (IP-adresser) som bes�kte sajten (och som tittade p� minst en sida).
    +Detta v�rde anger antalet olika fysiska personer som n�tt siten p� en dag. +
    +
    +Antal g�nger en sida p� sajten har bes�kts (Summa f�r alla bes�kare f�r alla bes�k).
    +Detta v�rde skiljer sig fr�n "tr�ffar" genom att det bara r�knar HTML-sidor, ej bilder eller andra filer. +
    +
    +Antal g�nger en sida, bild eller fil fr�n sajten har bes�kts eller laddats hem av n�gon.
    +Detta v�rde finns bara med som referens eftersom antalet "sidor" som bes�kts oftast �r b�ttre att titta p� ur marknadsf�ringssynpunkt. +
    +
    +Detta v�rde visar hur mycket data som har laddats hem genom alla sidor, bilder och filer p� hela sajten.
    +Enheterna �r Kb, Mb or Gb (KiloByte, MegaByte eller GigaByte) +
    +
    +#PROG# k�nner igen n�r bes�kare hittar din sajt genom en s�kning i de #SearchEnginesArray# popul�raste s�kmotorerna och katalogerna (s�som Yahoo, Altavista, Lycos, Google, Voila, osv...). +
    +
    +En lista p� alla externa sidor som l�nkar till (och bes�kare anv�nt f�r att komma till) din sida (Bara de #MaxNbOfRefererShown# mest anv�nda l�nkarna visas). +L�nkar i s�kresultaten fr�n s�kmotorerna tas inte med h�r eftersom de redan r�knats in i f�reg�ende rad i tabellen. +
    +
    +Denna tabell visar de vanligaste nyckelorden som anv�nts f�r att hitta din sajt genom s�kmotorer och kataloger. +(#PROG# k�nner igen nyckelord fr�n de #SearchEnginesArray# vanligaste s�kmotorerna och katalogerna, s�som Yahoo, Altavista, Lycos, Google, Voila, osv...). +
    +
    +Robotar (kallas ocks� Spindlar) �r automatiska datoriserade bes�kare som anv�nds av m�nga s�kmotorer som s�ker av din webbsajt f�r att indexera och rangordna den, samla statistik f�r webbsajter och/eller se om din sajt fortfarande finns kvar.
    +#PROG# k�nner igen upp till #RobotArray# olika robotar. +
    +
    +All tidsrelaterad statistik baseras p� klockan p� webbservern.
    +
    +
    +H�r visas medelv�rden (ber�knade f�r alla bes�k fr�n det f�rsta till det sista) +
    +
    +H�r visas ackumulerade summor (ber�knade f�r alla bes�k fr�n det f�rsta till det sista) +
    + +
    Ingen beskrivning finns f�r detta fel.
    +
    Servern f�rstod beg�ran men kommer bearbeta den senare.
    +
    Servern har bearbetat beg�ran men har inte genererat n�got svar.
    +
    Endast en del av inneh�llet �verf�rdes.
    +
    Sidan har flyttats och ny adress finns i svaret.
    +
    Ingen beskrivning finns f�r detta fel.
    +
    Syntax fel, servern f�rstod inte beg�ran.
    +
    N�gon f�rs�kte komma �t en URL d�r inloggning kr�vdes.
    Ett h�gt v�rde h�r skulle kunna inneb�ra att n�gon (t.ex. en hacker) f�rs�ker bryta sig in i din sajt (t.ex. genom att pr�va sig fram tills de hittar r�tt l�senord).
    +
    N�gon f�rs�kte komma �t en URL som �r inst�lld s� att man inte kommer �t den ens med r�tt l�senord (till exempel en katalog som �r inst�lld att inte till�ta bl�ddring.).
    +
    N�gon f�rs�kte n� en icke existerande URL. Detta betyder ofta att det finns en felaktig l�nk p� din sajt eller att n�gon stavade fel till en URL.
    +
    Servern har tagit f�r l�ng tid p� sig att besvara en beg�ran. Detta beror ofta p� ett l�ngsamt cgi-skript eller att servern �r �verbelastad.
    +
    Internt fel. Detta fel orsakas ofta av att ett cgi-skript g�r fel (t.ex. g�r en coredump).
    +
    Ok�nd beg�ran.
    +
    Felkod som genereras d� en HTTP-server som arbetar som proxy eller gatewayt ine f�r svar fr�n den verkliga servern som skulle ha svarat p� klientens beg�ran.
    +
    Internt serverfel.
    +
    Timeout i gateway
    +
    HTTP-versionen st�ds ej.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-sk.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-sk.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-sk.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,55 @@ + + + +
    +Nov� n�v�tevn�ci su definovan� ako ka�d� prich�dzajuci (prehliadaj�ci si alebo prech�dzaj�ci), kto +sa na str�nky nepripojil posledn�ch #VisitTimeOut# min. +
    +
    +Po�et klientov (IP address), ktor� pri�li na str�nky (a ktori si prehliadli aspo� jednu str�nku). +Toto ��slo prislucha ��slu roznych fyzick�ch osob, ktori nav�t�vili str�nky ktor�kolvek jeden den. +
    +
    +Po�et kolkokr�t bola str�nka na tomto servery pozreta (Su�et za v�etky nav�tevujuc� a ich n�v�tevy). +To se li�i od Hitov tak, �e su zapo��tane iba str�nky (nie obr�zky a ostatne...). +
    +
    +Po�et kolkokr�t bola str�nka, obr�zok, subor na tomto servery stiahnuta (Su�et za v�etky nav�tevuj�c� a jejich n�v�tevy). +Toto ��slo je uvedene kvoli porovn�niu zo Str�nkami. +
    +
    +Velkost v�etkych str�nok, obr�zkov a suborov stiahnutych z tohoto serveru. +
    +
    +#PROG# rozpozn� pr�stup na server od vyhlad�vanie z #SearchEnginesArray# najzn�mej��ch internetov�ch vyhled�va�ov a zoznamov (ako je Yahoo, Altavista, Lycos, Google, Voila, atd...). +
    +
    +Seznam v�ech extern�ch str�nek (mimo server), kter� byly pou�ity jako odkaz na tento server (Je zobrazeno jen #MaxNbOfRefererShown# nej�ast�j��ch). +Odkazy pou�it� z vyhled�va�� nejsou za�azeny, nebo� je obsahuje jin� �daj. +
    +
    +Tato tabulka zobrazuje zoznam nej�astejsie zadavan�ch v�razov, ktor� boly zad�vane vo vyhlad�va�och k najdeniu tohoto serveru. +(V�razy od #SearchEnginesArray# najzn�mej��ch vyhlad�va�ov a zoznamov su #PROG# rozpoznany, ako je Yahoo, Altavista, Lycos, Google, Voila, atd...). +
    +
    +Roboti (niekedy ozna�ov�ni ako pavuci alebo �muchalov�) su po��ta�ov� automat. n�v�tevn�ci pou�ivan� vela vyhled�vajucimi slu�bami k (1) indexov�niu a hodnoteniu, (2) zbieraniu statistik z webov a/alebo (3) k zistsniu, ci str�nky st�le existuju.
    +#PROG# je schopmy rozpoznat #RobotArray# robotov. +
    + +
    Bolo vytvoreno nov� miesto s datami a odeslane.
    +
    Po�adavka bola rozeznana, ale bude vybaveny neskor.
    +
    Po�iadavka bola rozeznana, ale nieje co odoslat spet.
    +
    Poziadavka bol zpracovany iba �iasto�ne.
    +
    Po�adovan� dokument bol presunuty a adresa bola odoslana.
    +
    Dokument sa do�asne nach�dza na inej adrese.
    +
    Syntaktick� chyba, chybn� po�iadavok.
    +
    Po�iadavka neobsahovala �iadanu autorizaciu meno/heslo pre vstup na str�nku. Ak se vyskytuje�asto,poku�a sa niekdo o prielom-hack.
    +
    Po�iadavka bola odmietnuta serverom (nepr�stupne data, neviditeln� adres�r...).
    +
    Pokus o vstup na neexistujuci str�nku alebo soubor.
    +
    Cela po�iadavka nebola serveru od klienta odoslana v po�adovanom �ase (chyba klienta alebo serveru alebo skriptu).
    +
    Chyba serveru (�asto sa vyskytuje pri chybnom zpracovan� skriptu).
    +
    Po�iadavku, ktora bola zaslana nieje mo�no vyriedit, pretoze ho server nevie zpracovat.
    +
    Server prijal chybnu po�iadavku od in�ho serveru (proxy nebo br�ny).
    +
    Chyba serveru, slu�ba nieje k dispozicii.
    +
    Vypr�al �asov� interval u proxy serveru alebo br�ny.
    +
    Nepodporovan� verzia protokolu HTTP.
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-sr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-sr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-sr.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,72 @@ + + +
    +Нова посета се дефинише као сваки нови посетилац који се није повезао на ваш сајт у току последњих #VisitTimeOut# минута. +
    +
    +Број корисничких рачунара (IP адреса) који су посећивали овај сајт (и видели најмање једну страницу).
    +Овај податак говори о броју физички различитих особа које су посетиле сајт током једног дана. +
    +
    +Колико пута је једна страница сајта била прегледана (укупно за све посетиоце током свих посета).
    +Овај податак се разликује од "погодака" по томе што броји само HTML странице за разлику од слика и других датотека. +
    +
    +Колико пута је једна страница, слика, датотека сајта била прегледана или преузета од стране некога.
    +Овај податак служи само као референца, пошто је број "страница" много кориснији за разне маркетиншке потребе. +
    +
    +Ова информација говори о количини преузетих података за све странице, слике и датотеке у оквиру вашег сајта.
    +Јединице су KB, MB или GB (килобајти, мегабајти или гигабајти). Овај податак је користан како бисте пратили остварени саобраћај у оквиру вашег сајта. +
    +
    +#PROG# препознаје сваки приступ вашем сајту након претраге помоћу #SearchEnginesArray# најпопуларнијих интернет претраживача и директоријума (Yahoo, Altavista, Lycos, Google, Voila, итд...). +
    +
    +Листа свих спољних страница на којима се налази веза коју је корисник употребио да би дошао на вашу страницу (Само #MaxNbOfRefererShown# највећих веза је приказано). +Везе које су резултат претраживања су искључене јер су већ приказане у претходном реду ове табеле. +
    +
    +Ова табела приказује листу кључних речи које се најчешће користе за проналажење вашег сајта помоћу интернет претраживача или директоријума. +(#PROG# Препознаје кључне речи #SearchEnginesArray# највећих претраживача и директоријума, међу којима су и Yahoo, Altavista, Lycos, Google, Voila, итд...). +
    +
    +Роботи су рачунарски програми које користе многи претраживачи како би анализирали вашу страницу и тиме (1) је индексирали и рангирали, (2) прикупили статистике о интернет странама и/или (3) проверили да ли је ваш сајт још увек активан.
    +#PROG# Може препознати до #RobotArray# робота. +
    +
    +Све статистике везане са временом су базиране на времену на серверу.
    +
    +
    +Приказани подаци овде су: просечне вредности (израчунате на основу свих података између прве и последње посете у анализираном опсегу) +
    +
    +Приказани подаци овде су: кумулативне суме (израчунате на основу свих података између прве и последње посете у анализираном опсегу) +
    +
    +Нека Трајања посета су 'непозната' јер се не могу увек израчунати. Ово су главни разлози за то:
    +- Посета није завршена када је вршено 'ажурирање'.
    +- Посета је почела у последњем сату (након 23:00) последњег дана у месецу (технички разлози спречавају #PROG# да израчуна трајање такве посете) +
    + +
    Нема описа ове грешке.
    +
    Сервер је разумео захтев, али ће га обрадити касније.
    +
    Сервер је обрадио захтев, али нема шта да пошаље кориснику.
    +
    Делимичан садржај (корисник је прекинуо отварање странице).
    +
    Тражени документ је премештен на ново место и нова адреса је дата кориснику (преусмеравање).
    +
    Нема описа ове грешке.
    +
    Синтаксна грешка. Сервер није разумео захтев.
    +
    Корисник је покушао да отвори страну за коју је потребно дати корисничко име и лозинку.
    Велики број под овом ставком може значити да неко покушава провалити на ваш сајт (нпр. испробавајући разне комбинације корисничког имена и лозинке за улазак).
    +
    Корисник је покушао да отвори страну која је подешена да јој се не може приступити, чак ни са корисничким именом и лозинком (нпр. страна унутар директоријума који није дефинисан као приступачан.).
    +
    Корисник је покушао приступити непостојећој страни. Ова грешка обично значи да негде на вашем сајту постоји неисправна веза или да је корисник неисправно унео адресу одређене странице.
    +
    Серверу је требало превише времена да одговори на захтев. Код ове грешке се обично ради о спором CGI скрипту који је сервер морао да прекине, о спорој вези корисника или о екстремном загушењу саобраћаја на серверу.
    +
    Интерна грешка. Ову грешку узрокује CGI програм који садржи неку грешку, па је прекинуо рад.
    +
    Захтевана је непозната акција.
    +
    Овај код враћа HTTP сервер који ради као посредник или пролаз, и то ако стварни сервер не одговори успешно на захтев клијента.
    +
    Интерна грешка на серверу.
    +
    Овај код враћа HTTP сервер који ради као пролаз, и то ако приликом контактирања стварног сервера истекне предвиђено време (gateway timeout).
    +
    Клијент захтева верзију HTTP-а која није подржана.
    + + + + Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-tr.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-tr.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-tr.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,53 @@ + +
    +Yeni ziyaret�i, ge�mi� #VisitTimeOut# dakika i�inde sitenize ba�lanmam�� ve o anda sitenize bakan kullan�c�d�r. +
    +
    +Sitenizi ziyaret eden ve en az bir sayfa g�ren bilgisayar (IP adresi) say�s�. +Bu say� sitenizi bir g�n i�inde ziyaret eden farkl� ki�ileri temsil eder. +
    +
    +Sitedeki bir sayfan�n ka� kere g�r�ld��� (T�m ziyaret�ilerin t�m ziyatlerinin toplam�). +Bu say� "hits" say�s�ndan farkl�d�r: sadece HTML dosyalar� say�l�r, resim ve di�er dosyalar say�lmaz. +
    +
    +Sitedeki sayfa, resim, ve dosyalar�n biri taraf�ndan ka� kere indirlmi� veya g�r�lm�� olmas�. +Bu bilgi kaynak olarak verilmi�tir. Genelde pazarlama alan�nda g�r�nt�lenen sayfa say�s� tercih edilir. +
    +
    +Bu say� sitenizden t�m resimler, sayfalar ve dosyalar dahil indirilen toplam bilgi miktar�n� belirtir. +
    +
    +#PROG# sitenize en pop�ler #SearchEnginesArray# �nternet dizini ve arama motorundan gelen eri�imleri anlar. +
    +
    +Sitenize ba�lant� veren (ve giri� yapmak i�in kullan�lan) d�� sayfalar (Sadece en �ok kullan�lan #MaxNbOfRefererShown# d�� sayfa g�sterilmi�tir.) +Arama motorlar� taraf�ndan kullan�lan arama sonu�lar� bu listeye dahil de� idir, ��nk� bu tabloda bir �st sat�rda bu bilgi verilmi�tir. +
    +
    +Bu tablo sitenizi �nternet dizinlerinden ve arama motorlar�ndan bulmak i�in en �ok kullan�lan anahtar s�zc�kleri g�sterir. +(#PROG# en pop�ler #SearchEnginesArray# �nternet dizini ve arama motorundan kullan�lan anahtar s�zc�kleri g�sterir. +
    +
    +Robotlar (bas�ka bir deyi�le �r�mcekler) sitenizi (1) dizinlemek ve s�ralamak, (2) istatistik toplamak, ve/veya (3) sitenizin i�ler durumda oldu�unu kontol etmek amac�yla tarayan otomatik bilgisayar programlar�d�r. +#PROG# #RobotArray#adet robotu tan�r. +
    + +
    Bu hatan�n a��klamas� yok.
    +
    Sunucu iste�inizi anlad� fakat daha sonra i�lem g�recek.
    +
    Sunucu iste�inizi yerine getirdi fakat yollanacak dosya yok.
    +
    K�smi i�erik.
    +
    �stenilen belge cevapta verilen ba�ka bir adrese ta��nm��t�r.
    +
    Bu hatan�n a��klamas� yok.
    +
    S�zdizimi hatas�, sunucu iste�inizi anlamad�.
    +
    Kulann�c� ad� ve �ifre gerektiren bir URLe ula��ld�.
    Burada y�ksek bir say� bir korsan�n sitenize girmeye �al��t���n� belirtebilir.
    +
    �ifre kullanarak bile ula��lmas� yasaklanm�� bir URL (�rne��n, "bak�labilir" olarak tan�nlanmam�� bir klas�r.).
    +
    Varolmayan bir URLLe ula�maya �al���ld�. Bu hata genellikle sitenizin bir yerinde ge�ersiz bir ba�lant�� oldu�unu veya ziyaret�inin URLi yanl�� yazmas�ndan kaynaklan�r.
    +
    Sunucu i�leme cevap vermek i�in �ok fazla zaman harcad�. Bu genellikle yava� bir CGI program�n�n kalabal�k bir veb sunucusunda durdurulmas�ndan kaynaklan�r.
    +
    Dahiki hata. Bu hata genellikle bir CGI program�n�n beklenmeyen bir �ekilde sonu�lanmas� (�ekirdek bellek d�k�m�) ile olu�ur.
    +
    �stenilen i�lem bilinmiyor.
    +
    Ula��lmaya �al���lan sunucu cevap vermeyince a� ge�idi olarak i�leyen bir HTTP sunucunun belirtti�i hata.
    +
    Dahili sunucu hatas�.
    +
    A� ge�idi zaman a��m�.
    +
    HTTPnin bu s�r�m� desteklenmiyor.
    + Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-tw.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-tw.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-tw.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,48 @@ + +
    +����쬰���[�������`���ơA�q�ۦP��}���s���������A�ɶ����j���ܤ�#VisitTimeOut#�����~�|�A�O���@���C +
    +
    +����쬰���[�������H�ơC�H�q���P���q���s�����������Ӽƨӭp��������H�ơC +
    +
    +����쬰����Ū�����`���ơC�u�O������(.html)���ӼơC +
    +
    +����쬰�������eŪ�����`���ơA�]�t�����ɡA�Ϥ��ɡA�v���ɵ��C +
    +
    +����쬰�������eŪ�����`�e�q�j�p�A�]�t�����ɡA�Ϥ��ɡA�v���ɵ��C +
    +
    +����쬰�O���ϥΪ̱q���Ƿj�M�����i�J�������C�t�η|�۰ʤ��R�̱`�ϥΪ�#SearchEnginesArray#���j�M�����C +
    +
    +��ܨ䥦�������������䤺�e�s���ܥ����������C��C +�t�η|�C�X���`�s�����e#MaxNbOfRefererShown#�Ӻ������}�C +
    +
    +�o�Ӫ����ܨϥΪ̦b�j�M���������`�ϥΪ�����r�ӵn�J�����C�t�η|�O���̱`�ϥΪ�#SearchEnginesArray#�ӷj�M��������r�C +
    +
    +�j�M���������C��(Robots)�|�۰ʪ���M���������Ҧ����e�C
    +�����O�����`�ϥΪ�#RobotArray#�Ӻ��徹��M�������O���C +
    + +
    �S������o�����~�X���y�z
    +
    �������A�����F�ѨϥΪ̪��ݨD
    +
    �������A���|�B�z���ϥΪ̪��ݨD�A���O�o�S�����ǰe�X
    +
    �������eŪ��������
    +
    ��M�������w�g����䥦�a��A�ӥB�H�w�g��M��F
    +
    ��������䤣��A�{�b�w�g�b�O���a����F
    +
    �y�k���~�A�������A�����F�ѨϥΪ̪��ݨD
    +
    ���ճs���ܻݿ�J�K�X���������}�ӵo�Ϳ��~
    +
    ���ճs���ܥ��}���s�����������}�ӵo�Ϳ��~
    +
    ���ճs���ܤ��s�b���������}�ӵo�Ϳ��~
    +
    �������A����O�Ӧh�ɶ��B�z�o�ӻݨD
    +
    �������A���o�Ϳ��~�A�@��O CGI �{���o�Ͱ��D
    +
    ���F�ѻݨD
    +
    �������A���] proxy �ӥ���^���u���ϥΪ̪��ݨD
    +
    �������A���o�Ϳ��~
    +
    �q�T�h�O��
    +
    �o�� HTTP �������S���䴩
    Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ua.txt =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ua.txt,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lang/tooltips_w/awstats-tt-ua.txt 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,81 @@ + + +
    +����� �i��� ������������ ���i, ���� �'��������� (��������� i��������� ����i���) ����� �i��i����� � �����, � ����� �i��� �� �'��������� � �������� �������� ������i� ".(#VisitTimeOut#)." ��. +
    +
    +�i���i��� ��i�������� ����i� (IP-�����), � ���� ��i���������� �i��i������� ����� i ����� ���� �������� ��������i ���� ����i���.
    +�i ���i �i����������, ��i���� �i���� ����� ���i���� �� ���� �������� ������ ���. +
    +
    +�� ����� ������� �������� �i���i��� ��������i� ��i� ����i��� ����� ��i�� �i��i�������� �i� ��� ��i� �i���i�.
    +�i ���i �i��i�������� �i� �i������i "��������" ���, �� ��������� �i���� HTML-����i���, � ����� ����i�, � �.�. ����������, i���������. +
    +
    +�i���i��� ������i�, ���� ����i���, ����������, �� ������ i���� ���� ������ ����� ������������� ��� ������ ������������� ������.
    +�i ���i ����� ����� �i��������� �i��i��� ���� ������ �������, �� �i���i��� ��������i� ����i��� � �������� i����������i��� ���� ������� �������i�. +
    +
    +�� �������� ��'�� �����, ��������� �������� �i��i������� ��� �����������i ���� ����i���, ��������� �� i���� ����i�. ���i������� � �i�������� (��), ���������� (��), �i�������� (��). +
    +
    +#PROG# ���i���� ����� ������ �� ����� �i��� ������ � ��������� #SearchEnginesArray# ����i��� ���������� ��������� ������ i �������i� (����� �� Altavista, Lycos, Google, Voila, AllTheWeb, �� i�.). +
    +
    +������ ����i��i� ����i���, ��������� � ���� ���� ����������i ��� ������ �� ����. (�������� ���� #MaxNbOfRefererShown# ����i��i� ����i���, � ���� ���� ����i���� �i��i�����i�).
    +��������� � ���������i� ��������� ����� ��� �� ��������i, �� ���� ��� �������i �� ���������� ����i� ���� ������i. +
    +
    +� �i� ������i �������� ������ �������i�� ���������������� �������� ��i� ��� ����, �� ����� �i��i�����i ��������� ����� ���� � ��������� �������� i ���������. +(� #PROG# ����i�������� ������i ����� � #SearchEnginesArray# ����i��� ���������� ��������� ������ i �������i�, ����� �� Altavista, Lycos, Google, Voila, i �.�.). +�������� �i���i��� �������� ��i� ���� ���� �i����� �������� �i������i ���� (�i���� �i������i ��i������� ��������� ������i�), �� ����� ������� �����, ����������� � ������, �������� ������. +
    +
    +������ (���� �� ����� ��������� ��������) — �� ����������i ����'�����i "�i��i�����i", ��i ���������������� �������� ���������� �����i����� ��� ���������� ����� � ����� +
      +
    1. i����������� i ������i���i� ���� ��i���
    2. +
    3. �������� ���������� (�� ������ ����� �� ����� ��������)
    4. +
    5. ����������, �� ���� [��� ��] ��������
    6. +
    +� ������i� ����i� #PROG# ��i� ����i������� +#RobotArray# �����i�. +
    +
    +��� ����������, ���'����� � �����, �������� �� �����i, +������������� �� ������i.
    +
    +
    +��� ����������� ������i �������� (����������i �� +��i�� ������, ������������ �i� ������ i ������i� �i������, �� �i������� +�������� ���i���) +
    +
    +��� ����������� ������i �������� (����������i �� +��i�� ������, ������������ �i� ������ i ������i� �i������, �� �i������� +�������� ���i���) +
    +
    +����i ���������i �i���i� � '���i������', �� �� ������ +������� �� ����������. ������i ������� �����:
    +- �i��� �� ��� ���i������, ���� �i��������� ��������� ����������.
    +- �i��� ���������� � ������� ������ (�i��� 23:00) ���������� ��� �i���� +(����� ����i��i ������� #PROG# �� ���� ����������� ������i��� ����� ���i�). +
    + +
    ��� �i�� ������� ���� ��������.
    +
    ������ ������i� �����, ��� ������ ���� �i��i��.
    +
    ������ ������� �����, ��� �������� ��� �i������� �i�����i�.
    +
    ��������� ��i��.
    +
    ��������, �� �����������, ���� �����i���� i ����� ����������� �� i���� �������, ��� ���������� � �i����i�i.
    +
    ��� �i�� ������� ���� ��������.
    +
    ����������� �������, ������ �� ������i� �����.
    +
    ������ ����������� URL, ���� ������� i�'� ����������� i ������ ��� �������.
    ������ �i���i��� ����� ������� ���� ��������, �� ����� (���������, �����) ���������� ���������� �� �������� ������� ����� ������ �i����� �����i�.
    +
    ������ ����������� URL, ���� � �����������, ���i�� �� �������i i���� ����������� i ������ ��� �������.
    (���������, URL � ����� ��������, �� ������������ ��� ��������� ����� Internet.).
    +
    ������ ������� �� ��i�������� �������. �� ������� ����� ������, �� ���� �� ����i���� ������ ����� ��� i���� ����i� � ��������i ���������, ��� �i��i����� ��������� ��� �������i URL.
    +
    ������ �������� �������� ���� ��� �i����i�i �� �����. �� ������� ����� � ����i���� ������� ���i������ CGI-��������, ��� ������ ��� �������� ������� ��� ��� ������ ����i�� ��������������.
    +
    �����i��� �������. �� ������� �������� ��� ����������� ���������i CGI-��������.
    +
    ���������� ���i���� �i�.
    +
    ���, ���������� HTTP-��������, ���� ������ � �����i �����, ���� �������� ������ ����������� �� �� ���i��� �i����i�i �� ������ ��i����.
    +
    �����i��� ������� �������.
    +
    ����-��� �����.
    +
    ����i� HTTP �� �i����������.
    \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/browsers.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/browsers.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/browsers.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,376 @@ +# AWSTATS BROWSERS DATABASE +#------------------------------------------------------- +# If you want to add a Browser to extend AWStats database detection capabilities, +# you must add an entry in BrowsersSearchIDOrder and in BrowsersHashIDLib. +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSUA; + + +# BrowsersSearchIDOrder +# This list is used to know in which order to search Browsers IDs (Most +# frequent one are first in this list to increase detect speed). +# It contains all matching criteria to search for in log fields. +# Note: Regex IDs are in lower case and ' ' and '+' are changed into '_' +#------------------------------------------------------- +@BrowsersSearchIDOrder = ( +# Most frequent standard web browsers are first in this list +'firebird', +'firefox', +'go!zilla', +'icab', +'konqueror', +'links', +'lynx', +'omniweb', +'opera', +# Other standard web browsers +'22acidownload', +'aol\-iweng', +'amaya', +'amigavoyager', +'aweb', +'bpftp', +'camino', +'chimera', +'cyberdog', +'dillo', +'dreamcast', +'downloadagent', +'ecatch', +'emailsiphon', +'encompass', +'friendlyspider', +'fresco', +'galeon', +'getright', +'headdump', +'hotjava', +'ibrowse', +'intergo', +'k\-meleon', +'linemodebrowser', +'lotus\-notes', +'macweb', +'multizilla', +'ncsa_mosaic', +'netcaptor', +'netnewswire', +'netpositive', +'nutscrape', +'msfrontpageexpress', +'phoenix', +'safari', +'tzgeturl', +'viking', +'webfetcher', +'webexplorer', +'webmirror', +'webvcr', +# Site grabbers +'teleport', +'webcapture', +'webcopier', +# Music only browsers +'real', +'winamp', # Works for winampmpeg and winamp3httprdr +'windows\-media\-player', +'audion', +'freeamp', +'itunes', +'jetaudio', +'mint_audio', +'mpg123', +'nsplayer', +'sonique', +'uplayer', +'xmms', +'xaudio', +# PDA/Phonecell browsers +'alcatel', # Alcatel +'mot\-', # Motorola +'nokia', # Nokia +'panasonic', # Panasonic +'philips', # Philips +'sonyericsson', # SonyEricsson +'ericsson', # Ericsson (must be after sonyericsson +'mmef', +'mspie', +'wapalizer', +'wapsilon', +'webcollage', +'up\.', # Works for UP.Browser and UP.Link +# PDA/Phonecell I-Mode browsers +'docomo', +'portalmmm', +# Others (TV) +'webtv', +# Other kind of browsers +'apt', +'curl', +'csscheck', +'wget', +'w3m', +'w3c_css_validator', +'w3c_validator', +'wdg_validator', +'webzip', +'staroffice', +'mozilla', # Must be at end because a lot of browsers contains mozilla in string +'libwww' # Must be at end because some browser have both 'browser id' and 'libwww' +); + +# BrowsersHashIDLib +# List of browser's name ('browser id in lower case', 'browser text') +#--------------------------------------------------------------- +%BrowsersHashIDLib = ( +# Common web browsers text +'msie','MS Internet Explorer', +'netscape','Netscape', +'firebird','Firebird (Old FireFox)', +'firefox','FireFox', +'go!zilla','Go!Zilla', +'icab','iCab', +'konqueror','Konqueror', +'links','Links', +'lynx','Lynx', +'omniweb','OmniWeb', +'opera','Opera', +# Other standard web browsers +'22acidownload','22AciDownload', +'aol\-iweng','AOL-Iweng', +'amaya','Amaya', +'amigavoyager','AmigaVoyager', +'aweb','AWeb', +'bpftp','BPFTP', +'camino','Camino', +'chimera','Chimera (Old Camino)', +'cyberdog','Cyberdog', +'dillo','Dillo', +'dreamcast','Dreamcast', +'downloadagent','DownloadAgent', +'ecatch', 'eCatch', +'emailsiphon','EmailSiphon', +'encompass','Encompass', +'friendlyspider','FriendlySpider', +'fresco','ANT Fresco', +'galeon','Galeon', +'getright','GetRight', +'headdump','HeadDump', +'hotjava','Sun HotJava', +'ibrowse','iBrowse', +'intergo','InterGO', +'k\-meleon','K-Meleon', +'linemodebrowser','W3C Line Mode Browser', +'lotus\-notes','Lotus Notes web client', +'macweb','MacWeb', +'multizilla','MultiZilla', +'ncsa_mosaic','NCSA Mosaic', +'netcaptor','NetCaptor', +'netnewswire','NetNewsWire', +'netpositive','NetPositive', +'nutscrape', 'Nutscrape', +'msfrontpageexpress','MS FrontPage Express', +'phoenix','Phoenix', +'safari','Safari', +'tzgeturl','TzGetURL', +'viking','Viking', +'webfetcher','WebFetcher', +'webexplorer','IBM-WebExplorer', +'webmirror','WebMirror', +'webvcr','WebVCR', +# Site grabbers +'teleport','TelePort Pro', +'webcapture','Acrobat', +'webcopier', 'WebCopier', +# Music only browsers +'real','RealAudio or compatible (media player)', +'winamp','WinAmp (media player)', # Works for winampmpeg and winamp3httprdr +'windows\-media\-player','Windows Media Player (media player)', +'audion','Audion (media player)', +'freeamp','FreeAmp (media player)', +'itunes','Apple iTunes (media player)', +'jetaudio','JetAudio (media player)', +'mint_audio','Mint Audio (media player)', +'mpg123','mpg123 (media player)', +'nsplayer','NetShow Player (media player)', +'sonique','Sonique (media player)', +'uplayer','Ultra Player (media player)', +'xmms','XMMS (media player)', +'xaudio','Some XAudio Engine based MPEG player (media player)', +# PDA/Phonecell browsers +'alcatel','Alcatel Browser (PDA/Phone browser)', +'ericsson','Ericsson Browser (PDA/Phone browser)', +'mot\-','Motorola Browser (PDA/Phone browser)', +'nokia','Nokia Browser (PDA/Phone browser)', +'panasonic','Panasonic Browser (PDA/Phone browser)', +'philips','Philips Browser (PDA/Phone browser)', +'sonyericsson','Sony/Ericsson Browser (PDA/Phone browser)', +'mmef','Microsoft Mobile Explorer (PDA/Phone browser)', +'mspie','MS Pocket Internet Explorer (PDA/Phone browser)', +'wapalizer','WAPalizer (PDA/Phone browser)', +'wapsilon','WAPsilon (PDA/Phone browser)', +'webcollage','WebCollage (PDA/Phone browser)', +'up\.','UP.Browser (PDA/Phone browser)', # Works for UP.Browser and UP.Link +# PDA/Phonecell I-Mode browsers +'docomo','I-Mode phone (PDA/Phone browser)', +'portalmmm','I-Mode phone (PDA/Phone browser)', +# Others (TV) +'webtv','WebTV browser', +# Other kind of browsers +'apt','Debian APT', +'curl','Curl', +'csscheck','WDG CSS Validator', +'wget','Wget', +'w3m','w3m', +'w3c_css_validator','W3C CSS Validator', +'w3c_validator','W3C HTML Validator', +'wdg_validator','WDG HTML Validator', +'webzip','WebZIP', +'staroffice','StarOffice', +'mozilla','Mozilla', +'libwww','LibWWW', +); + + +# BrowsersHashAreGrabber +# Put here an entry for each browser in BrowsersSearchIDOrder that are grabber +# browsers. +#--------------------------------------------------------------------------- +%BrowsersHereAreGrabbers = ( +'teleport','1', +'webcapture','1', +'webcopier','1', +'curl','1', +'wget','1' +); + + +# BrowsersHashIcon +# Each Browsers Search ID is associated to a string that is the name of icon +# file for this browser. +#--------------------------------------------------------------------------- +%BrowsersHashIcon = ( +# Standard web browsers +'msie','msie', +'netscape','netscape', + +'firebird','phoenix', +'firefox','firefox', +'go!zilla','gozilla', +'icab','icab', +'konqueror','konqueror', +'lynx','lynx', +'omniweb','omniweb', +'opera','opera', +# Other standard web browsers +'amaya','amaya', +'amigavoyager','amigavoyager', +'avantbrowser','avant', +'aweb','aweb', +'bpftp','bpftp', +'camino','chimera', +'chimera','chimera', +'cyberdog','cyberdog', +'dillo','dillo', +'dreamcast','dreamcast', +'ecatch','ecatch', +'encompass','encompass', +'fresco','fresco', +'galeon','galeon', +'getright','getright', +'hotjava','hotjava', +'ibrowse','ibrowse', +'k\-meleon','kmeleon', +'lotus\-notes','lotusnotes', +'macweb','macweb', +'multizilla','multizilla', +'msfrontpageexpress','fpexpress', +'ncsa_mosaic','ncsa_mosaic', +'netpositive','netpositive', +'phoenix','phoenix', +'safari','safari', +# Site grabbers +'teleport','teleport', +'webcapture','adobe', +'webcopier','webcopier', +# Music only browsers +'real','mediaplayer', +'winamp','mediaplayer', # Works for winampmpeg and winamp3httprdr +'windows\-media\-player','mediaplayer', +'audion','mediaplayer', +'freeamp','mediaplayer', +'itunes','mediaplayer', +'jetaudio','mediaplayer', +'mint_audio','mediaplayer', +'mpg123','mediaplayer', +'nsplayer','mediaplayer', +'sonique','mediaplayer', +'uplayer','mediaplayer', +'xmms','mediaplayer', +'xaudio','mediaplayer', +# PDA/Phonecell browsers +'alcatel','pdaphone', # Alcatel +'ericsson','pdaphone', # Ericsson +'mot\-','pdaphone', # Motorola +'nokia','pdaphone', # Nokia +'panasonic','pdaphone', # Panasonic +'philips','pdaphone', # Philips +'sonyericsson','pdaphone', # Sony/Ericsson +'mmef','pdaphone', +'mspie','pdaphone', +'wapalizer','pdaphone', +'wapsilon','pdaphone', +'webcollage','pdaphone', +'up\.','pdaphone', # Works for UP.Browser and UP.Link +# PDA/Phonecell I-Mode browsers +'docomo','pdaphone', +'portalmmm','pdaphone', +# Others (TV) +'webtv','webtv', +# Other kind of browsers +'apt','apt', +'webzip','webzip', +'staroffice','staroffice', +'mozilla','mozilla' +); + + +1; + + +# TODO +# Add Gecko category -> IE / Netscape / Gecko(except Netscape) / Other +# IE (based on Mosaic) +# Netscape family +# Gecko except Netscape (Mozilla, Firebird (was Phoenix), Galeon, AmiZilla, Dino, and few others) +# Opera (Opera 6/7) +# KHTML (Konqueror, Safari) + + +# Browsers example +# +# MSIE 4.0 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; KITV4 Wanadoo; KITV5 Wanadoo) +# +# Netscape 4.05 Mozilla/4.05 [fr]C-SYMPA (Win95; I) +# Netscape 4.7 Mozilla/4.7 [fr] (Win95; I) +# Netscape 6.0 Mozilla/5.0 (Macintosh; N; PPC; fr-FR; m18) Gecko/20001108 Netscape6/6.0 +# Netscape 7.02 Mozilla/5.0 (Platform; Security; OS-or-CPU; Localization; rv:1.0.2) Gecko/20030208 Netscape/7.02 +# +# Mozilla 1.3 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.3) Gecko/20030312 +# +# Firebird 0.6 Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1 +# +# Opera 6.03 Mozilla/3.0 (Windows 98; U) Opera 6.03 [en] +# Opera 5.12 Mozilla/3.0 (Windows 98; U) Opera 5.12 [en] +# Opera 3.21 Opera 3.21, Windows: +# +# Galeon +# +# Safari +# +# Konqueror +# +# Autre Mozilla/3.01 (compatible;) Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/domains.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/domains.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/domains.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,92 @@ +# AWSTATS DOMAINS DATABASE +#------------------------------------------------------- +# If you want to add a new domain to extend AWStats database detection capabilities, +# you must add an entry in DomainsHashIDLib. +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSDOM; + + +# DomainsHashIDLib +# List of domain with their name ('domain id', 'Domain name') +# Official list can be found at http://www.iana.org/cctld/cctld-whois.htm +# 'Domain id' should be ISO 3166 code + miscelanous domains +#------------------------------------------------------- +%DomainsHashIDLib = ( +'localhost','localhost', +'i0','Local network host', +'a2','Satellite access host', + +'ac','Ascension Island','ad','Andorra','ae','United Arab Emirates', +'aero','Aero/Travel domains','af','Afghanistan', +'ag','Antigua and Barbuda','ai','Anguilla','al','Albania', +'am','Armenia','an','Netherlands Antilles','ao','Angola', +'aq','Antarctica','ar','Argentina','arpa','Old style Arpanet', +'as','American Samoa','at','Austria','au','Australia','aw','Aruba', +'az','Azerbaidjan','ba','Bosnia-Herzegovina','bb','Barbados', +'bd','Bangladesh','be','Belgium','bf','Burkina Faso','bg','Bulgaria', +'bh','Bahrain','bi','Burundi','biz','Biz domains','bj','Benin','bm','Bermuda', +'bn','Brunei Darussalam','bo','Bolivia','br','Brazil','bs','Bahamas', +'bt','Bhutan','bv','Bouvet Island','bw','Botswana','by','Belarus', +'bz','Belize','ca','Canada','cc','Cocos (Keeling) Islands', +'cd','Congo, Democratic Republic of the', +'cf','Central African Republic','cg','Congo','ch','Switzerland', +'ci','Ivory Coast (Cote D\'Ivoire)','ck','Cook Islands','cl','Chile','cm','Cameroon', +'cn','China','co','Colombia','com','Commercial','coop','Coop domains','cr','Costa Rica', +'cs','Former Czechoslovakia','cu','Cuba','cv','Cape Verde', +'cx','Christmas Island','cy','Cyprus','cz','Czech Republic','de','Germany', +'dj','Djibouti','dk','Denmark','dm','Dominica','do','Dominican Republic', +'dz','Algeria','ec','Ecuador','edu','USA Educational','ee','Estonia', +'eg','Egypt','eh','Western Sahara','er','Eritrea','es','Spain','et','Ethiopia', +'eu','European Union', +'fi','Finland','fj','Fiji','fk','Falkland Islands','fm','Micronesia','fo','Faroe Islands', +'fr','France','fx','France (European Territory)','ga','Gabon', +'gb','Great Britain','gd','Grenada','ge','Georgia','gf','French Guyana', +'gg','Guernsey','gh','Ghana','gi','Gibraltar', +'gl','Greenland','gm','Gambia','gn','Guinea','gov','USA Government','gp','Guadeloupe (French)', +'gq','Equatorial Guinea','gr','Greece','gs','S. Georgia & S. Sandwich Isls.', +'gt','Guatemala','gu','Guam (USA)','gw','Guinea Bissau','gy','Guyana', +'hk','Hong Kong','hm','Heard and McDonald Islands','hn','Honduras', +'hr','Croatia','ht','Haiti','hu','Hungary','id','Indonesia','ie','Ireland','il','Israel', +'im','Isle of Man','in','India','info','Info domains','int','International','io','British Indian Ocean Territory', +'iq','Iraq','ir','Iran','is','Iceland','it','Italy', +'je','Jersey','jm','Jamaica','jo','Jordan','jp','Japan','ke','Kenya','kg','Kyrgyzstan', +'kh','Cambodia','ki','Kiribati','km','Comoros','kn','Saint Kitts & Nevis Anguilla', +'kp','North Korea','kr','South Korea','kw','Kuwait', +'ky','Cayman Islands','kz','Kazakhstan','la','Laos','lb','Lebanon','lc','Saint Lucia', +'li','Liechtenstein','lk','Sri Lanka','lr','Liberia','ls','Lesotho','lt','Lithuania', +'lu','Luxembourg','lv','Latvia','ly','Libya','ma','Morocco','mc','Monaco', +'md','Moldova','mg','Madagascar','mh','Marshall Islands','mil','USA Military', +'mk','Macedonia','ml','Mali','mm','Myanmar','mn','Mongolia','mo','Macau', +'mp','Northern Mariana Islands','mq','Martinique (French)','mr','Mauritania', +'ms','Montserrat','mt','Malta','mu','Mauritius','museum','Museum domains','mv','Maldives', +'mw','Malawi','mx','Mexico','my','Malaysia','mz','Mozambique','na','Namibia','name','Name domains','nato','NATO', +'nc','New Caledonia (French)','ne','Niger','net','Network','nf','Norfolk Island', +'ng','Nigeria','ni','Nicaragua','nl','Netherlands','no','Norway', +'np','Nepal','nr','Nauru','nt','Neutral Zone','nu','Niue','nz','New Zealand','om','Oman', +'org','Non-Profit Organizations','pa','Panama','pe','Peru','pf','Polynesia (French)', +'pg','Papua New Guinea','ph','Philippines','pk','Pakistan','pl','Poland', +'pm','Saint Pierre and Miquelon','pn','Pitcairn Island','pr','Puerto Rico','pro','Professional domains', +'ps','Palestinian Territories','pt','Portugal','pw','Palau','py','Paraguay','qa','Qatar', +'re','Reunion (French)','ro','Romania','ru','Russian Federation','rw','Rwanda', +'sa','Saudi Arabia','sb','Solomon Islands','sc','Seychelles', +'sd','Sudan','se','Sweden','sg','Singapore','sh','Saint Helena','si','Slovenia', +'sj','Svalbard and Jan Mayen Islands','sk','Slovak Republic','sl','Sierra Leone', +'sm','San Marino','sn','Senegal','so','Somalia','sr','Suriname', +'st','Sao Tome and Principe','su','Former USSR','sv','El Salvador','sy','Syria','sz','Swaziland', +'tc','Turks and Caicos Islands','td','Chad','tf','French Southern Territories','tg','Togo', +'th','Thailand','tj','Tadjikistan','tk','Tokelau','tm','Turkmenistan','tn','Tunisia', +'to','Tonga','tp','East Timor','tr','Turkey','tt','Trinidad and Tobago','tv','Tuvalu', +'tw','Taiwan','tz','Tanzania','ua','Ukraine','ug','Uganda', +'uk','United Kingdom','um','USA Minor Outlying Islands','us','United States', +'uy','Uruguay','uz','Uzbekistan','va','Vatican City State', +'vc','Saint Vincent & Grenadines','ve','Venezuela','vg','Virgin Islands (British)', +'vi','Virgin Islands (USA)','vn','Vietnam','vu','Vanuatu','wf','Wallis and Futuna Islands', +'ws','Samoa Islands','ye','Yemen','yt','Mayotte','yu','Yugoslavia','za','South Africa', +'zm','Zambia','zr','Zaire','zw','Zimbabwe' +); + + +1; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/mime.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/mime.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/mime.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,216 @@ +# AWSTATS MIME DATABASE +#------------------------------------------------------- +# If you want to add MIME types, +# you must add an entry in MimeFamily and may be MimeHashLib +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSMIME; + + +# MimeHashLib +# List of mime's label ("mime id in lower case", "mime text") +#--------------------------------------------------------------- +%MimeHashLib = ( +'text','Text file', +'page','HTML or XML static page', +'script','Dynamic Html page or Script file', +'image','Image', +'document','Document', +'package','Package', +'archive','Archive', +'audio','Audio', +'video','Video', +'javascript','Javascript file', +'vbs','Visual Basic script', +'conf','Config file', +'css','Cascading Style Sheet file', +'xsl','Extensible Stylesheet Language file', +'runtime','HTML dynamic page or Binary runtime', +'library','Binary library', +'swf','Macromedia Flash Animation', +'dtd','Document Type Definition', +'csv','Comma Separated Value file' +); + +# MimeHashIcon +# Each Mime ID is associated to a string that is the name of icon +# file for this Mime type. +#--------------------------------------------------------------------------- +%MimeHashIcon = ( +# Text file +'txt','text', +# HTML Static page +'html','html', +'htm','html', +'hdml','html', +'wml','html', +'wmlp','html', +'xml','html', +# HTML Dynamic pages or script +'asp','script', +'aspx','script', +'asmx','script', +'cfm','script', +'jsp','script', +'cgi','script', +'ksh','script', +'php','script', +'php3','script', +'php4','script', +'pl','script', +'py','script', +'sh','script', +'shtml','html', +'tcl','script', +'xsp','script', +# Image +'gif','image', +'png','image', +'bmp','image', +'jpg','image', +'jpeg','image', +# Document +'doc','doc', +'pdf','pdf', +'xls','other', +'ppt','other', +'pps','other', +'sxw','other', +'sxc','other', +'sxi','other', +'sxd','other', +'csv','other', +'xsl','html', +# Package +'rpm',($LogType eq 'S'?'audio':'archive'), +'deb','archive', +'msi','archive', +# Archive +'7z','archive', +'ace','archive', +'bz2','archive', +'gz','archive', +'rar','archive', +'tar','archive', +'tgz','archive', +'tbz2','archive', +'z','archive', +'zip','archive', +# Audio +'mp3','audio', +'ogg','audio', +'wma','audio', +'wav','audio', +# Video +'avi','video', +'divx','video', +'mp4','video', +'mpeg','video', +'mpg','video', +'rm','video', +'swf','video', +# Web scripts +'js','other', +'vbs','other', +# Config +'cf','other', +'conf','other', +'css','other', +'ini','other', +'dtd','other', +# Program +'exe','script', +'dll','script', +); + + +%MimeHashFamily=( +# Text file +'txt','page', +# HTML Static page +'html','page', +'htm','page', +'wml','page', +'wmlp','page', +'xml','page', +# HTML Dynamic pages or script +'asp','script', +'aspx','script', +'asmx','script', +'cfm','script', +'jsp','script', +'cgi','script', +'ksh','script', +'php','script', +'php3','script', +'php4','script', +'pl','script', +'py','script', +'sh','script', +'shtml','script', +'tcl','script', +'xsp','script', +# Image +'gif','image', +'png','image', +'bmp','image', +'jpg','image', +'jpeg','image', +# Document +'doc','document', +'pdf','document', +'xls','document', +'ppt','document', +'pps','document', +'sxw','document', +'sxc','document', +'sxi','document', +'sxd','document', +'csv','csv', +'xsl','xsl', +# Package +'rpm',($LogType eq 'S'?'audio':'package'), +'deb','package', +'msi','package', +# Archive +'7z','archive', +'ace','archive', +'bz2','archive', +'gz','archive', +'rar','archive', +'tar','archive', +'tgz','archive', +'tbz2','archive', +'z','archive', +'zip','archive', +# Audio +'mp3','audio', +'ogg','audio', +'wav','audio', +'wma','audio', +# Video +'avi','video', +'divx','video', +'mp4','video', +'mpeg','video', +'mpg','video', +'rm','video', +'swf','swf', +# Web scripts +'js','javascript', +'vbs','vbs', +# Config +'cf','conf', +'conf','conf', +'css','css', +'ini','conf', +'dtd','dtd', +# Program +'exe','runtime', +'dll','library', +); + + +1; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/operating_systems.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/operating_systems.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/operating_systems.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,170 @@ +# AWSTATS OPERATING SYSTEMS DATABASE +#------------------------------------------------------- +# If you want to add an OS to extend AWStats database detection capabilities, +# you must add an entry in OSSearchIDOrder, in OSHashID and in OSHashLib. +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSOS; + + +# OSSearchIDOrder +# This list is used to know in which order to search Operating System IDs +# (Most frequent one are first in this list to increase detect speed). +# It contains all matching criteria to search for in log fields. +# Note: OS IDs are in lower case and ' ' and '+' are changed into '_' +#------------------------------------------------------------------------- +@OSSearchIDOrder = ( +# Windows OS family +'windows[_+ ]?2005', 'windows[_+ ]nt[_+ ]6\.0', +'windows[_+ ]?2003','windows[_+ ]nt[_+ ]5\.2', # Must be before windows_nt_5 +'windows[_+ ]xp','windows[_+ ]nt[_+ ]5\.1', # Must be before windows_nt_5 +'windows[_+ ]me','win[_+ ]9x', # Must be before windows_98 +'windows[_+ ]?2000','windows[_+ ]nt[_+ ]5', +'winnt','windows[_+ \-]?nt','win32', +'win(.*)98', +'win(.*)95', +'win(.*)16','windows[_+ ]3', # This works for windows_31 and windows_3.1 +'win(.*)ce', +# Macintosh OS family +'mac[_+ ]os[_+ ]x', +'mac[_+ ]?p', # This works for macppc and mac_ppc and mac_powerpc +'mac[_+ ]68', # This works for mac_6800 and mac_68k +'macweb', +'macintosh', +# Unix like OS +'linux', +'aix', +'sunos', +'irix', +'osf', +'hp-ux', +'netbsd', +'bsdi', +'freebsd', +'openbsd', +'gnu', +'unix','x11', +# Other famous OS +'beos', +'os/2', +'amiga', +'atari', +'vms', +# Miscellanous OS +'cp/m', +'crayos', +'dreamcast', +'risc[_+ ]?os', +'symbian', +'webtv' +); + + +# OSHashID +# Each OS Search ID is associated to a string that is the AWStats id and +# also the name of icon file for this OS. +#-------------------------------------------------------------------------- +%OSHashID = ( +# Windows OS family +'windows[_+ ]?2005','winlong','windows[_+ ]nt[_+ ]6\.0','winlong', +'windows[_+ ]?2003','win2003','windows[_+ ]nt[_+ ]5\.2','win2003', +'windows[_+ ]xp','winxp','windows[_+ ]nt[_+ ]5\.1','winxp', +'windows[_+ ]me','winme','win[_+ ]9x','winme', +'windows[_+ ]?2000','win2000','windows[_+ ]nt[_+ ]5','win2000', +'winnt','winnt','windows[_+ \-]?nt','winnt','win32','winnt', +'win(.*)98','win98', +'win(.*)95','win95', +'win(.*)16','win16','windows[_+ ]3','win16', +'win(.*)ce','wince', +# Macintosh OS family +'mac[_+ ]os[_+ ]x','macosx', +'mac[_+ ]?p','macintosh','mac[_+ ]68','macintosh','macweb','macintosh','macintosh','macintosh', +# Unix like OS +'linux','linux', +'aix','aix', +'sunos','sunos', +'irix','irix', +'osf','osf', +'hp-ux','hp-ux', +'netbsd','netbsd', +'bsdi','bsdi', +'freebsd','freebsd', +'openbsd','openbsd', +'gnu','gnu', +'unix','unix','x11','unix', +# Other famous OS +'beos','beos', +'os/2','os/2', +'amiga','amigaos', +'atari','atari', +'vms','vms', +# Miscellanous OS +'cp/m','cp/m', +'crayos','crayos', +'dreamcast','dreamcast', +'risc[_+ ]?os','riscos', +'symbian','symbian', +'webtv','webtv' +); + +# OS name list ('os unique id in lower case','os clear text') +# Each unique ID string is associated to a label +#----------------------------------------------------------- +%OSHashLib = ( +# Windows family OS +'winlong','Windows Codename Longhorn', +'win2003','Windows 2003', +'winxp','Windows XP', +'winme','Windows Me', +'win2000','Windows 2000', +'winnt','Windows NT', +'win98','Windows 98', +'win95','Windows 95', +'win16','Windows 3.xx', +'wince','Windows CE', +# Macintosh OS +'macosx','Mac OS X', +'macintosh','Mac OS', +# Unix like OS +'linux','Linux', +'aix','Aix', +'sunos','Sun Solaris', +'irix','Irix', +'osf','OSF Unix', +'hp-ux','HP Unix', +'netbsd','NetBSD', +'bsdi','BSDi', +'freebsd','FreeBSD', +'openbsd','OpenBSD', +'gnu','GNU', +'unix','Unknown Unix system', +# Other famous OS +'beos','BeOS', +'os/2','OS/2', +'amigaos','AmigaOS', +'atari','Atari', +'vms','VMS', +# Miscellanous OS +'cp/m','CPM', +'crayos','CrayOS', +'dreamcast','Dreamcast', +'riscos','RISC OS', +'symbian','Symbian OS', +'webtv','WebTV' +); + + +1; + + +# Informations from microsoft for detecting windows version +# Windows 95 retail, OEM 4.00.950 7/11/95 +# Windows 95 retail SP1 4.00.950A 7/11/95-12/31/95 +# OEM Service Release 2 4.00.1111* (4.00.950B) 8/24/96 +# OEM Service Release 2.1 4.03.1212-1214* (4.00.950B) 8/24/96-8/27/97 +# OEM Service Release 2.5 4.03.1214* (4.00.950C) 8/24/96-11/18/97 +# Windows 98 retail, OEM 4.10.1998 5/11/98 +# Windows 98 Second Edition 4.10.2222A 4/23/99 +# Windows Me 4.90.3000 Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/referer_spam.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/referer_spam.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/referer_spam.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,49 @@ +# AWSTATS REFERER SPAMMERS ADATABASE +#------------------------------------------------------- +# If you want to extend AWStats detection capabilities, +# you must add an entry in RefererSpamKeys +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSREFSPAMMERS; + + + +# RefererSpamKeys +# This list is used to know which keywords to search for in referer URLs +# to find if hits comes from a referer spammers. If referer URLs has a +# cost higher or equal to 4, it's a referer spammer. +# key, cost +#------------------------------------------------------- +%RefererSpamKeys = ( +'adult'=>1, +'anal'=>2, +'dick'=>1, +'erotic'=>2, # erotic, erotica +'gay'=>2, +'lesbian'=>2, +'free'=>1, +'porn'=>2, +'sex'=>2, + +'full-list.net'=>4, +'voodoomachine.com'=>4, +'mastodonte.com'=>4, +'surfnomore.com'=>4, +'raverpussies.com'=>4, +'quiveringfuckholes.com'=>4, +'burningbush.netfirms.com'=>4, +'lesbo-tennie-girls.lesbian-hardcore-porn-teen-pics.com'=>4, +'free-people-search-engines.com'=>4, +'iaea.org'=>4, +'1stchoicecolo.com'=>4, +'globoads.com'=>4, +'morganindustriesinc.com'=>4, +'chicagodrugclub.com'=>4, +'massivecocks.com'=>4, + +); + + +1; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/robots.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/robots.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/robots.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,745 @@ +# AWSTATS ROBOTS DATABASE +#------------------------------------------------------- +# If you want to add robots to extend AWStats database detection capabilities, +# you must add an entry in RobotsSearchIDOrder_listx and RobotsHashIDLib. +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSROB; + + +# Robots list was found at http://www.robotstxt.org/wc/active/all.txt +# Other robots can be found at http://www.jafsoft.com/searchengines/webbots.html +# Rem: To avoid bad detection, some robots id were removed from this list: +# - Robots with ID of 3 letters only +# - Robot called 'webs' and 'tcl' +# Rem: Some robot most used for download are also remode: wget +# Rem: directhit changed into direct_hit (its real id) +# Rem: calif changed into calif[^r] to avoid confusion between Tiscalifreenet browser +# Rem: fish changed into [^a]fish to avoid confusion between Madsafish browser +# Rem: roadrunner changed into road_runner +# Rem: lycos changed to lycos_ to avoid confusion with lycos-online browser +# Rem: voyager changed into ^voyager\/ to avoid to exclude voyager and amigavoyager browser + +# RobotsSearchIDOrder +# It contains all matching criteria to search for in log fields. This list is +# used to know in which order to search Robot IDs. +# Most frequent one are in list1, used when LevelForRobotsDetection is 1 or more +# Minor robots are in list2, used when LevelForRobotsDetection is 2 or more +# Note: Robots IDs are in lower case, ' ' and '+' are changed into '_' and are quoted. +#------------------------------------------------------- +@RobotsSearchIDOrder_list1 = ( +# Common robots (In robot file) +'appie', +'architext', +'jeeves', +'bjaaland', +'ferret', +'googlebot', +'gulliver', +'harvest', +'htdig', +'linkwalker', +'lycos_', +'moget', +'muscatferret', +'myweb', +'nomad', +'scooter', +'slurp', +'^voyager\/', +'weblayers', +# Common robots (Not in robot file) +'antibot', +'digout4u', +'echo', +'fast\-webcrawler', +'ia_archiver', +'jennybot', +'mercator', +'netcraft', +'petersnews', +'unlost_web_crawler', +'voila', +'webbase', +'wisenutbot' +); +@RobotsSearchIDOrder_list2 = ( +# Less common robots (In robot file) +'[^a]fish', +'abcdatos', +'acme\.spider', +'ahoythehomepagefinder', +'alkaline', +'anthill', +'arachnophilia', +'arale', +'araneo', +'aretha', +'ariadne', +'arks', +'aspider', +'atn\.txt', +'atomz', +'auresys', +'backrub', +'bbot', +'bigbrother', +'blackwidow', +'blindekuh', +'bloodhound', +'borg\-bot', +'brightnet', +'bspider', +'cactvschemistryspider', +'calif[^r]', +'cassandra', +'cgireader', +'checkbot', +'christcrawler', +'churl', +'cienciaficcion', +'collective', +'combine', +'conceptbot', +'coolbot', +'core', +'cosmos', +'cruiser', +'cusco', +'cyberspyder', +'desertrealm', +'deweb', +'dienstspider', +'digger', +'diibot', +'direct_hit', +'dnabot', +'download_express', +'dragonbot', +'dwcp', +'e\-collector', +'ebiness', +'elfinbot', +'emacs', +'emcspider', +'esther', +'evliyacelebi', +'fastcrawler', +'fdse', +'felix', +'fetchrover', +'fido', +'finnish', +'fireball', +'fouineur', +'francoroute', +'freecrawl', +'funnelweb', +'gama', +'gazz', +'gcreep', +'getbot', +'geturl', +'golem', +'grapnel', +'griffon', +'gromit', +'gulperbot', +'hambot', +'havindex', +'hometown', +'htmlgobble', +'hyperdecontextualizer', +'iajabot', +'iconoclast', +'ilse', +'imagelock', +'incywincy', +'informant', +'infoseek', +'infoseeksidewinder', +'infospider', +'inspectorwww', +'intelliagent', +'irobot', +'iron33', +'israelisearch', +'javabee', +'jbot', +'jcrawler', +'jobo', +'jobot', +'joebot', +'jubii', +'jumpstation', +'kapsi', +'katipo', +'kilroy', +'ko_yappo_robot', +'labelgrabber\.txt', +'larbin', +'legs', +'linkidator', +'linkscan', +'lockon', +'logo_gif', +'macworm', +'magpie', +'marvin', +'mattie', +'mediafox', +'merzscope', +'meshexplorer', +'mindcrawler', +'mnogosearch', +'momspider', +'monster', +'motor', +'msnbot', +'muncher', +'mwdsearch', +'ndspider', +'nederland\.zoek', +'netcarta', +'netmechanic', +'netscoop', +'newscan\-online', +'nhse', +'northstar', +'nzexplorer', +'objectssearch', +'occam', +'octopus', +'openfind', +'orb_search', +'packrat', +'pageboy', +'parasite', +'patric', +'pegasus', +'perignator', +'perlcrawler', +'phantom', +'phpdig', +'piltdownman', +'pimptrain', +'pioneer', +'pitkow', +'pjspider', +'plumtreewebaccessor', +'poppi', +'portalb', +'psbot', +'python', +'raven', +'rbse', +'resumerobot', +'rhcs', +'road_runner', +'robbie', +'robi', +'robocrawl', +'robofox', +'robozilla', +'roverbot', +'rules', +'safetynetrobot', +'search\-info', +'search_au', +'searchprocess', +'senrigan', +'sgscout', +'shaggy', +'shaihulud', +'sift', +'simbot', +'site\-valet', +'sitetech', +'skymob', +'slcrawler', +'smartspider', +'snooper', +'solbot', +'speedy', +'spider_monkey', +'spiderbot', +'spiderline', +'spiderman', +'spiderview', +'spry', +'ssearcher', +'suke', +'suntek', +'sven', +'tach_bw', +'tarantula', +'tarspider', +'techbot', +'templeton', +'titan', +'titin', +'tkwww', +'tlspider', +'ucsd', +'udmsearch', +'urlck', +'valkyrie', +'verticrawl', +'victoria', +'visionsearch', +'voidbot', +'vwbot', +'w3index', +'w3m2', +'wallpaper', +'wanderer', +'wapspider', +'webbandit', +'webcatcher', +'webcopy', +'webfetcher', +'webfoot', +'webinator', +'weblinker', +'webmirror', +'webmoose', +'webquest', +'webreader', +'webreaper', +'websnarf', +'webspider', +'webvac', +'webwalk', +'webwalker', +'webwatch', +'whatuseek', +'whowhere', +'wired\-digital', +'wmir', +'wolp', +'wombat', +'worm', +'wwwc', +'wz101', +'xget', +# Other robots reported by users +'aport', +'awbot', +'baiduspider', +'bobby', +'boris', +'bumblebee', +'cscrawler', +'daviesbot', +'exactseek', +'ezresult', +'gigabot', +'gnodspider', +'grub', +'henrythemiragorobot', +'holmes', +'internetseer', +'justview', +'linkbot', +'metager\-linkchecker', # Must be before linkchecker +'linkchecker', +'mediapartners\-google', +'microsoft_url_control', +'msiecrawler', +'nagios', +'perman', +'pompos', +'rambler', +'redalert', +'shoutcast', +'slysearch', +'surveybot', +'turnitinbot', +'turtlescanner', # Must be before turtle +'turtle', +'ultraseek', +'webclipping\.com', +'webcompass', +'wonderer', +'yahoo\-verticalcrawler', +'yandex', +'zealbot', +'zyborg' +); +@RobotsSearchIDOrder_listgen = ( +# Generic robot +'robot', +'crawl', +'spider' +); + + + +# RobotsHashIDLib +# List of robots names ('robot id','robot clear text') +#------------------------------------------------------- +%RobotsHashIDLib = ( +# Common robots (In robot file) +'appie','Walhello appie', +'architext','ArchitextSpider', +'jeeves','AskJeeves', +'bjaaland','Bjaaland', +'ferret','Wild Ferret Web Hopper #1, #2, #3', +'googlebot','Googlebot', +'gulliver','Northern Light Gulliver', +'harvest','Harvest', +'htdig','ht://Dig', +'linkwalker','LinkWalker', +'lycos_','Lycos', +'moget','moget', +'muscatferret','Muscat Ferret', +'myweb','Internet Shinchakubin', +'nomad','Nomad', +'scooter','Scooter', +'slurp','Inktomi Slurp', +'^voyager\/','Voyager', +'weblayers','weblayers', +# Common robots (Not in robot file) +'antibot','Antibot', +'digout4u','Digout4u', +'echo','EchO!', +'fast\-webcrawler','Fast-Webcrawler', +'ia_archiver','Alexa (IA Archiver)', +'jennybot','JennyBot', +'mercator','Mercator', +'netcraft','Netcraft', +'petersnews','Petersnews', +'unlost_web_crawler','Unlost Web Crawler', +'voila','Voila', +'webbase', 'WebBase', +'wisenutbot','WISENutbot', +# Less common robots (In robot file) +'[^a]fish','Fish search', +'abcdatos','ABCdatos BotLink', +'acme\.spider','Acme.Spider', +'ahoythehomepagefinder','Ahoy! The Homepage Finder', +'alkaline','Alkaline', +'anthill','Anthill', +'arachnophilia','Arachnophilia', +'arale','Arale', +'araneo','Araneo', +'aretha','Aretha', +'ariadne','ARIADNE', +'arks','arks', +'aspider','ASpider (Associative Spider)', +'atn\.txt','ATN Worldwide', +'atomz','Atomz.com Search Robot', +'auresys','AURESYS', +'backrub','BackRub', +'bbot','BBot', +'bigbrother','Big Brother', +'blackwidow','BlackWidow', +'blindekuh','Die Blinde Kuh', +'bloodhound','Bloodhound', +'borg\-bot','Borg-Bot', +'brightnet','bright.net caching robot', +'bspider','BSpider', +'cactvschemistryspider','CACTVS Chemistry Spider', +'calif[^r]','Calif', +'cassandra','Cassandra', +'cgireader','Digimarc Marcspider/CGI', +'checkbot','Checkbot', +'christcrawler','ChristCrawler.com', +'churl','churl', +'cienciaficcion','cIeNcIaFiCcIoN.nEt', +'collective','Collective', +'combine','Combine System', +'conceptbot','Conceptbot', +'coolbot','CoolBot', +'core','Web Core / Roots', +'cosmos','XYLEME Robot', +'cruiser','Internet Cruiser Robot', +'cusco','Cusco', +'cyberspyder','CyberSpyder Link Test', +'desertrealm','Desert Realm Spider', +'deweb','DeWeb(c) Katalog/Index', +'dienstspider','DienstSpider', +'digger','Digger', +'diibot','Digital Integrity Robot', +'direct_hit','Direct Hit Grabber', +'dnabot','DNAbot', +'download_express','DownLoad Express', +'dragonbot','DragonBot', +'dwcp','DWCP (Dridus\' Web Cataloging Project)', +'e\-collector','e-collector', +'ebiness','EbiNess', +'elfinbot','ELFINBOT', +'emacs','Emacs-w3 Search Engine', +'emcspider','ananzi', +'esther','Esther', +'evliyacelebi','Evliya Celebi', +'fastcrawler','FastCrawler', +'fdse','Fluid Dynamics Search Engine robot', +'felix','Felix IDE', +'fetchrover','FetchRover', +'fido','fido', +'finnish','H�m�h�kki', +'fireball','KIT-Fireball', +'fouineur','Fouineur', +'francoroute','Robot Francoroute', +'freecrawl','Freecrawl', +'funnelweb','FunnelWeb', +'gama','gammaSpider, FocusedCrawler', +'gazz','gazz', +'gcreep','GCreep', +'getbot','GetBot', +'geturl','GetURL', +'golem','Golem', +'grapnel','Grapnel/0.01 Experiment', +'griffon','Griffon', +'gromit','Gromit', +'gulperbot','Gulper Bot', +'hambot','HamBot', +'havindex','havIndex', +'hometown','Hometown Spider Pro', +'htmlgobble','HTMLgobble', +'hyperdecontextualizer','Hyper-Decontextualizer', +'iajabot','iajaBot', +'iconoclast','Popular Iconoclast', +'ilse','Ingrid', +'imagelock','Imagelock', +'incywincy','IncyWincy', +'informant','Informant', +'infoseek','InfoSeek Robot 1.0', +'infoseeksidewinder','Infoseek Sidewinder', +'infospider','InfoSpiders', +'inspectorwww','Inspector Web', +'intelliagent','IntelliAgent', +'irobot','I, Robot', +'iron33','Iron33', +'israelisearch','Israeli-search', +'javabee','JavaBee', +'jbot','JBot Java Web Robot', +'jcrawler','JCrawler', +'jobo','JoBo Java Web Robot', +'jobot','Jobot', +'joebot','JoeBot', +'jubii','The Jubii Indexing Robot', +'jumpstation','JumpStation', +'kapsi','image.kapsi.net', +'katipo','Katipo', +'kilroy','Kilroy', +'ko_yappo_robot','KO_Yappo_Robot', +'labelgrabber\.txt','LabelGrabber', +'larbin','larbin', +'legs','legs', +'linkidator','Link Validator', +'linkscan','LinkScan', +'lockon','Lockon', +'logo_gif','logo.gif Crawler', +'macworm','Mac WWWWorm', +'magpie','Magpie', +'marvin','marvin/infoseek', +'mattie','Mattie', +'mediafox','MediaFox', +'merzscope','MerzScope', +'meshexplorer','NEC-MeshExplorer', +'mindcrawler','MindCrawler', +'mnogosearch','mnoGoSearch search engine software', +'momspider','MOMspider', +'monster','Monster', +'motor','Motor', +'msnbot','MSNBot', +'muncher','Muncher', +'mwdsearch','Mwd.Search', +'ndspider','NDSpider', +'nederland\.zoek','Nederland.zoek', +'netcarta','NetCarta WebMap Engine', +'netmechanic','NetMechanic', +'netscoop','NetScoop', +'newscan\-online','newscan-online', +'nhse','NHSE Web Forager', +'northstar','The NorthStar Robot', +'nzexplorer','nzexplorer', +'objectssearch','ObjectsSearch', +'occam','Occam', +'octopus','HKU WWW Octopus', +'openfind','Openfind data gatherer', +'orb_search','Orb Search', +'packrat','Pack Rat', +'pageboy','PageBoy', +'parasite','ParaSite', +'patric','Patric', +'pegasus','pegasus', +'perignator','The Peregrinator', +'perlcrawler','PerlCrawler 1.0', +'phantom','Phantom', +'phpdig','PhpDig', +'piltdownman','PiltdownMan', +'pimptrain','Pimptrain.com\'s robot', +'pioneer','Pioneer', +'pitkow','html_analyzer', +'pjspider','Portal Juice Spider', +'plumtreewebaccessor','PlumtreeWebAccessor', +'poppi','Poppi', +'portalb','PortalB Spider', +'psbot','psbot', +'python','The Python Robot', +'raven','Raven Search', +'rbse','RBSE Spider', +'resumerobot','Resume Robot', +'rhcs','RoadHouse Crawling System', +'road_runner','Road Runner: The ImageScape Robot', +'robbie','Robbie the Robot', +'robi','ComputingSite Robi/1.0', +'robocrawl','RoboCrawl Spider', +'robofox','RoboFox', +'robozilla','Robozilla', +'roverbot','Roverbot', +'rules','RuLeS', +'safetynetrobot','SafetyNet Robot', +'search\-info','Sleek', +'search_au','Search.Aus-AU.COM', +'searchprocess','SearchProcess', +'senrigan','Senrigan', +'sgscout','SG-Scout', +'shaggy','ShagSeeker', +'shaihulud','Shai\'Hulud', +'sift','Sift', +'simbot','Simmany Robot Ver1.0', +'site\-valet','Site Valet', +'sitetech','SiteTech-Rover', +'skymob','Skymob.com', +'slcrawler','SLCrawler', +'smartspider','Smart Spider', +'snooper','Snooper', +'solbot','Solbot', +'speedy','Speedy Spider', +'spider_monkey','spider_monkey', +'spiderbot','SpiderBot', +'spiderline','Spiderline Crawler', +'spiderman','SpiderMan', +'spiderview','SpiderView(tm)', +'spry','Spry Wizard Robot', +'ssearcher','Site Searcher', +'suke','Suke', +'suntek','suntek search engine', +'sven','Sven', +'tach_bw','TACH Black Widow', +'tarantula','Tarantula', +'tarspider','tarspider', +'techbot','TechBOT', +'templeton','Templeton', +'titan','TITAN', +'titin','TitIn', +'tkwww','The TkWWW Robot', +'tlspider','TLSpider', +'ucsd','UCSD Crawl', +'udmsearch','UdmSearch', +'urlck','URL Check', +'valkyrie','Valkyrie', +'verticrawl','Verticrawl', +'victoria','Victoria', +'visionsearch','vision-search', +'voidbot','void-bot', +'vwbot','VWbot', +'w3index','The NWI Robot', +'w3m2','W3M2', +'wallpaper','WallPaper (alias crawlpaper)', +'wanderer','the World Wide Web Wanderer', +'wapspider','w@pSpider by wap4.com', +'webbandit','WebBandit Web Spider', +'webcatcher','WebCatcher', +'webcopy','WebCopy', +'webfetcher','webfetcher', +'webfoot','The Webfoot Robot', +'webinator','Webinator', +'weblinker','WebLinker', +'webmirror','WebMirror', +'webmoose','The Web Moose', +'webquest','WebQuest', +'webreader','Digimarc MarcSpider', +'webreaper','WebReaper', +'websnarf','Websnarf', +'webspider','WebSpider', +'webvac','WebVac', +'webwalk','webwalk', +'webwalker','WebWalker', +'webwatch','WebWatch', +'whatuseek','whatUseek Winona', +'whowhere','WhoWhere Robot', +'wired\-digital','Wired Digital', +'wmir','w3mir', +'wolp','WebStolperer', +'wombat','The Web Wombat', +'worm','The World Wide Web Worm', +'wwwc','WWWC Ver 0.2.5', +'wz101','WebZinger', +'xget','XGET', +# Other robots reported by users +'aport', 'Aport', +'awbot', 'AWBot', +'baiduspider','BaiDuSpider', +'bobby', 'Bobby', +'boris', 'Boris', +'bumblebee', 'Bumblebee (relevare.com)', +'cscrawler','CsCrawler', +'daviesbot', 'DaviesBot', +'exactseek','ExactSeek Crawler', +'ezresult', 'Ezresult', +'gigabot','GigaBot', +'gnodspider','GNOD Spider', +'grub','Grub.org', +'henrythemiragorobot', 'Mirago', +'holmes', 'Holmes', +'internetseer', 'InternetSeer', +'justview', 'JustView', +'linkbot','LinkBot', +'linkchecker','LinkChecker', +'mediapartners\-google','Google AdSense', +'metager\-linkchecker','MetaGer LinkChecker', +'microsoft_url_control','Microsoft URL Control', +'nagios','Nagios', +'msiecrawler','MSIECrawler', +'perman', 'Perman surfer', +'pompos','Pompos', +'rambler', 'StackRambler', +'redalert', 'Red Alert', +'shoutcast','Shoutcast Directory Service', +'slysearch','SlySearch', +'surveybot','SurveyBot', +'turnitinbot','Turn It In', +'turtle', 'Turtle', +'turtlescanner', 'Turtle', +'ultraseek', 'Ultraseek', +'webclipping\.com', 'WebClipping.com', +'webcompass', 'webcompass', +'wonderer', 'Web Wombat Redback Spider', +'yahoo\-verticalcrawler', 'Yahoo Vertical Crawler', +'yandex', 'Yandex bot', +'zealbot','ZealBot', +'zyborg','Zyborg', + +# Generic root ID +'robot', 'Unknown robot (identified by \'robot\')', +'crawl', 'Unknown robot (identified by \'crawl\')', +'spider', 'Unknown robot (identified by \'spider\')', + +# Unknown robots identified by hit on robots.txt +'unknown', 'Unknown robot (identified by hit on \'robots.txt\')' +); + + +# RobotsAffiliateLib +# This list try to tell by which Search Engine a robot is used +#------------------------------------------------------------- +%RobotsAffiliateLib = ( +'fast\-webcrawler'=>'AllTheWeb', +'googlebot'=>'Google', +'msnbot'=>'MSN', +'scooter'=>'AltaVista', +'wisenutbot'=>'Looksmart', +'yahoo\-verticalcrawler'=>'Yahoo', +'zyborg'=>'Looksmart' +); + + + +1; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/search_engines.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/search_engines.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/search_engines.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,492 @@ +# AWSTATS SEARCH ENGINES DATABASE +#------------------------------------------------------------------------------ +# If you want to add a Search Engine to extend AWStats database detection capabilities, +# you must add an entry in SearchEnginesSearchIDOrder, SearchEnginesHashID and in +# SearchEnginesHashLib. +# An entry if known in SearchEnginesKnownUrl is also welcome. +#------------------------------------------------------------------------------ +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSSE; + + +# SearchEnginesSearchIDOrder +# It contains all matching criteria to search for in log fields. This list is +# used to know in which order to search Search Engines IDs. +# Most frequent one are in list1, used when LevelForSearchEnginesDetection is 1 or more +# Minor robots are in list2, used when LevelForSearchEnginesDetection is 2 or more +# Note: Regex IDs are in lower case and ' ' and '+' are changed into '_' +#------------------------------------------------------------------------------ +@SearchEnginesSearchIDOrder_list1=( +# Major internationnal search engines +'images\.google\.', +'google\.','216\.239\.(35\.101|37\.101|39\.100|39\.101|51\.100|51\.101|35\.100)', +'msn\.', +'voila\.', +'yahoo\.','(66\.218\.71\.225|216\.109\.117\.135)', +'search\.aol\.co', +'tiscali\.', +'lycos\.', +'alexa\.com', +'alltheweb\.com', +'altavista\.', +'dmoz\.org', +'netscape\.', +'search\.terra\.', +'www\.search\.com', +'search\.sli\.sympatico\.ca', +'excite\.' +); + +@SearchEnginesSearchIDOrder_list2=( +# Minor internationnal search engines +'northernlight\.', +'hotbot\.', +'kvasir\.', +'webcrawler\.', +'metacrawler\.', +'go2net\.com', +'(^|\.)go\.com', +'euroseek\.', +'looksmart\.', +'spray\.', +'nbci\.com/search', +'(^|\.)ask\.com', +'atomz\.', +'overture\.com', # Replace 'goto\.com','Goto.com', +'teoma\.', +'findarticles\.com', +'infospace\.com', +'mamma\.', +'dejanews\.', +'dogpile\.com', +'wisenut\.com', +'ixquick\.com', +'search\.earthlink\.net', +'i-une\.com', +# Minor brazilian search engines +'engine\.exe', 'miner\.bol\.com\.br', +# Minor chinese search engines +'baidu\.com','search\.sina\.com','search\.sohu\.com', +# Minor czech search engines +'atlas\.cz','seznam\.cz','quick\.cz','centrum\.cz','jyxo\.(cz|com)','najdi\.to','redbox\.cz', +# Minor danish search-engines +'opasia\.dk', 'danielsen\.com', 'sol\.dk', 'jubii\.dk', 'find\.dk', 'edderkoppen\.dk', 'netstjernen\.dk', 'orbis\.dk', 'tyfon\.dk', '1klik\.dk', 'ofir\.dk', +# Minor dutch search engines +'ilse\.','vindex\.', +# Minor english search engines +'(^|\.)ask\.co\.uk','bbc\.co\.uk/cgi-bin/search','ifind\.freeserve','looksmart\.co\.uk','mirago\.','splut\.','spotjockey\.','ukdirectory\.','ukindex\.co\.uk','ukplus\.','searchy\.co\.uk', +# Minor finnish search engines +'haku\.www\.fi', +# Minor french search engines +'recherche\.aol\.fr','ctrouve\.','francite\.','\.lbb\.org','rechercher\.libertysurf\.fr', 'search[\w\-]+\.free\.fr', 'recherche\.club-internet\.fr', +# Minor german search engines +'sucheaol\.aol\.de', +'fireball\.de','infoseek\.de','suche\d?\.web\.de','[a-z]serv\.rrzn\.uni-hannover\.de', +'suchen\.abacho\.de','brisbane\.t-online\.de','allesklar\.de','meinestadt\.de', +'212\.227\.33\.241', +'(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)', +# Minor hungarian search engines +'heureka\.hu','vizsla\.origo\.hu','lapkereso\.hu','goliat\.hu','index\.hu','wahoo\.hu','webmania\.hu','search\.internetto\.hu', +# Minor italian search engines +'virgilio\.it', +# Minor norvegian search engines +'sok\.start\.no', +# Minor polish search engines +'szukaj\.wp\.pl', +# Minor russian search engines +'ya(ndex)?\.ru', 'aport\.ru', 'rambler\.ru', 'turtle\.ru', 'metabot\.ru', +# Minor swedish search engines +'evreka\.passagen\.se', +# Minor swiss search engines +'search\.ch', 'search\.bluewin\.ch' +); +@SearchEnginesSearchIDOrder_listgen=( +# Generic search engines +'search\..*\.\w+' +); + + +# NotSearchEnginesKeys +# If a search engie key is found, we check its exclude list to know if it's +# really a search engine +#------------------------------------------------------------------------------ +%NotSearchEnginesKeys=( +'msn\.'=>'hotmail\.msn\.', +'yahoo\.'=>'mail\.yahoo\.' +); + + +# SearchEnginesHashID +# Each Search Engine Search ID is associated to an AWStats id string +#------------------------------------------------------------------------------ +%SearchEnginesHashID = ( +# Major internationnal search engines +'images\.google\.','google_image', +'google\.','google','216\.239\.(35\.101|37\.101|39\.100|39\.101|51\.100|51\.101|35\.100)','google', +'msn\.','msn', +'voila\.','voila', +'yahoo\.','yahoo','(66\.218\.71\.225|216\.109\.117\.135)','yahoo', +'lycos\.','lycos', +'alexa\.com','alexa', +'alltheweb\.com','alltheweb', +'altavista\.','altavista', +'dmoz\.org','dmoz', +'netscape\.','netscape', +'search\.terra\.','terra', +'www\.search\.com','search.com', +'tiscali\.','tiscali', +'search\.aol\.co','aol', +'search\.sli\.sympatico\.ca','sympatico', +'excite\.','excite', +# Minor internationnal search engines +'northernlight\.','northernlight', +'hotbot\.','hotbot', +'kvasir\.','kvasir', +'webcrawler\.','webcrawler', +'metacrawler\.','metacrawler', +'go2net\.com','go2net', +'(^|\.)go\.com','go', +'euroseek\.','euroseek', +'looksmart\.','looksmart', +'spray\.','spray', +'nbci\.com/search','nbci', +'(^|\.)ask\.com','ask', +'atomz\.','atomz', +'overture\.com','overture', # Replace 'goto\.com','Goto.com', +'teoma\.','teoma', +'findarticles\.com','findarticles', +'infospace\.com','infospace', +'mamma\.','mamma', +'dejanews\.','dejanews', +'dogpile\.com','dogpile', +'wisenut\.com','wisenut', +'ixquick\.com','ixquick', +'search\.earthlink\.net','earthlink', +'i-une\.com','iune', +# Minor brazilian search engines +'engine\.exe','engine', +'miner\.bol\.com\.br','miner', +# Minor chinese search engines +'baidu\.com','baidu', +'search\.sina\.com','sina', +'search\.sohu\.com','sohu', +# Minor czech search engines +'atlas\.cz','atlas', +'seznam\.cz','seznam', +'quick\.cz','quick', +'centrum\.cz','centrum', +'jyxo\.(cz|com)','jyxo', +'najdi\.to','najdi', +'redbox\.cz','redbox', +# Minor danish search-engines +'opasia\.dk','opasia', +'danielsen\.com','danielsen', +'sol\.dk','sol', +'jubii\.dk','jubii', +'find\.dk','finddk', +'edderkoppen\.dk','edderkoppen', +'netstjernen\.dk','netstjernen', +'orbis\.dk','orbis', +'tyfon\.dk','tyfon', +'1klik\.dk','1klik', +'ofir\.dk','ofir', +# Minor dutch search engines +'ilse\.','ilse', +'vindex\.','vindex', +# Minor english search engines +'(^|\.)ask\.co\.uk','askuk', +'bbc\.co\.uk/cgi-bin/search','bbc', +'ifind\.freeserve','freeserve', +'looksmart\.co\.uk','looksmartuk', +'mirago\.','mirago', +'splut\.','splut', +'spotjockey\.','spotjockey', +'ukdirectory\.','ukdirectory', +'ukindex\.co\.uk','ukindex', +'ukplus\.','ukplus', +'searchy\.co\.uk','searchy', +# Minor finnish search engines +'haku\.www\.fi','haku', +# Minor french search engines +'recherche\.aol\.fr','aolfr', +'ctrouve\.','ctrouve', +'francite\.','francite', +'\.lbb\.org','lbb', +'rechercher\.libertysurf\.fr','libertysurf', +'search[\w\-]+\.free\.fr','free', +'recherche\.club-internet\.fr','clubinternet', +# Minor german search engines +'sucheaol\.aol\.de','aolde', +'fireball\.de','fireball', +'infoseek\.de','infoseek', +'suche\d?\.web\.de','webde', +'[a-z]serv\.rrzn\.uni-hannover\.de','meta', +'suchen\.abacho\.de','abacho', +'brisbane\.t-online\.de','t-online', +'allesklar\.de','allesklar', +'meinestadt\.de','meinestadt', +'212\.227\.33\.241','metaspinner', +'(161\.58\.227\.204|161\.58\.247\.101|212\.40\.165\.90|213\.133\.108\.202|217\.160\.108\.151|217\.160\.111\.99|217\.160\.131\.108|217\.160\.142\.227|217\.160\.176\.42)','metacrawler_de', +# Minor hungarian search engines +'heureka\.hu','heureka', +'vizsla\.origo\.hu','origo', +'lapkereso\.hu','lapkereso', +'goliat\.hu','goliat', +'index\.hu','indexhu', +'wahoo\.hu','wahoo', +'webmania\.hu','webmania', +'search\.internetto\.hu','internetto', +# Minor italian search engines +'virgilio\.it','virgilio', +# Minor norvegian search engines +'sok\.start\.no','start', +# Minor polish search engines +'szukaj\.wp\.pl','wp', +# Minor russian search engines +'ya(ndex)?\.ru','yandex', +'aport\.ru','aport', +'rambler\.ru','rambler', +'turtle\.ru','turtle', +'metabot\.ru','metabot', +# Minor swedish search engines +'evreka\.passagen\.se','passagen', +# Minor swiss search engines +'search\.ch','searchch', +'search\.bluewin\.ch','bluewin', +# Generic search engines +'search\..*\.\w+','search' +); + + +# SearchEnginesKnownUrl +# Known rules to extract keywords from a referrer search engine URL +#------------------------------------------------------------------------------ +%SearchEnginesKnownUrl=( +# Most common search engines +'alexa','q=', +'alltheweb','q(|uery)=', +'altavista','q=', +'dmoz','search=', +'google','(p|q)=', +'google_image','(p|q)=', +'lycos','query=', +'msn','q=', +'netscape','search=', +'aol','query=', +'terra','query=', +'voila','kw=', +'search.com','q=', +'yahoo','p=', +'sympatico', 'query=', +'excite','search=', +# Minor internationnal search engines +'go','qt=', +'ask','ask=', +'atomz','sp-q=', +'euroseek','query=', +'findarticles','key=', +'go2net','general=', +'hotbot','mt=', +'infospace','qkw=', +'kvasir', 'q=', +'looksmart','key=', +'mamma','query=', +'metacrawler','general=', +'nbci','keyword=', +'northernlight','qr=', +'overture','keywords=', +'dogpile', 'q(|kw)=', +'spray','string=', +'teoma','q=', +'virgilio','qs=', +'webcrawler','searchText=', +'wisenut','query=', +'ixquick', 'query=', +'earthlink', 'q=', +'iune','(keywords|q)=', +# Minor brazilian search engines +'engine','p1=', 'miner','q=', +# Minor chinese search engines +'baidu','word=', 'sina', 'word=', 'sohu','word=', +# Minor czech search engines +'atlas','searchtext=', 'seznam','w=', 'quick','query=', 'centrum','q=', 'jyxo','s=', 'najdi','dotaz=', 'redbox','srch=', +# Minor danish search engines +'opasia','q=', 'danielsen','q=', 'sol','q=', 'jubii','soegeord=', 'finddk','words=', 'edderkoppen','query=', 'orbis','search_field=', '1klik','query=', 'ofir','querytext=', +# Minor dutch search engines +'ilse','search_for=', 'vindex','in=', +# Minor english search engines +'askuk','ask=', 'bbc','q=', 'freeserve','q=', 'looksmart','key=', +'mirago','txtsearch=', 'splut','pattern=', 'spotjockey','Search_Keyword=', 'ukindex', 'stext=', 'ukdirectory','k=', 'ukplus','search=', 'searchy', 'search_term=', +# Minor finnish search engines +'haku','w=', +# Minor french search engines +'francite','name=', 'clubinternet', 'q=', +# Minor german search engines +'aolde','q=', +'fireball','q=', 'infoseek','qt=', 'webde','su=', +'abacho','q=', 't-online','q=', +'metaspinner','qry=', +'metacrawler_de','qry=', +# Minor hungarian search engines +'heureka','heureka=', 'origo','(q|search)=', 'goliat','KERESES=', 'wahoo','q=', 'internetto','searchstr=', +# Minor norvegian search engines +'start','q=', +# Minor polish search engines +'wp','szukaj=', +# Minor russian search engines +'yandex', 'text=', 'rambler','words=', 'aport', 'r=', 'metabot', 'st=', +# Minor swedish search engines +'passagen','q=', +# Minor swiss search engines +'searchch', 'q=', 'bluewin', 'qry=' +); + +# SearchEnginesKnownUrlNotFound +# Known rules to extract not found keywords from a referrer search engine URL +#------------------------------------------------------------------------------ +%SearchEnginesKnownUrlNotFound=( +# Most common search engines +'msn','origq=' +); + +# If no rules are known, WordsToExtractSearchUrl will be used to search keyword parameter +# If no rules are known and search in WordsToExtractSearchUrl failed, this will be used to clean URL of not keyword parameters. +#------------------------------------------------------------------------------ +@WordsToExtractSearchUrl= ('ask=','claus=','general=','key=','kw=','keyword=','keywords=','MT=','p=','q=','qr=','qt=','query=','s=','search=','searchText=','string=','su=','txtsearch=','w='); +@WordsToCleanSearchUrl= ('act=','annuaire=','btng=','cat=','categoria=','cfg=','cof=','cou=','count=','cp=','dd=','domain=','dt=','dw=','enc=','exec=','geo=','hc=','height=','hits=','hl=','hq=','hs=','id=','kl=','lang=','loc=','lr=','matchmode=','medor=','message=','meta=','mode=','order=','page=','par=','pays=','pg=','pos=','prg=','qc=','refer=','sa=','safe=','sc=','sort=','src=','start=','style=','stype=','sum=','tag=','temp=','theme=','type=','url=','user=','width=','what=','\\.x=','\\.y=','y=','look='); + +# SearchEnginesKnownUTFCoding +# Known param that proves a search engines has coded its param in UTF8 +#------------------------------------------------------------------------------ +%SearchEnginesKnownUTFCoding=( +# Most common search engines +'google','ie=utf-8', +'alltheweb','cs=utf-8' +); + + +# SearchEnginesHashLib +# List of search engines names +# 'search_engine_id', 'search_engine_name', +#------------------------------------------------------------------------------ +%SearchEnginesHashLib=( +# Major internationnal search engines +'alexa','Alexa', +'alltheweb','AllTheWeb', +'altavista','AltaVista', +'dmoz','DMOZ', +'google','Google', +'google_image','Google (Images)', +'lycos','Lycos', +'msn','MSN', +'netscape','Netscape', +'aol','AOL', +'terra','Terra', +'tiscali','Tiscali', +'voila','Voila', +'search.com','Search.com', +'yahoo','Yahoo', +'sympatico', 'Sympatico', +'excite','Excite', +# Minor internationnal search engines +'go','Go.com', +'ask','Ask Jeeves', +'atomz','Atomz', +'dejanews','DejaNews', +'euroseek','Euroseek', +'findarticles','Find Articles', +'go2net','Go2Net (Metamoteur)', +'hotbot','Hotbot', +'infospace','InfoSpace', +'kvasir','Kvasir', +'looksmart','Looksmart', +'mamma','Mamma', +'metacrawler','MetaCrawler (Metamoteur)', +'nbci','NBCI', +'northernlight','NorthernLight', +'overture','Overture', # Replace 'goto\.com','Goto.com', +'dogpile','Dogpile', +'spray','Spray', +'teoma','Teoma', # Replace 'directhit\.com','DirectHit', +'webcrawler','WebCrawler', +'wisenut','WISENut', +'ixquick', 'ix quick', +'earthlink', 'Earth Link', +'iune','i-une.com', +# Minor brazilian search engines +'engine','Cade', 'miner','Meta Miner', +# Minor chinese search engines +'baidu','Baidu', 'sina','Sina', 'sohu','Sohu', +# Minor czech search engines +'atlas','Atlas.cz', 'seznam','Seznam', 'quick','Quick.cz', 'centrum','Centrum.cz', 'jyxo','Jyxo.cz', 'najdi','Najdi.to', 'redbox','RedBox.cz', +# Minor danish search-engines +'opasia','Opasia', 'danielsen','Thor (danielsen.com)', 'sol','SOL', 'jubii','Jubii', 'finddk','Find', 'edderkoppen','Edderkoppen', 'netstjernen','Netstjernen', 'orbis','Orbis', 'tyfon','Tyfon', '1klik','1Klik', 'ofir','Ofir', +# Minor dutch search engines +'ilse','Ilse','vindex','Vindex\.nl', +# Minor english search engines +'askuk','Ask Jeeves UK', 'bbc','BBC', 'freeserve','Freeserve', 'looksmartuk','Looksmart UK', +'mirago','Mirago', 'splut','Splut', 'spotjockey','Spotjockey', 'ukdirectory','UK Directory', 'ukindex','UKIndex', 'ukplus','UK Plus', 'searchy','searchy.co.uk', +# Minor finnish search engines +'haku','Ihmemaa', +# Minor french search engines +'aolfr','AOL (fr)', 'ctrouve','C\'est trouv�', 'francite','Francit�', 'lbb', 'LBB', 'libertysurf', 'Libertysurf', 'free', 'Free.fr', 'clubinternet', 'Club-internet', +# Minor german search engines +'aolde','AOL (de)', +'fireball','Fireball', 'infoseek','Infoseek', 'webde','Web.de', +'abacho','Abacho', 't-online','T-Online', +'allesklar','allesklar.de', 'meinestadt','meinestadt.de', +'metaspinner','metaspinner', +'metacrawler_de','metacrawler.de', +# Minor hungarian search engines +'heureka','Heureka', 'origo','Origo-Vizsla', 'lapkereso','Startlapkeres�', 'goliat','G�li�t', 'indexhu','Index', 'wahoo','Wahoo', 'webmania','webmania.hu', 'internetto','Internetto Keres�', +# Minor italian search engines +'virgilio','Virgilio', +# Minor norvegian search engines +'start','start.no', +# Minor polish search engines +'wp','Szukaj', +# Minor russian search engines +'yandex', 'Yandex', 'aport', 'Aport', 'rambler', 'Rambler', 'turtle', 'Turtle', 'metabot', 'MetaBot', +# Minor swedish search engines +'passagen','Evreka', +# Minor Swiss search engines +'searchch', 'search.ch', 'bluewin', 'search.bluewin.ch', +# Generic search engines +'search','Unknown search engines' +); + + +# Sanity check. +# Enable this code and run perl search_engines.pm to check file entries are ok +#----------------------------------------------------------------------------- +#foreach my $key (@SearchEnginesSearchIDOrder_list1) { +# if (! $SearchEnginesHashID{$key}) { error("Entry '$key' has been found in SearchEnginesSearchIDOrder_list1 with no value in SearchEnginesHashID"); +# foreach my $key2 (@SearchEnginesSearchIDOrder_list2) { if ($key2 eq $key) { error("$key is in 1 and 2\n"); } } +# foreach my $key2 (@SearchEnginesSearchIDOrder_listgen) { if ($key2 eq $key) { error("$key is in 1 and gen\n"); } } +#} } +#foreach my $key (@SearchEnginesSearchIDOrder_list2) { +# if (! $SearchEnginesHashID{$key}) { error("Entry '$key' has been found in SearchEnginesSearchIDOrder_list1 with no value in SearchEnginesHashID"); +# foreach my $key2 (@SearchEnginesSearchIDOrder_list1) { if ($key2 eq $key) { error("$key is in 2 and 1\n"); } } +# foreach my $key2 (@SearchEnginesSearchIDOrder_listgen) { if ($key2 eq $key) { error("$key is in 2 and gen\n"); } } +#} } +#foreach my $key (@SearchEnginesSearchIDOrder_listgen) { if (! $SearchEnginesHashID{$key}) { error("Entry '$key' has been found in SearchEnginesSearchIDOrder_listgen with no value in SearchEnginesHashID"); } } +#foreach my $key (keys %NotSearchEnginesKeys) { if (! $SearchEnginesHashID{$key}) { error("Entry '$key' has been found in NotSearchEnginesKeys with no value in SearchEnginesHashID"); } } +#foreach my $key (keys %SearchEnginesKnownUrl) { +# my $found=0; +# foreach my $key2 (values %SearchEnginesHashID) { +# if ($key eq $key2) { $found=1; last; } +# } +# if (! $found) { die "Entry '$key' has been found in SearchEnginesKnownUrl with no value in SearchEnginesHashID"; } +#} +#foreach my $key (keys %SearchEnginesHashLib) { +# my $found=0; +# foreach my $key2 (values %SearchEnginesHashID) { +# if ($key eq $key2) { $found=1; last; } +# } +# if (! $found) { die "Entry '$key' has been found in SearchEnginesHashLib with no value in SearchEnginesHashID"; } +#} +#print @SearchEnginesSearchIDOrder_list1." ".@SearchEnginesSearchIDOrder_list2." ".@SearchEnginesSearchIDOrder_listgen; + +1; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/status_http.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/status_http.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/status_http.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,69 @@ +# AWSTATS HTTP STATUS DATABASE +#------------------------------------------------------- +# If you want to add a HTTP status code, you must add +# an entry in httpcodelib. +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSHTTPCODES; + + +# httpcodelib +# This list is used to found description of a HTTP status code +#----------------------------------------------------------------- +%httpcodelib = ( +#[Miscellaneous successes] +'2xx'=>'[Miscellaneous successes]', +'200'=>'OK', # HTTP request OK +'201'=>'Created', +'202'=>'Request recorded, will be executed later', +'203'=>'Non-authoritative information', +'204'=>'Request executed', +'205'=>'Reset document', +'206'=>'Partial Content', +#[Miscellaneous redirections] +'3xx'=>'[Miscellaneous redirections]', +'300'=>'Multiple documents available', +'301'=>'Moved permanently (redirect)', +'302'=>'Moved temporarily (redirect)', +'303'=>'See other document', +'304'=>'Not Modified since last retrieval', # HTTP request OK +'305'=>'Use proxy', +'306'=>'Switch proxy', +'307'=>'Moved temporarily', +#[Miscellaneous client/user errors] +'4xx'=>'[Miscellaneous client/user errors]', +'400'=>'Bad Request', +'401'=>'Unauthorized', +'402'=>'Payment required', +'403'=>'Forbidden', +'404'=>'Document Not Found', +'405'=>'Method not allowed', +'406'=>'Document not acceptable to client', +'407'=>'Proxy authentication required', +'408'=>'Request Timeout', +'409'=>'Request conflicts with state of resource', +'410'=>'Document gone permanently', +'411'=>'Length required', +'412'=>'Precondition failed', +'413'=>'Request too long', +'414'=>'Requested filename too long', +'415'=>'Unsupported media type', +'416'=>'Requested range not valid', +'417'=>'Failed', +#[Miscellaneous server errors] +'5xx'=>'[Miscellaneous server errors]', +'500'=>'Internal server Error', +'501'=>'Not implemented', +'502'=>'Received bad response from real server', +'503'=>'Server busy', +'504'=>'Gateway timeout', +'505'=>'HTTP version not supported', +'506'=>'Redirection failed', +#[Unknown] +'xxx'=>'[Unknown]' +); + + +1; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/status_smtp.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/status_smtp.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/status_smtp.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,74 @@ +# AWSTATS SMTP STATUS DATABASE +#------------------------------------------------------- +# If you want to add a SMTP status code, you must add +# an entry in smtpcodelib. +#------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSSMTPCODES; + + +# smtpcodelib +# This list is used to found description of a SMTP status code +#----------------------------------------------------------------- +%smtpcodelib = ( +#[Successfull code] +'200'=>'Nonstandard success response', +'211'=>'System status, or system help reply', +'214'=>'Help message', +'220'=>' Service ready', +'221'=>' Service closing transmission channel', +'250'=>'Requested mail action taken and completed', # Your ISP mail server have successfully executes a command and the DNS is reporting a positive delivery. +'251'=>'User not local: will forward to ', # Your message to a specified email address is not local to the mail server, but it will accept and forward the message to a different recipient email address. +'252'=>'Recipient cannot be verified', # but mail server accepts the message and attempts delivery. +'354'=>'Start mail input and end with .', # Indicates mail server is ready to accept the message or instruct your mail client to send the message body after the mail server have received the message headers. +#[Temporary error code] Ask sender to try later to complete successfully +'421'=>' Service not available, closing transmission channel', # This may be a reply to any command if the service knows it must shut down. +'450'=>'Requested mail action not taken: mailbox busy, DNS check failed or access denied for other reason', # Your ISP mail server indicates that an email address does not exist or the mailbox is busy. It could be the network connection went down while sending, or it could also happen if the remote mail server does not want to accept mail from you for some reason i.e. (IP address, From address, Recipient, etc.) +'451'=>'Requested mail action aborted: error in processing', # Your ISP mail server indicates that the mailing has been interrupted, usually due to overloading from too many messages or transient failure is one in which the message sent is valid, but some temporary event prevents the successful sending of the message. Sending in the future may be successful. +'452'=>'Requested mail action not taken: insufficient system storage', # Your ISP mail server indicates, probable overloading from too many messages and sending in the future may be successful. +'453'=>'Too many messages', # Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up it could go over the max number of messages per connection. To see if this is the case you can try submitting only a few messages to that domain at a time and then keep increasing the number until you find the maximum number accepted by the server. + +# Postfix code for unknown_client_reject_code (postfix default=450) with reject_unknown_clients rule +'470'=>'Access denied: Unknown SMTP client hostname (without DNS A or MX record)', +# Postfix code for unknown_address_reject_code (postfix default=450) with reject_unknown_sender_domain rule +'471'=>'Access denied: Unknown domain for sender or recipient email address (without DNS A or MX record)', + +#[Permanent error code] +'500'=>'Syntax error, command unrecognized or command line too long', +'501'=>'Syntax error in parameters or arguments', +'502'=>'Command not implemented', +'503'=>'Server encountered bad sequence of commands', +'504'=>'Command parameter not implemented', +'521'=>' does not accept mail or closing transmission channel', # You must be pop-authenticated before you can use this SMTP server and you must use your mail address for the Sender/From field. +'530'=>'Access denied', # a Sendmailism ? +'550'=>'Requested mail action not taken: relaying not allowed, unknown recipient user, ...', # Sending an email to recipients outside of your domain are not allowed or your mail server does not know that you have access to use it for relaying messages and authentication is required. Or to prevent the sending of SPAM some mail servers will not allow (relay) send mail to any e-mail using another company�s network and computer resources. +'551'=>'User not local: please try or Invalid Address: Relay request denied', +'552'=>'Requested mail action aborted: exceeded storage allocation', # ISP mail server indicates, probable overloading from too many messages. +'553'=>'Requested mail action not taken: mailbox name not allowed', # Some mail servers have the option to reduce the number of concurrent connection and also the number of messages sent per connection. If you have a lot of messages queued up (being sent) for a domain, it could go over the maximum number of messages per connection and/or some change to the message and/or destination must be made for successful delivery. +'554'=>'Requested mail action rejected: access denied', +'557'=>'Too many duplicate messages', # Resource temporarily unavailable Indicates (probable) that there is some kind of anti-spam system on the mail server. + +# Postfix code for access_map_reject_code (postfix default=554) with access map rule +'570'=>'Access denied: access_map violation (on SMTP client or HELO hostname, sender or recipient email address)', +# Postfix code for maps_rbl_reject_code (postfix default=554) with maps_rbl_domains rule +'571'=>'Access denied: SMTP client listed in RBL', +# Postfix code for relay_domains_reject_code (postfix default=554) with relay_domains_reject rule +'572'=>'Access denied: Relay not authorized or not local host not a gateway', +# Postfix code for unknown_client_reject_code (postfix default=450) with reject_unknown_client rule +'573'=>'Access denied: Unknown SMTP client hostname (without DNS A or MX record)', +# Postfix code for invalid_hostname_reject_code (postfix default=501) with reject_invalid_hostname rule +'574'=>'Access denied: Bad syntax for client HELO hostname (Not RFC compliant)', +# Postfix code for reject_code (postfix default=554) with smtpd_client_restrictions +'575'=>'Access denied: SMTP client hostname rejected', +# Postfix code for unknown_address_reject_code (postfix default=450) with reject_unknown_sender_domain or reject_unknown_recipient_domain rule +'576'=>'Access denied: Unknown domain for sender or recipient email address (without DNS A or MX record)', +# Postfix code for unknown_hostname_reject_code (postfix default=501) with reject_unknown_hostname rule +'577'=>'Access denied: Unknown client HELO hostname (without DNS A or MX record)', +# Postfix code for non_fqdn_reject_code (Postfix default=504) with reject_non_fqdn_hostname, reject_non_fqdn_sender or reject_non_fqdn_recipient rule +'578'=>'Access denied: Invalid domain for client HELO hostname, sender or recipient email address (not FQDN)', +); + + +1; \ No newline at end of file Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/worms.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/worms.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/lib/worms.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,73 @@ +# AWSTATS WORMS ADATABASE +#----------------------------------------------------------------------------- +# If you want to add worms to extend AWStats database detection capabilities, +# you must add an entry in WormsSearchIDOrder, WormsHashID and WormsHashLib. +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +#package AWSWORMS; + + + +# WormsSearchIDOrder +# This list is used to know in which order to search Worm IDs. +# This array is array of Worms matching criteria found in URL submitted +# to web server. This is a not case sensitive ID. +#----------------------------------------------------------------------------- +@WormsSearchIDOrder = ( +'\/default\.ida', +'\/null\.idq', +'exe\?\/c\+dir', +'root\.exe', +'admin\.dll', +'\/nsiislog\.dll', +'\/sumthin', +'\/winnt\/system32\/cmd\.exe', +'\/_vti_inf\.html', +'\/_vti_bin\/shtml\.exe\/_vti_rpc' +); + +# WormsHashID +# Each Worms search ID is associated to a string that is unique name of worm. +#----------------------------------------------------------------------------- +%WormsHashID = ( +'\/default\.ida','code_red', +'\/null\.idq','code_red', +'exe\?\/c\+dir','nimda', +'root\.exe','nimda', +'admin\.dll','nimda', +'\/nsiislog\.dll','mpex', +'\/sumthin','sumthin', +'\/winnt\/system32\/cmd\.exe','nimda', +'\/_vti_inf\.html','unknown', +'\/_vti_bin\/shtml\.exe\/_vti_rpc','unknown' +#'/MSOffice/cltreq.asp' # Not a worm, a check by IE to see if discussion bar is turned on +#'/_vti_bin/owssrv.dll' # Not a worm, a check by IE to see if discussion bar is turned on +); + +# WormsHashLib +# Worms name list ('worm unique id in lower case','worm clear text') +# Each unique ID string is associated to a label +#----------------------------------------------------------------------------- +%WormsHashLib = ( +'code_red','Code Red family worm', +'mpex','IIS Exploit worm', +'nimda','Nimda family worm', +'sumthin','Sumthin worm', +'unknown','Unknown worm' +); + +# WormsHashTarget +# Worms target list ('worm unique id in lower case','worm target clear text') +# Each unique ID string is associated to a target +#----------------------------------------------------------------------------- +%WormsHashTarget = ( +'code_red','IIS', +'mpex','IIS', +'nimda','IIS', +'sumthin','?', +'unknown','MS products', +); + +1; Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/clusterinfo.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/clusterinfo.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/clusterinfo.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,103 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# ClusterInfo AWStats plugin +# This plugin allow you to add information on cluster chart from +# a text file. Like full cluster hostname. +# You must create a file called clusterinfo.configvalue.txt wich contains 2 +# columns separated by a tab char, and store it in DirData directory. +# First column is cluster number and second column is text you want to add. +#----------------------------------------------------------------------------- +# Perl Required Modules: None +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +#if (!eval ('require "TheModule.pm";')) { return $@?"Error: $@":"Error: Need Perl module TheModule"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="6.2"; +my $PluginHooksFunctions="ShowInfoCluster"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$clusterinfoloaded +%ClusterInfo +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_clusterinfo { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin clusterinfo: InitParams=$InitParams",1); + $clusterinfoloaded=0; + %ClusterInfo=(); + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowInfoCluster_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to add additionnal columns to Cluster report. +# This function is called when building rows of the report (One call for each +# row). So it allows you to add a column in report, for example with code : +# print "This is a new cell"; +# Parameters: Cluster number +#----------------------------------------------------------------------------- +sub ShowInfoCluster_clusterinfo { + my $param="$_[0]"; + # <----- + my $filetoload=''; + if ($param && $param ne '__title__' && ! $clusterinfoloaded) { + # Load clusterinfo file + if ($SiteConfig && open(CLUSTERINFOFILE,"$DirData/clusterinfo.$SiteConfig.txt")) { $filetoload="$DirData/clusterinfo.$SiteConfig.txt"; } + elsif (open(CLUSTERINFOFILE,"$DirData/clusterinfo.txt")) { $filetoload="$DirData/clusterinfo.txt"; } + else { error("Couldn't open ClusterInfo file \"$DirData/clusterinfo.txt\": $!"); } + # This is the fastest way to load with regexp that I know + %ClusterInfo = map(/^([^\s]+)\s+(.+)/o,); + close CLUSTERINFOFILE; + debug(" Plugin clusterinfo: ClusterInfo file loaded: ".(scalar keys %ClusterInfo)." entries found."); + $clusterinfoloaded=1; + } + if ($param eq '__title__') { + print "$Message[114]"; + } + elsif ($param) { + print ""; + if ($ClusterInfo{$param}) { print "$ClusterInfo{$param}"; } + else { print " "; } # Undefined cluster info + print ""; + } + else { + print " "; + } + return 1; + # -----> +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/decodeutfkeys.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/decodeutfkeys.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/decodeutfkeys.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,76 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# decodeUTFKeys AWStats plugin +# Allow AWStats to convert keywords strings coded by some search engines in +# UTF8 coding to a common string in a local charset. +#----------------------------------------------------------------------------- +# Perl Required Modules: Encode and URI::Escape +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +if (!eval ('require "Encode.pm"')) { return $@?"Error: $@":"Error: Need Perl module Encode"; } +if (!eval ('require "URI/Escape.pm"')) { return $@?"Error: $@":"Error: Need Perl module URI::Escape"; } +#if (!eval ('require "HTML/Entities.pm"')) { return $@?"Error: $@":"Error: Need Perl module HTML::Entities"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="6.0"; +my $PluginHooksFunctions="DecodeKey"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_decodeutfkeys { + my $InitParams=shift; + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + # -----> + + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + +#------------------------------------------------------------------------------ +# Function: Converts an UTF8 string to specified Charset +# Parameters: utfstringtodecode charsettoencode +# Return: newencodedstring +#------------------------------------------------------------------------------ +sub DecodeKey_decodeutfkeys { + my $string = shift; + my $encoding = shift; + if (! $encoding) { error("Function DecodeKey from plugin decodeutfkeys was called but AWStats don't know language code required to output new value."); } + $string =~ s/\\x(\w\w)/%$1/gi; # Change "\xc4\xbe\xd7\xd3\xc3\xc0" into "%c4%be%d7%d3%c3%c0" + $string=URI::Escape::uri_unescape($string); + if ( $string =~ m/^(?:[\x00-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf])*$/ ) + { + $string=Encode::encode($encoding, Encode::decode("utf-8", $string)); + } + #$string=HTML::Entities::encode_entities($string); + $string =~ s/[;+]/ /g; + return $string; +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/geoip.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/geoip.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/geoip.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,115 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# GeoIp AWStats plugin +# This plugin allow you to get AWStats country report with countries detected +# from a Geographical database (GeoIP internal database) instead of domain +# hostname suffix. +#----------------------------------------------------------------------------- +# Perl Required Modules: Geo::IP or Geo::IP::PurePerl +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +use vars qw/ $type /; +$type='geoip'; +if (!eval ('require "Geo/IP.pm";')) { + $type='geoippureperl'; + if (!eval ('require "Geo/IP/PurePerl.pm";')) { return $@?"Error: $@":"Error: Need Perl module Geo::IP or Geo::IP::PurePerl"; } +} +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.4"; +my $PluginHooksFunctions="GetCountryCodeByAddr GetCountryCodeByName"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +%TmpDomainLookup +$gi +/; +# -----> + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_geoip { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin geoip: InitParams=$InitParams",1); + my $mode=$InitParams; + if ($type eq 'geoippureperl') { + if ($mode eq '' || $mode eq 'GEOIP_MEMORY_CACHE') { $mode=Geo::IP::PurePerl::GEOIP_MEMORY_CACHE(); } + else { $mode=Geo::IP::PurePerl::GEOIP_STANDARD(); } + } else { + if ($mode eq '' || $mode eq 'GEOIP_MEMORY_CACHE') { $mode=Geo::IP::GEOIP_MEMORY_CACHE(); } + else { $mode=Geo::IP::GEOIP_STANDARD(); } + } + %TmpDomainLookup=(); + debug(" Plugin geoip: GeoIP initialized in mode $type $mode",1); + if ($type eq 'geoippureperl') { + $gi = Geo::IP::PurePerl->new($mode); + } else { + $gi = Geo::IP->new($mode); + } + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: GetCountryCodeByName_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +# GetCountryCodeByName is called to translate a host name into a country name. +#----------------------------------------------------------------------------- +sub GetCountryCodeByName_geoip { + my $param="$_[0]"; + # <----- + my $res=$TmpDomainLookup{$param}||''; + if (! $res) { + $res=lc($gi->country_code_by_name($param)); + $TmpDomainLookup{$param}=$res; + if ($Debug) { debug(" Plugin geoip: GetCountryCodeByName for $param: [$res]",5); } + } + elsif ($Debug) { debug(" Plugin geoip: GetCountryCodeByName for $param: Already resolved to $res",5); } + # -----> + return $res; +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: GetCountryCodeByAddr_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +# GetCountryCodeByAddr is called to translate an ip into a country name. +#----------------------------------------------------------------------------- +sub GetCountryCodeByAddr_geoip { + my $param="$_[0]"; + # <----- + my $res=$TmpDomainLookup{$param}||''; + if (! $res) { + $res=lc($gi->country_code_by_addr($param)); + $TmpDomainLookup{$param}=$res; + if ($Debug) { debug(" Plugin geoip: GetCountryCodeByAddr for $param: $res",5); } + } + elsif ($Debug) { debug(" Plugin geoip: GetCountryCodeByAddr for $param: Already resolved to $res",5); } + # -----> + return $res; +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/geoipfree.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/geoipfree.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/geoipfree.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,109 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# GeoIpFree AWStats plugin +# This plugin allow you to get AWStats country report with countries detected +# from a Geographical database (GeoIP internal database) instead of domain +# hostname suffix. +#----------------------------------------------------------------------------- +# Perl Required Modules: Geo::IPfree (version 0.2+) +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +push @INC, "${DIR}/plugins"; +if (!eval ('require "Geo/IPfree.pm";')) { return $@?"Error: $@":"Error: Need Perl module Geo::IPfree"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.5"; +my $PluginHooksFunctions="GetCountryCodeByAddr GetCountryCodeByName"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +%TmpDomainLookup +$gi +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_geoipfree { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin geoipfree: InitParams=$InitParams",1); + %TmpDomainLookup=(); + $gi = Geo::IPfree::new(); +# $gi->Faster; # Do not enable Faster as the Memoize module is rarely available + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: GetCountryCodeByName_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +# GetCountryCodeByName is called to translate a host name into a country name. +#----------------------------------------------------------------------------- +sub GetCountryCodeByName_geoipfree { + my $param="$_[0]"; + # <----- + my $res=$TmpDomainLookup{$param}||''; + if (! $res) { + ($res,undef)=$gi->LookUp($param); + if ($res !~ /\w\w/) { $res='ip'; } + else { $res=lc($res); } + $TmpDomainLookup{$param}=$res; + if ($Debug) { debug(" Plugin geoipfree: GetCountryCodeByName for $param: $res",5); } + } + elsif ($Debug) { debug(" Plugin geoipfree: GetCountryCodeByName for $param: Already resolved to $res",5); } + # -----> + return $res; +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: GetCountryCodeByAddr_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +# GetCountryCodeByAddr is called to translate an ip into a country name. +#----------------------------------------------------------------------------- +sub GetCountryCodeByAddr_geoipfree { + my $param="$_[0]"; + # <----- + my $res=$TmpDomainLookup{$param}||''; + if (! $res) { + ($res,undef)=$gi->LookUp($param); + if ($res !~ /\w\w/) { $res='ip'; } + else { $res=lc($res); } + $TmpDomainLookup{$param}=$res; + if ($Debug) { debug(" Plugin geoipfree: GetCountryCodeByAddr for $param: $res",5); } + } + elsif ($Debug) { debug(" Plugin geoipfree: GetCountryCodeByAddr for $param: Already resolved to $res",5); } + # -----> + return $res; +} + +1; # Do not remove this line + + +# Internal IP address: +# 10.x.x.x +# 192.168.x.x + Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/graphapplet.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/graphapplet.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/graphapplet.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,129 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# GraphApplet AWStats plugin +# Allow AWStats to replace bar graphs with an Applet (awgraphapplet) that draw +# 3D graphs instead. +#----------------------------------------------------------------------------- +# Perl Required Modules: None +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="6.0"; +my $PluginHooksFunctions="ShowGraph"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$DirClasses +/; +# -----> + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_graphapplet { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + $DirClasses=$InitParams; + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + +#------------------------------------------------------- +# PLUGIN FUNCTION: ShowGraph_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +# Add the code for call to applet awgraphapplet +# Parameters: $title $type $showmonthstats \@blocklabel,\@vallabel,\@valcolor,\@valmax,\@valtotal +# Input: None +# Output: HTML code for awgraphapplet insertion +# Return: 0 OK, 1 Error +#------------------------------------------------------- +sub ShowGraph_graphapplet() { + my $title=shift; + my $type=shift; + my $showmonthstats=shift; + my $blocklabel=shift; + my $vallabel=shift; + my $valcolor=shift; + my $valmax=shift; + my $valtotal=shift; + my $valaverage=shift; + my $valdata=shift; + + my $graphwidth=780; + my $graphheight=400; + my $blockspacing=5; + my $valspacing=1; + my $valwidth=5; + my $barsize=0; + my $blockfontsize=11; + if ($type eq 'month') { $graphwidth=540; $graphheight=160; $blockspacing=8; $valspacing=0; $valwidth=6; $barsize=$BarHeight; $blockfontsize=11; } + elsif ($type eq 'daysofmonth') { $graphwidth=640; $graphheight=160; $blockspacing=3; $valspacing=0; $valwidth=4; $barsize=$BarHeight; $blockfontsize=9; } + elsif ($type eq 'daysofweek') { $graphwidth=300; $graphheight=160; $blockspacing=10; $valspacing=0; $valwidth=6; $barsize=$BarHeight; $blockfontsize=10; } + elsif ($type eq 'hours') { $graphwidth=600; $graphheight=160; $blockspacing=4; $valspacing=0; $valwidth=6; $barsize=$BarHeight; $blockfontsize=11; } + else { error("Unknown type parameter in ShowGraph_graphapplet function"); } + +# print "\n"; + print "\n"; +print < + + + + + + +EOF + print "\n"; + print "\n"; + foreach my $i (1..(scalar @$blocklabel)) { + print "\n"; + } + print "\n"; + foreach my $i (1..(scalar @$vallabel)) { + print "\n"; + print "\n"; + print "\n"; + print "\n"; + print "\n"; + } +print < + + +EOF + foreach my $j (1..(scalar @$blocklabel)) { + my $b=''; + foreach my $i (0..(scalar @$vallabel)-1) { $b.=@$valdata[($j-1)*(scalar @$vallabel)+$i]." "; } + $b=~s/\s$//; + print "\n"; + } + print "
    \n"; + + return 0; +} + + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/hashfiles.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/hashfiles.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/hashfiles.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,130 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# HashFiles AWStats plugin +# Allows AWStats to read/save its data file as native hash files. +# This increase read andwrite files operations. +#----------------------------------------------------------------------------- +# Perl Required Modules: Storable +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +if (!eval ('require "Storable.pm";')) { return $@?"Error: $@":"Error: Need Perl module Storable"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.1"; +my $PluginHooksFunctions="SearchFile LoadCache SaveHash"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$PluginHashfilesUpToDate +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_hashfiles { + my $InitParams=shift; + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + $PluginHashfilesUpToDate=1; + # -----> + + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNTION: SearchFile_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +#----------------------------------------------------------------------------- +sub SearchFile_hashfiles { + my ($searchdir,$dnscachefile,$filesuffix,$dnscacheext,$filetoload)=@_; # Get params sent by ref + if (-f "${searchdir}$dnscachefile$filesuffix.hash") { + my ($tmp1a,$tmp2a,$tmp3a,$tmp4a,$tmp5a,$tmp6a,$tmp7a,$tmp8a,$tmp9a,$datesource,$tmp10a,$tmp11a,$tmp12a) = stat("${searchdir}$dnscachefile$filesuffix$dnscacheext"); + my ($tmp1b,$tmp2b,$tmp3b,$tmp4b,$tmp5b,$tmp6b,$tmp7b,$tmp8b,$tmp9b,$datehash,$tmp10b,$tmp11b,$tmp12b) = stat("${searchdir}$dnscachefile$filesuffix.hash"); + if ($datesource && $datehash < $datesource) { + $PluginHashfilesUpToDate=0; + debug(" Plugin hashfiles: Hash file not up to date. Will use source file $filetoload instead."); + } + else { + # There is no source file or there is and hash file is up to date. We can just load hash file + $filetoload="${searchdir}$dnscachefile$filesuffix.hash"; + } + } + elsif ($filetoload) { + $PluginHashfilesUpToDate=0; + debug(" Plugin hashfiles: Hash file not found. Will use source file $filetoload instead."); + } + # Change calling params + $_[4]=$filetoload; +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: LoadCache_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +#----------------------------------------------------------------------------- +sub LoadCache_hashfiles { + my ($filetoload,$hashtoload)=@_; + if ($filetoload =~ /\.hash$/) { + # There is no source file or there is and hash file is up to date. We can just load hash file + eval('%$hashtoload = %{ retrieve("$filetoload") };'); + } +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: SaveHash_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +#----------------------------------------------------------------------------- +sub SaveHash_hashfiles { + my ($filetosave,$hashtosave,$testifuptodate,$nbmaxofelemtosave,$nbofelemsaved)=@_; + if (! $testifuptodate || ! $PluginHashfilesUpToDate) { + $filetosave =~ s/(\.\w+)$//; $filetosave.=".hash"; + debug(" Plugin hashfiles: Save data ".($nbmaxofelemtosave?"($nbmaxofelemtosave records max)":"(all records)")." into hash file $filetosave"); + if (! $nbmaxofelemtosave || (scalar keys %$hashtosave <= $nbmaxofelemtosave)) { + # Save all hash array + eval('store(\%$hashtosave, "$filetosave");'); + $_[4]=scalar keys %$hashtosave; + } + else { + debug(" Plugin hashfiles: We need to resize hash to save from ".(scalar keys %$hashtosave)." to $nbmaxofelemtosave"); + # Save part of hash array + my $counter=0; + my %newhashtosave=(); + foreach my $key (keys %$hashtosave) { + $newhashtosave{$key}=$hashtosave->{$key}; + if (++$counter >= $nbmaxofelemtosave) { last; } + } + eval('store(\%newhashtosave, "$filetosave");'); + $_[4]=scalar keys %newhashtosave; + } + $_[0]=$filetosave; + } + else { + $_[4]=0; + } +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/hostinfo.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/hostinfo.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/hostinfo.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,198 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# HostInfo AWStats plugin +# This plugin allow you to add information on hosts, like a whois fields. +#----------------------------------------------------------------------------- +# Perl Required Modules: XWhois +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +push @INC, "${DIR}/plugins"; +if (!eval ('require "Net/XWhois.pm";')) { return $@?"Error: $@":"Error: Need Perl module Net::XWhois"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="6.0"; +my $PluginHooksFunctions="ShowInfoHost AddHTMLBodyHeader BuildFullHTMLOutput"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_hostinfo { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin hostinfo: InitParams=$InitParams",1); + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLBodyHeader_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code at beginning of BODY section. +# Parameters: None +#----------------------------------------------------------------------------- +sub AddHTMLBodyHeader_hostinfo { + # <----- + my $WIDTHINFO=640; + my $HEIGHTINFO=480; + + my $urlparam="pluginmode=hostinfo&config=$SiteConfig"; + $urlparam.=($DirConfig?"&configdir=$DirConfig":""); + + print < +function neww(a,b) { +var wfeatures="directories=0,menubar=1,status=0,resizable=1,scrollbars=1,toolbar=0,width=$WIDTHINFO,height=$HEIGHTINFO,left=" + eval("(screen.width - $WIDTHINFO)/2") + ",top=" + eval("(screen.height - $HEIGHTINFO)/2"); +EOF + print "if (b==1) { fen=window.open('".XMLEncode("$AWScript?$urlparam&host")."='+a,'whois',wfeatures); }\n"; + print "if (b==2) { fen=window.open('".XMLEncode("$AWScript?$urlparam&host")."='+a,'whois',wfeatures); }\n"; +print < + +EOF + + return 1; + # -----> +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowInfoHost_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to add additionnal columns to the Hosts report. +# This function is called when building rows of the report (One call for each +# row). So it allows you to add a column in report, for example with code : +# print "This is a new cell for $param"; +# Parameters: Host name or ip +#----------------------------------------------------------------------------- +sub ShowInfoHost_hostinfo { + my $param="$_[0]"; + # <----- + if ($param eq '__title__') { + print "$Message[114]"; + } + elsif ($param) { + my $keyforwhois; + my $linkforwhois; + if ($param =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) { # IPv4 address + $keyforwhois=$param; + $linkforwhois=2; + } + elsif ($param =~ /^[0-9A-F]*:/i) { # IPv6 address + $keyforwhois=$param; + $linkforwhois=2; + } + else { # Hostname + $param =~ /([-\w]+\.[-\w]+\.(?:au|uk|jp|nz))$/ or $param =~ /([-\w]+\.[-\w]+)$/; + $keyforwhois=$1; + $linkforwhois=1; + } + print ""; + if ($keyforwhois && $linkforwhois) { print "?"; } + else { print " " } + print ""; + } + else { + print " "; + } + return 1; + # -----> +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNTION: BuildFullHTMLOutput_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to output an HTML page completely built by plugin instead +# of AWStats output +#----------------------------------------------------------------------------- +sub BuildFullHTMLOutput_hostinfo { + # <----- + my $Host=''; + if ($QueryString =~ /host=([^&]+)/i) { + $Host=lc(&DecodeEncodedString("$1")); + } + + my $ip=''; + my $HostResolved=''; +# my $regipv4=qr/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; +# my $regipv6=qr/^[0-9A-F]*:/i; +# if ($Host =~ /$regipv4/o) { $ip=4; } +# elsif ($Host =~ /$regipv6/o) { $ip=6; } +# if ($ip == 4) { +# my $lookupresult=lc(gethostbyaddr(pack("C4",split(/\./,$Host)),AF_INET)); # This is very slow, may spend 20 seconds +# if (! $lookupresult || $lookupresult =~ /$regipv4/o || ! IsAscii($lookupresult)) { +# $HostResolved='*'; +# } +# else { +# $HostResolved=$lookupresult; +# } +# if ($Debug) { debug(" Reverse DNS lookup for $Host done: $HostResolved",4); } +# } + if (! $ip) { $HostResolved=$Host; } + + if ($Debug) { debug(" Plugin hostinfo: DirData=$DirData Host=$Host HostResolved=$HostResolved ",4); } + my $w = new Net::XWhois Verbose=>$Debug, Cache=>$DirData, NoCache=>0, Timeout=>10, Domain=>$HostResolved; + + print "
    \n"; + + if ($w && $w->response()) { + &tab_head("Common Whois Fields",0,0,'whois'); + print "Common field infoValue\n"; + print "Name".($w->name())." "; + print "Status".($w->status())." "; + print "NameServers".($w->nameservers())." "; + print "Registrant".($w->registrant())." "; + print "Contact Admin".($w->contact_admin())." "; + print "Contact Tech".($w->contact_tech())." "; + print "Contact Billing".($w->contact_billing())." "; + print "Contact Zone".($w->contact_zone())." "; + print "Contact Emails".($w->contact_emails())." "; + print "Contact Handles".($w->contact_handles())." "; + print "Domain Handles".($w->domain_handles())." "; + &tab_end; + } + + &tab_head("Full Whois Field",0,0,'whois'); + if ($w && $w->response()) { + print "
    ".($w->response())."
    \n"; + } + else { + print "
    The Whois command failed.
    Did the server running AWStats is allowed to send WhoIs queries (If a firewall is running, port 43 should be opened from inside to outside) ?

    \n"; + } + &tab_end; + + return 1; + # -----> +} + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/ipv6.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/ipv6.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/ipv6.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,72 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# IPv6 AWStats plugin +# This plugin allow AWStats to make reverse DNS Lookup on IPv6 addresses. +#----------------------------------------------------------------------------- +# Perl Required Modules: Net::IP and Net::DNS +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +if (!eval ('require "Net/IP.pm";')) { return $@?"Error: $@":"Error: Need Perl module Net::IP"; } +if (!eval ('require "Net/DNS.pm";')) { return $@?"Error: $@":"Error: Need Perl module Net::DNS"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.5"; +my $PluginHooksFunctions="GetResolvedIP"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$resolver +/; +# -----> + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_ipv6 { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin ipv6: InitParams=$InitParams",1); + $resolver = Net::DNS::Resolver->new; + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: GetResolvedIP_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +# GetResolvedIP is called to resolve an IPv6 address into a host name +#----------------------------------------------------------------------------- +sub GetResolvedIP_ipv6 { + # <----- + my $ip = new Net::IP($_[0]); + my $reverseip= $ip->reverse_ip(); + my $query = $resolver->query($reverseip, "PTR"); + if (! defined($query)) { return; } + my @result=split(/\s/, ($query->answer)[0]->string); + return $result[4]; + # -----> +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/rawlog.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/rawlog.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/rawlog.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,132 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# Rawlog AWStats plugin +# This plugin adds a form in AWStats main page to allow users to see raw +# content of current log files. A filter is also available. +#----------------------------------------------------------------------------- +# Perl Required Modules: None +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES. +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.7"; +my $PluginHooksFunctions="AddHTMLBodyHeader BuildFullHTMLOutput"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$MAXLINE +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_rawlog { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin rawlog: InitParams=$InitParams",1); + + if ($QueryString =~ /rawlog_maxlines=(\d+)/i) { $MAXLINE=&DecodeEncodedString("$1"); } + else { $MAXLINE=5000; } + + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNTION: AddHTMLBodyHeader_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code at beginning of BODY section. +#----------------------------------------------------------------------------- +sub AddHTMLBodyHeader_rawlog { + # <----- + # Show form only if option -staticlinks not used + if (! $StaticLinks) { &_ShowForm(''); } + return 1; + # -----> +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNTION: BuildFullHTMLOutput_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to output an HTML page completely built by plugin instead +# of AWStats output +#----------------------------------------------------------------------------- +sub BuildFullHTMLOutput_rawlog { + # <----- + my $Filter=''; + if ($QueryString =~ /filterrawlog=([^&]+)/i) { $Filter=&DecodeEncodedString("$1"); } + + # A security check + if ($QueryString =~ /logfile=/i) { + print "
    Option logfile is not allowed while building rawlog output.
    "; + return 0; + } + + # Show form + &_ShowForm($Filter); + + # Precompiled regex Filter to speed up scan + if ($Filter) { $Filter=qr/$Filter/i; } + + print "
    \n"; + + # Show raws + my $xml=($BuildReportFormat eq 'xhtml'); + open(LOG,"$LogFile") || error("Couldn't open server log file \"$LogFile\" : $!"); + binmode LOG; # Avoid premature EOF due to log files corrupted with \cZ or bin chars + my $i=0; + print "
    ";
    +	while () {
    +		chomp $_; $_ =~ s/\r//;
    +		if ($Filter && $_ !~ /$Filter/o) { next; }
    +		print ($xml?XMLEncode("$_"):"$_");
    +		print "\n";
    +		if (++$i >= $MAXLINE) { last; }
    +	}
    +	print "

    \n$i lines.
    "; + return 1; + # -----> +} + +sub _ShowForm { + my $Filter=shift||''; + print "
    \n"; + print "
    \n"; + print "\n"; + print "
    "; + print "\n"; + print "\n"; + print "\n"; + print "
    Show content of file '$LogFile' ($MAXLINE first lines):
    $Message[79]:       Max Number of Lines:       \n"; + print ""; + print "
    \n"; + print "
    \n"; + print "
    \n"; +} + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/timehires.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/timehires.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/timehires.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,57 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# TimeHires AWStats plugin +# Change time accuracy in showsteps option from seconds to milliseconds +#----------------------------------------------------------------------------- +# Perl Required Modules: Time::HiRes +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +if (!eval ('require "Time/HiRes.pm"')) { return $@?"Error: $@":"Error: Need Perl module Time::HiRes"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.1"; +my $PluginHooksFunctions="GetTime"; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_timehires { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: GetTime_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +#----------------------------------------------------------------------------- +sub GetTime_timehires { + my ($sec,$msec)=Time::HiRes::gettimeofday(); + $_[0]=$sec; + $_[1]=$msec; +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/timezone.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/timezone.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/timezone.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,80 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# TimeZone AWStats plugin +# Allow AWStats to correct a bad timezone for user of IIS that use strange +# log format. +#----------------------------------------------------------------------------- +# Perl Required Modules: None +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# !!!!! This plugin reduces AWStats speed by 40% !!!!! +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +#use Time::Local 'timelocal_nocheck'; +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.1"; +my $PluginHooksFunctions="ChangeTime GetTimeZoneTitle"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$PluginTimeZoneSeconds +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_timezone { + my $InitParams=shift; + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + if (! $InitParams || int($InitParams) == 0) { return "Error: Disable plugin if TimeZone is 0 (Plugin useless)"; } # We do not need this plugin if TZ=0 + $PluginTimeZoneSeconds=(int($InitParams)*3600); + # -----> + + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ChangeTime_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +#----------------------------------------------------------------------------- +sub ChangeTime_timezone { + my $dateparts=shift; + my ($nsec,$nmin,$nhour,$nmday,$nmon,$nyear,$nwday) = localtime(Time::Local::timelocal(int(@$dateparts[5]), int(@$dateparts[4]), int(@$dateparts[3]), int(@$dateparts[0]), int(@$dateparts[1])-1, int(@$dateparts[2])-1900) + $PluginTimeZoneSeconds); + return ($nmday, $nmon+1, $nyear+1900, $nhour, $nmin, $nsec); +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: GetTimeZoneTitle_pluginname +# UNIQUE: YES (Only one plugin using this function can be loaded) +#----------------------------------------------------------------------------- +sub GetTimeZoneTitle_timezone { + return ($PluginTimeZoneSeconds/3600); +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/tooltips.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/tooltips.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/tooltips.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,206 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# Tooltips AWStats plugin +# This plugin allow you to add some toolpus in AWStats HTML report pages. +# The tooltip are in same language than the report (they are stored in the +# awstats-tt-codelanguage.txt files in lang directory). +#----------------------------------------------------------------------------- +# Perl Required Modules: None +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES. +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="6.1"; +my $PluginHooksFunctions="AddHTMLStyles AddHTMLBodyHeader"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$TOOLTIPWIDTH +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_tooltips { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin tooltips: InitParams=$InitParams",1); + $TOOLTIPON=1; + $TOOLTIPWIDTH=380; # Width of tooltips + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLStyles_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML styles at beginning of BODY section. +#----------------------------------------------------------------------------- +sub AddHTMLStyles_tooltips { + # <----- + print "div { font: 12px 'Arial','Verdana','Helvetica', sans-serif; text-align: justify; }\n"; + print ".CTooltip { position:absolute; top: 0px; left: 0px; z-index: 2; width: ${TOOLTIPWIDTH}px; visibility:hidden; font: 8pt 'MS Comic Sans','Arial',sans-serif; background-color: #FFFFE6; padding: 8px; border: 1px solid black; }\n"; + return 1; + # -----> +} + + +#----------------------------------------------------------------------------- +# PLUGIN FUNTION: AddHTMLBodyHeader_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code at beginning of BODY section. +#----------------------------------------------------------------------------- +sub AddHTMLBodyHeader_tooltips { + # <----- + if ($FrameName ne 'mainleft') { + + # GET AND WRITE THE TOOLTIP STRINGS + #--------------------------------------------------------------------- + &_ReadAndOutputTooltipFile($Lang); + + # WRITE TOOLTIPS JAVASCRIPT CODE + #--------------------------------------------------------------------- + # Position .style.pixelLeft/.pixelHeight/.pixelWidth/.pixelTop IE OK Opera OK + # .style.left/.height/.width/.top IE456 OK Netscape67 OK XHTML OK + # document.getElementById IE456 OK Opera OK Netscape67 OK XHTML OK + # document.body.offsetWidth|document.body.style.pixelWidth IE OK Opera OK Netscape OK XHTML KO Visible width of container + # document.body.scrollTop IE OK Opera OK Netscape OK XHTML KO Visible width of container + # document.documentElement.offsetWidth XHTML OK Visible width of container + # document.body.scrollTop IE OK Opera OK Netscape OK XHTML KO Visible width of container + # tooltipOBJ.offsetWidth|tooltipOBJ.style.pixelWidth IE OK Opera OK Netscape OK Width of an object + # event.clientXY IE OK Opera OK Netscape KO XHTML KO Return position of mouse + + my $docwidth="document.body.offsetWidth"; + my $doctop="document.body.scrollTop"; + if ($BuildReportFormat eq 'xhtml' || $BuildReportFormat eq 'xml') { + $docwidth="document.documentElement.offsetWidth"; + $doctop="document.documentElement.scrollTop"; + } + + print < +function ShowTip(fArg) +{ + var tooltipOBJ = (document.getElementById) ? document.getElementById('tt' + fArg) : eval("document.all['tt" + fArg + "']"); + if (tooltipOBJ != null) { + var tooltipLft = ($docwidth?$docwidth:document.body.style.pixelWidth) - (tooltipOBJ.offsetWidth?tooltipOBJ.offsetWidth:(tooltipOBJ.style.pixelWidth?tooltipOBJ.style.pixelWidth:$TOOLTIPWIDTH)) - 30; + var tooltipTop = 10; + if (navigator.appName == 'Netscape') { + tooltipTop = ($doctop>=0?$doctop+10:event.clientY+10); + tooltipOBJ.style.top = tooltipTop+"px"; + tooltipOBJ.style.left = tooltipLft+"px"; + } + else { + tooltipTop = ($doctop>=0?$doctop+10:event.clientY+10); + tooltipTop = (document.body.scrollTop>=0?document.body.scrollTop+10:event.clientY+10); +EOF + # Seul IE en HTML a besoin de code suppl�mentaire. IE en xhtml est OK + if ($BuildReportFormat ne 'xhtml' && $BuildReportFormat ne 'xml') { +print < tooltipLft) && (event.clientY < (tooltipOBJ.scrollHeight?tooltipOBJ.scrollHeight:tooltipOBJ.style.pixelHeight) + 10)) { + tooltipTop = ($doctop?$doctop:document.body.offsetTop) + event.clientY + 20; + } +EOF + } +print < + +EOF + + } + return 1; + # -----> +} + + +#------------------------------------------------------------------------------ +# Function: Get the tooltip texts for a specified language and write it +# Parameters: LanguageId +# Input: $DirLang $DIR +# Output: Full tooltips text +# Return: None +#------------------------------------------------------------------------------ +sub _ReadAndOutputTooltipFile { + # Check lang files in common possible directories : + # Windows and standard package: "$DIR/lang" (lang in same dir than awstats.pl) + # Debian package : "/usr/share/awstats/lang" + # Other possible directories : "./lang" + my @PossibleLangDir=("$DirLang","${DIR}/lang","/usr/share/awstats/lang","./lang"); + + my $FileLang=''; + my $logtype=lc($LogType ne 'S'?$LogType:'W'); + foreach my $dir (@PossibleLangDir) { + my $searchdir=$dir; + if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } + if (open(LANG,"${searchdir}tooltips_${logtype}/awstats-tt-$_[0].txt")) { $FileLang="${searchdir}tooltips_${logtype}/awstats-tt-$_[0].txt"; last; } + } + # If file not found, we try english + if (! $FileLang) { + foreach my $dir (@PossibleLangDir) { + my $searchdir=$dir; + if ($searchdir && (!($searchdir =~ /\/$/)) && (!($searchdir =~ /\\$/)) ) { $searchdir .= "/"; } + if (open(LANG,"${searchdir}tooltips_${logtype}/awstats-tt-en.txt")) { $FileLang="${searchdir}tooltips_${logtype}/awstats-tt-en.txt"; last; } + } + } + if ($Debug) { debug(" Plugin tooltips: Call to Read_Language_Tooltip [FileLang=\"$FileLang\"]"); } + if ($FileLang) { + my $aws_PROG=ucfirst($PROG); + my $aws_VisitTimeout = $VISITTIMEOUT/10000*60; + my $aws_NbOfRobots = scalar keys %RobotsHashIDLib; + my $aws_NbOfWorms = scalar @WormsSearchIDOrder; + my $aws_NbOfSearchEngines = scalar keys %SearchEnginesHashLib; + while () { + if ($_ =~ /\ +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.5"; +my $PluginHooksFunctions="ShowInfoURL"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$urlinfoloaded +%UrlAlias +@UrlMatch +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_urlalias { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin urlalias: InitParams=$InitParams",1); + $urlinfoloaded=0; + %UrlAlias=(); + @UrlMatch=(); + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowInfoURL_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to add additionnal information for URLs in URLs' report. +# This function is called after writing the URL value in the URL cell of the +# Top Pages-URL report. +# Parameters: URL +#----------------------------------------------------------------------------- +sub ShowInfoURL_urlalias { + my $param="$_[0]"; + # <----- + my $found = 0; # flag for testing for whether a match occurs. unused at present + my $filetoload=''; + my $filetoload2=''; + if ($param && ! $urlinfoloaded) { + # Load urlalias and match files + if ($SiteConfig && open(URLALIASFILE,"$DirData/urlalias.$SiteConfig.txt")) { $filetoload2="$DirData/urlalias.$SiteConfig.txt"; } + elsif (open(URLALIASFILE,"$DirData/urlalias.txt")) { $filetoload2="$DirData/urlalias.txt"; } + else { error("Couldn't open UrlAlias file \"$DirData/urlalias.txt\": $!"); } + if ($SiteConfig && open(URLMATCHFILE,"$DirData/urlmatch.$SiteConfig.txt")) { $filetoload="$DirData/urlmatch.$SiteConfig.txt"; } + elsif (open(URLMATCHFILE,"$DirData/urlmatch.txt")) { $filetoload="$DirData/urlmatch.txt"; } + # Load UrlAlias + %UrlAlias = map(/^([^\t]+)\t+([^\t]+)/o,); + # Load UrlMatch + my $iter = 0; + foreach my $key () { + $key =~ /^([^\t]+)\t+([^\t]+)/o; + $UrlMatch[$iter][0] = $1; + $UrlMatch[$iter][1] = $2; + $iter++; + } + close URLALIASFILE; + close URLMATCHFILE; + debug(" Plugin urlalias: UrlAlias file loaded: ".(scalar keys %UrlAlias)." entries found."); + debug(" Plugin urlalias: UrlMatch file loaded: ".(scalar @UrlMatch)." entries found."); + $urlinfoloaded=1; + } + if ($param) { + if ($UrlAlias{$param}) { + print "$UrlAlias{$param}
    "; + $found=1; + } + else { + foreach my $iter (0..@UrlMatch-1) { + my $key = $UrlMatch[$iter][0]; + if ( $param =~ /$key/ ) { + print "$UrlMatch[$iter][1]
    "; + $found = 1; +# $UrlAlias{$param} = $UrlMatch[$iter][1]; +# if ($SiteConfig && open(URLALIASFILE,">> $DirData/urlalias.$SiteConfig.txt")) { +# $filetoload="$DirData/urlalias.$SiteConfig.txt"; +# } +# elsif (open(URLALIASFILE,">> $DirData/urlalias.txt")) { +# $filetoload="$DirData/urlalias.txt"; +# } +# else { +# error("Couldn't open UrlAlias file \"$DirData/urlalias.txt\": $!"); +# } +# print URLALIASFILE "$param\t$UrlAlias{$param}"; +# close URLALIASFILE; + last; + } + } + } + if (!$found) { # does nothing right now + print ""; + } + } + else { print ""; } # Url info title + return 1; + # -----> +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/userinfo.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/userinfo.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/userinfo.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,104 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# UserInfo AWStats plugin +# This plugin allow you to add information on authenticated users chart from +# a text file. Like full user name and lastname. +# You must create a file called userinfo.configvalue.txt wich contains 2 +# columns separated by a tab char, and store it in DirData directory. +# First column is authenticated user login and second column is text you want +# to add. +#----------------------------------------------------------------------------- +# Perl Required Modules: None +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +#if (!eval ('require "TheModule.pm";')) { return $@?"Error: $@":"Error: Need Perl module TheModule"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +my $PluginNeedAWStatsVersion="5.5"; +my $PluginHooksFunctions="ShowInfoUser"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$userinfoloaded +%UserInfo +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_userinfo { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" Plugin userinfo: InitParams=$InitParams",1); + $userinfoloaded=0; + %UserInfo=(); + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowInfoUser_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to add additionnal columns to Authenticated users report. +# This function is called when building rows of the report (One call for each +# row). So it allows you to add a column in report, for example with code : +# print "This is a new cell"; +# Parameters: User +#----------------------------------------------------------------------------- +sub ShowInfoUser_userinfo { + my $param="$_[0]"; + # <----- + my $filetoload=''; + if ($param && $param ne '__title__' && ! $userinfoloaded) { + # Load userinfo file + if ($SiteConfig && open(USERINFOFILE,"$DirData/userinfo.$SiteConfig.txt")) { $filetoload="$DirData/userinfo.$SiteConfig.txt"; } + elsif (open(USERINFOFILE,"$DirData/userinfo.txt")) { $filetoload="$DirData/userinfo.txt"; } + else { error("Couldn't open UserInfo file \"$DirData/userinfo.txt\": $!"); } + # This is the fastest way to load with regexp that I know + %UserInfo = map(/^([^\t]+)\t+([^\t]+)/o,); + close USERINFOFILE; + debug(" Plugin userinfo: UserInfo file loaded: ".(scalar keys %UserInfo)." entries found."); + $userinfoloaded=1; + } + if ($param eq '__title__') { + print "$Message[114]"; + } + elsif ($param) { + print ""; + if ($UserInfo{$param}) { print "$UserInfo{$param}"; } + else { print " "; } # Undefined user info + print ""; + } + else { + print " "; + } + return 1; + # -----> +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/example/example.pm =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/example/example.pm,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/cgi-bin/plugins/example/example.pm 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,202 @@ +#!/usr/bin/perl +#----------------------------------------------------------------------------- +# Example AWStats plugin +# <----- +# THIS IS A SAMPLE OF AN EMPTY PLUGIN FILE WITH INSTRUCTIONS TO HELP YOU TO +# WRITE YOUR OWN WORKING PLUGIN. REPLACE THIS SENTENCE WITH THE PLUGIN GOAL. +# NOTE THAT A PLUGIN FILE example.pm MUST BE IN LOWER CASE. +# -----> +#----------------------------------------------------------------------------- +# Perl Required Modules: Put here list of all required plugins +#----------------------------------------------------------------------------- +# $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + + +# <----- +# ENTER HERE THE USE COMMAND FOR ALL REQUIRED PERL MODULES +#if (!eval ('require "TheModule.pm";')) { return $@?"Error: $@":"Error: Need Perl module TheModule"; } +# -----> +use strict;no strict "refs"; + + + +#----------------------------------------------------------------------------- +# PLUGIN VARIABLES +#----------------------------------------------------------------------------- +# <----- +# ENTER HERE THE MINIMUM AWSTATS VERSION REQUIRED BY YOUR PLUGIN +# AND THE NAME OF ALL FUNCTIONS THE PLUGIN MANAGE. +# EACH POSSIBLE FUNCTION AND GOAL ARE DESCRIBED LATER. +my $PluginNeedAWStatsVersion="5.6"; +my $PluginHooksFunctions="xxx"; +# -----> + +# <----- +# IF YOUR PLUGIN NEED GLOBAL VARIABLES, THEY MUST BE DECLARED HERE. +use vars qw/ +$PluginVariable1 +/; +# -----> + + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: Init_pluginname +#----------------------------------------------------------------------------- +sub Init_example { + my $InitParams=shift; + my $checkversion=&Check_Plugin_Version($PluginNeedAWStatsVersion); + + # <----- + # ENTER HERE CODE TO DO INIT PLUGIN ACTIONS + debug(" InitParams=$InitParams",1); + $PluginVariable1=""; + # -----> + + return ($checkversion?$checkversion:"$PluginHooksFunctions"); +} + + + +# HERE ARE ALL POSSIBLE HOOK FUNCTIONS. YOU MUST CHANGE THE NAME OF THE +# FUNCTION xxx_example INTO xxx_pluginname (pluginname in lower case). +# NOTE THAT IN PLUGINS' FUNCTIONS, YOU CAN USE ANY AWSTATS GLOBAL VARIALES. + + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLStyles_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML styles at beginning of BODY section. +# Parameters: None +#----------------------------------------------------------------------------- +sub AddHTMLStyles_example { + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLBodyHeader_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code at beginning of BODY section (top of page). +# Parameters: None +#----------------------------------------------------------------------------- +sub AddHTMLBodyHeader_example { + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLBodyFooter_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code at end of BODY section (bottom of page). +# Parameters: None +#----------------------------------------------------------------------------- +sub AddHTMLBodyFooter_example { + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLMenuHeader_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code just before the menu section +# Parameters: None +#----------------------------------------------------------------------------- +sub AddHTMLMenuHeader_example { + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLMenuFooter_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code just after the menu section +# Parameters: None +#----------------------------------------------------------------------------- +sub AddHTMLMenuFooter_example { + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: AddHTMLContentHeader_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to Add HTML code just before the first report +# Parameters: None +#----------------------------------------------------------------------------- +sub AddHTMLContentHeader_example { + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowInfoHost_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to add additionnal columns to the Hosts report. +# This function is called when building rows of the report (One call for each +# row). So it allows you to add a column in report, for example with code : +# print "This is a new cell for $param"; +# Parameters: Host name or ip +#----------------------------------------------------------------------------- +sub ShowInfoHost_example { + my $param="$_[0]"; + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowPagesAddField_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function used to add additionnal columns to the Top Pages-URL report. +# This function is called when building rows of the report (One call for each +# row). So it allows you to add a column in report, for example with code : +# print "This is a new cell for $param"; +# Parameters: URL +#----------------------------------------------------------------------------- +sub ShowPagesAddField_example { + my $param="$_[0]"; + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowInfoURL_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to add additionnal information for URLs in URLs' report. +# This function is called after writing the URL value in the URL cell of the +# Top Pages-URL report. +# Parameters: URL +#----------------------------------------------------------------------------- +sub ShowInfoURL_example { + my $param="$_[0]"; + # <----- + # PERL CODE HERE + # -----> +} + +#----------------------------------------------------------------------------- +# PLUGIN FUNCTION: ShowInfoUser_pluginname +# UNIQUE: NO (Several plugins using this function can be loaded) +# Function called to add additionnal columns to Authenticated users report. +# This function is called when building rows of the report (One call for each +# row). So it allows you to add a column in report, for example with code : +# print "This is a new cell for $param"; +# Parameters: User +#----------------------------------------------------------------------------- +sub ShowInfoUser_example { + my $param="$_[0]"; + # <----- + # PERL CODE HERE + # -----> +} + + +1; # Do not remove this line Index: openacs-4/packages/user-tracking/www/awstats/classes/awgraphapplet.jar =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/classes/awgraphapplet.jar,v diff -u Binary files differ Index: openacs-4/packages/user-tracking/www/awstats/classes/src/AWGraphApplet.java =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/awstats/classes/src/AWGraphApplet.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking/www/awstats/classes/src/AWGraphApplet.java 1 Mar 2005 17:35:41 -0000 1.1 @@ -0,0 +1,450 @@ +/* + * @(#)AWGraphApplet.java + * $Revision: 1.1 $ - $Author: rocaelh $ - $Date: 2005/03/01 17:35:41 $ + * + */ + +import java.applet.Applet; +import java.awt.*; +import java.util.Vector; + + +public class AWGraphApplet extends Applet +{ + + public AWGraphApplet() + { + special = "Not yet defined"; + textVertSpacing = 0; + b_fontsize = 11; + blockSpacing = 5; + valSpacing = 0; + valWidth = 5; + maxLabelWidth = 0; + background_color = Color.white; + border_color = Color.white; + special_color = Color.gray; + backgraph_colorl = Color.decode("#F6F6F6"); + backgraph_colorm = Color.decode("#EDEDED"); + backgraph_colorh = Color.decode("#E0E0E0"); + } + +// public synchronized void init() { + public synchronized void start() + { + special = getParameter("special"); + if (special == null) { special = ""; } + + Log("Applet "+VERSION+" ($Revision: 1.1 $) init"); + + String s = getParameter("b_fontsize"); + if (s != null) { b_fontsize = Integer.parseInt(s); } + + title = getParameter("title"); + if (title == null) { title = "Chart"; } + + s = getParameter("nbblocks"); + if (s != null) { nbblocks = Integer.parseInt(s); } + + s = getParameter("nbvalues"); + if (s != null) { nbvalues = Integer.parseInt(s); } + + s = getParameter("blockspacing"); + if (s != null) { blockSpacing = Integer.parseInt(s); } + s = getParameter("valspacing"); + if (s != null) { valSpacing = Integer.parseInt(s); } + s = getParameter("valwidth"); + if (s != null) { valWidth = Integer.parseInt(s); } + + s = getParameter("orientation"); + if (s == null) { orientation = VERTICAL; } + else if (s.equalsIgnoreCase("horizontal")) { orientation = HORIZONTAL; } + else { orientation = VERTICAL; } + s = getParameter("barsize"); + if (s != null) { barsize = Integer.parseInt(s); } + + s = getParameter("background_color"); + if (s != null) { background_color = Color.decode("#"+s); } + s = getParameter("border_color"); + if (s != null) { border_color = Color.decode("#"+s); } + s = getParameter("special_color"); + if (s != null) { special_color = Color.decode("#"+s); } + + Log("bblocks "+nbblocks); + Log("nbvalues "+nbvalues); + Log("barsize "+barsize); + + font = new Font("Verdana,Arial,Helvetica", 0, b_fontsize); + fontb = new Font("Verdana,Arial,Helvetica", Font.BOLD, b_fontsize); + fontmetrics = getFontMetrics(font); + + blabels = new String[nbblocks]; + vlabels = new String[nbvalues]; + styles = new int[nbvalues]; + max = new float[nbvalues]; + colors = new Color[nbvalues]; + values = new float[nbblocks][nbvalues]; + + for (int i=0; i < nbvalues; i++) { + parseLabel(i); + parseStyle(i); + parseColor(i); + parseMax(i); + } + for (int j=0; j < nbblocks; j++) { + parsebLabel(j); + parseValue(j); + } + for (int i=0; i < nbvalues; i++) { + if (max[i]<=0.0F) { max[i]=1.0F; } + Log("max["+i+"]="+max[i]); + } + } + + private synchronized void Log(String s) + { + System.out.println(getClass().getName()+" ("+special+"): "+s); + } + + private synchronized void parsebLabel(int i) + { + String s = getParameter("b" + (i+1) + "_label"); + if (s==null) { + blabels[i] = ""; + } else { + blabels[i] = s; + } + maxLabelWidth = Math.max(fontmetrics.stringWidth(blabels[i]), maxLabelWidth); + } + + private synchronized void parseLabel(int i) + { + String s = getParameter("v" + (i+1) + "_label"); + if (s==null) { + vlabels[i] = ""; + } else { + vlabels[i] = s; + } + } + + private synchronized void parseStyle(int i) + { + String s = getParameter("v" + (i+1) + "_style"); + if (s == null || s.equalsIgnoreCase("solid")) { + styles[i] = SOLID; + } else if (s.equalsIgnoreCase("striped")) { + styles[i] = STRIPED; + } else { + styles[i] = SOLID; + } + } + + private synchronized void parseColor(int i) + { + String s = getParameter("v" + (i+1) + "_color"); + if (s != null) { + colors[i] = Color.decode("#"+s); + } else { + colors[i] = Color.gray; + } + } + + private synchronized void parseMax(int i) + { + String s = getParameter("v" + (i+1) + "_max"); + if (s != null) { + max[i] = Float.valueOf(s).floatValue(); + } else { + max[i] = 1.0F; + } + } + + private synchronized void parseValue(int i) + { + String s = getParameter("b" + (i+1)); + if (s != null) { + String[] as=split(s," ",0); + for (int j=0; j"+width+","+h+"=>"+height); + + polygon.addPoint(x,y); + polygon.addPoint(x+width,y); + polygon.addPoint(x+width,y-height); + polygon.addPoint(x,y-height); + g.setColor(color); + g.fillPolygon(polygon); + g.setColor(color.darker()); + g.drawPolygon(polygon); + Polygon polygon2 = new Polygon(); + polygon2.addPoint(x+width,y); + polygon2.addPoint(x+width+shift,y-shift); + polygon2.addPoint(x+width+shift,y-shift-height); + polygon2.addPoint(x+width,y-height); + g.setColor(color.darker()); + g.fillPolygon(polygon2); + g.setColor(color.darker().darker()); + g.drawPolygon(polygon2); + Polygon polygon3 = new Polygon(); + polygon3.addPoint(x,y-height); + polygon3.addPoint(x+width,y-height); + polygon3.addPoint(x+width+shift,y-height-shift); + polygon3.addPoint(x+shift,y-height-shift); + g.setColor(color); + g.fillPolygon(polygon3); + g.setColor(color.darker()); + g.drawPolygon(polygon3); + } + + private synchronized void paintHorizontal(Graphics g) + { + } + + private synchronized void paintVertical(Graphics g) + { + g.setColor(Color.black); + g.setFont(font); + + int shift=10; + int allbarwidth=(((nbvalues*(valWidth+valSpacing))+blockSpacing)*nbblocks); + int allbarheight=barsize; + int axepointx=(getSize().width-allbarwidth)/2 - 2*shift; + int axepointy = getSize().height - (2*fontmetrics.getHeight()) - 2 - textVertSpacing; + + int cx=axepointx; + int cy=axepointy; + + // Draw axes + Polygon polygon = new Polygon(); + polygon.addPoint(cx,cy); + polygon.addPoint(cx+allbarwidth+3*shift,cy); + polygon.addPoint(cx+allbarwidth+4*shift,cy-shift); + polygon.addPoint(cx+shift,cy-shift); + g.setColor(backgraph_colorl); + g.fillPolygon(polygon); + g.setColor(Color.lightGray); + g.drawPolygon(polygon); + Polygon polygon2 = new Polygon(); + polygon2.addPoint(cx,cy); + polygon2.addPoint(cx+shift,cy-shift); + polygon2.addPoint(cx+shift,cy-shift-barsize); + polygon2.addPoint(cx,cy-barsize); + g.setColor(backgraph_colorh); + g.fillPolygon(polygon2); + g.setColor(Color.lightGray); + g.drawPolygon(polygon2); + Polygon polygon3 = new Polygon(); + polygon3.addPoint(cx+shift,cy-shift); + polygon3.addPoint(cx+allbarwidth+4*shift,cy-shift); + polygon3.addPoint(cx+allbarwidth+4*shift,cy-shift-barsize); + polygon3.addPoint(cx+shift,cy-shift-barsize); + g.setColor(backgraph_colorm); + g.fillPolygon(polygon3); + g.setColor(Color.lightGray); + g.drawPolygon(polygon3); + + cx+=2*shift; + + // Loop on each block + for (int j = 0; j < nbblocks; j++) { + + // Draw the block label +// Log("Write block j="+j+" with cx="+cx); + cy = getSize().height - fontmetrics.getHeight() - 3 - textVertSpacing; + g.setColor(Color.black); + + // Check if bold or highlight + int bold=0; int highlight=0; String label=blabels[j]; + if (blabels[j].indexOf(":")>0) { bold=1; label=remove(blabels[j],":"); } + if (blabels[j].indexOf("!")>0) { highlight=1; label=remove(blabels[j],"!"); } + + if (bold==1) { g.setFont(fontb); } + String as[] = split(label, "\247", 0); + // Write background for block legend + if (highlight==1) { + g.setColor(special_color); + g.fillRect(cx-Math.max(-1+blockSpacing>>1,0),cy-fontmetrics.getHeight()+2,(nbvalues*(valWidth+valSpacing))+Math.max(blockSpacing-2,0)+1,((fontmetrics.getHeight()+textVertSpacing)*as.length)+2); + g.setColor(Color.black); + } + // Write text for block legend + for (int i=0; i>1; + if (cxoffset<0) { cxoffset=0; } + g.drawString(as[i], cx+cxoffset, cy); + cy+=fontmetrics.getHeight()+textVertSpacing-1; + } + if (bold==1) { g.setFont(font); } + + // Loop on each value + for (int i = 0; i < nbvalues; i++) { + + cy = getSize().height - fontmetrics.getHeight() - 6 - textVertSpacing; + cy -= fontmetrics.getHeight() - 4; + + // draw the shadow and bar + draw3DBar(g,cx,cy,valWidth,(values[j][i]*(float)barsize)/max[i],SHIFTBAR,colors[i]); + + cy = (int)((float)cy - (values[j][i] + 5F)); + cx += (valWidth + valSpacing); + } + + cx += blockSpacing; + } + } + + public synchronized String getAppletInfo() + { + return "Title: " + title + "\n"; + } + + public synchronized String[][] getParameterInfo() + { + String[][] as = { + {"version", "string", "AWGraphApplet "+VERSION}, + {"copyright", "string", "GPL"}, + {"title", "string", title} + }; + return as; + } + + private static final int VERTICAL = 0; + private static final int HORIZONTAL = 1; + private static final int SOLID = 0; + private static final int STRIPED = 1; + private static final int DEBUG = 3; + private static final int SHIFTBAR = 3; + private static final String VERSION = "1.1"; + + private String title; + private String special; + private Font font; + private Font fontb; + private FontMetrics fontmetrics; + private int orientation; + private int barsize; + + private int nbblocks; + private String blabels[]; + private int b_fontsize; + private int blockSpacing; + private int textVertSpacing; + + private int nbvalues; + private Color colors[]; + private String vlabels[]; + private int styles[]; + private float max[]; + private int valSpacing; + private int valWidth; + + private float values[][]; + + private int maxLabelWidth; + private Color background_color; + private Color border_color; + private Color special_color; + private Color backgraph_colorl; + private Color backgraph_colorm; + private Color backgraph_colorh; +} + + + +// # Applet Applet.getAppletContext().getApplet( "receiver" ) +// that accesses another Applet uniquely identified via a name you assign in the HTML +// +// +// * This must be added after the tag, not placed within the +// tags, or the resulting tracking tag will not be handled +// correctly by all browsers. Internet explorer will also not report +// screen height and width attributes until it begins to render the +// body. +// +// This allows AWStats to be enhanced with some miscellanous features: +// - Screen size detection (TRKscreen) +// - Browser size detection (TRKwinsize) +// - Screen color depth detection (TRKcdi) +// - Java enabled detection (TRKjava) +// - Macromedia Director plugin detection (TRKshk) +// - Macromedia Shockwave plugin detection (TRKfla) +// - Realplayer G2 plugin detection (TRKrp) +// - QuickTime plugin detection (TRKmov) +// - Mediaplayer plugin detection (TRKwma) +// - Acrobat PDF plugin detection (TRKpdf) +//------------------------------------------------------------------- + +// If you use pslogger.php to generate your log, you can change this line with +// var awstatsmisctrackerurl="pslogger.php?loc=/js/awstats_misc_tracker.js"; +var awstatsmisctrackerurl="/js/awstats_misc_tracker.js"; + +function awstats_setCookie(TRKNameOfCookie, TRKvalue, TRKexpirehours) { + var TRKExpireDate = new Date (); + TRKExpireDate.setTime(TRKExpireDate.getTime() + (TRKexpirehours * 3600 * 1000)); + document.cookie = TRKNameOfCookie + "=" + escape(TRKvalue) + "; path=/" + ((TRKexpirehours == null) ? "" : "; expires=" + TRKExpireDate.toGMTString()); +} + +function awstats_detectIE(TRKClassID) { + TRKresult = false; + document.write('\n on error resume next \n TRKresult = IsObject(CreateObject("' + TRKClassID + '"))\n'); + if (TRKresult) return 'y'; + else return 'n'; +} + +function awstats_detectNS(TRKClassID) { + TRKn = "n"; + if (TRKnse.indexOf(TRKClassID) != -1) if (navigator.mimeTypes[TRKClassID].enabledPlugin != null) TRKn = "y"; + return TRKn; +} + +function awstats_getCookie(TRKNameOfCookie){ + if (document.cookie.length > 0){ + TRKbegin = document.cookie.indexOf(TRKNameOfCookie+"="); + if (TRKbegin != -1) { + TRKbegin += TRKNameOfCookie.length+1; + TRKend = document.cookie.indexOf(";", TRKbegin); + if (TRKend == -1) TRKend = document.cookie.length; + return unescape(document.cookie.substring(TRKbegin, TRKend)); + } + return null; + } + return null; +} + +if (window.location.search == "") { + + TRKnow = new Date(); + TRKscreen=screen.width+"x"+screen.height; + if (navigator.appName != "Netscape") {TRKcdi=screen.colorDepth} + else {TRKcdi=screen.pixelDepth}; + TRKjava=navigator.javaEnabled(); + TRKuserid=awstats_getCookie("AWSUSER_ID"); + TRKsessionid=awstats_getCookie("AWSSESSION_ID"); + var TRKrandomnumber=Math.floor(Math.random()*10000); + if (TRKuserid == null || (TRKuserid=="")) {TRKuserid = "awsuser_id" + TRKnow.getTime() +"r"+ TRKrandomnumber}; + if (TRKsessionid == null || (TRKsessionid=="")) {TRKsessionid = "awssession_id" + TRKnow.getTime() +"r"+ TRKrandomnumber}; + awstats_setCookie("AWSUSER_ID", TRKuserid, 10000); + awstats_setCookie("AWSSESSION_ID", TRKsessionid, 1); + TRKuserid=""; TRKuserid=awstats_getCookie("AWSUSER_ID"); + TRKsessionid=""; TRKsessionid=awstats_getCookie("AWSSESSION_ID"); + + var TRKagt=navigator.userAgent.toLowerCase(); + var TRKie = (TRKagt.indexOf("msie") != -1); + var TRKns = (navigator.appName.indexOf("Netscape") != -1); + var TRKwin = ((TRKagt.indexOf("win")!=-1) || (TRKagt.indexOf("32bit")!=-1)); + var TRKmac = (TRKagt.indexOf("mac")!=-1); + + // Detect the browser internal width and height + if (document.documentElement && document.documentElement.clientWidth) + TRKwinsize = document.documentElement.clientWidth + 'x' + document.documentElement.clientHeight; + else if (document.body) + TRKwinsize = document.body.clientWidth + 'x' + document.body.clientHeight; + else + TRKwinsize = window.innerWidth + 'x' + window.innerHeight; + + if (TRKie && TRKwin) { + var TRKshk = awstats_detectIE("SWCtl.SWCtl.1") + var TRKfla = awstats_detectIE("ShockwaveFlash.ShockwaveFlash.1") + var TRKrp = awstats_detectIE("rmocx.RealPlayer G2 Control.1") + var TRKmov = awstats_detectIE("QuickTimeCheckObject.QuickTimeCheck.1") + var TRKwma = awstats_detectIE("MediaPlayer.MediaPlayer.1") + var TRKpdf = 'n'; + if (awstats_detectIE("PDF.PdfCtrl.1") == 'y') { TRKpdf = 'y'; } + if (awstats_detectIE('PDF.PdfCtrl.5') == 'y') { TRKpdf = 'y'; } + if (awstats_detectIE('PDF.PdfCtrl.6') == 'y') { TRKpdf = 'y'; } + } + if (TRKns || !TRKwin) { + TRKnse = ""; for (var TRKi=0;TRKi') + +} Index: openacs-4/packages/user-tracking/www/img/vh.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/img/vh.png,v diff -u Binary files differ Index: openacs-4/packages/user-tracking/www/img/vk.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/img/vk.png,v diff -u Binary files differ Index: openacs-4/packages/user-tracking/www/img/vp.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/img/vp.png,v diff -u Binary files differ Index: openacs-4/packages/user-tracking/www/img/vu.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/img/vu.png,v diff -u Binary files differ Index: openacs-4/packages/user-tracking/www/img/vv.png =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking/www/img/vv.png,v diff -u Binary files differ Index: openacs-4/packages/user-tracking-portlet/user-tracking-portlet.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/user-tracking-portlet.info,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/user-tracking-portlet.info 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,32 @@ + + + + + UserTracking Portlet + UserTracking Portlets + f + t + + + Pablo Arozarena + Sergio Gonz�lez + David Ortega + 2004-10-25 + E-lane + + + + + + + + + + + + + + + + + Index: openacs-4/packages/user-tracking-portlet/catalog/user-tracking-portlet.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/catalog/user-tracking-portlet.en_US.ISO-8859-1.xml,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/catalog/user-tracking-portlet.en_US.ISO-8859-1.xml 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,15 @@ + + + + Admin Options + Community + General Options + in the community + See this community stats + See site stats + See your community stats + See your site stats + See your stats + User Tracking package access + User tracking package + Index: openacs-4/packages/user-tracking-portlet/catalog/user-tracking-portlet.es_ES.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/catalog/user-tracking-portlet.es_ES.ISO-8859-1.xml,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/catalog/user-tracking-portlet.es_ES.ISO-8859-1.xml 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,15 @@ + + + + Opciones de Administrador + Comunidad + Opciones Generales + en la comunidad + Ver estad&iacute;sticas de esta communidad + Ver estad&iacute;sticas del site + Ver tus estad&iacute;sticas en esta comunidad / clase + Ver tus estad&iacute;sticas en el site + Ver tus estad&iacute;sticas + Acceso al paquete User Tracking + Acceso al paquete de User-tracking + Index: openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-admin-portlet-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-admin-portlet-create.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-admin-portlet-create.sql 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,150 @@ +-- /user-tracking-portlet/sql/postgresql/user-tracking-admin-portlet-create.sql +-- +-- Creates User Tracking portlet +-- +-- @author David Ortega (doa@tid.es) +-- @creation-date 2004-10-25 +-- + +create function inline_0 () +returns integer as ' +declare + ds_id portal_datasources.datasource_id%TYPE; +begin + ds_id = portal_datasource__new( + ''user_tracking_admin_portlet'', + ''User Tracking Admin Portlet'' + ); + +RAISE NOTICE '' created new ds''; + + perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''shadeable_p'', + ''f'' + ); + +RAISE NOTICE '' set shadeable''; + perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''hideable_p'', + ''f'' + ); + +RAISE NOTICE '' set hideable''; + perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''user_editable_p'', + ''f'' + ); + + perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''shaded_p'', + ''f'' + ); + + perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''link_hideable_p'', + ''t'' + ); + + perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''f'', + ''package_id'', + '' '' + ); + + +return 0; + +end;' language 'plpgsql'; + + + +select inline_0(); + +drop function inline_0 (); + +-- create the implementation +select acs_sc_impl__new ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'user_tracking_admin_portlet' +); + +-- add all the hooks +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'GetMyName', + 'user_tracking_admin_portlet::get_my_name', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'GetPrettyName', + 'user_tracking_admin_portlet::get_pretty_name', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'Link', + 'user_tracking_admin_portlet::link', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'AddSelfToPage', + 'user_tracking_admin_portlet::add_self_to_page', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'Show', + 'user_tracking_admin_portlet::show', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'Edit', + 'user_tracking_admin_portlet::edit', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'RemoveSelfFromPage', + 'user_tracking_admin_portlet::remove_self_from_page', + 'TCL' +); + +-- Add the binding +select acs_sc_binding__new( + 'portal_datasource', + 'user_tracking_admin_portlet' +); Index: openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-admin-portlet-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-admin-portlet-drop.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-admin-portlet-drop.sql 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,91 @@ +-- /user-tracking-portlet/sql/oracle/user-tracking-admin-portlet-create.sql +-- + +-- Creates user-tracking admin portlet + +-- @author David Ortega (doa@tid.es) +-- @creation-date 2004-10-25 + + +create function inline_0 () +returns integer as ' +declare + ds_id portal_datasources.datasource_id%TYPE; +begin + + select datasource_id into ds_id + from portal_datasources + where name = ''user_tracking_admin_portlet''; + + if not found then + raise exception ''No datasource_id found here '',ds_id ; + ds_id := null; + end if; + + + if ds_id is NOT null then + perform portal_datasource__delete(ds_id); + end if; + +return 0; + +end;' language 'plpgsql'; + +select inline_0 (); + +drop function inline_0 (); + +-- create the implementation +select acs_sc_impl__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet' +); + +-- delete all the hooks +select acs_sc_impl_alias__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'GetMyName' +); + +select acs_sc_impl_alias__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'GetPrettyName' +); + +select acs_sc_impl_alias__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'Link' +); + +select acs_sc_impl_alias__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'AddSelfToPage' +); + +select acs_sc_impl_alias__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'Show' +); + +select acs_sc_impl_alias__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'Edit' +); + +select acs_sc_impl_alias__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet', + 'RemoveSelfFromPage' +); + +-- Add the binding +select acs_sc_binding__delete ( + 'portal_datasource', + 'user_tracking_admin_portlet' +); Index: openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-portlet-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-portlet-create.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-portlet-create.sql 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,155 @@ +-- /user-tracking-portlet/sql/postgresql/user-tracking-portlet-create.sql +-- +-- Creates UserTracking Management portlet +-- +-- @author David Ortega (doa@tid.es) +-- @creation-date 2004-10-25 +-- + +create function inline_0 () +returns integer as ' +declare + ds_id portal_datasources.datasource_id%TYPE; +begin + ds_id = portal_datasource__new( + ''user_tracking_portlet'', + ''User Tracking Portlet'' + ); + + +perform portal_datasource__set_def_param( + ds_id, + ''t'', + ''t'', + ''shadeable_p'', + ''t'' +); + +perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''hideable_p'', + ''t'' +); + +perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''user_editable_p'', + ''f'' +); + +perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''shaded_p'', + ''f'' +); + +perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''link_hideable_p'', + ''t'' +); + +perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''t'', + ''style'', + ''list'' +); + +perform portal_datasource__set_def_param ( + ds_id, + ''t'', + ''f'', + ''package_id'', + '' '' +); + +return 0; + +end; ' language 'plpgsql'; + +select inline_0 (); + +drop function inline_0 (); + +-- create the implementation +select acs_sc_impl__new( + 'portal_datasource', + 'user_tracking_portlet', + 'user_tracking_portlet' +); + + +-- add all the hooks +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_portlet', + 'GetMyName', + 'user_tracking_portlet::get_my_name', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_portlet', + 'GetPrettyName', + 'user_tracking_portlet::get_pretty_name', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_portlet', + 'Link', + 'user_tracking_portlet::link', + 'TCL' +); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_portlet', + 'AddSelfToPage', + 'user_tracking_portlet::add_self_to_page', + 'TCL' + ); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_portlet', + 'Show', + 'user_tracking_portlet::show', + 'TCL' + ); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_portlet', + 'Edit', + 'user_tracking_portlet::edit', + 'TCL' + ); + +select acs_sc_impl_alias__new( + 'portal_datasource', + 'user_tracking_portlet', + 'RemoveSelfFromPage', + 'user_tracking_portlet::remove_self_from_page', + 'TCL' + ); + + -- Add the binding +select acs_sc_binding__new ( + 'portal_datasource', + 'user_tracking_portlet' +); + +\i user-tracking-admin-portlet-create.sql Index: openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-portlet-drop.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-portlet-drop.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/sql/postgresql/user-tracking-portlet-drop.sql 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,91 @@ +-- /user-tracking-portlet/sql/postgresql/user-tracking-portlet-drop.sql +-- + +-- Drops user-tracking datasources for portal portlets + +-- @author David Ortega (doa@tid.es) +-- @creation-date 2004-10-25 + + +create function inline_1() +returns integer as ' +declare + ds_id portal_datasources.datasource_id%TYPE; +begin + + select datasource_id into ds_id + from portal_datasources + where name = ''user_tracking_portlet''; + + if not found then + RAISE EXCEPTION '' No datasource id found '', ds_id; + ds_id := null; + end if; + + if ds_id is NOT null then + perform portal_datasource__delete(ds_id); + end if; + + -- drop the hooks + perform acs_sc_impl_alias__delete ( + ''portal_datasource'', + ''user_tracking_portlet'', + ''GetMyName'' + ); + + perform acs_sc_impl_alias__delete ( + ''portal_datasource'', + ''user_tracking_portlet'', + ''GetPrettyName'' + ); + + + perform acs_sc_impl_alias__delete ( + ''portal_datasource'', + ''user_tracking_portlet'', + ''Link'' + ); + + perform acs_sc_impl_alias__delete ( + ''portal_datasource'', + ''user_tracking_portlet'', + ''AddSelfToPage'' + ); + + perform acs_sc_impl_alias__delete ( + ''portal_datasource'', + ''user_tracking_portlet'', + ''Show'' + ); + + perform acs_sc_impl_alias__delete ( + ''portal_datasource'', + ''user_tracking_portlet'', + ''Edit'' + ); + + perform acs_sc_impl_alias__delete ( + ''portal_datasource'', + ''user_tracking_portlet'', + ''RemoveSelfFromPage'' + ); + + -- Drop the binding + perform acs_sc_binding__delete ( + ''portal_datasource'', + ''user_tracking_portlet'' + ); + + -- drop the impl + perform acs_sc_impl__delete ( + ''portal_datasource'', + ''user_tracking_portlet'' + ); + + return 0; +end;' language 'plpgsql'; + +select inline_1(); +drop function inline_1(); + +\i user-tracking-admin-portlet-drop.sql Index: openacs-4/packages/user-tracking-portlet/tcl/user-tracking-admin-portlet-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/tcl/user-tracking-admin-portlet-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/tcl/user-tracking-admin-portlet-procs.tcl 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,70 @@ +ad_library { + + Procedures to support the User-tracking management portlet. + + @creation-date 2004-10.25 + @author David Ortega (doa@tid.es) + +} + +namespace eval user_tracking_admin_portlet { + + ad_proc -private get_my_name { + } { + return "user_tracking_admin_portlet" + } + + ad_proc -public get_pretty_name { + } { + return "UserTracking Administration" + } + + ad_proc -private my_package_key { + } { + return "user-tracking-portlet" + } + + ad_proc -public link { + } { + return "" + } + + ad_proc -public add_self_to_page { + {-portal_id:required} + {-package_id:required} + } { + Adds a UserTracking mgt admin PE to the given admin portal. There should only + ever be one of these portals on an admin page with only one user_tracking_package_id + + @param portal_id The page to add self to + @param package_id the id of the user_tracking package + + @return element_id The new element's id + } { + return [portal::add_element_parameters \ + -portal_id $portal_id \ + -portlet_name [get_my_name] \ + -key package_id \ + -value $package_id + ] + } + + ad_proc -public remove_self_from_page { + portal_id + } { + Removes a UserTracking admin PE from the given portal + } { + portal::remove_element -portal_id $portal_id -portlet_name [get_my_name] + } + + ad_proc -public show { + cf + } { + } { + portal::show_proc_helper \ + -package_key [my_package_key] \ + -config_list $cf \ + -template_src "user-tracking-admin-portlet" + } + +} Index: openacs-4/packages/user-tracking-portlet/tcl/user-tracking-portlet-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/tcl/user-tracking-portlet-procs.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/tcl/user-tracking-portlet-procs.tcl 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,86 @@ +ad_library { + + Procedures to support the User-tracking Management portlet. + + @creation-date 2004-10.25 + @author David Ortega (doa@tid.es) + +} + +namespace eval user_tracking_portlet { + + ad_proc -private get_my_name { + } { + return "user_tracking_portlet" + } + + ad_proc -private my_package_key { + } { + return "user-tracking-portlet" + } + + ad_proc -public get_pretty_name { + } { + return "UserTracking Statistics" + } + + ad_proc -public link { + } { + return "" + } + + ad_proc -public add_self_to_page { + {-portal_id:required} + {-package_id:required} + {-param_action:required} + } { + Adds a UserTracking Mgt PE to the given portal or appends the given + user_tracking_package_id to the params of the user_tracking pe already there + + @param portal_id The page to add self to + @param package_id the id of the user_tracking package for this community + + @return element_id The new element's id + } { + return [portal::add_element_parameters \ + -portal_id $portal_id \ + -portlet_name [get_my_name] \ + -key package_id \ + -value $package_id \ + -pretty_name [get_pretty_name] \ + -force_region [parameter::get_from_package_key \ + -package_key [my_package_key] \ + -parameter "user_tracking_portlet_force_region"] \ + -param_action $param_action + ] + } + + ad_proc -public remove_self_from_page { + {-portal_id:required} + {-package_id:required} + } { + Removes a user_tracking PE from the given page or just the passed + in user_tracking_package_id parameter from the portlet + (that has other user_tracking_package_ids) + + @param portal_id The page to remove self from + @param package_id + } { + portal::remove_element_parameters \ + -portal_id $portal_id \ + -portlet_name [get_my_name] \ + -key package_id \ + -value $package_id + } + + ad_proc -public show { + cf + } { + } { + portal::show_proc_helper \ + -package_key [my_package_key] \ + -config_list $cf \ + -template_src "user-tracking-portlet" + } + +} Index: openacs-4/packages/user-tracking-portlet/www/user-tracking-admin-portlet.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/www/user-tracking-admin-portlet.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/www/user-tracking-admin-portlet.adp 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,7 @@ + + Index: openacs-4/packages/user-tracking-portlet/www/user-tracking-admin-portlet.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/www/user-tracking-admin-portlet.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/www/user-tracking-admin-portlet.tcl 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,26 @@ +ad_page_contract { + + The display logic for the User Tracking Management admin portlet + + @creation-date 2004-10.25 + @author David Ortega (doa@tid.es) + +} -properties { +community_id: onevalue +} + +array set config $cf +set list_of_package_ids $config(package_id) + +if {[llength $list_of_package_ids] > 1} { + # We have a problem! + return -code error "There should be only one instance of user-tracking for admin purposes" +} + +set package_id [lindex $list_of_package_ids 0] + +set url [lindex [site_node::get_url_from_object_id -object_id $package_id] 0] + +set community_id [dotlrn_community::get_community_id] + +ad_return_template Index: openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet-postgresql.xql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet-postgresql.xql 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,15 @@ + + + + + + + select first_names , last_name + from persons + where person_id=:user_id; + + + + + + \ No newline at end of file Index: openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet.adp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet.adp 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,52 @@ + + #user-tracking-portlet.General_Options# + + + #user-tracking-portlet.Admin_options# + + + + +#user-tracking-portlet.General_Options# + + +#user-tracking-portlet.Admin_options# + + + + + + + Index: openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/user-tracking-portlet/www/user-tracking-portlet.tcl 1 Mar 2005 17:37:54 -0000 1.1 @@ -0,0 +1,67 @@ +ad_page_contract { + + The logic for the user-tracking portlet. + + @creation-date 2004-10.25 + @author David Ortega (doa@tid.es) + +} -query { +} -properties { + community_id_p: onevalue + community_id: onevalue + admin_p: onevalue + user_id: onevalue + site_wide_admin_p: onevalue +} + +array set config $cf + +#set shaded_p $config(shaded_p) +set list_of_package_ids [lsort $config(package_id)] +ns_log notice "La lista de packages ids es: $list_of_package_ids" +#set one_instance_p [ad_decode [llength $list_of_package_ids] 1 1 0] + +set community_id [dotlrn_community::get_community_id] +ns_log notice "El community id es: $community_id" +set user_id [ad_conn user_id] +if {[exists_and_not_null user_id]} { + set site_wide_admin_p [acs_user::site_wide_admin_p -user_id $user_id] +} else { + set site_wide_admin_p 0 +} + +if {[exists_and_not_null community_id]} { + set community_id_p 1 + if {[exists_and_not_null user_id]} { + db_0or1row get_user_info {} -column_array user + set sitedomain_all "${user(first_names)} ${user(last_name)} [_ user-tracking-portlet.in_the_community] $community_id" + set sitedomain "${user(first_names)} ${user(last_name)}" + set sitedomain_comm "Comunidad $community_id" + } else { + set sitedomain_comm "Comunidad $community_id" + } +set admin_p [ad_permission_p $community_id admin] + +} else { + set admin_p [ad_permission_p [ad_conn package_id] admin] + set community_id_p 0 + if {[exists_and_not_null user_id]} { + db_0or1row get_user_info {} -column_array user + set sitedomain "${user(first_names)} ${user(last_name)}" + } else { + set sitedomain "[ad_system_name]" + } +} + + + + +ns_log notice "El user id es $user_id" +ns_log notice "El admin_p es $admin_p" +#set admin_p [ad_permission_p $config(package_id) admin] +#set admin_p [ad_permission_p $community_id admin] +#ns_log notice "[ad_conn package_id]" +#Si el community_id es cero es que estoy en la p�gina principal del usuario. Solo deber�a dejar ver estad�sticas del usuario en sus comunidades. +#A no ser que sea admin. + +ad_return_template