spk view lib/libspk.sh @ rev 80

Small fixes and improvments to add, mirror and libspk.sh
author Christophe Lincoln <pankso@slitaz.org>
date Thu May 24 17:00:55 2012 +0200 (2012-05-24)
parents 17e896f1d41d
children 59147c9f5113
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 modifing 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 #
41 # Functions
42 #
44 # Display receipt information. Expects a receipt to be sourced
45 receipt_info() {
46 cat << EOT
47 $(gettext "Version :") ${VERSION}${EXTRAVERSION}
48 $(gettext "Short desc :") $SHORT_DESC
49 $(gettext "Category :") $CATEGORY
50 EOT
51 }
53 # Display package info from a packages.desc list
54 # Usage: read_pkgsdesc /path/to/packages.desc
55 read_pkgsdesc() {
56 local list="$1"
57 IFS="|"
58 cat $list | while read package version desc category
59 do
60 if [ "$short" ]; then
61 echo -n "$(colorize 32 "$package")"; indent 28 " $version"
62 else
63 newline
64 gettext "Package :"; colorize 32 " $package"
65 gettext "Version :"; echo "$version"
66 gettext "Short desc :"; echo "$desc"
67 fi
68 done && unset IFS
69 }
71 # Extract receipt from tazpkg
72 # Parameters: result_dir package_file
73 extract_receipt() {
74 local dir="$1"
75 local file="$2"
76 cd "$dir"
77 { cpio --quiet -i receipt > /dev/null 2>&1; } < $file
78 cd - >/dev/null
79 }
81 # Extract files.list from tazpkg
82 # Parameters: result_dir package_file
83 extract_fileslist() {
84 local dir="$1"
85 local file="$2"
86 cd "$dir"
87 { cpio --quiet -i files.list > /dev/null 2>&1; } < $file
88 cd - >/dev/null
89 }
91 is_package_installed() {
92 [ -f "$installed/$1/receipt" ]
93 }
95 # Used by: list
96 count_installed() {
97 local count=$(ls $installed | wc -l)
98 gettext "Installed :"; echo " $count"
99 }
101 # Used by: list
102 count_mirrored() {
103 [ -f "$pkgsmd5" ] || return
104 local count=$(cat $pkgsmd5 | wc -l)
105 gettext "Mirrored :"; echo " $count"
106 }
108 # Check if package is on main or extra mirror.
109 mirrored_pkg() {
110 local name=$1
111 #local find=$(grep "^$name |" $pkgsdesc $extradb/*/*.desc 2>/dev/null)
112 for desc in $(find $extradb $pkgsdesc -name packages.desc); do
113 if grep -q "^$name |" $desc; then
114 db=$(dirname $desc)
115 mirrored=$(grep "^$name |" $desc)
116 mirror=$(cat $db/mirror)
117 break
118 fi
119 done
120 }
122 # Check if the download was sane
123 check_download() {
124 debug "check_download: $file"
125 if ! tail -c 2k $file | fgrep -q 00000000TRAILER; then
126 gettext "Continuing download of:"; echo " $file"
127 download "$file" $mirror
128 fi
129 # Check that the package has the correct checksum
130 local msum=$(fgrep " $package_full" $pkgsmd5)
131 local sum=$($CHECKSUM $file)
132 debug "mirror $SUM : $msum"
133 debug "local $SUM : $sum"
134 if [ "$sum" != "$msum" ]; then
135 rm -f $file && download "$file" $mirror
136 fi
137 }
139 # Download a file trying all mirrors
140 # Usage: file [url|path]
141 #
142 # Priority to extra is done by mirrored_pkg wich try first to find the
143 # packages in extra mirror, then on official.
144 #
145 download() {
146 local file=$1
147 local uri="${2%/}"
148 local pwd=$(pwd)
149 [ "$quiet" ] && local quiet="-q"
150 [ "$cache" ] && local pwd=$CACHE_DIR
151 [ "$get" ] || local pwd=$CACHE_DIR
152 [ "$forced" ] && rm -f $pwd/$file
153 debug "download file: $file"
154 debug "DB: $db"
155 # Local mirror ? End by cd to cache, we may be installind. If --get
156 # was used we dl/copy in the current dir.
157 if [ -f "$uri/$file" ]; then
158 [ "$verbose" ] && echo "URI: $uri/"
159 gettext "Using local mirror:"; boldify " $file"
160 [ "$verbose" ] && (gettext "Copying file to:"; colorize 34 " $pwd")
161 cp -f $uri/$file $pwd
162 cd $pwd && return 0
163 fi
164 # In cache ? Root can use --cache to set destdir.
165 if [ -f "$CACHE_DIR/$file" ]; then
166 gettext "Using cache:"; colorize 34 " ${file%.tazpkg}"
167 return 0
168 else
169 [ "$verbose" ] && echo "URL: $uri/"
170 if [ "$db" == "$PKGS_DB" ]; then
171 gettext "Using official mirror:"
172 else
173 gettext "Using extra mirror:"
174 fi
175 boldify " $file"
176 [ "$verbose" ] && (gettext "Destination:"; colorize 34 " $pwd")
177 if [ -f "$pwd/$file" ]; then
178 echo "File exist: $pwd/$file" && return 0
179 fi
180 # TODO: be a spider with wget -s to check if package is on mirror,
181 # if not try all official mirrors ?
182 wget $quiet -c $uri/$file -O $CACHE_DIR/$file
183 cd $CACHE_DIR && check_download
184 fi
185 # Be sure the file was fetched.
186 if [ ! -f "$pwd/$file" ] || [ ! -f "$CACHE_DIR/$file" ]; then
187 gettext "ERROR: Missing file:"; colorize 31 " $file"
188 newline && exit 1
189 fi
190 }
192 # Extract .tazpkg cpio archive into a directory.
193 # Parameters: package_file results_directory
194 extract_package() {
195 local package_file=$1
196 local target_dir=$2
198 # Validate the file
199 #check_valid_tazpkg $package_file
201 # Find the package name
202 local package_name=$(package_name $package_file)
204 # Create destination directory and copy package
205 local dest_dir=$(pwd)/$package_name
206 [ -n "$target_dir" ] && dest_dir=$target_dir/$package_name
207 mkdir -p $dest_dir
208 cp $package_file $dest_dir
210 cd $dest_dir
211 size=$(du -sh $package_file | awk '{print $1}')
212 echo -n $(gettext "Extracting archive"): $size
213 cpio -idm --quiet < ${package_file##*/}
214 rm -f ${package_file##*/}
215 unlzma -c fs.cpio.lzma | cpio -idm --quiet
216 rm fs.cpio.lzma
217 status
218 cd - > /dev/null
219 }
221 # Unser var set by mirrored_pkg
222 unset_mirrored() {
223 unset mirrored mirror db pwd
224 }
226 # Return the full package name, search in all packages.desc and break when
227 # first occurance is found: Usage: full_package pkgname
228 full_package() {
229 for desc in $(find $extradb $pkgsdesc -name packages.desc); do
230 local line="$(grep "^$1 |" $desc)"
231 if grep -q "^$1 |" $desc; then
232 IFS="|"
233 echo $line | busybox awk '{print $1 "-" $2 ".tazpkg"}'
234 unset IFS && break
235 fi
236 done
237 }
239 # Check if a package is already installed.
240 # Usage: check_installed package
241 check_installed() {
242 local name="$1"
243 if [ -d "$installed/$name" ]; then
244 echo $(boldify "$name") $(gettext "package is already installed")
245 [ "$forced" ] || rm -rf $tmpdir
246 continue
247 fi
248 }
250 # get an already installed package from packages.equiv TODO REDO!
251 equivalent_pkg() {
252 for i in $(grep -hs "^$1=" $pkgsequiv $extradb/*/*.equiv | sed "s/^$1=//")
253 do
254 if echo $i | fgrep -q : ; then
255 # format 'alternative:newname'
256 # if alternative is installed then substitute newname
257 if [ -f $installed/${i%:*}/receipt ]; then
258 # substitute package dependancy
259 echo ${i#*:}
260 return
261 fi
262 else
263 # if alternative is installed then nothing to install
264 if [ -f $installed/$i/receipt ]; then
265 # substitute installed package
266 echo $i
267 return
268 fi
269 fi
270 done
271 # if not found in packages.equiv then no substitution
272 echo $1
273 }
275 # Check for missing deps listed in a receipt packages.
276 # Parameters: package dependencies
277 missing_deps() {
278 local package="$1"
279 shift 1
280 local depends="$@"
282 local deps=0
283 local missing
285 # Calculate missing dependencies
286 for pkgorg in $depends; do
287 local pkg=$(equivalent_pkg $pkgorg)
288 if [ ! -d "$installed/$pkg" ]; then
289 gettext "Missing:"; echo " $pkg"
290 deps=$(($deps+1))
291 elif [ ! -f "$installed/$pkg/receipt" ]; then
292 gettext "WARNING: Dependency loop between:"; newline
293 echo " $package --> $pkg"
294 fi
295 done
297 gettext "Missing dependencies:"; echo " $(colorize 34 "$deps")"
299 # Return true if missing deps
300 [ "$deps" != "0" ]
301 }
303 grepesc() {
304 sed 's/\[/\\[/g'
305 }
307 # Check for ELF file
308 is_elf() {
309 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
310 }
312 # Exec functions directly for developement purpose.
313 case $1 in
314 *_*) func=$1 && shift && $func $@ ;;
315 esac