Capturing Problems
Is DansGuardian failing, but you don't know why? And worse, you don't know what information to capture so others can help (or don't know which commands to use to capture it)? Or the system is administered by a helper or a coworker who knows almost nothing about Linux?
Just install this script, then when a problem occurs simply execute danshung. It will do all the work for you automagically. You can then simply send or post the recorded file to anyone that might help.
To install this script, just copy&paste it from your browser window to your DansGuardian system as /usr/sbin/danshung. (Be sure to set execute permissions if necessary, perhaps via chmod a+x /usr/sbin/danshung.)
In most cases the location of the recorded file will be set automatically to a value appropriate to your system. (The selected actual path/name of the recorded file will be reported to you by the script itself.) If for some reason you wish to override automatic selection and force the recorded file to a location of your choosing, set environment variable RECORDFILE to your desired path/filename before executing danshung.
#!/bin/bash # Don't worry about some programs not being found. # BASH will just continue (after issuing an error message); this is BASH's default behavior. PROGNAME=`basename $0` VERSION=6 if [[ ( -d /usr/local/var/log/dansguardian ) && ( ! -h /usr/local/var/log/dansguardian ) ]]; then RECORDFILE=${RECORDFILE:-/usr/local/var/log/danshung}; fi if [[ ( -d /var/log/dansguardian ) && ( ! -h /var/log/dansguardian ) ]]; then RECORDFILE=${RECORDFILE:-/var/log/danshung}; fi RECORDFILE=${RECORDFILE:-/var/log/danshung} if [[ "$RECORDFILE" != /* ]]; then RECORDFILE=`pwd`/$RECORDFILE; fi # disallow interruption by user (^C, kill, etc.) trap '' SIGINT trap '' SIGQUIT # continue on error (such as program not found) trap - ERR echo "" echo "Please type a short description of the current state of the system," echo " (DansGuardian is unresponsive so the web is inaccessible," echo " DansGuardian won't start, DansGuardian just crashed, DansGuardian" echo " is up but it doesn't work right, etc.), then press ENTER" read -p "Description? > " CURSTATE echo "" echo "** Recording DansGuardian/Squid/OS system state in $RECORDFILE **" echo "" MESSAGE="%%%%% `date '+%T %Z %D'` - $PROGNAME v$VERSION: beginning report because: $CURSTATE" echo $MESSAGE echo $MESSAGE >> $RECORDFILE USERLOG=(`logger -p user.err "$PROGNAME v$VERSION searching for user log" ; sleep 1 ; sleep 1 ; find /var/log -maxdepth 1 -type f -mmin 1`) if [[ -z "$USERLOG" ]]; then USERLOG=/dev/null; fi KERNLOG=(`logger -p kern.err "$PROGNAME v$VERSION searching for user log" ; sleep 1 ; sleep 1 ; find /var/log -maxdepth 1 -type f -mmin 1`) if [[ -z "$KERNLOG" ]]; then KERNLOG=/dev/null; fi if [[ ( -d /usr/local/etc/dansguardian ) && ( ! -h /usr/local/etc/dansguardian ) ]]; then DGCONFIGDIR=${DGCONFIGDIR:-/usr/local/etc/dansguardian} elif [[ ( -d /etc/dansguardian ) && ( ! -h /etc/dansguardian ) ]]; then DGCONFIGDIR=${DGCONFIGDIR:-/etc/dansguardian} else DGCONFIGDIR=${DGCONFIGDIR:-/} fi if [[ -d /etc/squid ]]; then SQUIDCONFIGDIR=${SQUIDCONFIGDIR:-/etc/squid} else SQUIDCONFIGDIR=${SQUIDCONFIGDIR:-/} fi MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: next show who am i w/ id" echo $MESSAGE echo $MESSAGE >> $RECORDFILE id >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: id done, next DansGuardian (PATH) version" echo $MESSAGE echo $MESSAGE >> $RECORDFILE dansguardian -v >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: DansGuardian (PATH) done, next DansGuardian (/sbin) version" echo $MESSAGE echo $MESSAGE >> $RECORDFILE /sbin/dansguardian -v >> $RECORDFILE 2>&1 MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: DansGuardian (/sbin) done, next DansGuardian (/usr/local/sbin) version" echo $MESSAGE echo $MESSAGE >> $RECORDFILE /usr/local/sbin/dansguardian -v >> $RECORDFILE 2>&1 MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: DansGuardian (/usr/local/sbin) version done, next kernel/hostname/version" echo $MESSAGE echo $MESSAGE >> $RECORDFILE uname -a >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: kernel version done, next show where am i w/ tty" echo $MESSAGE echo $MESSAGE >> $RECORDFILE tty >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: tty done, next dmesg" echo $MESSAGE echo $MESSAGE >> $RECORDFILE dmesg >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: dmesg done, next the dansguardian.conf in $DGCONFIGDIR" echo $MESSAGE echo $MESSAGE >> $RECORDFILE cat $DGCONFIGDIR/dansguardian.conf >> $RECORDFILE 2>&1 MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: dansguardian.conf done, next the dansguardianf1.conf in $DGCONFIGDIR" echo $MESSAGE echo $MESSAGE >> $RECORDFILE cat $DGCONFIGDIR/dansguardianf1.conf >> $RECORDFILE 2>&1 MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: dansguardianf1.conf, next the squid.conf in $SQUIDCONFIGDIR" echo $MESSAGE echo $MESSAGE >> $RECORDFILE cat $SQUIDCONFIGDIR/squid.conf >> $RECORDFILE 2>&1 MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: squid.conf done, next which dansguardian is on PATH" echo $MESSAGE echo $MESSAGE >> $RECORDFILE which dansguardian >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: which executable done, next 2.8 vs. 2.9/2.10 file paths" echo $MESSAGE echo $MESSAGE >> $RECORDFILE ls -ld /sbin/dansguardian /usr/local/sbin/dansguardian /etc/dansguardian/dansguardian.conf /usr/local/etc/dansguardian/dansguardian.conf /var/log/dansguardian /usr/local/var/log/dansguardian >> $RECORDFILE 2>&1 MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: list files done, next record processes w/ ps" echo $MESSAGE echo $MESSAGE >> $RECORDFILE ps aux >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: ps done, next record processes w/ top" echo $MESSAGE echo $MESSAGE >> $RECORDFILE top -b -n 1 >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: top done, next show runlevel" echo $MESSAGE echo $MESSAGE >> $RECORDFILE runlevel >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: runlevel done, next show NICs w/ ifconfig -a" echo $MESSAGE echo $MESSAGE >> $RECORDFILE /sbin/ifconfig -a >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: ifconfig done, next show mounts w/ df -a" echo $MESSAGE echo $MESSAGE >> $RECORDFILE df -a >> $RECORDFILE df -a | while read -a LINE do if [[ "$LINE" == /dev/* ]] then MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: going to access device $LINE" echo $MESSAGE echo $MESSAGE >> $RECORDFILE head -1 "$LINE" >> $RECORDFILE MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: done accessing $LINE" echo $MESSAGE echo $MESSAGE >> $RECORDFILE fi done MESSAGE="===== `date '+%T %Z %D'` - $PROGNAME v$VERSION: ending" echo $MESSAGE echo $MESSAGE >> $RECORDFILE MESSAGE="" echo $MESSAGE echo $MESSAGE >> $RECORDFILE echo "** DansGuardian/Squid/OS SYSTEM STATE CAPTURED," echo " SEND/POST(in body) CONTENTS OF FILE $RECORDFILE FOR AID **" echo " (But don't ATTACH when posting to DansGuardian mailing list;" echo " the list will throw away attachments and nobody will ever see them.)"