tazpkg view tazpkg @ rev 386

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