====== AWStats config management ======
AWStats Version which this Document is based on: 6.4
Prefix: AWStats "include" statement does not work as I would an include statement expect to work
so I do not use it. I do not know how it works...
What I have:
* /etc/awstats/awstats.conf -> A default config file with default settings
* /etc/awstats/awstats.conf.local -> A local config file containing common local settings for every domain
What I want:
* One config per domain generated automatically using default- and common settings and and a template
for per domain settings
===== Template /etc/awstats/template =====
#
# domain specific settings
#
SiteDomain="%DOMAIN%"
HostAliases="%ALIASES%"
LogFile="%LOGFILE%"
AllowAccessFromWebToFollowingAuthenticatedUsers="%USERS%"
===== Directory /etc/awstats/domain.conf.d/ containing one shell fragment file per domain =====
Example: links2linux.de
File: /etc/awstats/domain.conf.d/links2linux.de.conf
# awstats config for links2linux.de
AW_DOMAIN="links2linux.de"
AW_ALIASES="wiki.links2linux.de"
AW_ACCESS_LOG="/var/log/apache/access_links2linux.de.log"
AW_USER="aw-user $AW_SUPERUSER"
===== Script to create configs /etc/awstats/create_configs.sh =====
Whenever you change the template, the common or default settings you only have to run this script again to have fresh configs.
#!/bin/sh
#
# create awstats configs
#
AW_SUPERUSER="awstats-root"
find domain.conf.d/*.conf | while read CONFIG; do
. $CONFIG
echo -n "Creating awstats.$AW_DOMAIN.conf ... "
echo -n "" > awstats.$AW_DOMAIN.conf
for f in awstats.conf awstats.conf.local; do
echo "#" >> awstats.$AW_DOMAIN.conf
echo "# Include $f" >> awstats.$AW_DOMAIN.conf
echo "#" >> awstats.$AW_DOMAIN.conf
sed 's/#.*//;s/^[[awstatsmultidomainsetup|\t]]*//;s/[[awstatsmultidomainsetup|\t]]*$//' $f | sort -u >> awstats.$AW_DOMAIN.conf
done
cat template \
| sed "s|%DOMAIN%|$AW_DOMAIN|" \
| sed "s|%ALIASES%|$AW_ALIASES|" \
| sed "s|%LOGFILE%|$AW_ACCESS_LOG|" \
| sed "s|%USERS%|$AW_USER|" \
>> awstats.$AW_DOMAIN.conf
echo "OK"
done
====== Handy tools ======
===== recreate_stats.sh - recreate as much stats as possible for one domain =====
Imagine you changed some common stats parameters like enabling a new plugin and now you want to recreate
as much stats as possible (all stats where logfiles still exist from).
This Script does this automatically:
#!/bin/sh
#
# recreate awstats for a specific domain
#
# what does it do?
#
# what we have:
# awstats for a sepcific timeframe, maybe much greater than 1 year
# max last ~52 logfiles ~= 1 year
#
# what we can do:
# 1) check for which timeframe we have logs now
# 2) remove awstats for that timeframe we detected in 1)
# 3) let awstats create stats from all logfiles
DOMAIN="$1"
LOG="$2"
# try to find LOG automatically if not defined
test "$LOG" || {
echo "Logfile not specified, trying to find it automatically (in domain.conf.d)"
if [[awstatsmultidomainsetup|-f domain.conf.d/$DOMAIN.conf ]]; then
. domain.conf.d/$DOMAIN.conf
if [[awstatsmultidomainsetup|"$AW_ACCESS_LOG" ]]; then
echo "Logfile found: $AW_ACCESS_LOG"
LOG="$AW_ACCESS_LOG"
else
echo "Nothing found"
fi
fi
}
test "$DOMAIN" || { echo "Syntax: ./me /path/to/access_log example.com "; exit 1; }
test "$LOG" || { echo "Syntax: ./me /path/to/access_log example.com "; exit 1; }
test -f "$LOG" || { echo "$LOG not found"; exit 1; }
echo "Analyzing existing logfiles..."
DATA_DIR="/var/lib/awstats"
# 1) check which is the oldest monthe we have complete logs for
OLDEST_LOG="$(ls -1 "$LOG"-* | head -1)"
# we do not know when a domain started to exist
# so we assume that the month from the oldest logline +1 is
# the oldest month we have complete
#
# (we take 'zless' here because it reads gzipped and unzipped files)
OLDEST_LOGLINE="$(zless $OLDEST_LOG | head -n1)"
OLDEST_DATE_STRING="$(echo "$OLDEST_LOGLINE" | sed 's|.*\[[\(.*\)\]].*|\1|;s|/| |g;s/:/ /')"
OLDEST_MONTH="$(date +%m -d "$OLDEST_DATE_STRING")"
OLDEST_YEAR="$(date +%Y -d "$OLDEST_DATE_STRING")"
echo "Oldest logline is from $OLDEST_YEAR/$OLDEST_MONTH ($OLDEST_DATE_STRING)"
if [[awstatsmultidomainsetup|"$OLDEST_MONTH" == "12" ]]; then
# set jan in the following year
OLDEST_COMPLETE_MONTH="01"
OLDEST_YEAR="$((OLDEST_YEAR+1))"
else
if [[awstatsmultidomainsetup|"${OLDEST_MONTH:0:1}" == "0" ]]; then
# remove leading zero
OLDEST_MONTH=${OLDEST_MONTH:1:1}
fi
OLDEST_COMPLETE_MONTH="$((OLDEST_MONTH+1))"
if [[awstatsmultidomainsetup|${#OLDEST_COMPLETE_MONTH} -eq 1 ]]; then
# add leading zero
OLDEST_COMPLETE_MONTH="0$OLDEST_COMPLETE_MONTH"
fi
fi
echo "So I assume oldest complete month is $OLDEST_YEAR/$OLDEST_COMPLETE_MONTH"
echo "It may be safe to remove all awstats files awstats$OLDEST_COMPLETE_MONTH$OLDEST_YEAR.$DOMAIN.txt and newer"
echo "Hardcoded DATA_DIR is $DATA_DIR where I will look for awstats files"
echo "Preas a key to continue or ctrl-C to abort"; read
BACKUP="./awstats_$DOMAIN.$(date +%Y%m%d%H%M%S).tgz"
echo "Backing up awstat files to $BACKUP"
tar czvf $BACKUP $DATA_DIR/awstats*.$DOMAIN.txt
ls -1 $DATA_DIR/awstats[[0-9]][0-9][[0-9]][0-9][[0-9]][0-9].$DOMAIN.txt | while read AWSTAT; do
AWSTAT_YEAR="$(echo "$(basename $AWSTAT)" | sed 's/awstats[[0-9]]\{2\}\([[0-9]]\{,4\}\).*/\1/')"
AWSTAT_MONTH="$(echo "$(basename $AWSTAT)" | sed 's/awstats\([[0-9]]\{2\}\).*/\1/')"
#echo "Found $AWSTAT (stats for $AWSTAT_YEAR/$AWSTAT_MONTH)"
if [[awstatsmultidomainsetup|$AWSTAT_YEAR -eq $OLDEST_YEAR ]]; then
# same year
if [[awstatsmultidomainsetup|$AWSTAT_MONTH -ge $OLDEST_COMPLETE_MONTH ]]; then
# same month or newer
echo "Deleting $AWSTAT"
rm -f "$AWSTAT"
fi
fi
if [[awstatsmultidomainsetup|$AWSTAT_YEAR -gt $OLDEST_YEAR ]]; then
# newer year
echo "Deleting $AWSTAT"
rm -f "$AWSTAT"
fi
done
# now recreate logs
# we must feed all logs to awstats in chronological order
ls -1 "$LOG"-* | while read old_log; do
echo $old_log | egrep -q '\.gz$' && {
zcat $old_log
} || {
cat $old_log
}
done | nice /usr/lib/cgi-bin/awstats.pl -config=$DOMAIN -update -showsteps -showcorrupted -showdropped -LogFile="-"
# and current log
nice /usr/lib/cgi-bin/awstats.pl -config=$DOMAIN -update -showsteps -showcorrupted -showdropped
echo "Finished"
===== recreate_all_stats.sh - recreate stats for all domains =====
Calls the previous script for all domains
#!/bin/sh
#
# recreate awstats for all known domains
#
find domain.conf.d/*.conf | while read CONFIG; do
. $CONFIG
./recreate_stats.sh $AW_DOMAIN $AW_ACCESS_LOG
done
--[[user:mschiff|mschiff]] 17:02, 10 Jun 2005 (CEST)