#!/bin/ksh
#############################################################################
#
# Licensed Materials - Property of IBM
#
# 5648-B90
# (C) COPYRIGHT International Business Machines Corp. 1993, 1999
#
# 5648-B91
# (C) COPYRIGHT International Business Machines Corp. 1993, 1999
#
# 5648-B95
# (C) COPYRIGHT International Business Machines Corp. 1993, 1999
#
# 5648-B97
# (C) COPYRIGHT International Business Machines Corp. 1993, 1999
#
# 5648-B99
# (C) COPYRIGHT International Business Machines Corp. 1993, 1999
#
# All Rights Reserved
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
#
##############################################################################
#
# NAME: db2ftok - DB2 Service tool
#
# FUNCTION: db2ftok - creates new inode sources for IPC keys generated by ftok
#
# USAGE: db2ftok <instance> [number_of_dummy_files]
#
##############################################################################

DATETAG=`date +"%m%d%H%M%S"`
LOGFILE=/tmp/db2ftok.log.$DATETAG
DUMMYFILES=1000
#DUMMYFILES is the number of inodes to use up.  If there are multiple EEE MLN
#instances clashing, may need to use different values for different instances
#suggest anything from 100 - 1000 (use multiple of 100)
#The idea is to get the inode ranges under sqllib/ctrl far enough apart that
#the user won't see this problem again for a long time (hopefully forever).
#for stable systems, the inodes used under sqllib/ctrl should never change.

#remove sqllib/ctrl dummy files
cleanup_ctrl_dummies()
{
   #Don't care if there are errors on the next commands, but log them.
   echo "Removing dummy files from sqllib/ctrl.$DATETAG" >> $LOGFILE
   echo "" >> $LOGFILE
   for COUNTER in  0 1 2 3 4 5 6 7 8 9 
   do
      echo "COMMAND: rm -f $HOME/sqllib/ctrl.$DATETAG/.dummy*$COUNTER" >> $LOGFILE
      rm -f $HOME/sqllib/ctrl.$DATETAG/.dummy*$COUNTER >> $LOGFILE 2>&1
   done
   echo "" >> $LOGFILE
}

#remove HOME dummy directories
cleanup_home_dummies()
{
   #Don't care if there are errors on the next commands, but log them.
   echo "Removing dummy directories from $HOME" >> $LOGFILE
   echo "COMMAND: rmdir $HOME/.dummy*" >> $LOGFILE
   rmdir $HOME/.dummy* >> $LOGFILE 2>&1
   echo "" >> $LOGFILE
}

#remove dummy ftoks
cleanup_dummyftoks()
{
   #Don't care if there are errors on the next commands, but log them.
   echo "Removing dummy .ftoks from sqllib" >> $LOGFILE
   echo "COMMAND: rm -f $HOME/sqllib/.dummyftok*" >> $LOGFILE
   rm $HOME/sqllib/.dummyftok* >> $LOGFILE 2>&1
   echo "" >> $LOGFILE
}

#restore sqllib/ctrl directory
restore_ctrl()
{
   echo "Restoring sqllib/ctrl directory" >> $LOGFILE
   echo "COMMAND: mv $HOME/sqllib/ctrl.$DATETAG $HOME/sqllib/ctrl" >> $LOGFILE
   echo "" >> $LOGFILE
   mv $HOME/sqllib/ctrl.$DATETAG $HOME/sqllib/ctrl >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error Restoring ctrl directory" | tee -a $LOGFILE
      echo "Please contact DB2 support" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi
}

