tazpkg view tazpkg @ rev 275

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