#!/bin/sh
#
# ###################################################################
# Copyright (c) 2000, EMC Corporation. All Rights Reserved.
#
# Most Recent Author: Saravanan S
# Previous Authors: Saravanan S 
#
# Contents:
# Power Path script for Interoperability between VxVM 4.0 and EMC PowerPath
# ver 4.3.x on Linux. The script retains support for VxVM 3.x from the original
# Solaris script.  But we exit if the VxVM version is not 4.0.
# To enable support support for VxVM 3.x this version check should be removed.
# ##############################################################################
#set -x

DIR=/etc

mknodes()
{
  if [ $use_addforeign_devices -eq 1 ]
  then
    return
  fi
  cd /dev
  for dev in `powermt display dev=all|grep emcpower|cut -f 2 -d"="`
  do
   major=`ls -l $dev|cut -f6 -d " "|sed -e 's/,/ /'`
   minor=`ls -l $dev|cut -f7 -d " "`
   mknod /dev/vx/dmp/$dev b $major $minor > /dev/null 2>&1
  done 
}

alladdforeign()
{    
  cd /dev
  for device in `powermt display dev=all|grep emcpower|cut -f 2 -d"="`
  do
    echo -e "vxddladm addforeign path=/dev/$device"
    vxddladm addforeign path=/dev/$device 
  done
}

alldisks()
{    
  if [ $use_addforeign_devices -eq 1 ]
  then
    cd /dev
  else
    if [ -d /dev/vx/dmp ]
    then
      cd /dev/vx/dmp
    else
      cd /dev/
    fi
  fi
  for device in `powermt display dev=all|grep emcpower|cut -f 2 -d"="`
  do
    echo -e "\n$2 $device:" 
    echo -e "vxdisk $1 $device"
    vxdisk $1 $device 2>/dev/null
  done
  echo -e "\ndone!\n"
}
remove()
{
  if [ $use_addforeign_devices -eq 1 ]
  then
   if vxdisk list|grep emcpower >/dev/null 2>&1
   then
    cd /dev
    for dev in `powermt display dev=all|grep emcpower|cut -f 2 -d"="`
    do
     echo -e "vxddladm rmforeign path=/dev/$dev"
     vxddladm rmforeign path=/dev/$dev
    done
    vxdisk scandisks
    echo -e "\ndone!"
    exit
   else
    echo -e "\n No emcpower devices under VxVm control"
    exit
   fi
  fi
  if [ -d /dev/vx/dmp ]
  then
    ls /dev/vx/dmp/emcpower* > /dev/null 2>&1
    if [ $? -eq 0 ]
    then
      rm -f /dev/vx/dmp/emcpower* 2>/dev/null
    fi
  fi

# Since S87powervxvm is required for only VxVM 3.x, this script does not exist for this release
  if [ -f /etc/init.d/rc2.d/S87powervxvm ]
  then
    rm -f /etc/init.d/rc2.d/S87powervxvm 
  fi
  echo -e "\ndone!\n"
}

usage()
{
  echo -e -e "Usage:\n powervxvm setup\n powervxvm install\n powervxvm online\n powervxvm remove\n powervxvm init\n powervxvm define" 
  exit 1
}

if [ $# -ne 1 ]
then
  if [ "$2" != "quiet" ]
  then
    usage
  fi
fi


emcp=`lsmod | grep -w emcp`
if [ "$emcp" == "" ]
then
  if [ "$2" != "quiet" ]
  then
    echo -e "emcp driver is not installed. Exiting..."
  fi
  exit 1
fi

if [ `rpm -qa|grep -c vxvm` == 0 ]
then
  if [ "$2" != "quiet" ]
  then 
    echo -e "VxVM 4.0 is not installed.Exiting..."
  fi
  exit 1
fi

vxvm_version=`rpm -qa|grep vxvm|cut -f 2 -d"-"|cut -f 1 -d"."`
if [ -n $vxvm_version -a $vxvm_version -ge 4 ]
then
  use_addforeign_devices=1
else
  use_addforeign_devices=0
fi 

if [ "$1" = "remove" ]
then 
  remove
  exit
fi

case $1 in 

  "setup")     
    if [ $use_addforeign_devices -eq 1 ]
    then 
      exit
    fi

    if [ -d /dev/vx/dmp ]
    then
      mknodes
    fi
    echo -e "EMCpower devices are available for VxVM"
    ;;
  "online")
    if [ $use_addforeign_devices -eq 1 ]
    then
      exit
    fi

    if [ -d /dev/vx/dmp ]
    then
      mknodes
    fi
    alldisks "online" "putting online"
    ;;
  "init")
    if [ $use_addforeign_devices -eq 0 ]
    then
      if [ -d /dev/vx/dmp ]
      then
        mknodes
      fi
    fi
    if [ `vxdisk list|grep -c emcpower*` -gt 0 ]
    then
      alldisks "-f init" "initializing"
    else
      echo -e "\nDefine disks before initializing"
    fi 
    ;;
  "define")
    if [ $use_addforeign_devices -eq 0 ]
    then
      if [ -d /dev/vx/dmp ]
      then
        mknodes
      fi
      alldisks "define" "defining" 
    else
      alladdforeign
      vxdisk scandisks new
      echo -e "\ndone!\n"
    fi
    ;;
  "install") 
    if rpm -qa | grep vxvm > /dev/null 2> /dev/null
    then
      :
    else
      echo -e "Volume Manager is not installed. Exiting..."
      exit 1
    fi
