: $Workfile:   msfsnap.sh  $ $Revision:   1.0  $
#! /bin/sh
#**********************************************************************#
#*                                                                    *#
#* Copyright (c) 2003 by Sun Microsystems, Inc.                       *#
#* All rights reserved.                                               *#
#*                                                                    *#
#**********************************************************************#

#---
# This script assumes that it is located in the bin directory of the
# installed MSF product. If it is moved, then the MSF_HOME environment
# variable can be set to override the calculations here.
#---

#
# Determine where the installation of MSF is.
#
if [ "$MSF_HOME"A = "A" ]; then
    D=`dirname \`which $0\``
    B=`basename \`which $0\``
    abspath="`cd \"$D\" 2>/dev/null && pwd || echo \"$D\"`/$B"
    tmp1=`dirname $abspath`
    MSF_HOME=`dirname $tmp1`
fi
if [ ! -f "${MSF_HOME}/lib/secrt.jar" ]; then
    echo "Could not find runtime under '"${MSF_HOME}"'"
    exit 1
fi
if [ "$MSF_INSTANCE"A = "A" ]; then
    echo "Must specify value for environment variable MSF_INSTANCE"
    exit 1
else
    if [ ! -f "${MSF_HOME}/config/${MSF_INSTANCE}/MSFconfig.properties" ]; then
        echo "No configuration under '"${MSF_HOME}/config/${MSF_INSTANCE}"'"
        exit 1
    fi
fi

LS=/bin/ls
RM=/bin/rm
RMDIR=/bin/rmdir
OUTDIRR=""
USERID=""
USAGE="usage: msfsnap [-d directory] [-u username]"
set -- `getopt hd:u: $*`

while [ "$1" != "--" ]
do
    if [ "$1" = "-h" ]
    then
	echo "MSF snapshot tool"
	echo $USAGE
	echo "   -d   directory where snaps are to be stored"
	echo "   -u   username for 'msfserver -p'; password will be prompted for"
        exit 0
    fi
    if [ "$1" = "-d" ]
    then
	shift
	if [ -d $1 ]
	then
	    if [ -w $1 ]
	    then
		OUTDIRR=$1
	    else
		echo "Directory " $1 " specified in -d option exists but is not writable"
		exit 2
	    fi
	else
	    mkdir -p -m 777 $1
	    if [ "$?" != 0 ]
	    then
		echo "Directory " $1 " specified in -d option could not be created"
		exit 3
	    else
		OUTDIRR=$1
	    fi
	fi
    else
        if [ "$1" = "-u" ]
        then
	    shift
	    USERID=$1
        else
# illegal option encountered
	    echo $USAGE
	    exit 1
	fi
    fi
    shift
done

if [ "$OUTDIRR" = "" ]
then
    if [ -n "$MSFSNAPDIR" ]
    then
        if [ -d $MSFSNAPDIR ]
        then
            if [ -w $MSFSNAPDIR ]
            then
                OUTDIRR=$MSFSNAPDIR
            else
                echo "Directory " $MSFSNAPDIR " exists but is not writable"
		exit 4
            fi
        else
            mkdir -p -m 777 $MSFSNAPDIR
            if [ "$?" != 0 ]
            then
                echo "Directory " $MSFSNAPDIR " could not be created"
		exit 5
            else
                OUTDIRR=$MSFSNAPDIR
            fi
        fi
    fi
fi

if [ "$OUTDIRR" = "" ]
then
    echo "Usage: msfsnap [-d <directory>] [-u userid]"
    exit 1
fi

# only prompt for SecurityServer password if userid provided on command line
if [ "$USERID" != "" ]
then
    echo "MSF Login password: "
    stty -echo
    read PASSWORD
    stty echo
fi

TIMESTAMP=`date '+%m%d_%H%M%S'`
OUTFILENAME="snapshot.$TIMESTAMP"
OUTFILEDIR="$OUTDIRR/$OUTFILENAME"
OUTFILE="$OUTFILEDIR/$OUTFILENAME.txt"

#make the directory for the msfsnap
#if mkdir failed do not write out any snapshot (probably already exists!)
mkdir $OUTFILEDIR
if [ "$?" != 0 ]
then
        exit $?
fi

AWK='nawk'
NULL_DEVICE=/dev/null
sh -c "$AWK ' '" 1>$NULL_DEVICE 2>&1 || AWK="awk"
PS='/bin/ps -ealf'
if [ `uname -s` = "SunOS" ]
then
    if [ `uname -r` -lt 5 ]
    then
        PS='ps -aegxuw'
     fi
fi

touch $OUTFILE || exit 1
chmod 200 $OUTFILE
echo Writing snapshot to $OUTFILE
TITLE=    
sep () {
echo " " ;
echo "********************************************************************";
echo $TITLE ;
echo " " ;
       }
(
echo "Snapshot taken at "`date`
TITLE="VERSION file contents";sep
cat $MSF_HOME/VERSION
TITLE="uname -a";sep
uname -a
TITLE="environment variables";sep
#env | egrep 'EMP|^JDK|^PATH|^CLASS|^ORACLE'  
env | egrep 'MSF|^PATH|^CLASS|^ORACLE'  
TITLE="1st ps -eaf at `date`";sep
$PS | sed -n '1p'
$PS | sort |
        $AWK '{
              if ($1 != psarg) { printf("\n") }
              print $0
              psarg=$1
        }'
