]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - config/sarg/update-sarg-reports
sarg: New addon.
[people/pmueller/ipfire-2.x.git] / config / sarg / update-sarg-reports
diff --git a/config/sarg/update-sarg-reports b/config/sarg/update-sarg-reports
new file mode 100644 (file)
index 0000000..84a7052
--- /dev/null
@@ -0,0 +1,181 @@
+#!/bin/bash
+###############################################################################
+#                                                                             #
+# IPFire.org - An Open Source Firewall Solution                               #
+# Copyright (C) 2012 Michael Tremer                                           #
+#                                                                             #
+# This program 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 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program 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.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+###############################################################################
+
+export LC_ALL=C
+
+SARG_CONFIG="/etc/sarg/sarg.conf"
+SQUID_LOG="/var/log/squid/access.log"
+REPORTS_PATH="/var/log/sarg"
+
+function date_calc() {
+       local when
+       local range="false"
+
+       case "${1}" in
+               month)
+                       when="1 month ago"
+                       range="true"
+                       ;;
+               week)
+                       when="1 week ago"
+                       ;;
+               yesterday)
+                       when="1 day ago"
+                       ;;
+               today)
+                       when="today"
+                       ;;
+               *)
+                       return 1
+                       ;;
+       esac
+
+       if [ "${range}" = "true" ]; then
+               echo "$(date --date "${when}" +01/%m/%Y)-$(date --date "${when}" +31/%m/%Y)"
+       else
+               date --date "${when}" +%d/%m/%Y
+       fi
+
+       return 0
+}
+
+function compile_report() {
+       local interval=${1}
+
+       local date
+       case "${interval}" in
+               today)
+                       date=$(date_calc today)
+                       ;;
+               daily)
+                       date=$(date_calc yesterday)
+                       ;;
+               weekly)
+                       date="$(date_calc week)-$(date_calc yesterday)"
+                       ;;
+               monthly)
+                       date="$(date_calc month)"
+                       ;;
+       esac
+       [ -n "${date}" ] || return 1
+
+       # Determine max. number of archived log files to search.
+       local max_logs
+       case "${interval}" in
+               today|daily)
+                       max_logs=3
+                       ;;
+               weekly)
+                       max_logs=14
+                       ;;
+               monthly)
+                       max_logs=40
+                       ;;
+       esac
+
+       # Create reports_path, if not exists.
+       local reports_path="${REPORTS_PATH}/${interval}"
+       mkdir -p ${reports_path}
+
+       # Run SARG.
+       get_logs ${max_logs} | sarg -f ${SARG_CONFIG} -l - -d ${date} -o ${reports_path}
+}
+
+function get_logs() {
+       local max=${1}
+
+       if [ -z "${max}" ]; then
+               max=10000
+       fi
+
+       local idx=0
+       while [ ${idx} -le ${max} ]; do
+               file=$(search_log_file ${idx})
+
+               # If no log file could be opened, we are done.
+               [ -z "${file}" ] && break
+
+               case "${file}" in
+                       # Logs in plain text.
+                       *.log)
+                               cat ${file}
+                               ;;
+
+                       # GZip compressed log files.
+                       *.gz)
+                               gzip -d < ${file}
+                               ;;
+
+                       # XZ compressed log files.
+                       *.xz)
+                               xz -d < ${file}
+                               ;;
+
+                       # Unhandled stuff.
+                       *)
+                               echo "Unhandled file type: ${file}" >&2
+                               ;;
+               esac
+
+               idx=$(( ${idx} + 1 ))
+       done
+
+       return 0
+}
+
+function search_log_file() {
+       local idx=${1}
+
+       if [ "${idx}" = "0" ] && [ -e "${SQUID_LOG}" ]; then
+               echo "${SQUID_LOG}"
+               return 0
+       fi
+
+       local algo
+       for algo in gz xz; do
+               file="${SQUID_LOG}.${idx}.${algo}"
+
+               if [ -e "${file}" ]; then
+                       echo "${file}"
+                       return 0
+               fi
+       done
+
+       return 1
+}
+
+# Main.
+
+case "${1}" in
+       today|daily|weekly|monthly)
+               compile_report ${1}
+               ;;
+       *)
+               echo "${0} - Squid proxy reports creation tool"
+               echo
+               echo "Usage: ${0} [interval]"
+               echo "    interval: today, daily, weekly, monthly"
+               echo
+               exit 0
+               ;;
+esac
+
+exit 0