# check args
if [ $# -eq 0 ] ; then
   echo ""
   echo "Usage: db2ftok <instance> [number_of_dummy_files]"
   echo ""
   echo "The \"number_of_dummy_files\" argument is not usually required."
   echo "It's purpose is to create dummy files in order to move inode"
   echo "ranges used by different EEE instances farther apart."
   echo "It may be required if there are more than 2 EEE instances using"
   echo "MLN (multiple logical nodes).  If this is the case, use a "
   echo "different multiple of 100 for each of the conflicting instances."
   echo "   i.e. db2ftok <instance1> 100"
   echo "        db2ftok <instance2> 200"
   echo "        etc."
   echo ""
   echo "NOTE that one of the conflicting instances can be left unchanged."
   echo "     i.e. for 2 conflicting instances, run db2ftok against one"
   echo "     instance.  for 3 conflicting instances, run db2ftok against"
   echo "     2 instances, etc."
   echo ""
   exit
fi

# check that user is logged on as the as the specified instance
echo "Checking that user is logged on as the specified instance" >> $LOGFILE
if ! [ $1 = `whoami` ]  ; then
   echo "" | tee -a $LOGFILE
   echo "You, \"`whoami`\" are not logged on as the instance id \"$1\"" | tee -a $LOGFILE
   echo "   Please log on as the specified instance before running db2ftok" | tee -a $LOGFILE
   echo "" | tee -a $LOGFILE
   exit
fi

if [ $# -eq 2 ] ; then
   DUMMYFILES=$2
   echo "User specified $2 for DUMMYFILES" >> $LOGFILE 2>&1
   echo "" >> $LOGFILE
fi

# check that instance is shut down (no IPC resources active on this node).
echo "Starting db2ftok program - checking for ipc resources\n" >> $LOGFILE 2>&1
echo "COMMAND: ipcs -a | grep $1" >> $LOGFILE
echo "" >> $LOGFILE
ipcs -a | grep $1 >> $LOGFILE 2>&1
if [ $? -eq 0 ] ; then
   echo "" | tee -a $LOGFILE
   echo "There are IPC resources owned by the specified DB2 instance ID."
   echo "   db2ftok cannot be run until these resources are removed."
   echo "   Please shut down the db2 instance, issue \"db2 terminate\" in all"
   echo "   sessions, shut down any db2 applications, and remove all remaining"
   echo "   IPC resources owned by the db2 instance owner with \"ipclean\"."
   echo "   In some cases use of the \"ipcrm\" tool may be necessary."
   echo "Issue \"ipcs -a | grep $1\" to see IPC resources owned by $1."
   echo ""
   exit 
else 
   echo "No IPC resources exist for instance - proceeding" >> $LOGFILE
   echo "" | tee -a $LOGFILE
   echo "Processing...  This may take a few minutes" | tee -a $LOGFILE
   echo "" | tee -a $LOGFILE
fi

# EE or EEE ?
if test -f $HOME/sqllib/db2nodes.cfg ; then
  echo "db2nodes.cfg detected" >> $LOGFILE
  echo "This is an EEE instance" >> $LOGFILE
  echo "" >> $LOGFILE
  EEE=1
else EEE=0
fi

# if EE just touch and create a new .ftok file
if [ $EEE -ne 1 ] ; then

   echo "Moving sqllib/.ftok" >> $LOGFILE
   echo "COMMAND: mv $HOME/sqllib/.ftok $HOME/sqllib/.ftok.$DATETAG" >> $LOGFILE
   echo "" >> $LOGFILE
   mv $HOME/sqllib/.ftok $HOME/sqllib/.ftok.$DATETAG >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured moving sqllib/.ftok" | tee -a $LOGFILE
      echo "Please see $LOGFILE" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi

   DUMMYFTOKS=`date +%S`
   COUNTER=1
   echo "Creating $DUMMYFTOKS dummy .ftok files under sqllib" >> $LOGFILE
   echo "" >> $LOGFILE
   while [ $COUNTER -le $DUMMYFTOKS ]
   do
      touch $HOME/sqllib/.dummyftok$COUNTER >> $LOGFILE 2>&1
      if [ $? -ne 0 ] ; then
         echo "" >> $LOGFILE
         echo "Error occured on touch sqllib/.dummyftok$COUNTER" >> $LOGFILE
         echo "COMMAND: touch $HOME/sqllib/.dummyftok$COUNTER" >> $LOGFILE
         echo "There may not be $DUMMYFTOKS inodes available" >> $LOGFILE
         echo "Cleaning up and continuing ?" >> $LOGFILE
         echo "" >> $LOGFILE

         #clean up the dummy ftoks and continue
         cleanup_dummyftoks
         break
      fi
      COUNTER=$(( $COUNTER + 1 ))
   done
  
   echo "Touching new sqllib/.ftok file" >> $LOGFILE 
   echo "COMMAND: touch $HOME/sqllib/.ftok" >> $LOGFILE 
   echo "" >> $LOGFILE
   touch $HOME/sqllib/.ftok >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured touching new sqllib/.ftok" | tee -a $LOGFILE
      echo "Please try running db2iupdt" | tee -a $LOGFILE
      echo "If db2iupdt fails, please contact DB2 Support" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi

   cleanup_dummyftoks

# if EEE, create new sqllib, use up 1000 inodes under sqllib/ctrl
else

   #create new source inode for primary nodes
   echo "Moving sqllib directory" >> $LOGFILE
   echo "COMMAND: mv $HOME/sqllib $HOME/sqllib.$DATETAG" >> $LOGFILE
   echo "" >> $LOGFILE
   mv $HOME/sqllib $HOME/sqllib.$DATETAG >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured moving sqllib directory" | tee -a $LOGFILE
      echo "Please see $LOGFILE." | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi

   DUMMYDIRS=`date +%S`
   COUNTER=1
   echo "Creating $DUMMYDIRS dummy directories under $HOME" >> $LOGFILE
   echo "" >> $LOGFILE
   while [ $COUNTER -le $DUMMYDIRS ]
   do
      mkdir $HOME/.dummy$COUNTER >> $LOGFILE 2>&1
      if [ $? -ne 0 ] ; then
         echo "" >> $LOGFILE
         echo "Error occured on mkdir $HOME/.dummy$COUNTER" >> $LOGFILE
         echo "COMMAND: mkdir $HOME/.dummy$COUNTER" >> $LOGFILE
         echo "There may not be $DUMMYDIRS inodes available" >> $LOGFILE
         echo "Cleaning up and continuing ?" >> $LOGFILE
         echo "" >> $LOGFILE

         #clean up the dummy directories and continue
         cleanup_home_dummies
         break
      fi
      COUNTER=$(( $COUNTER + 1 ))
   done
  
   echo "Making new sqllib directory" >> $LOGFILE
   echo "COMMAND: mkdir $HOME/sqllib" >> $LOGFILE
   echo "" >> $LOGFILE
   mkdir $HOME/sqllib >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured creating new sqllib directory" | tee -a $LOGFILE
      echo "Please contact DB2 Support" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi

   cleanup_home_dummies

   echo "Moving files from old sqllib to new sqllib" >> $LOGFILE
   echo "COMMAND: mv $HOME/sqllib.$DATETAG/* $HOME/sqllib" >> $LOGFILE
   echo "" >> $LOGFILE
   mv $HOME/sqllib.$DATETAG/* $HOME/sqllib >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured moving files from old sqllib to new sqllib" | tee -a $LOGFILE
      echo "Please contact DB2 Support" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi

   echo "COMMAND: mv $HOME/sqllib.$DATETAG/.[0-z]* $HOME/sqllib" >> $LOGFILE
   echo "" >> $LOGFILE
   mv $HOME/sqllib.$DATETAG/.[0-z]* $HOME/sqllib >> $LOGFILE
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured moving files from old sqllib to new sqllib" | tee -a $LOGFILE
      echo "Please contact DB2 Support" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi

   #create new source inodes for non-primary nodes
   echo "Moving sqllib/ctrl directory" >> $LOGFILE
   echo "COMMAND: mv $HOME/sqllib/ctrl $HOME/sqllib/ctrl.$DATETAG" >> $LOGFILE
   echo "" >> $LOGFILE
   mv $HOME/sqllib/ctrl $HOME/sqllib/ctrl.$DATETAG >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured moving ctrl directory" | tee -a $LOGFILE
      echo "Please see $LOGFILE" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      exit
   fi
   
   COUNTER=1
   echo "Creating $DUMMYFILES files under sqllib/ctrl.$DATETAG" >> $LOGFILE
   echo "" >> $LOGFILE
   while [ $COUNTER -le $DUMMYFILES ]
   do
      touch $HOME/sqllib/ctrl.$DATETAG/.dummy$COUNTER >> $LOGFILE 2>&1
      if [ $? -ne 0 ] ; then
         echo "" | tee -a $LOGFILE
         echo "Error occured touching sqllib/ctrl.$DATETAG/.dummy$COUNTER" | tee -a $LOGFILE
         echo "COMMAND: touch $HOME/sqllib/ctrl.$DATETAG/.dummy$COUNTER" >> $LOGFILE
         echo "There may not be $DUMMYFILES inodes available" | tee -a $LOGFILE
         echo "Cleaning up and restoring sqllib/ctrl directory" | tee -a $LOGFILE
         echo "You may retry with a lower value for \"number_of_dummy_files\"" | tee -a $LOGFILE
         echo "Please see $LOGFILE" | tee -a $LOGFILE
         echo "" | tee -a $LOGFILE

         #clean up the dummy files, restore sqllib/ctrl, and exit
         cleanup_ctrl_dummies
         restore_ctrl
         exit
      fi
      COUNTER=$(( $COUNTER + 1 ))
   done
  
   echo "Creating new sqllib/ctrl directory" >> $LOGFILE 
   echo "COMMAND: mkdir $HOME/sqllib/ctrl" >> $LOGFILE 
   echo "" >> $LOGFILE
   mkdir $HOME/sqllib/ctrl >> $LOGFILE 2>&1
   if [ $? -ne 0 ] ; then
      echo "" | tee -a $LOGFILE
      echo "Error occured creating new sqllib/ctrl directory" | tee -a $LOGFILE
      echo "Please see $LOGFILE" | tee -a $LOGFILE
      echo "restoring sqllib/ctrl directory" | tee -a $LOGFILE
      echo "" | tee -a $LOGFILE
      restore_ctrl
      exit
   fi

   #cleanup dummy files in old sqllib/ctrl directory
   cleanup_ctrl_dummies

   echo "Copying files from sqllib/ctrl.$DATETAG to sqllib/ctrl" >> $LOGFILE 
   echo "" >> $LOGFILE
   echo "COMMAND: cp $HOME/sqllib/ctrl.$DATETAG/* $HOME/sqllib/ctrl" >> $LOGFILE 
   cp $HOME/sqllib/ctrl.$DATETAG/* $HOME/sqllib/ctrl >> $LOGFILE 2>&1
   echo "" >> $LOGFILE
   echo "COMMAND: cp $HOME/sqllib/ctrl.$DATETAG/.[0-z]* $HOME/sqllib/ctrl" >> $LOGFILE
   cp $HOME/sqllib/ctrl.$DATETAG/.[0-z]* $HOME/sqllib/ctrl >> $LOGFILE 2>&1

fi

echo "" | tee -a $LOGFILE
echo "Program completed successfully" | tee -a $LOGFILE 
echo "New inode source files have been created" | tee -a $LOGFILE
echo "The logfile $LOGFILE may be deleted" | tee -a $LOGFILE
echo "" | tee -a $LOGFILE
