#! /bin/bash
set -ex
+set -o pipefail
t=/tmp/backup-rpm.$$
trap "rm -rf $t" EXIT
rm -rf $t
mkdir $t
-rpm -qa|sort >$t/rpm-qa
-rpm -qal|sort -u >$t/rpm-qal
-(set +e;rpm -Va >$t/rpm-Va)
+cd $t
+mkdir $t/tmp
+rpm -qa|sort >$t/tmp/rpm-qa
+rpm -qal|sort -u|grep -v '^(contains no files)$' >$t/tmp/rpm-qal
+(set +e;rpm -Va|sed 's#^[^/]*##' >$t/tmp/rpm-Va)
+pattern="`tr '\n' '|' <<HERE|sed 's/|$//'
+/boot/
+/dev/
+/etc/rc[.]d/rc[0-9][.]d/
+/lib/modules/[^/]*/modules[.]
+/root/
+/home/
+/tmp/
+/usr/lib/perl5/
+/usr/src/redhat/
+/var/cache/
+/var/lib/rpm/
+/var/log/
+/var/run/
+/var/spool/
+/var/lock/
+/usr/share/ntop/
+/usr/lib/locale/locale-archive
+/var/lib/slocate/slocate.db
+/usr/share/man/
+/etc/aliases.db
+/var/tmp/
+/etc/prelink.cache
+/etc/sgml/
+/usr/include/tags
+/usr/lib/IPTables-IPv4/
+/usr/lib/python2.3/
+/usr/lib/rpmdb
+/usr/share/texmf/
+/usr/share/yum-cli
+/var/db/nscd/
+HERE
+`"
(
- (find / -xdev -print -type d -print;cat $t/rpm-qal)|sort|uniq -u
- sed 's#^[^/]*##' <$t/rpm-Va
- touch $t/patch.list
- for orig in `find / -xdev -name "*-orig"`;do
- base="`echo $orig|sed 's/-orig$//'`"
- if [ ! -f "$base" ];then continue;fi
- (set +e;diff -u "$orig" "$base" >"$base".patch)
- echo "$orig"
- echo "$base"
- echo "$base".patch|tee -a $t/patch.list
- done
- )|grep -v '^\(/boot/\|/dev/\|/etc/rc[.]d/rc[0-9][.]d/\|/lib/modules/[^/]*/modules[.]\|/root/\|/tmp/\|/usr/lib/perl5/\|/usr/src/redhat/\|/var/cache/\|/var/lib/rpm/\|/var/log/\|/var/run/\|/var/spool/\|/var/lock/\|/usr/share/ntop/\|/usr/lib/locale/locale-archive\|/var/lib/slocate/slocate.db\|/usr/share/man/\|/etc/aliases.db\|/var/tmp/\|/etc/prelink.cache\|/etc/sgml/\|/home/\|/usr/include/tags\|/usr/lib/IPTables-IPv4/\|/usr/lib/python2.3/\|/usr/lib/rpmdb\|/usr/share/texmf/\|/usr/share/yum-cli\|/var/db/nscd/\)' \
- |grep -v '^(contains no files)$' \
- |(echo $t/rpm-qa;cat) \
- |sort -u|sed 's#^/##'|(cd /;set +e;xargs tar cf -)
-cat $t/patch.list|xargs rm -f
+ (find / -xdev -print -type d -print;cat $t/tmp/rpm-qal)|sort|uniq -u
+ cat $t/tmp/rpm-Va
+ while read -r file;do
+ # cpio(1) needs "./bin/bash" pattern.
+ rpm="$(for dir in /var/cache/yum /usr/src/redhat/RPMS /root/arch;do
+ find $dir -name "`rpm -qf "$file"`.*.rpm"
+ done|grep -v '[.]src[.]rpm$')"
+ echo "$rpm"|grep -qv ' '
+ rpm2cpio "$rpm"|cpio -id --no-absolute-filenames ."$file"
+ mv ."$file" ."$file"-orig
+ (set +e;diff -u ."$file"-orig "$file" >."$file".patch)
+ echo ."$file"-orig
+ echo ."$file".patch
+ done <$t/tmp/rpm-Va
+ ) \
+ |grep --perl-regexp -v -e "^($pattern)" \
+ |(echo $t/tmp/rpm-qa;cat) \
+ |sort -u ###|sed 's#^/##'|(cd /;set +e;xargs tar cf -)
+echo SUCCESS