#!/bin/sh _get_unpack_package() { PACKAGE=$1 if [ "x$PACKAGE" = "x" ]; then echo "Argument missing." return 1 fi FILEPATH=$(apt-cache show $PACKAGE | grep ^Filename | cut -d ' ' -f 2-) if [ "x$FILEPATH" = "x" ]; then echo "Package '$PACKAGE' does not exist." return 1 fi ARCHIVE=$(basename $FILEPATH) wget -q -nc -c $DEBIANMIRROR/$FILEPATH -P $CACHEDIR && \ ([ -d $TEMPDIR/$PACKAGE ] || mkdir $TEMPDIR/$PACKAGE) && \ dpkg -x $CACHEDIR/$ARCHIVE $TEMPDIR/$PACKAGE } _do_etcdiff() { ETCBASEDIR=$1 PREFIX=$2 if [ "x$ETCBASEDIR" = "x" ]; then echo "Argument missing." return 1 fi REPORT_NAME=$(basename $ETCBASEDIR) # Report diff between debian conf and our local one rm -f $REPORTDIR/$REPORT_NAME.diff [ -d $PREFIX/etc ] && find $PREFIX/etc -type f | \ while read file; do diff -ruN $ETCBASEDIR/${file#$PREFIX/} ${file#$PREFIX} >> $REPORTDIR/$REPORT_NAME.diff done # Report symlinks in /etc rm -f $REPORTDIR/$REPORT_NAME.symlinks [ -d $PREFIX/etc ] && find $PREFIX/etc -type l | \ while read file; do stat -c '%N' $file >> $REPORTDIR/$REPORT_NAME.symlinks done } etcdiff_system() { PACKAGES=$(dpkg --get-selections | grep 'install$' | cut -f 1 -d ' ') rm $PROMPT_RM -rf $TEMPDIR/__debian_etc && mkdir $TEMPDIR/__debian_etc for p in $PACKAGES; do # Skip packages which don't put anything in /etc if ! dpkg -L $p | grep -q '/etc/'; then continue fi echo "Getting package $p..." if ! _get_unpack_package $p; then continue fi # save the original etc dir for later processing if [ ! -d $TEMPDIR/$p/etc ]; then echo "Warning: package $p does not have any /etc, but 'dpkg -L' shows it" continue else cp -ir $TEMPDIR/$p/etc $TEMPDIR/__debian_etc fi done _do_etcdiff $TEMPDIR/__debian_etc rm -rf $TEMPDIR/__debian_etc } etcdiff_by_package() { PACKAGE=$1 if [ "x$PACKAGE" = "x" ]; then echo "Argument missing." return 1 fi if dpkg --status $PACKAGE | grep -q 'not-installed'; then echo "Package '$PACKAGE' not installed" return 1 fi # Skip packages which don't put anything in /etc if ! dpkg -L $PACKAGE | grep -q '/etc/'; then echo "$PACKAGE does not put any file in /etc" return 1 fi if ! _get_unpack_package $PACKAGE; then return 1 fi if [ ! -d $TEMPDIR/$PACKAGE/etc ]; then echo "Warning: package $p does not have any /etc, but 'dpkg -L' shows it" return 1 fi if ! _do_etcdiff $TEMPDIR/$PACKAGE $TEMPDIR/$PACKAGE; then return 1 fi return 0 } etcdiff_by_file() { FILE=$1 if [ "x$FILE" = "x" ]; then echo "Argument missing." return 1 fi if [ ! -e $FILE ]; then echo "ERROR, file $FILE does not exist." return 1; fi if [ ! -f $FILE ]; then echo "ERROR, file $FILE is not a regular file." return 1; fi if [ $FILE = ${FILE#/etc/} ]; then echo "ERROR, file path must begin with /etc/." return 1; fi # Find out which installed package provides the config file PACKAGE=$(dpkg-query -S "$FILE" | cut -d ':' -f 1 | uniq 2> /dev/null) REPORT_NAME=$(basename $FILE) if [ "x$PACKAGE" = "x" ]; then diff -ruN /dev/null $FILE > $REPORTDIR/$REPORT_NAME.diff else if ! _get_unpack_package $PACKAGE; then return 1 fi diff -ruN $FILE $TEMPDIR/$PACKAGE/$FILE > $REPORTDIR/$REPORT_NAME.diff fi if [ $(stat -c '%s' $REPORTDIR/$REPORT_NAME.diff) -eq 0 ]; then rm -f $REPORTDIR/$REPORT_NAME.diff fi }