tazpkg view tazpkg @ rev 384

Improvement: use ln instead of cp when "downloading" local files to save cache. This make tazpkg recharge useless for locals repositories.
author Antoine Bodin <gokhlayeh@slitaz.org>
date Wed Dec 08 16:24:53 2010 +0100 (2010-12-08)
parents 2c411b595a60
children 85e885ecb314
line source
1 #!/bin/sh
2 # Tazpkg - Tiny autonomous zone packages manager.
3 #
4 # This is a lightwight packages manager for *.tazpkg files, all written in
5 # SHell script. It works well with Busybox ash shell and bash. Tazpkg lets you
6 # list, install, remove, download or get information about a package. You can
7 # use 'tazpkg usage' to get a list of commands with short descriptions. Tazpkg
8 # also resolves dependencies and can upgrade packages from a mirror. I18n is
9 # done with gettext and eval_gettext, ex:
10 # gettext "displayed text"; echo
11 # eval_gettext "display \$VARIABLE"; echo
12 # echo -e "BOLD `gettext \"i18n message\"`"
13 #
14 # (C) 2007-2010 SliTaz - GNU General Public License v3.
15 #
16 # Authors : Christophe Lincoln <pankso@slitaz.org>
17 # Pascal Bellard <pascal.bellard@slitaz.org>
18 # Eric Joseph-Alexandre <erjo@slitaz.org>
19 # Paul Issott <paul@slitaz.org>
20 # Rohit Joshi <jozee@slitaz.org>
21 #
22 VERSION=4.0
24 ####################
25 # Script variables #
26 ####################
28 . /etc/slitaz/tazpkg.conf
30 # Include gettext helper script.
31 . /usr/bin/gettext.sh
33 # Export package name for gettext.
34 TEXTDOMAIN='tazpkg'
35 export TEXTDOMAIN
37 # Initialize some variables to use words rather than numbers for functions
38 # and actions.
39 COMMAND=$1
40 if [ -f "$2" ]; then
41 # Set pkg basename for install, extract
42 PACKAGE=$(basename ${2%.tazpkg} 2>/dev/null)
43 else
44 # Pkg name for remove, search and all other cmds
45 PACKAGE=${2%.tazpkg}
46 fi
47 PACKAGE_FILE=$2
48 TARGET_DIR=$3
49 TOP_DIR=`pwd`
50 INSTALL_LIST=""
52 # Path to tazpkg used dir and configuration files
53 INSTALLED=$LOCALSTATE/installed
54 MIRROR=$LOCALSTATE/mirror
55 BLOCKED=$LOCALSTATE/blocked-packages.list
56 DEFAULT_MIRROR="http://mirror.slitaz.org/packages/`cat /etc/slitaz-release`/"
58 # Check if the directories and files used by Tazpkg
59 # exist. If not and user is root we create them.
60 if test $(id -u) = 0 ; then
61 if [ ! -d "$CACHE_DIR" ]; then
62 mkdir -p $CACHE_DIR
63 fi
64 if [ ! -d "$INSTALLED" ]; then
65 mkdir -p $INSTALLED
66 fi
67 if [ ! -f "$LOCALSTATE/mirror" ]; then
68 echo "$DEFAULT_MIRROR" > $LOCALSTATE/mirror
69 fi
70 fi
72 ####################
73 # Script functions #
74 ####################
76 # Print the usage.
77 usage ()
78 {
79 echo -e "SliTaz package manager - Version: $VERSION\n
80 \033[1mUsage:\033[0m tazpkg [command] [package|dir|pattern|list|cat|--opt] [dir|--opt]
81 tazpkg shell\n
82 \033[1mCommands: \033[0m
83 usage Print this short usage.
84 bugs Show known bugs in packages.
85 list List installed packages on the system by category or all.
86 xhtml-list Create a xHTML list of installed packages.
87 list-mirror List all available packages on the mirror (--diff for new).
88 info Print information about a package.
89 desc Print description of a package (if it exists).
90 list-files List the files installed with a package.
91 list-config List the configuration files.
92 search Search for a package by pattern or name (options: -i|-l|-m).
93 search-pkgname Search on mirror for package having a particular file.
94 search-file Search for file(s) in all installed packages files.
95 install Install a local (*.tazpkg) package (--forced to force).
96 install-list Install all packages from a list of packages.
97 remove Remove the specified package and all installed files.
98 extract Extract a (*.tazpkg) package into a directory.
99 pack Pack an unpacked or prepared package tree.
100 recharge Recharge your packages.list from the mirror.
101 repack Create a package archive from an installed package.
102 repack-config Create a package archive with configuration files.
103 recompress Rebuild a package with the better compression ratio.
104 upgrade Upgrade one or all installed/listed package(s) on the mirror.
105 upgradeable Build upgradeable packages list quickly.
106 block|unblock Block an installed package version or unblock it for upgrade.
107 get Download a package into the current directory.
108 get-install Download and install a package from the mirror.
109 get-install-list Download and install a list of packages from the mirror.
110 check Verify consistency of installed packages.
111 add-flavor Install the flavor list of packages.
112 install-flavor Install the flavor list of packages and remove other ones.
113 set-release Change release and update packages.
114 clean-cache Clean all packages downloaded in cache directory.
115 depends Display dependencies tree.
116 rdepends Display reverse dependencies tree.
117 convert Convert a deb/rpm/tgz/arch package to a slitaz (.tazpkg).
118 link Link a package from another slitaz installation.
119 setup-mirror Change the mirror url configuration.
120 list-undigest List undigest mirrors.
121 remove-undigest Remove an undigest mirror.
122 add-undigest Add an undigest mirror.
123 setup-undigest Update an undigest mirror.
124 reconfigure Replay post install script from package."
125 }
127 # Status function with color (supported by Ash).
128 status()
129 {
130 local CHECK=$?
131 echo -en "\\033[70G[ "
132 if [ $CHECK = 0 ]; then
133 echo -en "\\033[1;33mOK"
134 else
135 echo -en "\\033[1;31mFailed"
136 fi
137 echo -e "\\033[0;39m ]"
138 return $CHECK
139 }
141 # Check if user is root to install, or remove packages.
142 check_root()
143 {
144 if test $(id -u) != 0 ; then
145 gettext \
146 "You must be root to run tazpkg with this option. Please use the command:
147 su followed by the root password to become super-user."; echo
148 echo "" && exit 0
149 fi
150 }
152 # Check for a package name on cmdline.
153 check_for_package_on_cmdline()
154 {
155 if [ -z "$PACKAGE" ]; then
156 echo ""
157 gettext "Please specify a package name on the command line."; echo
158 echo ""
159 exit 0
160 fi
161 }
163 # Check if the package (*.tazpkg) exist before installing or extracting.
164 check_for_package_file()
165 {
166 if [ ! -f "$PACKAGE_FILE" ]; then
167 echo ""
168 eval_gettext "Unable to find: \$PACKAGE_FILE"; echo
169 echo "" && exit 0
170 fi
171 }
173 # Check for the receipt of an installed package.
174 check_for_receipt()
175 {
176 if [ ! -f "$1$INSTALLED/$PACKAGE/receipt" ]; then
177 FS=$1
178 echo ""
179 eval_gettext "Unable to find the receipt: \$FS\$INSTALLED/\$PACKAGE/receipt"; echo
180 echo "" && exit 0
181 fi
182 }
184 # Get package name in a directory
185 package_fullname_in_dir()
186 {
187 [ -f $2$1/receipt ] || return
188 EXTRAVERSION=""
189 . $2$1/receipt
190 echo $PACKAGE-$VERSION$EXTRAVERSION
191 }
193 # Get package name that is already installed.
194 get_installed_package_pathname()
195 {
196 for i in $2$INSTALLED/${1%%-*}*; do
197 [ -d $i ] || continue
198 if [ "$1" = "$(package_fullname_in_dir $i $2)" ]; then
199 echo $i
200 return
201 fi
202 done
203 }
205 # Check if a package is already installed.
206 check_for_installed_package()
207 {
208 if [ -n "$(get_installed_package_pathname $PACKAGE $1)" ]; then
209 echo ""
210 eval_gettext "\$PACKAGE package is already installed. You can
211 use the --forced option to force installation or remove it and reinstall."; echo
212 echo "" && exit 0
213 fi
214 }
216 # Check for packages.list to download and install packages.
217 check_for_packages_list()
218 {
219 if [ ! -f "$LOCALSTATE/packages.list" ]; then
220 if test $(id -u) = 0 ; then
221 tazpkg recharge
222 else
223 echo ""
224 eval_gettext "Unable to find the list: \$LOCALSTATE/packages.list"; echo
225 gettext \
226 "You must probably run 'tazpkg recharge' as root to get the latest list of
227 packages available on the mirror."; echo
228 echo "" && exit 0
229 fi
230 fi
231 }
233 # get an already installed package from packages.equiv
234 equivalent_pkg()
235 {
236 for i in $(grep -hs "^$1=" $LOCALSTATE/packages.equiv \
237 $LOCALSTATE/undigest/*/packages.equiv | sed "s/^$1=//"); do
238 if echo $i | grep -q : ; then
239 # format 'alternative:newname'
240 # if alternative is installed then substitute newname
241 if [ -f $2$INSTALLED/${i%:*}/receipt ]; then
242 # substitute package dependancy
243 echo ${i#*:}
244 return
245 fi
246 else
247 # if alternative is installed then nothing to install
248 if [ -f $2$INSTALLED/$i/receipt ]; then
249 # substitute installed package
250 echo $i
251 return
252 fi
253 fi
254 done
255 # if not found in packages.equiv then no substitution
256 echo $1
257 }
259 # get a virtual package from packages.equiv
260 virtual_pkg()
261 {
262 for i in $(grep -hs "^$1=" $LOCALSTATE/packages.equiv \
263 $LOCALSTATE/undigest/*/packages.equiv | sed "s/^$1=//"); do
264 if echo $i | grep -q : ; then
265 # format 'alternative:newname'
266 # if alternative is installed then substitute newname
267 if [ -f $2$INSTALLED/${i%:*}/receipt ]; then
268 # substitute package dependancy
269 echo ${i#*:}
270 return
271 fi
272 else
273 # unconditional substitution
274 echo $i
275 return
276 fi
277 done
278 }
280 # Get package filename available on the mirror
281 get_package_filename()
282 {
283 local pkg
284 pkg=$(grep -A 1 -sh "^$1$" $LOCALSTATE/packages.txt \
285 $LOCALSTATE/undigest/*/packages.txt | tail -1)
286 pkg=$(echo $pkg)
287 [ -n "$pkg" ] && pkg=$(grep -sh "^$1-$pkg" \
288 $LOCALSTATE/packages.list \
289 $LOCALSTATE/undigest/*/packages.list | head -1)
290 [ -n "$pkg" ] || pkg=$(grep -sh "^$1-[0-9]" \
291 $LOCALSTATE/packages.list \
292 $LOCALSTATE/undigest/*/packages.list | head -1)
293 [ -n "$pkg" ] || pkg=$(grep -sh "^$1-.[\.0-9]" \
294 $LOCALSTATE/packages.list \
295 $LOCALSTATE/undigest/*/packages.list | head -1)
296 if [ -z "$pkg" ]; then
297 # Check for vitual package
298 local equiv
299 equiv=$(virtual_pkg $1)
300 if [ "$equiv" != "$1" ]; then
301 PACKAGE=$equiv
302 get_package_filename $PACKAGE
303 return
304 fi
305 fi
306 echo $pkg
307 }
309 # Check for a package in packages.list. Used by get and get-install to grep
310 # package basename.
311 check_for_package_in_list()
312 {
313 local filename
314 local check_only
315 check_only="$1"
316 filename=$(get_package_filename $PACKAGE)
317 if [ -n "$filename" ]; then
318 PACKAGE=$filename
319 else
320 echo ""
321 eval_gettext "Unable to find: \$PACKAGE in the mirrored packages list."; echo
322 echo ""
323 [ -n "$check_only" ] && return 1
324 exit 0
325 fi
326 }
328 # Log this activity
329 log()
330 {
331 local extra
332 [ "$1" = "Installed" ] && \
333 extra=" - $(grep $PACKAGE-$VERSION $LOCALSTATE/installed.md5 | awk '{ print $1 }')"
334 [ -e $LOG ] || touch $LOG
335 DATE=`date +'%F %T'`
336 [ -w $LOG ] &&
337 echo "$DATE - $1 - $PACKAGE ($VERSION$EXTRAVERSION)$extra" >> $LOG
338 }
340 # Download a file from this mirror
341 download_from()
342 {
343 local i
344 local mirrors
345 mirrors="$1"
346 shift
347 for i in $mirrors; do
348 case "$i" in
349 http://*|ftp://*) wget -c $i$@ && break;;
350 *) ln -s $i/$1 . && break;;
351 esac
352 done
353 }
355 # Download a file trying all mirrors
356 download()
357 {
358 local i
359 case "$1" in
360 *.tazpkg)
361 for i in $LOCALSTATE $LOCALSTATE/undigest/* ; do
362 grep "^${1%.tazpkg}$" $i/packages.list || continue
363 download_from "$(cat $i/mirror)" "$@" && return
364 done
365 esac
366 for i in $(cat $MIRROR $LOCALSTATE/undigest/*/mirror 2> /dev/null); do
367 download_from "$i" "$@" && break
368 done
369 }
371 # Extract a package with cpio and gzip/lzma.
372 extract_package()
373 {
374 gettext "Extracting $PACKAGE... "
375 cpio -idm --quiet < $PACKAGE.tazpkg && rm -f $PACKAGE.tazpkg
376 status
377 if [ -f fs.cpio.lzma ]; then
378 gettext "Extracting the pseudo fs... "
379 echo -n "(lzma) "
380 unlzma -c fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma
381 status
382 elif [ -f fs.cpio.gz ]; then
383 gettext "Extracting the pseudo fs... "
384 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz
385 status
386 fi
387 }
389 remove_with_path()
390 {
391 local dir
392 rm -f $1 2>/dev/null
393 dir="$1"
394 while [ "$dir" != "/" ]; do
395 dir="$(dirname $dir)"
396 rmdir $dir 2> /dev/null || break
397 done
398 }
400 grepesc()
401 {
402 sed 's/\[/\\[/g'
403 }
405 # This function installs a package in the rootfs.
406 install_package()
407 {
408 ROOT=$1
409 if [ -n "$ROOT" ]; then
410 # Get absolute path
411 ROOT=$(cd $ROOT; pwd)
412 fi
413 (
414 # Create package path early to avoid dependencies loop
415 mkdir -p $TMP_DIR
416 ( cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1) < $PACKAGE_FILE
417 . $TMP_DIR/receipt
418 if grep -q ^pre_depends $TMP_DIR/receipt; then
419 pre_depends $ROOT
420 fi
421 # keep modifers and file list on upgrade
422 cp $ROOT$INSTALLED/$PACKAGE/modifiers \
423 $ROOT$INSTALLED/$PACKAGE/files.list $TMP_DIR 2> /dev/null
424 rm -rf $ROOT$INSTALLED/$PACKAGE 2> /dev/null
425 # Make the installed package data dir to store
426 # the receipt and the files list.
427 mkdir -p $ROOT$INSTALLED/$PACKAGE
428 cp $TMP_DIR/modifiers $ROOT$INSTALLED/$PACKAGE 2> /dev/null
429 cp $TMP_DIR/files.list $ROOT$INSTALLED/$PACKAGE 2> /dev/null
430 rm -rf $TMP_DIR 2> /dev/null
431 sed -i "/ $(basename $PACKAGE_FILE)$/d" \
432 $ROOT$LOCALSTATE/installed.md5 2> /dev/null
433 cd $(dirname $PACKAGE_FILE)
434 md5sum $(basename $PACKAGE_FILE) >> $ROOT$LOCALSTATE/installed.md5
435 )
436 # Resolve package deps.
437 check_for_deps $ROOT
438 if [ ! "$MISSING_PACKAGE" = "" ]; then
439 install_deps $ROOT
440 fi
441 mkdir -p $TMP_DIR
442 [ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> $INSTALL_LIST-processed
443 echo ""
444 echo -e "\033[1m`gettext \"Installation of :\"`\033[0m $PACKAGE"
445 echo "================================================================================"
446 eval_gettext "Copying \$PACKAGE... "
447 cp $PACKAGE_FILE $TMP_DIR
448 status
449 cd $TMP_DIR
450 extract_package
451 SELF_INSTALL=0
452 EXTRAVERSION=""
453 CONFIG_FILES=""
454 # Include temporary receipt to get the right variables.
455 . $PWD/receipt
456 cd $ROOT$INSTALLED
457 if [ $SELF_INSTALL -ne 0 -a -n "$ROOT" ]; then
458 gettext "Checking post install dependencies... "
459 [ -f $INSTALLED/$PACKAGE/receipt ]
460 if ! status; then
461 eval_gettext "Please run 'tazpkg install \$PACKAGE_FILE' in / and retry."; echo
462 rm -rf $TMP_DIR
463 exit 1
464 fi
465 fi
466 # Get files to remove if upgrading
467 if [ -f $PACKAGE/files.list ]; then
468 while read file; do
469 grep -q "^$(echo $file | grepesc)$" $TMP_DIR/files.list && continue
470 for i in $(cat $PACKAGE/modifiers 2> /dev/null ;
471 grep -sl $PACKAGE */modifiers | cut -d/ -f1 ); do
472 grep -qs "^$(echo $file | grepesc)$" $i/files.list && continue 2
473 done
474 echo $file
475 done < $PACKAGE/files.list > $TMP_DIR/files2remove.list
476 fi
477 # Remember modified packages
478 { check=false
479 for i in $(grep -v '\[' $TMP_DIR/files.list); do
480 [ -e "$ROOT$i" ] || continue
481 [ -d "$ROOT$i" ] && continue
482 echo "- $i"
483 check=true
484 done ;
485 $check && for i in *; do
486 [ "$i" == "$PACKAGE" ] && continue
487 [ -s $i/files.list ] || continue
488 awk "{ printf \"$i %s\\n\",\$1 }" < $i/files.list
489 done } | awk '
490 {
491 if ($1 == "-" || file[$2] != "") {
492 file[$2] = file[$2] " " $1
493 if ($1 != "-") {
494 if (pkg[$1] == "") all = all " " $1
495 pkg[$1] = pkg[$1] " " $2
496 }
497 }
498 }
499 END {
500 for (i = split(all, p, " "); i > 0; i--)
501 for (j = split(pkg[p[i]], f, " "); j > 0; j--)
502 printf "%s %s\n",p[i],f[j];
503 }
504 ' | while read dir file; do
505 if grep -qs ^$dir$ $PACKAGE/modifiers; then
506 # Do not overload an overloaded file !
507 rm $TMP_DIR$file 2> /dev/null
508 continue
509 fi
510 grep -qs ^$PACKAGE$ $dir/modifiers && continue
511 if [ -s "$dir/volatile.cpio.gz" ]; then
512 # We can modify backed up files without notice
513 zcat $dir/volatile.cpio.gz | cpio -t --quiet | \
514 grep -q "^${file#/}$" && continue
515 fi
516 echo "$PACKAGE" >> $dir/modifiers
517 done
519 cd $TMP_DIR
520 cp receipt files.list $ROOT$INSTALLED/$PACKAGE
521 # Copy the description if found.
522 if [ -f "description.txt" ]; then
523 cp description.txt $ROOT$INSTALLED/$PACKAGE
524 fi
525 # Copy the md5sum if found.
526 if [ -f "md5sum" ]; then
527 cp md5sum $ROOT$INSTALLED/$PACKAGE
528 fi
529 # Pre install commands.
530 if grep -q ^pre_install $ROOT$INSTALLED/$PACKAGE/receipt; then
531 pre_install $ROOT
532 fi
533 if [ -n "$CONFIG_FILES" ]; then
534 # save 'official' configuration files
535 eval_gettext "Saving configuration files for \$PACKAGE... "
536 for i in $CONFIG_FILES; do
537 ( cd fs ; find ${i#/} -type f )
538 done | ( cd fs ; cpio -o -H newc --quiet | gzip -9 ) > \
539 $ROOT$INSTALLED/$PACKAGE/volatile.cpio.gz
540 # keep user configuration files
541 for i in $CONFIG_FILES; do
542 ( cd fs ; find ${i#/} -type f )
543 done | while read i; do
544 [ -e $ROOT/$i ] || continue
545 cp -a $ROOT/$i fs/$i
546 done
547 status
548 fi
549 eval_gettext "Installing \$PACKAGE... "
550 cp -a fs/* $ROOT/
551 status
552 if [ -s files2remove.list ]; then
553 eval_gettext "Removing old \$PACKAGE... "
554 while read file; do
555 remove_with_path $ROOT$file
556 done < files2remove.list
557 true
558 status
559 fi
560 # Remove the temporary random directory.
561 gettext "Removing all tmp files... "
562 cd .. && rm -rf $TMP_DIR
563 status
564 # Post install commands.
565 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
566 post_install $ROOT
567 fi
568 # Update-desktop-database if needed.
569 if [ "$(grep .desktop $ROOT$INSTALLED/$PACKAGE/files.list | grep /usr/share/applications/)" ]; then
570 updatedesktopdb=yes
571 fi
572 # Update-mime-database if needed.
573 if [ "$(grep /usr/share/mime $ROOT$INSTALLED/$PACKAGE/files.list)" ]; then
574 updatemimedb=yes
575 fi
576 cd $TOP_DIR
577 echo "================================================================================"
578 eval_gettext "\$PACKAGE (\$VERSION\$EXTRAVERSION) is installed."; echo
579 echo ""
580 # Log this activity
581 [ -n "$ROOT" ] || log Installed
582 }
584 # Check for loop in deps tree.
585 check_for_deps_loop()
586 {
587 local list
588 local pkg
589 local deps
590 pkg=$1
591 shift
592 [ -n "$1" ] || return
593 list=""
594 # Filter out already processed deps
595 for i in $@; do
596 case " $ALL_DEPS" in
597 *\ $i\ *);;
598 *) list="$list $i";;
599 esac
600 done
601 ALL_DEPS="$ALL_DEPS$list "
602 for i in $list; do
603 [ -f $i/receipt ] || continue
604 deps="$(DEPENDS=""; . $i/receipt; echo $DEPENDS)"
605 case " $deps " in
606 *\ $pkg\ *) echo -e "$MSG $i"; MSG="";;
607 *) check_for_deps_loop $pkg $deps;;
608 esac
609 done
610 }
612 # Check for missing deps listed in a receipt packages.
613 check_for_deps()
614 {
615 local saved;
616 saved=$PACKAGE
617 mkdir -p $TMP_DIR
618 ( cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1) < $PACKAGE_FILE
619 . $TMP_DIR/receipt
620 PACKAGE=$saved
621 rm -rf $TMP_DIR
622 for pkgorg in $DEPENDS
623 do
624 i=$(equivalent_pkg $pkgorg $1)
625 if [ ! -d "$1$INSTALLED/$i" ]; then
626 MISSING_PACKAGE=$i
627 deps=$(($deps+1))
628 elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
629 eval_gettext "WARNING Dependency loop between \$PACKAGE and \$i."; echo
630 fi
631 done
632 if [ ! "$MISSING_PACKAGE" = "" ]; then
633 echo -e "\033[1m`gettext \"Tracking dependencies for :\"`\033[0m $PACKAGE"
634 echo "================================================================================"
635 for pkgorg in $DEPENDS
636 do
637 i=$(equivalent_pkg $pkgorg $1)
638 if [ ! -d "$1$INSTALLED/$i" ]; then
639 MISSING_PACKAGE=$i
640 eval_gettext "Missing: \$MISSING_PACKAGE"; echo
641 fi
642 done
643 echo "================================================================================"
644 eval_gettext "\$deps missing package(s) to install."; echo
645 fi
646 }
648 # Install all missing deps. Auto install or ask user then install all missing
649 # deps from local dir, cdrom, media or from the mirror. In case we want to
650 # install packages from local, we need a packages.list to find the version.
651 install_deps()
652 {
653 local root
654 root=""
655 [ -n "$1" ] && root="--root=$1"
656 if [ "$AUTO_INSTALL_DEPS" == "yes" ]; then
657 anser="y"
658 else
659 echo ""
660 gettext "Install all missing dependencies (y/N) ? "; read anser
661 echo ""
662 fi
663 if [ "$anser" == "y" ]; then
664 for pkgorg in $DEPENDS
665 do
666 pkg=$(equivalent_pkg $pkgorg $1)
667 if [ ! -d "$1$INSTALLED/$pkg" ]; then
668 local list
669 list="$INSTALL_LIST"
670 [ -n "$list" ] || list="$TOP_DIR/packages.list"
671 # We can install packages from a local dir by greping
672 # the TAZPKG_BASENAME in the local packages.list.
673 found=0
674 if [ -f "$list" ]; then
675 eval_gettext "Checking if \$pkg exists in local list... "; echo
676 mkdir $TMP_DIR
677 for i in $pkg-*.tazpkg; do
678 [ -f $i ] || continue
679 ( cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1) < $i
680 [ "$(. $TMP_DIR/receipt; echo $PACKAGE)" = "$pkg" ] || continue
681 if grep -q ^$(package_fullname_in_dir $TMP_DIR).tazpkg$ $list
682 then
683 found=1
684 tazpkg install $i $root --list=$list
685 break
686 fi
687 done
688 rm -rf $TMP_DIR
689 fi
690 # Install deps from the mirror.
691 if [ $found -eq 0 ]; then
692 if [ ! -f "$LOCALSTATE/packages.list" ]; then
693 tazpkg recharge
694 fi
695 tazpkg get-install $pkg $root
696 fi
697 fi
698 done
699 else
700 echo ""
701 eval_gettext \
702 "Leaving dependencies for \$PACKAGE unsolved. The package is installed but
703 will probably not work."; echo
704 echo ""
705 fi
706 }
708 # xHTML packages list header.
709 xhtml_header()
710 {
711 cat > $XHTML_LIST << _EOT_
712 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
713 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
714 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
715 <head>
716 <title>Installed packages list</title>
717 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
718 <meta name="modified" content="$DATE" />
719 <meta name="generator" content="Tazpkg" />
720 <style type="text/css"><!--
721 body { font: 12px sans-serif, vernada, arial; margin: 0; }
722 #header { background: #f0ba08; color: black; height: 50px;
723 border-top: 1px solid black; border-bottom: 1px solid black; }
724 #content { margin: 0px 50px 26px 50px; }
725 #footer { border-top: 1px solid black; padding-top: 10px;}
726 h1 { margin: 14px 0px 0px 16px; }
727 pre { padding-left: 5px; }
728 hr { color: white; background: white; height: 1px; border: 0; }
729 --></style>
730 </head>
731 <body bgcolor="#ffffff">
732 <div id="header">
733 <h1><font color="#3e1220">Installed packages list</font></h1>
734 </div>
735 <hr />
736 <!-- Start content -->
737 <div id="content">
739 <p>
740 _packages_ packages installed - List generated on : $DATE
741 <p>
743 _EOT_
744 }
746 # xHTML content with packages info.
747 xhtml_pkg_info()
748 {
749 cat >> $XHTML_LIST << _EOT_
750 <h3>$PACKAGE</h3>
751 <pre>
752 Version : $VERSION$EXTRAVERSION
753 Short desc : $SHORT_DESC
754 Web site : <a href="$WEB_SITE">$WEB_SITE</a>
755 </pre>
757 _EOT_
758 }
760 # xHTML packages list footer.
761 xhtml_footer()
762 {
763 cat >> $XHTML_LIST << _EOT_
764 <hr />
765 <p id="footer">
766 $packages packages installed - List generated on : $DATE
767 </p>
769 <!-- End content -->
770 </div>
771 </body>
772 </html>
773 _EOT_
774 }
776 # Search pattern in installed packages.
777 search_in_installed_packages()
778 {
779 gettext "Installed packages"; echo
780 echo "================================================================================"
781 list=`ls -1 $INSTALLED | grep -i "$PATTERN"`
782 for pkg in $list
783 do
784 EXTRAVERSION=""
785 [ -f $INSTALLED/$pkg/receipt ] || continue
786 . $INSTALLED/$pkg/receipt
787 echo -n "$PACKAGE "
788 echo -en "\033[24G $VERSION$EXTRAVERSION"
789 echo -e "\033[42G $CATEGORY"
790 packages=$(($packages+1))
791 done
792 # Set correct ending messages.
793 if [ "$packages" = "" ]; then
794 eval_gettext "0 installed packages found for : \$PATTERN"; echo
795 echo ""
796 else
797 echo "================================================================================"
798 eval_gettext "\$packages installed package(s) found for : \$PATTERN"; echo
799 echo ""
800 fi
801 }
803 # Search in packages.list for available pkgs.
804 search_in_packages_list()
805 {
806 gettext "Available packages name-version"; echo
807 echo "================================================================================"
808 packages=0
809 for i in $LOCALSTATE/packages.list $LOCALSTATE/undigest/*/packages.list; do
810 grep -is "$PATTERN" $i
811 packages=$(($packages + `grep -is "$PATTERN" $i | wc -l`))
812 done
813 if [ ! -f "$LOCALSTATE/packages.list" ]; then
814 echo ""
815 gettext \
816 "No 'packages.list' found to check for mirrored packages. For more results,
817 please run 'tazpkg recharge' once as root before searching."; echo
818 echo ""
819 fi
820 if [ "$packages" = "0" ]; then
821 eval_gettext "0 available packages found for : \$PATTERN"; echo
822 echo ""
823 else
824 echo "================================================================================"
825 eval_gettext "\$packages available package(s) found for : \$PATTERN"; echo
826 echo ""
827 fi
828 }
830 # search --mirror: Search in packages.txt for available pkgs and give more
831 # info than --list or default.
832 search_in_packages_txt()
833 {
834 gettext "Matching packages name with version and desc"; echo
835 echo "================================================================================"
836 packages=0
837 for i in $LOCALSTATE/packages.txt $LOCALSTATE/undigest/*/packages.txt; do
838 grep -is -A 2 "^$PATTERN" $i
839 packages=$(($packages + `grep -is "^$PATTERN" $i | wc -l`))
840 done
841 if [ ! -f "$LOCALSTATE/packages.txt" ]; then
842 echo ""
843 gettext \
844 "No 'packages.txt' found to check for mirrored packages. For more results,
845 please run 'tazpkg recharge' once as root before searching."; echo
846 echo ""
847 fi
848 if [ "$packages" = "0" ]; then
849 eval_gettext "0 available packages found for : \$PATTERN"; echo
850 echo ""
851 else
852 echo "================================================================================"
853 eval_gettext "\$packages available package(s) found for : \$PATTERN"; echo
854 echo ""
855 fi
856 }
858 # Install package-list from a flavor
859 install_flavor()
860 {
861 check_root
862 FLAVOR=$1
863 ARG=$2
864 mkdir -p $TMP_DIR
865 [ -f $FLAVOR.flavor ] && cp $FLAVOR.flavor $TMP_DIR
866 cd $TMP_DIR
867 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
868 zcat $FLAVOR.flavor | cpio --quiet -i >/dev/null
869 while read file; do
870 for pkg in $(ls -d $INSTALLED/${file%%-*}*); do
871 [ -f $pkg/receipt ] || continue
872 EXTRAVERSION=""
873 . $pkg/receipt
874 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && break
875 done
876 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && continue
877 cd $CACHE_DIR
878 download $file.tazpkg
879 cd $TMP_DIR
880 tazpkg install $CACHE_DIR/$file.tazpkg --forced
881 done < $FLAVOR.pkglist
882 [ -f $FLAVOR.nonfree ] && while read pkg; do
883 [ -d $INSTALLED/$pkg ] || continue
884 [ -d $INSTALLED/get-$pkg ] && tazpkg get-install get-$pkg
885 get-$pkg
886 done < $FLAVOR.nonfree
887 [ "$ARG" == "--purge" ] && for pkg in $(ls $INSTALLED); do
888 [ -f $INSTALLED/$pkg/receipt ] || continue
889 EXTRAVERSION=""
890 . $INSTALLED/$pkg/receipt
891 grep -q ^$PACKAGE-$VERSION$EXTRAVERSION$ $FLAVOR.pkglist && continue
892 grep -qs ^$PACKAGE$ $FLAVOR.nonfree && continue
893 tazpkg remove $PACKAGE
894 done
895 else
896 eval_gettext "Can't find flavor \$FLAVOR. Aborting."; echo
897 fi
898 cd $TOP_DIR
899 rm -rf $TMP_DIR
900 }
902 # Update mirror urls
903 setup_mirror()
904 {
905 # Backup old list.
906 if [ -f "$1/mirror" ]; then
907 cp -f $1/mirror $1/mirror.bak
908 fi
909 echo ""
910 echo -e "\033[1m`gettext \"Current mirror(s)\"`\033[0m"
911 echo "================================================================================"
912 echo " `cat $1/mirror 2> /dev/null`"
913 gettext \
914 "Please enter URL of the new mirror (http, ftp or local path). You must specify
915 the complete address to the directory of the packages and packages.list file."; echo
916 echo ""
917 gettext "New mirror(s) URL : "
918 NEW_MIRROR_URL=$2
919 if [ -n "$NEW_MIRROR_URL" ]; then
920 echo $NEW_MIRROR_URL
921 else
922 read NEW_MIRROR_URL
923 fi
924 if [ "$NEW_MIRROR_URL" = "" ]; then
925 gettext "Nothing has been changed."; echo
926 else
927 eval_gettext "Setting mirror(s) to : $NEW_MIRROR_URL"; echo
928 rm -f $1/mirror
929 for i in $NEW_MIRROR_URL; do
930 echo "$i" >> $1/mirror
931 done
932 fi
933 echo ""
934 }
936 # recursive dependencies scan
937 dep_scan()
938 {
939 for i in $1; do
940 case " $ALL_DEPS " in
941 *\ $i\ *) continue;;
942 esac
943 ALL_DEPS="$ALL_DEPS $i"
944 [ -n "$2" ] && echo "$2$i ($(grep -A 3 $i $LOCALSTATE/packages.txt \
945 | tail -1 | sed 's/.*(\([^ ]*\).*/\1/'))"
946 [ -f $i/receipt ] || continue
947 DEPENDS=""
948 . $i/receipt
949 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
950 done
951 }
953 # recursive reverse dependencies scan
954 rdep_scan()
955 {
956 SEARCH=$1
958 for i in * ; do
959 DEPENDS=""
960 . $i/receipt
961 echo "$i $(echo $DEPENDS)"
962 done | awk -v search=$SEARCH '
963 function show_deps(deps, all_deps, pkg, space)
964 {
965 if (all_deps[pkg] == 1) return
966 all_deps[pkg] = 1
967 if (space != "") printf "%s %s\n",space,pkg
968 for (i = 1, n = split(deps[pkg], mydeps, " "); i <= n; i++) {
969 show_deps(deps, all_deps, mydeps[i],"==" space)
970 }
971 }
973 {
974 all_deps[$1] = 0
975 for (i = 2; i <= NF; i++)
976 deps[$i] = deps[$i] " " $1
977 }
979 END {
980 show_deps(deps, all_deps, search, "")
981 }
982 ' | while read spc pkg; do
983 echo -n $spc | sed 's/=/ /g'
984 echo -n $pkg
985 echo -n ' ('
986 grep -A 3 $pkg $LOCALSTATE/packages.txt | tail -1 | \
987 sed 's/.*(\([^ ]*\).*/\1)/'
988 done
989 }
991 # Check for ELF file
992 is_elf()
993 {
994 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
995 }
997 # Print shared library dependencies
998 ldd()
999 {
1000 LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $1 2> /dev/null
1003 # search dependencies for files in $TMP_DIR/$file/fs
1004 find_depends()
1006 DEFAULT_DEPENDS="glibc-base gcc-lib-base"
1008 [ -f /var/lib/tazpkg/files.list.lzma ] || tazpkg recharge > /dev/null
1009 for i in /var/lib/tazpkg/files.list.lzma \
1010 /var/lib/tazpkg/undigest/*/files.list.lzma ; do
1011 [ -f $i ] && lzma d $i -so >> $TMP_DIR/files.list
1012 done
1013 find $TMP_DIR/$file/fs -type f | while read chkfile ; do
1014 is_elf $chkfile || continue
1015 case "$chkfile" in
1016 *.o|*.ko|*.ko.gz) continue;;
1017 esac
1018 ldd $chkfile | while read lib rem; do
1019 case "$lib" in
1020 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
1021 continue;;
1022 esac
1023 find $TMP_DIR/$file/fs | grep -q /$lib$ && continue
1024 for dep in $(grep $lib files.list | cut -d: -f1); do
1025 case " $DEFAULT_DEPENDS " in
1026 *\ $dep\ *) continue 2;;
1027 esac
1028 grep -qs "^$dep$" $TMP_DIR/depends && continue 2
1029 done
1030 if [ -n "$dep" ]; then
1031 echo "$dep" >> $TMP_DIR/depends
1032 else
1033 grep -qs ^$lib$ $TMP_DIR/unresolved ||
1034 echo "$lib" >> $TMP_DIR/unresolved
1035 fi
1036 done
1037 done
1038 spc=""
1039 cat $TMP_DIR/depends | sort | uniq | while read file; do
1040 echo -n "$spc$file"
1041 spc=" "
1042 done
1045 show_unresolved_lib()
1047 if [ -s $TMP_DIR/unresolved ]; then
1048 echo "BUGS=\"No dependency for" >> $1
1049 cat $TMP_DIR/unresolved | sort | uniq | while read file; do
1050 echo -e "$WARNING: unknown dependency for $lib"
1051 echo -n " $file" >> $1
1052 done
1053 echo "\"" >> $1
1054 fi
1057 # convert a .ipk package to .tazpkg
1058 convert_ipk()
1060 mkdir -p $TMP_DIR
1061 tar xOzf $PACKAGE_FILE ./control.tar.gz | tar xzf - -C $TMP_DIR
1062 package="$(grep ^Package $TMP_DIR/control | sed 's/.*: //')"
1063 version="$(grep ^Version $TMP_DIR/control | sed 's/.*: //')"
1064 maintainer="$(grep ^Maintainer $TMP_DIR/control | sed 's/.*: //')"
1065 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
1066 descrip="$(grep ^Description $TMP_DIR/control | sed 's/.*: //')"
1067 url="http://openwrt.org/"
1068 case "$target" in
1069 i386|all)
1070 file=$package-$version
1071 mkdir -p $TMP_DIR/$file/fs
1072 tar xOzf $PACKAGE_FILE ./data.tar.gz | \
1073 tar xzf - -C $TMP_DIR/$file/fs
1074 cd $TMP_DIR
1075 cat > $file/receipt <<EOT
1076 # SliTaz package receipt.
1077 # generated by tazpkg from package $(basename $PACKAGE_FILE)
1078 PACKAGE="$package"
1079 VERSION="$version"
1080 CATEGORY="misc"
1081 SHORT_DESC="$descrip"
1082 WEB_SITE="$url"
1083 MAINTAINER="$maintainer"
1084 DEPENDS="$(find_depends)"
1085 EOT
1086 [ -s conffiles ] && cat >> $file/receipt <<EOT
1087 CONFIG_FILES="$(cat conffiles)"
1088 EOT
1089 show_unresolved_lib $file/receipt
1090 while read script func; do
1091 [ -s $script ] && cat >> $file/receipt <<EOT
1093 $func()
1095 $(cat $script)
1097 EOT
1098 done <<EOT
1099 preinst pre_install
1100 postinst post_install
1101 prerm pre_remove
1102 postrm post_remove
1103 EOT
1104 awk '
1106 if (/^ / && show) print substr($0,2);
1107 else show=0;
1108 if (/^Description/) show=1;
1109 }' < $TMP_DIR/control > $file/description.txt
1110 sed -i 's/^\.$//' $file/description.txt
1111 [ -s $file/description.txt ] || rm -f $file/description.txt
1112 tazpkg pack $file
1113 cd $TOP_DIR
1114 mv $TMP_DIR/$file.tazpkg .
1115 ;;
1116 *)
1117 gettext "Invalid target: $target (expected i386)"; echo
1118 ;;
1119 esac
1120 rm -rf $TMP_DIR
1123 # convert a .pkg.tar.gz package to .tazpkg
1124 convert_arch()
1126 mkdir -p $TMP_DIR/fs
1127 tar xzf $PACKAGE_FILE -C $TMP_DIR/fs
1128 if [ -f $TMP_DIR/fs/.PKGINFO ]; then
1129 cd $TMP_DIR
1130 package="$(grep ^pkgname fs/.PKGINFO | sed 's/.*= //')"
1131 version="$(grep ^pkgver fs/.PKGINFO | sed 's/.*= //')"
1132 descrip="$(grep ^pkgdesc fs/.PKGINFO | sed 's/.*= //')"
1133 url="$(grep ^url fs/.PKGINFO | sed 's/.*= //')"
1134 maintainer="$(grep ^packager fs/.PKGINFO | sed 's/.*= //')"
1135 file=$package-$version
1136 mkdir $file
1137 mv fs $file
1138 cat > $file/receipt <<EOT
1139 # SliTaz package receipt.
1140 # generated by tazpkg from Archlinux package $(basename $PACKAGE_FILE)
1141 PACKAGE="$package"
1142 VERSION="$version"
1143 CATEGORY="misc"
1144 SHORT_DESC="$descrip"
1145 WEB_SITE="$url"
1146 MAINTAINER="$maintainer"
1147 DEPENDS="$(find_depends)"
1148 EOT
1149 show_unresolved_lib $file/receipt
1150 rm -f $file/fs/.[A-Z]*
1151 tazpkg pack $file
1152 mv $file.tazpkg $TOP_DIR
1153 else
1154 eval_gettext "\$PACKAGE_FILE does not look like a Archlinux package !"; echo
1155 fi
1156 cd $TOP_DIR
1157 rm -rf $TMP_DIR
1160 # convert a .tgz package to .tazpkg
1161 convert_tgz()
1163 package=$(basename $PACKAGE_FILE)
1164 IFS='-'
1165 set -- $package
1166 unset IFS
1167 package=$1
1168 version=$2
1169 file="$package-$version"
1170 mkdir -p $TMP_DIR/$file/fs
1171 tar xzf $PACKAGE_FILE -C $TMP_DIR/$file/fs
1172 cd $TMP_DIR
1173 if [ -d $file/fs/install ]; then
1174 descrip=$(grep ^$package $file/fs/install/slack-desc | \
1175 head -1 | sed 's/.*(\(.*\)).*/\1/')
1176 cat > $file/receipt <<EOT
1177 # SliTaz package receipt.
1178 # generated by tazpkg from slackware package $(basename $PACKAGE_FILE)
1179 PACKAGE="$package"
1180 VERSION="$version"
1181 CATEGORY="misc"
1182 SHORT_DESC="$descrip"
1183 WEB_SITE="http://www.slackware.com/packages/"
1184 MAINTAINER="nobody@slitaz.org"
1185 DEPENDS="$(find_depends)"
1186 EOT
1187 show_unresolved_lib $file/receipt
1188 [ -f $file/fs/install/doinst.sh ] && cat >> $file/receipt <<EOM
1190 post_install()
1192 chroot \$1/ sh - << EOT
1193 cd /
1194 $(cat $file/fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
1195 EOT
1197 EOM
1198 grep ^$package $file/fs/install/slack-desc | \
1199 sed "s/^$package://" > $file/description.txt
1200 [ -s $file/description.txt ] || rm -f $file/description.txt
1201 rm -rf $file/fs/install
1202 tazpkg pack $file
1203 mv $file.tazpkg $TOP_DIR
1204 else
1205 eval_gettext "\$PACKAGE_FILE does not look like a Slackware package !"; echo
1206 fi
1207 cd $TOP_DIR
1208 rm -rf $TMP_DIR
1211 # convert a .deb package to .tazpkg
1212 convert_deb()
1214 mkdir -p $TMP_DIR
1215 dpkg-deb -e $PACKAGE_FILE $TMP_DIR
1216 package=$(grep '^ *Package' $TMP_DIR/control)
1217 package=$(echo ${package##*:})
1218 version=$(grep '^ *Version' $TMP_DIR/control)
1219 version=$(echo ${version##*:})
1220 descrip=$(grep '^ *Description' $TMP_DIR/control)
1221 descrip=$(echo ${descrip##*:})
1222 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
1223 case "$target" in
1224 i386|all)
1225 file="$package-$version"
1226 mkdir -p $TMP_DIR/$file/fs/
1227 dpkg-deb -x $PACKAGE_FILE $TMP_DIR/$file/fs
1228 cd $TMP_DIR
1229 cat > $file/receipt <<EOT
1230 # SliTaz package receipt.
1231 # generated by tazpkg from debian package $(basename $PACKAGE_FILE)
1232 PACKAGE="$package"
1233 VERSION="$version"
1234 CATEGORY="misc"
1235 SHORT_DESC="$descrip"
1236 WEB_SITE="http://packages.debian.org/search?keywords=$package"
1237 MAINTAINER="nobody@slitaz.org"
1238 DEPENDS="$(find_depends)"
1239 EOT
1240 [ -s conffiles ] && cat >> $file/receipt <<EOT
1241 CONFIG_FILES="$(cat conffiles)"
1242 EOT
1243 show_unresolved_lib $file/receipt
1244 awk '
1246 if (/^ / && show) print substr($0,2);
1247 else show=0;
1248 if (/^Description/) show=1;
1249 }' < $TMP_DIR/control > $file/description.txt
1250 sed -i 's/^\.$//' $file/description.txt
1251 [ -s $file/description.txt ] || rm -f $file/description.txt
1252 tazpkg pack $file
1253 mv $file.tazpkg $TOP_DIR
1254 ;;
1255 *)
1256 gettext "Invalid target: $target (expected i386)"; echo
1257 ;;
1258 esac
1259 cd $TOP_DIR
1260 rm -rf $TMP_DIR
1263 # convert a .rpm package to .tazpkg
1264 convert_rpm()
1266 mkdir -p $TMP_DIR
1267 cp $PACKAGE_FILE $TMP_DIR
1268 PACKAGE_FILE=$TMP_DIR/$(basename $PACKAGE_FILE)
1269 rpm -qip $PACKAGE_FILE | awk -v pkg=$(basename $PACKAGE_FILE) '
1270 BEGIN {
1271 goturl=0;
1272 printf "# Taz package receipt.\n";
1273 printf "# generated by tazpkg from rpm package %s\n",pkg;
1276 if (/^Name/) { name=$3; printf "PACKAGE=\"%s\"\n",$3; }
1277 if (/^Version/) printf "VERSION=\"%s-",$3;
1278 if (/^Release/) printf "%s\"\n",$3;
1279 if (/^Summary/) printf "SHORT_DESC=\"%s\"\n",substr($0,15);
1280 if (/^URL/) { goturl=1; printf "WEB_SITE=\"%s\"\n",$3; }
1282 END {
1283 if (goturl == 0)
1284 printf "WEB_SITE=\"http://rpmfind.net/linux/rpm2html/search.php?query=%s\"\n",name;
1285 printf "CATEGORY=\"misc\"\n";
1286 printf "MAINTAINER=\"nobody@slitaz.org\"\n";
1288 ' > $TMP_DIR/receipt
1289 . $TMP_DIR/receipt
1290 file=$PACKAGE-$VERSION
1291 mkdir -p $TMP_DIR/$file/fs/
1292 mv $TMP_DIR/receipt $TMP_DIR/$file
1293 rpm -qip $PACKAGE_FILE | awk '
1294 DEGIN { show=0 }
1296 if (show) print;
1297 if (/^Description/) show=1;
1299 ' > $TMP_DIR/$file/description.txt
1300 cd $TMP_DIR/$file/fs/
1301 rpm2cpio $PACKAGE_FILE | cpio -idm --quiet
1302 cd ../..
1303 echo "DEPENDS=\"$(find_depends)\"" >> $TMP_DIR/$file/receipt
1304 show_unresolved_lib $TMP_DIR/$file/receipt
1305 tazpkg pack $file
1306 mv $file.tazpkg $TOP_DIR
1307 cd $TOP_DIR
1308 rm -rf $TMP_DIR
1311 update_desktop_database()
1313 if [ -f $1/usr/bin/update-desktop-database ] && [ -n "$updatedesktopdb" ]; then
1314 $1/usr/bin/update-desktop-database $1/usr/share/applications 2>/dev/null
1315 fi
1318 update_mime_database()
1320 if [ -f $1/usr/bin/update-desktop-database ] && [ -n "$updatemimedb" ]; then
1321 $1/usr/bin/update-desktop-database $1/usr/share/mime
1322 fi
1325 ###################
1326 # Tazpkg commands #
1327 ###################
1329 case "$COMMAND" in
1330 list)
1331 # List all installed packages or a specific category.
1333 if [ "$2" = "blocked" ]; then
1334 echo ""
1335 echo -e "\033[1m`gettext \"Blocked packages\"`\033[0m"
1336 echo "================================================================================"
1337 if [ -s "$BLOCKED" ];then
1338 cat $BLOCKED
1339 else
1340 gettext "No blocked packages found."
1341 fi
1342 echo "" && exit 0
1343 fi
1344 # Display the list of categories.
1345 if [ "$2" = "cat" -o "$2" = "categories" ]; then
1346 echo ""
1347 echo -e "\033[1m`gettext \"Packages categories\"`\033[0m"
1348 echo "================================================================================"
1349 for i in $CATEGORIES
1350 do
1351 echo $i
1352 categories=$(($categories+1))
1353 done
1354 echo "================================================================================"
1355 echo "$categories categories"
1356 echo ""
1357 exit 0
1358 fi
1359 # Check for an asked category.
1360 if [ -n "$2" ]; then
1361 ASKED_CATEGORY=$2
1362 echo ""
1363 echo -e "\033[1m`gettext \"Installed packages of category:\"`\033[0m $ASKED_CATEGORY"
1364 echo "================================================================================"
1365 for pkg in $INSTALLED/*
1366 do
1367 [ -f $pkg/receipt ] || continue
1368 EXTRAVERSION=""
1369 . $pkg/receipt
1370 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
1371 echo -n "$PACKAGE"
1372 echo -e "\033[24G $VERSION$EXTRAVERSION"
1373 packages=$(($packages+1))
1374 fi
1375 done
1376 echo "================================================================================"
1377 eval_gettext "\$packages packages installed of category \$ASKED_CATEGORY."; echo
1378 echo ""
1379 else
1380 # By default list all packages and versions.
1381 echo ""
1382 echo -e "\033[1m`gettext \"List of all installed packages\"`\033[0m"
1383 echo "================================================================================"
1384 for pkg in $INSTALLED/*
1385 do
1386 [ -f $pkg/receipt ] || continue
1387 EXTRAVERSION=""
1388 . $pkg/receipt
1389 echo -n "$PACKAGE"
1390 echo -en "\033[24G $VERSION$EXTRAVERSION"
1391 echo -e "\033[42G $CATEGORY"
1392 packages=$(($packages+1))
1393 done
1394 echo "================================================================================"
1395 eval_gettext "\$packages packages installed."; echo
1396 echo ""
1397 fi ;;
1398 xhtml-list)
1399 # Get info in receipts and build list.
1400 DATE=`date +%Y-%m-%d\ \%H:%M:%S`
1401 if [ -n "$2" ]; then
1402 XHTML_LIST=$2
1403 else
1404 XHTML_LIST=installed-packages.html
1405 fi
1406 echo ""
1407 echo -e "\033[1m`gettext \"Creating xHTML list of installed packages\"`\033[0m"
1408 echo "================================================================================"
1409 gettext "Generating xHTML header..."
1410 xhtml_header
1411 status
1412 # Packages
1413 gettext "Creating packages information..."
1414 for pkg in $INSTALLED/*
1415 do
1416 [ -f $pkg/receipt ] || continue
1417 EXTRAVERSION=""
1418 . $pkg/receipt
1419 xhtml_pkg_info
1420 packages=$(($packages+1))
1421 done
1422 status
1423 gettext "Generating xHTML footer..."
1424 xhtml_footer
1425 status
1426 # sed pkgs nb in header.
1427 sed -i s/'_packages_'/"$packages"/ $XHTML_LIST
1428 echo "================================================================================"
1429 eval_gettext "\$XHTML_LIST created - $packages packages."; echo
1430 echo "" ;;
1431 list-mirror)
1432 # List all available packages on the mirror. Option --diff displays
1433 # last mirrored packages diff (see recharge).
1434 check_for_packages_list
1435 case $2 in
1436 --diff)
1437 if [ -f "$LOCALSTATE/packages.diff" ]; then
1438 echo ""
1439 echo -e "\033[1m`gettext \"Mirrored packages diff\"`\033[0m"
1440 echo "================================================================================"
1441 cat $LOCALSTATE/packages.diff
1442 echo "================================================================================"
1443 pkgs=`cat $LOCALSTATE/packages.diff | wc -l`
1444 eval_gettext "\$pkgs new packages listed on the mirror."; echo
1445 echo ""
1446 else
1447 echo ""
1448 gettext "Unable to list anything, no packages.diff found."; echo
1449 gettext "Recharge your current list to create a first diff."; echo
1450 echo ""
1451 fi && exit 0 ;;
1452 --text|--txt)
1453 echo ""
1454 echo -e "\033[1m`gettext \"List of available packages on the mirror\"`\033[0m"
1455 echo "================================================================================"
1456 cat $LOCALSTATE/packages.txt ;;
1457 --raw|*)
1458 echo ""
1459 echo -e "\033[1m`gettext \"List of available packages on the mirror\"`\033[0m"
1460 echo "================================================================================"
1461 cat $LOCALSTATE/packages.list ;;
1462 esac
1463 echo "================================================================================"
1464 pkgs=`cat $LOCALSTATE/packages.list | wc -l`
1465 eval_gettext "\$pkgs packages in the last recharged list."; echo
1466 echo "" ;;
1467 list-files)
1468 # List files installed with the package.
1470 check_for_package_on_cmdline
1471 check_for_receipt
1472 echo ""
1473 echo -e "\033[1m`gettext \"Installed files with:\"`\033[0m $PACKAGE"
1474 echo "================================================================================"
1475 cat $INSTALLED/$PACKAGE/files.list | sort
1476 echo "================================================================================"
1477 files=`cat $INSTALLED/$PACKAGE/files.list | wc -l`
1478 echo "$files files installed with $PACKAGE."
1479 echo "" ;;
1480 info)
1481 # Information about package.
1483 check_for_package_on_cmdline
1484 check_for_receipt
1485 EXTRAVERSION=""
1486 . $INSTALLED/$PACKAGE/receipt
1487 echo ""
1488 echo -e "\033[1m`gettext \"Tazpkg information\"`\033[0m
1489 ================================================================================
1490 Package : $PACKAGE
1491 Version : $VERSION$EXTRAVERSION
1492 Category : $CATEGORY
1493 Short desc : $SHORT_DESC
1494 Maintainer : $MAINTAINER"
1495 if [ ! "$DEPENDS" = "" ]; then
1496 echo -e "Depends : $DEPENDS"
1497 fi
1498 if [ ! "$SUGGESTED" = "" ]; then
1499 echo -e "Suggested : $SUGGESTED"
1500 fi
1501 if [ ! "$BUILD_DEPENDS" = "" ]; then
1502 echo -e "Build deps : $BUILD_DEPENDS"
1503 fi
1504 if [ ! "$WANTED" = "" ]; then
1505 echo -e "Wanted src : $WANTED"
1506 fi
1507 if [ ! "$WEB_SITE" = "" ]; then
1508 echo -e "Web site : $WEB_SITE"
1509 fi
1510 echo "================================================================================"
1511 echo "" ;;
1512 desc)
1513 # Display package description.txt if available.
1514 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
1515 echo ""
1516 echo -e "\033[1m`gettext \"Description of:\"`\033[0m $PACKAGE"
1517 echo "================================================================================"
1518 cat $INSTALLED/$PACKAGE/description.txt
1519 echo "================================================================================"
1520 echo ""
1521 else
1522 echo ""
1523 gettext "Sorry, no description available for this package."; echo
1524 echo ""
1525 fi ;;
1526 search)
1527 # Search for a package by pattern or name.
1529 PATTERN="$2"
1530 if [ -z "$PATTERN" ]; then
1531 echo ""
1532 gettext "Please specify a pattern or package name to search for."; echo
1533 gettext "Example : 'tazpkg search paint'"; echo
1534 echo ""
1535 exit 0
1536 fi
1537 echo ""
1538 echo -e "\033[1m`gettext \"Search result for:\"`\033[0m $PATTERN"
1539 echo ""
1540 # Default is to search in installed pkgs and the raw list.
1541 case $3 in
1542 -i|--installed)
1543 search_in_installed_packages ;;
1544 -l|--list)
1545 search_in_packages_list ;;
1546 -m|--mirror)
1547 search_in_packages_txt ;;
1548 *)
1549 search_in_installed_packages
1550 search_in_packages_list ;;
1551 esac ;;
1552 search-file)
1553 # Search for a file by pattern or name in all files.list.
1555 if [ -z "$2" ]; then
1556 echo ""
1557 gettext "Please specify a pattern or file name to search for."; echo
1558 gettext "Example : 'tazpkg search-file libnss'"; echo
1559 echo ""
1560 exit 0
1561 fi
1562 echo ""
1563 echo -e "\033[1m`gettext \"Search result for file\"`\033[0m $2"
1564 echo "================================================================================"
1566 if [ "$3" == "--mirror" ]; then
1568 match=0
1569 for i in $LOCALSTATE/files.list.lzma \
1570 $LOCALSTATE/undigest/*/files.list.lzma; do
1571 [ -f $i ] || continue
1572 unlzma -c $i | grep -- ".*:.*$2" | awk '
1573 BEGIN { last="" }
1575 pkg=substr($0,0,index($0,":")-1);
1576 file=substr($0,index($0,":")+2);
1577 if (last != pkg) {
1578 last = pkg;
1579 printf("\n%c[1mPackage %s :%c[0m\n",27,pkg,27);
1581 printf("%s\n",file);
1582 }'
1583 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | wc -l`))
1584 done
1586 else
1588 # Check all pkg files.list in search match with specify the package
1589 # name and the full path to the file(s).
1590 for pkg in $INSTALLED/*
1591 do
1592 if grep -qs "$2" $pkg/files.list; then
1593 . $pkg/receipt
1594 echo ""
1595 echo -e "\033[1m`gettext \"Package\"` $PACKAGE:\033[0m"
1596 grep "$2" $pkg/files.list
1597 files=`grep $2 $pkg/files.list | wc -l`
1598 match=$(($match+$files))
1599 fi
1600 done
1602 fi
1603 pkg=$2
1604 if [ "$match" = "" ]; then
1605 eval_gettext "0 file found for: \$pkg"; echo
1606 echo ""
1607 else
1608 echo ""
1609 echo "================================================================================"
1610 eval_gettext "\$match file(s) found for: \$pkg"; echo
1611 echo ""
1612 fi ;;
1613 search-pkgname)
1614 # Search for a package name
1615 if [ -z "$2" ]; then
1616 echo ""
1617 gettext "Please specify a pattern or file name to search for."; echo
1618 gettext "Example : 'tazpkg search-pkgname libnss'"; echo
1619 echo ""
1620 exit 0
1621 fi
1622 echo ""
1623 echo -e "\033[1m`gettext \"Search result for file\"`\033[0m $2"
1624 echo "================================================================================"
1626 # Search for a file on mirror and output only the package name
1627 match=0
1628 for i in $LOCALSTATE/files.list.lzma \
1629 $LOCALSTATE/undigest/*/files.list.lzma; do
1630 [ -f $i ] || continue
1631 unlzma -c $i | grep -- ".*:.*$2" | cut -d: -f1 | uniq | awk '{ print $1 }'
1632 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | cut -d: -f1 | uniq | wc -l`))
1633 done
1634 file=$2
1635 if [ "$match" = "" ]; then
1636 eval_gettext "0 file found for : \$file"; echo
1637 echo ""
1638 else
1639 echo ""
1640 echo "================================================================================"
1641 eval_gettext "$match pkg(s) found with file: \$file"; echo
1642 echo ""
1643 fi
1644 ;;
1645 install)
1646 # Install .tazpkg packages.
1648 check_root
1649 check_for_package_on_cmdline
1650 check_for_package_file
1651 # Check if forced install.
1652 DO_CHECK="yes"
1653 ROOT=""
1654 while [ -n "$3" ]; do
1655 case "$3" in
1656 --forced)
1657 DO_CHECK="no"
1658 ;;
1659 --root=*)
1660 ROOT="${3#--root=}"
1661 ;;
1662 --list=*)
1663 INSTALL_LIST="${3#--list=}"
1664 ;;
1665 *) shift 2
1666 echo -e "\nUnknown option $*.\n"
1667 exit 1
1668 ;;
1669 esac
1670 shift
1671 done
1672 if [ "$DO_CHECK" = "yes" ]; then
1673 check_for_installed_package $ROOT
1674 fi
1675 install_package $ROOT
1676 update_desktop_database $ROOT
1677 update_mime_database $ROOT ;;
1678 install-list|get-install-list)
1679 # Install a set of packages from a list.
1681 check_root
1682 if [ -z "$2" ]; then
1683 echo ""
1684 gettext \
1685 "Please change directory (cd) to the packages repository and specify the
1686 list of packages to install. Example : tazpkg install-list packages.list"
1687 echo "" && exit 0
1688 fi
1689 # Check if the packages list exist.
1690 list_file=$2
1691 if [ ! -f "$list_file" ]; then
1692 gettext "Unable to find : $list_file"; echo
1693 exit 0
1694 else
1695 LIST=`cat $2`
1696 fi
1698 # Remember processed list
1699 export INSTALL_LIST="$2"
1701 # Set $COMMAND and install all packages.
1702 if [ "$1" = "get-install-list" ]; then
1703 COMMAND=get-install
1704 else
1705 COMMAND=install
1706 fi
1707 touch $2-processed
1709 # Upgrade tazpkg first. It may handle new features/formats...
1710 # then upgrade essential packages early
1711 for pkg in busybox-pam busybox gcc-lib-base glibc-base \
1712 slitaz-base-files tazpkg ; do
1713 pkg=$(egrep $pkg-[0-9] $INSTALL_LIST)
1714 [ -n "$pkg" ] || continue
1715 echo "Adding implicit depends $pkg ..."
1716 LIST="$pkg
1717 $LIST"
1718 done
1720 for pkg in $LIST
1721 do
1722 grep -qs ^$pkg$ $2-processed && continue
1723 tazpkg $COMMAND $pkg --list=$2 "$3" "$4" "$5"
1724 done
1725 rm -f $2-processed ;;
1726 add-flavor)
1727 # Install a set of packages from a flavor.
1729 install_flavor $2 ;;
1730 install-flavor)
1731 # Install a set of packages from a flavor and purge other ones.
1733 install_flavor $2 --purge ;;
1734 set-release)
1735 # Change curent release and upgrade packages.
1737 RELEASE=$2
1738 if [ -z "$RELEASE" ]; then
1739 echo ""
1740 gettext "Please specify the release you want on the command line."; echo
1741 gettext "Example: tazpkg set-release cooking"; echo
1742 echo ""
1743 exit 0
1744 fi
1745 rm /var/lib/tazpkg/mirror
1746 echo "$RELEASE" > /etc/slitaz-release
1747 tazpkg recharge && tazpkg upgrade
1749 # Install missing depends
1750 cd $INSTALLED
1751 for i in * ; do
1752 DEPENDS=""
1753 . $i/receipt
1754 for j in $DEPENDS ; do
1755 [ -d $j ] || tazpkg get-install $j
1756 done
1757 done ;;
1758 remove)
1759 # Remove packages.
1761 check_root
1762 check_for_package_on_cmdline
1763 ROOT=""
1764 while [ -n "$3" ]; do
1765 case "$3" in
1766 --root=*)
1767 ROOT="${3#--root=}"
1768 if [ "$ROOT" ]; then
1769 ROOTOPTS="--root=$ROOT"
1770 else
1771 ROOTOPTS=""
1772 fi
1773 ;;
1774 *) shift 2
1775 echo -e "\nUnknown option $*.\n"
1776 exit 1
1777 ;;
1778 esac
1779 shift
1780 done
1781 if [ ! -f "$ROOT$INSTALLED/$PACKAGE/receipt" ]; then
1782 echo ""
1783 eval_gettext "\$PACKAGE is not installed."; echo
1784 exit 0
1785 else
1786 ALTERED=""
1787 THE_PACKAGE=$PACKAGE # altered by receipt
1788 for i in $(cd $ROOT$INSTALLED ; ls); do
1789 [ -f $ROOT$INSTALLED/$i/receipt ] || continue
1790 DEPENDS=""
1791 . $ROOT$INSTALLED/$i/receipt
1792 case " $(echo $DEPENDS) " in
1793 *\ $THE_PACKAGE\ *) ALTERED="$ALTERED $i";;
1794 esac
1795 done
1796 EXTRAVERSION=""
1797 . $ROOT$INSTALLED/$THE_PACKAGE/receipt
1798 fi
1799 echo ""
1800 if [ -n "$ALTERED" ]; then
1801 eval_gettext "The following packages depend on \$PACKAGE:"; echo
1802 for i in $ALTERED; do
1803 echo " $i"
1804 done
1805 fi
1806 REFRESH=$(cd $ROOT$INSTALLED ; grep -sl ^$PACKAGE$ */modifiers)
1807 if [ -n "$REFRESH" ]; then
1808 eval_gettext "The following packages have been modified by \$PACKAGE:"; echo
1809 for i in $REFRESH; do
1810 echo " ${i%/modifiers}"
1811 done
1812 fi
1813 eval_gettext "Remove \$PACKAGE (\$VERSION\$EXTRAVERSION) ?"; echo
1814 gettext "Please confirm uninstallation (y/N) : "; read anser
1815 if [ "$anser" = "y" ]; then
1816 echo ""
1817 echo -e "\033[1m`gettext \"Removing:\"`\033[0m $PACKAGE"
1818 echo "================================================================================"
1819 # Pre remove commands.
1820 if grep -q ^pre_remove $ROOT$INSTALLED/$PACKAGE/receipt; then
1821 pre_remove
1822 fi
1823 gettext "Removing all files installed..."
1824 if [ -f $ROOT$INSTALLED/$PACKAGE/modifiers ]; then
1825 for mod in `cat $ROOT$INSTALLED/$PACKAGE/modifiers`
1826 do
1827 for file in `cat $ROOT$INSTALLED/$PACKAGE/files.list`
1828 do
1829 [ $(grep "^$(echo $file | grepesc)$" $ROOT$INSTALLED/$mod/files.list | wc -l) -gt 1 ] && continue
1830 remove_with_path $ROOT$file
1831 done
1832 done
1833 else
1834 for file in `cat $ROOT$INSTALLED/$PACKAGE/files.list`
1835 do
1836 remove_with_path $ROOT$file
1837 done
1838 fi
1839 status
1840 if grep -q ^post_remove $ROOT$INSTALLED/$PACKAGE/receipt; then
1841 post_remove
1842 fi
1843 # Remove package receipt.
1844 gettext "Removing package receipt..."
1845 rm -rf $ROOT$INSTALLED/$PACKAGE
1846 status
1847 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$/d" \
1848 $LOCALSTATE/installed.md5 2> /dev/null
1849 # Log this activity
1850 log Removed
1851 if [ -n "$ALTERED" ]; then
1852 eval_gettext "Remove packages depending on \$PACKAGE"
1853 echo -n " (y/N) ? "; read anser
1854 if [ "$anser" = "y" ]; then
1855 for i in $ALTERED; do
1856 if [ -d "$ROOT$INSTALLED/$i" ]; then
1857 tazpkg remove $i $ROOTOPTS
1858 fi
1859 done
1860 fi
1861 fi
1862 if [ -n "$REFRESH" ]; then
1863 eval_gettext "Reinstall packages modified by \$PACKAGE"
1864 echo -n " (y/N) ? "; read anser
1865 if [ "$anser" = "y" ]; then
1866 for i in $REFRESH; do
1867 if [ $(wc -l < $ROOT$INSTALLED/$i) -gt 1 ]; then
1868 eval_gettext "Check \$INSTALLED/\$i for reinstallation"; echo
1869 continue
1870 fi
1871 rm -r $ROOT$INSTALLED/$i
1872 tazpkg get-install ${i%/modifiers} $ROOTOPTS --forced
1873 done
1874 fi
1875 fi
1876 else
1877 echo ""
1878 eval_gettext "Uninstallation of \$PACKAGE cancelled."; echo
1879 fi
1880 echo "" ;;
1881 extract)
1882 # Extract .tazpkg cpio archive into a directory.
1884 check_for_package_on_cmdline
1885 check_for_package_file
1886 echo ""
1887 echo -e "\033[1m`gettext \"Extracting:\"`\033[0m $PACKAGE"
1888 echo "================================================================================"
1889 # If no directory destination is found on the cmdline
1890 # we create one in the current dir using the package name.
1891 if [ -n "$TARGET_DIR" ]; then
1892 DESTDIR=$TARGET_DIR/$PACKAGE
1893 else
1894 DESTDIR=$PACKAGE
1895 fi
1896 mkdir -p $DESTDIR
1897 gettext "Copying original package..."
1898 cp $PACKAGE_FILE $DESTDIR
1899 status
1900 cd $DESTDIR
1901 extract_package
1902 echo "================================================================================"
1903 eval_gettext "\$PACKAGE is extracted to: \$DESTDIR"; echo
1904 echo "" ;;
1905 recompress)
1906 # Recompress .tazpkg cpio archive with lzma.
1908 check_for_package_on_cmdline
1909 check_for_package_file
1910 echo ""
1911 echo -e "\033[1m`gettext \"Recompressing:\"`\033[0m $PACKAGE"
1912 echo "================================================================================"
1913 mkdir -p $TMP_DIR
1914 gettext "Copying original package..."
1915 cp $PACKAGE_FILE $TMP_DIR
1916 status
1917 cd $TMP_DIR
1918 extract_package
1919 gettext "Recompressing the fs... "
1920 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
1921 rm -rf fs
1922 status
1923 gettext "Creating new package... "
1924 find . -print | cpio -o -H newc --quiet > \
1925 $TOP_DIR/$(basename $PACKAGE_FILE).$$ && mv -f \
1926 $TOP_DIR/$(basename $PACKAGE_FILE).$$ \
1927 $TOP_DIR/$(basename $PACKAGE_FILE)
1928 status
1929 cd $TOP_DIR
1930 rm -rf $TMP_DIR ;;
1931 list-config)
1932 # List configuration files installed.
1934 if [ "$2" = "--box" ]; then
1935 mkdir -p $TMP_DIR && cd $TMP_DIR
1936 FILES="$INSTALLED/*/volatile.cpio.gz"
1937 [ -n "$3" ] && FILES="$INSTALLED/$3/volatile.cpio.gz"
1938 for i in $FILES; do
1939 zcat $i | cpio -idm --quiet > /dev/null
1940 find * -type f 2>/dev/null | while read file; do
1941 if [ ! -e /$file ]; then
1942 echo -n "|--|--|--|File lost"
1943 else
1944 echo -n "$(stat -c "%A|%U|%G|%s|" /$file)"
1945 cmp $file /$file > /dev/null 2>&1 || \
1946 echo -n "$(stat -c "%.16y" /$file)"
1947 fi
1948 echo "|/$file"
1949 done
1950 rm -rf *
1951 done
1952 cd $TOP_DIR
1953 rm -rf $TMP_DIR
1954 else
1955 echo ""
1956 echo -e "\033[1m`gettext \"Configuration files\"`"
1957 echo "================================================================================"
1958 for i in $INSTALLED/*/volatile.cpio.gz; do
1959 [ -n "$2" -a "$i" != "$INSTALLED/$2/volatile.cpio.gz" ] && continue
1960 [ -f "$i" ] || continue
1961 zcat $i | cpio -t --quiet
1962 done | sed 's|^|/|' | sort
1963 echo "================================================================================"
1964 echo ""
1965 fi ;;
1966 repack-config)
1967 # Create SliTaz package archive from configuration files.
1969 mkdir -p $TMP_DIR && cd $TMP_DIR
1970 CONFIG_VERSION=1.0
1971 mkdir config-$CONFIG_VERSION
1972 cd config-$CONFIG_VERSION
1973 for i in $INSTALLED/*/volatile.cpio.gz; do
1974 zcat $i | cpio -t --quiet
1975 done > files.list
1976 mkdir fs
1977 cd fs
1978 ( cd / ; cpio -o -H newc --quiet ) < ../files.list | cpio -idm --quiet > /dev/null
1979 mkdir -p etc/tazlito
1980 for i in $INSTALLED/*/receipt; do
1981 EXTRAVERSION=""
1982 . $i
1983 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1984 done > etc/tazlito/config-packages.list
1985 cd ..
1986 echo "etc/tazlito/config-packages.list" >> files.list
1987 cat > receipt <<EOT
1988 # SliTaz package receipt.
1990 PACKAGE="config"
1991 VERSION="$CONFIG_VERSION"
1992 CATEGORY="base-system"
1993 SHORT_DESC="User configuration backup on $(date)"
1994 DEPENDS="$(ls $INSTALLED)"
1995 EOT
1996 cd ..
1997 tazpkg pack config-$CONFIG_VERSION
1998 cp config-$CONFIG_VERSION.tazpkg $TOP_DIR
1999 cd $TOP_DIR
2000 rm -rf $TMP_DIR
2001 ;;
2002 repack)
2003 # Create SliTaz package archive from an installed package.
2005 check_for_package_on_cmdline
2006 check_for_receipt
2007 EXTRAVERSION=""
2008 . $INSTALLED/$PACKAGE/receipt
2009 echo ""
2010 echo -e "\033[1mRepacking :\033[0m $PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
2011 echo "================================================================================"
2012 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
2013 echo "Can't repack $PACKAGE"
2014 exit 1
2015 fi
2016 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
2017 eval_gettext "Can't repack, \$PACKAGE files have been modified by:"; echo
2018 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
2019 echo " $i"
2020 done
2021 exit 1
2022 fi
2023 MISSING=""
2024 while read i; do
2025 [ -e "$i" ] && continue
2026 [ -L "$i" ] || MISSING="$MISSING\n $i"
2027 done < $INSTALLED/$PACKAGE/files.list
2028 if [ -n "$MISSING" ]; then
2029 gettext "Can't repack, the following files are lost:"
2030 echo -e "$MISSING"
2031 exit 1
2032 fi
2033 mkdir -p $TMP_DIR && cd $TMP_DIR
2034 FILES="fs.cpio.lzma\n"
2035 for i in $(ls $INSTALLED/$PACKAGE) ; do
2036 [ "$i" = "volatile.cpio.gz" ] && continue
2037 [ "$i" = "modifiers" ] && continue
2038 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
2039 done
2040 ln -s / rootfs
2041 mkdir tmp
2042 sed 's/^/rootfs/' < files.list | cpio -o -H newc --quiet |\
2043 ( cd tmp ; cpio -idm --quiet >/dev/null )
2044 mv tmp/rootfs fs
2045 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
2046 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
2047 ( cd fs; cpio -idm --quiet )
2048 fi
2049 if grep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
2050 . $INSTALLED/$PACKAGE/receipt
2051 repack_cleanup fs
2052 fi
2053 if [ -f $INSTALLED/$PACKAGE/md5sum ]; then
2054 sed 's, , fs,' < $INSTALLED/$PACKAGE/md5sum | \
2055 md5sum -s -c || {
2056 echo "Can't repack, md5sum error."
2057 cd $TOP_DIR
2058 rm -rf $TMP_DIR
2059 exit 1
2061 fi
2062 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
2063 echo -e "$FILES" | cpio -o -H newc --quiet > \
2064 $TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg
2065 cd $TOP_DIR
2066 \rm -R $TMP_DIR
2067 eval_gettext "Package \$PACKAGE repacked successfully."; echo
2068 echo "Size : `du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg`"
2069 echo "" ;;
2070 pack)
2071 # Create SliTaz package archive using cpio and gzip.
2073 check_for_package_on_cmdline
2074 cd $PACKAGE
2075 if [ ! -f "receipt" ]; then
2076 gettext "Receipt is missing. Please read the documentation."; echo
2077 exit 0
2078 else
2079 echo ""
2080 echo -e "\033[1mPacking :\033[0m $PACKAGE"
2081 echo "================================================================================"
2082 # Create files.list with redirecting find outpout.
2083 gettext "Creating the list of files..." && cd fs
2084 find . -type f -print > ../files.list
2085 find . -type l -print >> ../files.list
2086 cd .. && sed -i s/'^.'/''/ files.list
2087 status
2088 gettext "Creating md5sum of files..."
2089 while read file; do
2090 [ -L "fs$file" ] && continue
2091 [ -f "fs$file" ] || continue
2092 case "$file" in
2093 /lib/modules/*/modules.*|*.pyc) continue;;
2094 esac
2095 md5sum "fs$file" | sed 's/ fs/ /'
2096 done < files.list > md5sum
2097 status
2098 UNPACKED_SIZE=$(du -chs fs receipt files.list md5sum \
2099 description.txt 2> /dev/null | awk \
2100 '{ sz=$1 } END { print sz }')
2101 # Build cpio archives.
2102 gettext "Compressing the fs... "
2103 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
2104 rm -rf fs
2105 status
2106 PACKED_SIZE=$(du -chs fs.cpio.lzma receipt files.list \
2107 md5sum description.txt 2> /dev/null | awk \
2108 '{ sz=$1 } END { print sz }')
2109 gettext "Updating receipt sizes..."
2110 sed -i s/^PACKED_SIZE.*$// receipt
2111 sed -i s/^UNPACKED_SIZE.*$// receipt
2112 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
2113 status
2114 gettext "Creating full cpio archive... "
2115 find . -print | cpio -o -H newc --quiet > ../$PACKAGE.tazpkg
2116 status
2117 gettext "Restoring original package tree... "
2118 unlzma -c fs.cpio.lzma | cpio -idm --quiet
2119 status
2120 rm fs.cpio.lzma && cd ..
2121 echo "================================================================================"
2122 eval_gettext "Package \$PACKAGE compressed successfully."; echo
2123 echo "Size : `du -sh $PACKAGE.tazpkg`"
2124 echo ""
2125 fi ;;
2126 recharge)
2127 # Recharge packages.list from a mirror.
2129 check_root
2130 for path in $LOCALSTATE $LOCALSTATE/undigest/*; do
2131 [ -f $path/mirror ] || continue
2132 echo ""
2133 if [ "$path" != "$LOCALSTATE" ]; then
2134 echo "Recharging undigest $(basename $path):"
2135 fi
2136 cd $path
2137 if [ -f "packages.list" ]; then
2138 gettext "Creating backup of the last packages list..."
2139 mv -f packages.desc packages.desc.bak 2>/dev/null
2140 mv -f packages.md5 packages.md5.txt 2>/dev/null
2141 mv -f packages.txt packages.txt.bak 2>/dev/null
2142 mv -f packages.list packages.list.bak 2>/dev/null
2143 mv -f packages.equiv packages.equiv.bak 2>/dev/null
2144 mv -f files.list.lzma files.list.lzma.bak 2> /dev/null
2145 mv -f mirrors mirrors.bak 2> /dev/null
2146 status
2147 fi
2148 download_from "$(cat mirror)" packages.desc
2149 download_from "$(cat mirror)" packages.md5
2150 download_from "$(cat mirror)" packages.txt
2151 download_from "$(cat mirror)" packages.list
2152 download_from "$(cat mirror)" packages.equiv
2153 download_from "$(cat mirror)" files.list.lzma
2154 download_from "$(sed 's|packages/.*||' < mirror)" mirrors
2155 [ -f mirrors ] || mv mirrors.bak mirrors 2> /dev/null
2156 suffix=$(head -1 mirror)
2157 suffix=packages${suffix#*/packages}
2158 for i in $(cat mirrors 2> /dev/null); do
2159 grep -qs $i mirror || echo $i$suffix >> mirror
2160 done
2161 if [ -f "packages.list.bak" ]; then
2162 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
2163 sed -i s/+// packages.diff
2164 echo ""
2165 echo -e "\033[1m`gettext \"Mirrored packages diff\"`\033[0m"
2166 echo "================================================================================"
2167 cat packages.diff
2168 new_pkgs=`cat packages.diff | wc -l`
2169 if [ "$new_pkgs" != 0 ]; then
2170 echo "================================================================================"
2171 eval_gettext "\$new_pkgs new packages on the mirror."; echo
2172 echo ""
2173 else
2174 gettext "No new packages on the mirror."; echo
2175 echo ""
2176 fi
2177 else
2178 echo -e "
2179 ================================================================================"
2180 gettext \
2181 "Last packages.list is ready to use. Note that next time you recharge the
2182 list, a list of differences will be displayed to show new and upgradeable
2183 packages."
2184 echo ""
2185 fi
2186 done ;;
2187 upgradeable)
2188 # Build upgradeable-packages.list quickly.
2190 check_root
2191 cd $LOCALSTATE
2192 while read md5 file ; do
2193 grep -qs "$md5 $file" packages.md5 && continue
2194 for i in 1 2 3 4 5; do
2195 file=${file%-*}
2196 [ -d installed/$file ] || continue
2197 echo $file
2198 break
2199 done
2200 done < installed.md5 > upgradeable-packages.list ;;
2201 upgrade)
2202 # Upgrade all installed packages with the new version from the mirror.
2204 check_root
2205 check_for_packages_list
2206 cd $LOCALSTATE
2207 # Touch the blocked pkgs list to avoid errors and remove any old
2208 # upgrade list.
2209 touch blocked-packages.list
2210 rm -f upgradeable-packages.list
2211 echo ""
2212 echo -e "\033[1m`gettext \"Available upgrades\"`\033[0m"
2213 echo "================================================================================"
2214 echo ""
2215 # Some packages must be installed first
2216 FIRST_CLASS_PACKAGE=" glibc-base slitaz-base-files slitaz-boot-scripts "
2217 if [ -n "$PACKAGE_FILE" -a -d "$INSTALLED/$PACKAGE_FILE" ]; then
2218 ALL=$INSTALLED/$PACKAGE_FILE
2219 else
2220 ALL="$(ls -d $INSTALLED/*)"
2221 fi
2222 for pkg in $ALL
2223 do
2224 [ -f $pkg/receipt ] || continue
2225 EXTRAVERSION=""
2226 . $pkg/receipt
2227 # Display package name to show that Tazpkg is working...
2228 echo -en "\\033[0G "
2229 echo -en "\\033[0G$PACKAGE"
2230 # Skip specified pkgs listed in $LOCALSTATE/blocked-packages.list
2231 if grep -qs "^$PACKAGE" $BLOCKED; then
2232 blocked=$(($blocked+1))
2233 else
2234 # Check if the installed package is in the current list (other
2235 # mirror or local).
2236 NEW_PACKAGE=$(get_package_filename $PACKAGE)
2238 if [ -n "$NEW_PACKAGE" ]; then
2239 # Set new pkg and version for future comparison
2240 NEW_VERSION=`echo $NEW_PACKAGE | sed s/$PACKAGE-/''/`
2241 # Change '-' and 'pre' to points.
2242 NEW_VERSION=`echo $NEW_VERSION | sed s/'-'/'.'/`
2243 VERSION=`echo $VERSION | sed s/'-'/'.'/`$EXTRAVERSION
2244 NEW_VERSION=`echo $NEW_VERSION | sed s/'pre'/'.'/`
2245 VERSION=`echo $VERSION | sed s/'pre'/'.'/`
2246 NEW_VERSION=`echo $NEW_VERSION | sed 's/[A-Z]\.//'`
2247 VERSION=`echo $VERSION | sed 's/[A-Z]\.//'`
2248 # Compare version. Upgrades are only available for official
2249 # packages, so we control the mirror and it should be ok if
2250 # we just check for equality.
2251 RELEASE=""
2252 if [ -f installed.md5 -a -f packages.md5 ]; then
2253 current_md5=$(grep -s " $PACKAGE-$VERSION" installed.md5 | awk '{ print $1 }')
2254 new_md5=$(grep -hs " $PACKAGE-$VERSION" packages.md5 undigest/*/packages.md5 | head -1 | awk '{ print $1 }')
2255 [ -n "$current_md5" ] && [ -n "$new_md5" ] &&
2256 [ "$current_md5" != "$new_md5" ] && RELEASE=build
2257 fi
2258 if [ "$VERSION" != "$NEW_VERSION" -o -n "$RELEASE" ]; then
2259 # Version seems different. Check for major, minor or
2260 # revision
2261 PKG_MAJOR=`echo ${VERSION%_*} | cut -f1 -d"."`
2262 NEW_MAJOR=`echo ${NEW_VERSION%_*} | cut -f1 -d"."`
2263 PKG_MINOR=`echo ${VERSION%_*} | cut -f2 -d"."`
2264 NEW_MINOR=`echo ${NEW_VERSION%_*} | cut -f2 -d"."`
2265 # Minor
2266 if [ "$NEW_MINOR" -gt "$PKG_MINOR" ] 2> /dev/null; then
2267 RELEASE=minor
2268 fi
2269 if [ "$NEW_MINOR" -lt "$PKG_MINOR" ] 2> /dev/null; then
2270 RELEASE=$WARNING
2271 FIXE=yes
2272 fi
2273 # Major
2274 if [ "$NEW_MAJOR" -gt "$PKG_MAJOR" ] 2> /dev/null; then
2275 RELEASE=major
2276 FIXE=""
2277 fi
2278 if [ "$NEW_MAJOR" -lt "$PKG_MAJOR" ] 2> /dev/null; then
2279 RELEASE=WARNING
2280 FIXE=yes
2281 fi
2282 # Default to revision.
2283 if [ -z $RELEASE ]; then
2284 RELEASE=revision
2285 fi
2286 # Pkg name is already displayed by the check process.
2287 echo -en "\033[24G $VERSION"
2288 echo -en "\033[38G --->"
2289 echo -en "\033[43G $NEW_VERSION"
2290 echo -en "\033[58G $CATEGORY"
2291 echo -e "\033[72G $RELEASE"
2292 up=$(($up+1))
2293 echo "$PACKAGE" >> upgradeable-packages.list
2294 case "$FIRST_CLASS_PACKAGE" in
2295 *\ $PACKAGE\ *) echo "$PACKAGE" >> upgradeable-packages.list$$;;
2296 esac
2297 unset RELEASE
2298 fi
2299 packages=$(($packages+1))
2300 fi
2301 fi
2302 done
2303 if [ -z $blocked ]; then
2304 blocked=0
2305 fi
2306 # Clean last checked package and display summary.
2307 if [ ! "$up" = "" ]; then
2308 echo -e "\\033[0G "
2309 echo "================================================================================"
2310 eval_gettext "\$packages installed and listed packages to consider, \$up to upgrade, \$blocked blocked."; echo
2311 echo ""
2312 else
2313 echo -e "\\033[0G`gettext \"System is up-to-date.\"` "
2314 echo ""
2315 echo "================================================================================"
2316 eval_gettext "\$packages installed and listed packages to consider, 0 to upgrade, \$blocked blocked."; echo
2317 echo ""
2318 exit 0
2319 fi
2320 # What to do if major or minor version is smaller.
2321 if [ "$FIXE" == "yes" ]; then
2322 gettext \
2323 "WARNING ---> Installed package seems more recent than the mirrored
2324 one. You can block packages using the command : 'tazpkg block package'.
2325 Or upgrade packages at your own risk."
2326 echo ""
2327 fi
2328 # Ask for upgrade, it can be done another time.
2329 echo -n "Upgrade now (y/N) ? "; read anser
2330 if [ ! "$anser" = "y" ]; then
2331 echo ""
2332 gettext "Exiting. No package upgraded."; echo
2333 echo ""
2334 exit 0
2335 fi
2336 # If anser is yes (y). Install all new versions.
2337 cat upgradeable-packages.list >> upgradeable-packages.list$$
2338 mv -f upgradeable-packages.list$$ upgradeable-packages.list
2339 yes y | tazpkg get-install-list upgradeable-packages.list --forced
2340 rm -f upgradeable-packages.list
2341 ;;
2342 bugs)
2343 # Show known bugs in package(s)
2345 cd $INSTALLED
2346 shift
2347 LIST=$@
2348 [ -n "$LIST" ] || LIST=`ls`
2349 MSG=`gettext "No known bugs."`
2350 for PACKAGE in $LIST; do
2351 BUGS=""
2352 EXTRAVERSION=""
2353 . $PACKAGE/receipt
2354 if [ -n "$BUGS" ]; then
2355 MSG=`gettext "Bug list completed"`
2356 echo ""
2357 eval_gettext "Bugs in package \$PACKAGE version \$VERSION\$EXTRAVERSION:"; echo
2358 cat <<EOT
2359 $BUGS
2360 EOT
2361 fi
2362 done
2363 echo "$MSG" ;;
2364 check)
2365 # Check installed packages set.
2367 check_root
2368 cd $INSTALLED
2369 for PACKAGE in `ls`; do
2370 if [ ! -f $PACKAGE/receipt ]; then
2371 eval_gettext "The package \$PACKAGE installation has not completed"; echo
2372 continue
2373 fi
2374 DEPENDS=""
2375 EXTRAVERSION=""
2376 . $PACKAGE/receipt
2377 if [ -s $PACKAGE/modifiers ]; then
2378 eval_gettext \
2379 "The package \$PACKAGE \$VERSION\$EXTRAVERSION has been modified by:"; echo
2380 for i in $(cat $PACKAGE/modifiers); do
2381 echo " $i"
2382 done
2383 fi
2384 MSG="Files lost from $PACKAGE $VERSION$EXTRAVERSION :\n"
2385 while read file; do
2386 [ -e "$file" ] && continue
2387 if [ -L "$file" ]; then
2388 MSG="$MSG target of symlink"
2389 fi
2390 echo -e "$MSG $file"
2391 MSG=""
2392 done < $PACKAGE/files.list
2393 MSG="Missing dependencies for $PACKAGE $VERSION$EXTRAVERSION :\n"
2394 for i in $DEPENDS; do
2395 [ -d $i ] && continue
2396 [ -d $(equivalent_pkg $i) ] && continue
2397 echo -e "$MSG $i"
2398 MSG=""
2399 done
2400 MSG="Dependencies loop between $PACKAGE and :\n"
2401 ALL_DEPS=""
2402 check_for_deps_loop $PACKAGE $DEPENDS
2403 done
2404 echo -n "Looking for known bugs... "
2405 tazpkg bugs
2406 if [ "$PACKAGE_FILE" = "--full" ]; then
2407 for file in */md5sum; do
2408 CONFIG_FILES=""
2409 . $(dirname "$file")/receipt
2410 [ -s "$file" ] || continue
2411 while read md5 f; do
2412 [ -f $f ] || continue
2413 for i in $CONFIG_FILES; do
2414 case "$f" in
2415 $i|$i/*) continue 2;;
2416 esac
2417 done
2418 echo "$md5 $f"
2419 done < "$file" | md5sum -c - 2> /dev/null | \
2420 grep -v OK$ | sed 's/FAILED$/MD5SUM MISMATCH/'
2421 done
2422 FILES=" "
2423 for file in $(cat */files.list); do
2424 [ -d "$file" ] && continue
2425 case "$FILES" in *\ $file\ *) continue;; esac
2426 [ $(grep "^$(echo $file | grepesc)$" */files.list 2> /dev/null | \
2427 wc -l) -gt 1 ] || continue
2428 FILES="$FILES$file "
2429 echo "The following packages provide $file :"
2430 grep -l "^$(echo $file | grepesc)$" */files.list | while read f
2431 do
2432 pkg=${f%/files.list}
2433 echo -n " $pkg"
2434 if [ -f $pkg/modifiers ]; then
2435 echo -n " (overridden by $(echo "$(cat $pkg/modifiers)"))"
2436 fi
2437 echo ""
2438 done
2439 done
2440 MSG="No package has installed the following files:\n"
2441 find /etc /bin /sbin /lib /usr /var/www \
2442 -not -type d 2> /dev/null | while read file; do
2443 case "$file" in *\[*) continue;; esac
2444 grep -q "^$(echo $file | grepesc)$" */files.list && continue
2445 echo -e "$MSG $file"
2446 MSG=""
2447 done
2448 fi
2449 echo "Check completed." ;;
2450 block)
2451 # Add a pkg name to the list of blocked packages.
2453 check_root
2454 check_for_package_on_cmdline
2455 echo ""
2456 if grep -qs "^$PACKAGE" $BLOCKED; then
2457 eval_gettext "\$PACKAGE is already in the blocked packages list."; echo
2458 echo ""
2459 exit 0
2460 else
2461 eval_gettext "Add \$PACKAGE to : \$BLOCKED..."
2462 echo $PACKAGE >> $BLOCKED
2463 status
2464 # Log this activity
2465 . $INSTALLED/$PACKAGE/receipt
2466 log Blocked
2467 fi
2468 echo "" ;;
2469 unblock)
2470 # Remove a pkg name from the list of blocked packages.
2472 check_root
2473 check_for_package_on_cmdline
2474 echo ""
2475 if grep -qs "^$PACKAGE" $BLOCKED; then
2476 eval_gettext "Removing \$PACKAGE from : \$BLOCKED..."
2477 sed -i s/$PACKAGE/''/ $BLOCKED
2478 sed -i '/^$/d' $BLOCKED
2479 status
2480 # Log this activity
2481 . $INSTALLED/$PACKAGE/receipt
2482 log Unblocked
2483 else
2484 eval_gettext "\$PACKAGE is not in the blocked packages list."
2485 echo ""
2486 exit 0
2487 fi
2488 echo "" ;;
2489 get)
2490 # Downlowd a package with wget.
2492 check_for_package_on_cmdline
2493 check_for_packages_list
2494 check_for_package_in_list
2495 echo ""
2496 if [ -f $PACKAGE.tazpkg ]; then
2497 if [ "$(md5sum $PACKAGE.tazpkg)" != "$(grep " $PACKAGE.tazpkg$" /var/lib/tazpkg/packages.md5)" ]; then
2498 rm -f $PACKAGE.tazpkg
2499 download $PACKAGE.tazpkg
2500 fi
2501 else
2502 download $PACKAGE.tazpkg
2503 fi
2504 echo "" ;;
2505 get-install)
2506 # Download and install a package.
2508 check_root
2509 check_for_package_on_cmdline
2510 check_for_packages_list
2511 DO_CHECK=""
2512 while [ -n "$3" ]; do
2513 case "$3" in
2514 --forced)
2515 DO_CHECK="no"
2516 ;;
2517 --root=*)
2518 ROOT="${3#--root=}"
2519 ;;
2520 --list=*)
2521 INSTALL_LIST="${3#--list=}"
2522 ;;
2523 *) shift 2
2524 echo -e "\nUnknown option $*.\n"
2525 exit 1
2526 ;;
2527 esac
2528 shift
2529 done
2530 AUTOEXEC="no"
2531 if ! check_for_package_in_list check; then
2532 PACKAGE=get-$PACKAGE
2533 AUTOEXEC=$PACKAGE
2534 check_for_package_in_list
2535 if [ -n "$(get_installed_package_pathname $PACKAGE $ROOT)" ]; then
2536 $AUTOEXEC $ROOT
2537 exit 0
2538 fi
2539 fi
2540 # Check if forced install.
2541 if [ "$DO_CHECK" = "no" ]; then
2542 rm -f $CACHE_DIR/$PACKAGE.tazpkg
2543 else
2544 check_for_installed_package $ROOT
2545 fi
2546 cd $CACHE_DIR
2547 if [ -f "$PACKAGE.tazpkg" ]; then
2548 echo "$PACKAGE already in the cache : $CACHE_DIR"
2549 # Check package download was finished
2550 tail -c 2k $PACKAGE.tazpkg | grep -q 00000000TRAILER || {
2551 eval_gettext "Continuing \$PACKAGE download"; echo
2552 download $PACKAGE.tazpkg
2554 if [ "$(md5sum $PACKAGE.tazpkg)" != "$(grep " $PACKAGE.tazpkg$" /var/lib/tazpkg/packages.md5)" ]; then
2555 rm -f $PACKAGE.tazpkg
2556 download $PACKAGE.tazpkg
2557 fi
2558 else
2559 echo ""
2560 download $PACKAGE.tazpkg
2561 fi
2562 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
2563 install_package $ROOT
2564 [ "$AUTOEXEC" != "no" ] && $PACKAGE $ROOT
2565 update_desktop_database $ROOT
2566 update_mime_database $ROOT ;;
2567 clean-cache)
2568 # Remove all downloaded packages.
2570 check_root
2571 files=`ls -1 $CACHE_DIR | wc -l`
2572 echo ""
2573 echo -e "\033[1m`gettext \"Clean cache:\"`\033[0m $CACHE_DIR"
2574 echo "================================================================================"
2575 gettext "Cleaning cache directory..."
2576 rm -rf $CACHE_DIR/*
2577 status
2578 echo "================================================================================"
2579 eval_gettext "\$files file(s) removed from cache."; echo
2580 echo "" ;;
2581 list-undigest)
2582 # list undigest URLs.
2584 if [ "$2" = "--box" ]; then
2585 for i in $LOCALSTATE/undigest/*/mirror; do
2586 [ -f $i ] || continue
2587 echo "$(basename $(dirname $i))|$(cat $i)"
2588 done
2589 else
2590 echo ""
2591 echo -e "\033[1m`gettext \"Current undigest(s)\"`\033[0m"
2592 echo "================================================================================"
2593 for i in $LOCALSTATE/undigest/*/mirror; do
2594 if [ ! -f $i ]; then
2595 gettext "No undigest mirror found."; echo
2596 exit 1
2597 fi
2598 echo "$(basename $(dirname $i)) $(cat $i)"
2599 done
2600 echo ""
2601 fi ;;
2602 remove-undigest)
2603 # remove undigest URL.
2605 check_root
2606 if [ -d $LOCALSTATE/undigest/$2 ]; then
2607 echo -n "Remove $2 undigest (y/N) ? "; read anser
2608 if [ "$anser" = "y" ]; then
2609 echo -n "Removing $2 undigest..."
2610 rm -rf $LOCALSTATE/undigest/$2
2611 status
2612 rmdir $LOCALSTATE/undigest 2> /dev/null
2613 fi
2614 else
2615 echo "Undigest $2 not found"
2616 fi ;;
2617 add-undigest|setup-undigest)
2618 # Add undigest URL.
2620 check_root
2621 undigest=$2
2622 [ -d $LOCALSTATE/undigest ] || mkdir $LOCALSTATE/undigest
2623 if [ -z "$undigest" ]; then
2624 i=1
2625 while [ -d $LOCALSTATE/undigest/$i ]; do
2626 i=$(($i+1))
2627 done
2628 undigest=$i
2629 fi
2630 if [ ! -d $LOCALSTATE/undigest/$undigest ]; then
2631 eval_gettext "Creating new undigest \$undigest."; echo
2632 mkdir $LOCALSTATE/undigest/$undigest
2633 fi
2634 setup_mirror $LOCALSTATE/undigest/$undigest $3 ;;
2635 setup-mirror)
2636 # Change mirror URL.
2638 check_root
2639 setup_mirror $LOCALSTATE $2 ;;
2640 reconfigure)
2641 # Replay post_install from receipt
2643 check_for_package_on_cmdline
2644 check_root
2645 ROOT=""
2646 while [ -n "$3" ]; do
2647 case "$3" in
2648 --root=*)
2649 ROOT="${3#--root=}/" ;;
2650 *) shift 2
2651 echo -e "\nUnknown option $*.\n"
2652 exit 1 ;;
2653 esac
2654 shift
2655 done
2656 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
2657 check_for_receipt $ROOT
2658 # Check for post_install
2659 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
2660 . $ROOT$INSTALLED/$PACKAGE/receipt
2661 post_install $ROOT
2662 # Log this activity
2663 [ -n "$ROOT" ] || log Reconfigured
2664 else
2665 echo ""
2666 eval_gettext "Nothing to do for \$PACKAGE."; echo
2667 fi
2668 else
2669 echo ""
2670 eval_gettext "Package \$PACKAGE is not installed."; echo
2671 gettext "Install package with 'tazpkg install' or 'tazpkg get-install'"; echo
2672 echo ""
2673 fi ;;
2674 shell)
2675 # Tazpkg SHell
2677 if test $(id -u) = 0 ; then
2678 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
2679 else
2680 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
2681 fi
2682 if [ ! "$2" = "--noheader" ]; then
2683 clear
2684 echo ""
2685 echo -e "\033[1mTazpkg SHell.\033[0m"
2686 echo "================================================================================"
2687 gettext "Type 'usage' to list all available commands or 'quit' or 'q' to exit."; echo
2688 echo ""
2689 fi
2690 while true
2691 do
2692 echo -en "$PROMPT"; read cmd
2693 case $cmd in
2694 q|quit)
2695 break ;;
2696 shell)
2697 gettext "You are already running a Tazpkg SHell."; echo ;;
2698 su)
2699 su -c 'exec tazpkg shell --noheader' && break ;;
2700 "")
2701 continue ;;
2702 *)
2703 tazpkg $cmd ;;
2704 esac
2705 done ;;
2706 depends)
2707 # Display dependencies tree
2708 cd $INSTALLED
2709 ALL_DEPS=""
2710 if [ -f $2/receipt ]; then
2711 dep_scan $2 ""
2712 fi ;;
2713 rdepends)
2714 # Display reverse dependencies tree
2715 cd $INSTALLED
2716 ALL_DEPS=""
2717 if [ -f $2/receipt ]; then
2718 rdep_scan $2
2719 fi ;;
2720 convert)
2721 # convert misc package format to .tazpkg
2722 check_for_package_file
2723 case "$PACKAGE_FILE" in
2724 *.deb|*.udeb)
2725 convert_deb;;
2726 *.rpm)
2727 convert_rpm;;
2728 *.tgz)
2729 convert_tgz;;
2730 *.pkg.tar.gz)
2731 convert_arch;;
2732 *.ipk|*.opk)
2733 convert_ipk;;
2734 *)
2735 gettext "Unsupported format"; echo ;;
2736 esac ;;
2737 link)
2738 # link a package from another slitaz installation
2739 PACKAGE=$2
2740 if [ ! -d "$TARGET_DIR" -o \
2741 ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
2742 cat <<EOT
2743 usage: tazpkg link package_name slitaz_root
2744 example: 'tazpkg link openoffice /mnt' will use less than 100k in
2745 your ram running system.
2746 EOT
2747 exit 1
2748 fi
2749 if [ -e "$INSTALLED/$PACKAGE" ]; then
2750 eval_gettext "\$PACKAGE is already installed."; echo
2751 exit 1
2752 fi
2753 ln -s $TARGET_DIR$INSTALLED/$PACKAGE $INSTALLED
2754 DEPENDS="$(. $INSTALLED/$PACKAGE/receipt ; echo $DEPENDS)"
2755 MISSING=""
2756 for i in $DEPENDS; do
2757 [ -e $INSTALLED/$i ] && continue
2758 MISSING="$MISSING$i "
2759 eval_gettext "Missing : \$i"; echo
2760 done
2761 if [ -n "$MISSING" ]; then
2762 echo ""
2763 gettext "Link all missing dependencies (y/N) ? "; read answer
2764 echo ""
2765 if [ "$answer" = "y" ]; then
2766 for i in $MISSING; do
2767 tazpkg link $i $TARGET_DIR
2768 done
2769 else
2770 echo ""
2771 eval_gettext "Leaving dependencies for \$PACKAGE unsolved."; echo
2772 gettext "The package is installed but will probably not work."; echo
2773 echo ""
2774 fi
2775 fi
2776 . $INSTALLED/$PACKAGE/receipt
2777 if grep -q ^pre_install $INSTALLED/$PACKAGE/receipt; then
2778 pre_install
2779 fi
2780 while read path; do
2781 [ -e $path ] && continue
2782 while true; do
2783 dir=$(dirname $path)
2784 [ -e $dir ] && break
2785 path=$dir
2786 done
2787 ln -s $TARGET_DIR$path $dir
2788 done < $INSTALLED/$PACKAGE/files.list
2789 if grep -q ^post_install $INSTALLED/$PACKAGE/receipt; then
2790 post_install
2791 fi ;;
2792 usage|*)
2793 # Print a short help or give usage for an unknown or empty command.
2794 usage ;;
2795 esac
2797 exit 0