tazpkg view tazpkg @ rev 299

Speedup install_package
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Sep 30 14:32:08 2009 +0200 (2009-09-30)
parents 2affdd0c18e2
children d7071fbad685
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"
932 [ -f $i/receipt ] || continue
933 DEPENDS=""
934 . $i/receipt
935 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
936 done
937 }
939 # recursive reverse dependencies scan
940 rdep_scan()
941 {
942 SEARCH=$1
944 for i in * ; do
945 DEPENDS=""
946 . $i/receipt
947 echo "$i $(echo $DEPENDS)"
948 done | awk -v search=$SEARCH '
949 function show_deps(deps, all_deps, pkg, space)
950 {
951 if (all_deps[pkg] == 1) return
952 all_deps[pkg] = 1
953 if (space != "") printf "%s%s\n",space,pkg
954 for (i = 1, n = split(deps[pkg], mydeps, " "); i <= n; i++) {
955 show_deps(deps, all_deps, mydeps[i]," " space)
956 }
957 }
959 {
960 all_deps[$1] = 0
961 for (i = 2; i <= NF; i++)
962 deps[$i] = deps[$i] " " $1
963 }
965 END {
966 show_deps(deps, all_deps, search, "")
967 }
968 '
969 }
971 # Check for ELF file
972 is_elf()
973 {
974 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
975 }
977 # Print shared library dependencies
978 ldd()
979 {
980 LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $1 2> /dev/null
981 }
983 # search dependencies for files in $TMP_DIR/$file/fs
984 find_depends()
985 {
986 DEFAULT_DEPENDS="glibc-base gcc-lib-base"
988 [ -f /var/lib/tazpkg/files.list.lzma ] || tazpkg recharge > /dev/null
989 for i in /var/lib/tazpkg/files.list.lzma \
990 /var/lib/tazpkg/undigest/*/files.list.lzma ; do
991 [ -f $i ] && lzma d $i -so >> $TMP_DIR/files.list
992 done
993 find $TMP_DIR/$file/fs -type f | while read chkfile ; do
994 is_elf $chkfile || continue
995 case "$chkfile" in
996 *.o|*.ko|*.ko.gz) continue;;
997 esac
998 ldd $chkfile | while read lib rem; do
999 case "$lib" in
1000 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
1001 continue;;
1002 esac
1003 find $TMP_DIR/$file/fs | grep -q /$lib$ && continue
1004 for dep in $(grep $lib files.list | cut -d: -f1); do
1005 case " $DEFAULT_DEPENDS " in
1006 *\ $dep\ *) continue 2;;
1007 esac
1008 grep -qs "^$dep$" $TMP_DIR/depends && continue 2
1009 done
1010 if [ -n "$dep" ]; then
1011 echo "$dep" >> $TMP_DIR/depends
1012 else
1013 grep -qs ^$lib$ $TMP_DIR/unresolved ||
1014 echo "$lib" >> $TMP_DIR/unresolved
1015 fi
1016 done
1017 done
1018 spc=""
1019 cat $TMP_DIR/depends | sort | uniq | while read file; do
1020 echo -n "$spc$file"
1021 spc=" "
1022 done
1025 show_unresolved_lib()
1027 if [ -s $TMP_DIR/unresolved ]; then
1028 echo "BUGS=\"No dependency for" >> $1
1029 cat $TMP_DIR/unresolved | sort | uniq | while read file; do
1030 echo -e "$WARNING: unknown dependency for $lib"
1031 echo -n " $file" >> $1
1032 done
1033 echo "\"" >> $1
1034 fi
1037 # convert a .ipk package to .tazpkg
1038 convert_ipk()
1040 mkdir -p $TMP_DIR
1041 tar xOzf $PACKAGE_FILE ./control.tar.gz | tar xzf - -C $TMP_DIR
1042 package="$(grep ^Package $TMP_DIR/control | sed 's/.*: //')"
1043 version="$(grep ^Version $TMP_DIR/control | sed 's/.*: //')"
1044 maintainer="$(grep ^Maintainer $TMP_DIR/control | sed 's/.*: //')"
1045 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
1046 descrip="$(grep ^Description $TMP_DIR/control | sed 's/.*: //')"
1047 url="http://openwrt.org/"
1048 case "$target" in
1049 i386|all)
1050 file=$package-$version
1051 mkdir -p $TMP_DIR/$file/fs
1052 tar xOzf $PACKAGE_FILE ./data.tar.gz | \
1053 tar xzf - -C $TMP_DIR/$file/fs
1054 cd $TMP_DIR
1055 cat > $file/receipt <<EOT
1056 # SliTaz package receipt.
1057 # generated by tazpkg from package $(basename $PACKAGE_FILE)
1058 PACKAGE="$package"
1059 VERSION="$version"
1060 CATEGORY="misc"
1061 SHORT_DESC="$descrip"
1062 WEB_SITE="$url"
1063 MAINTAINER="$maintainer"
1064 DEPENDS="$(find_depends)"
1065 EOT
1066 [ -s conffiles ] && cat >> $file/receipt <<EOT
1067 CONFIG_FILES="$(cat conffiles)"
1068 EOT
1069 show_unresolved_lib $file/receipt
1070 while read script func; do
1071 [ -s $script ] && cat >> $file/receipt <<EOT
1073 $func()
1075 $(cat $script)
1077 EOT
1078 done <<EOT
1079 preinst pre_install
1080 postinst post_install
1081 prerm pre_remove
1082 postrm post_remove
1083 EOT
1084 awk '
1086 if (/^ / && show) print substr($0,2);
1087 else show=0;
1088 if (/^Description/) show=1;
1089 }' < $TMP_DIR/control > $file/description.txt
1090 sed -i 's/^\.$//' $file/description.txt
1091 [ -s $file/description.txt ] || rm -f $file/description.txt
1092 tazpkg pack $file
1093 cd $TOP_DIR
1094 mv $TMP_DIR/$file.tazpkg .
1095 ;;
1096 *)
1097 echo "Invalid target: $target (expected i386)"
1098 ;;
1099 esac
1100 rm -rf $TMP_DIR
1103 # convert a .pkg.tar.gz package to .tazpkg
1104 convert_arch()
1106 mkdir -p $TMP_DIR/fs
1107 tar xzf $PACKAGE_FILE -C $TMP_DIR/fs
1108 if [ -f $TMP_DIR/fs/.PKGINFO ]; then
1109 cd $TMP_DIR
1110 package="$(grep ^pkgname fs/.PKGINFO | sed 's/.*= //')"
1111 version="$(grep ^pkgver fs/.PKGINFO | sed 's/.*= //')"
1112 descrip="$(grep ^pkgdesc fs/.PKGINFO | sed 's/.*= //')"
1113 url="$(grep ^url fs/.PKGINFO | sed 's/.*= //')"
1114 maintainer="$(grep ^packager fs/.PKGINFO | sed 's/.*= //')"
1115 file=$package-$version
1116 mkdir $file
1117 mv fs $file
1118 cat > $file/receipt <<EOT
1119 # SliTaz package receipt.
1120 # generated by tazpkg from Archlinux package $(basename $PACKAGE_FILE)
1121 PACKAGE="$package"
1122 VERSION="$version"
1123 CATEGORY="misc"
1124 SHORT_DESC="$descrip"
1125 WEB_SITE="$url"
1126 MAINTAINER="$maintainer"
1127 DEPENDS="$(find_depends)"
1128 EOT
1129 show_unresolved_lib $file/receipt
1130 rm -f $file/fs/.[A-Z]*
1131 tazpkg pack $file
1132 mv $file.tazpkg $TOP_DIR
1133 else
1134 echo "$PACKAGE_FILE does not look like a Archlinux package !"
1135 fi
1136 cd $TOP_DIR
1137 rm -rf $TMP_DIR
1140 # convert a .tgz package to .tazpkg
1141 convert_tgz()
1143 package=$(basename $PACKAGE_FILE)
1144 IFS='-'
1145 set -- $package
1146 unset IFS
1147 package=$1
1148 version=$2
1149 file="$package-$version"
1150 mkdir -p $TMP_DIR/$file/fs
1151 tar xzf $PACKAGE_FILE -C $TMP_DIR/$file/fs
1152 cd $TMP_DIR
1153 if [ -d $file/fs/install ]; then
1154 descrip=$(grep ^$package $file/fs/install/slack-desc | \
1155 head -1 | sed 's/.*(\(.*\)).*/\1/')
1156 cat > $file/receipt <<EOT
1157 # SliTaz package receipt.
1158 # generated by tazpkg from slackware package $(basename $PACKAGE_FILE)
1159 PACKAGE="$package"
1160 VERSION="$version"
1161 CATEGORY="misc"
1162 SHORT_DESC="$descrip"
1163 WEB_SITE="http://www.slackware.com/packages/"
1164 MAINTAINER="nobody@slitaz.org"
1165 DEPENDS="$(find_depends)"
1166 EOT
1167 show_unresolved_lib $file/receipt
1168 [ -f $file/fs/install/doinst.sh ] && cat >> $file/receipt <<EOM
1170 post_install()
1172 chroot \$1/ sh - << EOT
1173 cd /
1174 $(cat $file/fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
1175 EOT
1177 EOM
1178 grep ^$package $file/fs/install/slack-desc | \
1179 sed "s/^$package://" > $file/description.txt
1180 [ -s $file/description.txt ] || rm -f $file/description.txt
1181 rm -rf $file/fs/install
1182 tazpkg pack $file
1183 mv $file.tazpkg $TOP_DIR
1184 else
1185 echo "$PACKAGE_FILE does not look like a Slackware package !"
1186 fi
1187 cd $TOP_DIR
1188 rm -rf $TMP_DIR
1191 # convert a .deb package to .tazpkg
1192 convert_deb()
1194 mkdir -p $TMP_DIR
1195 dpkg-deb -e $PACKAGE_FILE $TMP_DIR
1196 package=$(grep '^ *Package' $TMP_DIR/control)
1197 package=$(echo ${package##*:})
1198 version=$(grep '^ *Version' $TMP_DIR/control)
1199 version=$(echo ${version##*:})
1200 descrip=$(grep '^ *Description' $TMP_DIR/control)
1201 descrip=$(echo ${descrip##*:})
1202 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
1203 case "$target" in
1204 i386|all)
1205 file="$package-$version"
1206 mkdir -p $TMP_DIR/$file/fs/
1207 dpkg-deb -x $PACKAGE_FILE $TMP_DIR/$file/fs
1208 cd $TMP_DIR
1209 cat > $file/receipt <<EOT
1210 # SliTaz package receipt.
1211 # generated by tazpkg from debian package $(basename $PACKAGE_FILE)
1212 PACKAGE="$package"
1213 VERSION="$version"
1214 CATEGORY="misc"
1215 SHORT_DESC="$descrip"
1216 WEB_SITE="http://packages.debian.org/search?keywords=$package"
1217 MAINTAINER="nobody@slitaz.org"
1218 DEPENDS="$(find_depends)"
1219 EOT
1220 [ -s conffiles ] && cat >> $file/receipt <<EOT
1221 CONFIG_FILES="$(cat conffiles)"
1222 EOT
1223 show_unresolved_lib $file/receipt
1224 awk '
1226 if (/^ / && show) print substr($0,2);
1227 else show=0;
1228 if (/^Description/) show=1;
1229 }' < $TMP_DIR/control > $file/description.txt
1230 sed -i 's/^\.$//' $file/description.txt
1231 [ -s $file/description.txt ] || rm -f $file/description.txt
1232 tazpkg pack $file
1233 mv $file.tazpkg $TOP_DIR
1234 ;;
1235 *)
1236 echo "Invalid target: $target (expected i386)"
1237 ;;
1238 esac
1239 cd $TOP_DIR
1240 rm -rf $TMP_DIR
1243 # convert a .rpm package to .tazpkg
1244 convert_rpm()
1246 mkdir -p $TMP_DIR
1247 cp $PACKAGE_FILE $TMP_DIR
1248 PACKAGE_FILE=$TMP_DIR/$(basename $PACKAGE_FILE)
1249 rpm -qip $PACKAGE_FILE | awk -v pkg=$(basename $PACKAGE_FILE) '
1250 BEGIN {
1251 goturl=0;
1252 printf "# Taz package receipt.\n";
1253 printf "# generated by tazpkg from rpm package %s\n",pkg;
1256 if (/^Name/) { name=$3; printf "PACKAGE=\"%s\"\n",$3; }
1257 if (/^Version/) printf "VERSION=\"%s-",$3;
1258 if (/^Release/) printf "%s\"\n",$3;
1259 if (/^Summary/) printf "SHORT_DESC=\"%s\"\n",substr($0,15);
1260 if (/^URL/) { goturl=1; printf "WEB_SITE=\"%s\"\n",$3; }
1262 END {
1263 if (goturl == 0)
1264 printf "WEB_SITE=\"http://rpmfind.net/linux/rpm2html/search.php?query=%s\"\n",name;
1265 printf "CATEGORY=\"misc\"\n";
1266 printf "MAINTAINER=\"nobody@slitaz.org\"\n";
1268 ' > $TMP_DIR/receipt
1269 . $TMP_DIR/receipt
1270 file=$PACKAGE-$VERSION
1271 mkdir -p $TMP_DIR/$file/fs/
1272 mv $TMP_DIR/receipt $TMP_DIR/$file
1273 rpm -qip $PACKAGE_FILE | awk '
1274 DEGIN { show=0 }
1276 if (show) print;
1277 if (/^Description/) show=1;
1279 ' > $TMP_DIR/$file/description.txt
1280 cd $TMP_DIR/$file/fs/
1281 rpm2cpio $PACKAGE_FILE | cpio -idm
1282 cd ../..
1283 echo "DEPENDS=\"$(find_depends)\"" >> $TMP_DIR/$file/receipt
1284 show_unresolved_lib $TMP_DIR/$file/receipt
1285 tazpkg pack $file
1286 mv $file.tazpkg $TOP_DIR
1287 cd $TOP_DIR
1288 rm -rf $TMP_DIR
1291 ###################
1292 # Tazpkg commands #
1293 ###################
1295 case "$COMMAND" in
1296 list)
1297 # List all installed packages or a specific category.
1299 if [ "$2" = "blocked" ]; then
1300 echo ""
1301 echo -e "\033[1mBlocked packages\033[0m"
1302 echo "================================================================================"
1303 if [ -s "$BLOCKED" ];then
1304 cat $BLOCKED
1305 echo ""
1306 else
1307 echo -e "No blocked packages found.\n"
1308 fi
1309 exit 0
1310 fi
1311 # Display the list of categories.
1312 if [ "$2" = "cat" -o "$2" = "categories" ]; then
1313 echo ""
1314 echo -e "\033[1mPackages categories :\033[0m"
1315 echo "================================================================================"
1316 for i in $CATEGORIES
1317 do
1318 echo $i
1319 categories=$(($categories+1))
1320 done
1321 echo "================================================================================"
1322 echo "$categories categories"
1323 echo ""
1324 exit 0
1325 fi
1326 # Check for an asked category.
1327 if [ -n "$2" ]; then
1328 ASKED_CATEGORY=$2
1329 echo ""
1330 echo -e "\033[1mInstalled packages of category :\033[0m $ASKED_CATEGORY"
1331 echo "================================================================================"
1332 for pkg in $INSTALLED/*
1333 do
1334 [ -f $pkg/receipt ] || continue
1335 EXTRAVERSION=""
1336 . $pkg/receipt
1337 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
1338 echo -n "$PACKAGE"
1339 echo -e "\033[24G $VERSION$EXTRAVERSION"
1340 packages=$(($packages+1))
1341 fi
1342 done
1343 echo "================================================================================"
1344 echo -e "$packages packages installed of category $ASKED_CATEGORY."
1345 echo ""
1346 else
1347 # By default list all packages and versions.
1348 echo ""
1349 echo -e "\033[1mList of all installed packages\033[0m"
1350 echo "================================================================================"
1351 for pkg in $INSTALLED/*
1352 do
1353 [ -f $pkg/receipt ] || continue
1354 EXTRAVERSION=""
1355 . $pkg/receipt
1356 echo -n "$PACKAGE"
1357 echo -en "\033[24G $VERSION$EXTRAVERSION"
1358 echo -e "\033[42G $CATEGORY"
1359 packages=$(($packages+1))
1360 done
1361 echo "================================================================================"
1362 echo "$packages packages installed."
1363 echo ""
1364 fi
1365 ;;
1366 xhtml-list)
1367 # Get info in receipts and build list.
1368 DATE=`date +%Y-%m-%d\ \%H:%M:%S`
1369 if [ -n "$2" ]; then
1370 XHTML_LIST=$2
1371 else
1372 XHTML_LIST=installed-packages.html
1373 fi
1374 echo ""
1375 echo -e "\033[1mCreating xHTML list of installed packages\033[0m"
1376 echo "================================================================================"
1377 echo -n "Generating xHTML header..."
1378 xhtml_header
1379 status
1380 # Packages
1381 echo -n "Creating packages information..."
1382 for pkg in $INSTALLED/*
1383 do
1384 [ -f $pkg/receipt ] || continue
1385 EXTRAVERSION=""
1386 . $pkg/receipt
1387 xhtml_pkg_info
1388 packages=$(($packages+1))
1389 done
1390 status
1391 echo -n "Generating xHTML footer..."
1392 xhtml_footer
1393 status
1394 # sed pkgs nb in header.
1395 sed -i s/'_packages_'/"$packages"/ $XHTML_LIST
1396 echo "================================================================================"
1397 echo "$XHTML_LIST created - $packages packages."
1398 echo ""
1399 ;;
1400 list-mirror)
1401 # List all available packages on the mirror. Option --diff displays
1402 # last mirrored packages diff (see recharge).
1403 check_for_packages_list
1404 case $2 in
1405 --diff)
1406 if [ -f "$LOCALSTATE/packages.diff" ]; then
1407 echo ""
1408 echo -e "\033[1mMirrored packages diff\033[0m"
1409 echo "================================================================================"
1410 cat $LOCALSTATE/packages.diff
1411 echo "================================================================================"
1412 pkgs=`cat $LOCALSTATE/packages.diff | wc -l`
1413 echo "$pkgs new packages listed on the mirror."
1414 echo ""
1415 else
1416 echo -e "\nUnable to list anything, no packages.diff found."
1417 echo -e "Recharge your current list to create a first diff.\n"
1418 fi && exit 0 ;;
1419 --text|--txt)
1420 echo ""
1421 echo -e "\033[1mList of available packages on the mirror\033[0m"
1422 echo "================================================================================"
1423 cat $LOCALSTATE/packages.txt ;;
1424 --raw|*)
1425 echo ""
1426 echo -e "\033[1mList of available packages on the mirror\033[0m"
1427 echo "================================================================================"
1428 cat $LOCALSTATE/packages.list ;;
1429 esac
1430 echo "================================================================================"
1431 pkgs=`cat $LOCALSTATE/packages.list | wc -l`
1432 echo "$pkgs packages in the last recharged list."
1433 echo ""
1434 ;;
1435 list-files)
1436 # List files installed with the package.
1438 check_for_package_on_cmdline
1439 check_for_receipt
1440 echo ""
1441 echo -e "\033[1mInstalled files with :\033[0m $PACKAGE"
1442 echo "================================================================================"
1443 cat $INSTALLED/$PACKAGE/files.list | sort
1444 echo "================================================================================"
1445 files=`cat $INSTALLED/$PACKAGE/files.list | wc -l`
1446 echo "$files files installed with $PACKAGE."
1447 echo ""
1448 ;;
1449 info)
1450 # Information about package.
1452 check_for_package_on_cmdline
1453 check_for_receipt
1454 EXTRAVERSION=""
1455 . $INSTALLED/$PACKAGE/receipt
1456 echo ""
1457 echo -e "\033[1mTazpkg information\033[0m
1458 ================================================================================
1459 Package : $PACKAGE
1460 Version : $VERSION$EXTRAVERSION
1461 Category : $CATEGORY
1462 Short desc : $SHORT_DESC
1463 Maintainer : $MAINTAINER"
1464 if [ ! "$DEPENDS" = "" ]; then
1465 echo -e "Depends : $DEPENDS"
1466 fi
1467 if [ ! "$SUGGESTED" = "" ]; then
1468 echo -e "Suggested : $SUGGESTED"
1469 fi
1470 if [ ! "$BUILD_DEPENDS" = "" ]; then
1471 echo -e "Build deps : $BUILD_DEPENDS"
1472 fi
1473 if [ ! "$WANTED" = "" ]; then
1474 echo -e "Wanted src : $WANTED"
1475 fi
1476 if [ ! "$WEB_SITE" = "" ]; then
1477 echo -e "Web site : $WEB_SITE"
1478 fi
1479 echo "================================================================================"
1480 echo ""
1481 ;;
1482 desc)
1483 # Display package description.txt if available.
1484 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
1485 echo ""
1486 echo -e "\033[1mDescription of :\033[0m $PACKAGE"
1487 echo "================================================================================"
1488 cat $INSTALLED/$PACKAGE/description.txt
1489 echo "================================================================================"
1490 echo ""
1491 else
1492 echo -e "\nSorry, no description available for this package.\n"
1493 fi
1494 ;;
1495 search)
1496 # Search for a package by pattern or name.
1498 PATTERN="$2"
1499 if [ -z "$PATTERN" ]; then
1500 echo -e "\nPlease specify a pattern or package name to search for."
1501 echo -e "Example : 'tazpkg search paint'.\n"
1502 exit 0
1503 fi
1504 echo ""
1505 echo -e "\033[1mSearch result for :\033[0m $PATTERN"
1506 echo ""
1507 # Default is to search in installed pkgs and the raw list.
1508 case $3 in
1509 -i|--installed)
1510 search_in_installed_packages ;;
1511 -l|--list)
1512 search_in_packages_list ;;
1513 -m|--mirror)
1514 search_in_packages_txt ;;
1515 *)
1516 search_in_installed_packages
1517 search_in_packages_list ;;
1518 esac
1519 ;;
1520 search-file)
1521 # Search for a file by pattern or name in all files.list.
1523 if [ -z "$2" ]; then
1524 echo -e "\nPlease specify a pattern or file name to search for."
1525 echo -e "Example : 'tazpkg search-file libnss'. \n"
1526 exit 0
1527 fi
1528 echo ""
1529 echo -e "\033[1mSearch result for file :\033[0m $2"
1530 echo "================================================================================"
1532 if [ "$3" == "--mirror" ]; then
1534 match=0
1535 for i in $LOCALSTATE/files.list.lzma \
1536 $LOCALSTATE/undigest/*/files.list.lzma; do
1537 [ -f $i ] || continue
1538 unlzma -c $i | grep -- ".*:.*$2" | awk '
1539 BEGIN { last="" }
1541 pkg=substr($0,0,index($0,":")-1);
1542 file=substr($0,index($0,":")+2);
1543 if (last != pkg) {
1544 last = pkg;
1545 printf("\n%c[1mPackage %s :%c[0m\n",27,pkg,27);
1547 printf("%s\n",file);
1548 }'
1549 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | wc -l`))
1550 done
1552 else
1554 # Check all pkg files.list in search match with specify the package
1555 # name and the full path to the file(s).
1556 for pkg in $INSTALLED/*
1557 do
1558 if grep -qs "$2" $pkg/files.list; then
1559 . $pkg/receipt
1560 echo ""
1561 echo -e "\033[1mPackage $PACKAGE :\033[0m"
1562 grep "$2" $pkg/files.list
1563 files=`grep $2 $pkg/files.list | wc -l`
1564 match=$(($match+$files))
1565 fi
1566 done
1568 fi
1570 if [ "$match" = "" ]; then
1571 echo "0 file found for : $2"
1572 echo ""
1573 else
1574 echo ""
1575 echo "================================================================================"
1576 echo "$match file(s) found for : $2"
1577 echo ""
1578 fi
1579 ;;
1580 install)
1581 # Install .tazpkg packages.
1583 check_root
1584 check_for_package_on_cmdline
1585 check_for_package_file
1586 # Check if forced install.
1587 DO_CHECK="yes"
1588 ROOT=""
1589 while [ -n "$3" ]; do
1590 case "$3" in
1591 --forced)
1592 DO_CHECK="no"
1593 ;;
1594 --root=*)
1595 ROOT="${3#--root=}"
1596 ;;
1597 --list=*)
1598 INSTALL_LIST="${3#--list=}"
1599 ;;
1600 *) shift 2
1601 echo -e "\nUnknown option $*.\n"
1602 exit 1
1603 ;;
1604 esac
1605 shift
1606 done
1607 if [ "$DO_CHECK" = "yes" ]; then
1608 check_for_installed_package $ROOT
1609 fi
1610 install_package $ROOT
1611 ;;
1612 install-list|get-install-list)
1613 # Install a set of packages from a list.
1615 check_root
1616 if [ -z "$2" ]; then
1617 echo -e "
1618 Please change directory (cd) to the packages repository, and specify the
1619 list of packages to install. Example : tazpkg install-list packages.list\n"
1620 exit 0
1621 fi
1622 # Check if the packages list exist.
1623 if [ ! -f "$2" ]; then
1624 echo "Unable to find : $2"
1625 exit 0
1626 else
1627 LIST=`cat $2`
1628 fi
1630 # Remember processed list
1631 export INSTALL_LIST="$2"
1633 # Set $COMMAND and install all packages.
1634 if [ "$1" = "get-install-list" ]; then
1635 COMMAND=get-install
1636 else
1637 COMMAND=install
1638 fi
1639 touch $2-processed
1640 for pkg in $LIST
1641 do
1642 grep -qs ^$pkg$ $2-processed && continue
1643 tazpkg $COMMAND $pkg --list=$2 "$3" "$4" "$5"
1644 done
1645 rm -f $2-processed
1646 ;;
1647 add-flavor)
1648 # Install a set of packages from a flavor.
1650 install_flavor $2
1651 ;;
1652 install-flavor)
1653 # Install a set of packages from a flavor and purge other ones.
1655 install_flavor $2 --purge
1656 ;;
1657 set-release)
1658 # Change curent release and upgrade packages.
1660 RELEASE=$2
1661 if [ -z "$RELEASE" ]; then
1662 echo -e "\nPlease specify the release you want on the command line."
1663 echo -e "Example: tazpkg set-release cooking\n"
1664 exit 0
1665 fi
1666 rm /var/lib/tazpkg/mirror
1667 echo "$RELEASE" > /etc/slitaz-release
1668 tazpkg recharge && tazpkg upgrade
1670 # Install missing depends
1671 cd $INSTALLED
1672 for i in * ; do
1673 DEPENDS=""
1674 . $i/receipt
1675 for j in $DEPENDS ; do
1676 [ -d $j ] || tazpkg get-install $j
1677 done
1678 done
1679 ;;
1680 remove)
1681 # Remove packages.
1683 check_root
1684 check_for_package_on_cmdline
1685 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
1686 echo -e "\n$PACKAGE is not installed.\n"
1687 exit 0
1688 else
1689 ALTERED=""
1690 THE_PACKAGE=$PACKAGE # altered by receipt
1691 for i in $(cd $INSTALLED ; ls); do
1692 [ -f $INSTALLED/$i/receipt ] || continue
1693 DEPENDS=""
1694 . $INSTALLED/$i/receipt
1695 case " $(echo $DEPENDS) " in
1696 *\ $THE_PACKAGE\ *) ALTERED="$ALTERED $i";;
1697 esac
1698 done
1699 EXTRAVERSION=""
1700 . $INSTALLED/$THE_PACKAGE/receipt
1701 fi
1702 echo ""
1703 if [ -n "$ALTERED" ]; then
1704 echo "The following packages depend on $PACKAGE :"
1705 for i in $ALTERED; do
1706 echo " $i"
1707 done
1708 fi
1709 REFRESH=$(cd $INSTALLED ; grep -sl ^$PACKAGE$ */modifiers)
1710 if [ -n "$REFRESH" ]; then
1711 echo "The following packages have been modified by $PACKAGE :"
1712 for i in $REFRESH; do
1713 echo " ${i%/modifiers}"
1714 done
1715 fi
1716 echo "Remove $PACKAGE ($VERSION$EXTRAVERSION) ?"
1717 echo -n "Please confirm uninstallation (y/N) : "; read anser
1718 if [ "$anser" = "y" ]; then
1719 echo ""
1720 echo -e "\033[1mRemoving :\033[0m $PACKAGE"
1721 echo "================================================================================"
1722 # Pre remove commands.
1723 if grep -q ^pre_remove $INSTALLED/$PACKAGE/receipt; then
1724 pre_remove
1725 fi
1726 echo -n "Removing all files installed..."
1727 if [ -f $INSTALLED/$PACKAGE/modifiers ]; then
1728 for mod in `cat $INSTALLED/$PACKAGE/modifiers`
1729 do
1730 for file in `cat $INSTALLED/$PACKAGE/files.list`
1731 do
1732 [ $(grep ^$file$ $INSTALLED/$mod/files.list | wc -l) -gt 1 ] && continue
1733 remove_with_path $file
1734 done
1735 done
1736 else
1737 for file in `cat $INSTALLED/$PACKAGE/files.list`
1738 do
1739 remove_with_path $file
1740 done
1741 fi
1742 status
1743 if grep -q ^post_remove $INSTALLED/$PACKAGE/receipt; then
1744 post_remove
1745 fi
1746 # Remove package receipt.
1747 echo -n "Removing package receipt..."
1748 rm -rf $INSTALLED/$PACKAGE
1749 status
1750 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$/d" \
1751 $LOCALSTATE/installed.md5 2> /dev/null
1752 # Log this activity
1753 log Removed
1754 if [ -n "$ALTERED" ]; then
1755 echo -n "Remove packages depending on $PACKAGE"
1756 echo -n " (y/N) ? "; read anser
1757 if [ "$anser" = "y" ]; then
1758 for i in $ALTERED; do
1759 if [ -d "$INSTALLED/$i" ]; then
1760 tazpkg remove $i
1761 fi
1762 done
1763 fi
1764 fi
1765 if [ -n "$REFRESH" ]; then
1766 echo -n "Reinstall packages modified by $PACKAGE"
1767 echo -n " (y/N) ? "; read anser
1768 if [ "$anser" = "y" ]; then
1769 for i in $REFRESH; do
1770 if [ $(wc -l < $INSTALLED/$i) -gt 1 ]; then
1771 echo "Check $INSTALLED/$i for reinstallation"
1772 continue
1773 fi
1774 rm -r $INSTALLED/$i
1775 tazpkg get-install ${i%/modifiers} --forced
1776 done
1777 fi
1778 fi
1779 else
1780 echo ""
1781 echo "Uninstallation of $PACKAGE cancelled."
1782 fi
1783 echo ""
1784 ;;
1785 extract)
1786 # Extract .tazpkg cpio archive into a directory.
1788 check_for_package_on_cmdline
1789 check_for_package_file
1790 echo ""
1791 echo -e "\033[1mExtracting :\033[0m $PACKAGE"
1792 echo "================================================================================"
1793 # If no directory destination is found on the cmdline
1794 # we create one in the current dir using the package name.
1795 if [ -n "$TARGET_DIR" ]; then
1796 DESTDIR=$TARGET_DIR/$PACKAGE
1797 else
1798 DESTDIR=$PACKAGE
1799 fi
1800 mkdir -p $DESTDIR
1801 echo -n "Copying original package..."
1802 cp $PACKAGE_FILE $DESTDIR
1803 status
1804 cd $DESTDIR
1805 extract_package
1806 echo "================================================================================"
1807 echo "$PACKAGE is extracted to : $DESTDIR"
1808 echo ""
1809 ;;
1810 recompress)
1811 # Recompress .tazpkg cpio archive with lzma.
1813 check_for_package_on_cmdline
1814 check_for_package_file
1815 echo ""
1816 echo -e "\033[1mRecompressing :\033[0m $PACKAGE"
1817 echo "================================================================================"
1818 mkdir -p $TMP_DIR
1819 echo -n "Copying original package..."
1820 cp $PACKAGE_FILE $TMP_DIR
1821 status
1822 cd $TMP_DIR
1823 extract_package
1824 echo -n "Recompressing the fs... "
1825 find fs | cpio -o -H newc 2> /dev/null | lzma e fs.cpio.lzma -si
1826 rm -rf fs
1827 status
1828 echo -n "Creating new package... "
1829 find . -print | cpio -o -H newc > \
1830 $TOP_DIR/$(basename $PACKAGE_FILE).$$ && mv -f \
1831 $TOP_DIR/$(basename $PACKAGE_FILE).$$ \
1832 $TOP_DIR/$(basename $PACKAGE_FILE)
1833 status
1834 cd $TOP_DIR
1835 rm -rf $TMP_DIR
1836 ;;
1837 list-config)
1838 # List configuration files installed.
1840 if [ "$2" = "--box" ]; then
1841 mkdir -p $TMP_DIR && cd $TMP_DIR
1842 FILES="$INSTALLED/*/volatile.cpio.gz"
1843 [ -n "$3" ] && FILES="$INSTALLED/$3/volatile.cpio.gz"
1844 for i in $FILES; do
1845 zcat $i | cpio -idm > /dev/null
1846 find * -type f 2>/dev/null | while read file; do
1847 if [ ! -e /$file ]; then
1848 echo -n "|--|--|--|File lost"
1849 else
1850 echo -n "$(stat -c "%A|%U|%G|%s|" /$file)"
1851 cmp $file /$file > /dev/null 2>&1 || \
1852 echo -n "$(stat -c "%.16y" /$file)"
1853 fi
1854 echo "|/$file"
1855 done
1856 rm -rf *
1857 done
1858 cd $TOP_DIR
1859 rm -rf $TMP_DIR
1860 else
1861 echo ""
1862 echo -e "\033[1mConfiguration files"
1863 echo "================================================================================"
1864 for i in $INSTALLED/*/volatile.cpio.gz; do
1865 [ -n "$2" -a "$i" != "$INSTALLED/$2/volatile.cpio.gz" ] && continue
1866 [ -f "$i" ] || continue
1867 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1868 done | sed 's|^|/|' | sort
1869 echo "================================================================================"
1870 echo ""
1871 fi
1872 ;;
1873 repack-config)
1874 # Create SliTaz package archive from configuration files.
1876 mkdir -p $TMP_DIR && cd $TMP_DIR
1877 CONFIG_VERSION=1.0
1878 mkdir config-$CONFIG_VERSION
1879 cd config-$CONFIG_VERSION
1880 for i in $INSTALLED/*/volatile.cpio.gz; do
1881 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1882 done > files.list
1883 mkdir fs
1884 cd fs
1885 ( cd / ; cpio -o -H newc ) < ../files.list | cpio -idm > /dev/null
1886 mkdir -p etc/tazlito
1887 for i in $INSTALLED/*/receipt; do
1888 EXTRAVERSION=""
1889 . $i
1890 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1891 done > etc/tazlito/config-packages.list
1892 cd ..
1893 echo "etc/tazlito/config-packages.list" >> files.list
1894 cat > receipt <<EOT
1895 # SliTaz package receipt.
1897 PACKAGE="config"
1898 VERSION="$CONFIG_VERSION"
1899 CATEGORY="base-system"
1900 SHORT_DESC="User configuration backup on $(date)"
1901 DEPENDS="$(ls $INSTALLED)"
1902 EOT
1903 cd ..
1904 tazpkg pack config-$CONFIG_VERSION
1905 cp config-$CONFIG_VERSION.tazpkg $TOP_DIR
1906 cd $TOP_DIR
1907 rm -rf $TMP_DIR
1908 ;;
1909 repack)
1910 # Create SliTaz package archive from an installed package.
1912 check_for_package_on_cmdline
1913 check_for_receipt
1914 EXTRAVERSION=""
1915 . $INSTALLED/$PACKAGE/receipt
1916 echo ""
1917 echo -e "\033[1mRepacking :\033[0m $PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
1918 echo "================================================================================"
1919 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
1920 echo "Can't repack $PACKAGE"
1921 exit 1
1922 fi
1923 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
1924 echo "Can't repack, $PACKAGE files have been modified by:"
1925 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
1926 echo " $i"
1927 done
1928 exit 1
1929 fi
1930 MISSING=""
1931 while read i; do
1932 [ -e "$i" ] && continue
1933 [ -L "$i" ] || MISSING="$MISSING\n $i"
1934 done < $INSTALLED/$PACKAGE/files.list
1935 if [ -n "$MISSING" ]; then
1936 echo -n "Can't repack, the following files are lost:"
1937 echo -e "$MISSING"
1938 exit 1
1939 fi
1940 mkdir -p $TMP_DIR && cd $TMP_DIR
1941 FILES="fs.cpio.lzma\n"
1942 for i in $(ls $INSTALLED/$PACKAGE) ; do
1943 [ "$i" = "volatile.cpio.gz" ] && continue
1944 [ "$i" = "modifiers" ] && continue
1945 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
1946 done
1947 ln -s / rootfs
1948 mkdir tmp
1949 sed 's/^/rootfs/' < files.list | cpio -o -H newc 2>/dev/null |\
1950 ( cd tmp ; cpio -idm 2>/dev/null )
1951 mv tmp/rootfs fs
1952 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
1953 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
1954 ( cd fs; cpio -idm )
1955 fi
1956 if grep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
1957 . $INSTALLED/$PACKAGE/receipt
1958 repack_cleanup fs
1959 fi
1960 if [ -f $INSTALLED/$PACKAGE/md5sum ]; then
1961 sed 's, , fs,' < $INSTALLED/$PACKAGE/md5sum | \
1962 md5sum -s -c || {
1963 echo "Can't repack, md5sum error."
1964 cd $TOP_DIR
1965 rm -rf $TMP_DIR
1966 exit 1
1968 fi
1969 find fs | cpio -o -H newc 2> /dev/null | lzma e fs.cpio.lzma -si
1970 echo -e "$FILES" | cpio -o -H newc 2> /dev/null > \
1971 $TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg
1972 cd $TOP_DIR
1973 \rm -R $TMP_DIR
1974 echo "Package $PACKAGE repacked successfully."
1975 echo "Size : `du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg`"
1976 echo ""
1977 ;;
1978 pack)
1979 # Create SliTaz package archive using cpio and gzip.
1981 check_for_package_on_cmdline
1982 cd $PACKAGE
1983 if [ ! -f "receipt" ]; then
1984 echo "Receipt is missing. Please read the documentation."
1985 exit 0
1986 else
1987 echo ""
1988 echo -e "\033[1mPacking :\033[0m $PACKAGE"
1989 echo "================================================================================"
1990 # Create files.list with redirecting find outpout.
1991 echo -n "Creating the list of files..." && cd fs
1992 find . -type f -print > ../files.list
1993 find . -type l -print >> ../files.list
1994 cd .. && sed -i s/'^.'/''/ files.list
1995 status
1996 echo -n "Creating md5sum of files..."
1997 while read file; do
1998 [ -L "fs$file" ] && continue
1999 [ -f "fs$file" ] || continue
2000 case "$file" in
2001 /lib/modules/*/modules.*|*.pyc) continue;;
2002 esac
2003 md5sum "fs$file" | sed 's/ fs/ /'
2004 done < files.list > md5sum
2005 status
2006 UNPACKED_SIZE=$(du -chs fs receipt files.list md5sum \
2007 description.txt 2> /dev/null | awk \
2008 '{ sz=$1 } END { print sz }')
2009 # Build cpio archives.
2010 echo -n "Compressing the fs... "
2011 find fs | cpio -o -H newc | lzma e fs.cpio.lzma -si
2012 rm -rf fs
2013 status
2014 PACKED_SIZE=$(du -chs fs.cpio.lzma receipt files.list \
2015 md5sum description.txt 2> /dev/null | awk \
2016 '{ sz=$1 } END { print sz }')
2017 echo -n "Undating receipt sizes..."
2018 sed -i s/^PACKED_SIZE.*$// receipt
2019 sed -i s/^UNPACKED_SIZE.*$// receipt
2020 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
2021 status
2022 echo -n "Creating full cpio archive... "
2023 find . -print | cpio -o -H newc > ../$PACKAGE.tazpkg
2024 status
2025 echo -n "Restoring original package tree... "
2026 unlzma -c fs.cpio.lzma | cpio -idm
2027 status
2028 rm fs.cpio.lzma && cd ..
2029 echo "================================================================================"
2030 echo "Package $PACKAGE compressed successfully."
2031 echo "Size : `du -sh $PACKAGE.tazpkg`"
2032 echo ""
2033 fi
2034 ;;
2035 recharge)
2036 # Recharge packages.list from a mirror.
2038 check_root
2039 for path in $LOCALSTATE $LOCALSTATE/undigest/*; do
2040 [ -f $path/mirror ] || continue
2041 echo ""
2042 if [ "$path" != "$LOCALSTATE" ]; then
2043 echo "Recharge undigest $(basename $path):"
2044 fi
2045 cd $path
2046 if [ -f "packages.list" ]; then
2047 echo -n "Creating backup of the last packages list..."
2048 mv -f packages.desc packages.desc.bak 2>/dev/null
2049 mv -f packages.md5 packages.md5.txt 2>/dev/null
2050 mv -f packages.txt packages.txt.bak 2>/dev/null
2051 mv -f packages.list packages.list.bak 2>/dev/null
2052 mv -f packages.equiv packages.equiv.bak 2>/dev/null
2053 mv -f files.list.lzma files.list.lzma.bak 2> /dev/null
2054 mv -f mirrors mirrors.bak 2> /dev/null
2055 status
2056 fi
2057 download_from "$(cat mirror)" packages.desc
2058 download_from "$(cat mirror)" packages.md5
2059 download_from "$(cat mirror)" packages.txt
2060 download_from "$(cat mirror)" packages.list
2061 download_from "$(cat mirror)" packages.equiv
2062 download_from "$(cat mirror)" files.list.lzma
2063 download_from "$(cat mirror)" mirrors
2064 [ -f mirrors ] || mv mirrors.bak mirrors 2> /dev/null
2065 suffix=$(head -1 mirror)
2066 suffix=packages${suffix#*/packages}
2067 for i in $(cat mirrors 2> /dev/null); do
2068 grep -qs $i mirror || echo $i$suffix >> mirror
2069 done
2070 if [ -f "packages.list.bak" ]; then
2071 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
2072 sed -i s/+// packages.diff
2073 echo ""
2074 echo -e "\033[1mMirrored packages diff\033[0m"
2075 echo "================================================================================"
2076 cat packages.diff
2077 if [ ! "`cat packages.diff | wc -l`" = 0 ]; then
2078 echo "================================================================================"
2079 echo "`cat packages.diff | wc -l` new packages on the mirror."
2080 echo ""
2081 else
2082 echo "`cat packages.diff | wc -l` new packages on the mirror."
2083 echo ""
2084 fi
2085 else
2086 echo -e "
2087 ================================================================================
2088 Last packages.list is ready to use. Note that next time you recharge the list,
2089 a list of differences will be displayed to show new and upgradeable packages.\n"
2090 fi
2091 done
2092 ;;
2093 upgrade)
2094 # Upgrade all installed packages with the new version from the mirror.
2096 check_root
2097 check_for_packages_list
2098 cd $LOCALSTATE
2099 # Touch the blocked pkgs list to avoid errors and remove any old
2100 # upgrade list.
2101 touch blocked-packages.list
2102 rm -f upgradeable-packages.list
2103 echo ""
2104 echo -e "\033[1mAvailable upgrades\033[0m"
2105 echo "================================================================================"
2106 echo ""
2107 # Some packages must be installed first
2108 FIRST_CLASS_PACKAGE=" glibc-base slitaz-base-files slitaz-boot-scripts "
2109 if [ -n "$PACKAGE_FILE" -a -d "$INSTALLED/$PACKAGE_FILE" ]; then
2110 ALL=$INSTALLED/$PACKAGE_FILE
2111 else
2112 ALL="$(ls -d $INSTALLED/*)"
2113 fi
2114 for pkg in $ALL
2115 do
2116 [ -f $pkg/receipt ] || continue
2117 EXTRAVERSION=""
2118 . $pkg/receipt
2119 # Display package name to show that Tazpkg is working...
2120 echo -en "\\033[0G "
2121 echo -en "\\033[0G$PACKAGE"
2122 # Skip specified pkgs listed in $LOCALSTATE/blocked-packages.list
2123 if grep -qs "^$PACKAGE" $BLOCKED; then
2124 blocked=$(($blocked+1))
2125 else
2126 # Check if the installed package is in the current list (other
2127 # mirror or local).
2128 NEW_PACKAGE=$(get_package_filename $PACKAGE)
2130 if [ -n "$NEW_PACKAGE" ]; then
2131 # Set new pkg and version for future comparison
2132 NEW_VERSION=`echo $NEW_PACKAGE | sed s/$PACKAGE-/''/`
2133 # Change '-' and 'pre' to points.
2134 NEW_VERSION=`echo $NEW_VERSION | sed s/'-'/'.'/`
2135 VERSION=`echo $VERSION | sed s/'-'/'.'/`$EXTRAVERSION
2136 NEW_VERSION=`echo $NEW_VERSION | sed s/'pre'/'.'/`
2137 VERSION=`echo $VERSION | sed s/'pre'/'.'/`
2138 NEW_VERSION=`echo $NEW_VERSION | sed 's/[A-Z]\.//'`
2139 VERSION=`echo $VERSION | sed 's/[A-Z]\.//'`
2140 # Compare version. Upgrades are only available for official
2141 # packages, so we control the mirror and it should be ok if
2142 # we just check for equality.
2143 RELEASE=""
2144 if [ -f installed.md5 -a -f packages.md5 ]; then
2145 current_md5=$(grep -s " $PACKAGE-$VERSION" installed.md5 | awk '{ print $1 }')
2146 new_md5=$(grep -hs " $PACKAGE-$VERSION" packages.md5 undigest/*/packages.md5 | head -1 | awk '{ print $1 }')
2147 [ -n "$current_md5" ] && [ -n "$new_md5" ] &&
2148 [ "$current_md5" != "$new_md5" ] && RELEASE=build
2149 fi
2150 if [ "$VERSION" != "$NEW_VERSION" -o -n "$RELEASE" ]; then
2151 # Version seems different. Check for major, minor or
2152 # revision
2153 PKG_MAJOR=`echo ${VERSION%_*} | cut -f1 -d"."`
2154 NEW_MAJOR=`echo ${NEW_VERSION%_*} | cut -f1 -d"."`
2155 PKG_MINOR=`echo ${VERSION%_*} | cut -f2 -d"."`
2156 NEW_MINOR=`echo ${NEW_VERSION%_*} | cut -f2 -d"."`
2157 # Minor
2158 if [ "$NEW_MINOR" -gt "$PKG_MINOR" ] 2> /dev/null; then
2159 RELEASE=minor
2160 fi
2161 if [ "$NEW_MINOR" -lt "$PKG_MINOR" ] 2> /dev/null; then
2162 RELEASE=$WARNING
2163 FIXE=yes
2164 fi
2165 # Major
2166 if [ "$NEW_MAJOR" -gt "$PKG_MAJOR" ] 2> /dev/null; then
2167 RELEASE=major
2168 FIXE=""
2169 fi
2170 if [ "$NEW_MAJOR" -lt "$PKG_MAJOR" ] 2> /dev/null; then
2171 RELEASE=$WARNING
2172 FIXE=yes
2173 fi
2174 # Default to revision.
2175 if [ -z $RELEASE ]; then
2176 RELEASE=revision
2177 fi
2178 # Pkg name is already displayed by the check process.
2179 echo -en "\033[24G $VERSION"
2180 echo -en "\033[38G --->"
2181 echo -en "\033[43G $NEW_VERSION"
2182 echo -en "\033[58G $CATEGORY"
2183 echo -e "\033[72G $RELEASE"
2184 up=$(($up+1))
2185 echo "$PACKAGE" >> upgradeable-packages.list
2186 case "$FIRST_CLASS_PACKAGE" in
2187 *\ $PACKAGE\ *) echo "$PACKAGE" >> upgradeable-packages.list$$;;
2188 esac
2189 unset RELEASE
2190 fi
2191 packages=$(($packages+1))
2192 fi
2193 fi
2194 done
2195 if [ -z $blocked ]; then
2196 blocked=0
2197 fi
2198 # Clean last checked package and display summary.
2199 if [ ! "$up" = "" ]; then
2200 echo -e "\\033[0G "
2201 echo "================================================================================"
2202 echo "$packages installed and listed packages to consider, $up to upgrade, $blocked blocked."
2203 echo ""
2204 else
2205 echo -e "\\033[0GSystem is up-to-date. "
2206 echo ""
2207 echo "================================================================================"
2208 echo "$packages installed and listed packages to consider, 0 to upgrade, $blocked blocked."
2209 echo ""
2210 exit 0
2211 fi
2212 # What to do if major or minor version is smaller.
2213 if [ "$FIXE" == "yes" ]; then
2214 echo -e "$WARNING ---> Installed package seems more recent than the mirrored one."
2215 echo "You can block packages using the command : 'tazpkg block package'"
2216 echo "Or upgrade packages at your own risk."
2217 echo ""
2218 fi
2219 # Ask for upgrade, it can be done another time.
2220 echo -n "Upgrade now (y/N) ? "; read anser
2221 if [ ! "$anser" = "y" ]; then
2222 echo -e "\nExiting. No package upgraded.\n"
2223 exit 0
2224 fi
2225 # If anser is yes (y). Install all new versions.
2226 cat upgradeable-packages.list >> upgradeable-packages.list$$
2227 mv -f upgradeable-packages.list$$ upgradeable-packages.list
2228 yes y | tazpkg get-install-list upgradeable-packages.list --forced
2229 rm -f upgradeable-packages.list
2230 ;;
2231 bugs)
2232 # Show known bugs in package(s)
2234 cd $INSTALLED
2235 shift
2236 LIST=$@
2237 [ -n "$LIST" ] || LIST=`ls`
2238 MSG="No known bugs."
2239 for PACKAGE in $LIST; do
2240 BUGS=""
2241 EXTRAVERSION=""
2242 . $PACKAGE/receipt
2243 if [ -n "$BUGS" ]; then
2244 MSG="
2245 Bug list completed"
2246 cat <<EOT
2248 Bugs in package $PACKAGE version $VERSION$EXTRAVERSION:
2249 $BUGS
2250 EOT
2251 fi
2252 done
2253 echo "$MSG"
2254 ;;
2255 check)
2256 # Check installed packages set.
2258 check_root
2259 cd $INSTALLED
2260 for PACKAGE in `ls`; do
2261 if [ ! -f $PACKAGE/receipt ]; then
2262 echo "The package $PACKAGE installation is not completed"
2263 continue
2264 fi
2265 DEPENDS=""
2266 EXTRAVERSION=""
2267 . $PACKAGE/receipt
2268 if [ -s $PACKAGE/modifiers ]; then
2269 echo "The package $PACKAGE $VERSION$EXTRAVERSION has been modified by :"
2270 for i in $(cat $PACKAGE/modifiers); do
2271 echo " $i"
2272 done
2273 fi
2274 MSG="Files lost from $PACKAGE $VERSION$EXTRAVERSION :\n"
2275 while read file; do
2276 [ -e "$file" ] && continue
2277 if [ -L "$file" ]; then
2278 MSG="$MSG target of symlink"
2279 fi
2280 echo -e "$MSG $file"
2281 MSG=""
2282 done < $PACKAGE/files.list
2283 MSG="Missing dependencies for $PACKAGE $VERSION$EXTRAVERSION :\n"
2284 for i in $DEPENDS; do
2285 [ -d $i ] && continue
2286 [ -d $(equivalent_pkg $i) ] && continue
2287 echo -e "$MSG $i"
2288 MSG=""
2289 done
2290 MSG="Dependencies loop between $PACKAGE and :\n"
2291 ALL_DEPS=""
2292 check_for_deps_loop $PACKAGE $DEPENDS
2293 done
2294 echo -n "Looking for known bugs... "
2295 tazpkg bugs
2296 if [ "$PACKAGE_FILE" = "--full" ]; then
2297 for file in */md5sum; do
2298 CONFIG_FILES=""
2299 . $(dirname "$file")/receipt
2300 [ -s "$file" ] || continue
2301 while read md5 f; do
2302 [ -f $f ] || continue
2303 for i in $CONFIG_FILES; do
2304 case "$f" in
2305 $i|$i/*) continue 2;;
2306 esac
2307 done
2308 echo "$md5 $f"
2309 done < "$file" | md5sum -c - 2> /dev/null | \
2310 grep -v OK$ | sed 's/FAILED$/MD5SUM MISMATCH/'
2311 done
2312 FILES=" "
2313 for file in $(cat */files.list); do
2314 [ -d "$file" ] && continue
2315 case "$FILES" in *\ $file\ *) continue;; esac
2316 [ $(grep "^$file$" */files.list 2> /dev/null | \
2317 wc -l) -gt 1 ] || continue
2318 FILES="$FILES$file "
2319 echo "The following packages provide $file :"
2320 grep -l "^$file$" */files.list | while read f
2321 do
2322 pkg=${f%/files.list}
2323 echo -n " $pkg"
2324 if [ -f $pkg/modifiers ]; then
2325 echo -n " (overridden by $(echo "$(cat $pkg/modifiers)"))"
2326 fi
2327 echo ""
2328 done
2329 done
2330 MSG="No package has installed the following files:\n"
2331 find /etc /bin /sbin /lib /usr /var/www \
2332 -not -type d 2> /dev/null | while read file; do
2333 case "$file" in *\[*) continue;; esac
2334 grep -q "^$file$" */files.list && continue
2335 echo -e "$MSG $file"
2336 MSG=""
2337 done
2338 fi
2339 echo "Check completed."
2340 ;;
2341 block)
2342 # Add a pkg name to the list of blocked packages.
2344 check_root
2345 check_for_package_on_cmdline
2346 echo ""
2347 if grep -qs "^$PACKAGE" $BLOCKED; then
2348 echo "$PACKAGE is already in the blocked packages list."
2349 echo ""
2350 exit 0
2351 else
2352 echo -n "Add $PACKAGE to : $BLOCKED..."
2353 echo $PACKAGE >> $BLOCKED
2354 status
2355 # Log this activity
2356 . $INSTALLED/$PACKAGE/receipt
2357 log Blocked
2358 fi
2359 echo ""
2360 ;;
2361 unblock)
2362 # Remove a pkg name from the list of blocked packages.
2364 check_root
2365 check_for_package_on_cmdline
2366 echo ""
2367 if grep -qs "^$PACKAGE" $BLOCKED; then
2368 echo -n "Removing $PACKAGE from : $BLOCKED..."
2369 sed -i s/$PACKAGE/''/ $BLOCKED
2370 sed -i '/^$/d' $BLOCKED
2371 status
2372 # Log this activity
2373 . $INSTALLED/$PACKAGE/receipt
2374 log Unblocked
2375 else
2376 echo "$PACKAGE is not in the blocked packages list."
2377 echo ""
2378 exit 0
2379 fi
2380 echo ""
2381 ;;
2382 get)
2383 # Downlowd a package with wget.
2385 check_for_package_on_cmdline
2386 check_for_packages_list
2387 check_for_package_in_list
2388 echo ""
2389 download $PACKAGE.tazpkg
2390 echo ""
2391 ;;
2392 get-install)
2393 # Download and install a package.
2395 check_root
2396 check_for_package_on_cmdline
2397 check_for_packages_list
2398 DO_CHECK=""
2399 while [ -n "$3" ]; do
2400 case "$3" in
2401 --forced)
2402 DO_CHECK="no"
2403 ;;
2404 --root=*)
2405 ROOT="${3#--root=}"
2406 ;;
2407 --list=*)
2408 INSTALL_LIST="${3#--list=}"
2409 ;;
2410 *) shift 2
2411 echo -e "\nUnknown option $*.\n"
2412 exit 1
2413 ;;
2414 esac
2415 shift
2416 done
2417 AUTOEXEC="no"
2418 if ! check_for_package_in_list check; then
2419 PACKAGE=get-$PACKAGE
2420 AUTOEXEC=$PACKAGE
2421 check_for_package_in_list
2422 if [ -n "$(get_installed_package_pathname $PACKAGE $ROOT)" ]; then
2423 $AUTOEXEC $ROOT
2424 exit 0
2425 fi
2426 fi
2427 # Check if forced install.
2428 if [ "$DO_CHECK" = "no" ]; then
2429 rm -f $CACHE_DIR/$PACKAGE.tazpkg
2430 else
2431 check_for_installed_package $ROOT
2432 fi
2433 cd $CACHE_DIR
2434 if [ -f "$PACKAGE.tazpkg" ]; then
2435 echo "$PACKAGE already in the cache : $CACHE_DIR"
2436 # Check package download was finished
2437 tail -c 2k $PACKAGE.tazpkg | grep -q 00000000TRAILER || {
2438 echo "Continue $PACKAGE download"
2439 download $PACKAGE.tazpkg
2441 else
2442 echo ""
2443 download $PACKAGE.tazpkg
2444 fi
2445 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
2446 install_package $ROOT
2447 [ "$AUTOEXEC" != "no" ] && $PACKAGE $ROOT
2448 ;;
2449 clean-cache)
2450 # Remove all downloaded packages.
2452 check_root
2453 files=`ls -1 $CACHE_DIR | wc -l`
2454 echo ""
2455 echo -e "\033[1mClean cache :\033[0m $CACHE_DIR"
2456 echo "================================================================================"
2457 echo -n "Cleaning cache directory..."
2458 rm -rf $CACHE_DIR/*
2459 status
2460 echo "================================================================================"
2461 echo "$files file(s) removed from cache."
2462 echo ""
2463 ;;
2464 list-undigest)
2465 # list undigest URLs.
2467 if [ "$2" = "--box" ]; then
2468 for i in $LOCALSTATE/undigest/*/mirror; do
2469 [ -f $i ] || continue
2470 echo "$(basename $(dirname $i))|$(cat $i)"
2471 done
2472 else
2473 echo ""
2474 echo -e "\033[1mCurrent undigest(s)\033[0m"
2475 echo "================================================================================"
2476 for i in $LOCALSTATE/undigest/*/mirror; do
2477 if [ ! -f $i ]; then
2478 echo "No undigest mirror found."
2479 exit 1
2480 fi
2481 echo "$(basename $(dirname $i)) $(cat $i)"
2482 done
2483 echo ""
2484 fi
2485 ;;
2486 remove-undigest)
2487 # remove undigest URL.
2489 check_root
2490 if [ -d $LOCALSTATE/undigest/$2 ]; then
2491 echo -n "Remove $2 undigest (y/N) ? "; read anser
2492 if [ "$anser" = "y" ]; then
2493 echo -n "Removing $2 undigest..."
2494 rm -rf $LOCALSTATE/undigest/$2
2495 status
2496 rmdir $LOCALSTATE/undigest 2> /dev/null
2497 fi
2498 else
2499 echo "Undigest $2 not found"
2500 fi
2501 ;;
2502 add-undigest|setup-undigest)
2503 # Add undigest URL.
2505 check_root
2506 undigest=$2
2507 [ -d $LOCALSTATE/undigest ] || mkdir $LOCALSTATE/undigest
2508 if [ -z "$undigest" ]; then
2509 i=1
2510 while [ -d $LOCALSTATE/undigest/$i ]; do
2511 i=$(($i+1))
2512 done
2513 undigest=$i
2514 fi
2515 if [ ! -d $LOCALSTATE/undigest/$undigest ]; then
2516 echo "Creating new undigest $undigest."
2517 mkdir $LOCALSTATE/undigest/$undigest
2518 fi
2519 setup_mirror $LOCALSTATE/undigest/$undigest $3
2520 ;;
2521 setup-mirror)
2522 # Change mirror URL.
2524 check_root
2525 setup_mirror $LOCALSTATE $2
2526 ;;
2527 reconfigure)
2528 # Replay post_install from receipt
2530 check_for_package_on_cmdline
2531 check_root
2532 ROOT=""
2533 while [ -n "$3" ]; do
2534 case "$3" in
2535 --root=*)
2536 ROOT="${3#--root=}/"
2537 ;;
2538 *) shift 2
2539 echo -e "\nUnknown option $*.\n"
2540 exit 1
2541 ;;
2542 esac
2543 shift
2544 done
2545 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
2546 check_for_receipt $ROOT
2547 # Check for post_install
2548 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
2549 . $ROOT$INSTALLED/$PACKAGE/receipt
2550 post_install $ROOT
2551 # Log this activity
2552 [ -n "$ROOT" ] || log Reconfigured
2553 else
2554 echo -e "\nNothing to do for $PACKAGE."
2555 fi
2556 else
2557 echo -e "\npackage $PACKAGE is not installed."
2558 echo -e "Install package with 'tazpkg install' or 'tazpkg get-install'\n"
2559 fi
2560 ;;
2561 shell)
2562 # Tazpkg SHell
2564 if test $(id -u) = 0 ; then
2565 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
2566 else
2567 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
2568 fi
2569 if [ ! "$2" = "--noheader" ]; then
2570 clear
2571 echo ""
2572 echo -e "\033[1mTazpkg SHell.\033[0m"
2573 echo "================================================================================"
2574 echo "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
2575 echo ""
2576 fi
2577 while true
2578 do
2579 echo -en "$PROMPT"; read cmd
2580 case $cmd in
2581 q|quit)
2582 break ;;
2583 shell)
2584 echo "You are already running a Tazpkg SHell." ;;
2585 su)
2586 su -c 'exec tazpkg shell --noheader' && break ;;
2587 "")
2588 continue ;;
2589 *)
2590 tazpkg $cmd ;;
2591 esac
2592 done
2593 ;;
2594 depends)
2595 # Display dependencies tree
2596 cd $INSTALLED
2597 ALL_DEPS=""
2598 if [ -f $2/receipt ]; then
2599 dep_scan $2 ""
2600 fi
2601 ;;
2602 rdepends)
2603 # Display reverse dependencies tree
2604 cd $INSTALLED
2605 ALL_DEPS=""
2606 if [ -f $2/receipt ]; then
2607 rdep_scan $2
2608 fi
2609 ;;
2610 convert)
2611 # convert misc package format to .tazpkg
2612 check_for_package_file
2613 case "$PACKAGE_FILE" in
2614 *.deb|*.udeb)
2615 convert_deb;;
2616 *.rpm)
2617 convert_rpm;;
2618 *.tgz)
2619 convert_tgz;;
2620 *.pkg.tar.gz)
2621 convert_arch;;
2622 *.ipk|*.opk)
2623 convert_ipk;;
2624 *)
2625 echo "Unsupported format";;
2626 esac
2627 ;;
2628 link)
2629 # link a package from another slitaz installation
2630 PACKAGE=$2
2631 if [ ! -d "$TARGET_DIR" -o \
2632 ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
2633 cat <<EOT
2634 usage: tazpkg link package_name slitaz_root
2635 example: 'tazpkg link openoffice /mnt' will use less than 100k in
2636 your ram running system.
2637 EOT
2638 exit 1
2639 fi
2640 if [ -e "$INSTALLED/$PACKAGE" ]; then
2641 echo "$PACKAGE is already installed."
2642 exit 1
2643 fi
2644 ln -s $TARGET_DIR$INSTALLED/$PACKAGE $INSTALLED
2645 DEPENDS="$(. $INSTALLED/$PACKAGE/receipt ; echo $DEPENDS)"
2646 MISSING=""
2647 for i in $DEPENDS; do
2648 [ -e $INSTALLED/$i ] && continue
2649 MISSING="$MISSING$i "
2650 echo "Missing : $i"
2651 done
2652 if [ -n "$MISSING" ]; then
2653 echo ""
2654 echo -n "Link all missing dependencies (y/N) ? "; read answer
2655 echo ""
2656 if [ "$answer" = "y" ]; then
2657 for i in $MISSING; do
2658 tazpkg link $i $TARGET_DIR
2659 done
2660 else
2661 echo -e "\nLeaving dependencies for $PACKAGE unsolved."
2662 echo -e "The package is installed but will probably not work.\n"
2663 fi
2664 fi
2665 . $INSTALLED/$PACKAGE/receipt
2666 if grep -q ^pre_install $INSTALLED/$PACKAGE/receipt; then
2667 pre_install
2668 fi
2669 while read path; do
2670 [ -e $path ] && continue
2671 while true; do
2672 dir=$(dirname $path)
2673 [ -e $dir ] && break
2674 path=$dir
2675 done
2676 ln -s $TARGET_DIR$path $dir
2677 done < $INSTALLED/$PACKAGE/files.list
2678 if grep -q ^post_install $INSTALLED/$PACKAGE/receipt; then
2679 post_install
2680 fi
2681 ;;
2682 usage|*)
2683 # Print a short help or give usage for an unknown or empty command.
2684 usage ;;
2685 esac
2687 exit 0