# Updating unmodified config files automatically

## Naan Yaar

When I emerged the new baselayout and was presented with 24 config files to update, I became a little bit tired of updating files that I have not modified since the emerge.  I wrote a little script that will find these files by checking md5sums from ebuilds and then updates them automatically or one-by-one.

You can run this before running etc-update to save yourself some work.

NB.

1. This needs gentoolkit to work

2. You need to do this before the old package that installed the config file is cleaned (either through an emerge clean or autoclean)

3. Please make sure that copy/cut-and-paste to the script text file does not remove spaces or modify line-ends.

```

#!/bin/bash

# This script checks config files in directories with config files and

# checks whether their checksum matches known checksums in /var/db.

# If a checksum matches, the file has not been modified since the emerge

# and can be overwritten safely.  These files are presented and queried

# for update individually or in one shot

#

# You can run this prior to running etc-update to save some work in updating

# files that you have not touched

strip_config()

{

    echo ${1//._cfg????_/}

}

# check for root

if [ $UID != 0 ]; then

    echo "Got root?"

    exit 1

fi

# check for gentoolkit

needed=gentoolkit

if [ ! -f /usr/bin/qpkg ]; then

    echo "You need to emerge $needed to run this"

    exit 2

fi

# get dir list from config

sourcefiles="/etc/make.globals /etc/profile"

for sourcefile in $sourcefiles; do

    source $sourcefile

    for dir in $CONFIG_PROTECT; do

        [ -d $dir ] && dirs="$dirs $dir"

    done

done

# check for config files with matching checksums

for nf in `find $dirs -iname '._cfg*'`; do

    of=`strip_config $nf`

    for eb in `qpkg -v -nc -f $of`; do

        if grep $of /var/db/pkg/$eb/CONTENTS |

           grep -v ^sym |

           sed 's/obj \([^ ]*\) \([^ ]*\) .*$/\2  \1/g' |

           md5sum -c --status; then

            can_update="$can_update $nf"

        fi

    done

done

# exit if nothing to do

[ -z "$can_update" ] && echo "No files found" && exit 0

# make sure files are listed only once in the update

can_update=`echo $can_update | sed 's/ /\n/g' | sort -u`

# blurb

can_update="`echo $can_update | sort -u`"

echo "The following files have not been modified by you:"

echo

echo `strip_config "$can_update"` | tr ' ' '\n'

echo

echo "You can update the files one by one by typing \"y/n\" or update"

echo "all the remaining by typing \"a\""

# update one by one or all

for nf in $can_update; do

    of=`strip_config $nf`

    [ -z "$all" ] && echo -n "Update ${of}? [Y|n|q|a] " && read ans

    case $ans in

    n|N)

        ;;

    q|Q)break

        ;;

    a|A)echo Moving $nf to $of

        mv -f $nf $of

        all=y

        ans=y

        ;;

    y|Y|*)echo Moving $nf to $of

        mv -f $nf $of

        ;;

    esac

done

exit 0

```

EDIT (rac): incorporated puddpunk's suggestion of checking UID against 0 instead of USER against root.

EDIT(Naan Yaar):03/12/04: Updated to include Yak's suggestion and previous fix for missing pkglist.Last edited by Naan Yaar on Sat Mar 13, 2004 4:53 am; edited 5 times in total

----------

## kirill

 *Naan Yaar wrote:*   

> When I emerged the new baselayout and was presented with 24 config files to update, I became a little bit tired of updating files that I have not modified since the emerge.  I wrote a little script that will find these files by checking md5sums from ebuilds and then updates them automatically or one-by-one.
> 
> You can run this before running etc-update to save yourself some work.
> 
> NB.
> ...

 

The script is not quite working here:

```
 * GNU info directory index is up-to-date.

 * IMPORTANT: 22 config files in /etc need updating.

 * Type emerge --help config to learn how to update config files.

```

```
# ./etc-force-update

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

md5sum: standard input: no properly formatted MD5 checksum lines found

No files found

```

exactly as many times as many new config files I have

I also ran this:

```
# qpkg -c -v baselayout

sys-apps/baselayout-1.8.2 *

/etc/devfsd.conf !md5! !mtime!

/etc/fstab !md5! !mtime!

/etc/group !md5! !mtime!

/etc/hosts !md5! !mtime!

/etc/inputrc !md5! !mtime!

/etc/profile !md5! !mtime!

/etc/rc.conf !md5! !mtime!

/etc/services !md5! !mtime!

/etc/conf.d/local.start !md5! !mtime!

/etc/conf.d/net !md5! !mtime!

/etc/init.d/bootmisc !md5! !mtime!

/etc/init.d/checkfs !md5! !mtime!

/etc/init.d/checkroot !md5! !mtime!

/etc/init.d/consolefont !md5! !mtime!

/etc/init.d/halt.sh !md5! !mtime!

/etc/init.d/keymaps !md5! !mtime!

/etc/init.d/modules !md5! !mtime!

/etc/init.d/net.eth0 !md5! !mtime!

/etc/init.d/net.ppp0 !md5! !mtime!

/etc/init.d/netmount !md5! !mtime!

/etc/skel/.bash_profile !md5! !mtime!

/etc/skel/.bashrc !md5! !mtime!

22/236

```

is that my configuration or the script which b0rks? :Sad: 

----------

## Naan Yaar

kirill,

I'll follow up with PM's and post the resolution to the forum since I don't want to clutter up the documentation thread.

