View previous topic :: View next topic |
Author |
Message |
Naan Yaar Bodhisattva
Joined: 27 Jun 2002 Posts: 1549
|
Posted: Thu Aug 29, 2002 4:26 am Post subject: Updating unmodified config files automatically |
|
|
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.
Code: |
#!/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 |
|
Back to top |
|
|
kirill Apprentice
Joined: 01 Aug 2002 Posts: 183 Location: Finland
|
Posted: Thu Aug 29, 2002 8:32 pm Post subject: Re: Updating unmodified config files automatically |
|
|
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.
1. This needs gentoolkit to work
2. Lightly tested. YMMV.
|
The script is not quite working here:
Code: | * 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.
|
Code: | # ./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:
Code: | # 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? _________________ --kirill |
|
Back to top |
|
|
Naan Yaar Bodhisattva
Joined: 27 Jun 2002 Posts: 1549
|
Posted: Thu Aug 29, 2002 8:42 pm Post subject: |
|
|
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] |
|
Back to top |
|
|
puddpunk l33t
Joined: 20 Jul 2002 Posts: 681 Location: New Zealand
|
Posted: Wed Nov 20, 2002 6:28 am Post subject: |
|
|
The script doesn't work if I'm SU'd :\
I just changed the line:
Code: | if [ $USER != root ]; then |
to
Code: | if [ $UID != 0 ]; then |
and it worked fine.
Great script, thanks man |
|
Back to top |
|
|
ales n00b
Joined: 20 Nov 2002 Posts: 19
|
Posted: Thu Nov 21, 2002 8:20 am Post subject: |
|
|
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)..
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:
Code: |
: 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
-ales |
|
Back to top |
|
|
puddpunk l33t
Joined: 20 Jul 2002 Posts: 681 Location: New Zealand
|
Posted: Thu Nov 21, 2002 10:59 pm Post subject: |
|
|
yup, finish your install first! |
|
Back to top |
|
|
sebest Apprentice
Joined: 03 Jul 2002 Posts: 163 Location: Paris - France
|
Posted: Sun Dec 29, 2002 12:09 am Post subject: |
|
|
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. |
|
Back to top |
|
|
Naan Yaar Bodhisattva
Joined: 27 Jun 2002 Posts: 1549
|
Posted: Sun Dec 29, 2002 5:11 am Post subject: |
|
|
Autoclean is on by default now. You can change this behavior by putting in this line in your /etc/make.conf file:
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. |
|
|
Back to top |
|
|
Yama Tux's lil' helper
Joined: 21 Jul 2002 Posts: 135 Location: Sydney, Australia
|
Posted: Tue Feb 10, 2004 2:26 am Post subject: |
|
|
This script served me flawlessly for quite some time (> 1 year), but now when I run it I receive the following error: Code: | /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. |
|
Back to top |
|
|
nempo Guru
Joined: 16 Apr 2002 Posts: 360 Location: Linkoping, Sweden
|
Posted: Tue Feb 10, 2004 8:45 am Post subject: |
|
|
This is a feature that should be in portage IMO. Maybe you should try to commit it _________________
homeobocks wrote: | superjaded wrote: |
would Big Brother become a reality? |
Yeah . . . it would be just like the tv show. Except somebody would be watching. |
|
|
Back to top |
|
|
Naan Yaar Bodhisattva
Joined: 27 Jun 2002 Posts: 1549
|
Posted: Tue Feb 17, 2004 6:29 pm Post subject: |
|
|
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: Code: | /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. |
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 |
|
Back to top |
|
|
Yama Tux's lil' helper
Joined: 21 Jul 2002 Posts: 135 Location: Sydney, Australia
|
Posted: Wed Feb 18, 2004 2:09 pm Post subject: |
|
|
Thanks Naan. Your new script appears to work well. |
|
Back to top |
|
|
Yak Tux's lil' helper
Joined: 01 Sep 2002 Posts: 107
|
Posted: Fri Mar 12, 2004 1:34 am Post subject: |
|
|
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.
Code: |
# 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. |
|
Back to top |
|
|
Naan Yaar Bodhisattva
Joined: 27 Jun 2002 Posts: 1549
|
Posted: Sat Mar 13, 2004 4:58 am Post subject: |
|
|
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. |
|
|
Back to top |
|
|
|