#!/bin/ksh

###############################################
# Defines
###############################################

AWK=/usr/bin/awk
CAT=/usr/bin/cat
CP=/usr/bin/cp
CUT=/usr/bin/cut
ECHO=/usr/bin/echo
GREP=/usr/bin/grep
ID=/usr/bin/id
MKDIR=/usr/bin/mkdir
MV=/usr/bin/mv
PKGADD=/usr/sbin/pkgadd
PKGINFO=/usr/bin/pkginfo
RM=/usr/bin/rm
SED=/usr/bin/sed
UNIQ=/usr/bin/uniq

OSTYPE=`/bin/uname -s`
if [ "$OSTYPE" = "Linux" ]; then
  CP=/bin/cp
  ECHO=/bin/echo
  GREP=/bin/grep
  MV=/bin/mv
  RM=/bin/rm
  SED=/bin/sed
fi

BELL_CHAR='\a'

STATE_FILE="/etc/opt/SUNWps/PSConfig.properties"

VAROPT_DIR="/var/opt/SUNWps"

###############################################
# Get configuration from file
###############################################
GrabConfig() {
  local FILE=$1
  local KEY=$2
  local SEPARATOR=$3

  ANSWER=`$GREP "^$KEY$SEPARATOR" $FILE | $UNIQ | $SED -e "s/$KEY$SEPARATOR//"`
}

###############################################
# Install package
###############################################
PackageInstall() {
  local WORK_DIR=$1
  local BASE_DIR=$2
  local PACKAGES=$3
  local RESPONSE_FILE=""
  local ADMIN_FILE=""
  local PACKAGE=""

  RESPONSE_FILE="$WORK_DIR/package_response"
  $ECHO "\
BASEDIR=$BASE_DIR
" > $RESPONSE_FILE

  ADMIN_FILE="$WORK_DIR/package_install_admin"
  print "basedir=$BASE_DIR" > $ADMIN_FILE
  print "action=nocheck" >> $ADMIN_FILE
  print "conflict=nocheck" >> $ADMIN_FILE
  print "setuid=nocheck" >> $ADMIN_FILE
  print "idepend=nocheck" >> $ADMIN_FILE
  print "mail=" >> $ADMIN_FILE

  for PACKAGE in $PACKAGES; do
    $PKGINFO -q $PACKAGE
    if [ $? -eq 0 ]; then
      $ECHO "Adding $PACKAGE..."
      $PKGADD -n -d . -a $ADMIN_FILE -r $RESPONSE_FILE $PACKAGE > /dev/null 2>&1
      if [ $? -ne 0 ]; then
	$ECHO "$PACKAGE install failed. $BELL_CHAR"
	exit 1
      fi
    else
      $ECHO "$PACKAGE is already installed."
    fi
  done
}

###############################################
# Main
###############################################

if [ `$ID | $AWK '{print $1}'` != "uid=0(root)" ]; then
  $ECHO "You must be root user. $BELL_CHAR"
  exit 1
fi

if [ ! -f $STATE_FILE ]; then
  $ECHO "Error: $STATE_FILE does not exist. $BELL_CHAR"
  exit 1
fi

GrabConfig $STATE_FILE "JDK_DIR" "="
if [ "$ANSWER" != "" ]; then
  JDK_DIR=$ANSWER
else
  $ECHO "Error: Cannot determine JDK_DIR. $BELL_CHAR"
  exit 1
fi
GrabConfig $STATE_FILE "DEPLOY_TYPE" "="
if [ "$ANSWER" != "" ]; then
  DEPLOY_TYPE=$ANSWER
else
  $ECHO "Error: Cannot determine DEPLOY_TYPE. $BELL_CHAR"
  exit 1
fi
if [ "$DEPLOY_TYPE" = "SUNONE" ]; then
  GrabConfig $STATE_FILE "DEPLOY_DIR" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_DIR=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_DIR. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_DOMAIN" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_DOMAIN=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_DOMAIN. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_ADMIN" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_ADMIN=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_ADMIN. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_ADMIN_PORT" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_ADMIN_PORT=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_ADMIN_PORT. $BELL_CHAR"
    exit 1
  fi
elif [ "$DEPLOY_TYPE" = "WEBLOGIC" ]; then
  GrabConfig $STATE_FILE "DEPLOY_DIR" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_DIR=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_DIR. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_DOMAIN" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_DOMAIN=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_DOMAIN. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_ADMIN_PROTOCOL" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_ADMIN_PROTOCOL=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_ADMIN_PROTOCOL. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_ADMIN_HOST" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_ADMIN_HOST=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_ADMIN_HOST. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_ADMIN_PORT" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_ADMIN_PORT=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_ADMIN_PORT. $BELL_CHAR"
    exit 1
  fi
elif [ "$DEPLOY_TYPE" = "WEBSPHERE" ]; then
  GrabConfig $STATE_FILE "DEPLOY_DIR" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_DIR=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_DIR. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_VIRTUAL_HOST" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_VIRTUAL_HOST=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_VIRTUAL_HOST. $BELL_CHAR"
    exit 1
  fi
  GrabConfig $STATE_FILE "DEPLOY_NODE" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_NODE=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_NODE. $BELL_CHAR"
    exit 1
  fi
else
  GrabConfig $STATE_FILE "DEPLOY_DIR" "="
  if [ "$ANSWER" != "" ]; then
    DEPLOY_DIR=$ANSWER
  else
    $ECHO "Error: Cannot determine DEPLOY_DIR. $BELL_CHAR"
    exit 1
  fi
