User Tools

Site Tools


wiki:support:troubleshoot

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
wiki:support:troubleshoot [2019/09/25 15:57]
ghi created
wiki:support:troubleshoot [2023/06/02 15:47] (current)
ehe [Automatic log gathering]
Line 8: Line 8:
  
   * ''/​var/​log/​messages*'':​ These files are the main logs, they gather the traces of the firmware. They contain the boot traces, the network events, the hardware events, and many other traces.   * ''/​var/​log/​messages*'':​ These files are the main logs, they gather the traces of the firmware. They contain the boot traces, the network events, the hardware events, and many other traces.
-  * ''/​var/​log/​lora.log*'':​ Theses files contains ​the traces of the common packet forwarder (lorad and lorafwd). If you encounter LoRa issues, this is a good way to start. The verbosity of this log can be increased/​decreased. Refer to the [[ wiki:cpf#log_managment ​|log management]] section.+  * ''/​var/​log/​lora.log*'':​ Theses files contain ​the traces of the common packet forwarder (lorad and lorafwd). If you encounter LoRa issues, this is a good way to start. The verbosity of this log can be increased/​decreased. Refer to the [[ wiki:lora:cpf#log_management ​|log management]] section.
   * ''/​tmp/​board_info.json'':​ This file contains information about the hardware of the gateway. It is generated at each boot time.\\   * ''/​tmp/​board_info.json'':​ This file contains information about the hardware of the gateway. It is generated at each boot time.\\
   * ''/​tmp/​calib_loraloc.json''​ (**for Wirnet iBTS**): This file contains the calibration values specific to this gateway. It is generated at boot time.   * ''/​tmp/​calib_loraloc.json''​ (**for Wirnet iBTS**): This file contains the calibration values specific to this gateway. It is generated at boot time.
-  * ''/​tmp/​calib_rf.json''​ (**for Wirnet iFemtoCell ​ and Wirnet iStation**):​ This file contains the calibration values specific to this gateway. It is generated at boot time.+  * ''/​tmp/​calib_rf.json''​ (**for Wirnet iFemtoCell, Wirnet iFemtoCell-evolution ​and Wirnet iStation**):​ This file contains the calibration values specific to this gateway. It is generated at boot time.
   * ''/​dev/​nmea*''​ (**Wirnet iBTS and Wirnet iStation**):​ These devices receive NMEA frames (GPS) every seconds. It can be monitored with the ''​cat''​ command. ​   * ''/​dev/​nmea*''​ (**Wirnet iBTS and Wirnet iStation**):​ These devices receive NMEA frames (GPS) every seconds. It can be monitored with the ''​cat''​ command. ​
  
Line 66: Line 66:
     * For Wirnet iFemtoCell, the serial number is written on the rear sticker (it is named "Final product ID").     * For Wirnet iFemtoCell, the serial number is written on the rear sticker (it is named "Final product ID").
     * For Wirnet iStation, the serial number is written on the external sticker (it is named "​Product ID"​). ​     * For Wirnet iStation, the serial number is written on the external sticker (it is named "​Product ID"​). ​
 +    * For Wirnet iFemtoCell-evolution,​ the serial number is written on rear sticker (it is named "​Product ID"​). ​
   * A precise description of your problem. "​Gateway not working"​ is not enough to investigate.   * A precise description of your problem. "​Gateway not working"​ is not enough to investigate.
   * The list of the actions you took to troubleshoot/​investigate your problem.   * The list of the actions you took to troubleshoot/​investigate your problem.
Line 77: Line 78:
 To simplify the log gathering process, two scripts are available. These scripts generate an archive containing many logs and commands results. To simplify the log gathering process, two scripts are available. These scripts generate an archive containing many logs and commands results.
  
-++++Gathering logs from shell|+++++Gathering logs from WebUI since release 5.9| 
 +[[wiki:​systeme_mana:​webui#​gateway_administration_menu|Get logs from gateway]] 
 +++++ 
 + 
 +++++Gathering logs from shell since release 4.2| 
 + 
 +To gather the logs from shell: 
 +  * Execute the command ''​get_logs''​. //The execution of the script takes less than 1 minute.// 
 +  * It will generate an archive in the same directory you executed the script (example: ''​Logs_2E0605F5_7b26_20200124-095206.tar.gz''​) 
 +  * Retrieve this archive (use whatever method you prefer: FileZilla, scp, ...). 
 + 
 +<​note>​**To use only in case of speed or data restriction**,​ there is a new option to gather lighter logs: ''​get_logs -m''​ or ''​get_logs --minimal''​. \\ 
 +**Please note that it will only gather latest logs** (.log & .log.1 files). \\ 
 +It will generate an light archive recognizable by its name: _minimal.tar.gz (example: ''​Logs_3903002E_0091_20230419-134556_minimal.tar.gz''​) 
 +</​note>​ 
 +++++ 
 + 
 +++++Gathering logs from shell on older releases|
  
 To gather the logs from shell: To gather the logs from shell:
   * Upload the script bellow (use whatever method you prefer: FileZilla, scp, copy/paste, ...) in a folder of your gateway and go to this folder.   * Upload the script bellow (use whatever method you prefer: FileZilla, scp, copy/paste, ...) in a folder of your gateway and go to this folder.
-  * Convert the file to Unix text file format using ''​dos2unix ​gather_logs.sh''​. +  * Convert the file to Unix text file format using ''​dos2unix ​get_logs.sh''​. 
-  * Add execution rights to the script using ''​chmod 755 gather_logs.sh''​. +  * Add execution rights to the script using ''​chmod 755 get_logs.sh''​. 
-  * Execute the script using ''​./​gather_logs.sh''​. //The execution of the script takes about 1-2 minutes.// +  * Execute the script using ''​./​get_logs.sh''​. //The execution of the script takes less than minute.// 
-  * It will generate an archive ​under ''​/tmp''​.+  * It will generate an archive ​in the same directory you executed the script. (example: ​''​Logs_2E0605F5_7b26_20200124-095206.tar.gz''​)
   * Retrieve this archive (use whatever method you prefer: FileZilla, scp, ...).   * Retrieve this archive (use whatever method you prefer: FileZilla, scp, ...).
  
-<code bash gather_logs.sh>+ 
 +<code bash get_logs.sh>
 #!/bin/sh #!/bin/sh
  
-USBDIR="​`dirname $0`"+# Version of the script 
 +SCRIPT_VERSION=1.3
  
-SYSLEDPATH_IBTS="/​sys/​class/​leds/​yellow:​debug/"​ +# Output directory for the result of the script 
-SYSLEDPATH_IFEMTO="/​sys/​class/​leds/​led1:​red:​power/​"+OUTPUT_DIR="`dirname $0`"
  
-check_version(){+# Execution'​s environment of the script 
 +SCRIPT_ENV=unknown 
 + 
 +# PLATFORM: IBTS, IFEMTO, ISTATION, IFEVO 
 +PLATFORM=unknown 
 +# Serial number of the product: 39020003 
 +SERIAL=unknown 
 +# ETH0 MAC: 70:​76:​ff:​01:​77:​71 => 7771 
 +SHORT_MAC=unknown 
 + 
 +# LED paths 
 +SYSLEDPATH_4_0_IBTS="/​sys/​class/​leds/​yellow:​debug"​ 
 +SYSLEDPATH_4_0_IFEMTO="/​sys/​class/​leds/​led1:​red:​power"​ 
 +SYSLEDPATH="/​sys/​class/​leds/​status"​ 
 +LED_PATH="/​do/​not/​exist"​ 
 + 
 +# Script arguments 
 +LEDS_MANAGEMENT=true 
 +EXEC_COMMANDS=true 
 + 
 +
 +# Print the version of the script 
 +
 +show_version() { 
 + echo "​Script version: ${SCRIPT_VERSION}"​ 
 +
 + 
 + 
 +
 +# Show help 
 +
 +show_help() 
 +
 + show_version 
 + echo -e "​Usage:​ $0 [-h|--help] [-l|--ignore-leds] [-o|--output-dir <​directory>​] 
 +\t-h|--help:​ this help 
 +\t-v|--version:​ version of the script 
 +\t-l|--ignore-leds:​ this script does not manage the leds (default: autodetection) 
 +\t-o|--output-dir <​directory>:​ force the output <​directory>​ to use for extraction (default: current directory) 
 +\t-c|--disable-commands:​ disable diagnosis commands (default: executed) 
 +
 +
 + 
 +
 +# Compare 2 versions to know if inferior or superior 
 +# Res: 0: $1 = $2 
 +#      1: $1 > $2 
 +#      2: $1 < $2 
 +
 +compare_versions () { 
 + if [[ $1 == $2 ]] 
 + then 
 + return 0 
 + fi 
 + local IFS=. 
 + local i ver1=($1) ver2=($2) 
 + # fill empty fields in ver1 with zeros 
 + for ((i=${#​ver1[@]};​ i<​${#​ver2[@]};​ i++)) 
 + do 
 + ver1[i]=0 
 + done 
 + for ((i=0; i<​${#​ver1[@]};​ i++)) 
 + do 
 + if [[ -z ${ver2[i]} ]] 
 + then 
 + # fill empty fields in ver2 with zeros 
 + ver2[i]=0 
 + fi 
 + if ((10#​${ver1[i]} > 10#​${ver2[i]})) 
 + then 
 + return 1 
 + fi 
 + if ((10#​${ver1[i]} < 10#​${ver2[i]})) 
 + then 
 + return 2 
 + fi 
 + done 
 + return 0 
 +
 + 
 + 
 +
 +# Copy a file or directory if exists 
 +# Arguments:​ 
 +#            $1: file/​directory to copy 
 +#            $2: destination directory (create if necessary) 
 +
 +copy_if_exists(){ 
 + local from="​$1"​ 
 + local to="​$2"​ 
 + 
 + if [ -e "​${from}"​ ] ; then 
 + [ ! -d "​${to}"​ ] && mkdir -p "​${to}"​ 
 + cp -a "​${from}"​ "​${to}"​ 
 + fi 
 +
 + 
 + 
 +
 +# Check KerOS/SPN version and stop if: 
 +#  - KerOS < 4.0 
 +#  - SPN < 2.1 
 +
 +check_fw_version(){
  # check if /​etc/​version exists  # check if /​etc/​version exists
  if [ -a /​etc/​version ]; then  if [ -a /​etc/​version ]; then
-     ​FW_VERSION=$(cat /​etc/​version)+ FW_VERSION=$(cat /​etc/​version)
  
-     ​# Check if the firmware ​version is superior or equal to 4If not, stop the script+ # Detect type of firmware: KerOS or SPN 
-     ​if [ $(cut -c 1 <<< ​$FW_VERSION) ​-lt 4 ]; then + if [[ "​${FW_VERSION}"​ == *-spn-* ]]; then 
-         ​echo "Your firmware version ($FW_VERSION) is inferior to v4. Please use the adequate script."​ + # Check if SPN version is not inferior ​to 2.1, stop if it is the case 
-         ​exit + compare_versions ${FW_VERSION:​0:​3} "2.1" 
-     ​fi+ if [ $-eq 2 ]; then 
 + echo "Your SPN firmware version ($FW_VERSION) ​is inferior to v2.1. Please use the adequate script."​ >> ${OUTPUT_DIR}/​WRONG_FIRMWARE_VERSION.txt 
 + exit 
 + fi 
 + else 
 + # Check if KerOS version is not inferior to 4.0, stop if it is the case 
 + compare_versions ${FW_VERSION:​0:​3} "​4.0"​ 
 + if [ $? -eq 2 ]; then 
 + echo "​Your ​KerOS firmware version ($FW_VERSION) is inferior to v4. Please use the adequate script." ​>> ${OUTPUT_DIR}/​WRONG_FIRMWARE_VERSION.txt 
 + exit 
 + fi 
 + fi
  else  else
-     ​echo "could not find /​etc/​version"​ + echo "Could not find /​etc/​version" ​>> ${OUTPUT_DIR}/​WRONG_FIRMWARE_VERSION.txt 
-     ​exit+ exit
  fi  fi
 } }
 +
  
 # #
 # Check platform we are running on # Check platform we are running on
 # #
-get_platform() { +detect_platform() { 
- platform="​$(fslotpreg getplatform)"​+ PLATFORM="​$(fslotpreg getplatform)"​
  if [ $? -ne 0 ];  if [ $? -ne 0 ];
  then  then
- platform="​NOT_SUPPORTED"​+ PLATFORM="​NOT_SUPPORTED"​
  fi  fi
- echo ${platform}+ echo "​Platform detected: ​${PLATFORM}"
 } }
  
  
-get_logs() +
-+# Get product serial number information:​ SERIAL and SHORT_MAC 
- NAME="Logs_${serial}_${shortmac}_$(date "+%Y-%m-%d_%H-%M-%S")" +
- tmpdir="/tmp/${NAME}"+fill_serials() { 
 + local reg=$(fslotpreg read GP1) 
 + if [ $? -eq 0 ]; then 
 + SERIAL=$(printf ​"%X\n" ​$reg
 + else 
 + SERIAL="unknown"​ 
 + fi 
 + SHORT_MAC=$(cat ​/sys/class/​net/​eth0/​address | awk -F: '{print $5$6}'​) 
 +}
  
- mkdir -p ${tmpdir}/ 
  
- get logs +
- mkdir -${tmpdir}/var/log +# Detect the type of environment where the script is launched. 
- cp -a /var/log/* ${tmpdir}/var/log/+# Possible environments:​ 
 +#   - udev 
 +#   - shell 
 +
 +detect_env() { 
 + # Detection is only based on the presence or not of the variable DEVNAME 
 + if [ ! -${DEVNAME] ; then 
 + SCRIPT_ENV=udev 
 + exec > /dev/console 2>&1 # Output the script execution in debug console 
 + else 
 + SCRIPT_ENV=shell 
 + LEDS_MANAGEMENT=false 
 + OUTPUT_DIR=$(pwd) 
 + fi 
 + echo "​Script environment: ​${SCRIPT_ENV}"​ 
 +}
  
- get tmp files  + 
- mkdir -${tmpdir}/tmp +
- cp -a /​tmp/​sys_startup_status.json ​${tmpdir}/tmp/ +# Detect type of leds depending of platform/​firmware version 
- if [ ${platform== "IBTS" ]; then +
- cp -a /​tmp/​calib_loraloc.json ​${tmpdir}/tmp/ +detect_leds() { 
- elif [ ${platform== "​IFEMTO" ]; then + if [ -e "${SYSLEDPATH}" ]; then 
- cp -a /​tmp/​calib_rf.json ​${tmpdir}/tmp/+ LED_PATH="​${SYSLEDPATH}" 
 + elif -e "${SYSLEDPATH_4_0_IBTS}" ]; then 
 + LED_PATH="​${SYSLEDPATH_4_0_IBTS}" 
 + elif [ -e "${SYSLEDPATH_4_0_IFEMTO}" ]; then 
 + LED_PATH="​${SYSLEDPATH_4_0_IFEMTO}"
  fi  fi
 +}
  
- # get network config 
- mkdir -p ${tmpdir}/​etc/​network 
- mkdir -p ${tmpdir}/​etc/​firewall.d 
- cp -a /​etc/​network/​* ${tmpdir}/​etc/​network/​ 
- cp -a /​etc/​firewall.d/​* ${tmpdir}/​etc/​firewall.d/​ 
  
- CPF config +
- mkdir -p ${tmpdir}/​etc/​default +# Set default ​led behavior 
- mkdir -p ${tmpdir}/​user/​etc/​lorad +$1: trigger 
- mkdir -p ${tmpdir}/​user/​etc/​lorafwd +
- cp -a /​etc/​default/​lorad ${tmpdir}/​etc/​default/​ +#    if trigger = timer : $2 = delay_on, $3 = delay_off 
- cp -a /​etc/​default/​lorafwd ​${tmpdir}/​etc/​default/​ +
- cp -a /​user/​etc/​lorad/​* ​${tmpdir}/​user/​etc/​lorad/​ +set_led() ​
- cp -a /​user/​etc/​lorafwd/​* ​${tmpdir}/​user/​etc/​lorafwd/​+ trigger="​${1}" 
 + on="$2" 
 + off="$3"
  
- # miscaellenous config + if [ -e "${LED_PATH}" ]; then 
- mkdir ​-${tmpdir}/etc/rcU.d + echo $trigger > "​${LED_PATH}/trigger"​ 
- cp -a /etc/​rcU.d/​* ​${tmpdir}/etc/rcU.d + case "​$trigger"​ in 
- cp -a /user/​.update ​${tmpdir}/user/​.update ​+ "​timer"​) 
 + echo ${on:=500} > "${LED_PATH}/delay_on"​ 
 + echo ${off:=500} > "​${LED_PATH}/delay_off"​ 
 + ;; 
 + "​none"​) 
 + echo ​${on:=0} > "​${LED_PATH}/brightness"​ 
 + ;; 
 + *) 
 + # Nothing to do 
 + ;; 
 + esac 
 + fi 
 +}
  
- (+get_nmea_frames() { 
 + gps_tty="​$1"​ 
 + 
 + if ! [ -e "​$gps_tty"​ ]; then 
 + echo "​$gps_tty doesn'​t exist"​ 
 + return 1 
 + fi 
 + 
 + if [ -n "$(lsof | grep $(readlink $gps_tty))"​ ]; then 
 + echo "​$gps_tty already used by $(lsof | grep $(readlink $gps_tty))"​ 
 + return 2 
 + else 
 + # Pseudo-term keep only FIRST frames so we keep last of these old frames and get few new frames 
 + # It will take 3 seconds 
 + timeout -t 3 cat $gps_tty > /​tmp/​nmea.log 
 + cat /​tmp/​nmea.log 
 + fi 
 +
 + 
 +
 +# Execute some diagnosis commands (can take a long time) 
 +
 +execute_commands() { 
 + echo "​Executing diagnosis commands (can take a long time)"​ 
 + 
 + echo -e "​\tSystems commands"​ 
 +
 + echo -e "​\n\n\n************** ​ fslotpreg getplatform ​ *****************"​ 
 + fslotpreg getplatform 
 + echo -e "​\n\n\n************** ​ fslotpreg fslotpreg read GP1  *****************"​ 
 + fslotpreg read GP1
  echo -e "​\n\n\n************** ​ date  *****************"​  echo -e "​\n\n\n************** ​ date  *****************"​
  date  date
  echo -e "​\n\n\n************** ​ uptime ​ *****************"​  echo -e "​\n\n\n************** ​ uptime ​ *****************"​
  uptime  uptime
- echo -e "​\n\n\n************** ​ cat /​etc/​version ​ *****************"​ + echo -e "​\n\n\n************** ​ ps ww *****************"​ 
- cat /​etc/​version + ps ww 
- echo -e "​\n\n\n************** ​ ps w  ​*****************"​ + echo -e "​\n\n\n************** ​ opkg status ​ ​*****************"​ 
- ps w + opkg ​status 
- echo -e "​\n\n\n************** ​ opkg list-installed ​ ​*****************"​ + echo -e "​\n\n\n************** ​ monit status ​ *****************"​ 
- opkg ​list-installed + monit status 
- echo -e "​\n\n\n************** ​ opkg list  *****************"​ + echo -e "​\n\n\n************** ​ mount  *****************"​ 
- opkg list  + mount
- echo -e "​\n\n\n************** ​ monit status ​ *****************"​ +
-   monit status +
-   echo -e "​\n\n\n************** ​ mount  *****************"​ +
-   mount+
  ) >> ${tmpdir}/​cmd_results.txt  ) >> ${tmpdir}/​cmd_results.txt
  
 + echo -e "​\tNetwork commands"​
  (  (
  echo -e "​\n\n\n************** ​ ifconfig -a  *****************"​  echo -e "​\n\n\n************** ​ ifconfig -a  *****************"​
Line 189: Line 387:
  gsmdiag.py ; cat /​tmp/​gsmdiag.txt  gsmdiag.py ; cat /​tmp/​gsmdiag.txt
  echo -e "​\n\n\n************** ​ route  *****************"​  echo -e "​\n\n\n************** ​ route  *****************"​
- route+ route ​-n
  echo -e "​\n\n\n************** ​ iptables -L  *****************"​  echo -e "​\n\n\n************** ​ iptables -L  *****************"​
  iptables -L  iptables -L
Line 197: Line 395:
  connmanctl services  connmanctl services
  
- if [ ${platform} == "​IBTS" ​]; then+ if [ -e /​dev/​cdc-wdm1 ​]; then
  echo -e "​\n\n\n************** ​ qmicli get mode  *****************"​  echo -e "​\n\n\n************** ​ qmicli get mode  *****************"​
  qmicli -d /​dev/​cdc-wdm1 --nas-get-system-selection-preference  qmicli -d /​dev/​cdc-wdm1 --nas-get-system-selection-preference
  fi  fi
  ) >> ${tmpdir}/​network_result.txt  ) >> ${tmpdir}/​network_result.txt
-  + 
-    get the 25 last NMEA frames; ​it will take 10s + 25s + get_nmea_frames /dev/nmea3 > ${tmpdir}/​nmea.log 
- if [ ${platform} ​== "IBTS" ​]; then + [ $? -ne 0 ] && get_nmea_frames /dev/nmea2 >> ${tmpdir}/​nmea.log 
-  + 
-       if [ -n "$(lsof | grep $(readlink ​/dev/nmea2))" ]; then + # Overlay modifications 
-       ​echo " /dev/nmea2 already used by $(lsof | grep $(readlink ​/dev/nmea2))" ​${tmpdir}/nmea2.log; ​ + echo -e "​\tOverlay commands"​ 
-  + overlay diff -l /.rootfs.ro -u /​user/​.rootfs_upper/​ >> ${tmpdir}/​overlay_status.txt << EOF 
-       else +yes 
-       timeout ​-t 10 cat /dev/nmea2 > /dev/null +EOF 
-       timeout ​-t 40 head -n 50 /dev/nmea2 > ${tmpdir}/nmea2.log + 
-              fi+ echo "End of diagnosis commands"​ 
 +
 + 
 + 
 +
 +Get all the logs, configuration files and commands and save it 
 +# in the resquested output directory. 
 +# Arguments:​ 
 +#            ​$1: output directory 
 +
 +get_logs() 
 +{ 
 + local output_dir="​$1"​ 
 + local name="Logs_${SERIAL}_${SHORT_MAC}_$(date "​+%Y%m%d-%H%M%S"​)
 + local tmpdir="/​user/​${name}"​ 
 + 
 + # tmp files 
 + echo "Extracting tmp files"​ 
 + copy_if_exists /​tmp/​sys_startup_status.json ​${tmpdir}/​tmp/​ 
 + copy_if_exists /​tmp/​board_info.json ​${tmpdir}/tmp/ 
 + copy_if_exists /​tmp/​calib_loraloc.json ${tmpdir}/​tmp/​ 
 + copy_if_exists /​tmp/​calib_rf.json ${tmpdir}/​tmp/​ 
 + 
 + # network configuration 
 + echo "​Extracting network configuration"​ 
 + copy_if_exists /​etc/​network/​ ${tmpdir}/​etc/​ 
 + copy_if_exists /​etc/​firewall.d/​ ${tmpdir}/​etc/​ 
 + 
 + # CPF (lorad + lorafwdconfiguration 
 + echo "​Extracting CPF configuration (if any)" 
 + for lorad_dir in /​user/​etc/​lorad /​etc/​lorad 
 + do 
 + if [ -d ${lorad_dir} ​] ; then 
 + echo -e "\tExtracting lorad configuration"​ 
 + copy_if_exists ​/etc/default/​lorad ​${tmpdir}/​etc/​default/​ 
 + copy_if_exists ​${lorad_dir} ${tmpdir}${lorad_dir%/*} 
 + fi 
 + done 
 + for lorafwd_dir in /user/​etc/​lorafwd /​etc/​lorafwd 
 + do 
 + if [ -d ${lorafwd_dir} ] ; then 
 + echo -e "\tExtracting lorafwd configuration"​ 
 + copy_if_exists /​etc/​default/​lorafwd ​${tmpdir}/etc/​default/​ 
 + copy_if_exists ${lorafwd_dir} ${tmpdir}${lorafwd_dir%/​*} 
 + fi 
 + done 
 + 
 + # WMC configuration and logs 
 + echo "​Extracting WMC configuration and logs (if any)"​ 
 + if [ -/user/bscc ] ; then 
 + echo -e "​\tExtracting BSCC configuration and logs"​ 
 + copy_if_exists ​/user/​bscc/​var.xml ${tmpdir}/​user/​bscc
 + copy_if_exists /​user/​bscc/​traces/​ ${tmpdir}/​user/​bscc/​ 
 + fi 
 + if [ -d /user/snmp ] ; then 
 + echo ​-e "​\tExtracting SNMP configuration and logs"​ 
 + copy_if_exists ​/user/snmp/​snmpd.conf ​${tmpdir}/user/snmp/ 
 + copy_if_exists /​user/​snmp/​traces/​ ${tmpdir}/​user/​snmp/​
  fi  fi
  
-create an archive with all the files and command results +miscellaneous configuration ​and logs 
-the archive is created on the USB key + echo "​Extracting miscellaneous configuration and logs"​ 
- tar -C /tmp -czf ${NAME}.tar.gz ${NAME+ copy_if_exists /etc/rcU.d/ ${tmpdir}/​etc/​ 
- echo "Archive ${NAME}.tar.gz created"+ copy_if_exists /​.update/​update.log ${tmpdir}/​ 
 + copy_if_exists /​user/​.update ${tmpdir}/​user/​ 
 + copy_if_exists /​user/​.upgrade.log ${tmpdir}/​user/​ 
 + copy_if_exists /​user/​.sysupgrade.log ${tmpdir}/​user/​ 
 + copy_if_exists /​etc/​version ${tmpdir}/​etc/​ 
 + copy_if_exists /​etc/​sysupgrade.conf ${tmpdir}/​etc/​ 
 + copy_if_exists /​etc/​sysupgrade.d/​ ${tmpdir}/​etc/​ 
 + copy_if_exists /​etc/​.squash_layer_version ${tmpdir}/​etc/​ 
 + echo ${SCRIPT_VERSION} > ${tmpdir}/​script_version 
 + 
 + if ${EXEC_COMMANDS} ; then 
 + execute_commands 
 + fi 
 + 
 +Finish by system logs to prevent space errors 
 + echo "​Extracting system logs"​ 
 + copy_if_exists /var/log/ ${tmpdir}/​var/​ 
 + 
 + echo "​Saving all data in ${output_dir}/​${name}.tar.gz"​ 
 + tar -C /user -czf ${output_dir}/​${name}.tar.gz ${name
 + echo "Done"
  sync  sync
  
Line 229: Line 504:
 #####################​ #####################​
  
-check_version+# Detect the environment of execution of the script 
 +detect_env
  
-platform=$(get_platform)+# Manage scripts arguments 
 +while [[ $# -gt 0 ]] 
 +do 
 +key="$1"
  
-reg=$(fslotpreg read GP1) + case $key in 
-if [ $? -eq 0 ]then + -l|--ignore-leds) 
- serial=$(printf "%X\n" $reg) + LEDS_MANAGEMENT=false 
-else + shift 
- serial="​unknown"​+ ;
 + -o|--output-dir) 
 + OUTPUT_DIR="$2" 
 + shift 2 
 + ;; 
 + -c|--disable-commands) 
 + EXEC_COMMANDS=false 
 + shift 
 + ;; 
 + -h|--help) 
 + show_help 
 + shift 
 + exit 1 
 + ;; 
 + -v|--version) 
 + show_version 
 + shift 
 + exit 1 
 + ;; 
 + *) 
 + shift 
 + ;; 
 + esac 
 +done 
 + 
 +# Check if firmware version is compatible 
 +check_fw_version 
 + 
 +# Detect type of platform 
 +detect_platform 
 + 
 +# Fill SERIAL and SHORT_MAC variables 
 +fill_serials 
 + 
 +# Set led On 
 +if ${LEDS_MANAGEMENT} ; then 
 + detect_leds 
 + set_led none 1
 fi fi
-shortmac=$(cat /​sys/​class/​net/​eth0/​address | awk -F: '​{print $5$6}'​) 
  
 # Get logs # Get logs
-get_logs ​+get_logs ​${OUTPUT_DIR} 
 + 
 +# End of script, manage user's notifications 
 +if ${LEDS_MANAGEMENT} ; then 
 + # Prepare reboot after USB unplug 
 + cat > /​tmp/​usbkey_remove << EOF 
 +# Switch off Led 
 +echo "​none"​ > ${LED_PATH}/​trigger 
 +EOF 
 + 
 + # All is right, make Led blinking fast to notify User 
 + set_led timer 100 100 
 +fi
 </​code>​ </​code>​
 +
 +
  
 ++++ ++++
Line 250: Line 579:
  
 To gather logs from a USB without typing any command: To gather logs from a USB without typing any command:
-  * Download the following script and copy it on a USB key+  * Download the following script and copy it on a USB flash drive
-  * Create a ''​usbkey.txt''​ file on the USB key as described [[wiki:​sw_updates#​specific_files|here]]. +  * Create a ''​usbkey.txt''​ file on the USB flash drive as described [[wiki:​keros_custo:​sw_updates#​specific_files|here]]. 
-  * Plug the USB key on the CPU board.+  * Plug the USB flash drive into the USB port of the gateway.
   * Wait for the yellow debug led fast blinking. //The execution of the script takes about 1-2 minutes.//   * Wait for the yellow debug led fast blinking. //The execution of the script takes about 1-2 minutes.//
-  * Unplug the USB key+  * Unplug the USB flash drive
-  * An archive with all the required logs has been created on the USB key.+  * An archive with all the required logs has been created on the USB flash drive. 
  
 <code bash usb.autorun>​ <code bash usb.autorun>​
 #!/bin/sh #!/bin/sh
  
-USBDIR="​`dirname $0`"+# Version of the script 
 +SCRIPT_VERSION=1.4
  
-SYSLEDPATH_IBTS="/​sys/​class/​leds/​yellow:​debug/"​ +# Output directory for the result of the script 
-SYSLEDPATH_IFEMTO="/​sys/​class/​leds/​led1:​red:​power/​"+OUTPUT_DIR="`dirname $0`"
  
 +# Execution'​s environment of the script
 +SCRIPT_ENV=unknown
  
-check_version(){ +# PLATFORM: IBTS, IFEMTO, ISTATION, IFEVO 
-check if /​etc/​version exists +PLATFORM=unknown 
- if [ -a /​etc/​version ]; then +Serial number of the product: 39020003 
-     FW_VERSION=$(cat /​etc/​version)+SERIAL=unknown 
 +# ETH0 MAC: 70:​76:​ff:​01:​77:​71 => 7771 
 +SHORT_MAC=unknown
  
-     ​Check if the firmware ​version ​is superior or equal to 4. If not, stop the script+LED paths 
-     ​if [ $(cut -c 1 <<< ​$FW_VERSION) ​-lt 4 ]; then +SYSLEDPATH_4_0_IBTS="/​sys/​class/​leds/​yellow:​debug"​ 
-         ​echo "Your firmware version ($FW_VERSION) is inferior to v4. Please use the adequate script."​ >> ${USBDIR}/​WRONG_FIRMWARE_VERSION.txt +SYSLEDPATH_4_0_IFEMTO="/​sys/​class/​leds/​led1:​red:​power"​ 
-         ​exit +SYSLEDPATH="/​sys/​class/​leds/​status"​ 
-     ​fi +LED_PATH="/​do/​not/​exist"​ 
- else + 
-     ​echo "Could not find /​etc/​version"​ >> ${USBDIR}/​WRONG_FIRMWARE_VERSION.txt +# Script arguments 
-     ​exit +LEDS_MANAGEMENT=true 
- fi+EXEC_COMMANDS=true 
 + 
 +
 +# Print the version ​of the script 
 +
 +show_version() { 
 +        echo "​Script version: ${SCRIPT_VERSION}"​ 
 +
 + 
 + 
 +
 +# Show help 
 +
 +show_help() 
 +
 +        show_version 
 +        echo -e "​Usage:​ $0 [-h|--help] [-l|--ignore-leds] [-o|--output-dir <​directory>​] 
 +\t-h|--help:​ this help 
 +\t-v|--version:​ version of the script 
 +\t-l|--ignore-leds:​ this script does not manage the leds (default: autodetection) 
 +\t-o|--output-dir <​directory>:​ force the output <​directory>​ to use for extraction (default: current directory) 
 +\t-c|--disable-commands:​ disable diagnosis commands (default: executed) 
 +\t-m|--minimal:​ get minimal logs (to lower generated file size) 
 +
 +
 + 
 +
 +# Compare 2 versions to know if inferior or superior 
 +# Res: 0: $1 = $2 
 +#      1: $1 > $2 
 +#      2: $1 < $2 
 +
 +compare_versions () { 
 +        if [[ $1 == $2 ]] 
 +        then 
 +                return 0 
 +        fi 
 +        local IFS=. 
 +        local i ver1=($1) ver2=($2) 
 +        # fill empty fields in ver1 with zeros 
 +        for ((i=${#​ver1[@]};​ i<​${#​ver2[@]};​ i++)); do 
 +                ver1[i]=0 
 +        done 
 +        for ((i=0; i<​${#​ver1[@]};​ i++)); do 
 +                if [[ -z ${ver2[i]} ]] 
 +                then 
 +                        # fill empty fields in ver2 with zeros 
 +                        ver2[i]=0 
 +                fi 
 +                if ((10#​${ver1[i]} > 10#​${ver2[i]})) 
 +                then 
 +                        return 1 
 +                fi 
 +                if ((10#​${ver1[i]} < 10#​${ver2[i]})) 
 +                then 
 +                        return 2 
 +                fi 
 +        done 
 +        return 0 
 +
 + 
 + 
 +
 +# Copy a file or directory if exists 
 +# Arguments:​ 
 +#            $1: file/​directory ​to copy 
 +#            $2: destination directory (create if necessary) 
 +
 +copy_if_exists(){ 
 +        local from="​$1"​ 
 +        local to="​$2"​ 
 + 
 +        if [ -e "​${from}"​ ] ; then 
 +                [ ! -d "​${to}"​ ] && mkdir -p "​${to}"​ 
 +                cp -a "​${from}"​ "​${to}"​ 
 +        fi 
 +
 + 
 + 
 +
 +# Check KerOS/SPN version and stop if: 
 +#  - KerOS < 4.
 +#  - SPN < 2.1 
 +
 +check_fw_version(){ 
 +        # check if /​etc/​version exists 
 +        if [ -a /​etc/​version ]; then 
 +                FW_VERSION=$(cat /​etc/​version) 
 + 
 +                # Detect type of firmware: KerOS or SPN 
 +                if [[ "​${FW_VERSION}"​ == *-spn-* ]]; then 
 +                        # Check if SPN version is not inferior to 2.1, stop if it is the case 
 +                        compare_versions ${FW_VERSION:​0:​3} "2.1" 
 +                        if [ $-eq 2 ]; then 
 +                                echo "Your SPN firmware version ($FW_VERSION) ​is inferior to v2.1. Please use the adequate script."​ >> ${OUTPUT_DIR}/​WRONG_FIRMWARE_VERSION.txt 
 +                                exit 
 +                        fi 
 +                else 
 +                        # Check if KerOS version is not inferior to 4.0, stop if it is the case 
 +                        compare_versions ${FW_VERSION:​0:​3} "​4.0"​ 
 +                        if [ $? -eq 2 ]; then 
 +                                echo "​Your ​KerOS firmware version ($FW_VERSION) is inferior to v4. Please use the adequate script."​ >> ${OUTPUT_DIR}/​WRONG_FIRMWARE_VERSION.txt 
 +                                exit 
 +                        fi 
 +                ​fi 
 +        else 
 +                echo "Could not find /​etc/​version"​ >> ${OUTPUT_DIR}/​WRONG_FIRMWARE_VERSION.txt 
 +                exit 
 +        fi
 } }
  
Line 286: Line 729:
 # Check platform we are running on # Check platform we are running on
 # #
-get_platform() { +detect_platform() { 
- platform="​$(fslotpreg getplatform)"​ +        ​PLATFORM="​$(fslotpreg getplatform)"​ 
- if [ $? -ne 0 ]; +        if [ $? -ne 0 ]; 
- then +        then 
- platform="​NOT_SUPPORTED"​ +                ​PLATFORM="​NOT_SUPPORTED"​ 
- fi +        fi 
- echo ${platform}+        echo "​Platform detected: ​${PLATFORM}"​ 
 +
 + 
 + 
 +
 +# Get product serial number information:​ SERIAL and SHORT_MAC 
 +
 +fill_serials() { 
 +        local reg=$(fslotpreg read GP1) 
 +        if [ $? -eq 0 ]; then 
 +                SERIAL=$(printf "​%X\n"​ $reg) 
 +        else 
 +                SERIAL="​unknown"​ 
 +        fi 
 +        if [ -f "/​sys/​class/​net/​eth0/​address"​ ]; then 
 +                SHORT_MAC=$(cat /​sys/​class/​net/​eth0/​address | awk -F: '​{print $5$6}'​) 
 +        elif [ -f "/​sys/​class/​net/​usb0/​address"​ ]; then 
 +                SHORT_MAC=$(cat /​sys/​class/​net/​usb0/​address | awk -F: '​{print $5$6}'​) 
 +        else 
 +                SHORT_MAC="​XXXX"​ 
 +        fi 
 +
 + 
 + 
 +
 +# Detect the type of environment where the script is launched. 
 +# Possible environments:​ 
 +#   - udev 
 +#   - shell 
 +
 +detect_env() { 
 +        # Detection is only based on the presence or not of the variable DEVNAME 
 +        if [ ! -z ${DEVNAME} ] ; then 
 +                SCRIPT_ENV=udev 
 +                exec > /​dev/​console 2>&1 # Output the script execution in debug console 
 +        else 
 +                SCRIPT_ENV=shell 
 +                LEDS_MANAGEMENT=false 
 +                OUTPUT_DIR=$(pwd) 
 +        fi 
 +        echo "​Script environment:​ ${SCRIPT_ENV}"​ 
 +
 + 
 + 
 +
 +# Detect type of leds depending of platform/firmware version 
 +
 +detect_leds() { 
 +        if [ -e "​${SYSLEDPATH}" ]; then 
 +                LED_PATH="​${SYSLEDPATH}"​ 
 +        elif [ -e "​${SYSLEDPATH_4_0_IBTS}"​ ]; then 
 +                LED_PATH="​${SYSLEDPATH_4_0_IBTS}"​ 
 +        elif [ -e "​${SYSLEDPATH_4_0_IFEMTO}"​ ]; then 
 +                LED_PATH="​${SYSLEDPATH_4_0_IFEMTO}"​ 
 +        fi
 } }
  
Line 303: Line 800:
 # #
 set_led() { set_led() {
- trigger="​${1}"​ +        ​trigger="​${1}"​ 
- on="​$2"​ +        on="​$2"​ 
- off="​$3"​+        off="​$3"​
  
- if [ -"${SYSLEDPATH}" ]; then +        ​if [ -"${LED_PATH}" ]; then 
- echo $trigger > "${SYSLEDPATH}/​trigger"​ +                echo $trigger > "${LED_PATH}/​trigger"​ 
- case "​$trigger"​ in +                case "​$trigger"​ in 
- "​timer"​) +                        "​timer"​) 
- echo ${on:=500} > "${SYSLEDPATH}/​delay_on"​ +                                echo ${on:=500} > "${LED_PATH}/​delay_on"​ 
- echo ${off:=500} > "${SYSLEDPATH}/​delay_off"​ +                                echo ${off:=500} > "${LED_PATH}/​delay_off"​ 
- ;; +                                ;; 
- "​none"​) +                        "​none"​) 
- echo ${on:=0} > "${SYSLEDPATH}/​brightness"​ +                                echo ${on:=0} > "${LED_PATH}/​brightness"​ 
- ;; +                                ;; 
- *) +                        *) 
- # Nothing to do +                                # Nothing to do 
- ;; +                                ;; 
- esac +                esac 
- fi+        fi
 } }
  
 +get_nmea_frames() {
 +        gps_tty="​$1"​
  
 +        if ! [ -e "​$gps_tty"​ ]; then
 +                echo "​$gps_tty doesn'​t exist"
 +                return 1
 +        fi
 +
 +        if [ -n "​$(lsof | grep $(readlink $gps_tty))"​ ]; then
 +                echo "​$gps_tty already used by $(lsof | grep $(readlink $gps_tty))"​
 +                return 2
 +        else
 +                # Pseudo-term keep only FIRST frames so we keep last of these old frames and get few new frames
 +                # It will take 3 seconds
 +                timeout -t 3 cat $gps_tty > /​tmp/​nmea.log
 +                cat /​tmp/​nmea.log
 +        fi
 +}
 +
 +#
 +# Execute some diagnosis commands (can take a long time)
 +#
 +execute_commands() {
 +        echo "​Executing diagnosis commands (can take a long time)"
 +
 +        echo -e "​\tSystems commands"​
 +                (
 +                echo -e "​\n\n\n************** ​ fslotpreg getplatform ​ *****************"​
 +                fslotpreg getplatform
 +                echo -e "​\n\n\n************** ​ fslotpreg fslotpreg read GP1  *****************"​
 +                fslotpreg read GP1
 +                echo -e "​\n\n\n************** ​ date  *****************"​
 +                date
 +                echo -e "​\n\n\n************** ​ uptime ​ *****************"​
 +                uptime
 +                echo -e "​\n\n\n************** ​ ps ww *****************"​
 +                ps ww
 +                echo -e "​\n\n\n************** ​ opkg status ​ *****************"​
 +                opkg status
 +                echo -e "​\n\n\n************** ​ monit status ​ *****************"​
 +                monit status
 +                echo -e "​\n\n\n************** ​ mount  *****************"​
 +                mount
 +                echo -e "​\n\n\n************** ​ OpenVPN Certificate expiration date  *****************"​
 +                compare_versions ${FW_VERSION:​0:​3} "​5.0"​
 +                ret=$?
 +                if [ $ret -eq 1 ]; then
 +                        if [ -f "/​etc/​openvpn/​bscc.p12"​ ]; then
 +                                openssl pkcs12 -info -in /​etc/​openvpn/​bscc.p12 -nokeys -password file:/​etc/​openvpn/​bscc.password| openssl x509 -noout -enddate
 +                        fi
 +                elif [ $ret -eq 2 ]; then
 +                        grep -iA3 "​Validity"​ /​.update/​update.log | tail -3 | grep -i "not after" | sed 's/^[ \t]*//'​
 +                fi
 +                echo -e "​\n\n\n************** ​ Disk info (df -h)  *****************"​
 +                df -h
 +                echo -e "​\n\n\n************** ​ Log Size (du -sh /​var/​log) ​ *****************"​
 +                du -sh /var/log
 +        ) >> ${tmpdir}/​cmd_results.txt
 +
 +        echo -e "​\tNetwork commands"​
 +        (
 +                echo -e "​\n\n\n************** ​ ifconfig -a  *****************"​
 +                ifconfig -a
 +                echo -e "​\n\n\n************** ​ gsmdiag.py ​ *****************"​
 +                gsmdiag.py ; cat /​tmp/​gsmdiag.txt
 +                echo -e "​\n\n\n************** ​ route  *****************"​
 +                route -n
 +                echo -e "​\n\n\n************** ​ iptables -L  *****************"​
 +                iptables -L
 +                echo -e "​\n\n\n************** ​ connmanctl technologies ​ *****************"​
 +                connmanctl technologies
 +                echo -e "​\n\n\n************** ​ services ​ *****************"​
 +                connmanctl services
 +
 +                if [ -e /​dev/​cdc-wdm1 ]; then
 +                        echo -e "​\n\n\n************** ​ qmicli get mode  *****************"​
 +                        qmicli -d /​dev/​cdc-wdm1 --nas-get-system-selection-preference
 +                fi
 +        ) >> ${tmpdir}/​network_result.txt
 +
 +        get_nmea_frames /dev/nmea3 > ${tmpdir}/​nmea.log
 +        [ $? -ne 0 ] && get_nmea_frames /dev/nmea2 >> ${tmpdir}/​nmea.log
 +
 +        # Overlay modifications
 +        echo -e "​\tOverlay commands disabled (KEROS-1907)"​
 +#       ​overlay diff -l /.rootfs.ro -u /​user/​.rootfs_upper/​ >> ${tmpdir}/​overlay_status.txt << EOF
 +#yes
 +#EOF
 +
 +        echo "End of diagnosis commands"​
 +}
 +
 +
 +#
 +# Get all the logs, configuration files and commands and save it
 +# in the resquested output directory.
 +# Arguments:
 +#            $1: output directory
 +#
 get_logs() get_logs()
 { {
- NAME="​Logs_${serial}_${shortmac}_$(date "+%Y-%m-%d_%H-%M-%S"​)"​ +        local output_dir="​$1"​ 
- tmpdir="/​tmp/${NAME}"+        local option="​$2"​ 
 +        local name="​Logs_${SERIAL}_${SHORT_MAC}_$(date "+%Y%m%d-%H%M%S"​)"​ 
 +        if [ "​${option}"​ = "​minimal"​ ]; then 
 +                name="​${name}_minimal"​ 
 +        fi 
 +        local tmpdir="/​user/${name}"
  
- mkdir -p ${tmpdir}/+        # tmp files 
 +        echo "​Extracting tmp files"​ 
 +        copy_if_exists /​tmp/​sys_startup_status.json ​${tmpdir}/tmp/ 
 +        copy_if_exists /​tmp/​board_info.json ${tmpdir}/​tmp/​ 
 +        copy_if_exists /​tmp/​calib_loraloc.json ${tmpdir}/​tmp/​ 
 +        copy_if_exists /​tmp/​calib_rf.json ${tmpdir}/​tmp/
  
- get logs +        ​network configuration 
- mkdir -p ${tmpdir}/var/log +        echo "​Extracting network configuration"​ 
- cp -a /var/log/* ${tmpdir}/var/log/+        if [ "​${option}"​ = "​minimal"​ ]; then 
 +                copy_if_exists /​etc/​network/​connman/ ​${tmpdir}/etc/network
 +                ​copy_if_exists /​etc/​network/​ofono/​ ${tmpdir}/​etc/​network/​ 
 +                copy_if_exists /​etc/​network/​openvpn/​ ${tmpdir}/​etc/​network/​ 
 +                ​cp /etc/network/*.conf ${tmpdir}/etc/​network/​ 
 +        else 
 +                copy_if_exists /​etc/​network/​ ${tmpdir}/​etc/​ 
 +        fi 
 +        copy_if_exists /​etc/​firewall.d/​ ${tmpdir}/etc/
  
- get tmp files  +        ​init configuration 
- mkdir -p ${tmpdir}/​tmp +        if [ "${option}" != "minimal" ]; then 
- cp -a /​tmp/​sys_startup_status.json ${tmpdir}/​tmp/​ +                echo "​Extracting init.d and rc*.d files"​ 
- if [ ${platform== "IBTS" ]; then +                copy_if_exists ​/etc/init.d/ ${tmpdir}/etc
- cp -a /tmp/calib_loraloc.json ${tmpdir}/tmp+                for filename in /etc/rc*.d; do 
- elif [ ${platform} == "​IFEMTO"​ ]; then +                        copy_if_exists ${filename} ​${tmpdir}/etc
- cp -a /tmp/calib_rf.json ${tmpdir}/tmp+                ​done 
- fi+        ​fi
  
- get network config +        ​CPF (lorad + lorafwd) configuration 
- mkdir -p ${tmpdir}/etc/network +        echo "​Extracting CPF configuration (if any)"​ 
- mkdir -p ${tmpdir}/​etc/​firewall.d +        if [ "${option}" = "​minimal"​ ]; then 
- cp -a /etc/network/${tmpdir}/​etc/​network+                copy_if_exists /user/etc/lorad/​lorad.json ​${tmpdir}/user/etc/lorad/ 
- cp -a /etc/firewall.d/* ${tmpdir}/​etc/​firewall.d/+                ​copy_if_exists ​/etc/lorad/lorad.json ​${tmpdir}/​etc/​lorad
 +        ​else 
 +                for lorad_dir in /user/etc/lorad /etc/lorad; do 
 +                        if [ -${lorad_dir} ] ; then 
 +                                echo -e "​\tExtracting lorad configuration"​ 
 +                                copy_if_exists ${lorad_dir} ${tmpdir}${lorad_dir%/*
 +                        fi 
 +                done 
 +        fi 
 +        copy_if_exists /​etc/​default/​lorad ​${tmpdir}/​etc/​default/
  
- # CPF config +        echo -e "​\tExtracting lorafwd configuration"​ 
- mkdir ​-${tmpdir}/etc/default +        if [ "${option}" = "​minimal"​ ]; then 
- mkdir -p ${tmpdir}/user/etc/lorad +                for filename in /etc/lorafwd/​*.toml;​ do 
- mkdir -p ${tmpdir}/​user/​etc/​lorafwd +                        ​copy_if_exists ${filename} ​${tmpdir}/​etc/​lorafwd/ 
- cp -a /etc/default/​lorad ​${tmpdir}/​etc/​default/​ +                ​done 
- cp -a /​etc/​default/​lorafwd ​${tmpdir}/etc/​default/​ +        else 
- cp -a /user/etc/lorad/​* ​${tmpdir}/user/etc/lorad+                for lorafwd_dir in /​user/​etc/​lorafwd /etc/lorafwd; do 
- cp -a /user/​etc/​lorafwd/* ${tmpdir}/user/etc/lorafwd/+                        if [ -d ${lorafwd_dir] ; then 
 +                                ​copy_if_exists ${lorafwd_dir} ​${tmpdir}${lorafwd_dir%/*} 
 +                        fi 
 +                done 
 +        fi 
 +        copy_if_exists ​/etc/lorafwd.toml ​${tmpdir}/​etc/​ 
 +        ​copy_if_exists ​/etc/default/lorafwd ${tmpdir}/​etc/​default/
  
- miscaellenous config +        ​WMC configuration and logs 
- mkdir -${tmpdir}/etc/rcU.d +        echo "​Extracting WMC configuration and logs (if any)"​ 
- cp -a /etc/rcU.d/${tmpdir}/etc/rcU.+        if [ -d /user/bscc ] ; then 
- cp -/user/.update ​${tmpdir}/​user/​.update ​+                echo -e "​\tExtracting BSCC configuration and logs"​ 
 +                copy_if_exists /​user/​bscc/​var.xml ​${tmpdir}/user/bscc
 +                ​copy_if_exists ​/user/bscc/traces/ ${tmpdir}/user/bscc/ 
 +        fi 
 +        if [ -/user/snmp ] ; then 
 +                ​echo ​-e "​\tExtracting SNMP configuration and logs"​ 
 +                copy_if_exists ​/user/snmp/snmpd.conf ${tmpdir}/​user/​snmp/ 
 +                copy_if_exists /​user/​snmp/​traces/​ ${tmpdir}/​user/​snmp/​ 
 +        fi 
 +        copy_if_exists /​etc/​default/​bscc ${tmpdir}/​etc/​default/​ 
 +        copy_if_exists /​etc/​default/​lora-snmp ${tmpdir}/​etc/​default/​ 
 +        copy_if_exists /​etc/​snmp/​snmpd.conf ${tmpdir}/​etc/​snmp/​
  
- ( +        # basic station configuration and logs 
- echo -e "\n\n\n************** ​ date  *****************+        echo "Extracting basic station configuration and logs (if any)
- date +        if [ -d /​user/​basic_station ] ; then 
- echo -e "\n\n\n************** ​ uptime ​ *****************+                echo -e "\tExtracting Basic Station configuration and logs
- uptime +                ​copy_if_exists /​user/​basic_station/etc/ ${tmpdir}/​user/​basic_station/​ 
- echo -e "​\n\n\n************** ​ cat /etc/version ​ *****************"​ +                ​copy_if_exists ​/user/​basic_station/​log/​ ${tmpdir}/​user/​basic_station
- cat /etc/version +        fi 
- echo -e "​\n\n\n************** ​ ps w  *****************"​ +        ​copy_if_exists /​etc/​station/ ​${tmpdir}/etc/
- ps w +
- echo -e "​\n\n\n************** ​ opkg list-installed ​ *****************"​ +
- opkg list-installed +
- echo -e "​\n\n\n************** ​ opkg list  *****************"​ +
- opkg list  +
- echo -e "​\n\n\n************** ​ monit status ​ *****************"​ +
- monit status +
- echo -e "​\n\n\n************** ​ mount  *****************"​ +
- mount +
- ) >> ​${tmpdir}/cmd_results.txt+
  
- ( +        # miscellaneous configuration and logs 
- echo -e "\n\n\n************** ​ ifconfig -a  *****************+        echo "Extracting miscellaneous configuration and logs
- ifconfig -a +        ​copy_if_exists /​etc/​default/​ ${tmpdir}/​etc/​ 
- echo -e "​\n\n\n************** ​ gsmdiag.py  *****************"​ +        ​copy_if_exists /​etc/​openvpn/​ ${tmpdir}/​etc/​ 
- gsmdiag.py ; cat /tmp/gsmdiag.txt +        copy_if_exists /.update/​update.log ${tmpdir}/ 
- echo -e "​\n\n\n************** ​ route  *****************"​ +        ​copy_if_exists /​user/​initrd/​initrd.log ${tmpdir}/user/​initrd 
- route +        copy_if_exists /user/.update ${tmpdir}/​user/​ 
- echo -e "​\n\n\n************** ​ iptables -L  *****************"​ +        ​copy_if_exists /​user/​.upgrade.log ${tmpdir}/​user/​ 
- iptables -L +        ​copy_if_exists /​user/​.sysupgrade.log ${tmpdir}/​user/​ 
- echo -e "​\n\n\n************** ​ connmanctl technologies ​ *****************"​ +        ​copy_if_exists /​etc/​version ${tmpdir}/​etc/​ 
- connmanctl technologies +        ​copy_if_exists /​etc/​sysupgrade.conf ${tmpdir}/​etc/​ 
- echo -e "​\n\n\n************** ​ services ​ *****************"​ +        ​copy_if_exists /​etc/​sysupgrade.d/​ ${tmpdir}/​etc/​ 
- connmanctl services+        ​copy_if_exists /​etc/​.squash_layer_version ${tmpdir}/​etc/​ 
 +        echo ${SCRIPT_VERSION} > ${tmpdir}/​script_version
  
- if ${platform== "​IBTS"​ ]; then +        ​if ${EXEC_COMMANDS} ; then 
- echo -e "​\n\n\n************** ​ qmicli get mode  *****************"​ +                ​execute_commands 
- qmicli -d /​dev/​cdc-wdm1 --nas-get-system-selection-preference +        fi
- fi +
- ) >> ${tmpdir}/​network_result.txt +
-  +
-    # get the 25 last NMEA frames; it will take 10s + 25s +
- if [ ${platform} == "​IBTS"​ ]; then +
-  +
-       if [ -n "​$(lsof | grep $(readlink /​dev/​nmea2))"​ ]; then +
-       echo " /dev/nmea2 already used by $(lsof | grep $(readlink /​dev/​nmea2))"​ > ${tmpdir}/​nmea2.log;​  +
-  +
-       else +
-       timeout -t 10 cat /dev/nmea2 > /dev/null +
-       timeout -t 40 head -n 50 /dev/nmea2 > ${tmpdir}/​nmea2.log +
-              fi +
- fi+
  
- create an archive with all the files and command results +        ​Finish by system logs to prevent space errors 
- # the archive is created on the USB key +        echo "​Extracting system logs" 
- tar -C /tmp -czf ${1}/${NAME}.tar.gz ​${NAME+        if [ "​${option}"​ = "​minimal"​ ]; then 
- echo "${1}/${NAME}.tar.gz"​ +                copy_if_exists /var/log/messages ​${tmpdir}/var/log/ 
- sync+                copy_if_exists /​var/​log/​dmesg ​${tmpdir}/var/log/ 
 +                for filename in /var/log/*.1; do 
 +                        copy_if_exists ​${filename${tmpdir}/​var/​log/​ 
 +                ​done 
 +                for filename in /​var/​log/​*.log;​ do 
 +                        copy_if_exists ​${filename${tmpdir}/​var/​log/​ 
 +                done 
 +        else 
 +                copy_if_exists /var/log/ ${tmpdir}/var/ 
 +        fi
  
- rm -rf $tmpdir+        echo "​Saving all data in ${output_dir}/​${name}.tar.gz"​ 
 +        tar -C /user -czf ${output_dir}/​${name}.tar.gz ${name} 
 +        echo "​Done"​ 
 +        sync 
 + 
 +        ​rm -rf $tmpdir
 } }
  
Line 430: Line 1060:
 #####################​ #####################​
  
-check_version+# Detect the environment of execution of the script 
 +detect_env
  
-platform=$(get_platform)+# Manage scripts arguments 
 +while [[ $# -gt 0 ]] 
 +do 
 +key="$1"
  
-reg=$(fslotpreg read GP1) +        case $key in 
-if [ $? -eq 0 ]then +                -l|--ignore-leds) 
- serial=$(printf "%X\n" $reg+                LEDS_MANAGEMENT=false 
-else +                shift 
- serial="unknown+                ;
-fi +                ​-o|--output-dir) 
-shortmac=$(cat /​sys/​class/​net/​eth0/​address | awk -F: '​{print $5$6}')+                OUTPUT_DIR="$2" 
 +                shift 2 
 +                ;; 
 +                -c|--disable-commands
 +                ​EXEC_COMMANDS=false 
 +                shift 
 +                ;; 
 +                -h|--help) 
 +                show_help 
 +                shift 
 +                exit 1 
 +                ;; 
 +                -v|--version) 
 +                show_version 
 +                shift 
 +                exit 1 
 +                ;; 
 +                -m|--minimal) 
 +                ​OPTION="minimal
 +                shift 
 +                ;; 
 +                *) 
 +                shift 
 +                ;; 
 +        esac 
 +done
  
-if [ ${platform} == "​IBTS"​ ]; then +# Check if firmware version is compatible 
- SYSLEDPATH=${SYSLEDPATH_IBTS} +check_fw_version 
-elif [ ${platform} == "​IFEMTO"​ ]; then + 
- SYSLEDPATH=${SYSLEDPATH_IFEMTO} +# Detect type of platform 
-fi+detect_platform 
 + 
 +# Fill SERIAL and SHORT_MAC variables 
 +fill_serials
  
 # Set led On # Set led On
-set_led none 1+if ${LEDS_MANAGEMENT} ; then 
 +        detect_leds 
 +        ​set_led none 1 
 +fi
  
 # Get logs # Get logs
-get_logs ${USBDIR} +get_logs ${OUTPUT_DIR} ${OPTION}
- +
-# Prepare reboot after USB unplug +
-cat > /​tmp/​usbkey_remove << EOF+
  
 +# End of script, manage user's notifications
 +if ${LEDS_MANAGEMENT} ; then
 +        # Prepare reboot after USB unplug
 +        cat > /​tmp/​usbkey_remove << EOF
 # Switch off Led # Switch off Led
-echo "​none"​ > ${SYSLEDPATH}/trigger+echo "​none"​ > ${LED_PATH}/trigger
 EOF EOF
  
-# All is right, make Led blinking fast to notify User +        ​# All is right, make Led blinking fast to notify User 
-set_led timer 100 100+        set_led timer 100 100 
 +fi
 </​code>​ </​code>​
  
 ++++ ++++
  
 +===== Helium =====
 +This section contains some tips to do the first level of analysis (support level 1) on Helium gateways.\\
 +It will help you to investigate before escalate to Kerlink support (level 2).
 +
 +
 +**Please note that there is an existing open wiki for Helium users: [[https://​wikikerlink.fr/​helium|Kerlink Helium Hotspot Wiki]]**\\
 +  * First step is to follow [[https://​wikikerlink.fr/​helium/​doku.php?​id=home#​troubleshooting_guide|Troubleshooting guide]] chapter which contains:
 +        * [[https://​wikikerlink.fr/​helium/​doku.php?​id=home#​self_diagnostic|Self diagnostic]] section
 +        * [[https://​wikikerlink.fr/​helium/​doku.php?​id=home#​useful_links|Useful links]] section
 +
 +  * Second step, if necessary, is to follow the table below:
 +
 +^ Source of info ^ KPI ^ Value ^ Action ^
 +^ [[https://​helium-onboarding.kerlink.com/​|Onboarding dashboard]] | Last seen | More than 30m ago | Gateway is offline. Ask customer to check power/​internet. |
 +| ::: | ::: | Less than 30m ago | Gateway is online. Check next KPI. |
 +| ::: | Block height | = 0 | Gateway is downloading a snapshot. |
 +| ::: | ::: | = 1 | Gateway is loading the downloaded snapshot. |
 +| ::: | ::: | Else | KPI is ok, check next KPI. |
 +| ::: | Block age | > 30 mn | Gateway is syncing, check again in one hour. If it persists, you can open a ticket to Kerlink Support. |
 +| ::: | ::: | < 30 mn | Gateway is synced. Check next KPI. |
 +^ [[https://​explorer.helium.com//​|Helium explorer]] | 24h/14d earnings | > 0 HNT | Seems OK. Confirm with other Explorer KPIs. |
 +| ::: | Last activity date | < 3h | Seems OK. Confirm with other Explorer KPIs. |
 +| ::: | Is there a constructed challenge in the past 24h? | Yes | Seems OK. Confirm with other Explorer KPIs. |
 +| ::: | ::: | No | When gateway is synced, it should challenge. You can open a ticket to Kerlink Support. |
 +| ::: | Is there a challenged beaconer in the past 24h? | Yes | Seems OK. Confirm with other Explorer KPIs. |
 +| ::: | ::: | No | Gateway might be relayed. If not, you can open a ticket to Kerlink Support. |
 +| ::: | Is there a witnessed beacon in the past 8-24h? | Value depends on density around miner | Seems OK. Confirm with other Explorer KPIs. |
 +| ::: | ::: | No | You can open a ticket to Kerlink Support. |
 +| ::: | Is there a “broadcasted beacon” in the past 5d? | Yes | Seems OK. Confirm with other Explorer KPIs. |
 +| ::: | ::: | No | This is random but it seems odd. You can open a ticket to Kerlink Support. |
 +
 +==== Gateways connected to a WMC====
 +For gateways connected to a WMC, you can use the Remote Command: Remote Access > Command\\
 +{{:​images:​remote_command_wanesy_management_center.png?​800|}}
 +<note important>​** Due its cryptographic key and to ensure Kerlink Helium Hotspot security, no SSH access can be given to those gateways. \\     ​**</​note>​
 +
 +You can use commands below:
 +^ Command ^ Awaited result ^ 
 +| opkg list | {{:​images:​opkg.png?​400|}} |
 +| monit status miner | {{:​images:​monit_status_miner.png?​400|}} |Status = OK | 
 +| monit status lorafwd_helium | {{:​images:​monit_status_lorafwd_helium.png?​400|}} | Status = OK |
 +| /​etc/​init.d/​miner status | {{:​images:​miner_status.png?​400|}} | Check Diff |
  
 +If the result is different than the awaited result, you can open a ticket to Kerlink Support.
wiki/support/troubleshoot.1569419836.txt.gz · Last modified: 2019/09/25 15:57 by ghi