tazpkg view tazpkg @ rev 303

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