tazpkg view tazpkg @ rev 412

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