tazpkg view tazpkg @ rev 261

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