#!/bin/sh

COMPANY_NAME="ids"
PRODUCT_NAME="ueye"
PRODUCT_NAME_CANONICAL="uEye"
SUPPORT_MAIL="IDS Support <support@ids-imaging.com>"
HOMEPAGE="https://en.ids-imaging.com"
VISION_BRAND="peak"
VISION_CLI_PREFIX="ids"

LIBPATH=""
STDOUT=/dev/stdout
STDERR=/dev/stderr
## CREATE A REPORT FOR DEBUGGING PURPOSES

separator()
{
  echo
  echo "--------------------------------------------------------------------------------------------------"
  echo
  echo "   -->  <  $1  >"
  echo
}

message()
{
  echo
  echo "*** <  $1  > ***"
  echo
}

usage()
{
    echo "Usage: ${1} [ -o file ]"
    echo "Options:"
    echo "    -o file           print output to 'file'. If omitted, stdout is used."
    exit "${2}"
}

APPEND=0

while getopts 'ao:' OPTION
do
    case $OPTION in
        a)  APPEND=1;;
        o)  STDOUT=$OPTARG
            STDERR=$OPTARG
            ;;
        \?) echo "Unknown option \"-$OPTARG\"." >&2
            usage "${0}" "$EXIT_ERROR";;
        :)  echo "Option \"-$OPTARG\" requires an argument." >&2
            usage "${0}" "$EXIT_ERROR";;
        *)  echo "Fatal option error ...\"$OPTION\"... " >&2
            usage "${0}" "$EXIT_BUG";;
    esac
done

# get libpath
if [ -f "/lib64" ]
then
    LIBPATH="/lib64/"
else
    LIBPATH="/lib/"
fi

if test $APPEND -eq 0
then
    echo "" > "$STDOUT"
fi

# dump header
separator "report created on $(date)" >> "$STDOUT" 2>> "$STDERR"
echo "Send to your local distributors support or: ${SUPPORT_MAIL}" >> "$STDOUT" 2>> "$STDERR"
echo "Homepage: ${HOMEPAGE} for driver updates" >> "$STDOUT" 2>> "$STDERR"

# dump current user
separator "user information" >> "$STDOUT" 2>> "$STDERR"
message "current user: $(whoami)" >> "$STDOUT" 2>> "$STDERR"
message "groups: $(groups "$(whoami)")" >> "$STDOUT" 2>> "$STDERR"

# dump system limitations
separator "system limits" >> "$STDOUT" 2>> "$STDERR"
ulimit -a >> "$STDOUT" 2>> "$STDERR"

# dump setup package version
if [ -e ./VERSION ]
then
    separator "${PRODUCT_NAME_CANONICAL} SDK version" >> "$STDOUT" 2>> "$STDERR"
    cat ./VERSION >> "$STDOUT" 2>> "$STDERR"
fi

# dump linux version
separator "Linux version" >> "$STDOUT" 2>> "$STDERR"
cat /proc/version >> "$STDOUT" 2>> "$STDERR"

#dump distribution version
separator "Linux distribution version" >> "$STDOUT" 2>> "$STDERR"
cat /etc/issue >> "$STDOUT" 2>> "$STDERR"

# dump gcc version
separator "GCC version information" >> "$STDOUT" 2>> "$STDERR"
echo "GNU compiler collection: $(gcc -v 2>&1)" >> "$STDOUT" 2>> "$STDERR"
echo "Glibc:                   $(find "$LIBPATH" -type f -name "libc.so.6" -exec sh -c 'file="$1"; echo -n "Found $file: "; $file | head -n 1;' shell {} \;) " >> "$STDOUT" 2>> "$STDERR"
echo "X Windows:               $(X -version 2>&1 | grep "Version")" >> "$STDOUT" 2>> "$STDERR"

# gather network information
separator "network information" >> "$STDOUT" 2>> "$STDERR"

if command -v ifconfig > /dev/null 2>&1
then
    ifconfig  >> "$STDOUT" 2>> "$STDERR"
elif command -v ip > /dev/null 2>&1
then
    ip address >> "$STDOUT" 2>> "$STDERR"
else
   echo "  Neither ifconfig nor ip found!" >> "$STDOUT" 2>> "$STDERR"
fi

