tazpkg view tazpkg @ rev 599

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