summaryrefslogtreecommitdiff
path: root/localwebstats
blob: 0f331f8c49f6cf1173376956698263828ca7bae7 (plain)
  1. #!/bin/bash
  2. # /etc/cron.daily/localstats: Webstats maintenance script
  3. # Written by Jonas Smedegaard <dr@jones.dk>
  4. # halt on errors
  5. #set -e
  6. function usage() {
  7. echo "Usage: `basename $0` update|prelogrotate|postlogrotate|reset <website> [<website>...]"
  8. echo " If no website is given, all are attempted"
  9. echo " Tip: Automagically runs when symlinked to /etc/cron.{daily,weekly,monthly}/"
  10. exit 1
  11. }
  12. function exit1() {
  13. echo "Error: $1"
  14. echo "Exiting..."
  15. exit 1
  16. }
  17. # automagically configure when run from cron dirs
  18. case `dirname $0` in
  19. /etc/cron.daily)
  20. stamp=ignore
  21. ;;
  22. /etc/cron.weekly)
  23. stamp=update
  24. ;;
  25. /etc/cron.monthly)
  26. stamp=ignore
  27. ;;
  28. *)
  29. stamp=$1
  30. shift || usage
  31. ;;
  32. esac
  33. case "$stamp" in
  34. update|prelogrotate|postlogrotate|reset|ignore)
  35. ;;
  36. *)
  37. usage
  38. ;;
  39. esac
  40. if [ "$stamp" == "ignore" ]; then
  41. if [ $DEBUG ]; then
  42. echo "Asked to ignore - exiting silently..."
  43. fi
  44. exit 0
  45. fi
  46. WEBROOT=/var/www
  47. LOGROOT=/var/log/apache
  48. WEBALIZER_OPTIONS="-q"
  49. WEBALIZER_OPTIONS="-Q"
  50. function webdir() { echo $1/VIRTUAL/$2; }
  51. function webdirs() { echo `find /var/log/apache -type d -print`; }
  52. #function webdirs() { for dir in $(find ${LOGROOT} -type d -print); do echo $dir; done; }
  53. #function logdir() { echo ${LOGROOT}/${WEBSITE}; }
  54. #function logfiles() { $(ls -r $LOGDIR/*-access*.gz) $(ls -r $LOGDIR/access*.??.gz) $(ls -r $LOGDIR/access*.?.gz) $(ls -r $LOGDIR/access*.?); }
  55. function logfiles() { ls $1/$2/????.??.?? | grep -v '\.00$'; }
  56. function logfilesgz() { ls $1/$2/????.??.??.gz | grep -v '\.00\.gz$'; }
  57. function logfilesresolved() { ls $1/$2/????.??.00; }
  58. function logfilesresolvedgz() { ls $1/$2/????.??.00.gz; }
  59. function host() { cat $1/VIRTUAL/$2/hostname || exit1 "Unable to get hostname for virtual host."; }
  60. function domain() { cat $1/VIRTUAL/$2/domainname || exit1 "Unable to get domainname for virtual host."; }
  61. # The above can be overridden in /etc/local/www
  62. . /etc/local/www || exit1 "Unable to read local preferences"
  63. # variables too boring to be configurable
  64. JDRESOLVE_DB="/var/cache/jdresolve/hosts.db"
  65. #JDRESOLVE_OPTIONS="-r -t 5 --database=${JDRESOLVE_DB} --dbfirst --expiredb=48"
  66. JDRESOLVE_OPTIONS="-r --database=${JDRESOLVE_DB} --dbfirst --expiredb=48"
  67. JDRESOLVE_MERGE_OPTIONS="--mergedb --database=${JDRESOLVE_DB}"
  68. test -d ${WEBROOT} || exit1 "Webroot \"${WEBROOT}\" doesn't exist"
  69. test -d ${LOGROOT} || exit1 "Logroot \"${LOGROOT}\" doesn't exist"
  70. WEBSITES=$@
  71. if [ "$WEBSITES" == "" ]; then
  72. WEBSITES=$(webdirs)
  73. fi
  74. for WEBSITE in $WEBSITES; do
  75. WEBDIR=$(webdir $WEBROOT ${WEBSITE}) || exit1 "Unable to resolve WEBDIR."
  76. test -d ${WEBDIR} || exit1 "Webdir \"${WEBDIR}\" doesn't exist"
  77. HOST=$(host ${WEBROOT} ${WEBSITE}) || exit1 "Unable to get hostname for virtual host."
  78. DOMAIN=$(domain ${WEBROOT} ${WEBSITE}) || exit1 "Unable to get domainname for virtual host."
  79. LOGFILES=$(logfiles ${LOGROOT} ${WEBSITE})
  80. LOGFILESGZ=$(logfilesgz ${LOGROOT} ${WEBSITE})
  81. LOGFILESRESOLVED=$(logfilesresolved ${LOGROOT} ${WEBSITE})
  82. LOGFILESRESOLVEDGZ=$(logfilesresolvedgz ${LOGROOT} ${WEBSITE})
  83. if [ -x /usr/bin/jdresolve ]; then
  84. [ ${DEBUG} ] && echo "Checking access to ${JDRESOLVE_DB}"
  85. touch ${JDRESOLVE_DB} || exit1 "Couldn't touch JDRESOLVE_DB"
  86. fi
  87. WEBALIZER_OPTIONS="-c /etc/webalizer.conf -c $WEBDIR/webalizer.conf -o $WEBDIR/stats/webalizer -f"
  88. ANALOG_OPTIONS="-G +g/etc/analog.conf +g$WEBDIR/analog.conf -a"
  89. AWSTATS_OPTIONS="-update"
  90. FQDN_ESC=`echo "$HOST.$DOMAIN" | sed -e 's/\./\\\./g'` # needed for awstats config
  91. if [ ${DEBUG} ]; then
  92. echo "Making stats for ${WEBSITE} in ${WEBDIR}:"
  93. JDRESOLVE_OPTIONS="${JDRESOLVE_OPTIONS} -p"
  94. ANALOG_OPTIONS="${ANALOG_OPTIONS} +q"
  95. WEBALIZER_OPTIONS="${WEBALIZER_OPTIONS} -T"
  96. AWSTATS_OPTIONS="${AWSTATS_OPTIONS} -showsteps"
  97. else
  98. JDRESOLVE_OPTIONS="${JDRESOLVE_DB} -n"
  99. ANALOG_OPTIONS="${ANALOG_OPTIONS} -q"
  100. WEBALIZER_OPTIONS="${WEBALIZER_OPTIONS} -Q"
  101. AWSTATS_OPTIONS="${AWSTATS_OPTIONS}"
  102. fi
  103. if [ $stamp == "reset" ]; then
  104. rm -rf $WEBDIR/stats
  105. mkdir $WEBDIR/stats
  106. fi
  107. LOGDATA="${WEBDIR}/stats/rawlog.txt"
  108. LOGDATATMP="${WEBDIR}/stats/rawlog_tmp.txt"
  109. zcat ${LOGFILESRESOLVEDGZ} > ${LOGDATA}
  110. cat ${LOGFILESRESOLVED} >> ${LOGDATA}
  111. if [ -x /usr/bin/jdresolve ]; then
  112. zcat ${LOGFILESGZ} | jdresolve ${JDRESOLVE_OPTIONS} - >> ${LOGDATA}
  113. cat ${LOGFILES} | jdresolve ${JDRESOLVE_OPTIONS} - >> ${LOGDATA}
  114. jdresolve ${JDRESOLVE_MERGE_OPTIONS} ${LOGDATA}
  115. elif [ -x /usr/sbin/logresolve ]; then
  116. zcat ${LOGFILESGZ} | logresolve >> ${LOGDATA}
  117. cat ${LOGFILES} | logresolve >> ${LOGDATA}
  118. else
  119. zcat ${LOGFILESGZ} >> ${LOGDATA}
  120. cat ${LOGFILES} >> ${LOGDATA}
  121. fi
  122. if [ -x /usr/bin/analog ]; then
  123. if [ $stamp == "reset" ]; then
  124. test ! -f $WEBDIR/analog.conf && echo "\
  125. HOSTNAME $HOST.$DOMAIN
  126. "\
  127. >$WEBDIR/analog.conf
  128. mkdir ${WEBDIR}/stats/analog
  129. cat ${LOGDATA} | analog ${ANALOG_OPTIONS} -C"LOGFILE none" -C"LOGFILE stdin" > $WEBDIR/stats/analog/index.html
  130. fi
  131. # cat ${LOGDATA} | analog ${ANALOG_OPTIONS} -C"LOGFILE none" -C"LOGFILE stdin" > $WEBDIR/stats/analog/index.html
  132. fi
  133. if [ -x /usr/bin/webalizer ]; then
  134. if [ $stamp == "reset" ]; then
  135. test ! -f $WEBDIR/webalizer.conf && echo "\
  136. HostName $HOST.$DOMAIN
  137. HideSite *$DOMAIN
  138. HideReferrer $DOMAIN/
  139. "\
  140. > $WEBDIR/webalizer.conf
  141. mkdir $WEBDIR/stats/webalizer
  142. cat ${LOGDATA} | webalizer $WEBALIZER_OPTIONS -N 0 -
  143. fi
  144. # cat ${LOGDATA} | webalizer $WEBALIZER_OPTIONS -N 0 -
  145. fi
  146. if [ -x /usr/lib/cgi-bin/awstats.pl ]; then
  147. if [ $stamp == "reset" ]; then
  148. test ! -f /etc/awstats/awstats.$WEBSITE.conf && echo "\
  149. LogFile=\"/var/www/VIRTUAL/$WEBSITE/stats/rawlog.txt\"
  150. LogFormat=4
  151. DNSLookup=0
  152. DirData=\"/var/cache/awstats\"
  153. DirIcons=\"/awstats-icon\"
  154. SiteDomain=\"$FQDN_ESC\"
  155. HostAliases=\"$FQDN_ESC localhost 127\.0\.0\.1\"
  156. Lang=\"dk\"
  157. DirLang=\"/usr/share/awstats/lang\"
  158. DefaultFile=\"index.html\"
  159. ShowFlagLinks=0
  160. AllowToUpdateStatsFromBrowser=0
  161. ShowLinksOnUrl=0
  162. DirCgi=\"http://cgi.jones.dk/cgi-bin\"
  163. DirIcons=\"http://stats.jones.dk/awstats-icon\"
  164. "\
  165. >/etc/awstats/awstats.$WEBSITE.conf
  166. mkdir $WEBDIR/stats/awstats
  167. /usr/lib/cgi-bin/awstats.pl -config=${WEBSITE} $AWSTATS_OPTIONS -output > $WEBDIR/stats/awstats/index.html
  168. fi
  169. /usr/lib/cgi-bin/awstats.pl -config=${WEBSITE} $AWSTATS_OPTIONS -output > $WEBDIR/stats/awstats/index.html
  170. fi
  171. test -L $WEBDIR/www/stats || ln -s $WEBDIR/stats $WEBDIR/www/stats
  172. test -L $WEBDIR/stats/stats && rm $WEBDIR/stats/stats
  173. done