tazpkg view tazpkg @ rev 268

tazpkg convert: add DEPENDS support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue May 26 18:54:06 2009 +0200 (2009-05-26)
parents 193102ec5cd6
children 41a374a7bfc4
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 or rpm 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 # Check for ELF file
899 is_elf()
900 {
901 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
902 }
904 # Print shared library dependencies
905 ldd()
906 {
907 LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $1 2> /dev/null
908 }
910 # search dependencies for files in $TMP_DIR/$file/fs
911 find_depends()
912 {
913 DEFAULT_DEPENDS="glibc-base gcc-lib-base"
915 [ -f /var/lib/tazpkg/files.list.lzma ] || tazpkg recharge
916 for i in /var/lib/tazpkg/files.list.lzma \
917 /var/lib/tazpkg/undigest/*/files.list.lzma ; do
918 [ -f $i ] && lzma d $i -so >> $TMP_DIR/files.list
919 done
920 find $TMP_DIR/$file/fs -type f | while read file ; do
921 is_elf $file || continue
922 case "$file" in
923 *.o|*.ko|*.ko.gz) continue;;
924 esac
925 ldd $file | while read lib rem; do
926 case "$lib" in
927 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
928 continue;;
929 esac
930 for dep in $(grep $lib files.list | cut -d: -f1); do
931 case " $DEFAULT_DEPENDS $ALL_DEPENDS " in
932 *\ $dep\ *) continue 2;;
933 esac
934 done
935 ALL_DEPENDS="$ALL_DEPENDS $dep"
936 if [ -n "$dep" ]; then
937 echo -n " $dep"
938 else
939 echo "$WARNING: unknown dependency for $lib" 1>&2
940 fi
941 done
942 done
943 }
945 # convert a .deb package to .tazpkg
946 convert_deb()
947 {
948 mkdir -p $TMP_DIR
949 dpkg-deb -e $PACKAGE_FILE $TMP_DIR
950 package=$(grep '^ *Package' $TMP_DIR/control)
951 package=$(echo ${package##*:})
952 version=$(grep '^ *Version' $TMP_DIR/control)
953 version=$(echo ${version##*:})
954 descrip=$(grep '^ *Description' $TMP_DIR/control)
955 descrip=$(echo ${descrip##*:})
956 file="$package-$version"
957 mkdir -p $TMP_DIR/$file/fs/
958 dpkg-deb -x $PACKAGE_FILE $TMP_DIR/$file/fs
959 cd $TMP_DIR
960 cat > $file/receipt <<EOT
961 # SliTaz package receipt.
962 # generated by tazpkg from debian package $(basename $PACKAGE_FILE)
963 PACKAGE="$package"
964 VERSION="$version"
965 CATEGORY="misc"
966 SHORT_DESC="$descrip"
967 WEB_SITE="http://packages.debian.org/search?keywords=$package"
968 MAINTAINER="nobody@slitaz.org"
969 DEPENDS="$(find_depends)"
970 EOT
971 awk '
972 {
973 if (/^ / && show) print substr($0,2);
974 else show=0;
975 if (/^Description/) show=1;
976 }' < $TMP_DIR/control > $file/description.txt
977 tazpkg pack $file
978 mv $file.tazpkg $TOP_DIR
979 cd $TOP_DIR
980 rm -rf $TMP_DIR
981 }
983 # convert a .rpm package to .tazpkg
984 convert_rpm()
985 {
986 mkdir -p $TMP_DIR
987 cp $PACKAGE_FILE $TMP_DIR
988 PACKAGE_FILE=$TMP_DIR/$(basename $PACKAGE_FILE)
989 rpm -qip $PACKAGE_FILE | awk -v pkg=$(basename $PACKAGE_FILE) '
990 BEGIN {
991 goturl=0;
992 printf "# Taz package receipt.\n";
993 printf "# generated by tazpkg from rpm package %s\n",pkg;
994 }
995 {
996 if (/^Name/) { name=$3; printf "PACKAGE=\"%s\"\n",$3; }
997 if (/^Version/) printf "VERSION=\"%s-",$3;
998 if (/^Release/) printf "%s\"\n",$3;
999 if (/^Summary/) printf "SHORT_DESC=\"%s\"\n",substr($0,15);
1000 if (/^URL/) { goturl=1; printf "WEB_SITE=\"%s\"\n",$3; }
1002 END {
1003 if (goturl == 0)
1004 printf "WEB_SITE=\"http://rpmfind.net/linux/rpm2html/search.php?query=%s\"\n",name;
1005 printf "CATEGORY=\"misc\"\n";
1006 printf "MAINTAINER=\"nobody@slitaz.org\"\n";
1008 ' > $TMP_DIR/receipt
1009 . $TMP_DIR/receipt
1010 file=$PACKAGE-$VERSION
1011 mkdir -p $TMP_DIR/$file/fs/
1012 mv $TMP_DIR/receipt $TMP_DIR/$file
1013 rpm -qip $PACKAGE_FILE | awk '
1014 DEGIN { show=0 }
1016 if (show) print;
1017 if (/^Description/) show=1;
1019 ' > $TMP_DIR/$file/description.txt
1020 cd $TMP_DIR/$file/fs/
1021 rpm2cpio $PACKAGE_FILE | cpio -idm
1022 cd ../..
1023 echo "DEPENDS=\"$(find_depends)\"" >> $TMP_DIR/receipt
1024 tazpkg pack $file
1025 mv $file.tazpkg $TOP_DIR
1026 cd $TOP_DIR
1027 rm -rf $TMP_DIR
1030 ###################
1031 # Tazpkg commands #
1032 ###################
1034 case "$COMMAND" in
1035 list)
1036 # List all installed packages or a specific category.
1038 if [ "$2" = "blocked" ]; then
1039 echo ""
1040 echo -e "\033[1mBlocked packages\033[0m"
1041 echo "================================================================================"
1042 if [ -s "$BLOCKED" ];then
1043 cat $BLOCKED
1044 echo ""
1045 else
1046 echo -e "No blocked packages found.\n"
1047 fi
1048 exit 0
1049 fi
1050 # Display the list of categories.
1051 if [ "$2" = "cat" -o "$2" = "categories" ]; then
1052 echo ""
1053 echo -e "\033[1mPackages categories :\033[0m"
1054 echo "================================================================================"
1055 for i in $CATEGORIES
1056 do
1057 echo $i
1058 categories=$(($categories+1))
1059 done
1060 echo "================================================================================"
1061 echo "$categories categories"
1062 echo ""
1063 exit 0
1064 fi
1065 # Check for an asked category.
1066 if [ -n "$2" ]; then
1067 ASKED_CATEGORY=$2
1068 echo ""
1069 echo -e "\033[1mInstalled packages of category :\033[0m $ASKED_CATEGORY"
1070 echo "================================================================================"
1071 for pkg in $INSTALLED/*
1072 do
1073 [ -f $pkg/receipt ] || continue
1074 EXTRAVERSION=""
1075 . $pkg/receipt
1076 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
1077 echo -n "$PACKAGE"
1078 echo -e "\033[24G $VERSION$EXTRAVERSION"
1079 packages=$(($packages+1))
1080 fi
1081 done
1082 echo "================================================================================"
1083 echo -e "$packages packages installed of category $ASKED_CATEGORY."
1084 echo ""
1085 else
1086 # By default list all packages and versions.
1087 echo ""
1088 echo -e "\033[1mList of all installed packages\033[0m"
1089 echo "================================================================================"
1090 for pkg in $INSTALLED/*
1091 do
1092 [ -f $pkg/receipt ] || continue
1093 EXTRAVERSION=""
1094 . $pkg/receipt
1095 echo -n "$PACKAGE"
1096 echo -en "\033[24G $VERSION$EXTRAVERSION"
1097 echo -e "\033[42G $CATEGORY"
1098 packages=$(($packages+1))
1099 done
1100 echo "================================================================================"
1101 echo "$packages packages installed."
1102 echo ""
1103 fi
1104 ;;
1105 xhtml-list)
1106 # Get info in receipts and build list.
1107 DATE=`date +%Y-%m-%d\ \%H:%M:%S`
1108 if [ -n "$2" ]; then
1109 XHTML_LIST=$2
1110 else
1111 XHTML_LIST=installed-packages.html
1112 fi
1113 echo ""
1114 echo -e "\033[1mCreating xHTML list of installed packages\033[0m"
1115 echo "================================================================================"
1116 echo -n "Generating xHTML header..."
1117 xhtml_header
1118 status
1119 # Packages
1120 echo -n "Creating packages information..."
1121 for pkg in $INSTALLED/*
1122 do
1123 [ -f $pkg/receipt ] || continue
1124 EXTRAVERSION=""
1125 . $pkg/receipt
1126 xhtml_pkg_info
1127 packages=$(($packages+1))
1128 done
1129 status
1130 echo -n "Generating xHTML footer..."
1131 xhtml_footer
1132 status
1133 # sed pkgs nb in header.
1134 sed -i s/'_packages_'/"$packages"/ $XHTML_LIST
1135 echo "================================================================================"
1136 echo "$XHTML_LIST created - $packages packages."
1137 echo ""
1138 ;;
1139 list-mirror)
1140 # List all available packages on the mirror. Option --diff displays
1141 # last mirrored packages diff (see recharge).
1142 check_for_packages_list
1143 case $2 in
1144 --diff)
1145 if [ -f "$LOCALSTATE/packages.diff" ]; then
1146 echo ""
1147 echo -e "\033[1mMirrored packages diff\033[0m"
1148 echo "================================================================================"
1149 cat $LOCALSTATE/packages.diff
1150 echo "================================================================================"
1151 pkgs=`cat $LOCALSTATE/packages.diff | wc -l`
1152 echo "$pkgs new packages listed on the mirror."
1153 echo ""
1154 else
1155 echo -e "\nUnable to list anything, no packages.diff found."
1156 echo -e "Recharge your current list to create a first diff.\n"
1157 fi && exit 0 ;;
1158 --text|--txt)
1159 echo ""
1160 echo -e "\033[1mList of available packages on the mirror\033[0m"
1161 echo "================================================================================"
1162 cat $LOCALSTATE/packages.txt ;;
1163 --raw|*)
1164 echo ""
1165 echo -e "\033[1mList of available packages on the mirror\033[0m"
1166 echo "================================================================================"
1167 cat $LOCALSTATE/packages.list ;;
1168 esac
1169 echo "================================================================================"
1170 pkgs=`cat $LOCALSTATE/packages.list | wc -l`
1171 echo "$pkgs packages in the last recharged list."
1172 echo ""
1173 ;;
1174 list-files)
1175 # List files installed with the package.
1177 check_for_package_on_cmdline
1178 check_for_receipt
1179 echo ""
1180 echo -e "\033[1mInstalled files with :\033[0m $PACKAGE"
1181 echo "================================================================================"
1182 cat $INSTALLED/$PACKAGE/files.list | sort
1183 echo "================================================================================"
1184 files=`cat $INSTALLED/$PACKAGE/files.list | wc -l`
1185 echo "$files files installed with $PACKAGE."
1186 echo ""
1187 ;;
1188 info)
1189 # Information about package.
1191 check_for_package_on_cmdline
1192 check_for_receipt
1193 EXTRAVERSION=""
1194 . $INSTALLED/$PACKAGE/receipt
1195 echo ""
1196 echo -e "\033[1mTazpkg information\033[0m
1197 ================================================================================
1198 Package : $PACKAGE
1199 Version : $VERSION$EXTRAVERSION
1200 Category : $CATEGORY
1201 Short desc : $SHORT_DESC
1202 Maintainer : $MAINTAINER"
1203 if [ ! "$DEPENDS" = "" ]; then
1204 echo -e "Depends : $DEPENDS"
1205 fi
1206 if [ ! "$SUGGESTED" = "" ]; then
1207 echo -e "Suggested : $SUGGESTED"
1208 fi
1209 if [ ! "$BUILD_DEPENDS" = "" ]; then
1210 echo -e "Build deps : $BUILD_DEPENDS"
1211 fi
1212 if [ ! "$WANTED" = "" ]; then
1213 echo -e "Wanted src : $WANTED"
1214 fi
1215 if [ ! "$WEB_SITE" = "" ]; then
1216 echo -e "Web site : $WEB_SITE"
1217 fi
1218 echo "================================================================================"
1219 echo ""
1220 ;;
1221 desc)
1222 # Display package description.txt if available.
1223 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
1224 echo ""
1225 echo -e "\033[1mDescription of :\033[0m $PACKAGE"
1226 echo "================================================================================"
1227 cat $INSTALLED/$PACKAGE/description.txt
1228 echo "================================================================================"
1229 echo ""
1230 else
1231 echo -e "\nSorry, no description available for this package.\n"
1232 fi
1233 ;;
1234 search)
1235 # Search for a package by pattern or name.
1237 PATTERN="$2"
1238 if [ -z "$PATTERN" ]; then
1239 echo -e "\nPlease specify a pattern or package name to search for."
1240 echo -e "Example : 'tazpkg search paint'.\n"
1241 exit 0
1242 fi
1243 echo ""
1244 echo -e "\033[1mSearch result for :\033[0m $PATTERN"
1245 echo ""
1246 # Default is to search in installed pkgs and the raw list.
1247 case $3 in
1248 -i|--installed)
1249 search_in_installed_packages ;;
1250 -l|--list)
1251 search_in_packages_list ;;
1252 -m|--mirror)
1253 search_in_packages_txt ;;
1254 *)
1255 search_in_installed_packages
1256 search_in_packages_list ;;
1257 esac
1258 ;;
1259 search-file)
1260 # Search for a file by pattern or name in all files.list.
1262 if [ -z "$2" ]; then
1263 echo -e "\nPlease specify a pattern or file name to search for."
1264 echo -e "Example : 'tazpkg search-file libnss'. \n"
1265 exit 0
1266 fi
1267 echo ""
1268 echo -e "\033[1mSearch result for file :\033[0m $2"
1269 echo "================================================================================"
1271 if [ "$3" == "--mirror" ]; then
1273 match=0
1274 for i in $LOCALSTATE/files.list.lzma \
1275 $LOCALSTATE/undigest/*/files.list.lzma; do
1276 [ -f $i ] || continue
1277 unlzma -c $i | grep -- ".*:.*$2" | awk '
1278 BEGIN { last="" }
1280 pkg=substr($0,0,index($0,":")-1);
1281 file=substr($0,index($0,":")+2);
1282 if (last != pkg) {
1283 last = pkg;
1284 printf("\n%c[1mPackage %s :%c[0m\n",27,pkg,27);
1286 printf("%s\n",file);
1287 }'
1288 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | wc -l`))
1289 done
1291 else
1293 # Check all pkg files.list in search match with specify the package
1294 # name and the full path to the file(s).
1295 for pkg in $INSTALLED/*
1296 do
1297 if grep -qs "$2" $pkg/files.list; then
1298 . $pkg/receipt
1299 echo ""
1300 echo -e "\033[1mPackage $PACKAGE :\033[0m"
1301 grep "$2" $pkg/files.list
1302 files=`grep $2 $pkg/files.list | wc -l`
1303 match=$(($match+$files))
1304 fi
1305 done
1307 fi
1309 if [ "$match" = "" ]; then
1310 echo "0 file found for : $2"
1311 echo ""
1312 else
1313 echo ""
1314 echo "================================================================================"
1315 echo "$match file(s) found for : $2"
1316 echo ""
1317 fi
1318 ;;
1319 install)
1320 # Install .tazpkg packages.
1322 check_root
1323 check_for_package_on_cmdline
1324 check_for_package_file
1325 # Check if forced install.
1326 DO_CHECK="yes"
1327 ROOT=""
1328 while [ -n "$3" ]; do
1329 case "$3" in
1330 --forced)
1331 DO_CHECK="no"
1332 ;;
1333 --root=*)
1334 ROOT="${3#--root=}"
1335 ;;
1336 --list=*)
1337 INSTALL_LIST="${3#--list=}"
1338 ;;
1339 *) shift 2
1340 echo -e "\nUnknown option $*.\n"
1341 exit 1
1342 ;;
1343 esac
1344 shift
1345 done
1346 if [ "$DO_CHECK" = "yes" ]; then
1347 check_for_installed_package $ROOT
1348 fi
1349 install_package $ROOT
1350 ;;
1351 install-list|get-install-list)
1352 # Install a set of packages from a list.
1354 check_root
1355 if [ -z "$2" ]; then
1356 echo -e "
1357 Please change directory (cd) to the packages repository, and specify the
1358 list of packages to install. Example : tazpkg install-list packages.list\n"
1359 exit 0
1360 fi
1361 # Check if the packages list exist.
1362 if [ ! -f "$2" ]; then
1363 echo "Unable to find : $2"
1364 exit 0
1365 else
1366 LIST=`cat $2`
1367 fi
1369 # Remember processed list
1370 export INSTALL_LIST="$2"
1372 # Set $COMMAND and install all packages.
1373 if [ "$1" = "get-install-list" ]; then
1374 COMMAND=get-install
1375 else
1376 COMMAND=install
1377 fi
1378 touch $2-processed
1379 for pkg in $LIST
1380 do
1381 grep -qs ^$pkg$ $2-processed && continue
1382 tazpkg $COMMAND $pkg --list=$2 "$3" "$4" "$5"
1383 done
1384 rm -f $2-processed
1385 ;;
1386 add-flavor)
1387 # Install a set of packages from a flavor.
1389 install_flavor $2
1390 ;;
1391 install-flavor)
1392 # Install a set of packages from a flavor and purge other ones.
1394 install_flavor $2 --purge
1395 ;;
1396 set-release)
1397 # Change curent release and upgrade packages.
1399 RELEASE=$2
1400 if [ -z "$RELEASE" ]; then
1401 echo -e "\nPlease specify the release you want on the command line."
1402 echo -e "Example: tazpkg set-release cooking\n"
1403 exit 0
1404 fi
1405 rm /var/lib/tazpkg/mirror
1406 echo "$RELEASE" > /etc/slitaz-release
1407 tazpkg recharge && tazpkg upgrade
1409 # Install missing depends
1410 cd $INSTALLED
1411 for i in * ; do
1412 DEPENDS=""
1413 . $i/receipt
1414 for j in $DEPENDS ; do
1415 [ -d $j ] || tazpkg get-install $j
1416 done
1417 done
1418 ;;
1419 remove)
1420 # Remove packages.
1422 check_root
1423 check_for_package_on_cmdline
1424 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
1425 echo -e "\n$PACKAGE is not installed.\n"
1426 exit 0
1427 else
1428 ALTERED=""
1429 THE_PACKAGE=$PACKAGE # altered by receipt
1430 for i in $(cd $INSTALLED ; ls); do
1431 [ -f $INSTALLED/$i/receipt ] || continue
1432 DEPENDS=""
1433 . $INSTALLED/$i/receipt
1434 case " $(echo $DEPENDS) " in
1435 *\ $THE_PACKAGE\ *) ALTERED="$ALTERED $i";;
1436 esac
1437 done
1438 EXTRAVERSION=""
1439 . $INSTALLED/$THE_PACKAGE/receipt
1440 fi
1441 echo ""
1442 if [ -n "$ALTERED" ]; then
1443 echo "The following packages depend on $PACKAGE :"
1444 for i in $ALTERED; do
1445 echo " $i"
1446 done
1447 fi
1448 REFRESH=$(cd $INSTALLED ; grep -sl ^$PACKAGE$ */modifiers)
1449 if [ -n "$REFRESH" ]; then
1450 echo "The following packages have been modified by $PACKAGE :"
1451 for i in $REFRESH; do
1452 echo " ${i%/modifiers}"
1453 done
1454 fi
1455 echo "Remove $PACKAGE ($VERSION$EXTRAVERSION) ?"
1456 echo -n "Please confirm uninstallation (y/N) : "; read anser
1457 if [ "$anser" = "y" ]; then
1458 echo ""
1459 echo -e "\033[1mRemoving :\033[0m $PACKAGE"
1460 echo "================================================================================"
1461 # Pre remove commands.
1462 if grep -q ^pre_remove $INSTALLED/$PACKAGE/receipt; then
1463 pre_remove
1464 fi
1465 echo -n "Removing all files installed..."
1466 if [ -f $INSTALLED/$PACKAGE/modifiers ]; then
1467 for mod in `cat $INSTALLED/$PACKAGE/modifiers`
1468 do
1469 for file in `cat $INSTALLED/$PACKAGE/files.list`
1470 do
1471 [ $(grep ^$file$ $INSTALLED/$mod/files.list | wc -l) -gt 1 ] && continue
1472 rm -f $file 2>/dev/null
1473 dir="$file"
1474 while [ "$dir" != "/" ]; do
1475 dir="$(dirname $dir)"
1476 rmdir $dir 2> /dev/null || break
1477 done
1478 done
1479 done
1480 else
1481 for file in `cat $INSTALLED/$PACKAGE/files.list`
1482 do
1483 rm -f $file 2>/dev/null
1484 dir="$file"
1485 while [ "$dir" != "/" ]; do
1486 dir="$(dirname $dir)"
1487 rmdir $dir 2> /dev/null || break
1488 done
1489 done
1490 fi
1491 status
1492 if grep -q ^post_remove $INSTALLED/$PACKAGE/receipt; then
1493 post_remove
1494 fi
1495 # Remove package receipt.
1496 echo -n "Removing package receipt..."
1497 rm -rf $INSTALLED/$PACKAGE
1498 status
1499 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$/d" \
1500 $LOCALSTATE/installed.md5 2> /dev/null
1501 # Log this activity
1502 log Removed
1503 if [ -n "$ALTERED" ]; then
1504 echo -n "Remove packages depending on $PACKAGE"
1505 echo -n " (y/N) ? "; read anser
1506 if [ "$anser" = "y" ]; then
1507 for i in $ALTERED; do
1508 if [ -d "$INSTALLED/$i" ]; then
1509 tazpkg remove $i
1510 fi
1511 done
1512 fi
1513 fi
1514 if [ -n "$REFRESH" ]; then
1515 echo -n "Reinstall packages modified by $PACKAGE"
1516 echo -n " (y/N) ? "; read anser
1517 if [ "$anser" = "y" ]; then
1518 for i in $REFRESH; do
1519 if [ $(wc -l < $INSTALLED/$i) -gt 1 ]; then
1520 echo "Check $INSTALLED/$i for reinstallation"
1521 continue
1522 fi
1523 rm -r $INSTALLED/$i
1524 tazpkg get-install ${i%/modifiers} --forced
1525 done
1526 fi
1527 fi
1528 else
1529 echo ""
1530 echo "Uninstallation of $PACKAGE cancelled."
1531 fi
1532 echo ""
1533 ;;
1534 extract)
1535 # Extract .tazpkg cpio archive into a directory.
1537 check_for_package_on_cmdline
1538 check_for_package_file
1539 echo ""
1540 echo -e "\033[1mExtracting :\033[0m $PACKAGE"
1541 echo "================================================================================"
1542 # If no directory destination is found on the cmdline
1543 # we create one in the current dir using the package name.
1544 if [ -n "$TARGET_DIR" ]; then
1545 DESTDIR=$TARGET_DIR/$PACKAGE
1546 else
1547 DESTDIR=$PACKAGE
1548 fi
1549 mkdir -p $DESTDIR
1550 echo -n "Copying original package..."
1551 cp $PACKAGE_FILE $DESTDIR
1552 status
1553 cd $DESTDIR
1554 extract_package
1555 echo "================================================================================"
1556 echo "$PACKAGE is extracted to : $DESTDIR"
1557 echo ""
1558 ;;
1559 list-config)
1560 # List configuration files installed.
1562 if [ "$2" = "--box" ]; then
1563 mkdir -p $TMP_DIR && cd $TMP_DIR
1564 FILES="$INSTALLED/*/volatile.cpio.gz"
1565 [ -n "$3" ] && FILES="$INSTALLED/$3/volatile.cpio.gz"
1566 for i in $FILES; do
1567 zcat $i | cpio -idm > /dev/null
1568 find * -type f 2>/dev/null | while read file; do
1569 if [ ! -e /$file ]; then
1570 echo -n "|--|--|--|File lost"
1571 else
1572 echo -n "$(stat -c "%A|%U|%G|%s|" /$file)"
1573 cmp $file /$file > /dev/null 2>&1 || \
1574 echo -n "$(stat -c "%.16y" /$file)"
1575 fi
1576 echo "|/$file"
1577 done
1578 rm -rf *
1579 done
1580 cd $TOP_DIR
1581 rm -rf $TMP_DIR
1582 else
1583 echo ""
1584 echo -e "\033[1mConfiguration files"
1585 echo "================================================================================"
1586 for i in $INSTALLED/*/volatile.cpio.gz; do
1587 [ -n "$2" -a "$i" != "$INSTALLED/$2/volatile.cpio.gz" ] && continue
1588 [ -f "$i" ] || continue
1589 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1590 done | sed 's|^|/|' | sort
1591 echo "================================================================================"
1592 echo ""
1593 fi
1594 ;;
1595 repack-config)
1596 # Create SliTaz package archive from configuration files.
1598 mkdir -p $TMP_DIR && cd $TMP_DIR
1599 CONFIG_VERSION=1.0
1600 mkdir config-$CONFIG_VERSION
1601 cd config-$CONFIG_VERSION
1602 for i in $INSTALLED/*/volatile.cpio.gz; do
1603 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1604 done > files.list
1605 mkdir fs
1606 cd fs
1607 ( cd / ; cpio -o -H newc ) < ../files.list | cpio -idm > /dev/null
1608 mkdir -p etc/tazlito
1609 for i in $INSTALLED/*/receipt; do
1610 EXTRAVERSION=""
1611 . $i
1612 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1613 done > etc/tazlito/config-packages.list
1614 cd ..
1615 echo "etc/tazlito/config-packages.list" >> files.list
1616 cat > receipt <<EOT
1617 # SliTaz package receipt.
1619 PACKAGE="config"
1620 VERSION="$CONFIG_VERSION"
1621 CATEGORY="base-system"
1622 SHORT_DESC="User configuration backup on $(date)"
1623 DEPENDS="$(ls $INSTALLED)"
1624 EOT
1625 cd ..
1626 tazpkg pack config-$CONFIG_VERSION
1627 cp config-$CONFIG_VERSION.tazpkg $TOP_DIR
1628 cd $TOP_DIR
1629 rm -rf $TMP_DIR
1630 ;;
1631 repack)
1632 # Create SliTaz package archive from an installed package.
1634 check_for_package_on_cmdline
1635 check_for_receipt
1636 EXTRAVERSION=""
1637 . $INSTALLED/$PACKAGE/receipt
1638 echo ""
1639 echo -e "\033[1mRepacking :\033[0m $PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
1640 echo "================================================================================"
1641 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
1642 echo "Can't repack $PACKAGE"
1643 exit 1
1644 fi
1645 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
1646 echo "Can't repack, $PACKAGE files have been modified by:"
1647 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
1648 echo " $i"
1649 done
1650 exit 1
1651 fi
1652 MISSING=""
1653 while read i; do
1654 [ -e "$i" ] && continue
1655 [ -L "$i" ] || MISSING="$MISSING\n $i"
1656 done < $INSTALLED/$PACKAGE/files.list
1657 if [ -n "$MISSING" ]; then
1658 echo -n "Can't repack, the following files are lost:"
1659 echo -e "$MISSING"
1660 exit 1
1661 fi
1662 mkdir -p $TMP_DIR && cd $TMP_DIR
1663 FILES="fs.cpio.gz\n"
1664 for i in $(ls $INSTALLED/$PACKAGE) ; do
1665 [ "$i" = "volatile.cpio.gz" ] && continue
1666 [ "$i" = "modifiers" ] && continue
1667 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
1668 done
1669 ln -s / rootfs
1670 mkdir tmp
1671 sed 's/^/rootfs/' < files.list | cpio -o -H newc 2>/dev/null |\
1672 ( cd tmp ; cpio -idm 2>/dev/null )
1673 mv tmp/rootfs fs
1674 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
1675 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
1676 ( cd fs; cpio -idm )
1677 fi
1678 if grep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
1679 . $INSTALLED/$PACKAGE/receipt
1680 repack_cleanup fs
1681 fi
1682 if [ -f $INSTALLED/$PACKAGE/md5sum ]; then
1683 sed 's, , fs,' < $INSTALLED/$PACKAGE/md5sum | \
1684 md5sum -s -c || {
1685 echo "Can't repack, md5sum error."
1686 cd $TOP_DIR
1687 rm -rf $TMP_DIR
1688 exit 1
1690 fi
1691 find fs | cpio -o -H newc 2> /dev/null | gzip -9 > fs.cpio.gz
1692 echo -e "$FILES" | cpio -o -H newc 2> /dev/null > \
1693 $TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg
1694 cd $TOP_DIR
1695 \rm -R $TMP_DIR
1696 echo "Package $PACKAGE repacked successfully."
1697 echo "Size : `du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg`"
1698 echo ""
1699 ;;
1700 pack)
1701 # Create SliTaz package archive using cpio and gzip.
1703 check_for_package_on_cmdline
1704 cd $PACKAGE
1705 if [ ! -f "receipt" ]; then
1706 echo "Receipt is missing. Please read the documentation."
1707 exit 0
1708 else
1709 echo ""
1710 echo -e "\033[1mPacking :\033[0m $PACKAGE"
1711 echo "================================================================================"
1712 # Create files.list with redirecting find outpout.
1713 echo -n "Creating the list of files..." && cd fs
1714 find . -type f -print > ../files.list
1715 find . -type l -print >> ../files.list
1716 cd .. && sed -i s/'^.'/''/ files.list
1717 status
1718 echo -n "Creating md5sum of files..."
1719 while read file; do
1720 [ -L "fs$file" ] && continue
1721 [ -f "fs$file" ] || continue
1722 case "$file" in
1723 /lib/modules/*/modules.*|*.pyc) continue;;
1724 esac
1725 md5sum "fs$file" | sed 's/ fs/ /'
1726 done < files.list > md5sum
1727 status
1728 UNPACKED_SIZE=$(du -chs fs receipt files.list md5sum \
1729 description.txt 2> /dev/null | awk \
1730 '{ sz=$1 } END { print sz }')
1731 # Build cpio archives.
1732 echo -n "Compressing the fs... "
1733 find fs -print | cpio -o -H newc | gzip > fs.cpio.gz
1734 rm -rf fs
1735 status
1736 PACKED_SIZE=$(du -chs fs.cpio.gz receipt files.list \
1737 md5sum description.txt 2> /dev/null | awk \
1738 '{ sz=$1 } END { print sz }')
1739 echo -n "Undating receipt sizes..."
1740 sed -i s/^PACKED_SIZE.*$// receipt
1741 sed -i s/^UNPACKED_SIZE.*$// receipt
1742 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
1743 status
1744 echo -n "Creating full cpio archive... "
1745 find . -print | cpio -o -H newc > ../$PACKAGE.tazpkg
1746 status
1747 echo -n "Restoring original package tree... "
1748 zcat fs.cpio.gz | cpio -idm
1749 status
1750 rm fs.cpio.gz && cd ..
1751 echo "================================================================================"
1752 echo "Package $PACKAGE compressed successfully."
1753 echo "Size : `du -sh $PACKAGE.tazpkg`"
1754 echo ""
1755 fi
1756 ;;
1757 recharge)
1758 # Recharge packages.list from a mirror.
1760 check_root
1761 for path in $LOCALSTATE $LOCALSTATE/undigest/*; do
1762 [ -f $path/mirror ] || continue
1763 echo ""
1764 if [ "$path" != "$LOCALSTATE" ]; then
1765 echo "Recharge undigest $(basename $path):"
1766 fi
1767 cd $path
1768 if [ -f "packages.list" ]; then
1769 echo -n "Creating backup of the last packages list..."
1770 mv -f packages.desc packages.desc.bak 2>/dev/null
1771 mv -f packages.md5 packages.md5.txt 2>/dev/null
1772 mv -f packages.txt packages.txt.bak 2>/dev/null
1773 mv -f packages.list packages.list.bak 2>/dev/null
1774 mv -f packages.equiv packages.equiv.bak 2>/dev/null
1775 mv -f files.list.lzma files.list.lzma.bak 2> /dev/null
1776 mv -f mirrors mirrors.bak 2> /dev/null
1777 status
1778 fi
1779 download_from "$(cat mirror)" packages.desc
1780 download_from "$(cat mirror)" packages.md5
1781 download_from "$(cat mirror)" packages.txt
1782 download_from "$(cat mirror)" packages.list
1783 download_from "$(cat mirror)" packages.equiv
1784 download_from "$(cat mirror)" files.list.lzma
1785 download_from "$(cat mirror)" mirrors
1786 [ -f mirrors ] || mv mirrors.bak mirrors 2> /dev/null
1787 suffix=$(head -1 mirror)
1788 suffix=packages${suffix#*/packages}
1789 for i in $(cat mirrors 2> /dev/null); do
1790 grep -qs $i mirror || echo $i$suffix >> mirror
1791 done
1792 if [ -f "packages.list.bak" ]; then
1793 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
1794 sed -i s/+// packages.diff
1795 echo ""
1796 echo -e "\033[1mMirrored packages diff\033[0m"
1797 echo "================================================================================"
1798 cat packages.diff
1799 if [ ! "`cat packages.diff | wc -l`" = 0 ]; then
1800 echo "================================================================================"
1801 echo "`cat packages.diff | wc -l` new packages on the mirror."
1802 echo ""
1803 else
1804 echo "`cat packages.diff | wc -l` new packages on the mirror."
1805 echo ""
1806 fi
1807 else
1808 echo -e "
1809 ================================================================================
1810 Last packages.list is ready to use. Note that next time you recharge the list,
1811 a list of differencies will be displayed to show new and upgradeable packages.\n"
1812 fi
1813 done
1814 ;;
1815 upgrade)
1816 # Upgrade all installed packages with the new version from the mirror.
1818 check_root
1819 check_for_packages_list
1820 cd $LOCALSTATE
1821 # Touch the blocked pkgs list to avoid errors and remove any old
1822 # upgrade list.
1823 touch blocked-packages.list
1824 rm -f upgradeable-packages.list
1825 echo ""
1826 echo -e "\033[1mAvailable upgrades\033[0m"
1827 echo "================================================================================"
1828 echo ""
1829 # Some packages must be installed first
1830 FIRST_CLASS_PACKAGE=" glibc-base slitaz-base-files slitaz-boot-scripts "
1831 for pkg in $INSTALLED/*
1832 do
1833 [ -f $pkg/receipt ] || continue
1834 EXTRAVERSION=""
1835 . $pkg/receipt
1836 # Display package name to show that Tazpkg is working...
1837 echo -en "\\033[0G "
1838 echo -en "\\033[0G$PACKAGE"
1839 # Skip specified pkgs listed in $LOCALSTATE/blocked-packages.list
1840 if grep -qs "^$PACKAGE" $BLOCKED; then
1841 blocked=$(($blocked+1))
1842 else
1843 # Check if the installed package is in the current list (other
1844 # mirror or local).
1845 NEW_PACKAGE=$(get_package_filename $PACKAGE)
1847 if [ -n "$NEW_PACKAGE" ]; then
1848 # Set new pkg and version for future comparison
1849 NEW_VERSION=`echo $NEW_PACKAGE | sed s/$PACKAGE-/''/`
1850 # Change '-' and 'pre' to points.
1851 NEW_VERSION=`echo $NEW_VERSION | sed s/'-'/'.'/`
1852 VERSION=`echo $VERSION | sed s/'-'/'.'/`$EXTRAVERSION
1853 NEW_VERSION=`echo $NEW_VERSION | sed s/'pre'/'.'/`
1854 VERSION=`echo $VERSION | sed s/'pre'/'.'/`
1855 NEW_VERSION=`echo $NEW_VERSION | sed 's/[A-Z]\.//'`
1856 VERSION=`echo $VERSION | sed 's/[A-Z]\.//'`
1857 # Compare version. Upgrades are only available for official
1858 # packages, so we control the mirror and it should be ok if
1859 # we just check for equality.
1860 RELEASE=""
1861 if [ -f installed.md5 -a -f packages.md5 ]; then
1862 current_md5=$(grep -s " $PACKAGE-$VERSION" installed.md5 | awk '{ print $1 }')
1863 new_md5=$(grep -hs " $PACKAGE-$VERSION" packages.md5 undigest/*/packages.md5 | head -1 | awk '{ print $1 }')
1864 [ -n "$current_md5" ] && [ -n "$new_md5" ] &&
1865 [ "$current_md5" != "$new_md5" ] && RELEASE=build
1866 fi
1867 if [ "$VERSION" != "$NEW_VERSION" -o -n "$RELEASE" ]; then
1868 # Version seems different. Check for major, minor or
1869 # revision
1870 PKG_MAJOR=`echo ${VERSION%_*} | cut -f1 -d"."`
1871 NEW_MAJOR=`echo ${NEW_VERSION%_*} | cut -f1 -d"."`
1872 PKG_MINOR=`echo ${VERSION%_*} | cut -f2 -d"."`
1873 NEW_MINOR=`echo ${NEW_VERSION%_*} | cut -f2 -d"."`
1874 # Minor
1875 if [ "$NEW_MINOR" -gt "$PKG_MINOR" ] 2> /dev/null; then
1876 RELEASE=minor
1877 fi
1878 if [ "$NEW_MINOR" -lt "$PKG_MINOR" ] 2> /dev/null; then
1879 RELEASE=$WARNING
1880 FIXE=yes
1881 fi
1882 # Major
1883 if [ "$NEW_MAJOR" -gt "$PKG_MAJOR" ] 2> /dev/null; then
1884 RELEASE=major
1885 FIXE=""
1886 fi
1887 if [ "$NEW_MAJOR" -lt "$PKG_MAJOR" ] 2> /dev/null; then
1888 RELEASE=$WARNING
1889 FIXE=yes
1890 fi
1891 # Default to revision.
1892 if [ -z $RELEASE ]; then
1893 RELEASE=revision
1894 fi
1895 # Pkg name is already displayed by the check process.
1896 echo -en "\033[24G $VERSION"
1897 echo -en "\033[38G --->"
1898 echo -en "\033[43G $NEW_VERSION"
1899 echo -en "\033[58G $CATEGORY"
1900 echo -e "\033[72G $RELEASE"
1901 up=$(($up+1))
1902 echo "$PACKAGE" >> upgradeable-packages.list
1903 case "$FIRST_CLASS_PACKAGE" in
1904 *\ $PACKAGE\ *) echo "$PACKAGE" >> upgradeable-packages.list$$;;
1905 esac
1906 unset RELEASE
1907 fi
1908 packages=$(($packages+1))
1909 fi
1910 fi
1911 done
1912 if [ -z $blocked ]; then
1913 blocked=0
1914 fi
1915 # Clean last checked package and display summary.
1916 if [ ! "$up" = "" ]; then
1917 echo -e "\\033[0G "
1918 echo "================================================================================"
1919 echo "$packages installed and listed packages to consider, $up to upgrade, $blocked blocked."
1920 echo ""
1921 else
1922 echo -e "\\033[0GSystem is up-to-date. "
1923 echo ""
1924 echo "================================================================================"
1925 echo "$packages installed and listed packages to consider, 0 to upgrade, $blocked blocked."
1926 echo ""
1927 exit 0
1928 fi
1929 # What to do if major or minor version is smaller.
1930 if [ "$FIXE" == "yes" ]; then
1931 echo -e "$WARNING ---> Installed package seems more recent than the mirrored one."
1932 echo "You can block packages using the command : 'tazpkg block package'"
1933 echo "Or upgrade packages at your own risk."
1934 echo ""
1935 fi
1936 # Ask for upgrade, it can be done another time.
1937 echo -n "Upgrade now (y/N) ? "; read anser
1938 if [ ! "$anser" = "y" ]; then
1939 echo -e "\nExiting. No package upgraded.\n"
1940 exit 0
1941 fi
1942 # If anser is yes (y). Install all new versions.
1943 cat upgradeable-packages.list >> upgradeable-packages.list$$
1944 mv -f upgradeable-packages.list$$ upgradeable-packages.list
1945 yes y | tazpkg get-install-list upgradeable-packages.list --forced
1946 rm -f upgradeable-packages.list
1947 ;;
1948 bugs)
1949 # Show known bugs in package(s)
1951 cd $INSTALLED
1952 shift
1953 LIST=$@
1954 [ -n "$LIST" ] || LIST=`ls`
1955 MSG="No known bugs."
1956 for PACKAGE in $LIST; do
1957 BUGS=""
1958 EXTRAVERSION=""
1959 . $PACKAGE/receipt
1960 if [ -n "$BUGS" ]; then
1961 MSG="
1962 Bug list completed"
1963 cat <<EOT
1965 Bugs in package $PACKAGE version $VERSION$EXTRAVERSION:
1966 $BUGS
1967 EOT
1968 fi
1969 done
1970 echo "$MSG"
1971 ;;
1972 check)
1973 # Check installed packages set.
1975 check_root
1976 cd $INSTALLED
1977 for PACKAGE in `ls`; do
1978 if [ ! -f $PACKAGE/receipt ]; then
1979 echo "The package $PACKAGE installation is not completed"
1980 continue
1981 fi
1982 DEPENDS=""
1983 EXTRAVERSION=""
1984 . $PACKAGE/receipt
1985 if [ -s $PACKAGE/modifiers ]; then
1986 echo "The package $PACKAGE $VERSION$EXTRAVERSION has been modified by :"
1987 for i in $(cat $PACKAGE/modifiers); do
1988 echo " $i"
1989 done
1990 fi
1991 MSG="Files lost from $PACKAGE $VERSION$EXTRAVERSION :\n"
1992 while read file; do
1993 [ -e "$file" ] && continue
1994 if [ -L "$file" ]; then
1995 MSG="$MSG target of symlink"
1996 fi
1997 echo -e "$MSG $file"
1998 MSG=""
1999 done < $PACKAGE/files.list
2000 MSG="Missing dependencies for $PACKAGE $VERSION$EXTRAVERSION :\n"
2001 for i in $DEPENDS; do
2002 [ -d $i ] && continue
2003 echo -e "$MSG $i"
2004 MSG=""
2005 done
2006 MSG="Dependencies loop between $PACKAGE and :\n"
2007 ALL_DEPS=""
2008 check_for_deps_loop $PACKAGE $DEPENDS
2009 done
2010 echo -n "Looking for known bugs... "
2011 tazpkg bugs
2012 if [ "$PACKAGE_FILE" = "--full" ]; then
2013 for file in */md5sum; do
2014 CONFIG_FILES=""
2015 . $(dirname "$file")/receipt
2016 [ -s "$file" ] || continue
2017 while read md5 f; do
2018 [ -f $f ] || continue
2019 for i in $CONFIG_FILES; do
2020 case "$f" in
2021 $i|$i/*) continue 2;;
2022 esac
2023 done
2024 echo "$md5 $f"
2025 done < "$file" | md5sum -c - 2> /dev/null | \
2026 grep -v OK$ | sed 's/FAILED$/MD5SUM MISMATCH/'
2027 done
2028 FILES=" "
2029 for file in $(cat */files.list); do
2030 [ -d "$file" ] && continue
2031 case "$FILES" in *\ $file\ *) continue;; esac
2032 [ $(grep "^$file$" */files.list 2> /dev/null | \
2033 wc -l) -gt 1 ] || continue
2034 FILES="$FILES$file "
2035 echo "The following packages provide $file :"
2036 grep -l "^$file$" */files.list | while read f
2037 do
2038 pkg=${f%/files.list}
2039 echo -n " $pkg"
2040 if [ -f $pkg/modifiers ]; then
2041 echo -n " (overridden by $(echo "$(cat $pkg/modifiers)"))"
2042 fi
2043 echo ""
2044 done
2045 done
2046 MSG="No package has installed the following files:\n"
2047 find /etc /bin /sbin /lib /usr /var/www \
2048 -not -type d 2> /dev/null | while read file; do
2049 case "$file" in *\[*) continue;; esac
2050 grep -q "^$file$" */files.list && continue
2051 echo -e "$MSG $file"
2052 MSG=""
2053 done
2054 fi
2055 echo "Check completed."
2056 ;;
2057 block)
2058 # Add a pkg name to the list of blocked packages.
2060 check_root
2061 check_for_package_on_cmdline
2062 echo ""
2063 if grep -qs "^$PACKAGE" $BLOCKED; then
2064 echo "$PACKAGE is already in the blocked packages list."
2065 echo ""
2066 exit 0
2067 else
2068 echo -n "Add $PACKAGE to : $BLOCKED..."
2069 echo $PACKAGE >> $BLOCKED
2070 status
2071 # Log this activity
2072 . $INSTALLED/$PACKAGE/receipt
2073 log Blocked
2074 fi
2075 echo ""
2076 ;;
2077 unblock)
2078 # Remove a pkg name from the list of blocked packages.
2080 check_root
2081 check_for_package_on_cmdline
2082 echo ""
2083 if grep -qs "^$PACKAGE" $BLOCKED; then
2084 echo -n "Removing $PACKAGE from : $BLOCKED..."
2085 sed -i s/$PACKAGE/''/ $BLOCKED
2086 sed -i '/^$/d' $BLOCKED
2087 status
2088 # Log this activity
2089 . $INSTALLED/$PACKAGE/receipt
2090 log Unblocked
2091 else
2092 echo "$PACKAGE is not in the blocked packages list."
2093 echo ""
2094 exit 0
2095 fi
2096 echo ""
2097 ;;
2098 get)
2099 # Downlowd a package with wget.
2101 check_for_package_on_cmdline
2102 check_for_packages_list
2103 check_for_package_in_list
2104 echo ""
2105 download $PACKAGE.tazpkg
2106 echo ""
2107 ;;
2108 get-install)
2109 # Download and install a package.
2111 check_root
2112 check_for_package_on_cmdline
2113 check_for_packages_list
2114 DO_CHECK=""
2115 while [ -n "$3" ]; do
2116 case "$3" in
2117 --forced)
2118 DO_CHECK="no"
2119 ;;
2120 --root=*)
2121 ROOT="${3#--root=}"
2122 ;;
2123 --list=*)
2124 INSTALL_LIST="${3#--list=}"
2125 ;;
2126 *) shift 2
2127 echo -e "\nUnknown option $*.\n"
2128 exit 1
2129 ;;
2130 esac
2131 shift
2132 done
2133 AUTOEXEC="no"
2134 if ! check_for_package_in_list check; then
2135 PACKAGE=get-$PACKAGE
2136 AUTOEXEC=$PACKAGE
2137 check_for_package_in_list
2138 if [ -n "$(get_installed_package_pathname $PACKAGE $ROOT)" ]; then
2139 $AUTOEXEC $ROOT
2140 exit 0
2141 fi
2142 fi
2143 # Check if forced install.
2144 if [ "$DO_CHECK" = "no" ]; then
2145 rm -f $CACHE_DIR/$PACKAGE.tazpkg
2146 else
2147 check_for_installed_package $ROOT
2148 fi
2149 cd $CACHE_DIR
2150 if [ -f "$PACKAGE.tazpkg" ]; then
2151 echo "$PACKAGE already in the cache : $CACHE_DIR"
2152 # Check package download was finished
2153 tail -c 2k $PACKAGE.tazpkg | grep -q 00000000TRAILER || {
2154 echo "Continue $PACKAGE download"
2155 download $PACKAGE.tazpkg
2157 else
2158 echo ""
2159 download $PACKAGE.tazpkg
2160 fi
2161 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
2162 install_package $ROOT
2163 [ "$AUTOEXEC" != "no" ] && $PACKAGE $ROOT
2164 ;;
2165 clean-cache)
2166 # Remove all downloaded packages.
2168 check_root
2169 files=`ls -1 $CACHE_DIR | wc -l`
2170 echo ""
2171 echo -e "\033[1mClean cache :\033[0m $CACHE_DIR"
2172 echo "================================================================================"
2173 echo -n "Cleaning cache directory..."
2174 rm -rf $CACHE_DIR/*
2175 status
2176 echo "================================================================================"
2177 echo "$files file(s) removed from cache."
2178 echo ""
2179 ;;
2180 list-undigest)
2181 # list undigest URLs.
2183 if [ "$2" = "--box" ]; then
2184 for i in $LOCALSTATE/undigest/*/mirror; do
2185 [ -f $i ] || continue
2186 echo "$(basename $(dirname $i))|$(cat $i)"
2187 done
2188 else
2189 echo ""
2190 echo -e "\033[1mCurrent undigest(s)\033[0m"
2191 echo "================================================================================"
2192 for i in $LOCALSTATE/undigest/*/mirror; do
2193 if [ ! -f $i ]; then
2194 echo "No undigest mirror found."
2195 exit 1
2196 fi
2197 echo "$(basename $(dirname $i)) $(cat $i)"
2198 done
2199 echo ""
2200 fi
2201 ;;
2202 remove-undigest)
2203 # remove undigest URL.
2205 check_root
2206 if [ -d $LOCALSTATE/undigest/$2 ]; then
2207 echo -n "Remove $2 undigest (y/N) ? "; read anser
2208 if [ "$anser" = "y" ]; then
2209 echo -n "Removing $2 undigest..."
2210 rm -rf $LOCALSTATE/undigest/$2
2211 status
2212 rmdir $LOCALSTATE/undigest 2> /dev/null
2213 fi
2214 else
2215 echo "Undigest $2 not found"
2216 fi
2217 ;;
2218 add-undigest|setup-undigest)
2219 # Add undigest URL.
2221 check_root
2222 undigest=$2
2223 [ -d $LOCALSTATE/undigest ] || mkdir $LOCALSTATE/undigest
2224 if [ -z "$undigest" ]; then
2225 i=1
2226 while [ -d $LOCALSTATE/undigest/$i ]; do
2227 i=$(($i+1))
2228 done
2229 undigest=$i
2230 fi
2231 if [ ! -d $LOCALSTATE/undigest/$undigest ]; then
2232 echo "Creating new undigest $undigest."
2233 mkdir $LOCALSTATE/undigest/$undigest
2234 fi
2235 setup_mirror $LOCALSTATE/undigest/$undigest $3
2236 ;;
2237 setup-mirror)
2238 # Change mirror URL.
2240 check_root
2241 setup_mirror $LOCALSTATE $2
2242 ;;
2243 reconfigure)
2244 # Replay post_install from receipt
2246 check_for_package_on_cmdline
2247 check_root
2248 ROOT=""
2249 while [ -n "$3" ]; do
2250 case "$3" in
2251 --root=*)
2252 ROOT="${3#--root=}/"
2253 ;;
2254 *) shift 2
2255 echo -e "\nUnknown option $*.\n"
2256 exit 1
2257 ;;
2258 esac
2259 shift
2260 done
2261 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
2262 check_for_receipt $ROOT
2263 # Check for post_install
2264 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
2265 . $ROOT$INSTALLED/$PACKAGE/receipt
2266 post_install $ROOT
2267 # Log this activity
2268 [ -n "$ROOT" ] || log Reconfigured
2269 else
2270 echo -e "\nNothing to do for $PACKAGE."
2271 fi
2272 else
2273 echo -e "\npackage $PACKAGE is not installed."
2274 echo -e "Install package with 'tazpkg install' or 'tazpkg get-install'\n"
2275 fi
2276 ;;
2277 shell)
2278 # Tazpkg SHell
2280 if test $(id -u) = 0 ; then
2281 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
2282 else
2283 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
2284 fi
2285 if [ ! "$2" = "--noheader" ]; then
2286 clear
2287 echo ""
2288 echo -e "\033[1mTazpkg SHell.\033[0m"
2289 echo "================================================================================"
2290 echo "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
2291 echo ""
2292 fi
2293 while true
2294 do
2295 echo -en "$PROMPT"; read cmd
2296 case $cmd in
2297 q|quit)
2298 break ;;
2299 shell)
2300 echo "You are already running a Tazpkg SHell." ;;
2301 su)
2302 su -c 'exec tazpkg shell --noheader' && break ;;
2303 "")
2304 continue ;;
2305 *)
2306 tazpkg $cmd ;;
2307 esac
2308 done
2309 ;;
2310 depends)
2311 # Display dependencies tree
2312 cd $INSTALLED
2313 ALL_DEPS=""
2314 if [ -f $2/receipt ]; then
2315 dep_scan $2 ""
2316 fi
2317 ;;
2318 rdepends)
2319 # Display reverse dependencies tree
2320 cd $INSTALLED
2321 ALL_DEPS=""
2322 if [ -f $2/receipt ]; then
2323 rdep_scan $2
2324 fi
2325 ;;
2326 convert)
2327 # convert misc package format to .tazpkg
2328 check_for_package_file
2329 case "$PACKAGE_FILE" in
2330 *.deb|*.udeb)
2331 convert_deb;;
2332 *.rpm)
2333 convert_rpm;;
2334 *)
2335 echo "Unsupported format";;
2336 esac
2337 ;;
2338 link)
2339 # link a package from another slitaz installation
2340 PACKAGE=$2
2341 if [ ! -d "$TARGET_DIR" -o \
2342 ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
2343 cat <<EOT
2344 usage: tazpkg link package_name slitaz_root
2345 example: 'tazpkg link openoffice /mnt' will heat less than 100k in
2346 your ram running system.
2347 EOT
2348 exit 1
2349 fi
2350 if [ -e "$INSTALLED/$PACKAGE" ]; then
2351 echo "$PACKAGE is already installed."
2352 exit 1
2353 fi
2354 ln -s $TARGET_DIR$INSTALLED/$PACKAGE $INSTALLED
2355 DEPENDS="$(. $INSTALLED/$PACKAGE/receipt ; echo $DEPENDS)"
2356 MISSING=""
2357 for i in $DEPENDS; do
2358 [ -e $INSTALLED/$i ] && continue
2359 MISSING="$MISSING$i "
2360 echo "Missing : $i"
2361 done
2362 if [ -n "$MISSING" ]; then
2363 echo ""
2364 echo -n "Link all missing dependencies (y/N) ? "; read answer
2365 echo ""
2366 if [ "$answer" = "y" ]; then
2367 for i in $MISSING; do
2368 tazpkg link $i $TARGET_DIR
2369 done
2370 else
2371 echo -e "\nLeaving dependencies for $PACKAGE unsolved."
2372 echo -e "The package is installed but will probably not work.\n"
2373 fi
2374 fi
2375 . $INSTALLED/$PACKAGE/receipt
2376 if grep -q ^pre_install $INSTALLED/$PACKAGE/receipt; then
2377 pre_install
2378 fi
2379 while read path; do
2380 [ -e $path ] && continue
2381 while true; do
2382 dir=$(dirname $path)
2383 [ -e $dir ] && break
2384 path=$dir
2385 done
2386 ln -s $TARGET_DIR$path $dir
2387 done < $INSTALLED/$PACKAGE/files.list
2388 if grep -q ^post_install $INSTALLED/$PACKAGE/receipt; then
2389 post_install
2390 fi
2391 ;;
2392 usage|*)
2393 # Print a short help or give usage for an unknown or empty command.
2395 usage
2396 ;;
2397 esac
2399 exit 0