tazpkg view tazpkg @ rev 249

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