tazpkg view tazpkg @ rev 406

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