tazpkg view tazpkg @ rev 263

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