
#	ATT: ident	"sadmin:etc/savecpio	2.7"

#ident	"@(#)sadmin/etc:savecpio	25.1"

#	Mechanism to save file-systems in cpio format on tape.

#!	chmod +x ${file}

rmkdir()
{
if [ -d $1 ]
then return
fi
D=`dirname $1`
if [ ! -d "$D" ]
then
	rmkdir $D
fi
/bin/mkdir $1
}

complete=yes
ddrive=/dev/rmt1
msg=
L=
cpiocmd=cpio
verbose=-V
exit=
while [ -n "$1" ]
do
	case "$1" in
	-d )
		shift
		ddrive=$1
		;;
	-v )
		verbose=-v
		;;
	-c )
		complete=yes
		;;
	-i )
		complete=
		;;
	-M )
		shift
		msg="MRemove medium.
$1
Mount the tape.
Press <RETURN> when ready. [q] "
		;;
	-C )
		if [ -n "$2" ]
		then
			cpiocmd=$2
		fi
		shift
		;;
	-* )
		echo >&2 "$0:  illegal flag argument '$1'"
		exit 1
		;;
	* )
		break
	esac
	shift
done

if [ $# -lt 1  -o  -z "${ddrive}" ]
then
	echo >&2 "Usage:  $0 -c|i -d device  \\
	[ -v ] [ -M msg ] [ -C cmd ] file-system ..."
	exit 1
fi

for d
do
	if [ -z "`/etc/mount  |  grep \"^${d} \"`" ]
	then
		echo "$0:  ${d}:  Not a mounted file system."
		exit=1
	fi
done
if [ ${exit} ]
then
	exit ${exit}
fi
mounted=`/etc/mount  |  grep " ${ddrive} "`
if [ -n "${mounted}" ]
then
	echo "	A file system is still mounted on the ${ddrive}.
${mounted}
	Save not performed.  Stop."
	exit 1
fi

SAVEDIR=/etc/save.d

if [ ! -d ${SAVEDIR}/timestamp ]
then
	mkdir ${SAVEDIR} ${SAVEDIR}/timestamp 2>/dev/null
fi
cd ${SAVEDIR}/timestamp

trap exit 1 2 15
trap 'rm -f /tmp/$$.?.save; find ${SAVEDIR}/timestamp -name "$$*" -exec rm {} \;' 0

if [ ${complete} ]
then
	for dir
	{
		if [ ${dir} = / ]
		then
			DIR=:root:
			mounted=`/etc/mount  |  cut -d' ' -f1  |  fgrep -vx /`
			echo "${mounted}" > fgrep.tmp
			dirlist="${dirlist} `/bin/ls -d /*  |  fgrep -vx -f fgrep.tmp`"
			rm -f fgrep.tmp
		else
			DIR=`expr "${dir}" : '/\(.*\)'`
			dirlist="${dirlist} ${dir}"
		fi
		J=`dirname ${DIR}`
		K=`basename ${DIR}`
		L="$L $J/$$$K"
		rmkdir $J
		date +'%a. %D, %r' >$J/$$$K
	}

	#	Finding and sorting in a loop allows for shorter sorts,
	#	file systems are backed up in order requested, and
	#	find of 2nd-thru-Nth file system overlaps with cpio output.
	#	find(1) output is sorted to make looking for file names easier.
	for d in ${dirlist}
	do
		find ${d} -depth -print  |  sort
	done  |
		${cpiocmd} -oa"${msg}" ${verbose} -O ${ddrive}
else
	sed '	/^#/d
		s/.*/\\;&;d/
	    ' ${SAVEDIR}/except >/tmp/$$.3.save 2>/dev/null
	>/tmp/$$.2.save
	for dir
	{
		if [ ${dir} = / ]
		then
			DIR=:root:
			mounted=`/etc/mount  |  cut -d' ' -f1  |  fgrep -vx /`
			echo "${mounted}" > fgrep.tmp
			dirlist=`/bin/ls -d /*  |  fgrep -vx -f fgrep.tmp`
			rm -f fgrep.tmp
		else
			DIR=`expr "${dir}" : '/\(.*\)'`
			dirlist=${dir}
		fi
		lastsave=`cat -s ${DIR}`
		if [ -z "${lastsave}" ]
		then
			echo >&2 "$0:  ${SAVEDIR}/timestamp/${DIR} does not exist or empty.
			Complete backup ( ${cpiocmd} ${dir} ) needs to be run first."
			exit 1
		fi

		J=`dirname ${DIR}`
		K=`basename ${DIR}`
		L="$L $J/$$$K"
		date +'%a. %D, %r' >$J/$$$K
		find ${dirlist} -depth -newer ${DIR} -print  |
			sed -f /tmp/$$.3.save  |
			sort >/tmp/$$.4.save
		if [ ! -s /tmp/$$.4.save ]
		then
			echo "no files to save since ${lastsave} on ${dir}"
		else
			echo `wc -l </tmp/$$.4.save` \
				"files to save since ${lastsave} on ${dir}"
			cat /tmp/$$.4.save >>/tmp/$$.2.save
			rm /tmp/$$.4.save
		fi
	}
	if [ ! -s /tmp/$$.2.save ]
	then
		exit
	fi

	${cpiocmd} -oa"${msg}" ${verbose} -O ${ddrive} </tmp/$$.2.save
fi
if [ $? != 0 ]
then
	exit 1
fi
for f in $L
{
	J=`dirname $f`
	K=`basename $f`
	mv -f $J/$K $J/`expr $K : "$$\(.*\)"`
}
