tazpkg view tazpkg @ rev 365

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