tazpkg view modules/check @ rev 842
tazpkg: internal command 'call ...' to call tazpkg functions from modules (to share functions between tazpkg and its modules)
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Wed Sep 02 03:31:47 2015 +0300 (2015-09-02) |
parents | a02e36d44d06 |
children | d6cbd0c5f273 |
line source
1 #!/bin/sh
2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
3 # check - TazPkg module
4 # Check installed packages set
7 # Connect function libraries
8 . /lib/libtaz.sh
10 # Get TazPkg working environment
11 . @@MODULES@@/getenv
16 # Print package name if not printed yet
17 print_pkgname() {
18 if [ "$PACKAGE" != "$PACKAGE_PRINTED" ]; then
19 [ -n "$PACKAGE_PRINTED" ] && footer
20 title 'Package %s' "$PACKAGE-$VERSION$EXTRAVERSION"
21 PACKAGE_PRINTED="$PACKAGE"
22 fi
23 }
26 # get an already installed package from packages.equiv
28 equivalent_pkg() {
29 for i in $(grep -hs "^$1=" "$PKGS_DB/packages.equiv" \
30 "$PKGS_DB"/undigest/*/packages.equiv | sed "s/^$1=//"); do
31 if echo $i | fgrep -q : ; then
32 # format 'alternative:newname'
33 # if alternative is installed then substitute newname
34 if [ -f "$INSTALLED/${i%:*}/receipt" ]; then
35 # substitute package dependency
36 echo "${i#*:}"
37 return
38 fi
39 else
40 # if alternative is installed then nothing to install
41 if [ -f "$INSTALLED/$i/receipt" ]; then
42 # substitute installed package
43 echo "$i"
44 return
45 fi
46 fi
47 done
48 # if not found in packages.equiv then no substitution
49 echo "$1"
50 }
53 # Check for loop in deps tree.
55 check_for_deps_loop() {
56 local list pkg="$1" deps
57 shift
58 [ -n "$1" ] || return
59 list=''
61 # Filter out already processed deps
62 for i in $@; do
63 case " $ALL_DEPS" in
64 *\ $i\ *) ;;
65 *) list="$list $i";;
66 esac
67 done
68 ALL_DEPS="$ALL_DEPS$list "
69 for i in $list; do
70 [ -f "$i/receipt" ] || continue
71 deps="$(unset DEPENDS; . "$i/receipt"; echo $DEPENDS)"
72 case " $deps " in
73 *\ $pkg\ *)
74 print_pkgname
75 echo -e "$MSG $i"; MSG='';;
76 *)
77 check_for_deps_loop "$pkg" "$deps";;
78 esac
79 done
80 }
83 grepesc() { sed 's/\[/\\[/g'; }
88 # Get repositories priority list.
89 priority=$(tazpkg call look_for_priority)
91 cd "$INSTALLED"
92 if [ -z "$2" -o -n "$full" ]; then PACKAGES="$(ls)"; else PACKAGES="$2"; fi
93 PACKAGE_PRINTED=''
95 for PACKAGE in $PACKAGES; do
97 if [ ! -f "$PACKAGE/receipt" ]; then
98 print_pkgname
99 _ 'The package installation has not completed'
100 continue
101 fi
103 unset DEPENDS EXTRAVERSION
104 . "$PACKAGE/receipt"
105 if [ -s "$PACKAGE/modifiers" ]; then
106 print_pkgname
107 _ 'The package has been modified by:'
108 awk '{print " " $0}' "$PACKAGE/modifiers"
109 fi
111 MSG="$(_n 'Files lost from package:')\n"
112 while read file; do
113 [ -e "$file" ] && continue
114 if [ -L "$file" ]; then
115 MSG="$MSG $(_n 'target of symlink')"
116 fi
117 print_pkgname
118 echo -e "$MSG $file"
119 MSG=''
120 done < "$PACKAGE/files.list"
122 MSG="$(_n 'Missing dependencies for package:')\n"
123 for i in $DEPENDS; do
124 [ -d "$i" ] && continue
125 [ -d "$(equivalent_pkg "$i")" ] && continue
126 print_pkgname
127 echo -e "$MSG $i"
128 MSG=''
129 done
131 MSG="$(_n 'Dependencies loop between package and:')\n"
132 ALL_DEPS=''
133 check_for_deps_loop "$PACKAGE" "$DEPENDS"
134 done
135 [ -n "$PACKAGE_PRINTED" ] && footer
137 _ 'Looking for known bugs...'
138 if [ -z "$2" -o -n "$full" ]; then tazpkg bugs; else tazpkg bugs "$2"; fi
141 if [ -n "$full" ]; then
142 separator
144 title 'Mismatch checksum of installed files:'
146 for PACKAGE in $PACKAGES; do
147 file="$PACKAGE/$CHECKSUM"
148 CONFIG_FILES=''
149 . "$PACKAGE/receipt"
150 [ -s "$file" ] || continue
151 while read md5 f; do
152 [ -f "$f" ] || continue
153 for i in $CONFIG_FILES; do
154 case "$f" in
155 $i|$i/*) continue 2;;
156 esac
157 done
158 echo "$md5 $f"
159 done < "$file" | busybox $CHECKSUM -c - 2>/dev/null | grep -v OK$ | sed "s/: FAILED$//"
160 done
161 footer
163 title 'Check file providers:'
164 FILES=' '
165 for PACKAGE in $PACKAGES; do
166 for file in $(cat "$PACKAGE/files.list"); do
167 [ -d "$file" ] && continue
168 case "$FILES" in
169 *\ $file\ *) continue;;
170 esac
171 [ $(grep "^$(echo $file | grepesc)$" */files.list 2> /dev/null | wc -l) -gt 1 ] || continue
172 FILES="$FILES$file "
173 newline
174 _ 'The following packages provide file "%s":' "$file"
175 grep -l "^$(echo "$file" | grepesc)$" */files.list | \
176 while read f; do
177 pkg=${f%/files.list}
178 if [ -f "$pkg/modifiers" ]; then
179 overriders=$(_n '(overridden by %s)' "$(tr '\n' ' ' < $pkg/modifiers | sed 's| $||')")
180 else
181 overriders=''
182 fi
183 echo -n " * $pkg $overriders"
184 newline
185 done
186 done
187 done
188 footer
190 if [ -n "$full" ]; then
191 title 'Alien files:'
192 MSG="$(_n 'No package has installed the following files:')\n"
193 find /etc /bin /sbin /lib /usr /var/www -not -type d 2>/dev/null | \
194 while read file; do
195 case "$file" in *\[*) continue;; esac
196 grep -q "^$(echo $file | grepesc)$" */files.list && continue
197 echo -e "$MSG $file"
198 MSG=''
199 done
200 footer
201 fi
202 fi
203 _ 'Check completed.'; newline