#!/bin/sh
#-------------------------------------------------------------
# D002setup                                Rev 1.00 '98.08.19
#                                          Rev 2.01 '99.09.28
#                                          Rev 3.18 '08.08.18
#                                          Rev 3.19 '08.12.05
# All Rights Reserved. Copyright (C) 1998, 2009, Hitachi, Ltd.
#-------------------------------------------------------------
# Usage:
#  D002setup <archive-file>
#     Setup program files from an archive file with tar format.
#  D002setup -v
#     Show the version of the installed program.
#
#-------------------------------------------------------------

#---------------------------------------------
# Definition of variables
#---------------------------------------------
# set path
PATH=/bin:/etc:$PATH

# set program code
XXXX=D002

# set product name
PPNAME="Hitachi NwOP Trace Library 2"

# root directory
ROOT_DIR=/
#ROOT_DIR=/var/tmp # for debug

# hitachi's directory
HITACHI_DIR=/opt/hitachi
HITACHI_DIR2=/var/opt/hitachi                                         #HNTRLib2
#HITACHI_DIR=$ROOT_DIR/opt/hitachi # for debug

# install directory
INST_DIR=$HITACHI_DIR/HNTRLib2
INST_DIR2=$HITACHI_DIR2/HNTRLib2                                      #HNTRLib2

# common directory
COM_DIR=$HITACHI_DIR/common

# library directory
LIB_DIR=$COM_DIR/lib

# original library directory
LIB_ORG_DIR=$LIB_DIR/$XXXX

#360201 DELETE
#BIN_DIR=$INST_DIR/bin	#360B03
#360B04 DELETE
#ETC_DIR=$INST_DIR/etc	#360B03

# library files
LIBS="libhntr2t.so libhntr2s.so libhntr2sj.so	\
	libhntr2sys.so libhntr2sys_r.so libhntr2trap.so"	#380E06

# archived library file 
LIB_ARCFILE=""

# PPName config file                                                 #HNTRLib2
PPNAME_FILE=$INST_DIR/etc/D002PPName.cnf                             #HNTRLib2
# PPName file                                                        #HNTRLib2
PPNAME_TMPL=$INST_DIR/etc/D002PPName.template                        #HNTRLib2

# config file
CNF_FILE=$INST_DIR/etc/D002hntr2.cnf

# config file
CNF_TMPL=$INST_DIR/etc/D002hntr2.template

# kill command
KILL_PRG=$INST_DIR/bin/hntr2kill

# monitor command                                                    #HNTRLib2
MONITOR_PRG=$INST_DIR/bin/hntr2mon                                   #HNTRLib2

# memory mapped file directory
MMAP_DIR=$INST_DIR/mmap

# Java class directory
CLASS_DIR=$INST_DIR/classes

# spool directory
SPOOL_DIR=$INST_DIR/spool
SPOOL_DIR2=$INST_DIR2/spool                                           #HNTRLib2

# logging directory
LOGGING_DIR=$SPOOL_DIR/setuplog

# working directory
TEMP_DIR=$SPOOL_DIR/$XXXX.setuptmp

# history file
HIST_FILE=$LOGGING_DIR/UPDATE_$XXXX.log

# error log
ERROR_LOG=$LOGGING_DIR/SETUP_$XXXX.log

# version file
VER_FILE=.VER_$XXXX

# check file
CHECK_FILE=PRM_$XXXX

# temporary archive file 
ARC_FILE=$XXXX.tar

# version prefix
VERPREFIX=_VERSION:

## environment variables
LANG=C
export LANG

## for japanese HP-UX
# TZ=JST-9
# export TZ
# LANG=ja_JP.SJIS
# export LANG

## for japanese solaris
# LANG=ja
## old version
# LANG=japanise
# export LANG
# TZ=GMT+9
# export TZ

#-----------------------------------------------
# Sub routines
#-----------------------------------------------
#-----------------------------------------------
#
# name   = check return code
# io     = $1 : retrun code
#          $2 : message string for error log file (option)
#          $3 : message string for stdout (option)
#
#-----------------------------------------------
check_return_code()
{
  if [ $1 != 0 ]
  then
    case $# in
      2) echo $2 >> $ERROR_LOG;;
      3) echo $2 >> $ERROR_LOG
         echo $3;;
    esac
    cleanup_tmp
    echo "installation failure"
    exit 1
  fi
}

#-----------------------------------------------
# Interruption
#-----------------------------------------------
interruption()
{
  echo "process terminated by signal" >> $ERROR_LOG
  echo "process terminated by signal"
  cleanup_tmp
  exit 3
}

