#!/bin/sh
#
# Autosupport Version 2.0.15
# Collect support information
#
# Copyright (C) 2005-2010, Digium, Inc.
#
# Written by John Bigelow (support@digium.com)
#            Charles Moye (cmoye@digium.com)
#            Trey Blancher (trey@digium.com)
#
# Distributed under the terms of the GNU General Public
# License
#
# usage:
# autosupport [prefix]
# ARGUMENTS:
# prefix - Prefix to tarball. (Referenced as $1)
#      Example: autosupport <Your Digium Technical Support Ticket number>

# Ensure the PATH variable includes '/usr/sbin' and '/sbin'
PATH=/usr/sbin:/sbin:${PATH}

DATE_STAMP=$(date +%Y%m%d)
OUTPUT_FILE=digiuminfo.txt
TARBALL_OUTPUT_FILE="digium-info_${DATE_STAMP}.tar"
VAR_LIB_LIST_FILE="list-of-varlibasterisk.txt"
FILE_PREFIX=
FOLDER_PREFIX="${HOME}/"
files="n";

# If a prefix is specified on command-line, add it.
if (set -u; : $1) 2> /dev/null
then
  if [ $1 == "-h" ] || [ $1 == "--help" ]; then
    echo
    echo "Digium autosupport script"
    echo "Copyright (C) 2005-2010, Digium, Inc."
    echo "Licensed under the terms of the GNU General Public License"
    echo
    echo "usage: autosupport [prefix]"
    echo "Valid Options:"
    echo "   [prefix]		Prefix to apply to output files"
    echo "			May be your existing Digium Technical Support Ticket ID"
    echo "   -h, --help		Show help about options"
    echo
    echo "Example:"
    echo "    autosupport XXXXXXXX"
    echo "Generates:"
    echo "    XXXXXXXX_${OUTPUT_FILE}"
    echo "    XXXXXXXX_${TARBALL_OUTPUT_FILE}"
    echo
    exit
  fi
  FILE_PREFIX="${FILE_PREFIX}${1}_";
fi

MYUID=$(id -u);

if [ $MYUID -ne  0 ]; then
  echo "You must be root to run this."
  exit 1
fi

SUPPORTED_MODULES="wcb4xxp wct4xxp wctc4xxp wctdm wctdm24xxp wcte11xp wcte12xp"
RELATED_MODULES="$SUPPORTED_MODULES dahdi_dummy dahdi_transcode dahdi_vpmadt032_loader zaptel ztdummy zttranscode";

OUTPUT_FILE="${FILE_PREFIX}${OUTPUT_FILE}"
TARBALL_OUTPUT_FILE="${FILE_PREFIX}${TARBALL_OUTPUT_FILE}"
VAR_LIB_LIST_FILE="${FILE_PREFIX}${VAR_LIB_LIST_FILE}"

OUTPUT="${FOLDER_PREFIX}${OUTPUT_FILE}"
TARBALL_OUTPUT="${FOLDER_PREFIX}${TARBALL_OUTPUT_FILE}"
VAR_LIB_LIST="${FOLDER_PREFIX}${VAR_LIB_LIST_FILE}"

# Done with setup, now start gathering information.

# function not implemented yet
determine_paths()
{
  ASTERISK_PROCESS=$(ps -o cmd -C asterisk | grep asterisk 2> /dev/null)
echo "detected process: $ASTERISK_PROCESS";
  # split on whitespace? or use sed/awk to parse
  # get first arg which will be path to Asterisk binary - add this to PATH
  # look for a '-C' if that is present, get the arg after it, and make the tarball collect that directory
  ## in addition to /etc/asterisk/ or instead of it?
}

