#! /bin/sh

backtitle="Diva Support Assistant Copyright (c) by Eicon Networks 1993 - 2002"
diva_dir="/usr/share/eicon"
diva_proc="/proc/net/eicon"
report="${diva_dir}/report.txt"
divactrl="/sbin/divactrl"
dialog="${diva_dir}/dialog"
tmp=${diva_dir}/support.tmp

#------------------------------------------------------------
# Problem description table
#------------------------------------------------------------
i=1
Problem[$i]="Driver start failed"
i=$(($i+1))
Problem[$i]="Kernel crash (Oops, lockup) after driver start"
i=$(($i+1))
Problem[$i]="No Eicon Diva adapter detected"
i=$(($i+1))
Problem[$i]="Eicon Diva adapter start failed"
i=$(($i+1))
Problem[$i]="Eicon Diva driver load failed (space expensive)"
i=$(($i+1))
Problem[$i]=none

maint_pid=0

#------------------------------------------------------------
rm -f ${diva_dir}/maint.bin

#------------------------------------------------------------
help=""
hlp_base="${diva_dir}/help.txt"
hlp="${diva_dir}/support.hlp"
if [ ! -f ${hlp_base} ]
then
	echo > ${hlp_base}
fi

set_help_id()
{
	ident="$1"
	help=""

	sed -ne "/<$ident>/,/<$ident\/>/p" ${hlp_base} | sed -e "/<$ident>/d" -e "/<$ident\/>/d" - > ${hlp}
	if [ $(($?)) -eq 0 ]
	then
		if [ -s ${hlp} ]
		then
			help="--helptag ${hlp}"
		fi
	fi

}

#------------------------------------------------------------
# Execution abort
#------------------------------------------------------------
exit_aborted()
{
  $dialog --title "Operation aborted" --backtitle "$backtitle" \
      --clear --msgbox "Operation aborted by user." 5 70

  setterm -default
  setterm -clear

  rm -f ${diva_dir}/support.dlg ${tmp} ${report}

  exit 1
}

#------------------------------------------------------------
# Show final screen
#------------------------------------------------------------
show_complete()
{
  $dialog --clear --title "Report complete" --backtitle "$backtitle" \
				--yesno "View '${report}' file" 7 70 2>$tmp
  if [ $(($?)) -eq 0 ]
  then
    $dialog --title "${report}" --backtitle "$backtitle" \
        --clear --textbox ${report} 18 70
  fi

  $dialog --title "Report complete" --backtitle "$backtitle" \
      --clear --msgbox "Please add file '${report}' to your support request." 7 70

  setterm -default
  setterm -clear

  rm -f ${diva_dir}/support.dlg ${tmp} maint.bin

  exit 0
}

#------------------------------------------------------------
# Ask to start
#------------------------------------------------------------
display_purpose()
{
  msg="You can use the Eicon Diva Support Assistant to generate problem reports for Eicon's range of Diva adapters."
  title="Activate Diva Support Assistant ?"
  $dialog --clear --title "$title" --backtitle "$backtitle" \
    --yesno "$msg" 7 70 3>$tmp
  if [ $(($?)) -ne 0 ]
  then
    rm -f ${tmp} ${diva_dir}/support.dlg ${report}
    setterm -default
    setterm -clear
    exit 1
  fi
}

# ------------------------------------------------------------------------------
#  Warn user about possible system failure
# ------------------------------------------------------------------------------
warning_fail()
{
  msg="It is possible that your system will stop to respond. Please reboot in \
this case and use the '${report}' and '${diva_dir}/maint.bin' files for your support request."
  title="Continue ?"
  $dialog --clear --title "$title" --backtitle "$backtitle" \
    --yesno "$msg" 9 70 5>$tmp
  if [ $(($?)) -ne 0 ]
  then
    return 1
  else
    return 0
  fi
}

# ------------------------------------------------------------------------------
#  Ask user for failure profile
# ------------------------------------------------------------------------------
select_cause()
{
  msg=""
  i=1

  while [ "${Problem[${i}]}" != none ]
  do
    msg="$msg \"$((i))\" \" - ${Problem[$i]}\" off"
    i=$(($i+1))
  done

	set_help_id support_cause
  msg="$dialog ${help} --title \"Please select problem profile\" \
       --backtitle \"$backtitle\" \
			 --clear --radiolist \"Possible profiles\" $((7+$i-1)) 70 $(($i-1)) $msg"
    echo "$msg 2>$tmp" > ${diva_dir}/support.dlg
  sh ${diva_dir}/support.dlg
  if [ $(($?)) -ne 0 ]
  then
    exit_aborted
  fi

  problem_profile=$(cat $tmp)
}

# ------------------------------------------------------------------------------
#  Sync file system
# ------------------------------------------------------------------------------
check_point()
{
  sync
  sync
  sync
}

