Check functions return values.
[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     return 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     return 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     return 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   [ -d $PREFIX/etc ] && 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   [ -d $PREFIX/etc ] && 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 etcdiff_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     if ! _get_unpack_package $p;
75     then
76       continue
77     fi
78
79     # save the original etc dir for later processing
80     if [ ! -d $TEMPDIR/$p/etc ];
81     then
82       echo "Warning: package $p does not have any /etc, but 'dpkg -L' shows it"
83       continue
84     else
85       cp -ir $TEMPDIR/$p/etc $TEMPDIR/__debian_etc
86     fi
87   done
88
89   _do_etcdiff $TEMPDIR/__debian_etc
90
91   rm -rf $TEMPDIR/__debian_etc
92 }
93
94 etcdiff_by_package()
95 {
96   PACKAGE=$1
97
98   if [ "x$PACKAGE" = "x" ];
99   then
100     echo "Argument missing."
101     return 1
102   fi
103
104   if dpkg --status $PACKAGE | grep -q 'not-installed';
105   then
106     echo "Package '$PACKAGE' not installed"
107     return 1
108   fi
109
110   # Skip packages which don't put anything in /etc
111   if ! dpkg -L $PACKAGE | grep -q '/etc/';
112   then
113     echo "$PACKAGE does not put any file in /etc"
114     return 1
115   fi
116
117   if ! _get_unpack_package $PACKAGE;
118   then
119     return 1
120   fi
121
122   if [ ! -d $TEMPDIR/$PACKAGE/etc ];
123   then
124     echo "Warning: package $p does not have any /etc, but 'dpkg -L' shows it"
125     return 1
126   fi
127
128   if ! _do_etcdiff $TEMPDIR/$PACKAGE $TEMPDIR/$PACKAGE;
129   then
130     return 1
131   fi
132
133   return 0
134 }
135
136 etcdiff_by_file()
137 {
138   FILE=$1
139
140   if [ "x$FILE" = "x" ];
141   then
142     echo "Argument missing."
143     return 1
144   fi
145
146   if [ ! -e $FILE ];
147   then
148     echo "ERROR, file $FILE does not exist."
149     return 1;
150   fi
151
152   if [ ! -f $FILE ];
153   then
154     echo "ERROR, file $FILE is not a regular file."
155     return 1;
156   fi
157
158   if [ $FILE = ${FILE#/etc/} ];
159   then
160     echo "ERROR, file path must begin with /etc/."
161     return 1;
162   fi
163
164   # Find out which installed package provides the config file
165   PACKAGE=$(dpkg-query -S "$FILE" | cut -d ':' -f 1 | uniq 2> /dev/null)
166
167   REPORT_NAME=$(basename $FILE)
168
169   if [ "x$PACKAGE" = "x" ];
170   then
171     diff -ruN /dev/null $FILE > $REPORTDIR/$REPORT_NAME.diff
172   else
173     if ! _get_unpack_package $PACKAGE;
174     then
175       return 1
176     fi
177     diff -ruN $FILE $TEMPDIR/$PACKAGE/$FILE > $REPORTDIR/$REPORT_NAME.diff
178   fi
179
180   if [ $(stat -c '%s' $REPORTDIR/$REPORT_NAME.diff) -eq 0 ];
181   then
182     rm -f $REPORTDIR/$REPORT_NAME.diff
183   fi
184 }