Reimplementation.
[etcdiff.git] / etcdiff.include
1 #!/bin/sh
2
3 _get_unpack_package()
4 {
5   PACKAGE=$1
6   FILEPATH=$(apt-cache show $PACKAGE | grep ^Filename | cut -d ' ' -f 2-)
7
8   if [ "x$FILEPATH" = "x" ];
9   then
10     echo "Package '$PACKAGE' does not exist."
11     exit 1
12   fi
13
14   ARCHIVE=$(basename $FILEPATH)
15
16   wget -q -nc -c $DEBIANMIRROR/$FILEPATH -P $CACHEDIR && \
17     ([ -d $TEMPDIR/$PACKAGE ] || mkdir $TEMPDIR/$PACKAGE) && \
18     dpkg -x $CACHEDIR/$ARCHIVE $TEMPDIR/$PACKAGE
19 }
20
21 _do_etcdiff()
22 {
23   ETCBASEDIR=$1
24   PREFIX=$2
25
26   REPORT_NAME=$(basename $ETCBASEDIR)
27
28   # Report diff between debian conf and our local one
29   rm -f $REPORTDIR/$REPORT_NAME.diff
30   find $PREFIX/etc -type f | \
31   while read file;
32   do
33     diff -ruN $ETCBASEDIR/${file#$PREFIX/} ${file#$PREFIX} >> $REPORTDIR/$REPORT_NAME.diff
34   done
35
36   # Report symlinks in /etc
37   rm -f $REPORTDIR/$REPORT_NAME.symlinks
38   find $PREFIX/etc -type l | \
39   while read file;
40   do
41     stat -c '%N' $file >> $REPORTDIR/$REPORT_NAME.symlinks
42   done
43 }
44
45 etchdiff_system()
46 {
47   PACKAGES=$(dpkg --get-selections | grep 'install$' | cut -f 1 -d '    ')
48
49   rm $PROMPT_RM -rf $TEMPDIR/__debian_etc  && mkdir $TEMPDIR/__debian_etc
50
51   for p in $PACKAGES;
52   do
53
54     # Skip packages which don't put anything in /etc
55     if ! dpkg -L $p | grep -q '/etc/';
56     then
57       continue
58     fi
59
60     echo "Getting package $p..."
61     _get_unpack_package $p
62
63     # save the original etc dir for later processing
64     cp -ir $TEMPDIR/$PACKAGE/etc $TEMPDIR/__debian_etc
65   done
66
67   _do_etcdiff $TEMPDIR/__debian_etc
68
69   rm -rf $TEMPDIR/__debian_etc
70 }
71
72 etcdiff_by_package()
73 {
74   PACKAGE=$1
75
76   if dpkg --status $PACKAGE | grep -q 'not-installed';
77   then
78     echo "Package '$PACKAGE' not installed"
79     return 1
80   fi
81
82   # Skip packages which don't put anything in /etc
83   if ! dpkg -L $PACKAGE | grep -q '/etc/';
84   then
85     echo "$PACKAGE does not put any file in /etc"
86     return 1
87   fi
88
89   _get_unpack_package $PACKAGE
90
91   _do_etcdiff $TEMPDIR/$PACKAGE $TEMPDIR/$PACKAGE
92
93   return 0
94 }
95
96 etcdiff_by_file()
97 {
98   FILE=$1
99
100   if [ ! -e $FILE ];
101   then
102     echo "ERROR, file $FILE does not exist."
103     return 1;
104   fi
105
106   if [ ! -f $FILE ];
107   then
108     echo "ERROR, file $FILE is not a regular file."
109     return 1;
110   fi
111
112   if [ $FILE = ${FILE#/etc/} ];
113   then
114     echo "ERROR, file path must begin with /etc/."
115     return 1;
116   fi
117
118   # Find out which installed package provides the config file
119   PACKAGE=$(dpkg-query -S "$FILE" | cut -d ':' -f 1 | uniq 2> /dev/null)
120
121   REPORT_NAME=$(basename $FILE)
122
123   if [ "x$PACKAGE" = "x" ];
124   then
125     diff -ruN /dev/null $FILE > $REPORTDIR/$REPORT_NAME.diff
126   else
127     _get_unpack_package $PACKAGE
128     diff -ruN $FILE $TEMPDIR/$PACKAGE/$FILE > $REPORTDIR/$REPORT_NAME.diff
129   fi
130
131   if [ $(stat -c '%s' $REPORTDIR/$REPORT_NAME.diff) -eq 0 ];
132   then
133     rm -f $REPORTDIR/$REPORT_NAME.diff
134   fi
135 }