tazpkg view tazpkg @ rev 595

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