source: projects/chkpkg/trunk/chkpkgv.sh @ 2657

Revision 2657, 11.0 KB checked in by iwamoto, 13 years ago (diff)

chkpkg: fix epoch handling

Line 
1#! /bin/bash
2
3TMP_DIR=/tmp
4DOC_DIR=/usr/share/doc
5NEW_ROOT="/var/local/vbootstrap/5.2_i386"
6
7IGNORE_DOC="N"
8IGNORE_ERR="N"
9VER_MODE="N"
10VBUILDER_MODE="N"
11SHOW_HELP="N"
12
13SIG_OK="Y"
14VEN_OK="Y"
15LOG_UPDATE="Y"
16
17for name in $@  ; do
18    if [ $name = "-d" ]; then
19        IGNORE_DOC="Y"
20        continue
21    fi
22    if [ $name = "-i" ]; then
23        IGNORE_ERR="Y"
24        continue
25    fi
26    if [ $name = "-v" ]; then
27        VER_MODE="Y"
28        continue
29    fi
30    if [ $name = "-b" ]; then
31        VBUILDER_MODE="Y"
32        continue
33    fi
34    if [ $name = "-h" ]; then
35        SHOW_HELP="Y"
36        continue
37    fi
38done
39
40tmp1=`echo $@|sed -e "s/ -. / /g"`
41tmp2=`echo $tmp1|sed -e "s/^-. //g"`
42argfile=`echo $tmp2|sed -e "s/ -.$//g"`
43
44if [ $SHOW_HELP = "Y" ]; then
45    echo " "
46    echo "chkpkgv.sh [options] rpmpackage(s) "
47    echo " "
48    echo "  -h  ヘルプを表示します "
49    echo "  -v  詳細な出力を表示します "
50    echo "  -d  収録ファイルの比較のとき、/usr/share/doc の内容の違いを無視します"
51    echo "  -i  Signature チェック、Vendor Tag チェックでエラーが検出されても "
52    echo "      処理を続行します"
53    echo "  -b  vbootstrap モードで実行します"
54    echo " "
55    echo "VBOOTSTRAP ROOT ="$NEW_ROOT
56    echo " "
57    exit
58fi
59
60echo ""
61echo "Signature check"
62for name in $argfile  ; do
63    PKG_NAME=$name
64    case $name in
65        *.rpm)
66            rpm -K $name | cut -f2 -d":" |grep gpg > /dev/null
67            if [ $? = 0 ]; then
68                rpm -K $name |grep "NOT OK"
69                if [ $? = 0 ]; then
70                    echo -e "---- \033[1;31mFAIL\033[0m : "`basename $name`
71                    SIG_OK="N"
72                else
73                    echo -e "\033[1;32mPass\033[0m ---- : "`basename $name`
74                fi
75            else
76                echo -e "---- \033[1;31mFAIL\033[0m : "`basename $name`
77                SIG_OK="N"
78            fi
79            ;;
80        *)
81            echo $name" is NOT rpm package (skipped)"
82            continue
83            ;;
84    esac
85done
86
87echo ""
88echo "Vendor check"
89for name in $argfile  ; do
90    PKG_NAME=$name
91    case $name in
92        *.rpm)
93            rpm -qip $name |grep "Vendor:"|grep "(none)"
94            if [ $? = 0 ]; then
95                echo -e "---- \033[1;31mFAIL\033[0m : "`basename $name`
96                VEN_OK="N"
97            else
98                echo -e "\033[1;32mPass\033[0m ---- : "`basename $name`
99            fi
100            ;;
101        *)
102            echo $name" is NOT rpm package (skipped)"
103            continue
104            ;;
105    esac
106done
107
108if [ $VBUILDER_MODE = "Y" ]; then
109    RPM_CMD="rpm --root="$NEW_ROOT
110    APTC_CMD="sudo chroot "$NEW_ROOT" apt-cache "
111    APTG_CMD="sudo chroot "$NEW_ROOT" apt-get "
112    ARV_DIR=$NEW_ROOT/var/cache/apt/archives
113    echo ""
114    echo "vbootstrap mode"
115    echo "New root = "$NEW_ROOT
116else
117    RPM_CMD=rpm
118    APTC_CMD=apt-cache
119    APTG_CMD="sudo apt-get "
120    ARV_DIR=/var/cache/apt/archives
121fi
122
123# echo $NEW_ROOT
124# echo $RPM_CMD
125# echo $APTC_CMD
126# echo $APTG_CMD
127
128echo ""
129echo "Changelog Check"
130for name in $argfile  ; do
131    PKG_NAME=$name
132    case $name in
133        *.rpm)
134            TMP=`$RPM_CMD -qip $PKG_NAME|grep ^Name|cut -f2 -d:`
135            PKG_BASE_NAME=`echo $TMP|cut -f1 -d" "`
136           
137            LANG=C $RPM_CMD -q --changelog $PKG_BASE_NAME > $TMP_DIR/installed_pkg
138            grep -q "$PKG_BASE_NAME is not installed" $TMP_DIR/installed_pkg
139            if [ $? = 0 ]; then
140                echo $PKG_BASE_NAME" is not installed (getting from apt repository)"
141                $APTC_CMD --no-all-versions -q show $PKG_BASE_NAME > $TMP_DIR/current_pkg
142                if [ $? -gt 0 ]; then
143                    echo $PKG_BASE_NAME" is not found in apt repository (skipped)"
144                    continue
145                fi
146               
147                APT_PKG=`cat $TMP_DIR/current_pkg|grep "^Package:"|cut -f2 -d" "`
148                APT_VER=`cat $TMP_DIR/current_pkg|grep "^Version:"|cut -f2 -d" "|sed "s/[0-9]*://"`
149                APT_ARCH=`cat $TMP_DIR/current_pkg|grep "^Architecture:"|cut -f2 -d" "`
150                APT_ARV_FILE=$ARV_DIR"/"$APT_PKG"-"$APT_VER"."$APT_ARCH.rpm
151#               echo $APT_ARV_FILE
152
153                if [ -f $APT_ARV_FILE ]; then
154                    echo $APT_ARV_FILE" is found."
155                else
156                    $APTG_CMD -d -qq install $APT_PKG
157                fi
158                LANG=C $RPM_CMD -qp --changelog $APT_ARV_FILE > $TMP_DIR/installed_pkg
159            fi
160
161            LANG=C $RPM_CMD -qp --changelog $PKG_NAME > $TMP_DIR/new_pkg
162
163            diff -q $TMP_DIR/installed_pkg $TMP_DIR/new_pkg > /dev/null
164            if [ $? = 0 ]; then
165                echo -e "---- \033[1;31mFAIL\033[0m : "`basename $PKG_NAME`
166                LOG_UPDATE="N"
167            else
168
169                TLD_INSED=`head -n1 $TMP_DIR/installed_pkg|sed s/\*\ //|cut -d" " -f1,2,3,4` 
170                TLD_NEW=`head -n1 $TMP_DIR/new_pkg|sed s/\*\ //|cut -d" " -f1,2,3,4`
171                if [ "$TLD_INSED" = "$TLD_NEW" ]; then
172                    echo "*************************************"
173                    echo "*            WARNING !!             *"
174                    echo "* Change log DATE is NOT updated !! *"
175                    echo "*************************************"
176                fi
177#               echo `basename $PKG_NAME`
178                echo -e "\033[1;32mPass\033[0m ---- : "`basename $PKG_NAME`
179                diff $TMP_DIR/installed_pkg $TMP_DIR/new_pkg > $TMP_DIR/diff_changelog_next
180                if [ -f $TMP_DIR/diff_changelog ]; then
181                    diff -q $TMP_DIR/diff_changelog $TMP_DIR/diff_changelog_next > /dev/null
182                    if [ $? -ne 0 ]; then
183                        DIFF_LINE=`cat $TMP_DIR/diff_changelog_next|wc -l`
184                        if [ $DIFF_LINE -lt "20" ]; then
185                            cat $TMP_DIR/diff_changelog_next
186                        else
187                            cat $TMP_DIR/diff_changelog_next|head -n10
188                            echo "Changelog diff is too long.. skipped."
189                        fi
190                    fi
191                else
192                    DIFF_LINE=`cat $TMP_DIR/diff_changelog_next|wc -l`
193#                   echo $DIFF_LINE
194                    if [ $DIFF_LINE -lt "20" ]; then
195                        cat $TMP_DIR/diff_changelog_next
196                    else
197                        cat $TMP_DIR/diff_changelog_next|head -n10
198                        echo "Changelog diff is too long.. skipped."
199                    fi
200                    mv $TMP_DIR/diff_changelog_next $TMP_DIR/diff_changelog
201                fi
202            fi
203            ;;
204        *)
205            echo $name" is NOT rpm package (skipped)"
206            continue
207            ;;
208    esac
209done
210
211rm -rf $TMP_DIR/diff_changelog_next $TMP_DIR/diff_changelog
212
213echo ""
214if [ $IGNORE_ERR = "N" ]; then
215    if [ $SIG_OK = "N" ]; then
216        exit
217    fi
218    if [ $VEN_OK = "N" ]; then
219        exit
220    fi
221    if [ $LOG_UPDATE = "N" ]; then
222        exit
223    fi
224fi
225
226if [ $IGNORE_DOC = "Y" ]; then
227    echo "Files check (Ignore Document Mode)"
228else
229    echo "Files check"
230fi
231for name in $argfile  ; do
232
233    PKG_NAME=$name
234    echo $PKG_NAME|grep -q ".src.rpm"
235    if [ $? = 0 ]; then
236        echo "Skip ---- : "`basename $PKG_NAME`" (src package)"
237        continue
238    fi
239
240    TMP=`$RPM_CMD -qip $PKG_NAME|grep ^Name|cut -f2 -d:`
241    PKG_BASE_NAME=`echo $TMP|cut -f1 -d" "`
242
243    LANG=C $RPM_CMD -ql $PKG_BASE_NAME > $TMP_DIR/installed_pkg
244    grep -q "$PKG_BASE_NAME is not installed" $TMP_DIR/installed_pkg
245    if [ $? = 0 ]; then
246        echo $PKG_BASE_NAME" is not installed (getting from apt repository)"
247        $APTC_CMD --no-all-versions -q show $PKG_BASE_NAME > $TMP_DIR/current_pkg
248        if [ $? -gt 0 ]; then
249            echo $PKG_BASE_NAME" is not found in apt repository (skipped)"
250            continue
251        fi
252       
253        APT_PKG=`cat $TMP_DIR/current_pkg|grep "^Package:"|cut -f2 -d" "`
254        APT_VER=`cat $TMP_DIR/current_pkg|grep "^Version:"|cut -f2 -d" "|sed "s/[0-9]*://"`
255        APT_ARCH=`cat $TMP_DIR/current_pkg|grep "^Architecture:"|cut -f2 -d" "`
256        APT_ARV_FILE=$ARV_DIR"/"$APT_PKG"-"$APT_VER"."$APT_ARCH.rpm
257
258        if [ -f $APT_ARV_FILE ]; then
259            echo $APT_ARV_FILE" is found."
260        else
261            $APTG_CMD -d -qq install $APT_PKG
262        fi
263        LANG=C $RPM_CMD -qlp $APT_ARV_FILE > $TMP_DIR/installed_pkg
264    fi
265
266    LANG=C rpm -qlp $PKG_NAME > $TMP_DIR/new_pkg
267
268    if [ $IGNORE_DOC = "Y" ]; then
269        rm -f $TMP_DIR/tmp_pkg
270        grep -v $DOC_DIR/$PKG_BASE_NAME $TMP_DIR/new_pkg > $TMP_DIR/tmp_pkg
271        mv $TMP_DIR/tmp_pkg $TMP_DIR/new_pkg
272        grep -v $DOC_DIR/$PKG_BASE_NAME $TMP_DIR/installed_pkg > $TMP_DIR/tmp_pkg
273        mv $TMP_DIR/tmp_pkg $TMP_DIR/installed_pkg
274    fi
275
276    diff -q $TMP_DIR/installed_pkg $TMP_DIR/new_pkg
277    if [ $? = 0 ]; then
278        echo -e "\033[1;32mPass\033[0m ---- : "$PKG_BASE_NAME
279    else
280        echo -e "---- \033[1;31mFAIL\033[0m : "$PKG_BASE_NAME
281        if [ $VER_MODE = "Y" ]; then
282            diff $TMP_DIR/installed_pkg $TMP_DIR/new_pkg
283        else
284            INSTALLED_BYTE=`wc -c $TMP_DIR/installed_pkg|cut -f1 -d" "`
285            INSTALLED_WORD=`wc -w $TMP_DIR/installed_pkg|cut -f1 -d" "`
286            INSTALLED_LINE=`wc -l $TMP_DIR/installed_pkg|cut -f1 -d" "`
287            NEW_BYTE=`wc -c $TMP_DIR/new_pkg|cut -f1 -d" "`
288            NEW_WORD=`wc -w $TMP_DIR/new_pkg|cut -f1 -d" "`
289            NEW_LINE=`wc -l $TMP_DIR/new_pkg|cut -f1 -d" "`
290            echo "Installed : "$INSTALLED_BYTE $INSTALLED_WORD $INSTALLED_LINE $PKG_BASE_NAME
291            echo "New       : "$NEW_BYTE $NEW_WORD $NEW_LINE `basename $PKG_NAME`
292        fi
293    fi
294done
295
296echo ""
297echo "Requires check"
298for name in $argfile  ; do
299
300    PKG_NAME=$name
301    echo $PKG_NAME|grep -q ".src.rpm"
302    if [ $? = 0 ]; then
303        echo "Skip ---- : "`basename $PKG_NAME`" (src package)"
304        continue
305    fi
306
307    TMP=`rpm -qip $PKG_NAME|grep ^Name|cut -f2 -d:`
308    PKG_BASE_NAME=`echo $TMP|cut -f1 -d" "`
309
310    LANG=C rpm -qRp $PKG_NAME |sort|uniq > $TMP_DIR/new_pkg
311    LANG=C $RPM_CMD -qR $PKG_BASE_NAME |sort|uniq > $TMP_DIR/installed_pkg
312    grep -q "$PKG_BASE_NAME is not installed" $TMP_DIR/installed_pkg
313    if [ $? = 0 ]; then
314        echo $PKG_BASE_NAME" is not installed (getting from apt repository)"
315
316        $APTC_CMD --no-all-versions -q show $PKG_BASE_NAME > $TMP_DIR/current_pkg
317        if [ $? -gt 0 ]; then
318            echo $PKG_BASE_NAME" is not found in apt repository (skipped)"
319            continue
320        fi
321       
322        APT_PKG=`cat $TMP_DIR/current_pkg|grep "^Package:"|cut -f2 -d" "`
323        APT_VER=`cat $TMP_DIR/current_pkg|grep "^Version:"|cut -f2 -d" "|sed "s/[0-9]*://"`
324        APT_ARCH=`cat $TMP_DIR/current_pkg|grep "^Architecture:"|cut -f2 -d" "`
325        APT_ARV_FILE=$ARV_DIR"/"$APT_PKG"-"$APT_VER"."$APT_ARCH.rpm
326
327        if [ -f $APT_ARV_FILE ]; then
328            echo $APT_ARV_FILE" is found."
329        else
330            $APTG_CMD -d -qq install $APT_PKG
331        fi
332        LANG=C $RPM_CMD -qRp $APT_ARV_FILE |sort|uniq > $TMP_DIR/installed_pkg
333    fi
334
335    diff -q $TMP_DIR/installed_pkg $TMP_DIR/new_pkg > /dev/null
336    if [ $? = 0 ]; then
337        echo -e "\033[1;32mPass\033[0m ---- : "$PKG_BASE_NAME
338    else
339        echo -e "---- \033[1;31mFAIL\033[0m : "$PKG_BASE_NAME
340        diff $TMP_DIR/installed_pkg $TMP_DIR/new_pkg
341    fi
342done
343
344
345echo ""
346echo "Plus Requires check"
347for name in $argfile  ; do
348
349    PKG_NAME=$name
350    PKG_BASE_NAME=`basename $PKG_NAME`
351    PLUS_OK="Y"
352
353    echo $PKG_NAME|grep -q ".src.rpm"
354    if [ $? = 0 ]; then
355        echo "Skip ---- : "`basename $PKG_NAME`" (src package)"
356        continue
357    fi
358    LIBLIST=`LANG=C rpm -qRp $PKG_NAME |cut -f1 -d" "|cut -f1 -d"("|sort|uniq`
359
360    for LIB in $LIBLIST ; do
361        echo $LIB | grep -q "\(/bin\)\|\(/sbin\)\|\(rpmlib\)"
362        if [ $? = 0 ]; then
363            if [ $VER_MODE = "Y" ]; then
364                echo "Skip ....... "$LIB
365            fi
366            continue
367        fi
368        if [ $VER_MODE = "Y" ]; then
369            echo "Checking ... "$LIB
370        fi
371
372        echo $LIB | grep -q "\.so\."
373        if [ $? = 0 ]; then
374            # so lib
375            PNAME=`$APTC_CMD --names-only search $LIB|cut -f1 -d" "|sed s/gtk210.*//`
376            $APTC_CMD --no-all-versions showpkg $PNAME|grep -q "pkglist\.plus"
377            if [ $? = 0 ]; then
378                echo "VinePlus "$PNAME"("$LIB") is required" 
379                PLUS_OK="N"
380            fi
381        else
382            # package
383            PNAME=$LIB
384            $APTC_CMD --no-all-versions showpkg $PNAME|grep -q "pkglist\.plus"
385            if [ $? = 0 ]; then
386                echo "VinePlus "$PNAME" is required" 
387                PLUS_OK="N"
388            fi
389        fi
390    done
391
392    if [ $PLUS_OK = "Y" ]; then
393        echo -e "\033[1;32mPass\033[0m ---- : "$PKG_BASE_NAME
394    else
395        echo -e "---- \033[1;31mFAIL\033[0m : "$PKG_BASE_NAME
396    fi
397done
Note: See TracBrowser for help on using the repository browser.