# ------------------------------------------------------------------------------
#  Capture as much as possible info (commpn step)
# ------------------------------------------------------------------------------
capture_config()
{
  $dialog --backtitle "$backtitle" \
					 --infobox "Extract RPM name ..." 3 70
  echo "----------------------------------------------------------" >> ${report}
  echo "CAPTURE SYSTEM INFORMATION" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  echo RPM: $(rpm -q -a | grep divas) >> ${report} 2>&1
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Process system environment ..." 3 70

  echo KERNEL VERSION: >> ${report}
  cat /proc/version    >> ${report} 2>&1
  uname -r             >> ${report} 2>&1
  ls /etc/*-release    >> ${report} 2>&1
  cat /etc/*-release   >> ${report} 2>&1
  echo DEVICE NODES:           >> ${report}
  ls -l /dev/capi* /dev/ttyds* >> ${report} 2>&1
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Process Oops ..." 3 70

  echo INITIAL KSYMOOPT REPORT: >> ${report}
  echo KSYMOOPT MESSAGES: >> ${report}
  ksymoops -o ${diva_dir} < /var/log/messages >> ${report} 2>&1
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Process Oops pass 2 ..." 3 70

  echo KSYMOOPT MESSAGES.1: >> ${report}
  if [ -f /var/log/messages.1 ]
  then
    ksymoops -o ${diva_dir} < /var/log/messages.1 >> ${report} 2>&1
  fi
  echo END INITIAL KSYMOOPT REPORT >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Process module info ..." 3 70

  echo LOADED MODULES: >> ${report}
  cat /proc/modules    >> ${report} 2>&1
  echo LOADED DEVICES: >> ${report}
  cat /proc/devices    >> ${report} 2>&1

  $dialog --backtitle "$backtitle" \
					 --infobox "Process hardware info ..." 3 70

  echo INTERRUPTS:     >> ${report}
  cat /proc/interrupts >> ${report} 2>&1
  echo PORTS:          >> ${report}
  cat /proc/ioports    >> ${report} 2>&1
  echo IOMEM:          >> ${report}
  cat /proc/iomem      >> ${report} 2>&1
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Process pci info ..." 3 70

  echo PCI BUS:        >> ${report}
  cat /proc/pci        >> ${report} 2>&1
  check_point

  echo LSPCI BUS:      >> ${report}
  lspci -vv            >> ${report} 2>&1
  check_point
  lspci -t -vv         >> ${report} 2>&1
  check_point

  cat /proc/bus/pci/devices   >> ${report} 2>&1
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Process adapter configuration ..." 3 70

  echo "CARD CONFIGURATION:"  >> ${report}
  cat ${diva_dir}/divas_cfg.rc >> ${report} 2>&1

  $dialog --backtitle "$backtitle" \
					 --infobox "Process adapter log ..." 3 70

  echo "INITIAL CARD LOG:"    >> ${report}
  cat /var/log/diva*.log      >> ${report} 2>&1

  $dialog --backtitle "$backtitle" \
					 --infobox "Process /var/log/messages ..." 3 70

  echo "DIVA - MESSAGES:"     >> ${report}
  fgrep -i diva /var/log/messages >> ${report} 2>&1

  $dialog --backtitle "$backtitle" \
					 --infobox "Process /var/log/messages pass 2 ..." 3 70

  fgrep -i capi /var/log/messages >> ${report} 2>&1

  $dialog --backtitle "$backtitle" \
					 --infobox "Process /var/log/messages pass 3 ..." 3 70

  fgrep -i oops /var/log/messages >> ${report} 2>&1

  $dialog --backtitle "$backtitle" \
					 --infobox "Process dmesg ..." 3 70
  echo "PROCESS INITIAL DMESG" >> ${report}
  dmesg >> ${report}
  echo "END INITIAL DMESG" >> ${report}
  check_point
  $dialog --backtitle "$backtitle" \
					 --infobox "Process dmesg Oops ..." 3 70
  echo "PROCESS INITIAL DMESG OOPS" >> ${report}
  check_point
  dmesg >> $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  echo "END INITIAL DMESG OOPS" >> ${report}
  check_point
  
  echo "----------------------------------------------------------" >> ${report}
  echo "END SYSTEM INFO CAPTURE" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  check_point
   
}

# ------------------------------------------------------------------------------
#  Trace system that is failed to load
# ------------------------------------------------------------------------------
failed_to_load()
{
  check_point
  capture_config
  warning_fail
  if [ $(($?)) -ne 0 ]
  then
    echo "----------------------------------------------------------" >> ${report}
    echo "WARNING: ABORTED BY USER" >> ${report}
    echo "----------------------------------------------------------" >> ${report}
    check_point
    return
  fi
# -------------------------------------------------------------
  echo "" >> ${report}
  echo "-------------------------------------------------------------" >> ${report}
  echo "START DEBUG LOAD PROBLEMS" >> ${report}
  echo "-------------------------------------------------------------" >> ${report}
  echo "" >> ${report}
  check_point
# -------------------------------------------------------------
  echo "----------------------------------------------------------" >> ${report}
  echo "TRY LOAD DRIVERS AND START FIRST CARD" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to start DIDD ..." 3 70

  echo "TRY TO START DIDD" >> ${report}
  check_point
  insmod -f ${diva_dir}/divadidd.o                    >> ${report} 2>&1
  echo "END START DIDD ($?)" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to read DIDD info ..." 3 70

  ls -l /proc/net /proc/net/eicon >> ${report} 2>&1
  check_point
  cat /proc/net/eicon/divadidd >> ${report} 2>&1
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to start XDI ..." 3 70
  echo "TRY TO START XDI" >> ${report}
  insmod -f ${diva_dir}/divas.o     >> ${report} 2>&1
  echo "END START XDI ($?)" >> ${report}
  check_point
  echo "START MODULE LIST" >> ${report}
  lsmod >> ${report} 2>&1
  echo "END MODULE LIST" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to read XDI info ..." 3 70
  echo "START DIVA PROC INFO" >> ${report}
  check_point
  ls -lR /proc/net /proc/net/eicon >> ${report} 2>&1
  echo "END DIVA PROC INFO" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Check Oops ..." 3 70
  echo "START OOPS" >> ${report}
  check_point
  dmesg > $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  echo "END OOPS" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Look for Eicon Diva adapters ..." 3 70
  echo "START READ DIVA ADAPTER INFO" >> ${report}
  check_point

  i=1
  while [ -f /proc/net/eicon/adapter$((i))/info ]
  do
    echo "START ADAPTER: $i" >> ${report}
    cat "/proc/net/eicon/adapter$((i))/info" >> ${report} 2>&1
    echo "END ADAPTER: $i" >> ${report}
    check_point
    i=$(($i+1))
  done
  echo "DETECTED ADAPTERS: $(($i-1))" >> ${report} 2>&1
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to load CAPI (kernelcapi) ..." 3 70
  echo "TRY TO START KERNELCAPI" >> ${report}
  check_point

  insmod -f ${diva_dir}/kernelcapi.o  >> ${report} 2>&1
  echo "END START KERNELCAPI ($?)" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to load CAPI (divacapi) ..." 3 70
  echo "TRY TO START DIVACAPI" >> ${report}
  check_point

  insmod -f ${diva_dir}/divacapi.o    >> ${report} 2>&1
  echo "END START DIVACAPI ($?)" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to load CAPI (capi) ..." 3 70
  echo "TRY TO START CAPI" >> ${report}
  check_point

  insmod -f ${diva_dir}/capi.o        >> ${report} 2>&1
  echo "END START CAPI ($?)" >> ${report}
  check_point
  
  echo "START MODULE LIST" >> ${report}
  lsmod >> ${report} 2>&1
  echo "END MODULE LIST" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Try to start adapter ..." 3 70
  echo "TRY TO START FIRST CARD:" >> ${report}
  check_point
  ${divactrl} load -c 1 -f ETSI -Debug >> ${report} 2>&1
  echo "END START FIRST CARD" >> ${report}
  echo "START CARD STATE" >> ${report}
  check_point
  ${divactrl} load -c 1 -CardState >> ${report} 2>&1
  echo "END CARD STATE" >> ${report}
  echo "START OOPS" >> ${report}
  check_point
  dmesg > $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  echo "END OOPS" >> ${report}

  ${diva_dir}/divactrl load -c 1 -CardState | grep active > /dev/null 2>&1
  if [ $(($?)) -eq 0 ]
  then
    $dialog --backtitle "$backtitle" \
					 --infobox "Try to load TTY driver ..." 3 70
    echo "TRY TO LOAD DIVA TTY" >> ${report}
    check_point
    insmod -f ${diva_dir}/Divatty.o     >> ${report} 2>&1
    echo "END LOAD DIVA TTY ($?)" >> ${report}
    check_point
  else
    echo "WARNING: CAN NOT ACTIVATE CARD 1 - DO NIT LOAD DIVA TTY DRIVER" >> ${report}
  fi

  $dialog --backtitle "$backtitle" \
					 --infobox "Finally look for Oops ..." 3 70
  echo "START FINAL OOPS" >> ${report}
  check_point
  dmesg > $tmp
  dmesg > $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  echo "END FINAL OOPS" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					 --infobox "Look for messages ..." 3 70
  echo "START FINAL MESSAGES" >> ${report}
  dmesg >> ${report} 2>&1
  echo "END FINAL MESSAGES" >> ${report}
  check_point
}

# ------------------------------------------------------------------------------
#  Trace system that causes kernel panic
# ------------------------------------------------------------------------------
kernel_panic()
{
  capture_config
  check_point

  dmesg | grep "^Oops:" > /dev/null 2>&1
  if [ $(($?)) -eq 0 ]
  then
    $dialog --clear --title "Reboot now ?" \
      --backtitle "$backtitle" \
      --yesno "System is not stable (actual kernel Oops found). System reboot is necessary to receive reliable results. Please restart 'Support' after reboot." 7 70 4>$tmp
    if [ $(($?)) -eq 0 ]
    then
      sh ${diva_dir}/cfg_util.sh 2 >> ${report} 2>&1
      echo "NEED REBOOT" >> ${report}
      check_point
      $dialog --title "Reboot" --backtitle "$backtitle" \
        --clear --msgbox "Your system will reboot now." 5 70
      reboot
      exit 0
    fi
    echo "WARNING: NEED REBOOT - NOT REBOOTED" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
  warning_fail
  if [ $(($?)) -ne 0 ]
  then
    echo "----------------------------------------------------------" >> ${report}
    echo "WARNING: ABORTED BY USER" >> ${report}
    echo "----------------------------------------------------------" >> ${report}
    check_point
    return
  fi
# -------------------------------------------------------------
  echo "" >> ${report}
  echo "-------------------------------------------------------------" >> ${report}
  echo "START DEBUG KERNEL PANIC" >> ${report}
  echo "-------------------------------------------------------------" >> ${report}
  echo "" >> ${report}
  check_point
# -------------------------------------------------------------
  $dialog --backtitle "$backtitle" \
					 --infobox "Stop Eicon Diva drivers ..." 3 70
  echo "TRY TO STOP DIVA DRIVERS" >> ${report}
  check_point
  ${diva_dir}/Stop >> ${report} 2>&1
  echo "STOPPED DIVA DRIVERS DMESG" >> ${report}
  dmesg >> ${report}
  echo "STOPPED DIVA DRIVERS DMESG OOPS" >> ${report}
  dmesg > $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  echo "STOPPED DIVA DRIVERS" >> ${report}
  check_point
# -------------------------------------------------------------
  if [ -f ${diva_proc}/divadidd ]
  then
    $dialog --clear --title "Reboot now ?" \
      --backtitle "$backtitle" \
      --yesno "Cannot unload Eicon Diva drivers. System reboot is necessary." 7 70 2>$tmp
    if [ $(($?)) -eq 0 ]
    then
      sh ${diva_dir}/cfg_util.sh 2 >> ${report} 2>&1
      echo "NEED REBOOT - CAN NOT UNLOAD DRIVERS" >> ${report}
      check_point
      $dialog --title "Reboot" --backtitle "$backtitle" \
        --clear --msgbox "Your system will reboot now." 5 70
      reboot
      exit 0
    fi
    echo "----------------------------------------------------------" >> ${report}
    echo "WARNING: GENERATE PARTIAL REPORT" >> ${report}
    echo "----------------------------------------------------------" >> ${report}
    check_point
    $dialog --title "Warning" --backtitle "$backtitle" \
      --clear --msgbox "Create partial report." 5 70
    return
  fi
# -------------------------------------------------------------
didd_loaded=0
xdi_loaded=0
maint_loaded=0
adapter_loaded=0
# -------------------------------------------------------------
  $dialog --backtitle "$backtitle" \
					 --infobox "Load DIDD device driver ..." 3 70
  echo "TRY TO LOAD DIDD DRIVER" >> ${report}
  check_point
  insmod -f ${diva_dir}/divadidd.o >> ${report} 2>&1
  echo "DIDD DRIVER LOAD COMPLETE ($?)" >> ${report}
  check_point
  $dialog --backtitle "$backtitle" \
					 --infobox "Look for DIDD Oops ..." 3 70
  dmesg > $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  check_point
  if [ -f /proc/net/eicon/divadidd ]
  then
    didd_loaded=1
    echo "DIDD DRIVER LOAD OK" >> ${report}
  else
    didd_loaded=0
    echo "DIDD DRIVER LOAD FAILED" >> ${report}
  fi
  check_point

    $dialog --backtitle "$backtitle" \
	 			    --infobox "Process DIDD messages ..." 3 70
    echo "CHECK DIDD MESSAGES" >> ${report}
    dmesg >> ${report} 2>&1
    echo "END MESSAGES" >> ${report}
    check_point
# -------------------------------------------------------------
  if [ $((didd_loaded)) -eq 1 ]
  then
    $dialog --backtitle "$backtitle" \
					   --infobox "Load MAINT device driver ..." 3 70
    echo "TRY TO LOAD MAINT DRIVER" >> ${report}
    check_point
    insmod -f ${diva_dir}/diva_mnt.o
    if [ $(($?)) -eq 0 ]
    then
      echo "MAINT DRIVER LOAD OK ($?)" >> ${report}
    else
      echo "MAINT DRIVER LOAD FAILED ($?)" >> ${report}
    fi
    check_point
    echo "LOOK FOR MAINT OOPS" >> ${report}
    $dialog --backtitle "$backtitle" \
					 --infobox "Look for MAINT Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END LOOK FOR MAINT OOPS" >> ${report}
    check_point
    if [ -f ${diva_proc}/maint ]
    then
      echo "MAINT DRIVER LOADED" >> ${report}
      maint_loaded=1
    else
      echo "MAINT: ${rova_proc}/mant not found" >> ${report}
      maint_loaded=0
    fi
    check_point
    if [ $((maint_loaded)) -eq 1 ]
    then
      echo "TRY TO START MAINT TRACE" >> ${report}
      $dialog --backtitle "$backtitle" \
					 --infobox "Start MAINT trace ..." 3 70
      cat ${diva_proc}/maint > ${diva_dir}/maint.bin 2>&1 &
      maint_pid=$!
      echo "MAINT TRACE PID $maint_pid" >> ${report}
    else
      maint_pid=0
    fi
    check_point
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Process MAINT messages ..." 3 70
    echo "CHECK XDI MESSAGES" >> ${report}
    dmesg >> ${report} 2>&1
    echo "END MESSAGES" >> ${report}
    check_point
    echo "CHECK INITIAL MAINT MESSAGES" >> ${report}
    cat ${diva_dir}/maint.bin >> ${report} 2>&1
    echo "END INITIAL MAINT MESSAGES" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
  if [ $((didd_loaded)) -eq 1 ]
  then
    $dialog --backtitle "$backtitle" \
					   --infobox "Load XDI device driver ..." 3 70
    echo "TRY TO LOAD XDI DRIVER" >> ${report}
    check_point
    insmod -f ${diva_dir}/divas.o
    echo "XDI DRIVER LOAD COMPLETE ($?)" >> ${report}
    check_point
    $dialog --backtitle "$backtitle" \
					 --infobox "Look for XDI Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    check_point
    if [ -f /proc/net/eicon/divadidd ]
    then
      xdi_loaded=1
      echo "XDI DRIVER LOAD OK" >> ${report}
    else
      xdi_loaded=0
      echo "XDI DRIVER LOAD FAILED" >> ${report}
      $dialog --backtitle "$backtitle" \
					 --infobox "Process messages ..." 3 70
      dmesg >> $(report)
    fi
    check_point

    $dialog --backtitle "$backtitle" \
	 			    --infobox "Process XDI messages ..." 3 70
    echo "CHECK XDI MESSAGES" >> ${report}
    dmesg >> ${report} 2>&1
    echo "END MESSAGES" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
  if [ $((xdi_loaded)) -eq 1 ]
  then
    $dialog --backtitle "$backtitle" \
					   --infobox "Start Eicon Diva adapters ..." 3 70
    echo "TRY TO START DIVA ADAPTERS" >> ${report}
    check_point
    card_started=0
    i=1
    while [ -f ${diva_proc}/adapter$((i))/info ]
    do
      $dialog --backtitle "$backtitle" \
              --infobox "Process adapter $((i)) ..." 3 70
      echo "TRY TO GET INFO FROM ADAPTER: $((i))" >> ${report}
      cat ${diva_proc}/adapter$((i))/info         >> ${report} 2>&1
      echo "GOT INFO FROM ADAPTER: $((i))"        >> ${report}
      check_point
      echo "TRY TO START ADAPTER: $((i))" >> ${report}
      ${diva_dir}/divactrl load -c $((i)) -f ETSI -Debug >> ${report} 2>&1
      if [ $(($?)) -ne 0 ]
      then
        card_started=0
      else
        card_started=1
        adapter_loaded=1
      fi
      echo "STARTED ADAPTER: $((i))-$((card_started))" >> ${report}
      check_point
      echo "ADAPTER INFO AFTER START: $((i))" >> ${report}
      cat ${diva_proc}/adapter$((i))/info         >> ${report} 2>&1
      echo "END ADAPTER INFO AFTER START: $((i))" >> ${report}
      check_point
      if [ $((card_started)) -eq 1 ]
      then
        $dialog --backtitle "$backtitle" \
					 --infobox "Read Xlog from adapter $((i)) ..." 3 70
        echo "START XLOG FOR ADAPTER: $((i))" >> ${report}
        ${diva_dir}/divactrl load -c $((i)) -FlushXlog >> ${report} 2>&1
        echo "END START XLOG FOR ADAPTER: $((i))" >> ${report}
        check_point
      fi
      echo "START LOOK FOR OOPS FROM ADAPTER: $((i))" >> ${report}
      $dialog --backtitle "$backtitle" \
					 --infobox "Look for adapter $((i)) Oops ..." 3 70
      check_point
      dmesg > $tmp
      ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
      echo "END LOOK FOR OOPS FROM ADAPTER: $((i))" >> ${report}
      check_point

      i=$(($i+1))
    done
    echo "FOUND ADAPTERS: $(($i-1))" >> ${report}
    check_point

    $dialog --backtitle "$backtitle" \
	 			    --infobox "Process adapter messages ..." 3 70
    echo "CHECK ADAPTER MESSAGES" >> ${report}
    dmesg >> ${report} 2>&1
    echo "END MESSAGES" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
  load_failed=0

  if [ $((didd_loaded)) -eq 1 ]
  then
    $dialog --backtitle "$backtitle" \
	  				 --infobox "Load CAPI device driver ..." 3 70
    echo "TRY TO LOAD KERNELCAPI" >> ${report}
    check_point
    insmod -f ${diva_dir}/kernelcapi.o >> ${report} 2>&1
    if [ $(($?)) -eq 0 ]
    then
      echo "LOAD KERNELCAPI OK" >> ${report}
      load_failed=0
    else
      echo "LOAD KERNELCAPI FAILED" >> ${report}
      load_failed=1
    fi
    check_point

    echo "CHECK OOPS" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Look for kernelcapi Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END CHECK OOPS" >> ${report}
    check_point

    echo "TRY TO LOAD DIVACAPI" >> ${report}
    insmod -f ${diva_dir}/divacapi.o >> ${report} 2>&1
    if [ $(($?)) -eq 0 ]
    then
      echo "LOAD DIVACAPI OK" >> ${report}
      load_failed=0
    else
      echo "LOAD DIVACAPI FAILED" >> ${report}
      load_failed=1
    fi
    check_point

    echo "CHECK OOPS" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Look for divacapi Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END CHECK OOPS" >> ${report}
    check_point

    echo "TRY TO LOAD CAPI" >> ${report}
    insmod -f ${diva_dir}/capi.o >> ${report} 2>&1
    if [ $(($?)) -eq 0 ]
    then
      echo "LOAD CAPI OK" >> ${report}
      load_failed=0
    else
      echo "LOAD CAPI FAILED" >> ${report}
      load_failed=1
    fi
    check_point

    echo "CHECK OOPS" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Look for capi Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END CHECK OOPS" >> ${report}
    check_point

    $dialog --backtitle "$backtitle" \
	 			    --infobox "Process CAPI messages ..." 3 70
    echo "CHECK CAPI MESSAGES" >> ${report}
    dmesg >> ${report} 2>&1
    echo "END CAPI MESSAGES" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
  if [ $((didd_loaded)) -eq 1 ]
  then
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Load User Mode IDI device driver ..." 3 70
    echo "TRY TO LOAD USER MODE IDI" >> ${report}
    check_point
    insmod -f ${diva_dir}/diva_idi.o >> ${report} 2>&1
    if [ $(($?)) -eq 0 ]
    then
      echo "LOAD USER MODE IDI OK" >> ${report}
    else
      echo "LOAD USER MODE IDI FAILED" >> ${report}
    fi
    check_point

    echo "CHECK OOPS" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Look for User Mode IDI Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END CHECK OOPS" >> ${report}
    check_point

    $dialog --backtitle "$backtitle" \
	 			    --infobox "Process User Mode IDI messages ..." 3 70
    echo "CHECK USER MODE IDI MESSAGES" >> ${report}
    dmesg >> ${report} 2>&1
    echo "END MESSAGES" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
  if [ $((adapter_loaded)) -eq 1 ]
  then
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Load TTY device driver ..." 3 70
    echo "TRY TO LOAD DIVA TTY" >> ${report}
    check_point
    insmod -f ${diva_dir}/Divatty.o >> ${report} 2>&1
    if [ $(($?)) -eq 0 ]
    then
      echo "LOAD DIVA TTY OK" >> ${report}
    else
      echo "LOAD DIVA TTY FAILED" >> ${report}
    fi
    check_point

    $dialog --backtitle "$backtitle" \
	 			    --infobox "Look for TTY Oops ..." 3 70
    echo "CHECK OOPS" >> ${report}
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END CHECK OOPS" >> ${report}
    check_point

    $dialog --backtitle "$backtitle" \
	 			    --infobox "Process TTY messages ..." 3 70
    echo "CHECK DIVA TTY MESSAGES" >> ${report}
    dmesg >> ${report} 2>&1
    echo "END MESSAGES" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
#  Now TRY to access drivers and generate some calls
# -------------------------------------------------------------
  if [ $((adapter_loaded)) -eq 1 ]
  then
    echo "CREATE DEVICE NODES:" >> ${report}
    check_point
    rm -f /dev/capi20
    mknod /dev/capi20 c 68 0 >> ${report} 2>&1
    rm -f /dev/ttyds01
    mknod /dev/ttyds01 c 8 1 >> ${report} 2>&1
    ls -l /dev/capi20 /dev/ttyds01 >> ${report} 2>&1
    echo "END CREATE DEVICE NODES:" >> ${report}
    check_point

    echo "ACCESS DIVA TTY INTERFACE" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Access TTY interface ..." 3 70
    check_point
    ${diva_dir}/tty_test 1 900  >> ${report} 2>&1
    echo "END ACCESS DIVA TTY INTERFACE" >> ${report}
    check_point

    echo "STORE DIVA TTY INTERFACE ACCESS OOPS" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Look for TTY interface access Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END STORE DIVA TTY INTERFACE ACCESS OOPS" >> ${report}
    check_point

    echo "STORE DIVA TTY INTERFACE ACCESS XLOG" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Store TTY interface access trace ..." 3 70
    ${diva_dir}/divactrl load -c 1 -FlushXlog >> ${report} 2>&1
    echo "END STORE DIVA TTY INTERFACE ACCESS XLOG" >> ${report}
    check_point

    echo "ACCESS CAPI INTERFACE" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Access CAPI interface ..." 3 70
    check_point
    ${diva_dir}/acopy2 /num -n900 /C /V2  >> ${report} 2>&1
    echo "END ACCESS CAPI INTERFACE" >> ${report}
    check_point

    echo "STORE CAPI INTERFACE ACCESS OOPS" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Look for CAPI interface access Oops ..." 3 70
    dmesg > $tmp
    ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
    echo "END STORE DIVA TTY INTERFACE ACCESS OOPS" >> ${report}
    check_point

    echo "STORE CAPI INTERFACE ACCESS XLOG" >> ${report}
    $dialog --backtitle "$backtitle" \
	 			    --infobox "Store CAPI interface access trace ..." 3 70
    ${diva_dir}/divactrl load -c 1 -FlushXlog >> ${report} 2>&1
    echo "END STORE CAPI INTERFACE ACCESS XLOG" >> ${report}
    check_point
  fi
# -------------------------------------------------------------
#  ADD MAINT TRACES
# -------------------------------------------------------------
  if [ $((maint_pid)) -ne 0 ]
  then
    echo "MAINT TRACES:" >> ${report}
    check_point
    cat ${diva_dir}/maint.bin >> ${report} 2>&1
    echo "END MAINT TRACES:" >> ${report}
    check_point
    echo "STOP MAINT TRACE:" >> ${report}
    kill $maint_pid >> ${report} 2>&1
    echo "END STOP MAINT TRACE:" >> ${report}
    check_point
    rm -f ${diva_dir}/maint.bin
  fi
}

# ------------------------------------------------------------------------------
#  Trace system that can not detect adapter
# ------------------------------------------------------------------------------
no_adapter()
{
  capture_config
# -------------------------------------------------------------
  echo "" >> ${report}
  echo "-------------------------------------------------------------" >> ${report}
  echo "START DEBUG CARD DETECTION" >> ${report}
  echo "-------------------------------------------------------------" >> ${report}
  echo "" >> ${report}
  check_point
# -------------------------------------------------------------
  warning_fail
  if [ $(($?)) -ne 0 ]
  then
    echo "----------------------------------------------------------" >> ${report}
    echo "WARNING: ABORTED BY USER" >> ${report}
    echo "----------------------------------------------------------" >> ${report}
    check_point
    return
  fi
# -------------------------------------------------------------
  $dialog --backtitle "$backtitle" \
					 --infobox "Stop Eicon Diva drivers ..." 3 70
  echo "TRY TO STOP DIVA DRIVERS" >> ${report}
  check_point
  ${diva_dir}/Stop >> ${report} 2>&1
  echo "STOPPED DIVA DRIVERS" >> ${report}
  echo "STOPPED DIVA DRIVERS DMESG" >> ${report}
  dmesg >> ${report}
  echo "STOPPED DIVA DRIVERS DMESG OOPS" >> ${report}
  dmesg > $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  echo "STOPPED DIVA DRIVERS" >> ${report}
  check_point
# -------------------------------------------------------------
  if [ -f ${diva_proc}/divadidd ]
  then
    $dialog --clear --title "Reboot now ?" \
      --backtitle "$backtitle" \
      --yesno "Cannot unload Eicon Diva drivers. System reboot is necessary." 7 70 2>$tmp
    if [ $(($?)) -eq 0 ]
    then
      sh ${diva_dir}/cfg_util.sh 2 >> ${report} 2>&1
      echo "NEED REBOOT - CAN NOT UNLOAD DRIVERS" >> ${report}
      check_point
      $dialog --title "Reboot" --backtitle "$backtitle" \
        --clear --msgbox "Your system will reboot now." 5 70
      reboot
      exit 0
    fi
    echo "----------------------------------------------------------" >> ${report}
    echo "WARNING: GENERATE PARTIAL REPORT" >> ${report}
    echo "----------------------------------------------------------" >> ${report}
    check_point
    $dialog --title "Warning" --backtitle "$backtitle" \
      --clear --msgbox "Create partial report." 5 70
    return
  fi
# -------------------------------------------------------------
  $dialog --backtitle "$backtitle" \
					 --infobox "Load DIDD driver ..." 3 70
  echo "LOAD DIVA DIDD DRIVER " >> ${report}
  check_point
  insmod -f ${diva_dir}/divadidd.o >> ${report} 2>&1
  echo "END LOAD DIVA DIDD DRIVER ($?)" >> ${report}
  check_point
  $dialog --backtitle "$backtitle" \
					 --infobox "Load MAINT driver ..." 3 70
  echo "LOAD DIVA MAINT DRIVER " >> ${report}
  check_point
  insmod -f ${diva_dir}/diva_mnt.o >> ${report} 2>&1
  echo "END LOAD DIVA MAINT DRIVER ($?)" >> ${report}
  check_point
  $dialog --backtitle "$backtitle" \
					 --infobox "Start MAINT trace ..." 3 70
  echo "START MAINT TRACE" >> ${report}
  check_point
  cat ${diva_proc}/maint > ${diva_dir}/maint.bin  2>&1 &  >> ${report}
  maint_pid=$!
  echo "END START MAINT TRACE. PID: $maint_pid" >> ${report}
  check_point
  $dialog --backtitle "$backtitle" \
					 --infobox "Load XDI driver ..." 3 70
  echo "TRY TO LOAD DIVA XDI DRIVER" >> ${report}
  check_point
 
  insmod -f ${diva_dir}/divas.o >> ${report} 2>&1
  if [ $(($?)) -eq 0 ]
  then
    echo "END LOAD DIVA XDI DRIVER - OK" >> ${report}
    xdi_loaded=1
  else
    echo "END LOAD DIVA XDI DRIVER - FAILURE" >> ${report}
    xdi_loaded=0
  fi
  check_point
  if [ $((xdi_loaded)) -eq 1 ]
  then
      $dialog --backtitle "$backtitle" \
					      --infobox "Process Eicon Diva adapters ..." 3 70
      i=1
      while [ -f ${diva_proc}/adapter$((i))/info ]
      do
        $dialog --backtitle "$backtitle" \
					      --infobox "Process adapter $((i)) ..." 3 70
        echo "GET ADAPTER $((i)) INFO" >> ${report}
        check_point
        cat ${diva_proc}/adapter$((i))/info >> ${report} 2>&1
        echo "START ADAPTER $((i))" >> ${report}
        check_point
        ${diva_dir}/divactrl load -c $((i)) -f ETSI -Debug >> ${report} 2>&1
        echo "START ADAPTER $((i)) COMPLETE ($?)" >> ${report}
        check_point
        $dialog --backtitle "$backtitle" \
					      --infobox "Read adapter $((i)) log ..." 3 70
        echo "GET ADAPTER $((i)) XLOG" >> ${report}
        ${diva_dir}/divactrl load -c $((i)) -FlushXlog >> ${report} 2>&1
        echo "END ADAPTER $((i)) XLOG" >> ${report}
        echo "GET ADAPTER $((i)) INFO AFTER START" >> ${report}
        check_point
        cat ${diva_proc}/adapter$((i))/info >> ${report} 2>&1
        echo "ADAPTER $((i)) COMPLETE" >> ${report}
        check_point
        i=$(($i+1))
      done
  else
    echo "PROBLEM: CAN NOT LOAD XDI DRIVER" >> ${report}
  fi

  $dialog --backtitle "$backtitle" \
					      --infobox "Read system messages ..." 3 70
  echo "" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  echo "FINAL DIVA MESSAGES:" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  dmesg >> ${report} 2>&1
  echo "END FINAL DIVA MESSAGES" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					      --infobox "Look for Oops ..." 3 70
  echo "" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  echo "FINAL DIVA OOPS:" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  dmesg > $tmp
  ksymoops -o ${diva_dir} < $tmp >> ${report} 2>&1
  echo "END FINAL DIVA OOPS" >> ${report}
  check_point

  $dialog --backtitle "$backtitle" \
					      --infobox "Read MAINT trace..." 3 70
  echo "" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  echo "MAINT TRACES:" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  check_point
  cat ${diva_dir}/maint.bin >> ${report} 2>&1
  echo "END MAINT TRACES:" >> ${report}
  check_point
  echo "STOP MAINT TRACE:" >> ${report}
  kill $maint_pid >> ${report} 2>&1
  echo "END STOP MAINT TRACE:" >> ${report}
  echo "" >>  ${report}
  check_point
  rm -f ${diva_dir}/maint.bin
}

# ------------------------------------------------------------------------------
#  Adapter load failed
# ------------------------------------------------------------------------------
adapter_load()
{
  no_adapter
}

# ------------------------------------------------------------------------------
#  Capture binary system information
# ------------------------------------------------------------------------------
capture_binary_information()
{
  $dialog --backtitle "$backtitle" \
					 --infobox "Extract RPM name ..." 3 70
  echo "----------------------------------------------------------" >> ${report}
  echo "CAPTURE SYSTEM INFORMATION" >> ${report}
  echo "----------------------------------------------------------" >> ${report}
  echo RPM: $(rpm -q -a | grep divas) >> ${report} 2>&1
  check_point
  $dialog --backtitle "$backtitle" \
					 --infobox "Start information capture, please be patient ..." 3 70

  echo  "OS RELEASE:"          >> ${report}
  uname -a                     >> ${report} 2>&1
  echo  "KERNEL RELEASE:"      >> ${report}
  cat /proc/version            >> ${report}
  echo  "DMESG:"               >> ${report}
  dmesg                        >> ${report} 2>&1
  echo  "STARTUP SCRIPT:"      >> ${report}
  cat ${diva_dir}/divas_cfg.rc >> ${report} 2>&1
  echo  "PCI BUS:"             >> ${report}
  cat /proc/pci                >> ${report}
  echo  "-------------------"  >> ${report}
  cat /proc/bus/pci/devices    >> ${report}
  echo  "-------------------"  >> ${report}
  lspci -t -vv                 >> ${report} 2>&1
  echo  "-------------------"  >> ${report}
  lspci -vv                    >> ${report} 2>&1
  echo  "MODULES:"             >> ${report}
  lsmod                        >> ${report} 2>&1
  echo  "-------------------"  >> ${report}
  cat /proc/modules            >> ${report}
  echo  "DEVICES:"             >> ${report}
  cat /proc/devices            >> ${report}
  echo  "INTERRUPTS:"          >> ${report}
  cat /proc/interrupts         >> ${report}
  echo  "IOMEM:"               >> ${report}
  cat /proc/iomem              >> ${report}
  echo  "IOPORTS:"             >> ${report}
  cat /proc/ioports            >> ${report}
  echo  "-------------------"  >> ${report}
  echo  "END"                  >> ${report}
  check_point


  tar -zcvf ${diva_dir}/report.tgz ${report} ${diva_dir}/*.o ${diva_dir}/divactrl \
            /boot /lib/modules/$(uname -r) /var/log/messages \
            /etc/*.conf /etc/*rel*

  if [ $(($?)) -ne 0 ]
  then
    $dialog --title "Operation Failed" --backtitle "$backtitle" \
      --clear --msgbox "Failed to create file '${diva_dir}/report.tgz'" 7 70
    setterm -default
    setterm -clear
    exit 1
  fi
  check_point

	rm -f report.txt
  $dialog --title "Report complete" --backtitle "$backtitle" \
      --clear --msgbox "Please add file '${diva_dir}/report.tgz' to your support request." 7 70

  setterm -default
  setterm -clear

	exit 0
}

# ------------------------------------------------------------------------------
#  Start
# ------------------------------------------------------------------------------
display_purpose
echo "Diva support report" > ${report}
problem_profile=0
while [ $((problem_profile)) -eq 0 ]
do
  select_cause
done

echo $(hostname) >> $report
echo $(date)     >> $report
echo "Problem Profile: '${Problem[$problem_profile]}'" >> $report

case $((problem_profile)) in
  1)
#  Failed to load drivers
   failed_to_load
    ;;
  2)
#  Kernel crash (Oops, lockup) on driver start
   kernel_panic
    ;;
  3)
#  No Eicon Diva adapter was detected
   no_adapter
    ;;
  4)
#  Adapter fails to start
   adapter_load
    ;;
  5)
#  No other way to detect cause of system failure as to capture
#  as much as possible system information
   capture_binary_information
    ;;
esac

#-------------------------------------------------------------------------------
#  GENERATE SUFFIX
#-------------------------------------------------------------------------------
echo "RECOVERY DIVA STARTUP LINKS" >> ${report}
sh ${diva_dir}/cfg_util.sh 1 >> ${report} 2>&1
check_point

echo "---------------------------------------------------------" >> ${report}
echo "END OF REPORT FILE" >> ${report}
echo "---------------------------------------------------------" >> ${report}
check_point

show_complete

