tazpkg view tazpkg @ rev 241

tazpkg: do not substitute everything !
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Mar 05 15:58:02 2009 +0000 (2009-03-05)
parents 0515ecb5f6b2
children acde50fb07a5
line source
1 #!/bin/sh
2 # Tazpkg - Tiny autonomus zone packages manager.
3 #
4 # This is a lightwight packages manager for *.tazpkg files, all written in
5 # SHell script. It works well with Busybox ash shell and bash. Tazpkg lets you
6 # list, install, remove, download or get information about a package. You can
7 # use 'tazpkg usage' to get a list of commands with short descriptions. Tazpkg
8 # also resolves dependencies and can upgrade packages from a mirror.
9 #
10 # (C) 2007-2008 SliTaz - GNU General Public License v3.
11 #
12 # Authors : Christophe Lincoln <pankso@slitaz.org>
13 # Pascal Bellard <pascal.bellard@slitaz.org>
14 # Eric Joseph-Alexandre <erjo@slitaz.org>
15 #
16 VERSION=2.6.1
18 ####################
19 # Script variables #
20 ####################
22 # Packages categories.
23 CATEGORIES="
24 base-system
25 x-window
26 utilities
27 network
28 graphics
29 multimedia
30 office
31 development
32 system-tools
33 security
34 games
35 misc
36 meta
37 non-free"
39 # Initialize some variables to use words
40 # rather than numbers for functions and actions.
41 COMMAND=$1
42 if [ -f "$2" ]; then
43 # Set pkg basename for install, extract
44 PACKAGE=$(basename ${2%.tazpkg} 2>/dev/null)
45 else
46 # Pkg name for remove, search and all other cmds
47 PACKAGE=${2%.tazpkg}
48 fi
49 PACKAGE_FILE=$2
50 TARGET_DIR=$3
51 TOP_DIR=`pwd`
52 TMP_DIR=/tmp/tazpkg-$$-$RANDOM
54 # Path to tazpkg used dir and configuration files
55 LOCALSTATE=/var/lib/tazpkg
56 INSTALLED=$LOCALSTATE/installed
57 CACHE_DIR=/var/cache/tazpkg
58 MIRROR=$LOCALSTATE/mirror
59 BLOCKED=$LOCALSTATE/blocked-packages.list
60 DEFAULT_MIRROR="http://mirror.slitaz.org/packages/`cat /etc/slitaz-release`/"
61 INSTALL_LIST=""
62 LOG=/var/log/tazpkg.log
64 # Bold red warning for upgrade.
65 WARNING="\\033[1;31mWARNING\\033[0;39m"
67 # Check if the directories and files used by Tazpkg
68 # exist. If not and user is root we create them.
69 if test $(id -u) = 0 ; then
70 if [ ! -d "$CACHE_DIR" ]; then
71 mkdir -p $CACHE_DIR
72 fi
73 if [ ! -d "$INSTALLED" ]; then
74 mkdir -p $INSTALLED
75 fi
76 if [ ! -f "$LOCALSTATE/mirror" ]; then
77 echo "$DEFAULT_MIRROR" > $LOCALSTATE/mirror
78 fi
79 fi
81 ####################
82 # Script functions #
83 ####################
85 # Print the usage.
86 usage ()
87 {
88 echo -e "SliTaz package manager - Version: $VERSION\n
89 \033[1mUsage:\033[0m tazpkg [command] [package|dir|pattern|list|cat|--opt] [dir|--opt]
90 tazpkg shell\n
91 \033[1mCommands: \033[0m
92 usage Print this short usage.
93 bugs Show known bugs in packages
94 list List installed packages on the system by category or all.
95 xhtml-list Create a xHTML list of installed packges.
96 list-mirror List all available packages on the mirror (--diff for new).
97 info Print information about a package.
98 desc Print description of a package (if it exists).
99 list-files List the files installed with a package.
100 list-config List the configuration files.
101 search Search for a package by pattern or name (options: -i|-l|-m).
102 search-file Search for file(s) in all installed packages files.
103 install Install a local (*.tazpkg) package (--forced to force).
104 install-list Install all packages from a list of packages.
105 remove Remove the specified package and all installed files.
106 extract Extract a (*.tazpkg) package into a directory.
107 pack Pack an unpacked or prepared package tree.
108 recharge Recharge your packages.list from the mirror.
109 repack Create a package archive from an installed package.
110 repack-config Create a package archive with configuration files.
111 upgrade Upgrade all installed and listed packages on the mirror.
112 block|unblock Block an installed package version or unblock it for upgrade.
113 get Download a package into the current directory.
114 get-install Download and install a package from the mirror.
115 get-install-list Download and install a list of packages from the mirror.
116 check Verify consistency of installed packages.
117 add-flavor Install the flavor list of packages.
118 install-flavor Install the flavor list of packages and remove other ones.
119 set-release Change release and update packages
120 clean-cache Clean all packages downloaded in cache directory.
121 depends Display dependancies tree.
122 rdepends Display reverse dependancies tree.
123 setup-mirror Change the mirror url configuration.
124 list-undigest List undigest mirrors.
125 remove-undigest Remove an undigest mirror.
126 add-undigest Add an undigest mirror.
127 setup-undigest Update an undigest mirror.
128 reconfigure Replay post install script from package."
129 }
131 # Status function with color (supported by Ash).
132 status()
133 {
134 local CHECK=$?
135 echo -en "\\033[70G[ "
136 if [ $CHECK = 0 ]; then
137 echo -en "\\033[1;33mOK"
138 else
139 echo -en "\\033[1;31mFailed"
140 fi
141 echo -e "\\033[0;39m ]"
142 return $CHECK
143 }
145 # Check if user is root to install, or remove packages.
146 check_root()
147 {
148 if test $(id -u) != 0 ; then
149 echo -e "\nYou must be root to run `basename $0` with this option."
150 echo -e "Please use 'su' and root password to become super-user.\n"
151 exit 0
152 fi
153 }
155 # Check for a package name on cmdline.
156 check_for_package_on_cmdline()
157 {
158 if [ -z "$PACKAGE" ]; then
159 echo -e "\nPlease specify a package name on the command line.\n"
160 exit 0
161 fi
162 }
164 # Check if the package (*.tazpkg) exist before installing or extracting.
165 check_for_package_file()
166 {
167 if [ ! -f "$PACKAGE_FILE" ]; then
168 echo -e "
169 Unable to find : $PACKAGE_FILE\n"
170 exit 0
171 fi
172 }
174 # Check for the receipt of an installed package.
175 check_for_receipt()
176 {
177 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
178 echo -e "\nUnable to find the receipt : $INSTALLED/$PACKAGE/receipt\n"
179 exit 0
180 fi
181 }
183 # Get package name in a directory
184 package_fullname_in_dir()
185 {
186 [ -f $2$1/receipt ] || return
187 EXTRAVERSION=""
188 . $2$1/receipt
189 echo $PACKAGE-$VERSION$EXTRAVERSION
190 }
192 # Get package name that is already installed.
193 get_installed_package_pathname()
194 {
195 for i in $2$INSTALLED/${1%%-*}*; do
196 [ -d $i ] || continue
197 if [ "$1" = "$(package_fullname_in_dir $i $2)" ]; then
198 echo $i
199 return
200 fi
201 done
202 }
204 # Check if a package is already installed.
205 check_for_installed_package()
206 {
207 if [ -n "$(get_installed_package_pathname $PACKAGE $1)" ]; then
208 echo -e "
209 $PACKAGE is already installed. You can use the --forced option to force
210 installation or remove it and reinstall.\n"
211 exit 0
212 fi
213 }
215 # Check for packages.list to download and install packages.
216 check_for_packages_list()
217 {
218 if [ ! -f "$LOCALSTATE/packages.list" ]; then
219 if test $(id -u) = 0 ; then
220 tazpkg recharge
221 else
222 echo -e "
223 Unable to find the list : $LOCALSTATE/packages.list\n
224 You should probably run 'tazpkg recharge' as root to get the latest list of
225 packages available on the mirror.\n"
226 exit 0
227 fi
228 fi
229 }
231 # get package from packages.equiv
232 equivalent_pkg()
233 {
234 for i in $(grep -hs "^$1=" $LOCALSTATE/packages.equiv \
235 $LOCALSTATE/undigest/*/packages.equiv | sed "s/^$1=//"); do
236 if echo $i | grep -q : ; then
237 # format 'alternative:newname'
238 # if alternative is installed then substitute newname
239 if [ -f $2$INSTALLED/${i%:*}/receipt ]; then
240 # substitute package dependancy
241 echo ${i#*:}
242 return
243 fi
244 else
245 # if alternative is installed then nothing to install
246 if [ -f $2$INSTALLED/$i/receipt ]; then
247 # substitute installed package
248 echo $i
249 return
250 fi
251 fi
252 done
253 # if not found in packages.equiv then no substitution
254 echo $1
255 }
257 # Get package filename available on the mirror
258 get_package_filename()
259 {
260 local pkg
261 pkg=$(grep -A 1 -sh "^$1$" $LOCALSTATE/packages.txt \
262 $LOCALSTATE/undigest/*/packages.txt | tail -1)
263 pkg=$(echo $pkg)
264 [ -n "$pkg" ] && pkg=$(grep -sh "^$1-$pkg" \
265 $LOCALSTATE/packages.list \
266 $LOCALSTATE/undigest/*/packages.list | head -1)
267 [ -n "$pkg" ] || pkg=$(grep -sh "^$1-[0-9]" \
268 $LOCALSTATE/packages.list \
269 $LOCALSTATE/undigest/*/packages.list | head -1)
270 [ -n "$pkg" ] || pkg=$(grep -sh "^$1-.[\.0-9]" \
271 $LOCALSTATE/packages.list \
272 $LOCALSTATE/undigest/*/packages.list | head -1)
273 if [ -z "$pkg" ]; then
274 # Check for vitual package
275 local equiv
276 equiv=$(equivalent_pkg $1 virtual)
277 if [ "$equiv" != "$1" ]; then
278 PACKAGE=$equiv
279 get_package_filename $PACKAGE
280 return
281 fi
282 fi
283 echo $pkg
284 }
286 # Check for a package in packages.list. Used by get and get-install to grep
287 # package basename.
288 check_for_package_in_list()
289 {
290 local filename
291 local check_only
292 check_only="$1"
293 filename=$(get_package_filename $PACKAGE)
294 if [ -n "$filename" ]; then
295 PACKAGE=$filename
296 else
297 echo -e "\nUnable to find : $PACKAGE in the mirrored packages list.\n"
298 [ -n "$check_only" ] && return 1
299 exit 0
300 fi
301 }
303 # Log this activity
304 log()
305 {
306 local extra
307 [ "$1" = "Installed" ] && \
308 extra=" - $(grep $PACKAGE-$VERSION $LOCALSTATE/installed.md5 | awk '{ print $1 }')"
309 [ -e $LOG ] || touch $LOG
310 DATE=`date +'%F %T'`
311 [ -w $LOG ] &&
312 echo "$DATE - $1 - $PACKAGE ($VERSION$EXTRAVERSION)$extra" >> $LOG
313 }
315 # Download a file from this mirror
316 download_from()
317 {
318 local i
319 local mirrors
320 mirrors="$1"
321 shift
322 for i in $mirrors; do
323 case "$i" in
324 http://*|ftp://*) wget -c $i$@ && break;;
325 *) cp $i/$1 . && break;;
326 esac
327 done
328 }
330 # Download a file trying all mirrors
331 download()
332 {
333 local i
334 case "$1" in
335 *.tazpkg)
336 for i in $LOCALSTATE $LOCALSTATE/undigest/* ; do
337 grep "^${1%.tazpkg}$" $i/packages.list || continue
338 download_from "$(cat $i/mirror)" "$@" && return
339 done
340 esac
341 for i in $(cat $MIRROR $LOCALSTATE/undigest/*/mirror 2> /dev/null); do
342 download_from "$i" "$@" && break
343 done
344 }
346 # Extract a package with cpio and gzip.
347 extract_package()
348 {
349 echo -n "Extracting $PACKAGE... "
350 cpio -id < $PACKAGE.tazpkg && rm -f $PACKAGE.tazpkg
351 gzip -d fs.cpio.gz
352 echo -n "Extracting the pseudo fs... "
353 cpio -id < fs.cpio && rm fs.cpio
354 }
356 # This function installs a package in the rootfs.
357 install_package()
358 {
359 ROOT=$1
360 if [ -n "$ROOT" ]; then
361 # Get absolute path
362 ROOT=$(cd $ROOT; pwd)
363 fi
364 (
365 # Create package path early to avoid dependencies loop
366 mkdir -p $TMP_DIR
367 ( cd $TMP_DIR ; cpio -i receipt > /dev/null) < $PACKAGE_FILE
368 . $TMP_DIR/receipt
369 if grep -q ^pre_depends $TMP_DIR/receipt; then
370 pre_depends $ROOT
371 fi
372 rm -rf $TMP_DIR $ROOT$INSTALLED/$PACKAGE 2> /dev/null
373 # Make the installed package data dir to store
374 # the receipt and the files list.
375 mkdir -p $ROOT$INSTALLED/$PACKAGE
376 sed -i "/ $(basename $PACKAGE_FILE)$/d" \
377 $ROOT$LOCALSTATE/installed.md5 2> /dev/null
378 cd $(dirname $PACKAGE_FILE)
379 md5sum $(basename $PACKAGE_FILE) >> $ROOT$LOCALSTATE/installed.md5
380 )
381 # Resolve package deps.
382 check_for_deps $ROOT
383 if [ ! "$MISSING_PACKAGE" = "" ]; then
384 install_deps $ROOT
385 fi
386 mkdir -p $TMP_DIR
387 [ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> $INSTALL_LIST-processed
388 echo ""
389 echo -e "\033[1mInstallation of :\033[0m $PACKAGE"
390 echo "================================================================================"
391 echo -n "Copying $PACKAGE... "
392 cp $PACKAGE_FILE $TMP_DIR
393 status
394 cd $TMP_DIR
395 extract_package
396 SELF_INSTALL=0
397 EXTRAVERSION=""
398 CONFIG_FILES=""
399 # Include temporary receipt to get the right variables.
400 . $PWD/receipt
401 if [ $SELF_INSTALL -ne 0 -a -n "$ROOT" ]; then
402 echo -n "Checking post install dependencies... "
403 [ -f $INSTALLED/$PACKAGE/receipt ]
404 if ! status; then
405 echo "Please run 'tazpkg install $PACKAGE_FILE' in / and retry."
406 cd .. && rm -rf $TMP_DIR
407 exit 1
408 fi
409 fi
410 # Remember modified packages
411 for i in $(grep -v '\[' files.list); do
412 [ -e "$ROOT$i" ] || continue
413 [ -d "$ROOT$i" ] && continue
414 for j in $(grep -l "^$i$" $ROOT$INSTALLED/*/files.list); do
415 [ "$j" = "$ROOT$INSTALLED/$PACKAGE/files.list" ] && continue
416 grep -qs ^$PACKAGE$ $(dirname $j)/modifiers && continue
417 if [ -s "$(dirname $j)/volatile.cpio.gz" ]; then
418 # We can modify backed up files
419 zcat $(dirname $j)/volatile.cpio.gz | \
420 cpio -t 2> /dev/null | \
421 grep -q "^${i#/}$" && continue
422 fi
423 echo "$PACKAGE" >> $(dirname $j)/modifiers
424 done
425 done
426 cp receipt files.list $ROOT$INSTALLED/$PACKAGE
427 # Copy the description if found.
428 if [ -f "description.txt" ]; then
429 cp description.txt $ROOT$INSTALLED/$PACKAGE
430 fi
431 # Copy the md5sum if found.
432 if [ -f "md5sum" ]; then
433 cp md5sum $ROOT$INSTALLED/$PACKAGE
434 fi
435 # Pre install commands.
436 if grep -q ^pre_install $ROOT$INSTALLED/$PACKAGE/receipt; then
437 pre_install $ROOT
438 fi
439 if [ -n "$CONFIG_FILES" ]; then
440 # save 'official' configuration files
441 echo -n "Save configuration files for $PACKAGE... "
442 for i in $CONFIG_FILES; do
443 ( cd fs ; find ${i#/} -type f )
444 done | ( cd fs ; cpio -o -H newc | gzip -9 ) > \
445 $ROOT$INSTALLED/$PACKAGE/volatile.cpio.gz
446 # keep user configuration files
447 for i in $CONFIG_FILES; do
448 ( cd fs ; find ${i#/} -type f )
449 done | while read i; do
450 [ -e $ROOT/$i ] || continue
451 cp -a $ROOT/$i fs/$i
452 done
453 status
454 fi
455 echo -n "Installing $PACKAGE... "
456 cp -a fs/* $ROOT/
457 status
458 # Remove the temporary random directory.
459 echo -n "Removing all tmp files... "
460 cd .. && rm -rf $TMP_DIR
461 status
462 # Post install commands.
463 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
464 post_install $ROOT
465 fi
466 cd $TOP_DIR
467 echo "================================================================================"
468 echo "$PACKAGE ($VERSION$EXTRAVERSION) is installed."
469 echo ""
470 # Log this activity
471 [ -n "$ROOT" ] || log Installed
473 }
475 # Check for loop in deps tree.
476 check_for_deps_loop()
477 {
478 local list
479 local pkg
480 local deps
481 pkg=$1
482 shift
483 [ -n "$1" ] || return
484 list=""
485 # Filter out already processed deps
486 for i in $@; do
487 case " $ALL_DEPS" in
488 *\ $i\ *);;
489 *) list="$list $i";;
490 esac
491 done
492 ALL_DEPS="$ALL_DEPS$list "
493 for i in $list; do
494 [ -f $i/receipt ] || continue
495 deps="$(DEPENDS=""; . $i/receipt; echo $DEPENDS)"
496 case " $deps " in
497 *\ $pkg\ *) echo -e "$MSG $i"; MSG="";;
498 *) check_for_deps_loop $pkg $deps;;
499 esac
500 done
501 }
503 # Check for missing deps listed in a receipt packages.
504 check_for_deps()
505 {
506 local saved;
507 saved=$PACKAGE
508 mkdir -p $TMP_DIR
509 ( cd $TMP_DIR ; cpio -i receipt > /dev/null ) < $PACKAGE_FILE
510 . $TMP_DIR/receipt
511 PACKAGE=$saved
512 rm -rf $TMP_DIR
513 for pkgorg in $DEPENDS
514 do
515 i=$(equivalent_pkg $pkgorg $1)
516 if [ ! -d "$1$INSTALLED/$i" ]; then
517 MISSING_PACKAGE=$i
518 deps=$(($deps+1))
519 elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
520 echo -e "$WARNING Dependency loop between $PACKAGE and $i."
521 fi
522 done
523 if [ ! "$MISSING_PACKAGE" = "" ]; then
524 echo -e "\033[1mTracking dependencies for :\033[0m $PACKAGE"
525 echo "================================================================================"
526 for pkgorg in $DEPENDS
527 do
528 i=$(equivalent_pkg $pkgorg $1)
529 if [ ! -d "$1$INSTALLED/$i" ]; then
530 MISSING_PACKAGE=$i
531 echo "Missing : $MISSING_PACKAGE"
532 fi
533 done
534 echo "================================================================================"
535 echo "$deps missing package(s) to install."
536 fi
537 }
539 # Install all missing deps. First ask user then install all missing deps
540 # from local dir, cdrom, media or from the mirror. In case we want to
541 # install packages from local, we need a packages.list to find the version.
542 install_deps()
543 {
544 local root
545 root=""
546 [ -n "$1" ] && root="--root=$1"
547 echo ""
548 echo -n "Install all missing dependencies (y/N) ? "; read anser
549 echo ""
550 if [ "$anser" = "y" ]; then
551 for pkgorg in $DEPENDS
552 do
553 pkg=$(equivalent_pkg $pkgorg $1)
554 if [ ! -d "$1$INSTALLED/$pkg" ]; then
555 local list
556 list="$INSTALL_LIST"
557 [ -n "$list" ] || list="$TOP_DIR/packages.list"
558 # We can install packages from a local dir by greping
559 # the TAZPKG_BASENAME in the local packages.list.
560 found=0
561 if [ -f "$list" ]; then
562 echo "Checking if $pkg exist in local list... "
563 mkdir $TMP_DIR
564 for i in $pkg-*.tazpkg; do
565 [ -f $i ] || continue
566 ( cd $TMP_DIR ; cpio -i receipt > /dev/null) < $i
567 [ "$(. $TMP_DIR/receipt; echo $PACKAGE)" = "$pkg" ] || continue
568 if grep -q ^$(package_fullname_in_dir $TMP_DIR).tazpkg$ $list
569 then
570 found=1
571 tazpkg install $i $root --list=$list
572 break
573 fi
574 done
575 rm -rf $TMP_DIR
576 fi
577 # Install deps from the mirror.
578 if [ $found -eq 0 ]; then
579 if [ ! -f "$LOCALSTATE/packages.list" ]; then
580 tazpkg recharge
581 fi
582 tazpkg get-install $pkg $root
583 fi
584 fi
585 done
586 else
587 echo -e "\nLeaving dependencies for $PACKAGE unsolved."
588 echo -e "The package is installed but will probably not work.\n"
589 fi
590 }
592 # xHTML packages list header.
593 xhtml_header()
594 {
595 cat > $XHTML_LIST << _EOT_
596 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
597 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
598 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
599 <head>
600 <title>Installed packages list</title>
601 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
602 <meta name="modified" content="$DATE" />
603 <meta name="generator" content="Tazpkg" />
604 <style type="text/css"><!--
605 body { font: 12px sans-serif, vernada, arial; margin: 0; }
606 #header { background: #f0ba08; color: black; height: 50px;
607 border-top: 1px solid black; border-bottom: 1px solid black; }
608 #content { margin: 0px 50px 26px 50px; }
609 #footer { border-top: 1px solid black; padding-top: 10px;}
610 h1 { margin: 14px 0px 0px 16px; }
611 pre { padding-left: 5px; }
612 hr { color: white; background: white; height: 1px; border: 0; }
613 --></style>
614 </head>
615 <body bgcolor="#ffffff">
616 <div id="header">
617 <h1><font color="#3e1220">Installed packages list</font></h1>
618 </div>
619 <hr />
620 <!-- Start content -->
621 <div id="content">
623 <p>
624 _packages_ packages installed - List generated on : $DATE
625 <p>
627 _EOT_
628 }
630 # xHTML content with packages info.
631 xhtml_pkg_info()
632 {
633 cat >> $XHTML_LIST << _EOT_
634 <h3>$PACKAGE</h3>
635 <pre>
636 Version : $VERSION$EXTRAVERSION
637 Short desc : $SHORT_DESC
638 Web site : <a href="$WEB_SITE">$WEB_SITE</a>
639 </pre>
641 _EOT_
642 }
644 # xHTML packages list footer.
645 xhtml_footer()
646 {
647 cat >> $XHTML_LIST << _EOT_
648 <hr />
649 <p id="footer">
650 $packages packages installed - List generated on : $DATE
651 </p>
653 <!-- End content -->
654 </div>
655 </body>
656 </html>
657 _EOT_
658 }
660 # Search pattern in installed packages.
661 search_in_installed_packages()
662 {
663 echo "Installed packages"
664 echo "================================================================================"
665 list=`ls -1 $INSTALLED | grep -i "$PATTERN"`
666 for pkg in $list
667 do
668 EXTRAVERSION=""
669 [ -f $INSTALLED/$pkg/receipt ] || continue
670 . $INSTALLED/$pkg/receipt
671 echo -n "$PACKAGE "
672 echo -en "\033[24G $VERSION$EXTRAVERSION"
673 echo -e "\033[42G $CATEGORY"
674 packages=$(($packages+1))
675 done
676 # Set correct ending messages.
677 if [ "$packages" = "" ]; then
678 echo "0 installed packages found for : $PATTERN"
679 echo ""
680 else
681 echo "================================================================================"
682 echo "$packages installed package(s) found for : $PATTERN"
683 echo ""
684 fi
685 }
687 # Search in packages.list for available pkgs.
688 search_in_packages_list()
689 {
690 echo "Available packages name-version"
691 echo "================================================================================"
692 packages=0
693 for i in $LOCALSTATE/packages.list $LOCALSTATE/undigest/*/packages.list; do
694 grep -is "$PATTERN" $i
695 packages=$(($packages + `grep -is "$PATTERN" $i | wc -l`))
696 done
697 if [ ! -f "$LOCALSTATE/packages.list" ]; then
698 echo -e "
699 No 'packages.list' found to check for mirrored packages. For more results,
700 please run 'tazpkg recharge' once as root before searching.\n"
701 fi
702 if [ "$packages" = "0" ]; then
703 echo "0 available packages found for : $PATTERN"
704 echo ""
705 else
706 echo "================================================================================"
707 echo "$packages available package(s) found for : $PATTERN"
708 echo ""
709 fi
710 }
712 # search --mirror: Search in packages.txt for available pkgs and give more
713 # info than --list or default.
714 search_in_packages_txt()
715 {
716 echo "Matching packages name with version and desc"
717 echo "================================================================================"
718 packages=0
719 for i in $LOCALSTATE/packages.txt $LOCALSTATE/undigest/*/packages.txt; do
720 grep -is -A 2 "^$PATTERN" $i
721 packages=$(($packages + `grep -is "^$PATTERN" $i | wc -l`))
722 done
723 if [ ! -f "$LOCALSTATE/packages.txt" ]; then
724 echo -e "
725 No 'packages.txt' found to check for mirrored packages. For more results,
726 please run 'tazpkg recharge' once as root before searching.\n"
727 fi
728 if [ "$packages" = "0" ]; then
729 echo "0 available packages found for : $PATTERN"
730 echo ""
731 else
732 echo "================================================================================"
733 echo "$packages available package(s) found for : $PATTERN"
734 echo ""
735 fi
736 }
738 # Install package-list from a flavor
739 install_flavor()
740 {
741 check_root
742 FLAVOR=$1
743 ARG=$2
744 mkdir -p $TMP_DIR
745 [ -f $FLAVOR.flavor ] && cp $FLAVOR.flavor $TMP_DIR
746 cd $TMP_DIR
747 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
748 zcat $FLAVOR.flavor | cpio -i 2>/dev/null
749 while read file; do
750 for pkg in $(ls -d $INSTALLED/${file%%-*}*); do
751 [ -f $pkg/receipt ] || continue
752 EXTRAVERSION=""
753 . $pkg/receipt
754 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && break
755 done
756 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && continue
757 cd $CACHE_DIR
758 download $file.tazpkg
759 cd $TMP_DIR
760 tazpkg install $CACHE_DIR/$file.tazpkg --forced
761 done < $FLAVOR.pkglist
762 [ -f $FLAVOR.nonfree ] && while read pkg; do
763 [ -d $INSTALLED/$pkg ] || continue
764 [ -d $INSTALLED/get-$pkg ] && tazpkg get-install get-$pkg
765 get-$pkg
766 done < $FLAVOR.nonfree
767 [ "$ARG" == "--purge" ] && for pkg in $(ls $INSTALLED); do
768 [ -f $INSTALLED/$pkg/receipt ] || continue
769 EXTRAVERSION=""
770 . $INSTALLED/$pkg/receipt
771 grep -q ^$PACKAGE-$VERSION$EXTRAVERSION$ $FLAVOR.pkglist && continue
772 grep -qs ^$PACKAGE$ $FLAVOR.nonfree && continue
773 tazpkg remove $PACKAGE
774 done
775 else
776 echo "Can't find flavor $FLAVOR Abort."
777 fi
778 cd $TOP_DIR
779 rm -rf $TMP_DIR
780 }
782 # Update mirror urls
783 setup_mirror()
784 {
785 # Backup old list.
786 if [ -f "$1/mirror" ]; then
787 cp -f $1/mirror $1/mirror.bak
788 fi
789 echo ""
790 echo -e "\033[1mCurrent mirror(s)\033[0m"
791 echo "================================================================================"
792 echo " `cat $1/mirror 2> /dev/null`"
793 echo "
794 Please enter URL of the new mirror (http, ftp or local path). You must specify
795 the complete address to the directory of the packages and packages.list file."
796 echo ""
797 echo -n "New mirror(s) URL : "
798 NEW_MIRROR_URL=$2
799 if [ -n "$NEW_MIRROR_URL" ]; then
800 echo $NEW_MIRROR_URL
801 else
802 read NEW_MIRROR_URL
803 fi
804 if [ "$NEW_MIRROR_URL" = "" ]; then
805 echo "Nothing has been changed."
806 else
807 echo "Setting mirror(s) to : $NEW_MIRROR_URL"
808 rm -f $1/mirror
809 for i in $NEW_MIRROR_URL; do
810 echo "$i" >> $1/mirror
811 done
812 fi
813 echo ""
814 }
816 # recursive dependancies scan
817 dep_scan()
818 {
819 for i in $1; do
820 case " $ALL_DEPS " in
821 *\ $i\ *) continue;;
822 esac
823 ALL_DEPS="$ALL_DEPS $i"
824 [ -n "$2" ] && echo "$2$i"
825 [ -f $i/receipt ] || continue
826 DEPENDS=""
827 . $i/receipt
828 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
829 done
830 }
832 # recursive reverse dependancies scan
833 rdep_scan()
834 {
835 for i in $1; do
836 case " $ALL_DEPS " in
837 *\ $i\ *) continue;;
838 esac
839 ALL_DEPS="$ALL_DEPS $i"
840 [ -n "$2" ] && echo "$2$i"
841 RDEPENDS=""
842 for j in *; do
843 [ -f $j/receipt ] || continue
844 DEPENDS=""
845 . $j/receipt
846 case " $(echo $DEPENDS) " in
847 *\ $i\ *)
848 RDEPENDS="$RDEPENDS $j";;
849 esac
850 done
851 [ -n "$RDEPENDS" ] && rdep_scan "$RDEPENDS" "$2 "
852 done
853 }
855 ###################
856 # Tazpkg commands #
857 ###################
859 case "$COMMAND" in
860 list)
861 # List all installed packages or a specific category.
862 #
863 if [ "$2" = "blocked" ]; then
864 echo ""
865 echo -e "\033[1mBlocked packages\033[0m"
866 echo "================================================================================"
867 if [ -s "$BLOCKED" ];then
868 cat $BLOCKED
869 echo ""
870 else
871 echo -e "No blocked packages found.\n"
872 fi
873 exit 0
874 fi
875 # Display the list of categories.
876 if [ "$2" = "cat" -o "$2" = "categories" ]; then
877 echo ""
878 echo -e "\033[1mPackages categories :\033[0m"
879 echo "================================================================================"
880 for i in $CATEGORIES
881 do
882 echo $i
883 categories=$(($categories+1))
884 done
885 echo "================================================================================"
886 echo "$categories categories"
887 echo ""
888 exit 0
889 fi
890 # Check for an asked category.
891 if [ -n "$2" ]; then
892 ASKED_CATEGORY=$2
893 echo ""
894 echo -e "\033[1mInstalled packages of category :\033[0m $ASKED_CATEGORY"
895 echo "================================================================================"
896 for pkg in $INSTALLED/*
897 do
898 [ -f $pkg/receipt ] || continue
899 EXTRAVERSION=""
900 . $pkg/receipt
901 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
902 echo -n "$PACKAGE"
903 echo -e "\033[24G $VERSION$EXTRAVERSION"
904 packages=$(($packages+1))
905 fi
906 done
907 echo "================================================================================"
908 echo -e "$packages packages installed of category $ASKED_CATEGORY."
909 echo ""
910 else
911 # By default list all packages and versions.
912 echo ""
913 echo -e "\033[1mList of all installed packages\033[0m"
914 echo "================================================================================"
915 for pkg in $INSTALLED/*
916 do
917 [ -f $pkg/receipt ] || continue
918 EXTRAVERSION=""
919 . $pkg/receipt
920 echo -n "$PACKAGE"
921 echo -en "\033[24G $VERSION$EXTRAVERSION"
922 echo -e "\033[42G $CATEGORY"
923 packages=$(($packages+1))
924 done
925 echo "================================================================================"
926 echo "$packages packages installed."
927 echo ""
928 fi
929 ;;
930 xhtml-list)
931 # Get info in receipts and build list.
932 DATE=`date +%Y-%m-%d\ \%H:%M:%S`
933 if [ -n "$2" ]; then
934 XHTML_LIST=$2
935 else
936 XHTML_LIST=installed-packages.html
937 fi
938 echo ""
939 echo -e "\033[1mCreating xHTML list of installed packages\033[0m"
940 echo "================================================================================"
941 echo -n "Generating xHTML header..."
942 xhtml_header
943 status
944 # Packages
945 echo -n "Creating packages information..."
946 for pkg in $INSTALLED/*
947 do
948 [ -f $pkg/receipt ] || continue
949 EXTRAVERSION=""
950 . $pkg/receipt
951 xhtml_pkg_info
952 packages=$(($packages+1))
953 done
954 status
955 echo -n "Generating xHTML footer..."
956 xhtml_footer
957 status
958 # sed pkgs nb in header.
959 sed -i s/'_packages_'/"$packages"/ $XHTML_LIST
960 echo "================================================================================"
961 echo "$XHTML_LIST created - $packages packages."
962 echo ""
963 ;;
964 list-mirror)
965 # List all available packages on the mirror. Option --diff display
966 # last mirrored packages diff (see recharge).
967 check_for_packages_list
968 case $2 in
969 --diff)
970 if [ -f "$LOCALSTATE/packages.diff" ]; then
971 echo ""
972 echo -e "\033[1mMirrored packages diff\033[0m"
973 echo "================================================================================"
974 cat $LOCALSTATE/packages.diff
975 echo "================================================================================"
976 pkgs=`cat $LOCALSTATE/packages.diff | wc -l`
977 echo "$pkgs new packages listed on the mirror."
978 echo ""
979 else
980 echo -e "\nUnable to list anything, no packages.diff found."
981 echo -e "Recharge your current list to create a first diff.\n"
982 fi && exit 0 ;;
983 --text|--txt)
984 echo ""
985 echo -e "\033[1mList of available packages on the mirror\033[0m"
986 echo "================================================================================"
987 cat $LOCALSTATE/packages.txt ;;
988 --raw|*)
989 echo ""
990 echo -e "\033[1mList of available packages on the mirror\033[0m"
991 echo "================================================================================"
992 cat $LOCALSTATE/packages.list ;;
993 esac
994 echo "================================================================================"
995 pkgs=`cat $LOCALSTATE/packages.list | wc -l`
996 echo "$pkgs packages in the last recharged list."
997 echo ""
998 ;;
999 list-files)
1000 # List files installed with the package.
1002 check_for_package_on_cmdline
1003 check_for_receipt
1004 echo ""
1005 echo -e "\033[1mInstalled files with :\033[0m $PACKAGE"
1006 echo "================================================================================"
1007 cat $INSTALLED/$PACKAGE/files.list | sort
1008 echo "================================================================================"
1009 files=`cat $INSTALLED/$PACKAGE/files.list | wc -l`
1010 echo "$files files installed with $PACKAGE."
1011 echo ""
1012 ;;
1013 info)
1014 # Information about package.
1016 check_for_package_on_cmdline
1017 check_for_receipt
1018 EXTRAVERSION=""
1019 . $INSTALLED/$PACKAGE/receipt
1020 echo ""
1021 echo -e "\033[1mTazpkg information\033[0m
1022 ================================================================================
1023 Package : $PACKAGE
1024 Version : $VERSION$EXTRAVERSION
1025 Category : $CATEGORY
1026 Short desc : $SHORT_DESC
1027 Maintainer : $MAINTAINER"
1028 if [ ! "$DEPENDS" = "" ]; then
1029 echo -e "Depends : $DEPENDS"
1030 fi
1031 if [ ! "$SUGGESTED" = "" ]; then
1032 echo -e "Suggested : $SUGGESTED"
1033 fi
1034 if [ ! "$BUILD_DEPENDS" = "" ]; then
1035 echo -e "Build deps : $BUILD_DEPENDS"
1036 fi
1037 if [ ! "$WANTED" = "" ]; then
1038 echo -e "Wanted src : $WANTED"
1039 fi
1040 if [ ! "$WEB_SITE" = "" ]; then
1041 echo -e "Web site : $WEB_SITE"
1042 fi
1043 echo "================================================================================"
1044 echo ""
1045 ;;
1046 desc)
1047 # Display package description.txt if available.
1048 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
1049 echo ""
1050 echo -e "\033[1mDescription of :\033[0m $PACKAGE"
1051 echo "================================================================================"
1052 cat $INSTALLED/$PACKAGE/description.txt
1053 echo "================================================================================"
1054 echo ""
1055 else
1056 echo -e "\nSorry, no description available for this package.\n"
1057 fi
1058 ;;
1059 search)
1060 # Search for a package by pattern or name.
1062 PATTERN="$2"
1063 if [ -z "$PATTERN" ]; then
1064 echo -e "\nPlease specify a pattern or package name to search for."
1065 echo -e "Example : 'tazpkg search paint'.\n"
1066 exit 0
1067 fi
1068 echo ""
1069 echo -e "\033[1mSearch result for :\033[0m $PATTERN"
1070 echo ""
1071 # Default is to search in installed pkgs and the raw list.
1072 case $3 in
1073 -i|--installed)
1074 search_in_installed_packages ;;
1075 -l|--list)
1076 search_in_packages_list ;;
1077 -m|--mirror)
1078 search_in_packages_txt ;;
1079 *)
1080 search_in_installed_packages
1081 search_in_packages_list ;;
1082 esac
1083 ;;
1084 search-file)
1085 # Search for a file by pattern or name in all files.list.
1087 if [ -z "$2" ]; then
1088 echo -e "\nPlease specify a pattern or file name to search for."
1089 echo -e "Example : 'tazpkg search-file libnss'. \n"
1090 exit 0
1091 fi
1092 echo ""
1093 echo -e "\033[1mSearch result for file :\033[0m $2"
1094 echo "================================================================================"
1096 if [ "$3" == "--mirror" ]; then
1098 match=0
1099 for i in $LOCALSTATE/files.list.lzma \
1100 $LOCALSTATE/undigest/*/files.list.lzma; do
1101 [ -f $i ] || continue
1102 unlzma -c $i | grep -- ".*:.*$2" | awk '
1103 BEGIN { last="" }
1105 pkg=substr($0,0,index($0,":")-1);
1106 file=substr($0,index($0,":")+2);
1107 if (last != pkg) {
1108 last = pkg;
1109 printf("\n%c[1mPackage %s :%c[0m\n",27,pkg,27);
1111 printf("%s\n",file);
1112 }'
1113 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | wc -l`))
1114 done
1116 else
1118 # Check all pkg files.list in search match with specify the package
1119 # name and the full path to the file(s).
1120 for pkg in $INSTALLED/*
1121 do
1122 if grep -qs "$2" $pkg/files.list; then
1123 . $pkg/receipt
1124 echo ""
1125 echo -e "\033[1mPackage $PACKAGE :\033[0m"
1126 grep "$2" $pkg/files.list
1127 files=`grep $2 $pkg/files.list | wc -l`
1128 match=$(($match+$files))
1129 fi
1130 done
1132 fi
1134 if [ "$match" = "" ]; then
1135 echo "0 file found for : $2"
1136 echo ""
1137 else
1138 echo ""
1139 echo "================================================================================"
1140 echo "$match file(s) found for : $2"
1141 echo ""
1142 fi
1143 ;;
1144 install)
1145 # Install .tazpkg packages.
1147 check_root
1148 check_for_package_on_cmdline
1149 check_for_package_file
1150 # Check if forced install.
1151 DO_CHECK="yes"
1152 ROOT=""
1153 while [ -n "$3" ]; do
1154 case "$3" in
1155 --forced)
1156 DO_CHECK="no"
1157 ;;
1158 --root=*)
1159 ROOT="${3#--root=}"
1160 ;;
1161 --list=*)
1162 INSTALL_LIST="${3#--list=}"
1163 ;;
1164 *) shift 2
1165 echo -e "\nUnknown option $*.\n"
1166 exit 1
1167 ;;
1168 esac
1169 shift
1170 done
1171 if [ "$DO_CHECK" = "yes" ]; then
1172 check_for_installed_package $ROOT
1173 fi
1174 install_package $ROOT
1175 ;;
1176 install-list|get-install-list)
1177 # Install a set of packages from a list.
1179 check_root
1180 if [ -z "$2" ]; then
1181 echo -e "
1182 Please change directory (cd) to the packages repository, and specify the
1183 list of packages to install. Example : tazpkg install-list packages.list\n"
1184 exit 0
1185 fi
1186 # Check if the packages list exist.
1187 if [ ! -f "$2" ]; then
1188 echo "Unable to find : $2"
1189 exit 0
1190 else
1191 LIST=`cat $2`
1192 fi
1194 # Remember processed list
1195 export INSTALL_LIST="$2"
1197 # Set $COMMAND and install all packages.
1198 if [ "$1" = "get-install-list" ]; then
1199 COMMAND=get-install
1200 else
1201 COMMAND=install
1202 fi
1203 touch $2-processed
1204 for pkg in $LIST
1205 do
1206 grep -qs ^$pkg$ $2-processed && continue
1207 tazpkg $COMMAND $pkg --list=$2 "$3" "$4" "$5"
1208 done
1209 rm -f $2-processed
1210 ;;
1211 add-flavor)
1212 # Install a set of packages from a flavor.
1214 install_flavor $2
1215 ;;
1216 install-flavor)
1217 # Install a set of packages from a flavor and purge other ones.
1219 install_flavor $2 --purge
1220 ;;
1221 set-release)
1222 # Change curent release and upgrade packages.
1224 RELEASE=$2
1225 if [ -z "$RELEASE" ]; then
1226 echo -e "\nPlease specify the release you want on the command line."
1227 echo -e "Example: tazpkg set-release cooking\n"
1228 exit 0
1229 fi
1230 rm /var/lib/tazpkg/mirror
1231 echo "$RELEASE" > /etc/slitaz-release
1232 tazpkg recharge && tazpkg upgrade
1234 # Install missing depends
1235 cd $INSTALLED
1236 for i in * ; do
1237 DEPENDS=""
1238 . $i/receipt
1239 for j in $DEPENDS ; do
1240 [ -d $j ] || tazpkg get-install $j
1241 done
1242 done
1243 ;;
1244 remove)
1245 # Remove packages.
1247 check_root
1248 check_for_package_on_cmdline
1249 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
1250 echo -e "\n$PACKAGE is not installed.\n"
1251 exit 0
1252 else
1253 ALTERED=""
1254 THE_PACKAGE=$PACKAGE # altered by receipt
1255 for i in $(cd $INSTALLED ; ls); do
1256 [ -f $INSTALLED/$i/receipt ] || continue
1257 DEPENDS=""
1258 . $INSTALLED/$i/receipt
1259 case " $(echo $DEPENDS) " in
1260 *\ $THE_PACKAGE\ *) ALTERED="$ALTERED $i";;
1261 esac
1262 done
1263 EXTRAVERSION=""
1264 . $INSTALLED/$THE_PACKAGE/receipt
1265 fi
1266 echo ""
1267 if [ -n "$ALTERED" ]; then
1268 echo "The following packages depend on $PACKAGE :"
1269 for i in $ALTERED; do
1270 echo " $i"
1271 done
1272 fi
1273 REFRESH=$(cd $INSTALLED ; grep -sl ^$PACKAGE$ */modifiers)
1274 if [ -n "$REFRESH" ]; then
1275 echo "The following packages have been modified by $PACKAGE :"
1276 for i in $REFRESH; do
1277 echo " ${i%/modifiers}"
1278 done
1279 fi
1280 echo "Remove $PACKAGE ($VERSION$EXTRAVERSION) ?"
1281 echo -n "Please confirm uninstallation (y/N) : "; read anser
1282 if [ "$anser" = "y" ]; then
1283 echo ""
1284 echo -e "\033[1mRemoving :\033[0m $PACKAGE"
1285 echo "================================================================================"
1286 # Pre remove commands.
1287 if grep -q ^pre_remove $INSTALLED/$PACKAGE/receipt; then
1288 pre_remove
1289 fi
1290 echo -n "Removing all files installed..."
1291 for file in `cat $INSTALLED/$PACKAGE/files.list`
1292 do
1293 [ $(grep ^$file$ $INSTALLED/*/files.list | wc -l) -gt 1 ] && continue
1294 rm -f $file 2>/dev/null
1295 dir="$file"
1296 while [ "$dir" != "/" ]; do
1297 dir="$(dirname $dir)"
1298 rmdir $dir 2> /dev/null || break
1299 done
1300 done
1301 status
1302 if grep -q ^post_remove $INSTALLED/$PACKAGE/receipt; then
1303 post_remove
1304 fi
1305 # Remove package receipt.
1306 echo -n "Removing package receipt..."
1307 rm -rf $INSTALLED/$PACKAGE
1308 status
1309 # Log this activity
1310 log Removed
1311 if [ -n "$ALTERED" ]; then
1312 echo -n "Remove packages depending on $PACKAGE"
1313 echo -n " (y/N) ? "; read anser
1314 if [ "$anser" = "y" ]; then
1315 for i in $ALTERED; do
1316 if [ -d "$INSTALLED/$i" ]; then
1317 tazpkg remove $i
1318 fi
1319 done
1320 fi
1321 fi
1322 if [ -n "$REFRESH" ]; then
1323 echo -n "Reinstall packages modified by $PACKAGE"
1324 echo -n " (y/N) ? "; read anser
1325 if [ "$anser" = "y" ]; then
1326 for i in $REFRESH; do
1327 if [ $(wc -l < $INSTALLED/$i) -gt 1 ]; then
1328 echo "Check $INSTALLED/$i for reinstallation"
1329 continue
1330 fi
1331 rm -r $INSTALLED/$i
1332 tazpkg get-install ${i%/modifiers} --forced
1333 done
1334 fi
1335 fi
1336 else
1337 echo ""
1338 echo "Uninstallation of $PACKAGE cancelled."
1339 fi
1340 echo ""
1341 ;;
1342 extract)
1343 # Extract .tazpkg cpio archive into a directory.
1345 check_for_package_on_cmdline
1346 check_for_package_file
1347 echo ""
1348 echo -e "\033[1mExtracting :\033[0m $PACKAGE"
1349 echo "================================================================================"
1350 # If no directory destination is found on the cmdline
1351 # we create one in the current dir using the package name.
1352 if [ -n "$TARGET_DIR" ]; then
1353 DESTDIR=$TARGET_DIR/$PACKAGE
1354 else
1355 DESTDIR=$PACKAGE
1356 fi
1357 mkdir -p $DESTDIR
1358 echo -n "Copying original package..."
1359 cp $PACKAGE_FILE $DESTDIR
1360 status
1361 cd $DESTDIR
1362 extract_package
1363 echo "================================================================================"
1364 echo "$PACKAGE is extracted to : $DESTDIR"
1365 echo ""
1366 ;;
1367 list-config)
1368 # List configuration files installed.
1370 if [ "$2" = "--box" ]; then
1371 mkdir -p $TMP_DIR && cd $TMP_DIR
1372 FILES="$INSTALLED/*/volatile.cpio.gz"
1373 [ -n "$3" ] && FILES="$INSTALLED/$3/volatile.cpio.gz"
1374 for i in $FILES; do
1375 zcat $i | cpio -id > /dev/null
1376 find * -type f 2>/dev/null | while read file; do
1377 if [ ! -e /$file ]; then
1378 echo -n "|--|--|--|File lost"
1379 else
1380 echo -n "$(stat -c "%A|%U|%G|%s|" /$file)"
1381 cmp $file /$file > /dev/null 2>&1 || \
1382 echo -n "$(stat -c "%.16y" /$file)"
1383 fi
1384 echo "|/$file"
1385 done
1386 rm -rf *
1387 done
1388 cd $TOP_DIR
1389 rm -rf $TMP_DIR
1390 else
1391 echo ""
1392 echo -e "\033[1mConfiguration files"
1393 echo "================================================================================"
1394 for i in $INSTALLED/*/volatile.cpio.gz; do
1395 [ -n "$2" -a "$i" != "$INSTALLED/$2/volatile.cpio.gz" ] && continue
1396 [ -f "$i" ] || continue
1397 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1398 done | sed 's|^|/|' | sort
1399 echo "================================================================================"
1400 echo ""
1401 fi
1402 ;;
1403 repack-config)
1404 # Create SliTaz package archive from configuration files.
1406 mkdir -p $TMP_DIR && cd $TMP_DIR
1407 CONFIG_VERSION=1.0
1408 mkdir config-$CONFIG_VERSION
1409 cd config-$CONFIG_VERSION
1410 for i in $INSTALLED/*/volatile.cpio.gz; do
1411 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1412 done > files.list
1413 mkdir fs
1414 cd fs
1415 ( cd / ; cpio -o -H newc ) < ../files.list | cpio -id > /dev/null
1416 mkdir -p etc/tazlito
1417 for i in $INSTALLED/*/receipt; do
1418 EXTRAVERSION=""
1419 . $i
1420 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1421 done > etc/tazlito/config-packages.list
1422 cd ..
1423 echo "etc/tazlito/config-packages.list" >> files.list
1424 cat > receipt <<EOT
1425 # SliTaz package receipt.
1427 PACKAGE="config"
1428 VERSION="$CONFIG_VERSION"
1429 CATEGORY="base-system"
1430 SHORT_DESC="User configuration backup on $(date)"
1431 DEPENDS="$(ls $INSTALLED)"
1432 EOT
1433 cd ..
1434 tazpkg pack config-$CONFIG_VERSION
1435 cp config-$CONFIG_VERSION.tazpkg $TOP_DIR
1436 cd $TOP_DIR
1437 rm -rf $TMP_DIR
1438 ;;
1439 repack)
1440 # Create SliTaz package archive from an installed package.
1442 check_for_package_on_cmdline
1443 check_for_receipt
1444 EXTRAVERSION=""
1445 . $INSTALLED/$PACKAGE/receipt
1446 echo ""
1447 echo -e "\033[1mRepacking :\033[0m $PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
1448 echo "================================================================================"
1449 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
1450 echo "Can't repack $PACKAGE"
1451 exit 1
1452 fi
1453 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
1454 echo "Can't repack, $PACKAGE files have been modified by:"
1455 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
1456 echo " $i"
1457 done
1458 exit 1
1459 fi
1460 MISSING=""
1461 while read i; do
1462 [ -e "$i" ] && continue
1463 [ -L "$i" ] || MISSING="$MISSING\n $i"
1464 done < $INSTALLED/$PACKAGE/files.list
1465 if [ -n "$MISSING" ]; then
1466 echo -n "Can't repack, the following files are lost:"
1467 echo -e "$MISSING"
1468 exit 1
1469 fi
1470 mkdir -p $TMP_DIR && cd $TMP_DIR
1471 FILES="fs.cpio.gz\n"
1472 for i in $(ls $INSTALLED/$PACKAGE) ; do
1473 [ "$i" = "volatile.cpio.gz" ] && continue
1474 [ "$i" = "modifiers" ] && continue
1475 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
1476 done
1477 ln -s / rootfs
1478 mkdir tmp
1479 sed 's/^/rootfs/' < files.list | cpio -o -H newc 2>/dev/null |\
1480 ( cd tmp ; cpio -id 2>/dev/null )
1481 mv tmp/rootfs fs
1482 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
1483 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
1484 ( cd fs; cpio -id )
1485 fi
1486 if grep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
1487 . $INSTALLED/$PACKAGE/receipt
1488 repack_cleanup fs
1489 fi
1490 if [ -f $INSTALLED/$PACKAGE/md5sum ]; then
1491 sed 's, , fs,' < $INSTALLED/$PACKAGE/md5sum | \
1492 md5sum -s -c || {
1493 echo "Can't repack, md5sum error."
1494 cd $TOP_DIR
1495 rm -rf $TMP_DIR
1496 exit 1
1498 fi
1499 find fs | cpio -o -H newc 2> /dev/null | gzip -9 > fs.cpio.gz
1500 echo -e "$FILES" | cpio -o -H newc 2> /dev/null > \
1501 $TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg
1502 cd $TOP_DIR
1503 \rm -R $TMP_DIR
1504 echo "Package $PACKAGE repacked successfully."
1505 echo "Size : `du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg`"
1506 echo ""
1507 ;;
1508 pack)
1509 # Create SliTaz package archive using cpio and gzip.
1511 check_for_package_on_cmdline
1512 cd $PACKAGE
1513 if [ ! -f "receipt" ]; then
1514 echo "Receipt is missing. Please read the documentation."
1515 exit 0
1516 else
1517 echo ""
1518 echo -e "\033[1mPacking :\033[0m $PACKAGE"
1519 echo "================================================================================"
1520 # Create files.list with redirecting find outpout.
1521 echo -n "Creating the list of files..." && cd fs
1522 find . -type f -print > ../files.list
1523 find . -type l -print >> ../files.list
1524 cd .. && sed -i s/'^.'/''/ files.list
1525 status
1526 echo -n "Creating md5sum of files..."
1527 while read file; do
1528 [ -L "fs$file" ] && continue
1529 [ -f "fs$file" ] || continue
1530 case "$file" in
1531 /lib/modules/*/modules.*|*.pyc) continue;;
1532 esac
1533 md5sum "fs$file" | sed 's/ fs/ /'
1534 done < files.list > md5sum
1535 status
1536 UNPACKED_SIZE=$(du -chs fs receipt files.list md5sum \
1537 description.txt 2> /dev/null | awk \
1538 '{ sz=$1 } END { print sz }')
1539 # Build cpio archives.
1540 echo -n "Compressing the fs... "
1541 find fs -print | cpio -o -H newc | gzip > fs.cpio.gz
1542 rm -rf fs
1543 status
1544 PACKED_SIZE=$(du -chs fs.cpio.gz receipt files.list \
1545 md5sum description.txt 2> /dev/null | awk \
1546 '{ sz=$1 } END { print sz }')
1547 echo -n "Undating receipt sizes..."
1548 sed -i s/^PACKED_SIZE.*$// receipt
1549 sed -i s/^UNPACKED_SIZE.*$// receipt
1550 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
1551 status
1552 echo -n "Creating full cpio archive... "
1553 find . -print | cpio -o -H newc > ../$PACKAGE.tazpkg
1554 status
1555 echo -n "Restoring original package tree... "
1556 zcat fs.cpio.gz | cpio -id
1557 status
1558 rm fs.cpio.gz && cd ..
1559 echo "================================================================================"
1560 echo "Package $PACKAGE compressed successfully."
1561 echo "Size : `du -sh $PACKAGE.tazpkg`"
1562 echo ""
1563 fi
1564 ;;
1565 recharge)
1566 # Recharge packages.list from a mirror.
1568 check_root
1569 for path in $LOCALSTATE $LOCALSTATE/undigest/*; do
1570 [ -f $path/mirror ] || continue
1571 echo ""
1572 if [ "$path" != "$LOCALSTATE" ]; then
1573 echo "Recharge undigest $(basename $path):"
1574 fi
1575 cd $path
1576 if [ -f "packages.list" ]; then
1577 echo -n "Creating backup of the last packages list..."
1578 mv -f packages.desc packages.desc.bak 2>/dev/null
1579 mv -f packages.md5 packages.md5.txt 2>/dev/null
1580 mv -f packages.txt packages.txt.bak 2>/dev/null
1581 mv -f packages.list packages.list.bak 2>/dev/null
1582 mv -f packages.equiv packages.equiv.bak 2>/dev/null
1583 mv -f files.list.lzma files.list.lzma.bak 2> /dev/nul
1584 status
1585 fi
1586 download_from "$(cat mirror)" packages.desc
1587 download_from "$(cat mirror)" packages.md5
1588 download_from "$(cat mirror)" packages.txt
1589 download_from "$(cat mirror)" packages.list
1590 download_from "$(cat mirror)" packages.equiv
1591 download_from "$(cat mirror)" files.list.lzma
1592 download_from "$(cat mirror)" mirrors
1593 suffix=$(head -1 mirror)
1594 suffix=packages${suffix#*/packages}
1595 for i in $(cat mirrors 2> /dev/null); do
1596 grep -qs $i mirror || echo $i$suffix >> mirror
1597 done
1598 if [ -f "packages.list.bak" ]; then
1599 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
1600 sed -i s/+// packages.diff
1601 echo ""
1602 echo -e "\033[1mMirrored packages diff\033[0m"
1603 echo "================================================================================"
1604 cat packages.diff
1605 if [ ! "`cat packages.diff | wc -l`" = 0 ]; then
1606 echo "================================================================================"
1607 echo "`cat packages.diff | wc -l` new packages on the mirror."
1608 echo ""
1609 else
1610 echo "`cat packages.diff | wc -l` new packages on the mirror."
1611 echo ""
1612 fi
1613 else
1614 echo -e "
1615 ================================================================================
1616 Last packages.list is ready to use. Note that next time you recharge the list,
1617 a list of differencies will be displayed to show new and upgradeable packages.\n"
1618 fi
1619 done
1620 ;;
1621 upgrade)
1622 # Upgrade all installed packages with the new version from the mirror.
1624 check_root
1625 check_for_packages_list
1626 cd $LOCALSTATE
1627 # Touch the blocked pkgs list to avoid errors and remove any old
1628 # upgrade list.
1629 touch blocked-packages.list
1630 rm -f upgradeable-packages.list
1631 echo ""
1632 echo -e "\033[1mAvailable upgrades\033[0m"
1633 echo "================================================================================"
1634 echo ""
1635 # Some packages must be installed first
1636 FIRST_CLASS_PACKAGE=" glibc-base slitaz-base-files slitaz-boot-scripts "
1637 for pkg in $INSTALLED/*
1638 do
1639 [ -f $pkg/receipt ] || continue
1640 EXTRAVERSION=""
1641 . $pkg/receipt
1642 # Display package name to show that Tazpkg is working...
1643 echo -en "\\033[0G "
1644 echo -en "\\033[0G$PACKAGE"
1645 # Skip specified pkgs listed in $LOCALSTATE/blocked-packages.list
1646 if grep -qs "^$PACKAGE" $BLOCKED; then
1647 blocked=$(($blocked+1))
1648 else
1649 # Check if the installed package is in the current list (other
1650 # mirror or local).
1651 NEW_PACKAGE=$(get_package_filename $PACKAGE)
1653 if [ -n "$NEW_PACKAGE" ]; then
1654 # Set new pkg and version for futur comparaison
1655 NEW_VERSION=`echo $NEW_PACKAGE | sed s/$PACKAGE-/''/`
1656 # Change '-' and 'pre' to points.
1657 NEW_VERSION=`echo $NEW_VERSION | sed s/'-'/'.'/`
1658 VERSION=`echo $VERSION | sed s/'-'/'.'/`$EXTRAVERSION
1659 NEW_VERSION=`echo $NEW_VERSION | sed s/'pre'/'.'/`
1660 VERSION=`echo $VERSION | sed s/'pre'/'.'/`
1661 NEW_VERSION=`echo $NEW_VERSION | sed 's/[A-Z]\.//'`
1662 VERSION=`echo $VERSION | sed 's/[A-Z]\.//'`
1663 # Compare version. Upgrade are only available for official
1664 # packages, so we control de mirror and it should be ok if
1665 # we just check for egality.
1666 RELEASE=""
1667 if [ -f installed.md5 -a -f packages.md5 ]; then
1668 current_md5=$(grep -s " $PACKAGE-$VERSION" installed.md5 | awk '{ print $1 }')
1669 new_md5=$(grep -hs " $PACKAGE-$VERSION" packages.md5 undigest/*/packages.md5 | head -1 | awk '{ print $1 }')
1670 [ -n "$current_md5" ] && [ -n "$new_md5" ] &&
1671 [ "$current_md5" != "$new_md5" ] && RELEASE=build
1672 fi
1673 if [ "$VERSION" != "$NEW_VERSION" -o -n "$RELEASE" ]; then
1674 # Version seems different. Check for major, minor or
1675 # revision
1676 PKG_MAJOR=`echo ${VERSION%_*} | cut -f1 -d"."`
1677 NEW_MAJOR=`echo ${NEW_VERSION%_*} | cut -f1 -d"."`
1678 PKG_MINOR=`echo ${VERSION%_*} | cut -f2 -d"."`
1679 NEW_MINOR=`echo ${NEW_VERSION%_*} | cut -f2 -d"."`
1680 # Minor
1681 if [ "$NEW_MINOR" -gt "$PKG_MINOR" ] 2> /dev/null; then
1682 RELEASE=minor
1683 fi
1684 if [ "$NEW_MINOR" -lt "$PKG_MINOR" ] 2> /dev/null; then
1685 RELEASE=$WARNING
1686 FIXE=yes
1687 fi
1688 # Major
1689 if [ "$NEW_MAJOR" -gt "$PKG_MAJOR" ] 2> /dev/null; then
1690 RELEASE=major
1691 FIXE=""
1692 fi
1693 if [ "$NEW_MAJOR" -lt "$PKG_MAJOR" ] 2> /dev/null; then
1694 RELEASE=$WARNING
1695 FIXE=yes
1696 fi
1697 # Default to revision.
1698 if [ -z $RELEASE ]; then
1699 RELEASE=revision
1700 fi
1701 # Pkg name is already displayed by the check process.
1702 echo -en "\033[24G $VERSION"
1703 echo -en "\033[38G --->"
1704 echo -en "\033[43G $NEW_VERSION"
1705 echo -en "\033[58G $CATEGORY"
1706 echo -e "\033[72G $RELEASE"
1707 up=$(($up+1))
1708 echo "$PACKAGE" >> upgradeable-packages.list
1709 case "$FIRST_CLASS_PACKAGE" in
1710 *\ $PACKAGE\ *) echo "$PACKAGE" >> upgradeable-packages.list$$;;
1711 esac
1712 unset RELEASE
1713 fi
1714 packages=$(($packages+1))
1715 fi
1716 fi
1717 done
1718 if [ -z $blocked ]; then
1719 blocked=0
1720 fi
1721 # Clean last checked package and display summary.
1722 if [ ! "$up" = "" ]; then
1723 echo -e "\\033[0G "
1724 echo "================================================================================"
1725 echo "$packages installed and listed packages to consider, $up to upgrade, $blocked blocked."
1726 echo ""
1727 else
1728 echo -e "\\033[0GSystem is up-to-date. "
1729 echo ""
1730 echo "================================================================================"
1731 echo "$packages installed and listed packages to consider, 0 to upgrade, $blocked blocked."
1732 echo ""
1733 exit 0
1734 fi
1735 # What to do if major or minor version is smaller.
1736 if [ "$FIXE" == "yes" ]; then
1737 echo -e "$WARNING ---> Installed package seems more recent than the mirrored one."
1738 echo "You can block packages using the command : 'tazpkg block package'"
1739 echo "Or upgrade package at you own risks."
1740 echo ""
1741 fi
1742 # Ask for upgrade, it can be done another time.
1743 echo -n "Upgrade now (y/N) ? "; read anser
1744 if [ ! "$anser" = "y" ]; then
1745 echo -e "\nExiting. No package upgraded.\n"
1746 exit 0
1747 fi
1748 # If anser is yes (y). Install all new versions.
1749 cat upgradeable-packages.list >> upgradeable-packages.list$$
1750 mv -f upgradeable-packages.list$$ upgradeable-packages.list
1751 yes y | tazpkg get-install-list upgradeable-packages.list --forced
1752 rm -f upgradeable-packages.list
1753 ;;
1754 bugs)
1755 # Show known bugs in package(s)
1757 cd $INSTALLED
1758 shift
1759 LIST=$@
1760 [ -n "$LIST" ] || LIST=`ls`
1761 MSG="No known bugs."
1762 for PACKAGE in $LIST; do
1763 BUGS=""
1764 EXTRAVERSION=""
1765 . $PACKAGE/receipt
1766 if [ -n "$BUGS" ]; then
1767 MSG="
1768 Bug list completed"
1769 cat <<EOT
1771 Bugs in package $PACKAGE version $VERSION$EXTRAVERSION:
1772 $BUGS
1773 EOT
1774 fi
1775 done
1776 echo "$MSG"
1777 ;;
1778 check)
1779 # Check installed packages set.
1781 check_root
1782 cd $INSTALLED
1783 for PACKAGE in `ls`; do
1784 if [ ! -f $PACKAGE/receipt ]; then
1785 echo "The package $PACKAGE installation is not completed"
1786 continue
1787 fi
1788 DEPENDS=""
1789 EXTRAVERSION=""
1790 . $PACKAGE/receipt
1791 if [ -s $PACKAGE/modifiers ]; then
1792 echo "The package $PACKAGE $VERSION$EXTRAVERSION has been modified by :"
1793 for i in $(cat $PACKAGE/modifiers); do
1794 echo " $i"
1795 done
1796 fi
1797 MSG="Files lost from $PACKAGE $VERSION$EXTRAVERSION :\n"
1798 while read file; do
1799 [ -e "$file" ] && continue
1800 if [ -L "$file" ]; then
1801 MSG="$MSG target of symlink"
1802 fi
1803 echo -e "$MSG $file"
1804 MSG=""
1805 done < $PACKAGE/files.list
1806 MSG="Missing dependencies for $PACKAGE $VERSION$EXTRAVERSION :\n"
1807 for i in $DEPENDS; do
1808 [ -d $i ] && continue
1809 echo -e "$MSG $i"
1810 MSG=""
1811 done
1812 MSG="Dependencies loop between $PACKAGE and :\n"
1813 ALL_DEPS=""
1814 check_for_deps_loop $PACKAGE $DEPENDS
1815 done
1816 echo -n "Looking for known bugs... "
1817 tazpkg bugs
1818 if [ "$PACKAGE_FILE" = "--full" ]; then
1819 for file in */md5sum; do
1820 CONFIG_FILES=""
1821 . $(dirname "$file")/receipt
1822 [ -s "$file" ] || continue
1823 while read md5 f; do
1824 [ -f $f ] || continue
1825 for i in $CONFIG_FILES; do
1826 case "$f" in
1827 $i|$i/*) continue 2;;
1828 esac
1829 done
1830 echo "$md5 $f"
1831 done < "$file" | md5sum -c - 2> /dev/null | \
1832 grep -v OK$ | sed 's/FAILED$/MD5SUM MISMATCH/'
1833 done
1834 FILES=" "
1835 for file in $(cat */files.list); do
1836 [ -d "$file" ] && continue
1837 case "$FILES" in *\ $file\ *) continue;; esac
1838 [ $(grep "^$file$" */files.list 2> /dev/null | \
1839 wc -l) -gt 1 ] || continue
1840 FILES="$FILES$file "
1841 echo "The following packages provide $file :"
1842 grep -l "^$file$" */files.list | while read f
1843 do
1844 pkg=${f%/files.list}
1845 echo -n " $pkg"
1846 if [ -f $pkg/modifiers ]; then
1847 echo -n " (overridden by $(echo "$(cat $pkg/modifiers)"))"
1848 fi
1849 echo ""
1850 done
1851 done
1852 MSG="No package has installed the following files:\n"
1853 find /etc /bin /sbin /lib /usr /var/www \
1854 -not -type d 2> /dev/null | while read file; do
1855 case "$file" in *\[*) continue;; esac
1856 grep -q "^$file$" */files.list && continue
1857 echo -e "$MSG $file"
1858 MSG=""
1859 done
1860 fi
1861 echo "Check completed."
1862 ;;
1863 block)
1864 # Add a pkg name to the list of blocked packages.
1866 check_root
1867 check_for_package_on_cmdline
1868 echo ""
1869 if grep -qs "^$PACKAGE" $BLOCKED; then
1870 echo "$PACKAGE is already in the blocked packages list."
1871 echo ""
1872 exit 0
1873 else
1874 echo -n "Add $PACKAGE to : $BLOCKED..."
1875 echo $PACKAGE >> $BLOCKED
1876 status
1877 # Log this activity
1878 . $INSTALLED/$PACKAGE/receipt
1879 log Blocked
1880 fi
1881 echo ""
1882 ;;
1883 unblock)
1884 # Remove a pkg name from the list of blocked packages.
1886 check_root
1887 check_for_package_on_cmdline
1888 echo ""
1889 if grep -qs "^$PACKAGE" $BLOCKED; then
1890 echo -n "Removing $PACKAGE from : $BLOCKED..."
1891 sed -i s/$PACKAGE/''/ $BLOCKED
1892 sed -i '/^$/d' $BLOCKED
1893 status
1894 # Log this activity
1895 . $INSTALLED/$PACKAGE/receipt
1896 log Unblocked
1897 else
1898 echo "$PACKAGE is not in the blocked packages list."
1899 echo ""
1900 exit 0
1901 fi
1902 echo ""
1903 ;;
1904 get)
1905 # Downlowd a package with wget.
1907 check_for_package_on_cmdline
1908 check_for_packages_list
1909 check_for_package_in_list
1910 echo ""
1911 download $PACKAGE.tazpkg
1912 echo ""
1913 ;;
1914 get-install)
1915 # Download and install a package.
1917 check_root
1918 check_for_package_on_cmdline
1919 check_for_packages_list
1920 DO_CHECK=""
1921 while [ -n "$3" ]; do
1922 case "$3" in
1923 --forced)
1924 DO_CHECK="no"
1925 ;;
1926 --root=*)
1927 ROOT="${3#--root=}"
1928 ;;
1929 --list=*)
1930 INSTALL_LIST="${3#--list=}"
1931 ;;
1932 *) shift 2
1933 echo -e "\nUnknown option $*.\n"
1934 exit 1
1935 ;;
1936 esac
1937 shift
1938 done
1939 AUTOEXEC="no"
1940 if ! check_for_package_in_list check; then
1941 PACKAGE=get-$PACKAGE
1942 AUTOEXEC=$PACKAGE
1943 check_for_package_in_list
1944 if [ -n "$(get_installed_package_pathname $PACKAGE $ROOT)" ]; then
1945 $AUTOEXEC $ROOT
1946 exit 0
1947 fi
1948 fi
1949 # Check if forced install.
1950 if [ "$DO_CHECK" = "no" ]; then
1951 rm -f $CACHE_DIR/$PACKAGE.tazpkg
1952 else
1953 check_for_installed_package $ROOT
1954 fi
1955 cd $CACHE_DIR
1956 if [ -f "$PACKAGE.tazpkg" ]; then
1957 echo "$PACKAGE already in the cache : $CACHE_DIR"
1958 # Check package download was finished
1959 tail -c 2k $PACKAGE.tazpkg | grep -q 00000000TRAILER || {
1960 echo "Continue $PACKAGE download"
1961 download $PACKAGE.tazpkg
1963 else
1964 echo ""
1965 download $PACKAGE.tazpkg
1966 fi
1967 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
1968 install_package $ROOT
1969 [ "$AUTOEXEC" != "no" ] && $PACKAGE $ROOT
1970 ;;
1971 clean-cache)
1972 # Remove all downloaded packages.
1974 check_root
1975 files=`ls -1 $CACHE_DIR | wc -l`
1976 echo ""
1977 echo -e "\033[1mClean cache :\033[0m $CACHE_DIR"
1978 echo "================================================================================"
1979 echo -n "Cleaning cache directory..."
1980 rm -rf $CACHE_DIR/*
1981 status
1982 echo "================================================================================"
1983 echo "$files file(s) removed from cache."
1984 echo ""
1985 ;;
1986 list-undigest)
1987 # list undigest URLs.
1989 if [ "$2" = "--box" ]; then
1990 for i in $LOCALSTATE/undigest/*/mirror; do
1991 [ -f $i ] || continue
1992 echo "$(basename $(dirname $i))|$(cat $i)"
1993 done
1994 else
1995 echo ""
1996 echo -e "\033[1mCurrent undigest(s)\033[0m"
1997 echo "================================================================================"
1998 for i in $LOCALSTATE/undigest/*/mirror; do
1999 if [ ! -f $i ]; then
2000 echo "No undigest mirror found."
2001 exit 1
2002 fi
2003 echo "$(basename $(dirname $i)) $(cat $i)"
2004 done
2005 echo ""
2006 fi
2007 ;;
2008 remove-undigest)
2009 # remove undigest URL.
2011 check_root
2012 if [ -d $LOCALSTATE/undigest/$2 ]; then
2013 echo -n "Remove $2 undigest (y/N) ? "; read anser
2014 if [ "$anser" = "y" ]; then
2015 echo -n "Removing $2 undigest..."
2016 rm -rf $LOCALSTATE/undigest/$2
2017 status
2018 rmdir $LOCALSTATE/undigest 2> /dev/null
2019 fi
2020 else
2021 echo "Undigest $2 not found"
2022 fi
2023 ;;
2024 add-undigest|setup-undigest)
2025 # Add undigest URL.
2027 check_root
2028 undigest=$2
2029 [ -d $LOCALSTATE/undigest ] || mkdir $LOCALSTATE/undigest
2030 if [ -z "$undigest" ]; then
2031 i=1
2032 while [ -d $LOCALSTATE/undigest/$i ]; do
2033 i=$(($i+1))
2034 done
2035 undigest=$i
2036 fi
2037 if [ ! -d $LOCALSTATE/undigest/$undigest ]; then
2038 echo "Creating new undigest $undigest."
2039 mkdir $LOCALSTATE/undigest/$undigest
2040 fi
2041 setup_mirror $LOCALSTATE/undigest/$undigest $3
2042 ;;
2043 setup-mirror)
2044 # Change mirror URL.
2046 check_root
2047 setup_mirror $LOCALSTATE $2
2048 ;;
2049 reconfigure)
2050 # Replay post_install from receipt
2052 check_for_package_on_cmdline
2053 check_root
2054 if [ -d "$INSTALLED/$PACKAGE" ]; then
2055 check_for_receipt
2056 # Check for post_install
2057 if grep -q ^post_install $INSTALLED/$PACKAGE/receipt; then
2058 . $INSTALLED/$PACKAGE/receipt
2059 post_install
2060 # Log this activity
2061 log Reconfigured
2062 else
2063 echo -e "\nNothing to do for $PACKAGE."
2064 fi
2065 else
2066 echo -e "\npackage $PACKAGE is not installed."
2067 echo -e "Install package with 'tazpkg install' or 'tazpkg get-install'\n"
2068 fi
2069 ;;
2070 shell)
2071 # Tazpkg SHell
2073 if test $(id -u) = 0 ; then
2074 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
2075 else
2076 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
2077 fi
2078 if [ ! "$2" = "--noheader" ]; then
2079 clear
2080 echo ""
2081 echo -e "\033[1mTazpkg SHell.\033[0m"
2082 echo "================================================================================"
2083 echo "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
2084 echo ""
2085 fi
2086 while true
2087 do
2088 echo -en "$PROMPT"; read cmd
2089 case $cmd in
2090 q|quit)
2091 break ;;
2092 shell)
2093 echo "You are already running a Tazpkg SHell." ;;
2094 su)
2095 su -c 'exec tazpkg shell --noheader' && break ;;
2096 "")
2097 continue ;;
2098 *)
2099 tazpkg $cmd ;;
2100 esac
2101 done
2102 ;;
2103 depends)
2104 # Display dependancies tree
2105 cd $INSTALLED
2106 ALL_DEPS=""
2107 if [ -f $2/receipt ]; then
2108 dep_scan $2 ""
2109 fi
2110 ;;
2111 rdepends)
2112 # Display reverse dependancies tree
2113 cd $INSTALLED
2114 ALL_DEPS=""
2115 if [ -f $2/receipt ]; then
2116 rdep_scan $2 ""
2117 fi
2118 ;;
2119 usage|*)
2120 # Print a short help or give usage for an unknown or empty command.
2122 usage
2123 ;;
2124 esac
2126 exit 0