tazpkg diff modules/check @ rev 840
Add a bunch of modules with new-style support of 'root' (not all commands are modules yet); strip and compress resources.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Fri Aug 28 16:10:34 2015 +0300 (2015-08-28) |
parents | |
children | 0560ba4306a1 |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/modules/check Fri Aug 28 16:10:34 2015 +0300 1.3 @@ -0,0 +1,226 @@ 1.4 +#!/bin/sh 1.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg 1.6 +# check - TazPkg module 1.7 +# Check installed packages set 1.8 + 1.9 + 1.10 +# Connect function libraries 1.11 +. /lib/libtaz.sh 1.12 + 1.13 +# Get TazPkg working environment 1.14 +. @@MODULES@@/getenv 1.15 + 1.16 + 1.17 + 1.18 + 1.19 +# Get repositories priority using $PKGS_DB/priority. 1.20 +# In this file undigest repos are called by their names and main mirror 1.21 +# by 'main'. Sort order: priority 1.22 + 1.23 +look_for_priority() { 1.24 + [ -s "$PKGS_DB/priority" ] && priority=$(cat "$PKGS_DB/priority") 1.25 + 1.26 + for rep in main $(ls "$PKGS_DB/undigest" 2>/dev/null); do 1.27 + if [ ! -s "$PKGS_DB/priority" ] || ! grep -q "^$rep$" "$PKGS_DB/priority"; then 1.28 + priority=$(echo -e "$priority\n$rep") 1.29 + fi 1.30 + done 1.31 + 1.32 + priority=$(echo "$priority" | sed '/^$/d' | \ 1.33 + while read line; do 1.34 + case $line in 1.35 + (main) echo "$PKGS_DB";; 1.36 + (*) echo "$PKGS_DB/undigest/$line";; 1.37 + esac 1.38 + done) 1.39 +} 1.40 + 1.41 + 1.42 +# Print package name if not printed yet 1.43 +print_pkgname() { 1.44 + if [ "$PACKAGE" != "$PACKAGE_PRINTED" ]; then 1.45 + [ -n "$PACKAGE_PRINTED" ] && footer 1.46 + title 'Package %s' "$PACKAGE-$VERSION$EXTRAVERSION" 1.47 + PACKAGE_PRINTED="$PACKAGE" 1.48 + fi 1.49 +} 1.50 + 1.51 + 1.52 +# get an already installed package from packages.equiv 1.53 + 1.54 +equivalent_pkg() { 1.55 + for i in $(grep -hs "^$1=" "$PKGS_DB/packages.equiv" \ 1.56 + "$PKGS_DB"/undigest/*/packages.equiv | sed "s/^$1=//"); do 1.57 + if echo $i | fgrep -q : ; then 1.58 + # format 'alternative:newname' 1.59 + # if alternative is installed then substitute newname 1.60 + if [ -f "$INSTALLED/${i%:*}/receipt" ]; then 1.61 + # substitute package dependency 1.62 + echo "${i#*:}" 1.63 + return 1.64 + fi 1.65 + else 1.66 + # if alternative is installed then nothing to install 1.67 + if [ -f "$INSTALLED/$i/receipt" ]; then 1.68 + # substitute installed package 1.69 + echo "$i" 1.70 + return 1.71 + fi 1.72 + fi 1.73 + done 1.74 + # if not found in packages.equiv then no substitution 1.75 + echo "$1" 1.76 +} 1.77 + 1.78 + 1.79 +# Check for loop in deps tree. 1.80 + 1.81 +check_for_deps_loop() { 1.82 + local list pkg="$1" deps 1.83 + shift 1.84 + [ -n "$1" ] || return 1.85 + list='' 1.86 + 1.87 + # Filter out already processed deps 1.88 + for i in $@; do 1.89 + case " $ALL_DEPS" in 1.90 + *\ $i\ *) ;; 1.91 + *) list="$list $i";; 1.92 + esac 1.93 + done 1.94 + ALL_DEPS="$ALL_DEPS$list " 1.95 + for i in $list; do 1.96 + [ -f "$i/receipt" ] || continue 1.97 + deps="$(unset DEPENDS; . "$i/receipt"; echo $DEPENDS)" 1.98 + case " $deps " in 1.99 + *\ $pkg\ *) 1.100 + print_pkgname 1.101 + echo -e "$MSG $i"; MSG='';; 1.102 + *) 1.103 + check_for_deps_loop "$pkg" "$deps";; 1.104 + esac 1.105 + done 1.106 +} 1.107 + 1.108 + 1.109 +grepesc() { sed 's/\[/\\[/g'; } 1.110 + 1.111 + 1.112 + 1.113 + 1.114 +# Get repositories priority list. 1.115 +look_for_priority 1.116 + 1.117 +cd "$INSTALLED" 1.118 +if [ -z "$2" -o -n "$full" ]; then PACKAGES="$(ls)"; else PACKAGES="$2"; fi 1.119 +PACKAGE_PRINTED='' 1.120 + 1.121 +for PACKAGE in $PACKAGES; do 1.122 + 1.123 + if [ ! -f "$PACKAGE/receipt" ]; then 1.124 + print_pkgname 1.125 + _ 'The package installation has not completed' 1.126 + continue 1.127 + fi 1.128 + 1.129 + unset DEPENDS EXTRAVERSION 1.130 + . "$PACKAGE/receipt" 1.131 + if [ -s "$PACKAGE/modifiers" ]; then 1.132 + print_pkgname 1.133 + _ 'The package has been modified by:' 1.134 + awk '{print " " $0}' "$PACKAGE/modifiers" 1.135 + fi 1.136 + 1.137 + MSG="$(_n 'Files lost from package:')\n" 1.138 + while read file; do 1.139 + [ -e "$file" ] && continue 1.140 + if [ -L "$file" ]; then 1.141 + MSG="$MSG $(_n 'target of symlink')" 1.142 + fi 1.143 + print_pkgname 1.144 + echo -e "$MSG $file" 1.145 + MSG='' 1.146 + done < "$PACKAGE/files.list" 1.147 + 1.148 + MSG="$(_n 'Missing dependencies for package:')\n" 1.149 + for i in $DEPENDS; do 1.150 + [ -d "$i" ] && continue 1.151 + [ -d "$(equivalent_pkg "$i")" ] && continue 1.152 + print_pkgname 1.153 + echo -e "$MSG $i" 1.154 + MSG='' 1.155 + done 1.156 + 1.157 + MSG="$(_n 'Dependencies loop between package and:')\n" 1.158 + ALL_DEPS='' 1.159 + check_for_deps_loop "$PACKAGE" "$DEPENDS" 1.160 +done 1.161 +[ -n "$PACKAGE_PRINTED" ] && footer 1.162 + 1.163 +_ 'Looking for known bugs...' 1.164 +if [ -z "$2" -o -n "$full" ]; then tazpkg bugs; else tazpkg bugs "$2"; fi 1.165 + 1.166 + 1.167 +if [ -n "$full" ]; then 1.168 + separator 1.169 + 1.170 + title 'Mismatch checksum of installed files:' 1.171 + 1.172 + for PACKAGE in $PACKAGES; do 1.173 + file="$PACKAGE/$CHECKSUM" 1.174 + CONFIG_FILES='' 1.175 + . "$PACKAGE/receipt" 1.176 + [ -s "$file" ] || continue 1.177 + while read md5 f; do 1.178 + [ -f "$f" ] || continue 1.179 + for i in $CONFIG_FILES; do 1.180 + case "$f" in 1.181 + $i|$i/*) continue 2;; 1.182 + esac 1.183 + done 1.184 + echo "$md5 $f" 1.185 + done < "$file" | busybox $CHECKSUM -c - 2>/dev/null | grep -v OK$ | sed "s/: FAILED$//" 1.186 + done 1.187 + footer 1.188 + 1.189 + title 'Check file providers:' 1.190 + FILES=' ' 1.191 + for PACKAGE in $PACKAGES; do 1.192 + for file in $(cat "$PACKAGE/files.list"); do 1.193 + [ -d "$file" ] && continue 1.194 + case "$FILES" in 1.195 + *\ $file\ *) continue;; 1.196 + esac 1.197 + [ $(grep "^$(echo $file | grepesc)$" */files.list 2> /dev/null | wc -l) -gt 1 ] || continue 1.198 + FILES="$FILES$file " 1.199 + newline 1.200 + _ 'The following packages provide file "%s":' "$file" 1.201 + grep -l "^$(echo "$file" | grepesc)$" */files.list | \ 1.202 + while read f; do 1.203 + pkg=${f%/files.list} 1.204 + if [ -f "$pkg/modifiers" ]; then 1.205 + overriders=$(_n '(overridden by %s)' "$(tr '\n' ' ' < $pkg/modifiers | sed 's| $||')") 1.206 + else 1.207 + overriders='' 1.208 + fi 1.209 + echo -n " * $pkg $overriders" 1.210 + newline 1.211 + done 1.212 + done 1.213 + done 1.214 + footer 1.215 + 1.216 + if [ -n "$full" ]; then 1.217 + title 'Alien files:' 1.218 + MSG="$(_n 'No package has installed the following files:')\n" 1.219 + find /etc /bin /sbin /lib /usr /var/www -not -type d 2>/dev/null | \ 1.220 + while read file; do 1.221 + case "$file" in *\[*) continue;; esac 1.222 + grep -q "^$(echo $file | grepesc)$" */files.list && continue 1.223 + echo -e "$MSG $file" 1.224 + MSG='' 1.225 + done 1.226 + footer 1.227 + fi 1.228 +fi 1.229 +_ 'Check completed.'; newline