#!/bin/sh

### user config vars (don't edit here, override by dnscache.conf)
RRDDB=/var/db/rrd/dnscache.rrd
OUT=/home/www/stats/dnscache
STATS=/var/log/dnscache/stats.log
HTML=1
### end of config vars

# to have $STATS file you must have this dnscache/log/run file:
# #!/bin/sh
# exec setuidgid Gdnslog multilog t ./main/ \
#   '-*' '+* stats * * * *' =/var/log/dnscache/stats.log

# application path, check before use!!
RRDUPDATE=/usr/local/bin/rrdupdate
RRDTOOL=/usr/local/bin/rrdtool

HOSTNAME=`hostname`
TIMES="3600 86400 604800 2592000 31536000"
VALUES="query cache udp tcp ratio"

# load config settings
[ -f `dirname ${0}`/dnscache.conf ] && . `dirname ${0}`/dnscache.conf

# query:cache:udp:tcp
[ ! -f ${RRDDB} ] && ${RRDTOOL} create ${RRDDB} --start N \
  DS:query:DERIVE:600:0:4294967295l DS:cache:DERIVE:600:0:4294967295l \
  DS:udp:GAUGE:600:0:200 DS:tcp:GAUGE:600:0:20 \
  DS:ratio:GAUGE:600:U:U \
  RRA:AVERAGE:0.5:1:576  RRA:AVERAGE:0.5:6:576 \
  RRA:AVERAGE:0.5:24:576 RRA:AVERAGE:0.5:288:576

VALUE=`head -n1 ${STATS} | awk '{ print $3":"$4":"$5":"$6 }'`
RATIO=`echo ${VALUE} | awk 'BEGIN { FS = ":" } { var=$2/$1; print var; }'`

${RRDUPDATE} ${RRDDB} N:${VALUE}:${RATIO} > /dev/null

exec 2>/dev/null

IFS=" "
for TIME in ${TIMES}; do
  LINK_H="<A HREF=\"index.html\">hour</A>"
  LINK_D="<A HREF=\"dnscache-day.html\">day</A>"
  LINK_W="<A HREF=\"dnscache-week.html\">week</A>"
  LINK_M="<A HREF=\"dnscache-month.html\">month</A>"
  LINK_Y="<A HREF=\"dnscache-year.html\">year</A>"
  SIZE=1

  case ${TIME} in
    3600)     NAME="hour";  FILE="index.html";          LINK_H="hour" ; SIZE=2;;
    86400)    NAME="day";   FILE="dnscache-day.html";   LINK_D="day" ;;
    604800)   NAME="week";  FILE="dnscache-week.html";  LINK_W="week" ;;
    2592000)  NAME="month"; FILE="dnscache-month.html"; LINK_M="month" ;;
    31536000) NAME="year";  FILE="dnscache-year.html";  LINK_Y="year" ;;
  esac

  for VALUE in ${VALUES}; do
    case ${VALUE} in
      "query") LEGEND="query/sec"; TYPE="AREA"; COLOR="0000FF" ;;
      "cache") LEGEND="cache motion/sec"; TYPE="AREA"; COLOR="00FF00" ;;
      "udp")   LEGEND="UDP connections/sec"; TYPE="LINE${SIZE}"; COLOR="0000FF" ;;
      "tcp")   LEGEND="TCP connections/sec"; TYPE="LINE${SIZE}"; COLOR="0000FF" ;;
      "ratio") LEGEND="cache size/query ratio (lower is better)"; TYPE="LINE${SIZE}"; COLOR="00FF00" ;;
    esac

    ${RRDTOOL} graph ${OUT}/${HOSTNAME}-dnscache-${VALUE}-${NAME}.png -a PNG -h 125 -s -${TIME} \
      -t "dnscache on ${HOSTNAME}" -v "${LEGEND}" \
      "DEF:${VALUE}=${RRDDB}:${VALUE}:AVERAGE" \
      "${TYPE}:${VALUE}#${COLOR}:${LEGEND}\r" \
      "GPRINT:${VALUE}:LAST:Last ${LEGEND}\: %7.2lf\r" \
      "GPRINT:${VALUE}:MAX:Max ${LEGEND}\: %7.2lf\r" \
      "GPRINT:${VALUE}:AVERAGE:Average ${LEGEND}\: %7.2lf\r" \
      "COMMENT:Last update\: `date "+%H\:%M %d/%m/%y"`\r" \
    > /dev/null
  done

  [ ${HTML} = 1 -a ! -f ${OUT}/${FILE} ] && cat <<EOF > ${OUT}/${FILE}
<HTML>
<HEAD>
<TITLE>${HOSTNAME} dnscache stats</TITLE>
<META HTTP-EQUIV="Refresh" CONTENT="600">
</HEAD>
<BODY>
<H1>${HOSTNAME} dnscache stats</H1>
Go to:
 ${LINK_H} - ${LINK_D} - ${LINK_W} - ${LINK_M} - ${LINK_Y}
<HR>
<TABLE BORDER="0">
 <TR>
  <TD>
   <B>query (one ${NAME})</B><BR>
   <IMG src="${HOSTNAME}-dnscache-query-${NAME}.png" alt="query (one ${NAME})">
  </TD>
  <TD>
   <B>cache motion (one ${NAME})</B><BR>
   <IMG src="${HOSTNAME}-dnscache-cache-${NAME}.png" alt="cache motion (one ${NAME})">
  </TD>
 </TR>
 <TR>
  <TD>
   <B>UDP connections (one ${NAME})</B><BR>
   <IMG src="${HOSTNAME}-dnscache-udp-${NAME}.png" alt="UDP connections (one ${NAME})">
  </TD>
  <TD>
   <B>TCP connections (one ${NAME})</B><BR>
   <IMG src="${HOSTNAME}-dnscache-tcp-${NAME}.png" alt="tcp connections (one ${NAME})">
  </TD>
 </TR>
 <TR>
  <TD>
   <B>cache size/query ratio (one ${NAME})</B><BR>
   <IMG src="${HOSTNAME}-dnscache-ratio-${NAME}.png" alt="cache size/query ratio (one ${NAME})">
  </TD>
  <TD>
   &nbsp;
  </TD>
 </TR>
</TABLE>
<HR>
<ADDRESS>This page was generated with a software developed by <A HREF="http://morettoni.net/">Luca Morettoni</A></ADDRESS>
</BODY>
</HTML>
EOF
done

