misc/145962: [nanobsd] improved cfg save script

Aragon Gouveia aragon at phat.za.net
Fri Apr 23 00:50:05 UTC 2010


>Number:         145962
>Category:       misc
>Synopsis:       [nanobsd] improved cfg save script
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Apr 23 00:50:05 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Aragon Gouveia
>Release:        FreeBSD 8.0-STABLE amd64
>Organization:
>Environment:
System: FreeBSD igor.geek.sh 8.0-STABLE FreeBSD 8.0-STABLE #0: Mon Mar 8 01:27:41 SAST 2010 toor at igor.geek.sh:/usr/obj/usr/src/sys/IGOR amd64


	
>Description:
	NanoBSD has a utility shell script called save_cfg which helps keep /cfg updated with the modified configuration files in /etc.  I have written an improved version with the following features:

	* Recurses directories.
	* Only requires file arguments the first time the file/directory is added to /cfg.
	* Handles file deletions.
	* Is named "cfgsync" so is much easier to type.
>How-To-Repeat:
	
>Fix:

	

--- cfgsync begins here ---
#!/bin/sh

set -e

rundir="$(pwd)/"
trap "umount /cfg" 1 2 3 15 EXIT
mount /cfg
for i in "$@"; do
	if [ -n "${i%%/*}" ]; then
		# relative (to rundir) path given
		if [ -n "${rundir%%/etc/*}" ]; then
			echo "${i} not under /etc -- skipping" 1>&2
			continue
		fi
		etcfile="${rundir}${i}"
		cfgfile="/cfg/${rundir##*/etc/}${i}"
	else
		# absolute path given
		if [ -z "${i%%/etc/*}" ]; then
			echo "${i} not under /etc -- skipping" 1>&2
			continue
		fi
		etcfile="${i}"
		cfgfile="/cfg/${i##*/etc/}"
	fi
	cfgdir=$(dirname ${cfgfile})
	if [ ! -f ${etcfile} ]; then
		echo "${i} not a file -- skipping" 1>&2
		continue
	fi
	if ! cmp -s ${etcfile} ${cfgfile}; then
		if [ ! -d ${cfgdir} ]; then
			mkdir -pv ${cfgdir}
		fi
		cp -pfv ${etcfile} ${cfgfile}
	fi
done
for i in $( find /cfg -type f ); do
	etcfile="/etc/${i##*/cfg/}"
	cfgfile="${i}"
	if [ ! -f ${etcfile} ]; then
		echo -n "${etcfile} disappeared.  Delete from /cfg? [y/N] "
		read delconfirm
		if [ "${delconfirm}" = "y" ]; then
			echo -n "deleting "
			rm -fv ${cfgfile}
		fi
	elif ! cmp -s ${etcfile} ${cfgfile}; then
		cp -pfv ${etcfile} ${cfgfile}
	fi
done
--- cfgsync ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list