collect_digiuminfo()
{
# Delete existing OUTPUT
[ -f $OUTPUT ] && rm -rf $OUTPUT

# Sanity Checks
echo "------------------" >> $OUTPUT;
echo "Sanity" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
md5sum $0 >> $OUTPUT;
grep "Autosupport Version" $0 | head -n1 >> $OUTPUT
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "Working";

echo "------------------" >> $OUTPUT;
echo "KERNEL VERSION : uname -a" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
uname -a >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "VERSION INFO : cat /proc/version" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
cat /proc/version >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "CMDLINE INFO : cat /proc/cmdline" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
cat /proc/cmdline >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

# Check for loaded Zaptel/DAHDI modules
for module in dahdi zaptel; do
  if [ -d /sys/module/$module ]; then
    echo "------------------" >> $OUTPUT
    echo "$module version:" >> $OUTPUT
    echo "------------------" >> $OUTPUT
    echo "/sys/module/$module/version: " >> $OUTPUT
    cat /sys/module/$module/version 2> /dev/null >> $OUTPUT
    echo "" >> $OUTPUT;
    echo -n "."
  fi
done

echo "------------------" >> $OUTPUT;
echo "DAHDI TOOLS : dahdi_cfg --help" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
dahdi_cfg --help 2>&1 | grep "Version" >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "DAHDI HARDWARE : dahdi_hardware" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
dahdi_hardware >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;

echo "------------------" >> $OUTPUT;
echo "ASTERISK INFO : asterisk -V" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
echo "asterisk -V:" >> $OUTPUT;
asterisk -V >> $OUTPUT;
echo >> $OUTPUT;
# Add check to see if asterisk is running.
if [ -e /var/run/asterisk.ctl ] || [ -e /var/run/asterisk/asterisk.ctl ]; then
  for command in "show version" "core show version" "pri show version" "dahdi show version" "transcoder show" \
      "core show uptime" "pri show spans" "misdn show stacks" "zap show channels" "dahdi show channels" \
      "dahdi show channel 1" "core show channels" "skype show version" "skype show licenses" "skype show users" \
      "show g729" "g729 show version" "g729 show licenses" "fax show version" "fax show licenses" "fax show stats" ; do
    echo "asterisk -rx \"$command\"" >> $OUTPUT;
    asterisk -rx "$command" >> $OUTPUT;
    echo >> $OUTPUT;
    echo -n "."
  done
  echo >> $OUTPUT;
fi

echo "------------------" >> $OUTPUT;
echo "OTHER INFO : cat /etc/*{issue,release,version}*" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
for file in $(ls /etc/*issue* /etc/*release* /etc/*version* \
  /etc/*motd* /etc/asterisknow-version /dev/zap/ /dev/dahdi/ \
  2> /dev/null); do
  if [ -f $file ]; then
    echo "$file:" >> $OUTPUT;
    cat $file >> $OUTPUT;
    echo >> $OUTPUT;
    echo -n "."
  fi
done
echo >> $OUTPUT;

echo "------------------" >> $OUTPUT;
echo "RUNNING PROCESSES : ps aux" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
ps aux >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "INTERRUPTS : cat /proc/interrupts" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
cat /proc/interrupts >> $OUTPUT;
echo -n "."
sleep 2;
echo "---------- sleep(2) ----------" >> $OUTPUT;
cat /proc/interrupts >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "DAHDI SCAN : dahdi_scan" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
dahdi_scan >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "----------------------------" >> $OUTPUT;
echo "CAT OF DAHDI/ZAPTEL CHANNELS : cat /proc/dahdi/" >> $OUTPUT;
echo "----------------------------" >> $OUTPUT;
for tech in dahdi zaptel zap; do
  if [ -d /proc/$tech/ ]; then
    for file in $(ls /proc/$tech/ 2> /dev/null); do
      echo "----------------------------" >> $OUTPUT;
      echo "/proc/$tech/$file:" >> $OUTPUT;
      cat /proc/$tech/$file >> $OUTPUT;
      echo >> $OUTPUT;
      echo -n "."
    done
  fi
done
echo >> $OUTPUT;

echo "------------------" >> $OUTPUT;
echo "DMESG OUTPUT : dmesg" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
dmesg >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "LOADED MODULES : lsmod" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
lsmod >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

# Grab the parameters for each module
for mod in $SUPPORTED_MODULES; do
  if [ -d /sys/module/$mod ]; then
    echo "------------------" >> $OUTPUT
    echo "$mod parameters" >> $OUTPUT
    echo "------------------" >> $OUTPUT
    echo "/sys/module/$mod/parameters:" >> $OUTPUT
    for param in $(ls /sys/module/$mod/parameters/ /sys/module/$mod/ 2> /dev/null); do
      if [ -f /sys/module/$mod/parameters/$param ]; then
        echo -n "$param:  " >> $OUTPUT
        cat /sys/module/$mod/parameters/$param 2> /dev/null >> $OUTPUT
      elif [ -f /sys/module/$mod/$param ]; then
        # Handle Zaptel doing it differently
        echo -n "$param:  " >> $OUTPUT
        cat /sys/module/$mod/$param 2> /dev/null >> $OUTPUT
      fi
      echo -n "."
    done
    echo >> $OUTPUT
  fi
done

echo "------------------------" >> $OUTPUT;
echo "DAHDI/ZAPTEL MODULE INFO : modinfo" >> $OUTPUT;
echo "------------------------" >> $OUTPUT;
for file in $(ls /lib/modules/$(uname -r)/dahdi/*.ko \
  /lib/modules/$(uname -r)/dahdi/*/*.ko\
  /lib/modules/$(uname -r)/extra/*.ko \
  /lib/modules/$(uname -r)/extra/*/*.ko \
  /lib/modules/$(uname -r)/misc/*.ko \
  /lib/modules/$(uname -r)/misc/*/*.ko 2> /dev/null); do
  if [ -f $file ]; then
    echo "------------------------" >> $OUTPUT;
    modinfo $file >> $OUTPUT;
    echo >> $OUTPUT;
    echo -n "."
  fi
done
echo "------------------------" >> $OUTPUT;
echo >> $OUTPUT;

echo "------------------" >> $OUTPUT;
echo "PCI LIST : lspci -vvvb" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
lspci -vvvb >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "PCI LIST(no lookup) : lspci -vvvbn" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
lspci -vvvbn >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "CPU INFO : cat /proc/cpuinfo" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
cat /proc/cpuinfo >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "----------------------" >> $OUTPUT;
echo "VPM FIRMWARE INSTALLED : ls -la /lib/firmware" >> $OUTPUT;
echo "----------------------" >> $OUTPUT;
$(ls -la /lib/firmware 2> /dev/null >> $OUTPUT);
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "NETWORK INFO : route -n; iptables -L; ifconfig" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
route -n 2> /dev/null >> $OUTPUT;
echo >> $OUTPUT;
echo "------------------" >> $OUTPUT;
iptables -L 2> /dev/null >> $OUTPUT;
echo >> $OUTPUT;
echo "------------------" >> $OUTPUT;
ifconfig 2> /dev/null >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "DMIDECODE : dmidecode" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
dmidecode >> $OUTPUT;
echo >> $OUTPUT;
echo >> $OUTPUT;
echo -n "."

echo "------------------" >> $OUTPUT;
echo "KERNEL CONFIG : cat /path/.config" >> $OUTPUT;
echo "------------------" >> $OUTPUT;
for file in /lib/modules/$(uname -r)/build/.config /usr/src/linux/.config; do
  if [ -f $file ]; then
    echo "------------------" >> $OUTPUT;
    echo "$file:" >> $OUTPUT;
    cat $file >> $OUTPUT;
    echo >> $OUTPUT;
    echo -n "."
  fi
done
echo >> $OUTPUT;

echo "done!"
}

