#!/bin/sh

# -------------------------------------------------------
# file   : unlock8k.sh
# purpose: Installation script to unlock system for images.
# author : Vittal.S
#
# usage  : unlock8k
#
# modifications:
# 09-05-08  Initial Creation .
# -------------------------------------------------------

### Constants
_SELF_="$(basename "$(readlink -e "${BASH_SOURCE[0]}")" && echo X)" && \
readonly _SELF_="${_SELF_%$'\nX'}"
_SELFDIR_="$(dirname "$(readlink -e "${BASH_SOURCE[0]}")" && echo X)" && \
readonly _SELFDIR_="${_SELFDIR_%$'\nX'}"
readonly COMMONINC="${_SELFDIR_}/common8k"

### Include files
source ${COMMONINC} || exit 1

#Check if osv_version is available
OSV_VERSION=$(whereis -b osv_version.sh | awk '{ print $2 }')
if [ ! -f "$OSV_VERSION" ]; then
   logger --id $$ --priority user.warning "$0: osv_version.sh not found in \$PATH ($PATH), exiting!" >/dev/null 2>&1
   exit 1
fi

# ----------------------------------------------------------
# function: textncolor
# description:
#   sets up text in color.
# ----------------------------------------------------------

textncolor( )
{
   echo -e "[*] ${1}$2${Norm}"
}

setmode( )
{
   echo -e $1
}

# ---------------------------------------------------------------
# function: checklocks
# args    : None
#    checks which side is locked.
# ---------------------------------------------------------------

checklocks( )
{
   activestat=`sync8k -q | awk -F',' '{ print $1 }' | sed -e s/'[ ]*'//g 2>/dev/null`
   fallbackstat=`sync8k -q | awk -F',' '{ print $2 }' | sed -e s/'[ ]*'//g 2>/dev/null`
   activepart=`echo $activestat | awk -F':' '{ print $2 }' 2>/dev/null`
   fallbackpart=`echo $fallbackstat | awk -F':' '{ print $2 }' 2>/dev/null`
   if [ "$activepart" != "" -a "$fallbackpart" != "" ];
   then
       ls /img/logimg/$activepart/upgrade.lock 1>/dev/null 2>&1
       if [ $? -eq 0 ];
       then
          activelockedstat="(locked)"
       else
          activelockedstat="(unlocked)"
       fi
       ls /img/logimg/$fallbackpart/upgrade.lock 1>/dev/null 2>&1
       if [ $? -eq 0 ];
       then
          fallbacklockedstat="(locked)"
       else
          fallbacklockedstat="(unlocked)"
       fi
   fi
   echo "${activestat}${activelockedstat}"
   echo "${fallbackstat}${fallbacklockedstat}"
}

# ---------------------------------------------------------------
# function: initvars
# args    : None
# description:
#   just initialize one variables.
# ---------------------------------------------------------------

initvars( )
{
   SUCCESS=0
   FAIL=2
   UidMisMatch=7
   MISSINGCFGDIR=8
   IMGDISKNOTSUPPORTED=9

   BoldGreen="\033[1;32m"
   BoldBlue="\033[1;34m"
   BoldCyan="\033[1;36m"
   BoldWhite="\033[1;37m"
   UnderLine="\033[4m"
   Yellow="\033[1;33m"
   Norm="\033[0m"

   CFG8k=/etc/hiq8000/node.cfg
   mynode="`uname -n`"
   USER=`id -u`
   if [ $USER -ne 0 ];
   then
       echo "You  must be root to run this script."
       exit $UidMisMatch
   fi

   if [ -h /etc/mtab ] 
   then
   findmnt --fstab --evaluate |grep -q primary
    primstatus=$? 
   findmnt --fstab --evaluate |grep -q secondary
    secstatus=$?
   else
   grep -q primary /etc/mtab
    primstatus=$?
   grep -q  secondary /etc/mtab
   secstatus=$?
   fi
   

   if [ $primstatus -ne 0 -a $secstatus -ne 0 ];
   then
      echo "Looks like you are on non imaged disk."
      echo "This is not supported. Good luck."
      exit $IMGDISKNOTSUPPORTED
   fi

   getcfgvar $CFG8k test_bed testbed
   getcfgvar $CFG8k node_1_name primhost
   getcfgvar $CFG8k node_2_name sechost
   nafoxch="`cfgread nafo3`"
   if "$OSV_VERSION" --major compare sys lt V5;
   then
      getcfgvar $CFG8k node_1_cip_logical primcip
      getcfgvar $CFG8k node_2_cip_logical seccip
   else
      primcip="`echo $nafoxch   | awk '{ print $4 }'`"
      seccip="`echo $nafoxch    | awk '{ print $5 }'`"
   fi
   unlockverb=both
   FORCEUNLOCK8k=false
   INTERACTIVEUNLOCK8k=false
}

usage( )
{
   textncolor $BoldCyan "Usage: unlock8k : [-h] [-q] [-i]"
   echo " ---------------------------------------------------------------------"
   echo "|  unlock8k -h : display's this help.                                 |"
   echo "|  unlock8k -q : display's lock status of images on your disk.        |"
   echo "|  unlock8k -i : interactively allows you to lock images on your disk.|"
   echo " ---------------------------------------------------------------------"
}

ARGLIST="$*"
initvars
while [ "$#" -gt "0" ];
do
   case $1 in
        -q)
            checklocks
            exit $SUCCESS
            ;;
        -h)
            usage
            exit $SUCCESS
            ;;
        -i)
            textncolor $BoldCyan "Interactive unlock option selected."
            sync8k -v
            checklocks
            echo -n "Which side would you like to unlock (0=quit,1=active,2=fallback)?"
            read answer
            case $answer in
               '0')
                  echo "No action.Exiting."
                  exit $SUCCESS
                  ;;
               '1')
                  unlockside=$activepart
                  unlockverb=active
                  ;;
               '2')
                  unlockverb=fallback
                  unlockside=$fallbackpart
                  ;;
                 *)
                  echo "Invalid option. Exiting."
                  exit $FAIL
                  ;;
             esac
             ARGLIST="`echo $ARGLIST | sed -e 's/-i//g'` -i $unlockside"
             FORCEUNLOCK8k=true
             ;;
         -f)
          FORCEUNLOCK8k=true
          ARGLIST="`echo $ARGLIST | sed -e 's/-f//g'`"
          ;;
         *)
           textncolor $BoldCyan "Sorry, Unknown option."
           usage
           exit $FAIL
           ;;
   esac
   shift
done

textncolor $BoldCyan "Unlock8k will unlock $unlockverb partition."
if [ "$FORCEUNLOCK8k" = "false" ];
then
   echo "Note: Please use unlock8k -i for interactive mode."
   echo -n "Do you wish to continue [y,n]?"
   read answer
   case $answer in
      [yY])
         ;;
      [nN])
         echo "Exiting."
         exit $FAIL
         ;;
         *)
         textncolor $BoldCyan "Invalid option. Exiting."
         exit $FAIL
         ;;
   esac
fi
	     
if [ "$testbed" = "cluster" -a "$mynode" != "$primhost" ];
then
   textncolor $BoldCyan "O.k you are on secondary node of cluster. Will still proceed."
   ssh $primcip "prepare8k $ARGLIST -unlock"
else
   prepare8k $ARGLIST -unlock
fi
status=$?
if [ "$status" -eq 0 ];
then
   textncolor $BoldCyan "unlock8k:<$mynode>:Success."
else
   textncolor $BoldRed  "unlock8k:<$mynode>:Failed."
fi
exit $status
