#! /bin/sh

#this is a proof-of-cencept to use info in /etc/mtree
#for the purpose of installing files onto a system
#making backups of the existing stuff
#
#I would like to see it integrated into pkg_install or mtree

#Globals
f_dir=`dirname $1 | awk '{ if ( $0 == "/" ) { print "."$0 } else if ( $0 == "." ) { print $0 } else { print "."$0"/" }}'`
f_base=`basename $1`
f_file=${f_dir}${f_base}

#create a single-line mtree-esque output
mtree_onefile()
{
	f_uname=`stat $1 | awk '{ print $5 }'`
	f_gname=`stat $1 | awk '{ print $6 }'`
	f_time=`stat -r $1 | awk '{ print $10".0" }'`
	f_sha1=`sha1 $1|awk '{ print $4 }'`

	tmp_type=`file $1 | awk '{ print $2 }'`
	case ${tmp_type} in
	directory)
		f_type="directory"
		f_mode=`stat -r $1 | awk '{ print $3 }' | cut -c3-`
		echo "${f_file} type=${f_type} uname=${f_uname} gname=${f_gname} mode=${f_mode}"
		;;
	*)
		f_type="file"
		f_mode=`stat -r $1 | awk '{ print $3 }' | cut -c4-`
		echo "${f_file} type=${f_type} uname=${f_uname} gname=${f_gname} mode=${f_mode} time=${f_time} sha1=${f_sha1}"
		;;
	esac
}

#search for an entry in /etc/mtree/set.*
mtree_searchfile()
{
	_set=`grep -Hn "$1 type=" /etc/mtree/set.* | awk -F: '{ print $1 }'`
	mt_set=`basename ${_set}`
	mt_line=`grep -Hn "$1 type=" /etc/mtree/set.* | awk -F: '{ print $2 }'`
	mt_entry=`grep -Hn "$1 type=" /etc/mtree/set.* | awk -F: '{ print $3 }'`
	return 0
}

mtree_basename()
{
	mt_base=`echo ${f_base} | awk -F"." '{ print $1 }'`
}

make_backup()
{
	mtree_basename $1
	mkdir /etc/mtree/${mt_base}_backup
	for f in `tar zxOf $1 ./set.${mt_base} | awk '{ print $1 }'` 
	do
		(cd /; cpio -plm $f /etc/mtree/${mt_base}_backup/)
		mtree_searchfile $f && echo $mt_entry >> /etc/mtree/${mt_base}_backup/backup_files.mtree
	done

}

remove_old_mtree_and_add_set()
{
	mtree_basename $1
	tar -zx -C /etc/mtree/${mt_base}_backup -f $1 ./set.${mt_base}
	for f in `cat /etc/mtree/${mt_base}_backup/set.${mt_base} | awk '{ print $1 }'` 
	do
		mtree_searchfile $f && sed -e 0${mt_line}d ${mt_set} >> /etc/mtree/new_${mt_set}
		mv /etc/mtree/new_${mt_set} /etc/mtree/${mt_set}
		tar -zx -C / -f $1 $f
	done
	mv /etc/mtree/${mt_base}_backup/set.${mt_base} /etc/mtree/
}
	

#mtree_onefile $1;
make_backup $1;
remove_old_mtree_and_add_set $1;

