#!/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
#
set -euo pipefail
# Le répertoire de ce script:
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

source "$SCRIPT_DIR"/config.sh || die "config.sh not found, exiting"

DEST_ADDRESS=emmanuel.viennet@gmail.com 

TMP=/tmp/scodoc-$(date +%F-%s)

SAVE_DB=0
SEND_BY_MAIL=1

# -------------------------------------
# Arguments
# -------------------------------------

function join_by { local IFS="$1"; shift; echo "$*"; }

while getopts "anh" opt; do
  case "$opt" in
      a)
	  SAVE_DB=1
	  ;;
      n)
	  SEND_BY_MAIL=0
	  ;;
      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 la bases de donnees (prod)"
	  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/nginx /etc/postfix $SCODOC_DIR/sco_version.py $SCODOC_VAR_DIR/config"


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
# -------------------------------------

mkdir "$TMP"/scodoc_logs/
cp "$SCODOC_VAR_DIR"/log/*.log "$TMP"/scodoc_logs/

# -------------------------------------
# Linux System Configuration
# -------------------------------------

iptables -L > "$TMP"/iptables.out
ip a > "$TMP"/ip-a.out
ps auxww > "$TMP"/ps.out
df -h > "$TMP"/df.out
dpkg -l > "$TMP"/dpkg.lst

ls -laR "$SCODOC_DIR" > "$TMP"/ls-laR


# -------------------------------------
# Databases configurations
# -------------------------------------
(su postgres -c "psql -l") > "${TMP}/psql-l.out"

for db in "$SCODOC_DB_PROD" "$SCODOC_DB_DEV"
do
  (su postgres -c "echo '\dt' | psql $db") > "${TMP}/psql-$db.out"
done


# -------------------------------------
# Other system configuration files
# -------------------------------------
# copy files:
for f in $FILES 
do
    if [ -e "$f" ]
    then
        cp -R "$f" "$TMP"
    fi
done


# -------------------------------------
# Optionally save database
# -------------------------------------

if [ "${SAVE_DB}" = "1" ]
then
    for db in "$SCODOC_DB_PROD" "$SCODOC_DB_DEV"
    do
        echo "Dumping database ${db}..."
        su -c "pg_dump --create ${db}" postgres | gzip > "${TMP}/${db}.dump.gz"
        # may add archives ? (no, probably too big)
    done
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 9 diagnostic - $YYYYMMDD";
MSGBODY="ScoDoc 9 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"
uuencode --base64 "$FILENAME" < "$ATTACHMENT" >"$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";