tazpkg view tazpkg @ rev 288

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