#!/bin/bash # /etc/cron.daily/localstats: Webstats maintenance script # Written by Jonas Smedegaard # halt on errors #set -e function usage() { echo "Usage: `basename $0` update|prelogrotate|postlogrotate|reset [...]" echo " If no website is given, all are attempted" echo " Tip: Automagically runs when symlinked to /etc/cron.{daily,weekly,monthly}/" exit 1 } # automagically configure when run from cron dirs case `dirname $0` in /etc/cron.daily) stamp=ignore ;; /etc/cron.weekly) stamp=update ;; /etc/cron.monthly) stamp=ignore ;; *) stamp=$1 shift || usage ;; esac case "$stamp" in update|prelogrotate|postlogrotate|reset|ignore) ;; *) usage ;; esac if [ "$stamp" == "ignore" ]; then if [ $DEBUG ]; then echo "Asked to ignore - exiting silently..." fi exit 0 fi WEBROOT=/var/www LOGROOT=/var/log/apache WEBALIZER_OPTIONS="-q" function webdir() { echo $1/VIRTUAL/$2; } function webdirs() { echo `find /var/log/apache -type d -print`; } #function webdirs() { for dir in $(find ${LOGROOT} -type d -print); do echo $dir; done; } #function logdir() { echo ${LOGROOT}/${WEBSITE}; } #function logfiles() { $(ls -r $LOGDIR/*-access*.gz) $(ls -r $LOGDIR/access*.??.gz) $(ls -r $LOGDIR/access*.?.gz) $(ls -r $LOGDIR/access*.?); } function logfiles() { ls $1/$2/????.??.??; } function logfilesgz() { ls $1/$2/????.??.??.gz; } function host() { cat $1/VIRTUAL/$2/hostname || exit 1; } function domain() { cat $1/VIRTUAL/$2/domainname || exit 1; } # The above can be overridden in /etc/local/www . /etc/local/www || exit 1 # variables too boring to be configurable JDRESOLVE_DB="/var/cache/jdresolve/hosts.db" #JDRESOLVE_OPTIONS="-r -t 5 --database=${JDRESOLVE_DB} --dbfirst --expiredb=48" JDRESOLVE_OPTIONS="-r --database=${JDRESOLVE_DB} --dbfirst --expiredb=48" JDRESOLVE_MERGE_OPTIONS="--mergedb --database=${JDRESOLVE_DB}" test -d ${WEBROOT} -a -d ${LOGROOT} || exit 1 WEBSITES=$@ if [ "$WEBSITES" == "" ]; then WEBSITES=$(webdirs) fi for WEBSITE in $WEBSITES; do WEBDIR=$(webdir $WEBROOT ${WEBSITE}) || exit 1 test -d ${WEBDIR} || exit 1 HOST=$(host ${WEBROOT} ${WEBSITE}) || exit 1 DOMAIN=$(domain ${WEBROOT} ${WEBSITE}) || exit 1 LOGFILES=$(logfiles ${LOGROOT} ${WEBSITE}) || exit 1 LOGFILESGZ=$(logfilesgz ${LOGROOT} ${WEBSITE}) || exit 1 if [ -x /usr/bin/jdresolve ]; then touch ${JDRESOLVE_DB} || exit 1 fi WEBALIZER_OPTIONS="-c /etc/webalizer.conf -c $WEBDIR/webalizer.conf -o $WEBDIR/stats/webalizer -f" ANALOG_OPTIONS="-G +g/etc/analog.conf +g$WEBDIR/analog.conf -a" AWSTATS_OPTIONS="-update" FQDN_ESC=`echo "$HOST.$DOMAIN" | sed -e 's/\./\\\./g'` # needed for awstats config if [ ${DEBUG} ]; then echo "Making stats for ${WEBSITE} in ${WEBDIR}:" JDRESOLVE_OPTIONS="${JDRESOLVE_OPTIONS} -p" ANALOG_OPTIONS="${ANALOG_OPTIONS} +q" WEBALIZER_OPTIONS="${WEBALIZER_OPTIONS} -T" AWSTATS_OPTIONS="${AWSTATS_OPTIONS} -showsteps" else JDRESOLVE_OPTIONS="${JDRESOLVE_DB} -n" ANALOG_OPTIONS="${ANALOG_OPTIONS} -q" WEBALIZER_OPTIONS="${WEBALIZER_OPTIONS} -Q" AWSTATS_OPTIONS="${AWSTATS_OPTIONS}" fi if [ $stamp == "reset" ]; then rm -rf $WEBDIR/stats mkdir $WEBDIR/stats fi LOGDATA="${WEBDIR}/stats/rawlog.txt" if [ -x /usr/bin/jdresolve ]; then zcat ${LOGFILESGZ} | jdresolve ${JDRESOLVE_OPTIONS} - > ${LOGDATA} cat ${LOGFILES} | jdresolve ${JDRESOLVE_OPTIONS} - >> ${LOGDATA} jdresolve ${JDRESOLVE_MERGE_OPTIONS} ${LOGDATA} elif [ -x /usr/sbin/logresolve ]; then zcat ${LOGFILESGZ} | logresolve > ${LOGDATA} cat ${LOGFILES} | logresolve >> ${LOGDATA} else zcat ${LOGFILESGZ} > ${LOGDATA} cat ${LOGFILES} >> ${LOGDATA} fi if [ -x /usr/bin/analog ]; then if [ $stamp == "reset" ]; then test ! -f $WEBDIR/analog.conf && echo "\ HOSTNAME $HOST.$DOMAIN "\ >$WEBDIR/analog.conf mkdir ${WEBDIR}/stats/analog cat ${LOGDATA} | analog ${ANALOG_OPTIONS} -C"LOGFILE none" -C"LOGFILE stdin" > $WEBDIR/stats/analog/index.html fi # cat ${LOGDATA} | analog ${ANALOG_OPTIONS} -C"LOGFILE none" -C"LOGFILE stdin" > $WEBDIR/stats/analog/index.html fi if [ -x /usr/bin/webalizer ]; then if [ $stamp == "reset" ]; then test ! -f $WEBDIR/webalizer.conf && echo "\ HostName $HOST.$DOMAIN HideSite *$DOMAIN HideReferrer $DOMAIN/ "\ > $WEBDIR/webalizer.conf mkdir $WEBDIR/stats/webalizer cat ${LOGDATA} | webalizer $WEBALIZER_OPTIONS -N 0 - fi # cat ${LOGDATA} | webalizer $WEBALIZER_OPTIONS -N 0 - fi if [ -x /usr/lib/cgi-bin/awstats.pl ]; then if [ $stamp == "reset" ]; then test ! -f /etc/awstats/awstats.$WEBSITE.conf && echo "\ LogFile=\"/var/www/VIRTUAL/$WEBSITE/stats/rawlog.txt\" LogFormat=4 DNSLookup=0 DirData=\"/var/cache/awstats\" DirIcons=\"/awstats-icon\" SiteDomain=\"$FQDN_ESC\" HostAliases=\"$FQDN_ESC localhost 127\.0\.0\.1\" Lang=\"dk\" DirLang=\"/usr/share/awstats/lang\" DefaultFile=\"index.html\" ShowFlagLinks=0 AllowToUpdateStatsFromBrowser=0 ShowLinksOnUrl=0 DirCgi=\"http://cgi.jones.dk/cgi-bin\" DirIcons=\"http://stats.jones.dk/awstats-icon\" "\ >/etc/awstats/awstats.$WEBSITE.conf mkdir $WEBDIR/stats/awstats /usr/lib/cgi-bin/awstats.pl -config=${WEBSITE} $AWSTATS_OPTIONS -output > $WEBDIR/stats/awstats/index.html fi /usr/lib/cgi-bin/awstats.pl -config=${WEBSITE} $AWSTATS_OPTIONS -output > $WEBDIR/stats/awstats/index.html fi test -L $WEBDIR/www/stats || ln -s $WEBDIR/stats $WEBDIR/www/stats test -L $WEBDIR/stats/stats && rm $WEBDIR/stats/stats done