>Number:         157533
>Category:       misc
>Synopsis:       [nanobsd][patch] save_cfg improvements
>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:   Thu Jun 02 17:30:12 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Alex Bakhtin
>Release:        
>Organization:
>Environment:
>Description:
I have written the improved nanobsd save_cfg script with the following features:

1. It recursivelly handles new (modified by user) files in /etc and ask user 
what to do.
2. It recursivelly handles file deletion from /etc and ask user what to do.
3. It keeps 'ignore' list for files that user decided to never add to /cfg

I'm pretty sure that this script is a little bit better than 
http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/145962 because it doesn't 
require to remember - which files was modified. It scans the whole /etc, and if 
it found new file - it ask user - what to do with it.
User can:
a) Add file to /cfg.
b) Skip this file for current script run
c) Add this file to ignore list (/cfg/.ignore) and skip this file for all 
script runs.

One of the most annoying things I found in nanobsd administration is that user 
have to keep in mind ALL files he is going to add to /cfg. This script was used 
on about 10 nanobsd hosts for 1.5 years in production environment and is 
extremely helpfull. The chance that after adding some new configuration file to 
nanobsd user would forget to add it to /cfg was decreased drammatically.

Please consider adding this to Files.


>How-To-Repeat:

>Fix:


Patch attached with submission follows:

#!/bin/sh
#
# Copyright (c) 2006 Mathieu Arnold
# Copyright (c) 2010 Alex Bakhtin
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD: src/tools/tools/nanobsd/Files/root/save_cfg,v 1.1.4.1 2009/08/03 
08:13:06 kensmith Exp $
#

set -e

trap "umount /cfg" 1 2 15 EXIT
mount /cfg
(
cd /etc
for filename in "$@" `find * -type f`
do
        if [ ! -f /cfg/$filename -a ! -f /cfg/.ignore/$filename ]
        then

                #
                # If file doesn't exist in /cfg and file is not in the 'ignore' 
list
                # then check if this file is exactly the same as original file
                # in nanobsd image
                #
                if ! cmp -s /etc/$filename /conf/base/etc/$filename 
                then
                        file_path=`echo "$filename" | sed 's/\/[^/]*$//'`
                        if [ $file_path != $filename ]
                        then
                                if [ ! -d /etc/$file_path ]
                                then
                                        # should never go here unless we have 
some errors in
                                        # sed script extracting file path
                                        echo "Error: Path /etc/$file_path is 
not directory."
                                        exit 1;
                                fi
                        fi

                        #
                        # Ask user - how should we handle this file.
                        # Add to cfg (y/n/i)?
                        #       y) -> save this file in /cfg
                        #       n) -> do not save this file in /cfg for current 
script invocation ONLY
                        #       i) -> add file to ignore list (/cfg/.ignore 
hiereachy) and never save
                        #             try to add this file to /cfg.
                        #
                        # touch is ised to add files to /cfg to keep the script 
flow straight and easy
                        #
                        read -p "New file /etc/$filename found. Add to /cfg 
(y/n/i)? " key
                        case "$key" in
                        [yY])
                                if [ $file_path != $filename ]
                                then
                                        mkdir -vp /cfg/$file_path
                                fi
                                touch /cfg/$filename && echo "File 
/etc/$filename added to /cfg."
                                ;;
                        [iI])
                                mkdir -vp /cfg/.ignore
                                if [ $file_path != $filename ]
                                then
                                        mkdir -vp /cfg/.ignore/$file_path
                                fi
                                touch /cfg/.ignore/$filename && echo "File 
/etc/$filename added to ignore list."
                                ;;
                        esac
                fi
        fi
done

#
# Actually check all files in /cfg and save if necessary
#
cd /cfg
for filename in "$@" `find * -type f`
do
        if [ -f /etc/$filename ]
        then
                cmp -s /etc/$filename /cfg/$filename || cp -pfv /etc/$filename 
/cfg/$filename
        else

                #
                # Give user an option to remove file from /cfg if this file is 
removed from /etc
                #
                read -p "File /cfg/$filename not found in /etc. Remove from 
/cfg (y/n)? " key
                case "$key" in
                [yY])
                        rm /cfg/$filename && echo "File /cfg/$filename removed"
                        ;;
                esac
        fi
done

)
umount /cfg
trap 1 2 15 EXIT


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to