174 lines
4.1 KiB
Bash
Executable File
174 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
STATS_FILE=/var/cache/bind/named.stats
|
|
|
|
# Remove old stats file
|
|
rm -f $STATS_FILE
|
|
|
|
# Generate new stats
|
|
/usr/sbin/rndc stats
|
|
|
|
# Delay until the stats file is written
|
|
i=0
|
|
while [ ! -f $STATS_FILE ]; do
|
|
# We don't wait forever
|
|
if [ $i -ge 10 ]; then
|
|
exit 1
|
|
fi
|
|
i=$[ $i + 1 ]
|
|
|
|
# Wait a little
|
|
sleep 0.2
|
|
done
|
|
|
|
# Save view specific stuff
|
|
declare -A VIEWS
|
|
VIEWS[global]=""
|
|
|
|
# Read the stats file and parse it
|
|
MODE="unknown"
|
|
while read LINE; do
|
|
if [[ "$LINE" =~ ^-- ]]; then
|
|
# Statistics, skip this line
|
|
continue
|
|
elif [[ "$LINE" =~ ^\+\+ ]]; then
|
|
# This is a section start, switch mode
|
|
if [ "$LINE" == "++ Incoming Requests ++" ]; then
|
|
MODE="req-in"
|
|
elif [ "$LINE" == "++ Incoming Queries ++" ]; then
|
|
MODE="query-in"
|
|
elif [ "$LINE" == "++ Outgoing Queries ++" ]; then
|
|
MODE="query-out"
|
|
VIEW="default"
|
|
elif [ "$LINE" == "++ Name Server Statistics ++" ]; then
|
|
MODE="ns-stats"
|
|
elif [ "$LINE" == "++ Zone Maintenance Statistics ++" ]; then
|
|
MODE="zone-maint"
|
|
elif [ "$LINE" == "++ Resolver Statistics ++" ]; then
|
|
MODE="resolver"
|
|
VIEW="default"
|
|
elif [ "$LINE" == "++ Cache DB RRsets ++" ]; then
|
|
MODE="cache"
|
|
VIEW="default"
|
|
elif [ "$LINE" == "++ Per Zone Query Statistics ++" ]; then
|
|
MODE="zone"
|
|
VIEW="default"
|
|
ZONE="unknown"
|
|
else
|
|
MODE="unknown"
|
|
fi
|
|
|
|
continue
|
|
fi
|
|
|
|
# Parse based on current mode
|
|
if [ "$MODE" == "req-in" ]; then
|
|
# Line format is: <count> <opcode>
|
|
read REQ_COUNT REQ_OPCODE <<< $( echo $LINE )
|
|
VIEWS[global]+="req-in,$REQ_OPCODE:$REQ_COUNT"$'\n'
|
|
elif [ "$MODE" == "query-in" ]; then
|
|
# Line format is: <count> <rrtype>
|
|
read QUERY_COUNT QUERY_RRTYPE <<< $( echo $LINE )
|
|
VIEWS[global]+="query-in,$QUERY_RRTYPE:$QUERY_COUNT"$'\n'
|
|
elif [ "$MODE" == "query-out" ]; then
|
|
# Is this a section?
|
|
if [[ "$LINE" =~ ^\[ ]]; then
|
|
# Is this a view start?
|
|
NEW_VIEW=$( echo "$LINE" | sed -n 's/^\[View: \(.*\)\]$/\1/p' )
|
|
if [ -n "$NEW_VIEW" ]; then
|
|
VIEW="$NEW_VIEW"
|
|
fi
|
|
|
|
continue
|
|
fi
|
|
|
|
# Ignore the _bind view
|
|
if [ "$VIEW" == "_bind" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Line format is: <count> <rrtype>
|
|
read QUERY_COUNT QUERY_RRTYPE <<< $( echo $LINE )
|
|
VIEWS[$VIEW]+="query-out,$QUERY_RRTYPE:$QUERY_COUNT"$'\n'
|
|
elif [ "$MODE" == "ns-stats" ]; then
|
|
# Line format is: <count> <action>
|
|
read COUNT ACTION <<< $( echo $LINE )
|
|
VIEWS[global]+="ns-stats,$ACTION:$COUNT"$'\n'
|
|
elif [ "$MODE" == "zone-maint" ]; then
|
|
# Line format is: <count> <action>
|
|
read COUNT ACTION <<< $( echo $LINE )
|
|
VIEWS[global]+="zone-maint,$ACTION:$COUNT"$'\n'
|
|
elif [ "$MODE" == "resolver" ]; then
|
|
# Is this a section?
|
|
if [[ "$LINE" =~ ^\[ ]]; then
|
|
# Is this a view start?
|
|
NEW_VIEW=$( echo "$LINE" | sed -n 's/^\[View: \(.*\)\]$/\1/p' )
|
|
if [ -n "$NEW_VIEW" ]; then
|
|
VIEW="$NEW_VIEW"
|
|
fi
|
|
|
|
continue
|
|
fi
|
|
|
|
# Ignore the _bind view
|
|
if [ "$VIEW" == "_bind" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Line format is: <count> <action>
|
|
read COUNT ACTION <<< $( echo $LINE )
|
|
VIEWS[$VIEW]+="resolver,$ACTION:$COUNT"$'\n'
|
|
elif [ "$MODE" == "cache" ]; then
|
|
# Is this a section?
|
|
if [[ "$LINE" =~ ^\[ ]]; then
|
|
# Is this a view start?
|
|
NEW_VIEW=$( echo "$LINE" | sed -n 's/^\[View: \(.*\)\]$/\1/p' )
|
|
if [ -n "$NEW_VIEW" ]; then
|
|
VIEW="$NEW_VIEW"
|
|
fi
|
|
|
|
continue
|
|
fi
|
|
|
|
# Ignore the _bind view
|
|
if [ "$VIEW" == "_bind" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Line format is: <count> <action>
|
|
read COUNT ACTION <<< $( echo $LINE )
|
|
VIEWS[$VIEW]+="cache,$ACTION:$COUNT"$'\n'
|
|
elif [ "$MODE" == "zone" ]; then
|
|
# Is this a section?
|
|
if [[ "$LINE" =~ ^\[ ]]; then
|
|
# Does this line define a view?
|
|
NEW_VIEW=$( echo "$LINE" | sed -n 's/^.* (view: \(.*\))\]$/\1/p' )
|
|
if [ -n "$NEW_VIEW" ]; then
|
|
VIEW="$NEW_VIEW"
|
|
fi
|
|
|
|
# Is this a zone start?
|
|
NEW_ZONE=$( echo "$LINE" | sed -n 's/^\[\([^] ]*\).*/\1/p' )
|
|
if [ -n "$NEW_ZONE" ]; then
|
|
ZONE="$NEW_ZONE"
|
|
fi
|
|
|
|
continue
|
|
fi
|
|
|
|
# Ignore the _bind view
|
|
if [ "$VIEW" == "_bind" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Line format is: <count> <action>
|
|
read COUNT ACTION <<< $( echo $LINE )
|
|
VIEWS[$VIEW]+="$ZONE,$ACTION:$COUNT"$'\n'
|
|
fi
|
|
done < $STATS_FILE
|
|
|
|
for VIEW in "${!VIEWS[@]}"; do
|
|
echo "<<<app-bind-$VIEW>>>"
|
|
echo -n "${VIEWS[$VIEW]}"
|
|
done
|