#! /bin/sh
#
# Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#
# ident	"@(#)bsmconv.sh	1.22	03/10/31 SMI"
#

PROG=bsmconv
STARTUP=/etc/security/audit_startup
DEVALLOC=/etc/security/device_allocate
DEVMAPS=/etc/security/device_maps
TEXTDOMAIN="SUNW_OST_OSCMD"
export TEXTDOMAIN

permission()
{
WHO=`id | cut -f1 -d" "`
if [ ! "$WHO" = "uid=0(root)" ]
then
	form=`gettext "%s: ERROR: you must be super-user to run this script."`
	printf "${form}\n" $PROG
	exit 1
fi

RESP="x"
while [ "$RESP" != `gettext "y"` -a "$RESP" != `gettext "n"` ]
do
gettext "This script is used to enable the Basic Security Module (BSM).\n"
form=`gettext "Shall we continue with the conversion now? [y/n]"`
echo "$form \c"
read RESP
done

if [ "$RESP" = `gettext "n"` ]
then
	form=`gettext "%s: INFO: aborted, due to user request."`
	printf "${form}\n" $PROG
	exit 2
fi
}

# Do some sanity checks to see if the arguments to bsmconv
# are, in fact, root directories for clients.
sanity_check()
{
for ROOT in $@
do

	if [ -d $ROOT -a -w $ROOT -a -f $ROOT/etc/system -a -d $ROOT/usr ]
	then
		# There is a root directory to write to,
		# so we can potentially complete the conversion.
		:
	else
		form=`gettext "%s: ERROR: %s doesn't look like a client's root."`
		printf "${form}\n" $PROG $ROOT
		form=`gettext "%s: ABORTED: nothing done."`
		printf "${form}\n" $PROG
		exit 4
	fi
done
}

# bsmconvert
#	All the real work gets done in this function

bsmconvert()
{

# If there is not startup file to be ready by /etc/rc2.d/S99audit,
# then make one.

form=`gettext "%s: INFO: checking startup file."`
printf "${form}\n" $PROG 
if [ ! -f ${ROOT}/${STARTUP} ]
then
	cat > ${ROOT}/${STARTUP} <<EOF
#!/bin/sh
/usr/bin/echo "Starting BSM services."
/usr/sbin/deallocate -Is
/usr/sbin/auditconfig -conf
/usr/sbin/auditconfig -aconf
/usr/sbin/auditconfig -setpolicy +cnt
EOF
fi

if [ ! -f ${ROOT}/${STARTUP} ]
then
	form=`gettext "%s: ERROR: no %s file."`
	printf "${form}\n" $PROG $STARTUP
	form=`gettext "%s: Continuing ..."`
	printf "${form}\n" $PROG
fi

chgrp sys ${ROOT}/${STARTUP} > /dev/null 2>&1
chmod 0744 ${ROOT}/${STARTUP} > /dev/null 2>&1

# move aside volume manager init file to prevent
# running volume manager when bsm is enabled
#
# find where volmgt is installed
#
name=`nawk -F '=| +' '/S[0-9][0-9]volmgt/ {print $1}' ${ROOT}/var/sadm/install/contents`

if [ -n "$name" ]
then
  if [ -r ${ROOT}${name} ]
  then
    form=`gettext "%s: INFO: move aside %s%s."`
    printf "${form}\n" $PROG $ROOT $name
    if [ ! -d ${ROOT}/etc/security/spool ]
    then
    	mkdir ${ROOT}/etc/security/spool
	if [ $? != 0 ]
	then
	    form=`gettext "%s: ERROR: unable to create %s/etc/security/spool"`
	    printf "${form}\n" $PROG $ROOT
	    exit 5
	fi
    fi
    mv ${ROOT}${name} ${ROOT}/etc/security/spool
  fi
fi

# Turn on auditing in the loadable module

form=`gettext "%s: INFO: turning on audit module."`
printf "${form}\n" $PROG
if [ ! -f ${ROOT}/etc/system ]
then
	echo "" > ${ROOT}/etc/system
fi

grep -v "c2audit:audit_load" ${ROOT}/etc/system > /tmp/etc.system.$$
echo "set c2audit:audit_load = 1" >> /tmp/etc.system.$$
mv /tmp/etc.system.$$ ${ROOT}/etc/system
grep "set c2audit:audit_load = 1" ${ROOT}/etc/system > /dev/null 2>&1
if [ $? -ne 0 ]
then
    form=`gettext "%s: ERROR: cannot 'set c2audit:audit_load = 1' in %s/etc/system"`
    printf "${form}\n" $PROG $ROOT
    form=`gettext "%s: Continuing ..."`
    printf "${form}\n" $PROG
fi

# Initial device allocation files

form=`gettext "%s: INFO: initializing device allocation files."`
printf "${form}\n" $PROG
if [ ! -f ${ROOT}/$DEVALLOC ]
then
	mkdevalloc > ${ROOT}/$DEVALLOC
fi
if [ ! -f $DEVMAPS ]
then
	mkdevmaps > ${ROOT}/$DEVMAPS
fi

}

# main loop

permission
sanity_check
if [ $# -eq 0 ]
then
	ROOT=
	bsmconvert
	echo
	gettext "The Basic Security Module is ready.\n"
	gettext "If there were any errors, please fix them now.\n"
	gettext "Configure BSM by editing files located in /etc/security.\n"
	gettext "Reboot this system now to come up with BSM enabled.\n"
else
	for ROOT in $@
	do
		conv_host=`basename $ROOT`
		form=`gettext "%s: INFO: converting host %s ..."`
		printf "${form}\n" $PROG $conv_host
		bsmconvert $ROOT
		form=`gettext "%s: INFO: done with host %s"`
		printf "${form}\n" $PROG $conv_host
	done
	echo
	gettext "The Basic Security Module is ready.\n"
	gettext "If there were any errors, please fix them now.\n"
	gettext "Configure BSM by editing files located in /etc/security\n"
	gettext "in the root directories of each host converted.\n"
	gettext "Reboot each system converted to come up with BSM active.\n"
fi

exit 0
