tazpkg view tazpkg @ rev 269

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