# Since S87powervxvm is required for only VxVM 3.x, this script does not exist for this release
    if [ $use_addforeign_devices -eq 0 ]
    then
     if [ ! -x /etc/init.d/rc2.d/S87powervxvm ]
     then
       cp ${DIR}/S87powervxvm /etc/init.d/rc2.d 2>/dev/null
       if [ $?  -ne 0 ]
       then 
         echo -e "Cannot install S87powervxvm script. Check BNFSH installation\n"         
         exit 1
       fi
     fi
    fi

    echo -e "\nSTOP! Please read the Veritas Volume Manager section of the\n\"EMCpower Installation Guide\" before proceeding.\n"   

    echo -e "NOTE: It is advised to have the VxVM GUI running, displaying the"
    echo -e "\"Disks\" and \"rootdg\" windows, during any \"powervxvm\" session."   
    echo -e "\n\nEnter carriage return to continue:\c"
    read cr

    tput clear
    echo -e "Scanning for emcpower devices..."
    if [ -d /dev/vx/dmp ]
    then
      mknodes
    fi
    if [ $use_addforeign_devices -eq 1 ]
    then
      cd /dev
    else
      if [ -d /dev/vx/dmp ]
      then
        cd /dev/vx/dmp
      else
        cd /dev
      fi
    fi
    tput clear
    echo -e "\nThe following EMCpower devices are available to Volume Manager:\n"
    devices=`powermt display dev=all|grep emcpower|cut -f 2 -d"="`
    echo -e $devices

    while :
    do
      echo -e "\n\nInstallation options:\n"
      echo -e "       1. Initialize all devices as new disks (discards data on disks!)\n"
      echo -e "       2. Install all devices as pre-existing disks\n"
      echo -e "       3. Install one device at a time\n"
      echo -e "       q. Quit\n"
      echo -e "       Enter the number [1,2,3,q]:   \c"

      read number 
      tput clear
      case $number in 
        1)
          if [ $use_addforeign_devices -eq 1 ]
          then
            alladdforeign
            vxdisk scandisks new
            echo -e "Initializing all emcpower devices:\n"
            alldisks "-f init" "initializing"
            break
          fi
          echo -e "Initializing all emcpower devices:\n"
          alldisks "-f init" "initializing"
          ;;
        2)
          if [ $use_addforeign_devices -eq 1 ]
          then
            alladdforeign
            vxdisk scandisks new
            echo -e "\ndone!\n"
            break
          fi

          alldisks "define" "defining" 
          ;;
        3)
          for device in $devices
          do
            while :
            do              
              echo -e "\n\n"
              echo -e "                For device \"${device}\":\n"
              echo -e "                Enter 1 - to initialize (discards data on the disk!)\n"
              echo -e "                Enter 2 - to define\n"
              echo -e "                Enter s - to skip the disk\n"
              echo -e "                Enter t - to go back to the top of the menu\n"
              echo -e "                Enter q - to quit\n"
              echo -e "                [1,2,s,t,q]:   \c"

              read sel
              tput clear
              case $sel in
                1)
                  if [ $use_addforeign_devices -eq 1 ]
                  then
                    echo -e "vxddladm addforeign path=/dev/$device"
                    vxddladm addforeign path=/dev/$device 
                    echo -e "vxdisk scandisks new"
                    vxdisk scandisks new
                    echo -e "vxdisk -f init $device"
                    vxdisk -f init $device
                    continue 2
                  fi
                  echo -e "vxdisk -f init $device privlen=1919"
                  vxdisk -f init $device privlen=1919
                  if [ $? = 0 ]
                  then
                    echo -e "device $device is initialized\n"
                  else
                    echo -e "\nConsider another choice:"
                    continue
                  fi
                  ;;
                2) 
                  if [ $use_addforeign_devices -eq 1 ]
                  then
                    echo -e "vxddladm addforeign path=/dev/$device" 
                    vxddladm addforeign path=/dev/$device
                    vxdisk scandisks new
                    continue 2
                  fi
                  echo -e "vxdisk -f define $device"
                  vxdisk -f define $device
                  if [ $? = 0 ]
                  then
                    echo -e "device $device has been defined\n"
                  else
                    echo -e "\nConsider another choice:\n"
                    continue
                  fi
                  ;;
                "q"|"Q") 
                  exit 
                  ;;
                "s"|"S")
                 break;;
                "t"|"T")
                  continue 3 ;;
                *) 
                  echo -e "Improper selection: \"${sel}\"\n"
              esac
            done
          done
          ;;
        "q"|"Q"|4)
          exit
          ;;
        *)
          echo -e "Improper selection: \"${number}\"\n"
          continue
          ;;
      esac
    done
    ;;
   *)
    echo -e "Bad option: \"$1\"\n"
    usage
esac