#-----------------------------------------------
# Remove File
#-----------------------------------------------
remove_file()
{
  if [ -f $1 ]
  then
    rm -f $1 2>> $ERROR_LOG
    check_return_code $? "cannot remove $1"
  fi
}

#-----------------------------------------------
# Cleanup old files
#-----------------------------------------------
cleanup_old_files()
{
  for LIBNAME in $LIBS
  do
    remove_file $LIB_DIR/$LIBNAME
    rm -f $LIB_ORG_DIR/$LIBNAME.* 2>> $ERROR_LOG
  done
}

#-----------------------------------------------
# make temp file name
#-----------------------------------------------
mktmp_name()
{
  EXTCNT=1
  while [ -f $1.$EXTCNT ]
  do
    EXTCNT=`expr $EXTCNT + 1`
  done
  return $EXTCNT
}

#-----------------------------------------------
# Repalce files
#-----------------------------------------------
replace_shared_library()
{
  SLNAME=$LIB_DIR/$1
  ORG_SLNAME=$LIB_ORG_DIR/$1
  if [ -f $ORG_SLNAME ]
  then
    #---------------------------------------------
    # remove symbolic link file for shared library
    #---------------------------------------------
    rm -f $SLNAME 2>> $ERROR_LOG
    check_return_code $? "cannot remove $SLNAME"
    #---------------------------------------------
    # rename shared library
    #---------------------------------------------
    mktmp_name $LIB_ORG_DIR/$1
    RENAME="$LIB_ORG_DIR/$1.$?"
#    RENAME=`mktemp -c -d $LIB_ORG_DIR -p $1.`
    check_return_code $? "cannot get temporary file name of $1"
    mv $ORG_SLNAME $RENAME
    check_return_code $? "cannot rename $OLG_SLNAME to $RENAME"
    #---------------------------------------------
    # re-link symbolic link file for shared library
    #---------------------------------------------
    ln -s $RENAME $SLNAME
    check_return_code $? "cannot re-link $SLNAME and $RENAME"
  fi
}

#-----------------------------------------------
# Repalce files
#-----------------------------------------------
replace_files()
{
  for LIBNAME in $LIBS
  do
    replace_shared_library $LIBNAME
  done
}

#-----------------------------------------------
# Create a directory
#   usage: make_dir $directory
#-----------------------------------------------
make_dir()
{
  #----------------------
  # checks the dirtory
  #----------------------
  if [ ! -d $1 ]
  then
    #--------------------
    # create the directory
    #-------------------- 
    mkdir -m 555 -p $1 2> /dev/null
    if [ $? != 0 ]
    then
      echo "failed to make directory ($1)"
      return 1
    fi
    chgrp sys $1
  fi
  return 0
}

#-----------------------------------------------	#3180E01
# Create a directory								#3180E01
#   usage: make_dir $directory $permission			#3180E01
#     0: create the directory						#3180E01
#     1: error is occurred							#3180E01
#     2: directory already exists					#3180E01	#3180B01
#-----------------------------------------------	#3180E01
make_dir2()											#3180E01
{													#3180E01
  #----------------------							#3180E01
  # checks the dirtory								#3180E01
  #----------------------							#3180E01
  if [ ! -d $1 ]									#3180E01
  then												#3180E01
    #--------------------							#3180E01
    # create the directory							#3180E01
    #-------------------- 							#3180E01
    mkdir -m 555 -p $1 2> /dev/null					#3180E01
    if [ $? != 0 ]									#3180E01
    then											#3180E01
      echo "failed to make directory ($1)"			#3180E01
      return 1										#3180E01
    fi												#3180E01
    chgrp sys $1									#3180E01
    chmod $2 $1 2> /dev/null						#3180E01
  else												#3180E01
    return 2										#3180E01	#3180B01
  fi												#3180E01
  return 0											#3180E01
}													#3180E01

#-----------------------------------------------
# Version check
#   Replay wether updatable or not
#   usage: check_ver $version_file $check_file
#     0: able to update
#     1: unable to update
#-----------------------------------------------
check_ver()
{
  #--------------------------
  # get current version
  #--------------------------
  CURRENTVER=`grep $VERPREFIX $1`

  #--------------------------
  # compare with version list
  #--------------------------
  set -k `grep $CURRENTVER $2`
  for j
    do
      if [ "$j" = "$CURRENTVER" ]
      then
        #------------------------
        # find current version
        #------------------------
        return 0
      fi
    done

  return 1
}