collect_var_lib_list()
{
  # Delete existing VAR_LIB_LIST
  [ -f $VAR_LIB_LIST ] && rm -rf $VAR_LIB_LIST
  DIR_LISTING="/var/lib/asterisk/"
  if [ -d /var/lib/digium ]; then
    DIR_LISTING="/var/lib/digium/ ${DIR_LISTING}"
  fi
  if [ -d /usr/lib/asterisk/modules/ ]; then
    DIR_LISTING="/usr/lib/asterisk/modules/ ${DIR_LISTING}"
  fi
  echo "ls -1aAR $DIR_LISTING > $VAR_LIB_LIST"
  $(ls -1aR ${DIR_LISTING} | sed -e '/^\.\.*$/d' > $VAR_LIB_LIST);
}

collect_config_backup()
{
  collect_var_lib_list
  # Include the /etc/asterisk directory, modprobe.conf, and the modprobe.d directory
  TAR_FILES="/etc/asterisk/ /etc/modprobe.*"

  # Check if any Asterisk licenses are installed
  # G.729, Fax, ABE, Cepstral, Skype, etc.
  if [ -d /var/lib/asterisk/licenses/ ]; then
    TAR_FILES="$TAR_FILES /var/lib/asterisk/licenses/*"
  fi

  # Check if any Digium licenses are installed
  # HPEC
  if [ -d /var/lib/digium/licenses/ ]; then
    TAR_FILES="$TAR_FILES /var/lib/digium/licenses/*"
  fi

  # Check if DAHDI is installed
  if [ -d /etc/dahdi ]; then
    TAR_FILES="$TAR_FILES /etc/dahdi*"
  fi

  # Check for Zaptel Module configuration
  if [ -f /etc/sysconfig/zaptel ]; then
    TAR_FILES="$TAR_FILES /etc/sysconfig/zaptel*"
  fi

  # Check for Zaptel Module configuration (alternate location)
  if [ -f /etc/default/zaptel ]; then
    TAR_FILES="$TAR_FILES /etc/default/zaptel*"
  fi

  # Grab the dahdi/zaptel init scripts, in case they have been modified
  for driver in dahdi zaptel; do
    if [ -f /etc/init.d/$driver ]; then
      TAR_FILES="$TAR_FILES /etc/init.d/$driver"
    fi
  done

  # Check for zaptel.conf
  if [ -f /etc/zaptel.conf ]; then
    TAR_FILES="$TAR_FILES /etc/zaptel*"
  fi

  # Check for fxotune.conf
  if [ -f /etc/fxotune.conf ]; then
    TAR_FILES="$TAR_FILES /etc/fxotune.conf*"
  fi

  # Check for misdn-init.conf
  if [ -f /etc/misdn-init.conf ]; then
    TAR_FILES="$TAR_FILES /etc/misdn-init.conf*"
  fi

  # Check for digiuminfo.txt
  if [ -f $HOME/$OUTPUT_FILE ]; then
    TAR_FILES="$TAR_FILES $OUTPUT_FILE"
  fi

  # Check for asterisk listing
  if [ -f $VAR_LIB_LIST ]; then
    TAR_FILES="$TAR_FILES $VAR_LIB_LIST_FILE"
  fi

  # Collect System Log Files
  if [ -f /var/log/dmesg ]; then
    TAR_FILES="$TAR_FILES /var/log/dmesg"
  fi
  if [ -f /var/log/messages ]; then
    TAR_FILES="$TAR_FILES /var/log/messages"
  fi

  [ -f $TARBALL_OUTPUT ] && rm -rf $TARBALL_OUTPUT
  [ -f $TARBALL_OUTPUT.gz ] && rm -rf $TARBALL_OUTPUT.gz

  echo "tarring: tar -chvf ${TARBALL_OUTPUT} $TAR_FILES"
  cd $HOME && tar -chvf $TARBALL_OUTPUT $TAR_FILES
  echo "gzipping $TARBALL_OUTPUT"
  gzip $TARBALL_OUTPUT
}

clear;

echo
echo "This script will try to collect the following pieces of"
echo "information from your system."
echo
echo "1. Information about your system such as:"
echo "pci listing, dmesg, running processes, and kernel version"
echo
echo "2. A backup of elements of your configuration such as:"
echo "asterisk config files, license files, loaded dahdi/zaptel module"
echo "parameters, and other asterisk/dahdi/zaptel related files."
echo
echo "Collect this information [y/n] ? "
read files;

if [ "$files" = "y" ] || [ "$files" = "yes" ]; then
  echo "This may take up to half a minute to run. Please be patient."
  collect_digiuminfo;
  collect_config_backup;

  # ensure the output was written
  if [ -f $TARBALL_OUTPUT.gz ]; then
    clear;
    echo;
    echo;
    echo "Tarball has been stored to:"
    echo "$TARBALL_OUTPUT.gz"
    echo "Please send this file to an email case you already"
    echo "have open with Digium Tech Support."
  else
    echo;
    echo;
    echo "An error has occurred in capturing information."
    echo "$TARBALL_OUTPUT.gz was not found."
    echo;
    echo "Please investigate your system, and send the output"
    echo "above to your Digium Technical Support Ticket."
  fi
else
  clear;
  echo;
  echo "User selected not to continue."
fi
exit