fi
GrabConfig $STATE_FILE "IDSAME_BASEDIR" "="
if [ "$ANSWER" != "" ]; then
  IDSAME_BASEDIR=$ANSWER
else
  $ECHO "Error: Cannot determine IDSAME_BASEDIR. $BELL_CHAR"
  exit 1
fi
GrabConfig $STATE_FILE "BASEDIR" "="
if [ "$ANSWER" != "" ]; then
  PS_BASEDIR=$ANSWER
else
  $ECHO "Error: Cannot determine BASEDIR. $BELL_CHAR"
  exit 1
fi
GrabConfig $STATE_FILE "SERVER_PROTOCOL" "="
if [ "$ANSWER" != "" ]; then
  SERVER_PROTOCOL=$ANSWER
else
  $ECHO "Error: Cannot determine SERVER_PROTOCOL. $BELL_CHAR"
  exit 1
fi
GrabConfig $STATE_FILE "SERVER_HOST" "="
if [ "$ANSWER" != "" ]; then
  SERVER_HOST=$ANSWER
  SERVER_HOSTNAME=${SERVER_HOST%%.*}
else
  $ECHO "Error: Cannot determine SERVER_HOST. $BELL_CHAR"
  exit 1
fi
GrabConfig $STATE_FILE "SERVER_PORT" "="
if [ "$ANSWER" != "" ]; then
  SERVER_PORT=$ANSWER
else
  $ECHO "Error: Cannot determine SERVER_PORT. $BELL_CHAR"
  exit 1
fi

DEPLOY_ADMIN_PASSWORD=""
IS_ADMIN_PASSWORD=""
PACKAGES=""

while [ "$1" != "" ]; do
  if [ "$1" = "-deploy_admin_password" ]; then
    if [ "$2" = "" ] || [ `$ECHO $2 | $CUT -c1` = '-' ]; then
      $ECHO "Error: Missing value for -deploy_admin_password. $BELL_CHAR"
      exit 1
    else
      DEPLOY_ADMIN_PASSWORD=$2      
      shift; shift
    fi
  elif [ "$1" = "-is_admin_password" ]; then
    if [ "$2" = "" ] || [ `$ECHO $2 | $CUT -c1` = '-' ]; then
      $ECHO "Error: Missing value for -is_admin_password. $BELL_CHAR"
      exit 1
    else
      IS_ADMIN_PASSWORD=$2      
      shift; shift
    fi
  else
    PACKAGES="$PACKAGES $1"
    shift
  fi
done

if [ "$PACKAGES" = "" ]; then
  $ECHO "No packages specified. $BELL_CHAR"
  exit 1
fi

PORTLET_APP_NAME="portletsamples"

WARFILE_DIR="$PS_BASEDIR/SUNWps/samples/portlet/original"
WARFILE="$PORTLET_APP_NAME.war"

if [ ! -f $WARFILE_DIR/$WARFILE ]; then
  $ECHO "$WARFILE_DIR/$WARFILE not found. $BELL_CHAR"
  exit 1
fi

$ECHO "Preparing $WARFILE..."

$CP $WARFILE_DIR/$WARFILE $WARFILE_DIR/$WARFILE.save

PATCH_DIR="$VAROPT_DIR/tmp/portlet/patch"
WORK_DIR="$VAROPT_DIR/tmp/portlet/patch/work"

$MKDIR -p $WORK_DIR
$MV $WARFILE_DIR/$WARFILE $WORK_DIR

CURRENT_DIR="$PWD"
cd $WORK_DIR

$JDK_DIR/bin/jar xf $WARFILE
$RM $WARFILE

cd $CURRENT_DIR

PackageInstall $PATCH_DIR $WORK_DIR "$PACKAGES"

$ECHO "Preparing $WARFILE..."

CURRENT_DIR="$PWD"
cd $WORK_DIR

$JDK_DIR/bin/jar cf $WARFILE_DIR/$WARFILE *

cd $CURRENT_DIR

$RM -rf $PATCH_DIR

FILE="/etc/opt/SUNWam/config/AMConfig.properties"
ADMIN_DN=`$GREP "^com.sun.identity.authentication.super.user=" $FILE | $SED -e "s/com.sun.identity.authentication.super.user=//"`
ROOT_DN=`$GREP "^com.iplanet.am.rootsuffix=" $FILE | $SED -e "s/com.iplanet.am.rootsuffix=//"`
ORG_DN=`$GREP "^com.iplanet.am.defaultOrg=" $FILE | $SED -e "s/com.iplanet.am.defaultOrg=//"`
if [ "$ORG_DN" != "$ROOT_DN" ]; then
  ORG_DN="$ORG_DN,$ROOT_DN"
fi

$ECHO "Undeploying $PORTLET_APP_NAME..."
$PS_BASEDIR/SUNWps/bin/pdeploy undeploy -u "$ADMIN_DN" -w "$IS_ADMIN_PASSWORD" -g -p "$DEPLOY_ADMIN_PASSWORD" $PORTLET_APP_NAME

$ECHO "Deploying $WARFILE..."
FILE="/etc/opt/SUNWps/portlet/userInfoMapping.properties"
$PS_BASEDIR/SUNWps/bin/pdeploy deploy -u "$ADMIN_DN" -w "$IS_ADMIN_PASSWORD" -g -p "$DEPLOY_ADMIN_PASSWORD" -g -f $FILE "$WARFILE_DIR/$WARFILE"
exit $?
