tazpkg view tazpkg @ rev 309

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