#!/bin/bash # Rassemble informations sur le systeme et l'installation ScoDoc pour # faciliter le support a distance. # # Avec option: # -a : sauve aussi les bases de données # DEST_ADDRESS=emmanuel.viennet@univ-paris13.fr INSTANCE_DIR=/opt/scodoc TMP=/tmp/scodoc-$(date +%F-%s) DEPTS_TO_SAVE="" SAVE_USERS=0 SEND_BY_MAIL=1 # ------------------------------------- # Arguments # ------------------------------------- function join_by { local IFS="$1"; shift; echo "$*"; } while getopts ":d:aunh" opt; do case $opt in a) # Liste des noms des departements, a partir des bases SQL SCO* DEPTS_TO_SAVE=$( (su postgres -c "psql -l") | grep SCO | grep -v SCOUSERS | awk '{ gsub("SCO", "", $1); print $1}' ) SAVE_USERS=1 ;; u) SAVE_USERS=1 ;; n) SEND_BY_MAIL=0 ;; d) DEPTS_TO_SAVE=$( join_by ' ' $DEPTS_TO_SAVE $OPTARG ) ;; h) echo "Diagnostic installation ScoDoc" echo "Rassemble informations sur le systeme et l'installation ScoDoc" echo "Usage: $0 [-h] [-n] [-a] [-u] [-d dept]" echo " -h cette aide" echo " -n pas d'envoi par mail" echo " -a enregistre aussi toutes les bases de donnees" echo " -u enregistre la base utilisateurs" echo " -d dept enregistre la base du departement dept" exit 0 ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done # ------------------------------------- # Configuration # ------------------------------------- # needed for uuencode if [ ! -e /usr/bin/uuencode ] then apt-get install sharutils fi mkdir $TMP # Files to copy: FILES="/etc/hosts /etc/debian_version /etc/apt /etc/apache2" echo "ScoDoc diagnostic: informations about your system will be " if [ "${SEND_BY_MAIL}" = "1" ] then echo "sent to ${DEST_ADDRESS}" echo -n "and " fi echo "left in ${TMP}" # ------------------------------------- # Logs # ------------------------------------- copy_log() { if [ -e $1 ] then cp $1 $TMP/scodoc_logs/ fi } mkdir $TMP/scodoc_logs/ copy_log /opt/scodoc/instance/log/event.log copy_log /opt/scodoc/instance/log/event.log.1 copy_log /opt/scodoc/instance/log/notes.log copy_log /opt/scodoc/instance/log/notes.log.1 # ------------------------------------- # Linux System Configuration # ------------------------------------- iptables -L > $TMP/iptables.out ip a > $TMP/ifconfig.out ps auxww > $TMP/ps.out df -h > $TMP/df.out dpkg -l > $TMP/dpkg.lst (cd /opt/scodoc/instance/Products/ScoDoc; svn status > $TMP/svn.status) (cd /opt/scodoc/instance/Products/ScoDoc; svn diff > $TMP/svn.diff) (cd /opt/scodoc/instance/Products/ScoDoc; svnversion > $TMP/svn.version) ls -laR /opt/scodoc/instance/Products/ScoDoc > $TMP/ls-laR # ------------------------------------- # Databases configurations # ------------------------------------- (su postgres -c "psql -l") > "${TMP}/psql-l.out" for dept in "${INSTANCE_DIR}"/var/scodoc/config/depts/*.cfg do cnx=$(cat $dept) (su postgres -c "echo '\dt' | psql -d $cnx") > "${TMP}/psql-$(basename ${dept%%.*}).out" done # ------------------------------------- # Other system configuration files # ------------------------------------- # copy files: for f in $FILES do cp -R $f $TMP done # ------------------------------------- # Optionally save dept(s) database(s) # ------------------------------------- DEPTS_TO_SAVE=$(echo ${DEPTS_TO_SAVE} | tr ' ' '\n' | sort | uniq) # Dump database of a dept (eg "RT") function dump_dept_db { dept=$1 DB=$2 echo "Dumping database ${DB}..." mkdir -p "${TMP}/depts/${dept}" chmod -R a+wr "${TMP}/depts/" (su postgres -c "pg_dump --create ${DB}") | gzip > "${TMP}/depts/${dept}/${DB}.dump.gz" # may add archives ? (but probably too big) } for dept in ${DEPTS_TO_SAVE} do dump_dept_db "${dept}" "SCO${dept}" done # ------------------------------------- # Optionally saveUSERS db # ------------------------------------- if [ "${SAVE_USERS}" = "1" ] then dump_dept_db "USERS" "SCOUSERS" fi # ------------------------------------- # Archive all stuff to /tmp # ------------------------------------- tar cfz $TMP.tgz $TMP echo echo "Fichier de diagnostic: $TMP.tgz" echo # If no mail, stop here if [ "${SEND_BY_MAIL}" = "0" ] then exit 0 fi # ------------------------------------- # Send by e-mail # ------------------------------------- # Code below found on http://www.zedwood.com/article/103/bash-send-mail-with-an-attachment #requires: basename,date,md5sum,sed,sendmail,uuencode function fappend { echo "$2">>$1; } YYYYMMDD=`date +%Y%m%d` # CHANGE THESE TOEMAIL=$DEST_ADDRESS FREMAIL="scodoc-diagnostic@none.org"; SUBJECT="ScoDoc diagnostic - $YYYYMMDD"; MSGBODY="ScoDoc diagnostic sent by diagnostic.sh"; ATTACHMENT="$TMP.tgz" MIMETYPE="application/gnutar" #if not sure, use http://www.webmaster-toolkit.com/mime-types.shtml # DON'T CHANGE ANYTHING BELOW TMP="/tmp/tmpfil_123"$RANDOM; BOUNDARY=`date +%s|md5sum` BOUNDARY=${BOUNDARY:0:32} FILENAME=`basename $ATTACHMENT` rm -rf $TMP; cat $ATTACHMENT|uuencode --base64 $FILENAME>$TMP; sed -i -e '1,1d' -e '$d' $TMP;#removes first & last lines from $TMP DATA=`cat $TMP` rm -rf $TMP; fappend $TMP "From: $FREMAIL"; fappend $TMP "To: $TOEMAIL"; fappend $TMP "Reply-To: $FREMAIL"; fappend $TMP "Subject: $SUBJECT"; fappend $TMP "Content-Type: multipart/mixed; boundary=\""$BOUNDARY"\""; fappend $TMP ""; fappend $TMP "This is a MIME formatted message. If you see this text it means that your"; fappend $TMP "email software does not support MIME formatted messages."; fappend $TMP ""; fappend $TMP "--$BOUNDARY"; fappend $TMP "Content-Type: text/plain; charset=ISO-8859-1; format=flowed"; fappend $TMP "Content-Transfer-Encoding: 7bit"; fappend $TMP "Content-Disposition: inline"; fappend $TMP ""; fappend $TMP "$MSGBODY"; fappend $TMP ""; fappend $TMP ""; fappend $TMP "--$BOUNDARY"; fappend $TMP "Content-Type: $MIMETYPE; name=\"$FILENAME\""; fappend $TMP "Content-Transfer-Encoding: base64"; fappend $TMP "Content-Disposition: attachment; filename=\"$FILENAME\";"; fappend $TMP ""; fappend $TMP "$DATA"; fappend $TMP ""; fappend $TMP ""; fappend $TMP "--$BOUNDARY--"; fappend $TMP ""; fappend $TMP ""; #cat $TMP>out.txt cat $TMP|sendmail -t -f none@example.com; rm $TMP;