TITLE="Manifest contents of $MSF_HOME/lib/secrt.jar";sep
$RM -f META-INF/MANIFEST.MF
jar xf $MSF_HOME/lib/secrt.jar META-INF/MANIFEST.MF
cat META-INF/MANIFEST.MF
TITLE="Manifest contents of $MSF_HOME/lib/secrtpa.jar";sep
jar xf $MSF_HOME/lib/secrtpa.jar META-INF/MANIFEST.MF
cat META-INF/MANIFEST.MF
$RM -f META-INF/MANIFEST.MF
$RMDIR META-INF
if [ "$USERID" != "" ]
then
    TITLE="msfserver -p";sep
    msfserver -p $USERID $PASSWORD 2>&1
else
    TITLE="msfserver -np";sep
    msfserver -np 2>&1
fi
TITLE="ls -lR $MSF_HOME";sep
ls -lR $MSF_HOME
TITLE="2nd ps -eaf at `date`";sep
$PS | sed -n '1p'
$PS | sort |
        $AWK '{
              if ($1 != psarg) { printf("\n") }
              print $0
              psarg=$1
        }'
TITLE="END OF FILE";sep
chmod 660 $OUTFILE
) >> $OUTFILE
echo "Copying java.policy file contents"
#cp $JDKROOT/lib/security/java.policy  $OUTFILEDIR/java.policy
cp $MSF_HOME/config/java.policy  $OUTFILEDIR/java.policy
#echo "Copying jaas.policy file contents"
#cp $EMPSECURITY/lib/jaas.policy  $OUTFILEDIR/jaas.policy
echo "Copying jaas.config file contents"
#cp $EMPSECURITY/lib/jaas.config  $OUTFILEDIR/jaas.config
cp $MSF_HOME/config/jaas.config  $OUTFILEDIR/jaas.config
echo "Copying java.security file contents"
#cp $JDKROOT/lib/security/java.security  $OUTFILEDIR/java.security
cp $MSF_HOME/config/java.security  $OUTFILEDIR/java.security
echo "Copying MSFconfig.properties file contents"
#cp $JDKROOT/lib/MSFconfig.properties $OUTFILEDIR/MSFconfig.properties
cp $MSF_HOME/config/$MSF_INSTANCE/MSFconfig.properties $OUTFILEDIR/MSFconfig.properties
#LOGPATH=`grep logDirectory $JDKROOT/lib/MSFconfig.properties|sed 's/.*=//g'`
LOGPATH=`grep logDirectory $MSF_HOME/config/$MSF_INSTANCE/MSFconfig.properties|sed 's/.*=//g'`
LOGTRC=`$LS -At $LOGPATH|sed -n '1,2p'|sed -n '/SecTrc/p'|sed -n '1,1p'`
LOGMSG=`$LS -At $LOGPATH|sed -n '1,2p'|sed -n '/SecMsg/p'|sed -n '1,1p'`
if [ $LOGTRC ]
then
    echo "Copying SecurityLog Trace file " $LOGPATH/$LOGTRC
    cp $LOGPATH/$LOGTRC $OUTFILEDIR/$LOGTRC
fi
if [ $LOGMSG ]
then
    echo "Copying SecurityLog Message file " $LOGPATH/$LOGMSG
    cp $LOGPATH/$LOGMSG $OUTFILEDIR/$LOGMSG
fi

#use zip if found, else tar and gzip, else tar and compress
type zip > $NULL_DEVICE 2>> $NULL_DEVICE
if [ "$?" = 0 ]
then
	COMPRESS="zip"
	OUTMSG="Writing snapshot to $OUTDIRR/MSF$OUTFILENAME.zip"
else
	type gzip > $NULL_DEVICE 2>> $NULL_DEVICE
	if [ "$?" = 0 ]
	then
		COMPRESS="gzip"
		OUTMSG="Writing snapshot to $OUTDIRR/MSF$OUTFILENAME.tar.gz"
	else
		COMPRESS="compress"
		OUTMSG="Writing snapshot to $OUTDIRR/MSF$OUTFILENAME.tar.Z"
	fi
fi
echo "$OUTMSG"

#compress the directory
cd $OUTDIRR > $NULL_DEVICE 2>> $NULL_DEVICE
if [ "$COMPRESS" = "zip" ]
then
	$COMPRESS -q -r MSF$OUTFILENAME.zip $OUTFILENAME > $NULL_DEVICE 2>> $NULL_DEVICE
else
	tar -cf MSF$OUTFILENAME.tar $OUTFILENAME > $NULL_DEVICE 2>> $NULL_DEVICE
	$COMPRESS MSF$OUTFILENAME.tar > $NULL_DEVICE 2>> $NULL_DEVICE
fi

#remove all the files in the directory, and remove the directory
#if for some reason we cannot cd to the directory, then do not delete anything
cd $OUTFILEDIR > $NULL_DEVICE 2>> $NULL_DEVICE
if [ "$?" = 0 ]
then
	echo "Removing all files under " $OUTFILEDIR
	$RM -f *                    > $NULL_DEVICE 2>> $NULL_DEVICE
	cd ..                           > $NULL_DEVICE 2>> $NULL_DEVICE
	echo "Removing directory " $OUTFILEDIR
	$RMDIR $OUTFILEDIR              > $NULL_DEVICE 2>> $NULL_DEVICE
fi