[EDIT]PM exchanges determined that the cut-and-paste to a file changed the two spaces between \2 and \1 above into a single space, causing md5sum to fail.  Adding warning to original post above regarding this.

Thanks, kirill[/EDIT]

----------

## puddpunk

The script doesn't work if I'm SU'd :\

I just changed the line:

```
if [ $USER != root ]; then
```

to

```
if [ $UID != 0 ]; then
```

and it worked fine.

Great script, thanks man  :Smile: 

----------

## ales

how exactly is this script suppose to be run?

" (either through an emerge clean or autoclean) " ?

maybe an example please...  

(BTW.. i just finished the Stage2 and am about to do the stage 3)

plus if I copy and paste it... i get a bunch of these at the end of each line (viewing it in nano)..

```
^M
```

which didn't make the script work... had to delete each one of those.. for it to properly tell me that "gentoolkit is required"

but after emerging gentoolkit, (before going to stage 3) I now get the following:

```
 

: command not found

: command not found

: command not found

: command not found

: command not found

No files found

```

I'm assuming it probably has something to do with the fact that I'm still at stage 2 ?

this is probably baby sh*t to those who know what they're doing... however, i'm *just* starting out... so any help would be cherished  :Razz: 

-ales

----------

## puddpunk

yup, finish your install first!  :Smile: 

----------

## sebest

Hi.

I tryed your script, but i think that the new default behavior of emerge, to clean after emerging brook it.

Because it can removes the old CONTENT file containing the md5 checksum of a current file in /etc. So when i run you script he thinks that i modified the file because there is no CONTENT file containing his checksum.

----------

## Naan Yaar

Autoclean is on by default now.  You can change this behavior by putting in this line in your /etc/make.conf file:

```

AUTOCLEAN="no"

```

NB. Portage seems to strongly recommend not doing this.

 *sebest wrote:*   

> Hi.
> 
> I tryed your script, but i think that the new default behavior of emerge, to clean after emerging brook it.
> 
> Because it can removes the old CONTENT file containing the md5 checksum of a current file in /etc. So when i run you script he thinks that i modified the file because there is no CONTENT file containing his checksum.

 

----------

## Yama

This script served me flawlessly for quite some time (> 1 year), but now when I run it I receive the following error:

```
/usr/local/sbin/etc-autoupdate: line 29: /usr/lib/portage/bin/pkglist: No such file or directory

You need to emerge gentoolkit to run this
```

This started happening after upgrading my gentoolkit to the latest stable version (0.2.0_pre6). It seems that this version does not have the /usr/lib/portage/bin/pkglist file.

----------

## nempo

This is a feature that should be in portage IMO. Maybe you should try to commit it  :Wink: 

----------

## Naan Yaar

Sorry.  I haven't been around the forums a lot recently and have updated to the recent portage version only recently.  I have attached the modified script below (it is a simple change that checks for qpkg explicitly rather than through pkglist).

Regards.

NB. Code has been updated in the first post to this thread itself and has been removed from this post.

 *Yama wrote:*   

> This script served me flawlessly for quite some time (> 1 year), but now when I run it I receive the following error:
> 
> ```
> /usr/local/sbin/etc-autoupdate: line 29: /usr/lib/portage/bin/pkglist: No such file or directory
> 
> ...

 

EDIT(Naan Yaar): Removed code and put in consolidated version in the first post.Last edited by Naan Yaar on Sat Mar 13, 2004 4:56 am; edited 2 times in total

----------

## Yama

Thanks Naan. Your new script appears to work well.

----------

## Yak

This script has served me well, it's a real time saver. However, awhile back I somehow got about 50 files in /usr/X11R6/lib/X11/xkb that needed updating, and I finally got around to looking at it. It seems that CONFIG_PROTECT is also present in /etc/profile.env which gets read when you source /etc/profile. So I played around a bit and changed the script so it sources /etc/profile too. This worked for what I needed so I thought I would share it. Use it at your own peril. 

```

# get dir list from config

sourcefiles="/etc/make.globals /etc/profile"

for file in $sourcefiles; do

    echo "List from $file"

    source $file

    for dir in $CONFIG_PROTECT; do

        echo -n "    $dir"

        if [ -d $dir ]; then

            echo "  (directory exists)"

            dirs="$dirs $dir"

        else

            echo "  (not existing dir)"

        fi

    done

done

echo

echo "Dirs list to search: $dirs"

```

It prints a bunch of extra stuff, I sort of like it so I left it in. I suppose to be complete it should source /etc/make.conf too, but it doesn't seem to work right unless you add an empty CONFIG_PROTECT="" into /etc/make.conf.

----------

## Naan Yaar

Yak,

I had noticed that it did not pick up files in .../xkb correctly, but did not investigate further.  Thanks for your insight.

I have updated the script in the first post to this thread to reflect this fix.

 *Yak wrote:*   

> This script has served me well, it's a real time saver. However, awhile back I somehow got about 50 files in /usr/X11R6/lib/X11/xkb that needed updating, and I finally got around to looking at it. It seems that CONFIG_PROTECT is also present in /etc/profile.env which gets read when you source /etc/profile. So I played around a bit and changed the script so it sources /etc/profile too. This worked for what I needed so I thought I would share it. Use it at your own peril. 
> 
> ...
> 
> It prints a bunch of extra stuff, I sort of like it so I left it in. I suppose to be complete it should source /etc/make.conf too, but it doesn't seem to work right unless you add an empty CONFIG_PROTECT="" into /etc/make.conf.

 

----------

