tazpkg view tazpkg @ rev 464

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