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

Revision 2069, 10.9 KB checked in by iwamoto, 14 years ago (diff)

update and add read.me

Line 
1#! /bin/bash
2
3TMP_DIR=/tmp
4DOC_DIR=/usr/share/doc
5NEW_ROOT="/var/local/vbootstrap/5.1_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/.://"`
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
152                if [ -f $APT_ARV_FILE ]; then
153                    echo $APT_ARV_FILE" is found."
154                else
155                    $APTG_CMD -d -qq install $APT_PKG
156                fi
157                LANG=C $RPM_CMD -qp --changelog $APT_ARV_FILE > $TMP_DIR/installed_pkg
158            fi
159
160            LANG=C $RPM_CMD -qp --changelog $PKG_NAME > $TMP_DIR/new_pkg
161
162            diff -q $TMP_DIR/installed_pkg $TMP_DIR/new_pkg > /dev/null
163            if [ $? = 0 ]; then
164                echo -e "---- \033[1;31mFAIL\033[0m : "`basename $PKG_NAME`
165                LOG_UPDATE="N"
166            else
167
168                TLD_INSED=`head -n1 $TMP_DIR/installed_pkg|sed s/\*\ //|cut -d" " -f1,2,3,4` 
169                TLD_NEW=`head -n1 $TMP_DIR/new_pkg|sed s/\*\ //|cut -d" " -f1,2,3,4`
170                if [ "$TLD_INSED" = "$TLD_NEW" ]; then
171                    echo "*************************************"
172                    echo "*            WARNING !!             *"
173                    echo "* Change log DATE is NOT updated !! *"
174                    echo "*************************************"
175                fi
176#               echo `basename $PKG_NAME`
177                echo -e "\033[1;32mPass\033[0m ---- : "`basename $PKG_NAME`
178                diff $TMP_DIR/installed_pkg $TMP_DIR/new_pkg > $TMP_DIR/diff_changelog_next
179                if [ -f $TMP_DIR/diff_changelog ]; then
180                    diff -q $TMP_DIR/diff_changelog $TMP_DIR/diff_changelog_next > /dev/null
181                    if [ $? -ne 0 ]; then
182                        DIFF_LINE=`cat $TMP_DIR/diff_changelog_next|wc -l`
183                        if [ $DIFF_LINE -lt "20" ]; then
184                            cat $TMP_DIR/diff_changelog_next
185                        else
186                            cat $TMP_DIR/diff_changelog_next|head -n10
187                            echo "Changelog diff is too long.. skipped."
188                        fi
189                    fi
190                else
191                    DIFF_LINE=`cat $TMP_DIR/diff_changelog_next|wc -l`
192#                   echo $DIFF_LINE
193                    if [ $DIFF_LINE -lt "20" ]; then
194                        cat $TMP_DIR/diff_changelog_next
195                    else
196                        cat $TMP_DIR/diff_changelog_next|head -n10
197                        echo "Changelog diff is too long.. skipped."
198                    fi
199                    mv $TMP_DIR/diff_changelog_next $TMP_DIR/diff_changelog
200                fi
201            fi
202            ;;
203        *)
204            echo $name" is NOT rpm package (skipped)"
205            continue
206            ;;
207    esac
208done
209
210rm -rf $TMP_DIR/diff_changelog_next $TMP_DIR/diff_changelog
211
212echo ""
213if [ $IGNORE_ERR = "N" ]; then
214    if [ $SIG_OK = "N" ]; then
215        exit
216    fi
217    if [ $VEN_OK = "N" ]; then
218        exit
219    fi
220    if [ $LOG_UPDATE = "N" ]; then
221        exit
222    fi
223fi
224
225if [ $IGNORE_DOC = "Y" ]; then
226    echo "Files check (Ignore Document Mode)"
227else
228    echo "Files check"
229fi
230for name in $argfile  ; do
231
232    PKG_NAME=$name
233    echo $PKG_NAME|grep -q ".src.rpm"
234    if [ $? = 0 ]; then
235        echo "Skip ---- : "`basename $PKG_NAME`" (src package)"
236        continue
237    fi
238
239    TMP=`$RPM_CMD -qip $PKG_NAME|grep ^Name|cut -f2 -d:`
240    PKG_BASE_NAME=`echo $TMP|cut -f1 -d" "`
241
242    LANG=C $RPM_CMD -ql $PKG_BASE_NAME > $TMP_DIR/installed_pkg
243    grep -q "$PKG_BASE_NAME is not installed" $TMP_DIR/installed_pkg
244    if [ $? = 0 ]; then
245        echo $PKG_BASE_NAME" is not installed (getting from apt repository)"
246        $APTC_CMD --no-all-versions -q show $PKG_BASE_NAME > $TMP_DIR/current_pkg
247        if [ $? -gt 0 ]; then
248            echo $PKG_BASE_NAME" is not found in apt repository (skipped)"
249            continue
250        fi
251       
252        APT_PKG=`cat $TMP_DIR/current_pkg|grep "^Package:"|cut -f2 -d" "`
253        APT_VER=`cat $TMP_DIR/current_pkg|grep "^Version:"|cut -f2 -d" "|sed "s/.://"`
254        APT_ARCH=`cat $TMP_DIR/current_pkg|grep "^Architecture:"|cut -f2 -d" "`
255        APT_ARV_FILE=$ARV_DIR"/"$APT_PKG"-"$APT_VER"."$APT_ARCH.rpm
256
257        if [ -f $APT_ARV_FILE ]; then
258            echo $APT_ARV_FILE" is found."
259        else
260            $APTG_CMD -d -qq install $APT_PKG
261        fi
262        LANG=C $RPM_CMD -qlp $APT_ARV_FILE > $TMP_DIR/installed_pkg
263    fi
264
265    LANG=C rpm -qlp $PKG_NAME > $TMP_DIR/new_pkg
266
267    if [ $IGNORE_DOC = "Y" ]; then
268        rm -f $TMP_DIR/tmp_pkg
269        grep -v $DOC_DIR/$PKG_BASE_NAME $TMP_DIR/new_pkg > $TMP_DIR/tmp_pkg
270        mv $TMP_DIR/tmp_pkg $TMP_DIR/new_pkg
271        grep -v $DOC_DIR/$PKG_BASE_NAME $TMP_DIR/installed_pkg > $TMP_DIR/tmp_pkg
272        mv $TMP_DIR/tmp_pkg $TMP_DIR/installed_pkg
273    fi
274
275    diff -q $TMP_DIR/installed_pkg $TMP_DIR/new_pkg
276    if [ $? = 0 ]; then
277        echo -e "\033[1;32mPass\033[0m ---- : "$PKG_BASE_NAME
278    else
279        echo -e "---- \033[1;31mFAIL\033[0m : "$PKG_BASE_NAME
280        if [ $VER_MODE = "Y" ]; then
281            diff $TMP_DIR/installed_pkg $TMP_DIR/new_pkg
282        else
283            INSTALLED_BYTE=`wc -c $TMP_DIR/installed_pkg|cut -f1 -d" "`
284            INSTALLED_WORD=`wc -w $TMP_DIR/installed_pkg|cut -f1 -d" "`
285            INSTALLED_LINE=`wc -l $TMP_DIR/installed_pkg|cut -f1 -d" "`
286            NEW_BYTE=`wc -c $TMP_DIR/new_pkg|cut -f1 -d" "`
287            NEW_WORD=`wc -w $TMP_DIR/new_pkg|cut -f1 -d" "`
288            NEW_LINE=`wc -l $TMP_DIR/new_pkg|cut -f1 -d" "`
289            echo "Installed : "$INSTALLED_BYTE $INSTALLED_WORD $INSTALLED_LINE $PKG_BASE_NAME
290            echo "New       : "$NEW_BYTE $NEW_WORD $NEW_LINE `basename $PKG_NAME`
291        fi
292    fi
293done
294
295echo ""
296echo "Requires check"
297for name in $argfile  ; do
298
299    PKG_NAME=$name
300    echo $PKG_NAME|grep -q ".src.rpm"
301    if [ $? = 0 ]; then
302        echo "Skip ---- : "`basename $PKG_NAME`" (src package)"
303        continue
304    fi
305
306    TMP=`rpm -qip $PKG_NAME|grep ^Name|cut -f2 -d:`
307    PKG_BASE_NAME=`echo $TMP|cut -f1 -d" "`
308
309    LANG=C rpm -qRp $PKG_NAME |sort|uniq > $TMP_DIR/new_pkg
310    LANG=C $RPM_CMD -qR $PKG_BASE_NAME |sort|uniq > $TMP_DIR/installed_pkg
311    grep -q "$PKG_BASE_NAME is not installed" $TMP_DIR/installed_pkg
312    if [ $? = 0 ]; then
313        echo $PKG_BASE_NAME" is not installed (getting from apt repository)"
314
315        $APTC_CMD --no-all-versions -q show $PKG_BASE_NAME > $TMP_DIR/current_pkg
316        if [ $? -gt 0 ]; then
317            echo $PKG_BASE_NAME" is not found in apt repository (skipped)"
318            continue
319        fi
320       
321        APT_PKG=`cat $TMP_DIR/current_pkg|grep "^Package:"|cut -f2 -d" "`
322        APT_VER=`cat $TMP_DIR/current_pkg|grep "^Version:"|cut -f2 -d" "|sed "s/.://"`
323        APT_ARCH=`cat $TMP_DIR/current_pkg|grep "^Architecture:"|cut -f2 -d" "`
324        APT_ARV_FILE=$ARV_DIR"/"$APT_PKG"-"$APT_VER"."$APT_ARCH.rpm
325
326        if [ -f $APT_ARV_FILE ]; then
327            echo $APT_ARV_FILE" is found."
328        else
329            $APTG_CMD -d -qq install $APT_PKG
330        fi
331        LANG=C $RPM_CMD -qRp $APT_ARV_FILE |sort|uniq > $TMP_DIR/installed_pkg
332    fi
333
334    diff -q $TMP_DIR/installed_pkg $TMP_DIR/new_pkg > /dev/null
335    if [ $? = 0 ]; then
336        echo -e "\033[1;32mPass\033[0m ---- : "$PKG_BASE_NAME
337    else
338        echo -e "---- \033[1;31mFAIL\033[0m : "$PKG_BASE_NAME
339        diff $TMP_DIR/installed_pkg $TMP_DIR/new_pkg
340    fi
341done
342
343
344echo ""
345echo "Plus Requires check"
346for name in $argfile  ; do
347
348    PKG_NAME=$name
349    PKG_BASE_NAME=`basename $PKG_NAME`
350    PLUS_OK="Y"
351
352    echo $PKG_NAME|grep -q ".src.rpm"
353    if [ $? = 0 ]; then
354        echo "Skip ---- : "`basename $PKG_NAME`" (src package)"
355        continue
356    fi
357    LIBLIST=`LANG=C rpm -qRp $PKG_NAME |cut -f1 -d" "|cut -f1 -d"("|sort|uniq`
358
359    for LIB in $LIBLIST ; do
360        echo $LIB | grep -q "\(/bin\)\|\(/sbin\)\|\(rpmlib\)"
361        if [ $? = 0 ]; then
362            if [ $VER_MODE = "Y" ]; then
363                echo "Skip ....... "$LIB
364            fi
365            continue
366        fi
367        if [ $VER_MODE = "Y" ]; then
368            echo "Checking ... "$LIB
369        fi
370
371        echo $LIB | grep -q "\.so\."
372        if [ $? = 0 ]; then
373            # so lib
374            PNAME=`$APTC_CMD --names-only search $LIB|cut -f1 -d" "|sed s/gtk210.*//`
375            $APTC_CMD --no-all-versions showpkg $PNAME|grep -q "pkglist\.plus"
376            if [ $? = 0 ]; then
377                echo "VinePlus "$PNAME"("$LIB") is required" 
378                PLUS_OK="N"
379            fi
380        else
381            # package
382            PNAME=$LIB
383            $APTC_CMD --no-all-versions showpkg $PNAME|grep -q "pkglist\.plus"
384            if [ $? = 0 ]; then
385                echo "VinePlus "$PNAME" is required" 
386                PLUS_OK="N"
387            fi
388        fi
389    done
390
391    if [ $PLUS_OK = "Y" ]; then
392        echo -e "\033[1;32mPass\033[0m ---- : "$PKG_BASE_NAME
393    else
394        echo -e "---- \033[1;31mFAIL\033[0m : "$PKG_BASE_NAME
395    fi
396done
Note: See TracBrowser for help on using the repository browser.