#-----------------------------------------------
# Cleanup working directory
#-----------------------------------------------
cleanup_tmp()
{
  if [ -f $TEMP_DIR/$CHECK_FILE ]
  then
    rm -f $TEMP_DIR/$CHECK_FILE 2> /dev/null
  fi

  if [ -f $TEMP_DIR/$ARC_FILE ]
  then
    rm -f $TEMP_DIR/$ARC_FILE 2> /dev/null
  fi

  if [ -d $TEMP_DIR ]
  then
    cd    $INST_DIR
    rmdir $TEMP_DIR 2> /dev/null
  fi

  return 0
}

#-----------------------------------------------
# Main process
#-----------------------------------------------
CURRENT_DIR=`pwd`

#------------------------------
# Checks arguments
#------------------------------
if [ $# = 0 ]
then
  echo "Usage: $0 archive-file"
  exit 1
fi
if [ "$1" = "-?" ]
then
  echo "Usage: $0 archive-file"
  exit 0
fi

#------------------------------
# Shows current version
#------------------------------
if [ "$1" = "-v" ]
then
  if [ -f $INST_DIR/$VER_FILE ]
  then
    echo "$PPNAME"
    grep $VERPREFIX $INST_DIR/$VER_FILE
  else
    echo "[$PPNAME] is not installed."
  fi
  exit 0
fi

#------------------------------
# Checks the archive file
#------------------------------
if [ ! -f $1 ]
then 
  echo  "cannot access $1"
  exit 1
fi
LIB_ARCFILE=$1

#------------------------------
# Create install directories
#------------------------------
make_dir $HITACHI_DIR
check_return_code $?

make_dir $COM_DIR
check_return_code $?

make_dir $LIB_DIR
check_return_code $?

make_dir $LIB_ORG_DIR
check_return_code $?

make_dir $INST_DIR
check_return_code $?

make_dir $INST_DIR2                                                   #HNTRLib2
check_return_code $?                                                  #HNTRLib2

#make_dir $MMAP_DIR									#3180E01
#check_return_code $?								#3180E01
make_dir2 $MMAP_DIR 777								#3180E01

if [ $? = 1 ]										#3180E01
then												#3180E01
  cleanup_tmp										#3180E01
  echo "installation failure"						#3180E01
  exit 1											#3180E01
fi													#3180E01
#chmod 777 $MMAP_DIR 2> /dev/null					#3180E01

make_dir $CLASS_DIR
check_return_code $?

make_dir $SPOOL_DIR
check_return_code $?

chmod 755 $SPOOL_DIR 2> /dev/null	#360E01	#360201

make_dir $SPOOL_DIR2                                                  #HNTRLib2
check_return_code $?                                                  #HNTRLib2

chmod 755 $SPOOL_DIR2 2> /dev/null	#360E01

make_dir $LOGGING_DIR
check_return_code $?

#------------------------------
# Create an error log file
#------------------------------
echo "Start: $0 \c" > $ERROR_LOG
date >> $ERROR_LOG
chmod 644 $ERROR_LOG 2> /dev/null	#360201

#------------------------------
# Trap interruption
#------------------------------
trap 'interruption' 1 2 3

#------------------------------
# Stop daemon
#------------------------------
#if [ -x $KILL_PRG ]
#then
#  $KILL_PRG 2>> $ERROR_LOG > /dev/null
#fi

#------------------------------
# create a working directroy
#------------------------------
make_dir $TEMP_DIR
check_return_code $? "error 006: mkdir [$TEMP_DIR]"

#------------------------------
# copy an archive file
#------------------------------
cp -pf $LIB_ARCFILE $TEMP_DIR/$ARC_FILE 2>> $ERROR_LOG 
check_return_code $? \
    "error 001: cp -pf [$LIB_ARCFILE] [$TEMP_DIR]" \
    "cannot copy: $LIB_ARCFILE to $TEMP_DIR/$ARC_FILE"

#------------------------------
# pick up a check file from
#  the archive file
#------------------------------
cd  $TEMP_DIR

tar -xpf $ARC_FILE $CHECK_FILE 2>> $ERROR_LOG > /dev/null
check_return_code $? \
    "error 002: tar -xpf [$ARC_FILE] [$CHECK_FILE]" \
    "invalid file format: $ARC_FILE"

if [ ! -f $CHECK_FILE ]
then
  echo "error 003: [$CHECK_FILE] is not found" >> $ERROR_LOG
  echo "invalid file format: $ARC_FILE"
  cleanup_tmp
  exit 1
fi

#-----------------------------
# check version
#-----------------------------
if [ -f $INST_DIR/$VER_FILE ]
then
  echo "conf  007: found \c"   >> $ERROR_LOG
  grep $VERPREFIX $INST_DIR/$VER_FILE >> $ERROR_LOG
  check_ver $INST_DIR/$VER_FILE $CHECK_FILE
  if [ $? != 0 ]
  then
    echo "conf  004: newer version"   >> $ERROR_LOG
    echo "$PPNAME is already installed"
    cleanup_tmp
    exit 0
  fi
fi
cd $CURRENT_DIR

#-----------------------------
# create a history file
#-----------------------------
echo "Setup: \c" > $HIST_FILE
date >> $HIST_FILE
chmod 644 $HIST_FILE 2> /dev/null	#360201

#------------------------------                                      #HNTRLib2
# Stop daemon                                                        #HNTRLib2
#------------------------------                                      #HNTRLib2
process_exist=-1                                                     #F30A09
if [ -x $KILL_PRG ]                                                  #HNTRLib2
then                                                                 #HNTRLib2
  $KILL_PRG 2>> $ERROR_LOG > /dev/null                               #HNTRLib2
  process_exist=$?                                                   #HNTRLib2
fi                                                                   #HNTRLib2

#-----------------------------
# cleanup old files
#-----------------------------
cleanup_old_files

#-----------------------------
# install files
#-----------------------------
cd $ROOT_DIR 
tar -xpvf $TEMP_DIR/$ARC_FILE ./opt/hitachi 2> /dev/null > $HIST_FILE
check_return_code $? \
    "error 005: tar -xpvf [$TEMP_DIR/$ARC_FILE] [$INST_DIR]" \
    "expand error: $TEMP_DIR/$ARC_FILE"
cd $CURRENT_DIR

#------------------------------                                      #HNTRLib2
# Start daemon                                                       #HNTRLib2
#------------------------------                                      #HNTRLib2
if [ $process_exist = 0 ]                                            #HNTRLib2
then                                                                 #HNTRLib2
  if [ -x $MONITOR_PRG ]                                             #HNTRLib2
  then                                                               #HNTRLib2
    $MONITOR_PRG -d 2>> $ERROR_LOG > /dev/null < /dev/null           #380B19 #3190B06
  fi                                                                 #HNTRLib2
fi                                                                   #HNTRLib2

#-----------------------------		#360B03
# change directory mode				#360B03
#-----------------------------		#360B03
#360201 DELETE
#chmod 500 $BIN_DIR 2> /dev/null		#360B03
#360B04 DELETE
#chmod 500 $ETC_DIR 2> /dev/null		#360B03

#-----------------------------
# replace_files
#-----------------------------
replace_files

#-----------------------------
# non replace_files
#-----------------------------
if [ -f $CNF_TMPL ]
then
  if [ -f $CNF_FILE ]
  then
    rm -f $CNF_TMPL 2>> $ERROR_LOG
    echo "$CNF_FILE not copied" >> $HIST_FILE
  else
    mv $CNF_TMPL $CNF_FILE 2>> $ERROR_LOG
    echo "$CNF_FILE copied" >> $HIST_FILE
  fi
#360B04 DELETE
#  chmod 600 $CNF_FILE 2> /dev/null	#360B03
else
  echo "error 008: $CNF_TMPL not exist" >> $ERROR_LOG
  echo "$CNF_TMPL not exist"
fi
if [ -f $PPNAME_TMPL ]                                                #HNTRLib2
then                                                                  #HNTRLib2
  if [ -f $PPNAME_FILE ]                                              #HNTRLib2
  then                                                                #HNTRLib2
    rm -f $PPNAME_TMPL 2>> $ERROR_LOG                                 #HNTRLib2
    echo "$PPNAME_FILE not copied" >> $HIST_FILE                      #HNTRLib2
  else                                                                #HNTRLib2
    mv $PPNAME_TMPL $PPNAME_FILE 2>> $ERROR_LOG                       #HNTRLib2
    echo "$PPNAME_FILE copied" >> $HIST_FILE                          #HNTRLib2
  fi                                                                  #HNTRLib2
#360201 DELETE
#  chmod 600 $PPNAME_FILE 2> /dev/null	#360B03
else                                                                  #HNTRLib2
  echo "error 008: $PPNAME_TMPL not exist" >> $ERROR_LOG              #HNTRLib2
  echo "$PPNAME_TMPL not exist"                                       #HNTRLib2
fi                                                                    #HNTRLib2

#-----------------------------
# close log files
#-----------------------------
echo "$PPNAME \c" >> $HIST_FILE
grep $VERPREFIX $INST_DIR/$VER_FILE >> $HIST_FILE 2> /dev/null
echo "$PPNAME \c" >> $ERROR_LOG
grep $VERPREFIX $INST_DIR/$VER_FILE >> $ERROR_LOG 2> /dev/null
echo "info  000: installation is complete" >> $ERROR_LOG
echo "installation is complete"
cleanup_tmp
exit 0

