tazpkg view tazpkg @ rev 295

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