tazpkg view tazpkg @ rev 278

Fix tazpkg convert tgz (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Jul 18 10:47:39 2009 +0200 (2009-07-18)
parents 4ad99a25a6cc
children 7182c6b184c5
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 packages.
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 one or 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 deb/rpm/tgz 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 and file list on upgrade
395 cp $ROOT$INSTALLED/$PACKAGE/modifiers \
396 $ROOT$INSTALLED/$PACKAGE/files.list $TMP_DIR 2> /dev/null
397 rm -rf $ROOT$INSTALLED/$PACKAGE 2> /dev/null
398 # Make the installed package data dir to store
399 # the receipt and the files list.
400 mkdir -p $ROOT$INSTALLED/$PACKAGE
401 cp $TMP_DIR/modifiers $ROOT$INSTALLED/$PACKAGE 2> /dev/null
402 cp $TMP_DIR/files.list $ROOT$INSTALLED/$PACKAGE 2> /dev/null
403 rm -rf $TMP_DIR 2> /dev/null
404 sed -i "/ $(basename $PACKAGE_FILE)$/d" \
405 $ROOT$LOCALSTATE/installed.md5 2> /dev/null
406 cd $(dirname $PACKAGE_FILE)
407 md5sum $(basename $PACKAGE_FILE) >> $ROOT$LOCALSTATE/installed.md5
408 )
409 # Resolve package deps.
410 check_for_deps $ROOT
411 if [ ! "$MISSING_PACKAGE" = "" ]; then
412 install_deps $ROOT
413 fi
414 mkdir -p $TMP_DIR
415 [ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> $INSTALL_LIST-processed
416 echo ""
417 echo -e "\033[1mInstallation of :\033[0m $PACKAGE"
418 echo "================================================================================"
419 echo -n "Copying $PACKAGE... "
420 cp $PACKAGE_FILE $TMP_DIR
421 status
422 cd $TMP_DIR
423 extract_package
424 SELF_INSTALL=0
425 EXTRAVERSION=""
426 CONFIG_FILES=""
427 # Include temporary receipt to get the right variables.
428 . $PWD/receipt
429 cd $ROOT$INSTALLED
430 if [ $SELF_INSTALL -ne 0 -a -n "$ROOT" ]; then
431 echo -n "Checking post install dependencies... "
432 [ -f $INSTALLED/$PACKAGE/receipt ]
433 if ! status; then
434 echo "Please run 'tazpkg install $PACKAGE_FILE' in / and retry."
435 rm -rf $TMP_DIR
436 exit 1
437 fi
438 fi
439 # Get files to remove if upgrading
440 if [ -f $PACKAGE/files.list ]; then
441 while read file; do
442 grep -q "^$file$" $TMP_DIR/files.list && continue
443 for i in $(cat $PACKAGE/modifiers 2> /dev/null ;
444 grep -sl $PACKAGE */modifiers | cut -d/ -f1 ); do
445 grep -q "^$file$" $i/files.list && continue 2
446 done
447 echo $file
448 done < $PACKAGE/files.list > $TMP_DIR/files2remove.list
449 fi
450 # Remember modified packages
451 for i in $(grep -v '\[' files.list); do
452 [ -e "$ROOT$i" ] || continue
453 [ -d "$ROOT$i" ] && continue
454 for j in $(grep -l "^$i$" */files.list); do
455 local dir
456 dir=$(dirname $j)
457 [ "$j" = "$PACKAGE/files.list" ] && continue
458 if grep -qs ^$dir$ $PACKAGE/modifiers; then
459 # Do not overload an overloaded file !
460 rm $TMP_DIR$i 2> /dev/null
461 continue
462 fi
463 grep -qs ^$PACKAGE$ $dir/modifiers && continue
464 if [ -s "$dir/volatile.cpio.gz" ]; then
465 # We can modify backed up files
466 zcat $dir/volatile.cpio.gz | \
467 cpio -t 2> /dev/null | \
468 grep -q "^${i#/}$" && continue
469 fi
470 echo "$PACKAGE" >> $dir/modifiers
471 done
472 done
473 cd $TMP_DIR
474 cp receipt files.list $ROOT$INSTALLED/$PACKAGE
475 # Copy the description if found.
476 if [ -f "description.txt" ]; then
477 cp description.txt $ROOT$INSTALLED/$PACKAGE
478 fi
479 # Copy the md5sum if found.
480 if [ -f "md5sum" ]; then
481 cp md5sum $ROOT$INSTALLED/$PACKAGE
482 fi
483 # Pre install commands.
484 if grep -q ^pre_install $ROOT$INSTALLED/$PACKAGE/receipt; then
485 pre_install $ROOT
486 fi
487 if [ -n "$CONFIG_FILES" ]; then
488 # save 'official' configuration files
489 echo -n "Save configuration files for $PACKAGE... "
490 for i in $CONFIG_FILES; do
491 ( cd fs ; find ${i#/} -type f )
492 done | ( cd fs ; cpio -o -H newc | gzip -9 ) > \
493 $ROOT$INSTALLED/$PACKAGE/volatile.cpio.gz
494 # keep user configuration files
495 for i in $CONFIG_FILES; do
496 ( cd fs ; find ${i#/} -type f )
497 done | while read i; do
498 [ -e $ROOT/$i ] || continue
499 cp -a $ROOT/$i fs/$i
500 done
501 status
502 fi
503 echo -n "Installing $PACKAGE... "
504 cp -a fs/* $ROOT/
505 status
506 if [ -s files2remove.list ]; then
507 echo -n "Removing old $PACKAGE... "
508 while read file; do
509 rm -f $ROOT$file
510 dir=$(dirname $ROOT$file)
511 while true; do
512 rmdir $dir 2> /dev/null || { true; break; }
513 dir=$(dirname $dir)
514 done
515 done < files2remove.list
516 status
517 fi
518 # Remove the temporary random directory.
519 echo -n "Removing all tmp files... "
520 cd .. && rm -rf $TMP_DIR
521 status
522 # Post install commands.
523 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
524 post_install $ROOT
525 fi
526 cd $TOP_DIR
527 echo "================================================================================"
528 echo "$PACKAGE ($VERSION$EXTRAVERSION) is installed."
529 echo ""
530 # Log this activity
531 [ -n "$ROOT" ] || log Installed
532 }
534 # Check for loop in deps tree.
535 check_for_deps_loop()
536 {
537 local list
538 local pkg
539 local deps
540 pkg=$1
541 shift
542 [ -n "$1" ] || return
543 list=""
544 # Filter out already processed deps
545 for i in $@; do
546 case " $ALL_DEPS" in
547 *\ $i\ *);;
548 *) list="$list $i";;
549 esac
550 done
551 ALL_DEPS="$ALL_DEPS$list "
552 for i in $list; do
553 [ -f $i/receipt ] || continue
554 deps="$(DEPENDS=""; . $i/receipt; echo $DEPENDS)"
555 case " $deps " in
556 *\ $pkg\ *) echo -e "$MSG $i"; MSG="";;
557 *) check_for_deps_loop $pkg $deps;;
558 esac
559 done
560 }
562 # Check for missing deps listed in a receipt packages.
563 check_for_deps()
564 {
565 local saved;
566 saved=$PACKAGE
567 mkdir -p $TMP_DIR
568 ( cd $TMP_DIR ; cpio -i receipt > /dev/null ) < $PACKAGE_FILE
569 . $TMP_DIR/receipt
570 PACKAGE=$saved
571 rm -rf $TMP_DIR
572 for pkgorg in $DEPENDS
573 do
574 i=$(equivalent_pkg $pkgorg $1)
575 if [ ! -d "$1$INSTALLED/$i" ]; then
576 MISSING_PACKAGE=$i
577 deps=$(($deps+1))
578 elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
579 echo -e "$WARNING Dependency loop between $PACKAGE and $i."
580 fi
581 done
582 if [ ! "$MISSING_PACKAGE" = "" ]; then
583 echo -e "\033[1mTracking dependencies for :\033[0m $PACKAGE"
584 echo "================================================================================"
585 for pkgorg in $DEPENDS
586 do
587 i=$(equivalent_pkg $pkgorg $1)
588 if [ ! -d "$1$INSTALLED/$i" ]; then
589 MISSING_PACKAGE=$i
590 echo "Missing : $MISSING_PACKAGE"
591 fi
592 done
593 echo "================================================================================"
594 echo "$deps missing package(s) to install."
595 fi
596 }
598 # Install all missing deps. First ask user then install all missing deps
599 # from local dir, cdrom, media or from the mirror. In case we want to
600 # install packages from local, we need a packages.list to find the version.
601 install_deps()
602 {
603 local root
604 root=""
605 [ -n "$1" ] && root="--root=$1"
606 echo ""
607 echo -n "Install all missing dependencies (y/N) ? "; read anser
608 echo ""
609 if [ "$anser" = "y" ]; then
610 for pkgorg in $DEPENDS
611 do
612 pkg=$(equivalent_pkg $pkgorg $1)
613 if [ ! -d "$1$INSTALLED/$pkg" ]; then
614 local list
615 list="$INSTALL_LIST"
616 [ -n "$list" ] || list="$TOP_DIR/packages.list"
617 # We can install packages from a local dir by greping
618 # the TAZPKG_BASENAME in the local packages.list.
619 found=0
620 if [ -f "$list" ]; then
621 echo "Checking if $pkg exists in local list... "
622 mkdir $TMP_DIR
623 for i in $pkg-*.tazpkg; do
624 [ -f $i ] || continue
625 ( cd $TMP_DIR ; cpio -i receipt > /dev/null) < $i
626 [ "$(. $TMP_DIR/receipt; echo $PACKAGE)" = "$pkg" ] || continue
627 if grep -q ^$(package_fullname_in_dir $TMP_DIR).tazpkg$ $list
628 then
629 found=1
630 tazpkg install $i $root --list=$list
631 break
632 fi
633 done
634 rm -rf $TMP_DIR
635 fi
636 # Install deps from the mirror.
637 if [ $found -eq 0 ]; then
638 if [ ! -f "$LOCALSTATE/packages.list" ]; then
639 tazpkg recharge
640 fi
641 tazpkg get-install $pkg $root
642 fi
643 fi
644 done
645 else
646 echo -e "\nLeaving dependencies for $PACKAGE unsolved."
647 echo -e "The package is installed but will probably not work.\n"
648 fi
649 }
651 # xHTML packages list header.
652 xhtml_header()
653 {
654 cat > $XHTML_LIST << _EOT_
655 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
656 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
657 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
658 <head>
659 <title>Installed packages list</title>
660 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
661 <meta name="modified" content="$DATE" />
662 <meta name="generator" content="Tazpkg" />
663 <style type="text/css"><!--
664 body { font: 12px sans-serif, vernada, arial; margin: 0; }
665 #header { background: #f0ba08; color: black; height: 50px;
666 border-top: 1px solid black; border-bottom: 1px solid black; }
667 #content { margin: 0px 50px 26px 50px; }
668 #footer { border-top: 1px solid black; padding-top: 10px;}
669 h1 { margin: 14px 0px 0px 16px; }
670 pre { padding-left: 5px; }
671 hr { color: white; background: white; height: 1px; border: 0; }
672 --></style>
673 </head>
674 <body bgcolor="#ffffff">
675 <div id="header">
676 <h1><font color="#3e1220">Installed packages list</font></h1>
677 </div>
678 <hr />
679 <!-- Start content -->
680 <div id="content">
682 <p>
683 _packages_ packages installed - List generated on : $DATE
684 <p>
686 _EOT_
687 }
689 # xHTML content with packages info.
690 xhtml_pkg_info()
691 {
692 cat >> $XHTML_LIST << _EOT_
693 <h3>$PACKAGE</h3>
694 <pre>
695 Version : $VERSION$EXTRAVERSION
696 Short desc : $SHORT_DESC
697 Web site : <a href="$WEB_SITE">$WEB_SITE</a>
698 </pre>
700 _EOT_
701 }
703 # xHTML packages list footer.
704 xhtml_footer()
705 {
706 cat >> $XHTML_LIST << _EOT_
707 <hr />
708 <p id="footer">
709 $packages packages installed - List generated on : $DATE
710 </p>
712 <!-- End content -->
713 </div>
714 </body>
715 </html>
716 _EOT_
717 }
719 # Search pattern in installed packages.
720 search_in_installed_packages()
721 {
722 echo "Installed packages"
723 echo "================================================================================"
724 list=`ls -1 $INSTALLED | grep -i "$PATTERN"`
725 for pkg in $list
726 do
727 EXTRAVERSION=""
728 [ -f $INSTALLED/$pkg/receipt ] || continue
729 . $INSTALLED/$pkg/receipt
730 echo -n "$PACKAGE "
731 echo -en "\033[24G $VERSION$EXTRAVERSION"
732 echo -e "\033[42G $CATEGORY"
733 packages=$(($packages+1))
734 done
735 # Set correct ending messages.
736 if [ "$packages" = "" ]; then
737 echo "0 installed packages found for : $PATTERN"
738 echo ""
739 else
740 echo "================================================================================"
741 echo "$packages installed package(s) found for : $PATTERN"
742 echo ""
743 fi
744 }
746 # Search in packages.list for available pkgs.
747 search_in_packages_list()
748 {
749 echo "Available packages name-version"
750 echo "================================================================================"
751 packages=0
752 for i in $LOCALSTATE/packages.list $LOCALSTATE/undigest/*/packages.list; do
753 grep -is "$PATTERN" $i
754 packages=$(($packages + `grep -is "$PATTERN" $i | wc -l`))
755 done
756 if [ ! -f "$LOCALSTATE/packages.list" ]; then
757 echo -e "
758 No 'packages.list' found to check for mirrored packages. For more results,
759 please run 'tazpkg recharge' once as root before searching.\n"
760 fi
761 if [ "$packages" = "0" ]; then
762 echo "0 available packages found for : $PATTERN"
763 echo ""
764 else
765 echo "================================================================================"
766 echo "$packages available package(s) found for : $PATTERN"
767 echo ""
768 fi
769 }
771 # search --mirror: Search in packages.txt for available pkgs and give more
772 # info than --list or default.
773 search_in_packages_txt()
774 {
775 echo "Matching packages name with version and desc"
776 echo "================================================================================"
777 packages=0
778 for i in $LOCALSTATE/packages.txt $LOCALSTATE/undigest/*/packages.txt; do
779 grep -is -A 2 "^$PATTERN" $i
780 packages=$(($packages + `grep -is "^$PATTERN" $i | wc -l`))
781 done
782 if [ ! -f "$LOCALSTATE/packages.txt" ]; then
783 echo -e "
784 No 'packages.txt' found to check for mirrored packages. For more results,
785 please run 'tazpkg recharge' once as root before searching.\n"
786 fi
787 if [ "$packages" = "0" ]; then
788 echo "0 available packages found for : $PATTERN"
789 echo ""
790 else
791 echo "================================================================================"
792 echo "$packages available package(s) found for : $PATTERN"
793 echo ""
794 fi
795 }
797 # Install package-list from a flavor
798 install_flavor()
799 {
800 check_root
801 FLAVOR=$1
802 ARG=$2
803 mkdir -p $TMP_DIR
804 [ -f $FLAVOR.flavor ] && cp $FLAVOR.flavor $TMP_DIR
805 cd $TMP_DIR
806 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
807 zcat $FLAVOR.flavor | cpio -i 2>/dev/null
808 while read file; do
809 for pkg in $(ls -d $INSTALLED/${file%%-*}*); do
810 [ -f $pkg/receipt ] || continue
811 EXTRAVERSION=""
812 . $pkg/receipt
813 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && break
814 done
815 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && continue
816 cd $CACHE_DIR
817 download $file.tazpkg
818 cd $TMP_DIR
819 tazpkg install $CACHE_DIR/$file.tazpkg --forced
820 done < $FLAVOR.pkglist
821 [ -f $FLAVOR.nonfree ] && while read pkg; do
822 [ -d $INSTALLED/$pkg ] || continue
823 [ -d $INSTALLED/get-$pkg ] && tazpkg get-install get-$pkg
824 get-$pkg
825 done < $FLAVOR.nonfree
826 [ "$ARG" == "--purge" ] && for pkg in $(ls $INSTALLED); do
827 [ -f $INSTALLED/$pkg/receipt ] || continue
828 EXTRAVERSION=""
829 . $INSTALLED/$pkg/receipt
830 grep -q ^$PACKAGE-$VERSION$EXTRAVERSION$ $FLAVOR.pkglist && continue
831 grep -qs ^$PACKAGE$ $FLAVOR.nonfree && continue
832 tazpkg remove $PACKAGE
833 done
834 else
835 echo "Can't find flavor $FLAVOR Abort."
836 fi
837 cd $TOP_DIR
838 rm -rf $TMP_DIR
839 }
841 # Update mirror urls
842 setup_mirror()
843 {
844 # Backup old list.
845 if [ -f "$1/mirror" ]; then
846 cp -f $1/mirror $1/mirror.bak
847 fi
848 echo ""
849 echo -e "\033[1mCurrent mirror(s)\033[0m"
850 echo "================================================================================"
851 echo " `cat $1/mirror 2> /dev/null`"
852 echo "
853 Please enter URL of the new mirror (http, ftp or local path). You must specify
854 the complete address to the directory of the packages and packages.list file."
855 echo ""
856 echo -n "New mirror(s) URL : "
857 NEW_MIRROR_URL=$2
858 if [ -n "$NEW_MIRROR_URL" ]; then
859 echo $NEW_MIRROR_URL
860 else
861 read NEW_MIRROR_URL
862 fi
863 if [ "$NEW_MIRROR_URL" = "" ]; then
864 echo "Nothing has been changed."
865 else
866 echo "Setting mirror(s) to : $NEW_MIRROR_URL"
867 rm -f $1/mirror
868 for i in $NEW_MIRROR_URL; do
869 echo "$i" >> $1/mirror
870 done
871 fi
872 echo ""
873 }
875 # recursive dependencies scan
876 dep_scan()
877 {
878 for i in $1; do
879 case " $ALL_DEPS " in
880 *\ $i\ *) continue;;
881 esac
882 ALL_DEPS="$ALL_DEPS $i"
883 [ -n "$2" ] && echo "$2$i"
884 [ -f $i/receipt ] || continue
885 DEPENDS=""
886 . $i/receipt
887 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
888 done
889 }
891 # recursive reverse dependencies scan
892 rdep_scan()
893 {
894 SEARCH=$1
896 for i in * ; do
897 DEPENDS=""
898 . $i/receipt
899 echo "$i $(echo $DEPENDS)"
900 done | awk -v search=$SEARCH '
901 function show_deps(deps, all_deps, pkg, space)
902 {
903 if (all_deps[pkg] == 1) return
904 all_deps[pkg] = 1
905 if (space != "") printf "%s%s\n",space,pkg
906 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
907 show_deps(deps, all_deps, mydeps[i]," " space)
908 }
909 }
911 {
912 all_deps[$1] = 0
913 for (i = 2; i <= NF; i++)
914 deps[$i] = deps[$i] " " $1
915 }
917 END {
918 show_deps(deps, all_deps, search, "")
919 }
920 '
921 }
923 # Check for ELF file
924 is_elf()
925 {
926 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
927 }
929 # Print shared library dependencies
930 ldd()
931 {
932 LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $1 2> /dev/null
933 }
935 # search dependencies for files in $TMP_DIR/$file/fs
936 find_depends()
937 {
938 DEFAULT_DEPENDS="glibc-base gcc-lib-base"
940 [ -f /var/lib/tazpkg/files.list.lzma ] || tazpkg recharge
941 for i in /var/lib/tazpkg/files.list.lzma \
942 /var/lib/tazpkg/undigest/*/files.list.lzma ; do
943 [ -f $i ] && lzma d $i -so >> $TMP_DIR/files.list
944 done
945 find $TMP_DIR/$file/fs -type f | while read file ; do
946 is_elf $file || continue
947 case "$file" in
948 *.o|*.ko|*.ko.gz) continue;;
949 esac
950 ldd $file | while read lib rem; do
951 case "$lib" in
952 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
953 continue;;
954 esac
955 for dep in $(grep $lib files.list | cut -d: -f1); do
956 case " $DEFAULT_DEPENDS $ALL_DEPENDS " in
957 *\ $dep\ *) continue 2;;
958 esac
959 done
960 ALL_DEPENDS="$ALL_DEPENDS $dep"
961 if [ -n "$dep" ]; then
962 echo -n " $dep"
963 else
964 echo "$lib" >> $TMP_DIR/unresolved
965 fi
966 done
967 done
968 }
970 show_unresolved_lib()
971 {
972 if [ -s $TMP_DIR/unresolved ]; then
973 echo "BUGS=\"No dependency for $(cat $TMP_DIR/unresolved)\"" >> $1
974 for lib in $(cat $TMP_DIR/unresolved) ; do
975 echo -e "$WARNING: unknown dependency for $lib"
976 done
977 fi
978 }
980 # convert a .tgz package to .tazpkg
981 convert_tgz()
982 {
983 package=$(basename $PACKAGE_FILE)
984 IFS='-'
985 set -- $package
986 unset IFS
987 package=$1
988 version=$2
989 file="$package-$version"
990 mkdir -p $TMP_DIR/$file/fs
991 tar xzf $PACKAGE_FILE -C $TMP_DIR/$file/fs
992 cd $TMP_DIR
993 if [ -d $file/fs/install ]; then
994 descrip=$(grep ^$package $file/fs/install/slack-desc | \
995 head -1 | sed 's/.*(\(.*\)).*/\1/')
996 cat > $file/receipt <<EOT
997 # SliTaz package receipt.
998 # generated by tazpkg from slackware package $(basename $PACKAGE_FILE)
999 PACKAGE="$package"
1000 VERSION="$version"
1001 CATEGORY="misc"
1002 SHORT_DESC="$descrip"
1003 WEB_SITE="http://www.slackware.com/packages/"
1004 MAINTAINER="nobody@slitaz.org"
1005 DEPENDS="$(find_depends)"
1006 EOT
1007 show_unresolved_lib $file/receipt
1008 [ -f $file/fs/install/doinst.sh ] && cat >> $file/receipt <<EOM
1010 post_install()
1012 chroot \$1/ sh - << EOT
1013 cd /
1014 $(cat $file/fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
1015 EOT
1017 EOM
1018 grep ^$package $file/fs/install/slack-desc | \
1019 sed "s/^$package://" > $file/description.txt
1020 rm -rf $file/fs/install
1021 tazpkg pack $file
1022 mv $file.tazpkg $TOP_DIR
1023 else
1024 echo "$PACKAGE_FILE does not look like a Slackware package !"
1025 fi
1026 cd $TOP_DIR
1027 rm -rf $TMP_DIR
1030 # convert a .deb package to .tazpkg
1031 convert_deb()
1033 mkdir -p $TMP_DIR
1034 dpkg-deb -e $PACKAGE_FILE $TMP_DIR
1035 package=$(grep '^ *Package' $TMP_DIR/control)
1036 package=$(echo ${package##*:})
1037 version=$(grep '^ *Version' $TMP_DIR/control)
1038 version=$(echo ${version##*:})
1039 descrip=$(grep '^ *Description' $TMP_DIR/control)
1040 descrip=$(echo ${descrip##*:})
1041 file="$package-$version"
1042 mkdir -p $TMP_DIR/$file/fs/
1043 dpkg-deb -x $PACKAGE_FILE $TMP_DIR/$file/fs
1044 cd $TMP_DIR
1045 cat > $file/receipt <<EOT
1046 # SliTaz package receipt.
1047 # generated by tazpkg from debian package $(basename $PACKAGE_FILE)
1048 PACKAGE="$package"
1049 VERSION="$version"
1050 CATEGORY="misc"
1051 SHORT_DESC="$descrip"
1052 WEB_SITE="http://packages.debian.org/search?keywords=$package"
1053 MAINTAINER="nobody@slitaz.org"
1054 DEPENDS="$(find_depends)"
1055 EOT
1056 show_unresolved_lib $file/receipt
1057 awk '
1059 if (/^ / && show) print substr($0,2);
1060 else show=0;
1061 if (/^Description/) show=1;
1062 }' < $TMP_DIR/control > $file/description.txt
1063 sed -i 's/^\.$//' $file/description.txt
1064 tazpkg pack $file
1065 mv $file.tazpkg $TOP_DIR
1066 cd $TOP_DIR
1067 rm -rf $TMP_DIR
1070 # convert a .rpm package to .tazpkg
1071 convert_rpm()
1073 mkdir -p $TMP_DIR
1074 cp $PACKAGE_FILE $TMP_DIR
1075 PACKAGE_FILE=$TMP_DIR/$(basename $PACKAGE_FILE)
1076 rpm -qip $PACKAGE_FILE | awk -v pkg=$(basename $PACKAGE_FILE) '
1077 BEGIN {
1078 goturl=0;
1079 printf "# Taz package receipt.\n";
1080 printf "# generated by tazpkg from rpm package %s\n",pkg;
1083 if (/^Name/) { name=$3; printf "PACKAGE=\"%s\"\n",$3; }
1084 if (/^Version/) printf "VERSION=\"%s-",$3;
1085 if (/^Release/) printf "%s\"\n",$3;
1086 if (/^Summary/) printf "SHORT_DESC=\"%s\"\n",substr($0,15);
1087 if (/^URL/) { goturl=1; printf "WEB_SITE=\"%s\"\n",$3; }
1089 END {
1090 if (goturl == 0)
1091 printf "WEB_SITE=\"http://rpmfind.net/linux/rpm2html/search.php?query=%s\"\n",name;
1092 printf "CATEGORY=\"misc\"\n";
1093 printf "MAINTAINER=\"nobody@slitaz.org\"\n";
1095 ' > $TMP_DIR/receipt
1096 . $TMP_DIR/receipt
1097 file=$PACKAGE-$VERSION
1098 mkdir -p $TMP_DIR/$file/fs/
1099 mv $TMP_DIR/receipt $TMP_DIR/$file
1100 rpm -qip $PACKAGE_FILE | awk '
1101 DEGIN { show=0 }
1103 if (show) print;
1104 if (/^Description/) show=1;
1106 ' > $TMP_DIR/$file/description.txt
1107 cd $TMP_DIR/$file/fs/
1108 rpm2cpio $PACKAGE_FILE | cpio -idm
1109 cd ../..
1110 echo "DEPENDS=\"$(find_depends)\"" >> $TMP_DIR/$file/receipt
1111 show_unresolved_lib $TMP_DIR/$file/receipt
1112 tazpkg pack $file
1113 mv $file.tazpkg $TOP_DIR
1114 cd $TOP_DIR
1115 rm -rf $TMP_DIR
1118 ###################
1119 # Tazpkg commands #
1120 ###################
1122 case "$COMMAND" in
1123 list)
1124 # List all installed packages or a specific category.
1126 if [ "$2" = "blocked" ]; then
1127 echo ""
1128 echo -e "\033[1mBlocked packages\033[0m"
1129 echo "================================================================================"
1130 if [ -s "$BLOCKED" ];then
1131 cat $BLOCKED
1132 echo ""
1133 else
1134 echo -e "No blocked packages found.\n"
1135 fi
1136 exit 0
1137 fi
1138 # Display the list of categories.
1139 if [ "$2" = "cat" -o "$2" = "categories" ]; then
1140 echo ""
1141 echo -e "\033[1mPackages categories :\033[0m"
1142 echo "================================================================================"
1143 for i in $CATEGORIES
1144 do
1145 echo $i
1146 categories=$(($categories+1))
1147 done
1148 echo "================================================================================"
1149 echo "$categories categories"
1150 echo ""
1151 exit 0
1152 fi
1153 # Check for an asked category.
1154 if [ -n "$2" ]; then
1155 ASKED_CATEGORY=$2
1156 echo ""
1157 echo -e "\033[1mInstalled packages of category :\033[0m $ASKED_CATEGORY"
1158 echo "================================================================================"
1159 for pkg in $INSTALLED/*
1160 do
1161 [ -f $pkg/receipt ] || continue
1162 EXTRAVERSION=""
1163 . $pkg/receipt
1164 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
1165 echo -n "$PACKAGE"
1166 echo -e "\033[24G $VERSION$EXTRAVERSION"
1167 packages=$(($packages+1))
1168 fi
1169 done
1170 echo "================================================================================"
1171 echo -e "$packages packages installed of category $ASKED_CATEGORY."
1172 echo ""
1173 else
1174 # By default list all packages and versions.
1175 echo ""
1176 echo -e "\033[1mList of all installed packages\033[0m"
1177 echo "================================================================================"
1178 for pkg in $INSTALLED/*
1179 do
1180 [ -f $pkg/receipt ] || continue
1181 EXTRAVERSION=""
1182 . $pkg/receipt
1183 echo -n "$PACKAGE"
1184 echo -en "\033[24G $VERSION$EXTRAVERSION"
1185 echo -e "\033[42G $CATEGORY"
1186 packages=$(($packages+1))
1187 done
1188 echo "================================================================================"
1189 echo "$packages packages installed."
1190 echo ""
1191 fi
1192 ;;
1193 xhtml-list)
1194 # Get info in receipts and build list.
1195 DATE=`date +%Y-%m-%d\ \%H:%M:%S`
1196 if [ -n "$2" ]; then
1197 XHTML_LIST=$2
1198 else
1199 XHTML_LIST=installed-packages.html
1200 fi
1201 echo ""
1202 echo -e "\033[1mCreating xHTML list of installed packages\033[0m"
1203 echo "================================================================================"
1204 echo -n "Generating xHTML header..."
1205 xhtml_header
1206 status
1207 # Packages
1208 echo -n "Creating packages information..."
1209 for pkg in $INSTALLED/*
1210 do
1211 [ -f $pkg/receipt ] || continue
1212 EXTRAVERSION=""
1213 . $pkg/receipt
1214 xhtml_pkg_info
1215 packages=$(($packages+1))
1216 done
1217 status
1218 echo -n "Generating xHTML footer..."
1219 xhtml_footer
1220 status
1221 # sed pkgs nb in header.
1222 sed -i s/'_packages_'/"$packages"/ $XHTML_LIST
1223 echo "================================================================================"
1224 echo "$XHTML_LIST created - $packages packages."
1225 echo ""
1226 ;;
1227 list-mirror)
1228 # List all available packages on the mirror. Option --diff displays
1229 # last mirrored packages diff (see recharge).
1230 check_for_packages_list
1231 case $2 in
1232 --diff)
1233 if [ -f "$LOCALSTATE/packages.diff" ]; then
1234 echo ""
1235 echo -e "\033[1mMirrored packages diff\033[0m"
1236 echo "================================================================================"
1237 cat $LOCALSTATE/packages.diff
1238 echo "================================================================================"
1239 pkgs=`cat $LOCALSTATE/packages.diff | wc -l`
1240 echo "$pkgs new packages listed on the mirror."
1241 echo ""
1242 else
1243 echo -e "\nUnable to list anything, no packages.diff found."
1244 echo -e "Recharge your current list to create a first diff.\n"
1245 fi && exit 0 ;;
1246 --text|--txt)
1247 echo ""
1248 echo -e "\033[1mList of available packages on the mirror\033[0m"
1249 echo "================================================================================"
1250 cat $LOCALSTATE/packages.txt ;;
1251 --raw|*)
1252 echo ""
1253 echo -e "\033[1mList of available packages on the mirror\033[0m"
1254 echo "================================================================================"
1255 cat $LOCALSTATE/packages.list ;;
1256 esac
1257 echo "================================================================================"
1258 pkgs=`cat $LOCALSTATE/packages.list | wc -l`
1259 echo "$pkgs packages in the last recharged list."
1260 echo ""
1261 ;;
1262 list-files)
1263 # List files installed with the package.
1265 check_for_package_on_cmdline
1266 check_for_receipt
1267 echo ""
1268 echo -e "\033[1mInstalled files with :\033[0m $PACKAGE"
1269 echo "================================================================================"
1270 cat $INSTALLED/$PACKAGE/files.list | sort
1271 echo "================================================================================"
1272 files=`cat $INSTALLED/$PACKAGE/files.list | wc -l`
1273 echo "$files files installed with $PACKAGE."
1274 echo ""
1275 ;;
1276 info)
1277 # Information about package.
1279 check_for_package_on_cmdline
1280 check_for_receipt
1281 EXTRAVERSION=""
1282 . $INSTALLED/$PACKAGE/receipt
1283 echo ""
1284 echo -e "\033[1mTazpkg information\033[0m
1285 ================================================================================
1286 Package : $PACKAGE
1287 Version : $VERSION$EXTRAVERSION
1288 Category : $CATEGORY
1289 Short desc : $SHORT_DESC
1290 Maintainer : $MAINTAINER"
1291 if [ ! "$DEPENDS" = "" ]; then
1292 echo -e "Depends : $DEPENDS"
1293 fi
1294 if [ ! "$SUGGESTED" = "" ]; then
1295 echo -e "Suggested : $SUGGESTED"
1296 fi
1297 if [ ! "$BUILD_DEPENDS" = "" ]; then
1298 echo -e "Build deps : $BUILD_DEPENDS"
1299 fi
1300 if [ ! "$WANTED" = "" ]; then
1301 echo -e "Wanted src : $WANTED"
1302 fi
1303 if [ ! "$WEB_SITE" = "" ]; then
1304 echo -e "Web site : $WEB_SITE"
1305 fi
1306 echo "================================================================================"
1307 echo ""
1308 ;;
1309 desc)
1310 # Display package description.txt if available.
1311 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
1312 echo ""
1313 echo -e "\033[1mDescription of :\033[0m $PACKAGE"
1314 echo "================================================================================"
1315 cat $INSTALLED/$PACKAGE/description.txt
1316 echo "================================================================================"
1317 echo ""
1318 else
1319 echo -e "\nSorry, no description available for this package.\n"
1320 fi
1321 ;;
1322 search)
1323 # Search for a package by pattern or name.
1325 PATTERN="$2"
1326 if [ -z "$PATTERN" ]; then
1327 echo -e "\nPlease specify a pattern or package name to search for."
1328 echo -e "Example : 'tazpkg search paint'.\n"
1329 exit 0
1330 fi
1331 echo ""
1332 echo -e "\033[1mSearch result for :\033[0m $PATTERN"
1333 echo ""
1334 # Default is to search in installed pkgs and the raw list.
1335 case $3 in
1336 -i|--installed)
1337 search_in_installed_packages ;;
1338 -l|--list)
1339 search_in_packages_list ;;
1340 -m|--mirror)
1341 search_in_packages_txt ;;
1342 *)
1343 search_in_installed_packages
1344 search_in_packages_list ;;
1345 esac
1346 ;;
1347 search-file)
1348 # Search for a file by pattern or name in all files.list.
1350 if [ -z "$2" ]; then
1351 echo -e "\nPlease specify a pattern or file name to search for."
1352 echo -e "Example : 'tazpkg search-file libnss'. \n"
1353 exit 0
1354 fi
1355 echo ""
1356 echo -e "\033[1mSearch result for file :\033[0m $2"
1357 echo "================================================================================"
1359 if [ "$3" == "--mirror" ]; then
1361 match=0
1362 for i in $LOCALSTATE/files.list.lzma \
1363 $LOCALSTATE/undigest/*/files.list.lzma; do
1364 [ -f $i ] || continue
1365 unlzma -c $i | grep -- ".*:.*$2" | awk '
1366 BEGIN { last="" }
1368 pkg=substr($0,0,index($0,":")-1);
1369 file=substr($0,index($0,":")+2);
1370 if (last != pkg) {
1371 last = pkg;
1372 printf("\n%c[1mPackage %s :%c[0m\n",27,pkg,27);
1374 printf("%s\n",file);
1375 }'
1376 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | wc -l`))
1377 done
1379 else
1381 # Check all pkg files.list in search match with specify the package
1382 # name and the full path to the file(s).
1383 for pkg in $INSTALLED/*
1384 do
1385 if grep -qs "$2" $pkg/files.list; then
1386 . $pkg/receipt
1387 echo ""
1388 echo -e "\033[1mPackage $PACKAGE :\033[0m"
1389 grep "$2" $pkg/files.list
1390 files=`grep $2 $pkg/files.list | wc -l`
1391 match=$(($match+$files))
1392 fi
1393 done
1395 fi
1397 if [ "$match" = "" ]; then
1398 echo "0 file found for : $2"
1399 echo ""
1400 else
1401 echo ""
1402 echo "================================================================================"
1403 echo "$match file(s) found for : $2"
1404 echo ""
1405 fi
1406 ;;
1407 install)
1408 # Install .tazpkg packages.
1410 check_root
1411 check_for_package_on_cmdline
1412 check_for_package_file
1413 # Check if forced install.
1414 DO_CHECK="yes"
1415 ROOT=""
1416 while [ -n "$3" ]; do
1417 case "$3" in
1418 --forced)
1419 DO_CHECK="no"
1420 ;;
1421 --root=*)
1422 ROOT="${3#--root=}"
1423 ;;
1424 --list=*)
1425 INSTALL_LIST="${3#--list=}"
1426 ;;
1427 *) shift 2
1428 echo -e "\nUnknown option $*.\n"
1429 exit 1
1430 ;;
1431 esac
1432 shift
1433 done
1434 if [ "$DO_CHECK" = "yes" ]; then
1435 check_for_installed_package $ROOT
1436 fi
1437 install_package $ROOT
1438 ;;
1439 install-list|get-install-list)
1440 # Install a set of packages from a list.
1442 check_root
1443 if [ -z "$2" ]; then
1444 echo -e "
1445 Please change directory (cd) to the packages repository, and specify the
1446 list of packages to install. Example : tazpkg install-list packages.list\n"
1447 exit 0
1448 fi
1449 # Check if the packages list exist.
1450 if [ ! -f "$2" ]; then
1451 echo "Unable to find : $2"
1452 exit 0
1453 else
1454 LIST=`cat $2`
1455 fi
1457 # Remember processed list
1458 export INSTALL_LIST="$2"
1460 # Set $COMMAND and install all packages.
1461 if [ "$1" = "get-install-list" ]; then
1462 COMMAND=get-install
1463 else
1464 COMMAND=install
1465 fi
1466 touch $2-processed
1467 for pkg in $LIST
1468 do
1469 grep -qs ^$pkg$ $2-processed && continue
1470 tazpkg $COMMAND $pkg --list=$2 "$3" "$4" "$5"
1471 done
1472 rm -f $2-processed
1473 ;;
1474 add-flavor)
1475 # Install a set of packages from a flavor.
1477 install_flavor $2
1478 ;;
1479 install-flavor)
1480 # Install a set of packages from a flavor and purge other ones.
1482 install_flavor $2 --purge
1483 ;;
1484 set-release)
1485 # Change curent release and upgrade packages.
1487 RELEASE=$2
1488 if [ -z "$RELEASE" ]; then
1489 echo -e "\nPlease specify the release you want on the command line."
1490 echo -e "Example: tazpkg set-release cooking\n"
1491 exit 0
1492 fi
1493 rm /var/lib/tazpkg/mirror
1494 echo "$RELEASE" > /etc/slitaz-release
1495 tazpkg recharge && tazpkg upgrade
1497 # Install missing depends
1498 cd $INSTALLED
1499 for i in * ; do
1500 DEPENDS=""
1501 . $i/receipt
1502 for j in $DEPENDS ; do
1503 [ -d $j ] || tazpkg get-install $j
1504 done
1505 done
1506 ;;
1507 remove)
1508 # Remove packages.
1510 check_root
1511 check_for_package_on_cmdline
1512 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
1513 echo -e "\n$PACKAGE is not installed.\n"
1514 exit 0
1515 else
1516 ALTERED=""
1517 THE_PACKAGE=$PACKAGE # altered by receipt
1518 for i in $(cd $INSTALLED ; ls); do
1519 [ -f $INSTALLED/$i/receipt ] || continue
1520 DEPENDS=""
1521 . $INSTALLED/$i/receipt
1522 case " $(echo $DEPENDS) " in
1523 *\ $THE_PACKAGE\ *) ALTERED="$ALTERED $i";;
1524 esac
1525 done
1526 EXTRAVERSION=""
1527 . $INSTALLED/$THE_PACKAGE/receipt
1528 fi
1529 echo ""
1530 if [ -n "$ALTERED" ]; then
1531 echo "The following packages depend on $PACKAGE :"
1532 for i in $ALTERED; do
1533 echo " $i"
1534 done
1535 fi
1536 REFRESH=$(cd $INSTALLED ; grep -sl ^$PACKAGE$ */modifiers)
1537 if [ -n "$REFRESH" ]; then
1538 echo "The following packages have been modified by $PACKAGE :"
1539 for i in $REFRESH; do
1540 echo " ${i%/modifiers}"
1541 done
1542 fi
1543 echo "Remove $PACKAGE ($VERSION$EXTRAVERSION) ?"
1544 echo -n "Please confirm uninstallation (y/N) : "; read anser
1545 if [ "$anser" = "y" ]; then
1546 echo ""
1547 echo -e "\033[1mRemoving :\033[0m $PACKAGE"
1548 echo "================================================================================"
1549 # Pre remove commands.
1550 if grep -q ^pre_remove $INSTALLED/$PACKAGE/receipt; then
1551 pre_remove
1552 fi
1553 echo -n "Removing all files installed..."
1554 if [ -f $INSTALLED/$PACKAGE/modifiers ]; then
1555 for mod in `cat $INSTALLED/$PACKAGE/modifiers`
1556 do
1557 for file in `cat $INSTALLED/$PACKAGE/files.list`
1558 do
1559 [ $(grep ^$file$ $INSTALLED/$mod/files.list | wc -l) -gt 1 ] && continue
1560 rm -f $file 2>/dev/null
1561 dir="$file"
1562 while [ "$dir" != "/" ]; do
1563 dir="$(dirname $dir)"
1564 rmdir $dir 2> /dev/null || break
1565 done
1566 done
1567 done
1568 else
1569 for file in `cat $INSTALLED/$PACKAGE/files.list`
1570 do
1571 rm -f $file 2>/dev/null
1572 dir="$file"
1573 while [ "$dir" != "/" ]; do
1574 dir="$(dirname $dir)"
1575 rmdir $dir 2> /dev/null || break
1576 done
1577 done
1578 fi
1579 status
1580 if grep -q ^post_remove $INSTALLED/$PACKAGE/receipt; then
1581 post_remove
1582 fi
1583 # Remove package receipt.
1584 echo -n "Removing package receipt..."
1585 rm -rf $INSTALLED/$PACKAGE
1586 status
1587 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$/d" \
1588 $LOCALSTATE/installed.md5 2> /dev/null
1589 # Log this activity
1590 log Removed
1591 if [ -n "$ALTERED" ]; then
1592 echo -n "Remove packages depending on $PACKAGE"
1593 echo -n " (y/N) ? "; read anser
1594 if [ "$anser" = "y" ]; then
1595 for i in $ALTERED; do
1596 if [ -d "$INSTALLED/$i" ]; then
1597 tazpkg remove $i
1598 fi
1599 done
1600 fi
1601 fi
1602 if [ -n "$REFRESH" ]; then
1603 echo -n "Reinstall packages modified by $PACKAGE"
1604 echo -n " (y/N) ? "; read anser
1605 if [ "$anser" = "y" ]; then
1606 for i in $REFRESH; do
1607 if [ $(wc -l < $INSTALLED/$i) -gt 1 ]; then
1608 echo "Check $INSTALLED/$i for reinstallation"
1609 continue
1610 fi
1611 rm -r $INSTALLED/$i
1612 tazpkg get-install ${i%/modifiers} --forced
1613 done
1614 fi
1615 fi
1616 else
1617 echo ""
1618 echo "Uninstallation of $PACKAGE cancelled."
1619 fi
1620 echo ""
1621 ;;
1622 extract)
1623 # Extract .tazpkg cpio archive into a directory.
1625 check_for_package_on_cmdline
1626 check_for_package_file
1627 echo ""
1628 echo -e "\033[1mExtracting :\033[0m $PACKAGE"
1629 echo "================================================================================"
1630 # If no directory destination is found on the cmdline
1631 # we create one in the current dir using the package name.
1632 if [ -n "$TARGET_DIR" ]; then
1633 DESTDIR=$TARGET_DIR/$PACKAGE
1634 else
1635 DESTDIR=$PACKAGE
1636 fi
1637 mkdir -p $DESTDIR
1638 echo -n "Copying original package..."
1639 cp $PACKAGE_FILE $DESTDIR
1640 status
1641 cd $DESTDIR
1642 extract_package
1643 echo "================================================================================"
1644 echo "$PACKAGE is extracted to : $DESTDIR"
1645 echo ""
1646 ;;
1647 list-config)
1648 # List configuration files installed.
1650 if [ "$2" = "--box" ]; then
1651 mkdir -p $TMP_DIR && cd $TMP_DIR
1652 FILES="$INSTALLED/*/volatile.cpio.gz"
1653 [ -n "$3" ] && FILES="$INSTALLED/$3/volatile.cpio.gz"
1654 for i in $FILES; do
1655 zcat $i | cpio -idm > /dev/null
1656 find * -type f 2>/dev/null | while read file; do
1657 if [ ! -e /$file ]; then
1658 echo -n "|--|--|--|File lost"
1659 else
1660 echo -n "$(stat -c "%A|%U|%G|%s|" /$file)"
1661 cmp $file /$file > /dev/null 2>&1 || \
1662 echo -n "$(stat -c "%.16y" /$file)"
1663 fi
1664 echo "|/$file"
1665 done
1666 rm -rf *
1667 done
1668 cd $TOP_DIR
1669 rm -rf $TMP_DIR
1670 else
1671 echo ""
1672 echo -e "\033[1mConfiguration files"
1673 echo "================================================================================"
1674 for i in $INSTALLED/*/volatile.cpio.gz; do
1675 [ -n "$2" -a "$i" != "$INSTALLED/$2/volatile.cpio.gz" ] && continue
1676 [ -f "$i" ] || continue
1677 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1678 done | sed 's|^|/|' | sort
1679 echo "================================================================================"
1680 echo ""
1681 fi
1682 ;;
1683 repack-config)
1684 # Create SliTaz package archive from configuration files.
1686 mkdir -p $TMP_DIR && cd $TMP_DIR
1687 CONFIG_VERSION=1.0
1688 mkdir config-$CONFIG_VERSION
1689 cd config-$CONFIG_VERSION
1690 for i in $INSTALLED/*/volatile.cpio.gz; do
1691 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1692 done > files.list
1693 mkdir fs
1694 cd fs
1695 ( cd / ; cpio -o -H newc ) < ../files.list | cpio -idm > /dev/null
1696 mkdir -p etc/tazlito
1697 for i in $INSTALLED/*/receipt; do
1698 EXTRAVERSION=""
1699 . $i
1700 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1701 done > etc/tazlito/config-packages.list
1702 cd ..
1703 echo "etc/tazlito/config-packages.list" >> files.list
1704 cat > receipt <<EOT
1705 # SliTaz package receipt.
1707 PACKAGE="config"
1708 VERSION="$CONFIG_VERSION"
1709 CATEGORY="base-system"
1710 SHORT_DESC="User configuration backup on $(date)"
1711 DEPENDS="$(ls $INSTALLED)"
1712 EOT
1713 cd ..
1714 tazpkg pack config-$CONFIG_VERSION
1715 cp config-$CONFIG_VERSION.tazpkg $TOP_DIR
1716 cd $TOP_DIR
1717 rm -rf $TMP_DIR
1718 ;;
1719 repack)
1720 # Create SliTaz package archive from an installed package.
1722 check_for_package_on_cmdline
1723 check_for_receipt
1724 EXTRAVERSION=""
1725 . $INSTALLED/$PACKAGE/receipt
1726 echo ""
1727 echo -e "\033[1mRepacking :\033[0m $PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
1728 echo "================================================================================"
1729 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
1730 echo "Can't repack $PACKAGE"
1731 exit 1
1732 fi
1733 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
1734 echo "Can't repack, $PACKAGE files have been modified by:"
1735 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
1736 echo " $i"
1737 done
1738 exit 1
1739 fi
1740 MISSING=""
1741 while read i; do
1742 [ -e "$i" ] && continue
1743 [ -L "$i" ] || MISSING="$MISSING\n $i"
1744 done < $INSTALLED/$PACKAGE/files.list
1745 if [ -n "$MISSING" ]; then
1746 echo -n "Can't repack, the following files are lost:"
1747 echo -e "$MISSING"
1748 exit 1
1749 fi
1750 mkdir -p $TMP_DIR && cd $TMP_DIR
1751 FILES="fs.cpio.gz\n"
1752 for i in $(ls $INSTALLED/$PACKAGE) ; do
1753 [ "$i" = "volatile.cpio.gz" ] && continue
1754 [ "$i" = "modifiers" ] && continue
1755 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
1756 done
1757 ln -s / rootfs
1758 mkdir tmp
1759 sed 's/^/rootfs/' < files.list | cpio -o -H newc 2>/dev/null |\
1760 ( cd tmp ; cpio -idm 2>/dev/null )
1761 mv tmp/rootfs fs
1762 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
1763 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
1764 ( cd fs; cpio -idm )
1765 fi
1766 if grep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
1767 . $INSTALLED/$PACKAGE/receipt
1768 repack_cleanup fs
1769 fi
1770 if [ -f $INSTALLED/$PACKAGE/md5sum ]; then
1771 sed 's, , fs,' < $INSTALLED/$PACKAGE/md5sum | \
1772 md5sum -s -c || {
1773 echo "Can't repack, md5sum error."
1774 cd $TOP_DIR
1775 rm -rf $TMP_DIR
1776 exit 1
1778 fi
1779 find fs | cpio -o -H newc 2> /dev/null | gzip -9 > fs.cpio.gz
1780 echo -e "$FILES" | cpio -o -H newc 2> /dev/null > \
1781 $TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg
1782 cd $TOP_DIR
1783 \rm -R $TMP_DIR
1784 echo "Package $PACKAGE repacked successfully."
1785 echo "Size : `du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg`"
1786 echo ""
1787 ;;
1788 pack)
1789 # Create SliTaz package archive using cpio and gzip.
1791 check_for_package_on_cmdline
1792 cd $PACKAGE
1793 if [ ! -f "receipt" ]; then
1794 echo "Receipt is missing. Please read the documentation."
1795 exit 0
1796 else
1797 echo ""
1798 echo -e "\033[1mPacking :\033[0m $PACKAGE"
1799 echo "================================================================================"
1800 # Create files.list with redirecting find outpout.
1801 echo -n "Creating the list of files..." && cd fs
1802 find . -type f -print > ../files.list
1803 find . -type l -print >> ../files.list
1804 cd .. && sed -i s/'^.'/''/ files.list
1805 status
1806 echo -n "Creating md5sum of files..."
1807 while read file; do
1808 [ -L "fs$file" ] && continue
1809 [ -f "fs$file" ] || continue
1810 case "$file" in
1811 /lib/modules/*/modules.*|*.pyc) continue;;
1812 esac
1813 md5sum "fs$file" | sed 's/ fs/ /'
1814 done < files.list > md5sum
1815 status
1816 UNPACKED_SIZE=$(du -chs fs receipt files.list md5sum \
1817 description.txt 2> /dev/null | awk \
1818 '{ sz=$1 } END { print sz }')
1819 # Build cpio archives.
1820 echo -n "Compressing the fs... "
1821 find fs -print | cpio -o -H newc | gzip > fs.cpio.gz
1822 rm -rf fs
1823 status
1824 PACKED_SIZE=$(du -chs fs.cpio.gz receipt files.list \
1825 md5sum description.txt 2> /dev/null | awk \
1826 '{ sz=$1 } END { print sz }')
1827 echo -n "Undating receipt sizes..."
1828 sed -i s/^PACKED_SIZE.*$// receipt
1829 sed -i s/^UNPACKED_SIZE.*$// receipt
1830 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
1831 status
1832 echo -n "Creating full cpio archive... "
1833 find . -print | cpio -o -H newc > ../$PACKAGE.tazpkg
1834 status
1835 echo -n "Restoring original package tree... "
1836 zcat fs.cpio.gz | cpio -idm
1837 status
1838 rm fs.cpio.gz && cd ..
1839 echo "================================================================================"
1840 echo "Package $PACKAGE compressed successfully."
1841 echo "Size : `du -sh $PACKAGE.tazpkg`"
1842 echo ""
1843 fi
1844 ;;
1845 recharge)
1846 # Recharge packages.list from a mirror.
1848 check_root
1849 for path in $LOCALSTATE $LOCALSTATE/undigest/*; do
1850 [ -f $path/mirror ] || continue
1851 echo ""
1852 if [ "$path" != "$LOCALSTATE" ]; then
1853 echo "Recharge undigest $(basename $path):"
1854 fi
1855 cd $path
1856 if [ -f "packages.list" ]; then
1857 echo -n "Creating backup of the last packages list..."
1858 mv -f packages.desc packages.desc.bak 2>/dev/null
1859 mv -f packages.md5 packages.md5.txt 2>/dev/null
1860 mv -f packages.txt packages.txt.bak 2>/dev/null
1861 mv -f packages.list packages.list.bak 2>/dev/null
1862 mv -f packages.equiv packages.equiv.bak 2>/dev/null
1863 mv -f files.list.lzma files.list.lzma.bak 2> /dev/null
1864 mv -f mirrors mirrors.bak 2> /dev/null
1865 status
1866 fi
1867 download_from "$(cat mirror)" packages.desc
1868 download_from "$(cat mirror)" packages.md5
1869 download_from "$(cat mirror)" packages.txt
1870 download_from "$(cat mirror)" packages.list
1871 download_from "$(cat mirror)" packages.equiv
1872 download_from "$(cat mirror)" files.list.lzma
1873 download_from "$(cat mirror)" mirrors
1874 [ -f mirrors ] || mv mirrors.bak mirrors 2> /dev/null
1875 suffix=$(head -1 mirror)
1876 suffix=packages${suffix#*/packages}
1877 for i in $(cat mirrors 2> /dev/null); do
1878 grep -qs $i mirror || echo $i$suffix >> mirror
1879 done
1880 if [ -f "packages.list.bak" ]; then
1881 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
1882 sed -i s/+// packages.diff
1883 echo ""
1884 echo -e "\033[1mMirrored packages diff\033[0m"
1885 echo "================================================================================"
1886 cat packages.diff
1887 if [ ! "`cat packages.diff | wc -l`" = 0 ]; then
1888 echo "================================================================================"
1889 echo "`cat packages.diff | wc -l` new packages on the mirror."
1890 echo ""
1891 else
1892 echo "`cat packages.diff | wc -l` new packages on the mirror."
1893 echo ""
1894 fi
1895 else
1896 echo -e "
1897 ================================================================================
1898 Last packages.list is ready to use. Note that next time you recharge the list,
1899 a list of differences will be displayed to show new and upgradeable packages.\n"
1900 fi
1901 done
1902 ;;
1903 upgrade)
1904 # Upgrade all installed packages with the new version from the mirror.
1906 check_root
1907 check_for_packages_list
1908 cd $LOCALSTATE
1909 # Touch the blocked pkgs list to avoid errors and remove any old
1910 # upgrade list.
1911 touch blocked-packages.list
1912 rm -f upgradeable-packages.list
1913 echo ""
1914 echo -e "\033[1mAvailable upgrades\033[0m"
1915 echo "================================================================================"
1916 echo ""
1917 # Some packages must be installed first
1918 FIRST_CLASS_PACKAGE=" glibc-base slitaz-base-files slitaz-boot-scripts "
1919 if [ -n "$PACKAGE_FILE" -a -d "$INSTALLED/$PACKAGE_FILE" ]; then
1920 ALL=$INSTALLED/$PACKAGE_FILE
1921 else
1922 ALL="$(ls -d $INSTALLED/*)"
1923 fi
1924 for pkg in $ALL
1925 do
1926 [ -f $pkg/receipt ] || continue
1927 EXTRAVERSION=""
1928 . $pkg/receipt
1929 # Display package name to show that Tazpkg is working...
1930 echo -en "\\033[0G "
1931 echo -en "\\033[0G$PACKAGE"
1932 # Skip specified pkgs listed in $LOCALSTATE/blocked-packages.list
1933 if grep -qs "^$PACKAGE" $BLOCKED; then
1934 blocked=$(($blocked+1))
1935 else
1936 # Check if the installed package is in the current list (other
1937 # mirror or local).
1938 NEW_PACKAGE=$(get_package_filename $PACKAGE)
1940 if [ -n "$NEW_PACKAGE" ]; then
1941 # Set new pkg and version for future comparison
1942 NEW_VERSION=`echo $NEW_PACKAGE | sed s/$PACKAGE-/''/`
1943 # Change '-' and 'pre' to points.
1944 NEW_VERSION=`echo $NEW_VERSION | sed s/'-'/'.'/`
1945 VERSION=`echo $VERSION | sed s/'-'/'.'/`$EXTRAVERSION
1946 NEW_VERSION=`echo $NEW_VERSION | sed s/'pre'/'.'/`
1947 VERSION=`echo $VERSION | sed s/'pre'/'.'/`
1948 NEW_VERSION=`echo $NEW_VERSION | sed 's/[A-Z]\.//'`
1949 VERSION=`echo $VERSION | sed 's/[A-Z]\.//'`
1950 # Compare version. Upgrades are only available for official
1951 # packages, so we control the mirror and it should be ok if
1952 # we just check for equality.
1953 RELEASE=""
1954 if [ -f installed.md5 -a -f packages.md5 ]; then
1955 current_md5=$(grep -s " $PACKAGE-$VERSION" installed.md5 | awk '{ print $1 }')
1956 new_md5=$(grep -hs " $PACKAGE-$VERSION" packages.md5 undigest/*/packages.md5 | head -1 | awk '{ print $1 }')
1957 [ -n "$current_md5" ] && [ -n "$new_md5" ] &&
1958 [ "$current_md5" != "$new_md5" ] && RELEASE=build
1959 fi
1960 if [ "$VERSION" != "$NEW_VERSION" -o -n "$RELEASE" ]; then
1961 # Version seems different. Check for major, minor or
1962 # revision
1963 PKG_MAJOR=`echo ${VERSION%_*} | cut -f1 -d"."`
1964 NEW_MAJOR=`echo ${NEW_VERSION%_*} | cut -f1 -d"."`
1965 PKG_MINOR=`echo ${VERSION%_*} | cut -f2 -d"."`
1966 NEW_MINOR=`echo ${NEW_VERSION%_*} | cut -f2 -d"."`
1967 # Minor
1968 if [ "$NEW_MINOR" -gt "$PKG_MINOR" ] 2> /dev/null; then
1969 RELEASE=minor
1970 fi
1971 if [ "$NEW_MINOR" -lt "$PKG_MINOR" ] 2> /dev/null; then
1972 RELEASE=$WARNING
1973 FIXE=yes
1974 fi
1975 # Major
1976 if [ "$NEW_MAJOR" -gt "$PKG_MAJOR" ] 2> /dev/null; then
1977 RELEASE=major
1978 FIXE=""
1979 fi
1980 if [ "$NEW_MAJOR" -lt "$PKG_MAJOR" ] 2> /dev/null; then
1981 RELEASE=$WARNING
1982 FIXE=yes
1983 fi
1984 # Default to revision.
1985 if [ -z $RELEASE ]; then
1986 RELEASE=revision
1987 fi
1988 # Pkg name is already displayed by the check process.
1989 echo -en "\033[24G $VERSION"
1990 echo -en "\033[38G --->"
1991 echo -en "\033[43G $NEW_VERSION"
1992 echo -en "\033[58G $CATEGORY"
1993 echo -e "\033[72G $RELEASE"
1994 up=$(($up+1))
1995 echo "$PACKAGE" >> upgradeable-packages.list
1996 case "$FIRST_CLASS_PACKAGE" in
1997 *\ $PACKAGE\ *) echo "$PACKAGE" >> upgradeable-packages.list$$;;
1998 esac
1999 unset RELEASE
2000 fi
2001 packages=$(($packages+1))
2002 fi
2003 fi
2004 done
2005 if [ -z $blocked ]; then
2006 blocked=0
2007 fi
2008 # Clean last checked package and display summary.
2009 if [ ! "$up" = "" ]; then
2010 echo -e "\\033[0G "
2011 echo "================================================================================"
2012 echo "$packages installed and listed packages to consider, $up to upgrade, $blocked blocked."
2013 echo ""
2014 else
2015 echo -e "\\033[0GSystem is up-to-date. "
2016 echo ""
2017 echo "================================================================================"
2018 echo "$packages installed and listed packages to consider, 0 to upgrade, $blocked blocked."
2019 echo ""
2020 exit 0
2021 fi
2022 # What to do if major or minor version is smaller.
2023 if [ "$FIXE" == "yes" ]; then
2024 echo -e "$WARNING ---> Installed package seems more recent than the mirrored one."
2025 echo "You can block packages using the command : 'tazpkg block package'"
2026 echo "Or upgrade packages at your own risk."
2027 echo ""
2028 fi
2029 # Ask for upgrade, it can be done another time.
2030 echo -n "Upgrade now (y/N) ? "; read anser
2031 if [ ! "$anser" = "y" ]; then
2032 echo -e "\nExiting. No package upgraded.\n"
2033 exit 0
2034 fi
2035 # If anser is yes (y). Install all new versions.
2036 cat upgradeable-packages.list >> upgradeable-packages.list$$
2037 mv -f upgradeable-packages.list$$ upgradeable-packages.list
2038 yes y | tazpkg get-install-list upgradeable-packages.list --forced
2039 rm -f upgradeable-packages.list
2040 ;;
2041 bugs)
2042 # Show known bugs in package(s)
2044 cd $INSTALLED
2045 shift
2046 LIST=$@
2047 [ -n "$LIST" ] || LIST=`ls`
2048 MSG="No known bugs."
2049 for PACKAGE in $LIST; do
2050 BUGS=""
2051 EXTRAVERSION=""
2052 . $PACKAGE/receipt
2053 if [ -n "$BUGS" ]; then
2054 MSG="
2055 Bug list completed"
2056 cat <<EOT
2058 Bugs in package $PACKAGE version $VERSION$EXTRAVERSION:
2059 $BUGS
2060 EOT
2061 fi
2062 done
2063 echo "$MSG"
2064 ;;
2065 check)
2066 # Check installed packages set.
2068 check_root
2069 cd $INSTALLED
2070 for PACKAGE in `ls`; do
2071 if [ ! -f $PACKAGE/receipt ]; then
2072 echo "The package $PACKAGE installation is not completed"
2073 continue
2074 fi
2075 DEPENDS=""
2076 EXTRAVERSION=""
2077 . $PACKAGE/receipt
2078 if [ -s $PACKAGE/modifiers ]; then
2079 echo "The package $PACKAGE $VERSION$EXTRAVERSION has been modified by :"
2080 for i in $(cat $PACKAGE/modifiers); do
2081 echo " $i"
2082 done
2083 fi
2084 MSG="Files lost from $PACKAGE $VERSION$EXTRAVERSION :\n"
2085 while read file; do
2086 [ -e "$file" ] && continue
2087 if [ -L "$file" ]; then
2088 MSG="$MSG target of symlink"
2089 fi
2090 echo -e "$MSG $file"
2091 MSG=""
2092 done < $PACKAGE/files.list
2093 MSG="Missing dependencies for $PACKAGE $VERSION$EXTRAVERSION :\n"
2094 for i in $DEPENDS; do
2095 [ -d $i ] && continue
2096 echo -e "$MSG $i"
2097 MSG=""
2098 done
2099 MSG="Dependencies loop between $PACKAGE and :\n"
2100 ALL_DEPS=""
2101 check_for_deps_loop $PACKAGE $DEPENDS
2102 done
2103 echo -n "Looking for known bugs... "
2104 tazpkg bugs
2105 if [ "$PACKAGE_FILE" = "--full" ]; then
2106 for file in */md5sum; do
2107 CONFIG_FILES=""
2108 . $(dirname "$file")/receipt
2109 [ -s "$file" ] || continue
2110 while read md5 f; do
2111 [ -f $f ] || continue
2112 for i in $CONFIG_FILES; do
2113 case "$f" in
2114 $i|$i/*) continue 2;;
2115 esac
2116 done
2117 echo "$md5 $f"
2118 done < "$file" | md5sum -c - 2> /dev/null | \
2119 grep -v OK$ | sed 's/FAILED$/MD5SUM MISMATCH/'
2120 done
2121 FILES=" "
2122 for file in $(cat */files.list); do
2123 [ -d "$file" ] && continue
2124 case "$FILES" in *\ $file\ *) continue;; esac
2125 [ $(grep "^$file$" */files.list 2> /dev/null | \
2126 wc -l) -gt 1 ] || continue
2127 FILES="$FILES$file "
2128 echo "The following packages provide $file :"
2129 grep -l "^$file$" */files.list | while read f
2130 do
2131 pkg=${f%/files.list}
2132 echo -n " $pkg"
2133 if [ -f $pkg/modifiers ]; then
2134 echo -n " (overridden by $(echo "$(cat $pkg/modifiers)"))"
2135 fi
2136 echo ""
2137 done
2138 done
2139 MSG="No package has installed the following files:\n"
2140 find /etc /bin /sbin /lib /usr /var/www \
2141 -not -type d 2> /dev/null | while read file; do
2142 case "$file" in *\[*) continue;; esac
2143 grep -q "^$file$" */files.list && continue
2144 echo -e "$MSG $file"
2145 MSG=""
2146 done
2147 fi
2148 echo "Check completed."
2149 ;;
2150 block)
2151 # Add a pkg name to the list of blocked packages.
2153 check_root
2154 check_for_package_on_cmdline
2155 echo ""
2156 if grep -qs "^$PACKAGE" $BLOCKED; then
2157 echo "$PACKAGE is already in the blocked packages list."
2158 echo ""
2159 exit 0
2160 else
2161 echo -n "Add $PACKAGE to : $BLOCKED..."
2162 echo $PACKAGE >> $BLOCKED
2163 status
2164 # Log this activity
2165 . $INSTALLED/$PACKAGE/receipt
2166 log Blocked
2167 fi
2168 echo ""
2169 ;;
2170 unblock)
2171 # Remove a pkg name from the list of blocked packages.
2173 check_root
2174 check_for_package_on_cmdline
2175 echo ""
2176 if grep -qs "^$PACKAGE" $BLOCKED; then
2177 echo -n "Removing $PACKAGE from : $BLOCKED..."
2178 sed -i s/$PACKAGE/''/ $BLOCKED
2179 sed -i '/^$/d' $BLOCKED
2180 status
2181 # Log this activity
2182 . $INSTALLED/$PACKAGE/receipt
2183 log Unblocked
2184 else
2185 echo "$PACKAGE is not in the blocked packages list."
2186 echo ""
2187 exit 0
2188 fi
2189 echo ""
2190 ;;
2191 get)
2192 # Downlowd a package with wget.
2194 check_for_package_on_cmdline
2195 check_for_packages_list
2196 check_for_package_in_list
2197 echo ""
2198 download $PACKAGE.tazpkg
2199 echo ""
2200 ;;
2201 get-install)
2202 # Download and install a package.
2204 check_root
2205 check_for_package_on_cmdline
2206 check_for_packages_list
2207 DO_CHECK=""
2208 while [ -n "$3" ]; do
2209 case "$3" in
2210 --forced)
2211 DO_CHECK="no"
2212 ;;
2213 --root=*)
2214 ROOT="${3#--root=}"
2215 ;;
2216 --list=*)
2217 INSTALL_LIST="${3#--list=}"
2218 ;;
2219 *) shift 2
2220 echo -e "\nUnknown option $*.\n"
2221 exit 1
2222 ;;
2223 esac
2224 shift
2225 done
2226 AUTOEXEC="no"
2227 if ! check_for_package_in_list check; then
2228 PACKAGE=get-$PACKAGE
2229 AUTOEXEC=$PACKAGE
2230 check_for_package_in_list
2231 if [ -n "$(get_installed_package_pathname $PACKAGE $ROOT)" ]; then
2232 $AUTOEXEC $ROOT
2233 exit 0
2234 fi
2235 fi
2236 # Check if forced install.
2237 if [ "$DO_CHECK" = "no" ]; then
2238 rm -f $CACHE_DIR/$PACKAGE.tazpkg
2239 else
2240 check_for_installed_package $ROOT
2241 fi
2242 cd $CACHE_DIR
2243 if [ -f "$PACKAGE.tazpkg" ]; then
2244 echo "$PACKAGE already in the cache : $CACHE_DIR"
2245 # Check package download was finished
2246 tail -c 2k $PACKAGE.tazpkg | grep -q 00000000TRAILER || {
2247 echo "Continue $PACKAGE download"
2248 download $PACKAGE.tazpkg
2250 else
2251 echo ""
2252 download $PACKAGE.tazpkg
2253 fi
2254 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
2255 install_package $ROOT
2256 [ "$AUTOEXEC" != "no" ] && $PACKAGE $ROOT
2257 ;;
2258 clean-cache)
2259 # Remove all downloaded packages.
2261 check_root
2262 files=`ls -1 $CACHE_DIR | wc -l`
2263 echo ""
2264 echo -e "\033[1mClean cache :\033[0m $CACHE_DIR"
2265 echo "================================================================================"
2266 echo -n "Cleaning cache directory..."
2267 rm -rf $CACHE_DIR/*
2268 status
2269 echo "================================================================================"
2270 echo "$files file(s) removed from cache."
2271 echo ""
2272 ;;
2273 list-undigest)
2274 # list undigest URLs.
2276 if [ "$2" = "--box" ]; then
2277 for i in $LOCALSTATE/undigest/*/mirror; do
2278 [ -f $i ] || continue
2279 echo "$(basename $(dirname $i))|$(cat $i)"
2280 done
2281 else
2282 echo ""
2283 echo -e "\033[1mCurrent undigest(s)\033[0m"
2284 echo "================================================================================"
2285 for i in $LOCALSTATE/undigest/*/mirror; do
2286 if [ ! -f $i ]; then
2287 echo "No undigest mirror found."
2288 exit 1
2289 fi
2290 echo "$(basename $(dirname $i)) $(cat $i)"
2291 done
2292 echo ""
2293 fi
2294 ;;
2295 remove-undigest)
2296 # remove undigest URL.
2298 check_root
2299 if [ -d $LOCALSTATE/undigest/$2 ]; then
2300 echo -n "Remove $2 undigest (y/N) ? "; read anser
2301 if [ "$anser" = "y" ]; then
2302 echo -n "Removing $2 undigest..."
2303 rm -rf $LOCALSTATE/undigest/$2
2304 status
2305 rmdir $LOCALSTATE/undigest 2> /dev/null
2306 fi
2307 else
2308 echo "Undigest $2 not found"
2309 fi
2310 ;;
2311 add-undigest|setup-undigest)
2312 # Add undigest URL.
2314 check_root
2315 undigest=$2
2316 [ -d $LOCALSTATE/undigest ] || mkdir $LOCALSTATE/undigest
2317 if [ -z "$undigest" ]; then
2318 i=1
2319 while [ -d $LOCALSTATE/undigest/$i ]; do
2320 i=$(($i+1))
2321 done
2322 undigest=$i
2323 fi
2324 if [ ! -d $LOCALSTATE/undigest/$undigest ]; then
2325 echo "Creating new undigest $undigest."
2326 mkdir $LOCALSTATE/undigest/$undigest
2327 fi
2328 setup_mirror $LOCALSTATE/undigest/$undigest $3
2329 ;;
2330 setup-mirror)
2331 # Change mirror URL.
2333 check_root
2334 setup_mirror $LOCALSTATE $2
2335 ;;
2336 reconfigure)
2337 # Replay post_install from receipt
2339 check_for_package_on_cmdline
2340 check_root
2341 ROOT=""
2342 while [ -n "$3" ]; do
2343 case "$3" in
2344 --root=*)
2345 ROOT="${3#--root=}/"
2346 ;;
2347 *) shift 2
2348 echo -e "\nUnknown option $*.\n"
2349 exit 1
2350 ;;
2351 esac
2352 shift
2353 done
2354 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
2355 check_for_receipt $ROOT
2356 # Check for post_install
2357 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
2358 . $ROOT$INSTALLED/$PACKAGE/receipt
2359 post_install $ROOT
2360 # Log this activity
2361 [ -n "$ROOT" ] || log Reconfigured
2362 else
2363 echo -e "\nNothing to do for $PACKAGE."
2364 fi
2365 else
2366 echo -e "\npackage $PACKAGE is not installed."
2367 echo -e "Install package with 'tazpkg install' or 'tazpkg get-install'\n"
2368 fi
2369 ;;
2370 shell)
2371 # Tazpkg SHell
2373 if test $(id -u) = 0 ; then
2374 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
2375 else
2376 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
2377 fi
2378 if [ ! "$2" = "--noheader" ]; then
2379 clear
2380 echo ""
2381 echo -e "\033[1mTazpkg SHell.\033[0m"
2382 echo "================================================================================"
2383 echo "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
2384 echo ""
2385 fi
2386 while true
2387 do
2388 echo -en "$PROMPT"; read cmd
2389 case $cmd in
2390 q|quit)
2391 break ;;
2392 shell)
2393 echo "You are already running a Tazpkg SHell." ;;
2394 su)
2395 su -c 'exec tazpkg shell --noheader' && break ;;
2396 "")
2397 continue ;;
2398 *)
2399 tazpkg $cmd ;;
2400 esac
2401 done
2402 ;;
2403 depends)
2404 # Display dependencies tree
2405 cd $INSTALLED
2406 ALL_DEPS=""
2407 if [ -f $2/receipt ]; then
2408 dep_scan $2 ""
2409 fi
2410 ;;
2411 rdepends)
2412 # Display reverse dependencies tree
2413 cd $INSTALLED
2414 ALL_DEPS=""
2415 if [ -f $2/receipt ]; then
2416 rdep_scan $2
2417 fi
2418 ;;
2419 convert)
2420 # convert misc package format to .tazpkg
2421 check_for_package_file
2422 case "$PACKAGE_FILE" in
2423 *.deb|*.udeb)
2424 convert_deb;;
2425 *.rpm)
2426 convert_rpm;;
2427 *.tgz)
2428 convert_tgz;;
2429 *)
2430 echo "Unsupported format";;
2431 esac
2432 ;;
2433 link)
2434 # link a package from another slitaz installation
2435 PACKAGE=$2
2436 if [ ! -d "$TARGET_DIR" -o \
2437 ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
2438 cat <<EOT
2439 usage: tazpkg link package_name slitaz_root
2440 example: 'tazpkg link openoffice /mnt' will use less than 100k in
2441 your ram running system.
2442 EOT
2443 exit 1
2444 fi
2445 if [ -e "$INSTALLED/$PACKAGE" ]; then
2446 echo "$PACKAGE is already installed."
2447 exit 1
2448 fi
2449 ln -s $TARGET_DIR$INSTALLED/$PACKAGE $INSTALLED
2450 DEPENDS="$(. $INSTALLED/$PACKAGE/receipt ; echo $DEPENDS)"
2451 MISSING=""
2452 for i in $DEPENDS; do
2453 [ -e $INSTALLED/$i ] && continue
2454 MISSING="$MISSING$i "
2455 echo "Missing : $i"
2456 done
2457 if [ -n "$MISSING" ]; then
2458 echo ""
2459 echo -n "Link all missing dependencies (y/N) ? "; read answer
2460 echo ""
2461 if [ "$answer" = "y" ]; then
2462 for i in $MISSING; do
2463 tazpkg link $i $TARGET_DIR
2464 done
2465 else
2466 echo -e "\nLeaving dependencies for $PACKAGE unsolved."
2467 echo -e "The package is installed but will probably not work.\n"
2468 fi
2469 fi
2470 . $INSTALLED/$PACKAGE/receipt
2471 if grep -q ^pre_install $INSTALLED/$PACKAGE/receipt; then
2472 pre_install
2473 fi
2474 while read path; do
2475 [ -e $path ] && continue
2476 while true; do
2477 dir=$(dirname $path)
2478 [ -e $dir ] && break
2479 path=$dir
2480 done
2481 ln -s $TARGET_DIR$path $dir
2482 done < $INSTALLED/$PACKAGE/files.list
2483 if grep -q ^post_install $INSTALLED/$PACKAGE/receipt; then
2484 post_install
2485 fi
2486 ;;
2487 usage|*)
2488 # Print a short help or give usage for an unknown or empty command.
2490 usage
2491 ;;
2492 esac
2494 exit 0