for interface in /sys/class/net/*; do
    speed=$(cat "/sys/class/net/$interface/speed"   2> /dev/null)
    state=$(cat "/sys/class/net/$interface/operstate" 2> /dev/null)
    printf "%s\n  state: %s\n  speed: %s\n\n" "$interface" "$state" "$speed" >> "$STDOUT" 2>> "$STDERR"
done

# dump some cpu infos
separator "CPU information" >> "$STDOUT" 2>> "$STDERR"
cat /proc/cpuinfo >> "$STDOUT" 2>> "$STDERR"

# dump some memory information
separator "Memory information" >> "$STDOUT" 2>> "$STDERR"
cat /proc/meminfo >> "$STDOUT" 2>> "$STDERR"

# dump Linux command line
separator "Linux run with command line" >> "$STDOUT" 2>> "$STDERR"
cat /proc/cmdline >> "$STDOUT" 2>> "$STDERR"

# show PCI devices
separator "PCI devices" >> "$STDOUT" 2>> "$STDERR"
lspci >> "$STDOUT" 2>> "$STDERR"

# show USB devices
separator "USB devices" >> "$STDOUT" 2>> "$STDERR"
lsusb >> "$STDOUT" 2>> "$STDERR"

# dump loaded kernel modules
separator "Kernel modules" >> "$STDOUT" 2>> "$STDERR"
lsmod >> "$STDOUT 2>>$STDERR"

# dump network configuration
separator "network configuration" >> "$STDOUT" 2>> "$STDERR"
sysctl -q net.core.netdev_max_backlog >> "$STDOUT" 2>> "$STDERR"
sysctl -q net.core.rmem_max >> "$STDOUT" 2>> "$STDERR"
sysctl -q net.core.rmem_default >> "$STDOUT" 2>> "$STDERR"
netstat -su  >> "$STDOUT" 2>> "$STDERR"

# dump shm access rights
separator "access to /dev/shm" >> "$STDOUT" 2>> "$STDERR"
if [ -e /dev/shm ]
then
    ls -ld /dev/shm >> "$STDOUT" 2>> "$STDERR"
else
    echo "/dev/shm doesn't exist." >> "$STDOUT" 2>> "$STDERR"
fi

# dump daemon runtime dir access rights
separator "access to /var/run/${PRODUCT_NAME}d" >> "$STDOUT" 2>> "$STDERR"
if [ -e /var/run/${PRODUCT_NAME}d ]
then
    ls -ld /var/run/${PRODUCT_NAME}d >> "$STDOUT" 2>> "$STDERR"
    ls -l /var/run/${PRODUCT_NAME}d >> "$STDOUT" 2>> "$STDERR"
else
    echo "/var/run/${PRODUCT_NAME}d doesn't exist." >> "$STDOUT" 2>> "$STDERR"
fi

# dump running ${PRODUCT_NAME} software
separator "running ${PRODUCT_NAME} software" >> "$STDOUT" 2>> "$STDERR"
ps aux | grep ${PRODUCT_NAME} >> "$STDOUT" 2>> "$STDERR"

# dump mount options
separator "mount options" >> "$STDOUT" 2>> "$STDERR"
mount >> "$STDOUT" 2>> "$STDERR"

# dump mounted filesystems
separator "mounted filesystems" >> "$STDOUT" 2>> "$STDERR"
df -ah >> "$STDOUT" 2>> "$STDERR"

# show udev rules file
separator "udev rules" >> "$STDOUT" 2>> "$STDERR"
if [ -e /etc/udev/rules.d/zz-${PRODUCT_NAME}usb.rules ]
then
    cat /etc/udev/rules.d/zz-${PRODUCT_NAME}usb.rules >> "$STDOUT" 2>> "$STDERR"
else
    echo "/etc/udev/rules.d/zz-${PRODUCT_NAME}usb.rules does not exist." >> "$STDOUT" 2>> "$STDERR"
fi

# show udev rules directory
separator "udev rules directory" >> "$STDOUT" 2>> "$STDERR"
if [ -d /etc/udev/rules.d ]
then
    ls -ld /etc/udev/rules.d >> "$STDOUT" 2>> "$STDERR"
    ls -l /etc/udev/rules.d >> "$STDOUT" 2>> "$STDERR"
    ls -lL /etc/udev/rules.d >> "$STDOUT" 2>> "$STDERR"
else
    echo "/etc/udev/rules.d does not exist." >> "$STDOUT" 2>> "$STDERR"
fi

# dump ${PRODUCT_NAME} access rights
separator "/dev/${PRODUCT_NAME}: content and access" >> "$STDOUT" 2>> "$STDERR"
if [ -e /dev/${PRODUCT_NAME} ]
then
    ls -ld /dev/${PRODUCT_NAME} >> "$STDOUT" 2>> "$STDERR"
    ls -l /dev/${PRODUCT_NAME} >> "$STDOUT" 2>> "$STDERR"
    ls -lL /dev/${PRODUCT_NAME} >> "$STDOUT" 2>> "$STDERR"
else
    echo "/dev/${PRODUCT_NAME} doesn't exist." >> "$STDOUT" 2>> "$STDERR"
fi

# dump ${PRODUCT_NAME_CANONICAL} access rights
separator "/dev/${PRODUCT_NAME_CANONICAL}: content and access" >> "$STDOUT" 2>> "$STDERR"
if [ -e /dev/${PRODUCT_NAME_CANONICAL} ]
then
    ls -ld /dev/${PRODUCT_NAME_CANONICAL} >> "$STDOUT" 2>> "$STDERR"
    ls -l /dev/${PRODUCT_NAME_CANONICAL} >> "$STDOUT" 2>> "$STDERR"
    ls -lL /dev/${PRODUCT_NAME_CANONICAL} >> "$STDOUT" 2>> "$STDERR"
else
    echo "/dev/${PRODUCT_NAME_CANONICAL} doesn't exist." >> "$STDOUT" 2>> "$STDERR"
fi

# dump user/group information
separator "user and group information" >> "$STDOUT" 2>> "$STDERR"
[ -e /usr/bin/id ] && /usr/bin/id ${PRODUCT_NAME}d >> "$STDOUT" 2>> "$STDERR"
[ -e /usr/bin/groups ] && /usr/bin/groups ${PRODUCT_NAME}d >> "$STDOUT" 2>> "$STDERR"

# dump user/group information from /etc/passwd and /etc/group
separator "user and group information from files" >> "$STDOUT" 2>> "$STDERR"
grep ${PRODUCT_NAME} /etc/passwd >> "$STDOUT" 2>> "$STDERR"
grep ${PRODUCT_NAME} /etc/group >> "$STDOUT" 2>> "$STDERR"

# show installed ${PRODUCT_NAME_CANONICAL} libraries
separator "installed lib${PRODUCT_NAME}_api versions" >> "$STDOUT" 2>> "$STDERR"
find /usr/lib -name "lib${PRODUCT_NAME}_api*" -exec ls -l {} \; >> "$STDOUT" 2>> "$STDERR"
separator "installed lib${PRODUCT_NAME}_api versions in /opt" >> "$STDOUT" 2>> "$STDERR"
find /opt -name "lib${PRODUCT_NAME}_api*" -exec ls -l {} \; >> "$STDOUT" 2>> "$STDERR"

# dump dependencies of lib${PRODUCT_NAME}_api
separator "lib${PRODUCT_NAME}_api* dependencies" >> "$STDOUT" 2>> "$STDERR"
find /usr/lib -name "lib${PRODUCT_NAME}_api*" -exec echo "++ {} dependencies ++" \; -exec     ldd -v -d {} \; >> "$STDOUT" 2>> "$STDERR"
separator "lib${PRODUCT_NAME}_api* dependencies in /opt" >> "$STDOUT" 2>> "$STDERR"
find /opt -name "lib${PRODUCT_NAME}_api*" -exec echo "++ {} dependencies ++" \; -exec     ldd -v -d {} \; >> "$STDOUT" 2>> "$STDERR"

# dump ${PRODUCT_NAME}d versions, dependencies, configuration and status
if  [ -e /usr/bin/${PRODUCT_NAME}usbd ]
then
    separator "${PRODUCT_NAME}usbd version" >> "$STDOUT" 2>> "$STDERR"
    /usr/bin/${PRODUCT_NAME}usbd -v >> "$STDOUT" 2>> "$STDERR"
    separator "${PRODUCT_NAME}usbd dependencies" >> "$STDOUT" 2>> "$STDERR"
    ldd -v -d /usr/bin/${PRODUCT_NAME}usbd >> "$STDOUT" 2>> "$STDERR"
    if [ -e /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}usbd.conf ]
    then
        separator "${PRODUCT_NAME}usbd configuration file" >> "$STDOUT" 2>> "$STDERR"
        cat /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}usbd.conf >> "$STDOUT" 2>> "$STDERR"
    fi
    if [ -e /etc/init.d/${PRODUCT_NAME}usbdrc ]
    then
        separator "${PRODUCT_NAME}usbd status" >> "$STDOUT" 2>> "$STDERR"
        /etc/init.d/${PRODUCT_NAME}usbdrc status >> "$STDOUT" 2>> "$STDERR"
    else
        message "/etc/init.d/${PRODUCT_NAME}usbdrc not found!" >> "$STDOUT" 2>> "$STDERR"
    fi
elif [ -e /opt/${COMPANY_NAME}/${PRODUCT_NAME}/bin/${PRODUCT_NAME}usbd ]
then
    separator "${PRODUCT_NAME}usbd version" >> "$STDOUT" 2>> "$STDERR"
    /opt/${COMPANY_NAME}/${PRODUCT_NAME}/bin/${PRODUCT_NAME}usbd -v >> "$STDOUT" 2>> "$STDERR"
    separator "${PRODUCT_NAME}usbd dependencies" >> "$STDOUT" 2>> "$STDERR"
    ldd -v -d /opt/${COMPANY_NAME}/${PRODUCT_NAME}/bin/${PRODUCT_NAME}usbd >> "$STDOUT" 2>> "$STDERR"
    if [ -e /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}usbd.conf ]
    then
        separator "${PRODUCT_NAME}usbd configuration file" >> "$STDOUT" 2>> "$STDERR"
        cat /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}usbd.conf >> "$STDOUT" 2>> "$STDERR"
    fi
    if [ -e /etc/init.d/${PRODUCT_NAME}usbdrc ]
    then
        separator "${PRODUCT_NAME}usbd status" >> "$STDOUT" 2>> "$STDERR"
        /etc/init.d/${PRODUCT_NAME}usbdrc status >> "$STDOUT" 2>> "$STDERR"
    else
        message "/etc/init.d/${PRODUCT_NAME}usbdrc not found!" >> "$STDOUT" 2>> "$STDERR"
    fi
else
    message "No USB ${PRODUCT_NAME_CANONICAL} daemon available." >> "$STDOUT" 2>> "$STDERR"
fi

if  [ -e /usr/bin/${PRODUCT_NAME}ethd ]
then
    separator "${PRODUCT_NAME}ethd version" >> "$STDOUT" 2>> "$STDERR"
    /usr/bin/${PRODUCT_NAME}ethd -v >> "$STDOUT" 2>> "$STDERR"
    separator "${PRODUCT_NAME}ethd dependencies" >> "$STDOUT" 2>> "$STDERR"
    ldd -v -d /usr/bin/${PRODUCT_NAME}ethd >> "$STDOUT" 2>> "$STDERR"
    if [ -e /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}ethd.conf ]
    then
        separator "${PRODUCT_NAME}ethd configuration file" >> "$STDOUT" 2>> "$STDERR"
        cat /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}ethd.conf >> "$STDOUT" 2>> "$STDERR"
    fi
    if [ -e /etc/init.d/${PRODUCT_NAME}ethdrc ]
    then
        separator "${PRODUCT_NAME}ethd status" >> "$STDOUT" 2>> "$STDERR"
        /etc/init.d/${PRODUCT_NAME}ethdrc status >> "$STDOUT" 2>> "$STDERR"
    else
        message "/etc/init.d/${PRODUCT_NAME}ethdrc not found!" >> "$STDOUT" 2>> "$STDERR"
    fi
elif [ -e /opt/${COMPANY_NAME}/${PRODUCT_NAME}/bin/${PRODUCT_NAME}ethd ]
then
    separator "${PRODUCT_NAME}ethd version" >> "$STDOUT" 2>> "$STDERR"
    /opt/${COMPANY_NAME}/${PRODUCT_NAME}/bin/${PRODUCT_NAME}ethd -v >> "$STDOUT" 2>> "$STDERR"
    separator "${PRODUCT_NAME}ethd dependencies" >> "$STDOUT" 2>> "$STDERR"
    ldd -v -d /opt/${COMPANY_NAME}/${PRODUCT_NAME}/bin/${PRODUCT_NAME}ethd >> "$STDOUT" 2>> "$STDERR"
    if [ -e /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}ethd.conf ]
    then
        separator "${PRODUCT_NAME}ethd configuration file" >> "$STDOUT" 2>> "$STDERR"
        cat /etc/${COMPANY_NAME}/${PRODUCT_NAME}/${PRODUCT_NAME}ethd.conf >> "$STDOUT" 2>> "$STDERR"
    fi
    if [ -e /etc/init.d/${PRODUCT_NAME}ethdrc ]
    then
        separator "${PRODUCT_NAME}ethd status" >> "$STDOUT" 2>> "$STDERR"
        /etc/init.d/${PRODUCT_NAME}ethdrc status >> "$STDOUT" 2>> "$STDERR"
    else
        message "/etc/init.d/${PRODUCT_NAME}ethdrc not found!" >> "$STDOUT" 2>> "$STDERR"
    fi

else
    message "No GigE ${PRODUCT_NAME_CANONICAL} daemon available." >> "$STDOUT" 2>> "$STDERR"
fi

# list connected ${PRODUCT_NAME} devices
if [ -e /usr/bin/${PRODUCT_NAME}setid ]
then
    separator "connected cameras" >> "$STDOUT" 2>> "$STDERR"
    /usr/bin/${PRODUCT_NAME}setid -d >> "$STDOUT" 2>> "$STDERR"
fi

# extract ${PRODUCT_NAME}d errors from logs...
separator "Latest ${PRODUCT_NAME_CANONICAL} messages /var/log/messages (limit: 100)" >> "$STDOUT" 2>> "$STDERR"
[ -e /var/log/messages ] && grep "${PRODUCT_NAME}" /var/log/messages | tail -n 100 >> "$STDOUT" 2>> "$STDERR"
separator "Latest ${PRODUCT_NAME_CANONICAL} messages of /var/log/syslog (limit: 100)" >> "$STDOUT" 2>> "$STDERR"
[ -e /var/log/syslog ] && grep "${PRODUCT_NAME}" /var/log/syslog | tail -n 100 >> "$STDOUT" 2>> "$STDERR"

separator "Latest USB messages /var/log/messages (limit: 100)" >> "$STDOUT" 2>> "$STDERR"
[ -e /var/log/messages ] && grep usb /var/log/messages | tail -n 100 >> "$STDOUT" 2>> "$STDERR"
separator "Latest USB messages of /var/log/syslog (limit: 100)" >> "$STDOUT" 2>> "$STDERR"
[ -e /var/log/syslog ] && grep usb /var/log/syslog  | tail -n 100 >> "$STDOUT" 2>> "$STDERR"

# show usb related kernel logs
separator "USB kernel log entries" >> "$STDOUT" 2>> "$STDERR"
dmesg | grep usb >> "$STDOUT" 2>> "$STDERR"

# Look for peak related stuff now
separator "${VISION_BRAND} libraries" >> "$STDOUT" 2>> "$STDERR"

ldconfig -p | grep ${VISION_CLI_PREFIX}_${VISION_BRAND} | while read -r line
do
    echo "${line}" >> "$STDOUT" 2>> "$STDERR"
    ldd "${line#*=>}" >> "$STDOUT" 2>> "$STDERR"
done

separator "GENICAM_GENTL64_PATH" >> "$STDOUT" 2>> "$STDERR"
echo "$GENICAM_GENTL64_PATH"  >> "$STDOUT" 2>> "$STDERR"

separator "GENICAM_GENTL32_PATH" >> "$STDOUT" 2>> "$STDERR"
echo "$GENICAM_GENTL32_PATH" >> "$STDOUT" 2>> "$STDERR"

separator "${VISION_CLI_PREFIX}_devicecommand" >> "$STDOUT" 2>> "$STDERR"
if command -v ${VISION_CLI_PREFIX}_devicecommand > /dev/null 2>&1
then
    ${VISION_CLI_PREFIX}_devicecommand -v  >> "$STDOUT" 2>> "$STDERR"
    separator "${VISION_CLI_PREFIX}_devicecommand: interfaces" >> "$STDOUT" 2>> "$STDERR"
    ${VISION_CLI_PREFIX}_devicecommand --list-interfaces  >> "$STDOUT" 2>> "$STDERR"
    separator "${VISION_CLI_PREFIX}_devicecommand: devices" >> "$STDOUT" 2>> "$STDERR"
    ${VISION_CLI_PREFIX}_devicecommand -L >> "$STDOUT" 2>> "$STDERR"
    separator "${VISION_CLI_PREFIX}_devicecommand: cti-info" >> "$STDOUT" 2>> "$STDERR"
    ${VISION_CLI_PREFIX}_devicecommand --cti-info >> "$STDOUT" 2>> "$STDERR"
fi

separator "${VISION_CLI_PREFIX}_ipconfig" >> "$STDOUT" 2>> "$STDERR"
if command -v ${VISION_CLI_PREFIX}_ipconfig > /dev/null 2>&1
then
    ${VISION_CLI_PREFIX}_ipconfig -v >> "$STDOUT" 2>> "$STDERR"
    separator "${VISION_CLI_PREFIX}_ipconfig: devices" >> "$STDOUT" 2>> "$STDERR"
    ${VISION_CLI_PREFIX}_ipconfig -l >> "$STDOUT" 2>> "$STDERR"
fi

