spk view lib/libspk.sh @ rev 160

libspk.sh: exit downlaod if sum dont match
author Christophe Lincoln <pankso@slitaz.org>
date Thu Feb 16 19:22:27 2017 +0100 (2017-02-16)
parents db947fd832be
children a0bdc170c51e
line source
1 #!/bin/sh
2 #
3 # Libspk - The Spk base function and internal variables used by almost all
4 # spk-tools. Read the README before adding or modifying any code in spk!
5 #
6 # Copyright (C) SliTaz GNU/Linux - BSD License
7 # Author: See AUTHORS files
8 #
9 . /lib/libtaz.sh
10 . /usr/lib/slitaz/libpkg.sh
11 . /etc/slitaz/slitaz.conf
13 # Internal variables.
14 mirrorurl="${root}${PKGS_DB}/mirror"
15 mirrors="${root}${PKGS_DB}/mirrors"
16 installed="${root}${PKGS_DB}/installed"
17 pkgsdesc="${root}${PKGS_DB}/packages.desc"
18 pkgsmd5="${root}${PKGS_DB}/packages.$SUM"
19 pkgsequiv="${root}${PKGS_DB}/packages.equiv"
20 pkgsup="${root}${PKGS_DB}/packages.up"
21 blocked="${root}${PKGS_DB}/blocked.list"
22 activity="${root}${PKGS_DB}/activity"
23 logdir="${root}/var/log/spk"
24 extradb="${root}${PKGS_DB}/extra"
25 tmpdir="/tmp/spk/$RANDOM"
27 #
28 # Sanity checks
29 #
31 if [ ! -d "${root}${PKGS_DB}" ]; then
32 gettext "Can't find DB:"; echo " ${root}${PKGS_DB}"
33 exit 1
34 fi
36 if [ ! -d "${root}${extradb}" ]; then
37 mkdir -p ${root}${extradb}
38 fi
40 if [ ! -d "${root}${CACHE_DIR}" ]; then
41 mkdir -p ${root}${CACHE_DIR}
42 fi
44 #
45 # Functions
46 #
48 # Display receipt information. Expects a receipt to be sourced
49 receipt_info() {
50 cat << EOT
51 $(gettext "Version :") ${VERSION}${EXTRAVERSION}
52 $(gettext "Short desc :") $SHORT_DESC
53 $(gettext "Category :") $CATEGORY
54 EOT
55 }
57 # Display package info from a packages.desc list
58 # Usage: read_pkgsdesc /path/to/packages.desc
59 read_pkgsdesc() {
60 local list="$1"
61 IFS="|"
62 cat $list | while read package version desc category
63 do
64 if [ "$short" ]; then
65 echo $(colorize 32 "$package") $(indent 28 " $version")
66 else
67 newline
68 gettext "Package :"; colorize 32 " $package"
69 gettext "Version :"; echo "$version"
70 gettext "Short desc :"; echo "$desc"
71 fi
72 done && unset IFS
73 }
75 # Extract receipt from tazpkg
76 # Parameters: result_dir package_file
77 extract_receipt() {
78 local dir="$1"
79 local file="$2"
80 cd "$dir"
81 { cpio --quiet -i receipt > /dev/null 2>&1; } < $file
82 cd - >/dev/null
83 }
85 # Extract files.list from tazpkg
86 # Parameters: result_dir package_file
87 extract_fileslist() {
88 local dir="$1"
89 local file="$2"
90 cd "$dir"
91 { cpio --quiet -i files.list > /dev/null 2>&1; } < $file
92 cd - >/dev/null
93 }
95 # Extract library.list from tazpkg
96 # Parameters: result_dir package_file
97 extract_librarylist() {
98 local dir="$1"
99 local file="$2"
100 cd "$dir"
101 { cpio --quiet -i library.list > /dev/null 2>&1; } < $file
102 cd - >/dev/null
103 }
105 is_package_installed() {
106 [ -f "$installed/$1/receipt" ]
107 }
109 # Used by: list
110 count_installed() {
111 local count=$(ls $installed | wc -l)
112 gettext "Installed :"; echo " $count"
113 }
115 # Used by: list
116 count_mirrored() {
117 [ -f "$pkgsmd5" ] || return
118 local count=$(cat $pkgsmd5 | wc -l)
119 gettext "Mirrored :"; echo " $count"
120 }
122 # Check if package is on main or extra mirror.
123 mirrored_pkg() {
124 local name=$1
125 #local find=$(grep "^$name |" $pkgsdesc $extradb/*/*.desc 2>/dev/null)
126 for desc in $(find $extradb $pkgsdesc -name packages.desc); do
127 if grep -q "^$name |" $desc; then
128 db=$(dirname $desc)
129 mirrored=$(grep "^$name |" $desc)
130 mirror=$(cat $db/mirror)
131 break
132 fi
133 done
134 }
136 # Check if the download was sane
137 check_download() {
138 debug "check_download: $file"
140 # Buggy on ARM: continuing download in loop
141 #if ! tail -c 2k $file | fgrep -q 00000000TRAILER; then
142 # gettext "Continuing download of:"; echo " $file"
143 # download "$file" $mirror
144 #fi
146 # Check that the package has the correct checksum
147 local msum=$(fgrep " $package_full" $pkgsmd5)
148 local sum=$($CHECKSUM $file)
149 debug "mirror $SUM : $msum"
150 debug "local $SUM : $sum"
151 if [ "$sum" != "$msum" ]; then
152 gettext "ERROR: Checking:"; colorize 31 " ${CHECKSUM} $(basename $file)"
153 rm -f $file #&& download "$file" $mirror
154 newline && exit 1
155 fi
156 }
158 # Download a file trying all mirrors
159 # Usage: file [url|path]
160 #
161 # Priority to extra is done by mirrored_pkg which tries first to find the
162 # packages in extra mirror, then on official.
163 #
164 download() {
165 local file=$1
166 local uri="${2%/}"
167 local pwd=$(pwd)
168 [ "$quiet" ] && local quiet="-q"
169 [ "$cache" ] && local pwd=$CACHE_DIR
170 [ "$forced" ] && rm -f $pwd/$file
171 debug "download file: $file"
172 debug "DB: $db"
173 # Local mirror ? End by cd to cache we may be installed in. If --get
174 # was used we dl/copy in the current dir.
175 if [ -f "$uri/$file" ]; then
176 [ "$verbose" ] && echo "URI: $uri/"
177 gettext "Using local mirror:"; boldify " $file"
178 [ "$verbose" ] && (gettext "Copying file to:"; colorize 34 " $pwd")
179 cp -f $uri/$file $pwd
180 cd $pwd && return 0
181 fi
182 # In cache ? Root can use --cache to set destdir.
183 if [ -f "$CACHE_DIR/$file" ]; then
184 gettext "Using cache:"; colorize 34 " ${file%.tazpkg}"
185 return 0
186 else
187 [ "$verbose" ] && echo "URL: $uri/"
188 if [ "$db" == "$PKGS_DB" ]; then
189 gettext "Using official mirror:"
190 else
191 gettext "Using extra mirror:"
192 fi
193 boldify " $file"
194 [ "$verbose" ] && (gettext "Destination:"; colorize 34 " $pwd")
195 if [ -f "$pwd/$file" ]; then
196 echo "File exists: $pwd/$file" && return 0
197 fi
198 # TODO: be a spider with wget -s to check if package is on mirror,
199 # if not try all official mirrors ?
200 busybox wget $quiet -c $uri/$file -O $CACHE_DIR/$file
201 cd $CACHE_DIR && check_download
202 fi
203 # Be sure the file was fetched.
204 if [ ! -f "$CACHE_DIR/$file" ] && [ ! -f "$pwd/$file" ]; then
205 gettext "ERROR: Missing file:"; colorize 31 " $CACHE_DIR/$file"
206 newline && return 1
207 fi
208 }
210 # Extract .tazpkg cpio archive into a directory.
211 # Parameters: package_file results_directory
212 extract_package() {
213 local package_file=$1
214 local target_dir=$2
216 # Validate the file
217 #check_valid_tazpkg $package_file
219 # Find the package name
220 local package_name=$(package_name $package_file)
222 # Create destination directory and copy package
223 local dest_dir=$(pwd)/$package_name
224 [ -n "$target_dir" ] && dest_dir=$target_dir/$package_name
225 mkdir -p $dest_dir
226 cp $package_file $dest_dir
228 cd $dest_dir
229 size=$(du -sh $package_file | awk '{print $1}')
230 echo -n $(gettext "Extracting archive"): $size
231 cpio -idm --quiet < ${package_file##*/}
232 rm -f ${package_file##*/}
233 unlzma -c fs.cpio.lzma | cpio -idm --quiet
234 rm fs.cpio.lzma
235 status
236 cd - > /dev/null
237 }
239 # Unset var set by mirrored_pkg
240 unset_mirrored() {
241 unset mirrored mirror db pwd
242 }
244 # Return the full package name, search in all packages.desc and break when
245 # first occurrence is found: Usage: full_package pkgname
246 full_package() {
247 for desc in $(find $extradb $pkgsdesc -name packages.desc); do
248 local line="$(grep "^$1 |" $desc)"
249 if grep -q "^$1 |" $desc; then
250 IFS="|"
251 echo $line | busybox awk '{print $1 "-" $2 ".tazpkg"}'
252 unset IFS && break
253 fi
254 done
255 }
257 # Check if a package is already installed.
258 # Usage: check_installed package
259 check_installed() {
260 local name="$1"
261 if is_package_installed $name; then
262 echo $(boldify "$name") $(gettext "package is already installed")
263 [ "$forced" ] || rm -rf $tmpdir
264 continue
265 fi
266 }
268 # get an already installed package from packages.equiv TODO REDO!
269 equivalent_pkg() {
270 for i in $(grep -hs "^$1=" $pkgsequiv $extradb/*/*.equiv | sed "s/^$1=//")
271 do
272 if echo $i | fgrep -q : ; then
273 # format 'alternative:newname'
274 # if alternative is installed then substitute newname
275 if is_package_installed ${i%:*}; then
276 # substitute package dependency
277 echo ${i#*:}
278 return
279 fi
280 else
281 # if alternative is installed then nothing to install
282 if is_package_installed $i/receipt; then
283 # substitute installed package
284 echo $i
285 return
286 fi
287 fi
288 done
289 # if not found in packages.equiv then no substitution
290 echo $1
291 }
293 # Check for missing deps listed in a receipt packages.
294 # Parameters: package dependencies
295 missing_deps() {
296 local package="$1"
297 shift 1
298 local depends="$@"
300 local deps=0
301 local missing
303 # Calculate missing dependencies
304 for pkgorg in $depends; do
305 local pkg=$(equivalent_pkg $pkgorg)
306 if [ ! -d "$installed/$pkg" ]; then
307 gettext "Missing:"; echo " $pkg"
308 deps=$(($deps+1))
309 elif [ ! -f "$installed/$pkg/receipt" ]; then
310 gettext "WARNING: Dependency loop between:"; newline
311 echo " $package --> $pkg"
312 fi
313 done
315 gettext "Missing dependencies:"; colorize 34 " $deps"
317 # Return true if missing deps
318 [ "$deps" != "0" ]
319 }
321 grepesc() {
322 sed 's/\[/\\[/g'
323 }
325 # Check for ELF file
326 is_elf() {
327 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
328 }
330 # Avoid dirname errors by checking for argument and then remove file and
331 # empty directory. Usage: remove_file file
332 remove_file() {
333 [ "$1" ] || return
334 local dir
335 rm -f $1 2>/dev/null
336 dir="$1"
337 while [ "$dir" != "/" ]; do
338 dir="$(dirname $dir)"
339 rmdir $dir 2> /dev/null || break
340 done
341 }