#!/bin/bash
#
# Copyright (c) 2017 Omnissa, LLC. All rights reserved.
# This product is protected by copyright and intellectual property laws in the
# United States and other countries as well as by international treaties.
# -- Omnissa Public
#
# This script implement the lib dependency checking function of installer
#

longname_smartcard="Omnissa Horizon Smart Card"
longname_rtav="Omnissa Horizon Real-Time Audio-Video"
longname_cdr="Omnissa Horizon Client Drive Redirection"
longname_mmr="Omnissa Horizon Multimedia Redirection (MMR)"
longname_pcoip="Omnissa Horizon PCoIP"
longname_usb="Omnissa Horizon USB Redirection"
longname_mediaprovider="Omnissa Horizon(R) Virtualization Pack for Skype for Business"
longname_client="Omnissa Horizon Client"

# TODO: make this map related with vmis scan file list in the future
comp_smartcard="/usr/lib/pcoip/vchan_plugins/libscredirvchanclient.so "
comp_rtav="/usr/lib/pcoip/vchan_plugins/libviewMMDevRedir.so "
comp_cdr="/usr/lib/omnissa/horizon/vdpService/libtsdrClient.so "
comp_mmr="/usr/lib/omnissa/horizon/vdpService/libtsmmrClient.so "

# PCoIP paths: prefer new location, fallback to legacy
comp_pcoip="/usr/lib/omnissa/horizon/client/horizon-protocol "
comp_pcoip+="/usr/bin/horizon-protocol "
comp_pcoip+="/usr/lib/libpcoip_client.so "
comp_pcoip+="/usr/lib/omnissa/horizon/vdpService/librdeSvc.so "
comp_pcoip+="/usr/lib/omnissa/horizon/vdpService/libmksvchanclient.so "
comp_pcoip+="/usr/lib/omnissa/libudpProxyLib.so "
comp_pcoip+="/usr/lib/pcoip/vchan_plugins/librdpvcbridge.so "
comp_pcoip+="/usr/lib/pcoip/vchan_plugins/libvdpservice.so "

# Optional PCoIP components
comp_pcoip_optional="/usr/bin/horizon-protocol-container "

comp_usb="/usr/lib/omnissa/horizon/usb/libhorizon-usbd.so "
comp_usb+="/usr/lib/omnissa/horizon/usb/horizon-eucusbarbitrator "

comp_mediaprovider="/usr/lib/omnissa/mediaprovider/libVMWMediaProvider.so "
comp_client="/usr/lib/omnissa/horizon/bin/horizon-client "

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/omnissa:/usr/lib/omnissa/gcc

for comp in client pcoip smartcard rtav cdr mmr usb mediaprovider
do
   compSuccess=true
   fileMissing=false
   errorOutput=""
   isOptional=false

   # Check if this component is optional
   if [ "$comp" = "mediaprovider" ]; then
      isOptional=true
   fi

   files="comp_"${comp}
   files=${!files}
   
   # Special handling for PCoIP: check new path first, then legacy fallback
   if [ "$comp" = "pcoip" ]; then
      # Check for horizon-protocol in new location first
      if [ -e "/usr/lib/omnissa/horizon/client/horizon-protocol" ]; then
         # Reconstruct files list without legacy path since new path exists
         files="/usr/lib/omnissa/horizon/client/horizon-protocol "
         files+="/usr/lib/libpcoip_client.so "
         files+="/usr/lib/omnissa/horizon/vdpService/librdeSvc.so "
         files+="/usr/lib/omnissa/horizon/vdpService/libmksvchanclient.so "
         files+="/usr/lib/omnissa/libudpProxyLib.so "
         files+="/usr/lib/pcoip/vchan_plugins/librdpvcbridge.so "
         files+="/usr/lib/pcoip/vchan_plugins/libvdpservice.so "
      fi
      # Also check optional PCoIP components separately
      optional_files="comp_pcoip_optional"
      optional_files=${!optional_files}
   fi
   
   for file in $files
   do
      if [ ! -e "$file" ]; then
         errorOutput+="\t$file: No such file.\n"
         compSuccess=false
         fileMissing=true
         continue
      fi

      result=$(ldd "$file" | grep "not found")
      if [ "$result"x != ""x ]
      then
         compSuccess=false
         errorOutput+="$result\n"
      fi
   done

   # Check optional components for informational purposes only
   if [ "$comp" = "pcoip" ]; then
      for file in $optional_files
      do
         if [ -e "$file" ]; then
            result=$(ldd "$file" | grep "not found")
            if [ "$result"x != ""x ]; then
               errorOutput+="Info: Optional component $file has missing dependencies:\n$result\n"
            fi
         fi
      done
   fi

   longname="longname_"${comp}
   longname=${!longname}
   if $compSuccess; then
      echo -e "$longname: Success\n"
   else
      if $isOptional && $fileMissing; then
         echo -e "$longname: Not installed (optional)\n"
      else
         echo "$longname: Failed"
         if $fileMissing; then
            echo -e -n "\tThis feature was improperly installed, please re-install"
            echo " it or ignore this message if you won't use it."
         fi
         echo -e "$errorOutput"
      fi
   fi
done
