#!/bin/sh
#-------------------------------------------------------------------------------
# charon_resetusb
#----------------------------------------------------------
# Copyright (C) 2013-2019 STROMASYS.
# All rights reserved.
#
# Notes:
# This script unbind/bind the USB port in case the license dongle is
# detected as removed but is still connected. This is a workaround for device
# driver issues
#
VERSION=1.1
TICKFILE=/tmp/charon_resetusb.tick
MAXDIFF=300
ZABSEND=/usr/bin/zabbix_sender
ZABCONF=/etc/zabbix/zabbix_agentd.conf
LOG=/opt/charon/log/`basename $0`.`date +%Y%m`.log

if test `id -u` -ne 0
then
  echo "Must be root !"
  exit 1
fi

test -d /opt/charon/log || mkdir -p /opt/charon/log

IS_SYSTEMD=0
which systemctl >/dev/null 2>&1 && IS_SYSTEMD=1

USBBUSDEV=`/usr/bin/lsusb|grep HASP|cut -f1 -d:|awk '{print $2"/"$4}'`
USBHCI=`/bin/dmesg | grep HASP | tail -1 | cut -f2 -d']' | cut -f1 -d: | sed "s=^ ==g"`
USBHCIMODE=`/bin/dmesg | grep "${USBHCI}:" | grep hci_hcd | tail -1 | sed "s=\(^.* using \)\(.*$\)=\2=g"`

NBHASP=`/usr/bin/lsusb | grep HASP | wc -l`
NBSL=`ls /var/hasplm/installed/68704/ 2>/dev/null | wc -l`
LIC_DETECTED="Detected dongles: ${NBHASP}, SL: ${NBSL}"

#-------------------------------------------------
# Unbind/bind to try to make the dongle available
#-------------------------------------------------
typeset -i DIFFDATE=99999999
test -e ${TICKFILE} && DIFFDATE=`date +%s`-`date +%s -r ${TICKFILE}`
if test ${DIFFDATE} -ge ${MAXDIFF}
then
  echo "`date +%Y%m%d:%H%M%S`:INFO :Unbind/bind of driver ${USBHCIMODE} on going. ${LIC_DETECTED}" >>${LOG}
  test -x ${ZABSEND} -a -s ${ZABCONF} && \
       ${ZABSEND} -c ${ZABCONF} -k charon_resetusb -o "WARN:Unbind/bind of driver ${USBHCIMODE} on going. ${LIC_DETECTED}" >/dev/null
  if test -n "${USBHCIMODE}"
  then
    if test `ls /sys/bus/pci/drivers/${USBHCIMODE} | grep : | wc -l` -gt 0
    then
      ls /sys/bus/pci/drivers/${USBHCIMODE} | grep : | while read L
      do
        echo ${L} >/sys/bus/pci/drivers/${USBHCIMODE}/unbind
        sleep 2
        echo ${L} >/sys/bus/pci/drivers/${USBHCIMODE}/bind
      done
      touch ${TICKFILE}
    else
      echo "`date +%Y%m%d:%H%M%S`:WARN :Cannot unbind/bind, no device file in /sys/bus/pci/drivers/${USBHCIMODE}" >>${LOG}
    fi
  else
    echo "`date +%Y%m%d:%H%M%S`:WARN :Cannot unbind/bind, USBHCIMODE cannot be determined" >>${LOG}
  fi
  sleep 10

  #-----------------------------------------------
  # Restarting Sentinel runtime due to some hangs
  #-----------------------------------------------
  echo "`date +%Y%m%d:%H%M%S`:WARN :aksusbd service restart on going" >>${LOG}
  test -x ${ZABSEND} -a -s ${ZABCONF} && \
       ${ZABSEND} -c ${ZABCONF} -k charon_resetusb -o "WARN:aksusbd service restart on going..." >/dev/null
  if test ${IS_SYSTEMD} = 1
  then
    systemctl restart aksusbd
  else
    service aksusbd restart
  fi
  sleep 10
  echo "`date +%Y%m%d:%H%M%S`:INFO :Unbind/bind of driver ${USBHCIMODE} completed" >>${LOG}
  test -x ${ZABSEND} -a -s ${ZABCONF} && \
       ${ZABSEND} -c ${ZABCONF} -k charon_resetusb -o "INFO:Unbind/bind of driver ${USBHCIMODE} completed." >/dev/null
else
  echo "`date +%Y%m%d:%H%M%S`:WARN :Unbind/bind of driver ${USBHCIMODE} already executed in the past ${MAXDIFF} seconds" >>${LOG}
fi

exit
