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