tazpkg view tazpkg @ rev 262

Add tazpkg convert (thanks fireflyoo)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon May 25 16:47:46 2009 +0200 (2009-05-25)
parents 9d4ab409df71
children eff911177314
line source
1 #!/bin/sh
2 # Tazpkg - Tiny autonomous zone packages manager.
3 #
4 # This is a lightwight packages manager for *.tazpkg files, all written in
5 # SHell script. It works well with Busybox ash shell and bash. Tazpkg lets you
6 # list, install, remove, download or get information about a package. You can
7 # use 'tazpkg usage' to get a list of commands with short descriptions. Tazpkg
8 # also resolves dependencies and can upgrade packages from a mirror.
9 #
10 # (C) 2007-2008 SliTaz - GNU General Public License v3.
11 #
12 # Authors : Christophe Lincoln <pankso@slitaz.org>
13 # Pascal Bellard <pascal.bellard@slitaz.org>
14 # Eric Joseph-Alexandre <erjo@slitaz.org>
15 #
16 VERSION=2.8.1
18 ####################
19 # Script variables #
20 ####################
22 # Packages categories.
23 CATEGORIES="
24 base-system
25 x-window
26 utilities
27 network
28 graphics
29 multimedia
30 office
31 development
32 system-tools
33 security
34 games
35 misc
36 meta
37 non-free"
39 # Initialize some variables to use words
40 # rather than numbers for functions and actions.
41 COMMAND=$1
42 if [ -f "$2" ]; then
43 # Set pkg basename for install, extract
44 PACKAGE=$(basename ${2%.tazpkg} 2>/dev/null)
45 else
46 # Pkg name for remove, search and all other cmds
47 PACKAGE=${2%.tazpkg}
48 fi
49 PACKAGE_FILE=$2
50 TARGET_DIR=$3
51 TOP_DIR=`pwd`
52 TMP_DIR=/tmp/tazpkg-$$-$RANDOM
54 # Path to tazpkg used dir and configuration files
55 LOCALSTATE=/var/lib/tazpkg
56 INSTALLED=$LOCALSTATE/installed
57 CACHE_DIR=/var/cache/tazpkg
58 MIRROR=$LOCALSTATE/mirror
59 BLOCKED=$LOCALSTATE/blocked-packages.list
60 DEFAULT_MIRROR="http://mirror.slitaz.org/packages/`cat /etc/slitaz-release`/"
61 INSTALL_LIST=""
62 LOG=/var/log/tazpkg.log
64 # Bold red warning for upgrade.
65 WARNING="\\033[1;31mWARNING\\033[0;39m"
67 # Check if the directories and files used by Tazpkg
68 # exist. If not and user is root we create them.
69 if test $(id -u) = 0 ; then
70 if [ ! -d "$CACHE_DIR" ]; then
71 mkdir -p $CACHE_DIR
72 fi
73 if [ ! -d "$INSTALLED" ]; then
74 mkdir -p $INSTALLED
75 fi
76 if [ ! -f "$LOCALSTATE/mirror" ]; then
77 echo "$DEFAULT_MIRROR" > $LOCALSTATE/mirror
78 fi
79 fi
81 ####################
82 # Script functions #
83 ####################
85 # Print the usage.
86 usage ()
87 {
88 echo -e "SliTaz package manager - Version: $VERSION\n
89 \033[1mUsage:\033[0m tazpkg [command] [package|dir|pattern|list|cat|--opt] [dir|--opt]
90 tazpkg shell\n
91 \033[1mCommands: \033[0m
92 usage Print this short usage.
93 bugs Show known bugs in packages
94 list List installed packages on the system by category or all.
95 xhtml-list Create a xHTML list of installed packges.
96 list-mirror List all available packages on the mirror (--diff for new).
97 info Print information about a package.
98 desc Print description of a package (if it exists).
99 list-files List the files installed with a package.
100 list-config List the configuration files.
101 search Search for a package by pattern or name (options: -i|-l|-m).
102 search-file Search for file(s) in all installed packages files.
103 install Install a local (*.tazpkg) package (--forced to force).
104 install-list Install all packages from a list of packages.
105 remove Remove the specified package and all installed files.
106 extract Extract a (*.tazpkg) package into a directory.
107 pack Pack an unpacked or prepared package tree.
108 recharge Recharge your packages.list from the mirror.
109 repack Create a package archive from an installed package.
110 repack-config Create a package archive with configuration files.
111 upgrade Upgrade all installed and listed packages on the mirror.
112 block|unblock Block an installed package version or unblock it for upgrade.
113 get Download a package into the current directory.
114 get-install Download and install a package from the mirror.
115 get-install-list Download and install a list of packages from the mirror.
116 check Verify consistency of installed packages.
117 add-flavor Install the flavor list of packages.
118 install-flavor Install the flavor list of packages and remove other ones.
119 set-release Change release and update packages
120 clean-cache Clean all packages downloaded in cache directory.
121 depends Display dependencies tree.
122 rdepends Display reverse dependencies tree.
123 convert convert a debian package to a slitaz package (.tazpkg)
124 setup-mirror Change the mirror url configuration.
125 list-undigest List undigest mirrors.
126 remove-undigest Remove an undigest mirror.
127 add-undigest Add an undigest mirror.
128 setup-undigest Update an undigest mirror.
129 reconfigure Replay post install script from package."
130 }
132 # Status function with color (supported by Ash).
133 status()
134 {
135 local CHECK=$?
136 echo -en "\\033[70G[ "
137 if [ $CHECK = 0 ]; then
138 echo -en "\\033[1;33mOK"
139 else
140 echo -en "\\033[1;31mFailed"
141 fi
142 echo -e "\\033[0;39m ]"
143 return $CHECK
144 }
146 # Check if user is root to install, or remove packages.
147 check_root()
148 {
149 if test $(id -u) != 0 ; then
150 echo -e "\nYou must be root to run `basename $0` with this option."
151 echo -e "Please use 'su' and root password to become super-user.\n"
152 exit 0
153 fi
154 }
156 # Check for a package name on cmdline.
157 check_for_package_on_cmdline()
158 {
159 if [ -z "$PACKAGE" ]; then
160 echo -e "\nPlease specify a package name on the command line.\n"
161 exit 0
162 fi
163 }
165 # Check if the package (*.tazpkg) exist before installing or extracting.
166 check_for_package_file()
167 {
168 if [ ! -f "$PACKAGE_FILE" ]; then
169 echo -e "
170 Unable to find : $PACKAGE_FILE\n"
171 exit 0
172 fi
173 }
175 # Check for the receipt of an installed package.
176 check_for_receipt()
177 {
178 if [ ! -f "$1$INSTALLED/$PACKAGE/receipt" ]; then
179 echo -e "\nUnable to find the receipt : $1$INSTALLED/$PACKAGE/receipt\n"
180 exit 0
181 fi
182 }
184 # Get package name in a directory
185 package_fullname_in_dir()
186 {
187 [ -f $2$1/receipt ] || return
188 EXTRAVERSION=""
189 . $2$1/receipt
190 echo $PACKAGE-$VERSION$EXTRAVERSION
191 }
193 # Get package name that is already installed.
194 get_installed_package_pathname()
195 {
196 for i in $2$INSTALLED/${1%%-*}*; do
197 [ -d $i ] || continue
198 if [ "$1" = "$(package_fullname_in_dir $i $2)" ]; then
199 echo $i
200 return
201 fi
202 done
203 }
205 # Check if a package is already installed.
206 check_for_installed_package()
207 {
208 if [ -n "$(get_installed_package_pathname $PACKAGE $1)" ]; then
209 echo -e "
210 $PACKAGE is already installed. You can use the --forced option to force
211 installation or remove it and reinstall.\n"
212 exit 0
213 fi
214 }
216 # Check for packages.list to download and install packages.
217 check_for_packages_list()
218 {
219 if [ ! -f "$LOCALSTATE/packages.list" ]; then
220 if test $(id -u) = 0 ; then
221 tazpkg recharge
222 else
223 echo -e "
224 Unable to find the list : $LOCALSTATE/packages.list\n
225 You should probably run 'tazpkg recharge' as root to get the latest list of
226 packages available on the mirror.\n"
227 exit 0
228 fi
229 fi
230 }
232 # get an already installed package from packages.equiv
233 equivalent_pkg()
234 {
235 for i in $(grep -hs "^$1=" $LOCALSTATE/packages.equiv \
236 $LOCALSTATE/undigest/*/packages.equiv | sed "s/^$1=//"); do
237 if echo $i | grep -q : ; then
238 # format 'alternative:newname'
239 # if alternative is installed then substitute newname
240 if [ -f $2$INSTALLED/${i%:*}/receipt ]; then
241 # substitute package dependancy
242 echo ${i#*:}
243 return
244 fi
245 else
246 # if alternative is installed then nothing to install
247 if [ -f $2$INSTALLED/$i/receipt ]; then
248 # substitute installed package
249 echo $i
250 return
251 fi
252 fi
253 done
254 # if not found in packages.equiv then no substitution
255 echo $1
256 }
258 # get a virtual package from packages.equiv
259 virtual_pkg()
260 {
261 for i in $(grep -hs "^$1=" $LOCALSTATE/packages.equiv \
262 $LOCALSTATE/undigest/*/packages.equiv | sed "s/^$1=//"); do
263 if echo $i | grep -q : ; then
264 # format 'alternative:newname'
265 # if alternative is installed then substitute newname
266 if [ -f $2$INSTALLED/${i%:*}/receipt ]; then
267 # substitute package dependancy
268 echo ${i#*:}
269 return
270 fi
271 else
272 # unconditional substitution
273 echo $i
274 return
275 fi
276 done
277 }
279 # Get package filename available on the mirror
280 get_package_filename()
281 {
282 local pkg
283 pkg=$(grep -A 1 -sh "^$1$" $LOCALSTATE/packages.txt \
284 $LOCALSTATE/undigest/*/packages.txt | tail -1)
285 pkg=$(echo $pkg)
286 [ -n "$pkg" ] && pkg=$(grep -sh "^$1-$pkg" \
287 $LOCALSTATE/packages.list \
288 $LOCALSTATE/undigest/*/packages.list | head -1)
289 [ -n "$pkg" ] || pkg=$(grep -sh "^$1-[0-9]" \
290 $LOCALSTATE/packages.list \
291 $LOCALSTATE/undigest/*/packages.list | head -1)
292 [ -n "$pkg" ] || pkg=$(grep -sh "^$1-.[\.0-9]" \
293 $LOCALSTATE/packages.list \
294 $LOCALSTATE/undigest/*/packages.list | head -1)
295 if [ -z "$pkg" ]; then
296 # Check for vitual package
297 local equiv
298 equiv=$(virtual_pkg $1)
299 if [ "$equiv" != "$1" ]; then
300 PACKAGE=$equiv
301 get_package_filename $PACKAGE
302 return
303 fi
304 fi
305 echo $pkg
306 }
308 # Check for a package in packages.list. Used by get and get-install to grep
309 # package basename.
310 check_for_package_in_list()
311 {
312 local filename
313 local check_only
314 check_only="$1"
315 filename=$(get_package_filename $PACKAGE)
316 if [ -n "$filename" ]; then
317 PACKAGE=$filename
318 else
319 echo -e "\nUnable to find : $PACKAGE in the mirrored packages list.\n"
320 [ -n "$check_only" ] && return 1
321 exit 0
322 fi
323 }
325 # Log this activity
326 log()
327 {
328 local extra
329 [ "$1" = "Installed" ] && \
330 extra=" - $(grep $PACKAGE-$VERSION $LOCALSTATE/installed.md5 | awk '{ print $1 }')"
331 [ -e $LOG ] || touch $LOG
332 DATE=`date +'%F %T'`
333 [ -w $LOG ] &&
334 echo "$DATE - $1 - $PACKAGE ($VERSION$EXTRAVERSION)$extra" >> $LOG
335 }
337 # Download a file from this mirror
338 download_from()
339 {
340 local i
341 local mirrors
342 mirrors="$1"
343 shift
344 for i in $mirrors; do
345 case "$i" in
346 http://*|ftp://*) wget -c $i$@ && break;;
347 *) cp $i/$1 . && break;;
348 esac
349 done
350 }
352 # Download a file trying all mirrors
353 download()
354 {
355 local i
356 case "$1" in
357 *.tazpkg)
358 for i in $LOCALSTATE $LOCALSTATE/undigest/* ; do
359 grep "^${1%.tazpkg}$" $i/packages.list || continue
360 download_from "$(cat $i/mirror)" "$@" && return
361 done
362 esac
363 for i in $(cat $MIRROR $LOCALSTATE/undigest/*/mirror 2> /dev/null); do
364 download_from "$i" "$@" && break
365 done
366 }
368 # Extract a package with cpio and gzip.
369 extract_package()
370 {
371 echo -n "Extracting $PACKAGE... "
372 cpio -idm < $PACKAGE.tazpkg && rm -f $PACKAGE.tazpkg
373 echo -n "Extracting the pseudo fs... "
374 zcat fs.cpio.gz | cpio -idm && rm fs.cpio.gz
375 }
377 # This function installs a package in the rootfs.
378 install_package()
379 {
380 ROOT=$1
381 if [ -n "$ROOT" ]; then
382 # Get absolute path
383 ROOT=$(cd $ROOT; pwd)
384 fi
385 (
386 # Create package path early to avoid dependencies loop
387 mkdir -p $TMP_DIR
388 ( cd $TMP_DIR ; cpio -i receipt > /dev/null) < $PACKAGE_FILE
389 . $TMP_DIR/receipt
390 if grep -q ^pre_depends $TMP_DIR/receipt; then
391 pre_depends $ROOT
392 fi
393 # keep modifers list on upgrade
394 cp $ROOT$INSTALLED/$PACKAGE/modifiers $TMP_DIR 2> /dev/null
395 rm -rf $ROOT$INSTALLED/$PACKAGE 2> /dev/null
396 # Make the installed package data dir to store
397 # the receipt and the files list.
398 mkdir -p $ROOT$INSTALLED/$PACKAGE
399 cp $TMP_DIR/modifiers $ROOT$INSTALLED/$PACKAGE 2> /dev/null
400 rm -rf $TMP_DIR 2> /dev/null
401 sed -i "/ $(basename $PACKAGE_FILE)$/d" \
402 $ROOT$LOCALSTATE/installed.md5 2> /dev/null
403 cd $(dirname $PACKAGE_FILE)
404 md5sum $(basename $PACKAGE_FILE) >> $ROOT$LOCALSTATE/installed.md5
405 )
406 # Resolve package deps.
407 check_for_deps $ROOT
408 if [ ! "$MISSING_PACKAGE" = "" ]; then
409 install_deps $ROOT
410 fi
411 mkdir -p $TMP_DIR
412 [ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> $INSTALL_LIST-processed
413 echo ""
414 echo -e "\033[1mInstallation of :\033[0m $PACKAGE"
415 echo "================================================================================"
416 echo -n "Copying $PACKAGE... "
417 cp $PACKAGE_FILE $TMP_DIR
418 status
419 cd $TMP_DIR
420 extract_package
421 SELF_INSTALL=0
422 EXTRAVERSION=""
423 CONFIG_FILES=""
424 # Include temporary receipt to get the right variables.
425 . $PWD/receipt
426 if [ $SELF_INSTALL -ne 0 -a -n "$ROOT" ]; then
427 echo -n "Checking post install dependencies... "
428 [ -f $INSTALLED/$PACKAGE/receipt ]
429 if ! status; then
430 echo "Please run 'tazpkg install $PACKAGE_FILE' in / and retry."
431 cd .. && rm -rf $TMP_DIR
432 exit 1
433 fi
434 fi
435 # Remember modified packages
436 for i in $(grep -v '\[' files.list); do
437 [ -e "$ROOT$i" ] || continue
438 [ -d "$ROOT$i" ] && continue
439 for j in $(grep -l "^$i$" $ROOT$INSTALLED/*/files.list); do
440 local dir
441 dir=$(dirname $j)
442 [ "$j" = "$ROOT$INSTALLED/$PACKAGE/files.list" ] && continue
443 if grep -qs ^$(basename $dir)$ \
444 $ROOT$INSTALLED/$PACKAGE/modifiers; then
445 # Do not overload an overloaded file !
446 rm .$i 2> /dev/null
447 continue
448 fi
449 grep -qs ^$PACKAGE$ $dir/modifiers && continue
450 if [ -s "$dir/volatile.cpio.gz" ]; then
451 # We can modify backed up files
452 zcat $dir/volatile.cpio.gz | \
453 cpio -t 2> /dev/null | \
454 grep -q "^${i#/}$" && continue
455 fi
456 echo "$PACKAGE" >> $dir/modifiers
457 done
458 done
459 cp receipt files.list $ROOT$INSTALLED/$PACKAGE
460 # Copy the description if found.
461 if [ -f "description.txt" ]; then
462 cp description.txt $ROOT$INSTALLED/$PACKAGE
463 fi
464 # Copy the md5sum if found.
465 if [ -f "md5sum" ]; then
466 cp md5sum $ROOT$INSTALLED/$PACKAGE
467 fi
468 # Pre install commands.
469 if grep -q ^pre_install $ROOT$INSTALLED/$PACKAGE/receipt; then
470 pre_install $ROOT
471 fi
472 if [ -n "$CONFIG_FILES" ]; then
473 # save 'official' configuration files
474 echo -n "Save configuration files for $PACKAGE... "
475 for i in $CONFIG_FILES; do
476 ( cd fs ; find ${i#/} -type f )
477 done | ( cd fs ; cpio -o -H newc | gzip -9 ) > \
478 $ROOT$INSTALLED/$PACKAGE/volatile.cpio.gz
479 # keep user configuration files
480 for i in $CONFIG_FILES; do
481 ( cd fs ; find ${i#/} -type f )
482 done | while read i; do
483 [ -e $ROOT/$i ] || continue
484 cp -a $ROOT/$i fs/$i
485 done
486 status
487 fi
488 echo -n "Installing $PACKAGE... "
489 cp -a fs/* $ROOT/
490 status
491 # Remove the temporary random directory.
492 echo -n "Removing all tmp files... "
493 cd .. && rm -rf $TMP_DIR
494 status
495 # Post install commands.
496 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
497 post_install $ROOT
498 fi
499 cd $TOP_DIR
500 echo "================================================================================"
501 echo "$PACKAGE ($VERSION$EXTRAVERSION) is installed."
502 echo ""
503 # Log this activity
504 [ -n "$ROOT" ] || log Installed
506 }
508 # Check for loop in deps tree.
509 check_for_deps_loop()
510 {
511 local list
512 local pkg
513 local deps
514 pkg=$1
515 shift
516 [ -n "$1" ] || return
517 list=""
518 # Filter out already processed deps
519 for i in $@; do
520 case " $ALL_DEPS" in
521 *\ $i\ *);;
522 *) list="$list $i";;
523 esac
524 done
525 ALL_DEPS="$ALL_DEPS$list "
526 for i in $list; do
527 [ -f $i/receipt ] || continue
528 deps="$(DEPENDS=""; . $i/receipt; echo $DEPENDS)"
529 case " $deps " in
530 *\ $pkg\ *) echo -e "$MSG $i"; MSG="";;
531 *) check_for_deps_loop $pkg $deps;;
532 esac
533 done
534 }
536 # Check for missing deps listed in a receipt packages.
537 check_for_deps()
538 {
539 local saved;
540 saved=$PACKAGE
541 mkdir -p $TMP_DIR
542 ( cd $TMP_DIR ; cpio -i receipt > /dev/null ) < $PACKAGE_FILE
543 . $TMP_DIR/receipt
544 PACKAGE=$saved
545 rm -rf $TMP_DIR
546 for pkgorg in $DEPENDS
547 do
548 i=$(equivalent_pkg $pkgorg $1)
549 if [ ! -d "$1$INSTALLED/$i" ]; then
550 MISSING_PACKAGE=$i
551 deps=$(($deps+1))
552 elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
553 echo -e "$WARNING Dependency loop between $PACKAGE and $i."
554 fi
555 done
556 if [ ! "$MISSING_PACKAGE" = "" ]; then
557 echo -e "\033[1mTracking dependencies for :\033[0m $PACKAGE"
558 echo "================================================================================"
559 for pkgorg in $DEPENDS
560 do
561 i=$(equivalent_pkg $pkgorg $1)
562 if [ ! -d "$1$INSTALLED/$i" ]; then
563 MISSING_PACKAGE=$i
564 echo "Missing : $MISSING_PACKAGE"
565 fi
566 done
567 echo "================================================================================"
568 echo "$deps missing package(s) to install."
569 fi
570 }
572 # Install all missing deps. First ask user then install all missing deps
573 # from local dir, cdrom, media or from the mirror. In case we want to
574 # install packages from local, we need a packages.list to find the version.
575 install_deps()
576 {
577 local root
578 root=""
579 [ -n "$1" ] && root="--root=$1"
580 echo ""
581 echo -n "Install all missing dependencies (y/N) ? "; read anser
582 echo ""
583 if [ "$anser" = "y" ]; then
584 for pkgorg in $DEPENDS
585 do
586 pkg=$(equivalent_pkg $pkgorg $1)
587 if [ ! -d "$1$INSTALLED/$pkg" ]; then
588 local list
589 list="$INSTALL_LIST"
590 [ -n "$list" ] || list="$TOP_DIR/packages.list"
591 # We can install packages from a local dir by greping
592 # the TAZPKG_BASENAME in the local packages.list.
593 found=0
594 if [ -f "$list" ]; then
595 echo "Checking if $pkg exists in local list... "
596 mkdir $TMP_DIR
597 for i in $pkg-*.tazpkg; do
598 [ -f $i ] || continue
599 ( cd $TMP_DIR ; cpio -i receipt > /dev/null) < $i
600 [ "$(. $TMP_DIR/receipt; echo $PACKAGE)" = "$pkg" ] || continue
601 if grep -q ^$(package_fullname_in_dir $TMP_DIR).tazpkg$ $list
602 then
603 found=1
604 tazpkg install $i $root --list=$list
605 break
606 fi
607 done
608 rm -rf $TMP_DIR
609 fi
610 # Install deps from the mirror.
611 if [ $found -eq 0 ]; then
612 if [ ! -f "$LOCALSTATE/packages.list" ]; then
613 tazpkg recharge
614 fi
615 tazpkg get-install $pkg $root
616 fi
617 fi
618 done
619 else
620 echo -e "\nLeaving dependencies for $PACKAGE unsolved."
621 echo -e "The package is installed but will probably not work.\n"
622 fi
623 }
625 # xHTML packages list header.
626 xhtml_header()
627 {
628 cat > $XHTML_LIST << _EOT_
629 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
630 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
631 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
632 <head>
633 <title>Installed packages list</title>
634 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
635 <meta name="modified" content="$DATE" />
636 <meta name="generator" content="Tazpkg" />
637 <style type="text/css"><!--
638 body { font: 12px sans-serif, vernada, arial; margin: 0; }
639 #header { background: #f0ba08; color: black; height: 50px;
640 border-top: 1px solid black; border-bottom: 1px solid black; }
641 #content { margin: 0px 50px 26px 50px; }
642 #footer { border-top: 1px solid black; padding-top: 10px;}
643 h1 { margin: 14px 0px 0px 16px; }
644 pre { padding-left: 5px; }
645 hr { color: white; background: white; height: 1px; border: 0; }
646 --></style>
647 </head>
648 <body bgcolor="#ffffff">
649 <div id="header">
650 <h1><font color="#3e1220">Installed packages list</font></h1>
651 </div>
652 <hr />
653 <!-- Start content -->
654 <div id="content">
656 <p>
657 _packages_ packages installed - List generated on : $DATE
658 <p>
660 _EOT_
661 }
663 # xHTML content with packages info.
664 xhtml_pkg_info()
665 {
666 cat >> $XHTML_LIST << _EOT_
667 <h3>$PACKAGE</h3>
668 <pre>
669 Version : $VERSION$EXTRAVERSION
670 Short desc : $SHORT_DESC
671 Web site : <a href="$WEB_SITE">$WEB_SITE</a>
672 </pre>
674 _EOT_
675 }
677 # xHTML packages list footer.
678 xhtml_footer()
679 {
680 cat >> $XHTML_LIST << _EOT_
681 <hr />
682 <p id="footer">
683 $packages packages installed - List generated on : $DATE
684 </p>
686 <!-- End content -->
687 </div>
688 </body>
689 </html>
690 _EOT_
691 }
693 # Search pattern in installed packages.
694 search_in_installed_packages()
695 {
696 echo "Installed packages"
697 echo "================================================================================"
698 list=`ls -1 $INSTALLED | grep -i "$PATTERN"`
699 for pkg in $list
700 do
701 EXTRAVERSION=""
702 [ -f $INSTALLED/$pkg/receipt ] || continue
703 . $INSTALLED/$pkg/receipt
704 echo -n "$PACKAGE "
705 echo -en "\033[24G $VERSION$EXTRAVERSION"
706 echo -e "\033[42G $CATEGORY"
707 packages=$(($packages+1))
708 done
709 # Set correct ending messages.
710 if [ "$packages" = "" ]; then
711 echo "0 installed packages found for : $PATTERN"
712 echo ""
713 else
714 echo "================================================================================"
715 echo "$packages installed package(s) found for : $PATTERN"
716 echo ""
717 fi
718 }
720 # Search in packages.list for available pkgs.
721 search_in_packages_list()
722 {
723 echo "Available packages name-version"
724 echo "================================================================================"
725 packages=0
726 for i in $LOCALSTATE/packages.list $LOCALSTATE/undigest/*/packages.list; do
727 grep -is "$PATTERN" $i
728 packages=$(($packages + `grep -is "$PATTERN" $i | wc -l`))
729 done
730 if [ ! -f "$LOCALSTATE/packages.list" ]; then
731 echo -e "
732 No 'packages.list' found to check for mirrored packages. For more results,
733 please run 'tazpkg recharge' once as root before searching.\n"
734 fi
735 if [ "$packages" = "0" ]; then
736 echo "0 available packages found for : $PATTERN"
737 echo ""
738 else
739 echo "================================================================================"
740 echo "$packages available package(s) found for : $PATTERN"
741 echo ""
742 fi
743 }
745 # search --mirror: Search in packages.txt for available pkgs and give more
746 # info than --list or default.
747 search_in_packages_txt()
748 {
749 echo "Matching packages name with version and desc"
750 echo "================================================================================"
751 packages=0
752 for i in $LOCALSTATE/packages.txt $LOCALSTATE/undigest/*/packages.txt; do
753 grep -is -A 2 "^$PATTERN" $i
754 packages=$(($packages + `grep -is "^$PATTERN" $i | wc -l`))
755 done
756 if [ ! -f "$LOCALSTATE/packages.txt" ]; then
757 echo -e "
758 No 'packages.txt' found to check for mirrored packages. For more results,
759 please run 'tazpkg recharge' once as root before searching.\n"
760 fi
761 if [ "$packages" = "0" ]; then
762 echo "0 available packages found for : $PATTERN"
763 echo ""
764 else
765 echo "================================================================================"
766 echo "$packages available package(s) found for : $PATTERN"
767 echo ""
768 fi
769 }
771 # Install package-list from a flavor
772 install_flavor()
773 {
774 check_root
775 FLAVOR=$1
776 ARG=$2
777 mkdir -p $TMP_DIR
778 [ -f $FLAVOR.flavor ] && cp $FLAVOR.flavor $TMP_DIR
779 cd $TMP_DIR
780 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
781 zcat $FLAVOR.flavor | cpio -i 2>/dev/null
782 while read file; do
783 for pkg in $(ls -d $INSTALLED/${file%%-*}*); do
784 [ -f $pkg/receipt ] || continue
785 EXTRAVERSION=""
786 . $pkg/receipt
787 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && break
788 done
789 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && continue
790 cd $CACHE_DIR
791 download $file.tazpkg
792 cd $TMP_DIR
793 tazpkg install $CACHE_DIR/$file.tazpkg --forced
794 done < $FLAVOR.pkglist
795 [ -f $FLAVOR.nonfree ] && while read pkg; do
796 [ -d $INSTALLED/$pkg ] || continue
797 [ -d $INSTALLED/get-$pkg ] && tazpkg get-install get-$pkg
798 get-$pkg
799 done < $FLAVOR.nonfree
800 [ "$ARG" == "--purge" ] && for pkg in $(ls $INSTALLED); do
801 [ -f $INSTALLED/$pkg/receipt ] || continue
802 EXTRAVERSION=""
803 . $INSTALLED/$pkg/receipt
804 grep -q ^$PACKAGE-$VERSION$EXTRAVERSION$ $FLAVOR.pkglist && continue
805 grep -qs ^$PACKAGE$ $FLAVOR.nonfree && continue
806 tazpkg remove $PACKAGE
807 done
808 else
809 echo "Can't find flavor $FLAVOR Abort."
810 fi
811 cd $TOP_DIR
812 rm -rf $TMP_DIR
813 }
815 # Update mirror urls
816 setup_mirror()
817 {
818 # Backup old list.
819 if [ -f "$1/mirror" ]; then
820 cp -f $1/mirror $1/mirror.bak
821 fi
822 echo ""
823 echo -e "\033[1mCurrent mirror(s)\033[0m"
824 echo "================================================================================"
825 echo " `cat $1/mirror 2> /dev/null`"
826 echo "
827 Please enter URL of the new mirror (http, ftp or local path). You must specify
828 the complete address to the directory of the packages and packages.list file."
829 echo ""
830 echo -n "New mirror(s) URL : "
831 NEW_MIRROR_URL=$2
832 if [ -n "$NEW_MIRROR_URL" ]; then
833 echo $NEW_MIRROR_URL
834 else
835 read NEW_MIRROR_URL
836 fi
837 if [ "$NEW_MIRROR_URL" = "" ]; then
838 echo "Nothing has been changed."
839 else
840 echo "Setting mirror(s) to : $NEW_MIRROR_URL"
841 rm -f $1/mirror
842 for i in $NEW_MIRROR_URL; do
843 echo "$i" >> $1/mirror
844 done
845 fi
846 echo ""
847 }
849 # recursive dependencies scan
850 dep_scan()
851 {
852 for i in $1; do
853 case " $ALL_DEPS " in
854 *\ $i\ *) continue;;
855 esac
856 ALL_DEPS="$ALL_DEPS $i"
857 [ -n "$2" ] && echo "$2$i"
858 [ -f $i/receipt ] || continue
859 DEPENDS=""
860 . $i/receipt
861 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
862 done
863 }
865 # recursive reverse dependencies scan
866 rdep_scan()
867 {
868 SEARCH=$1
870 for i in * ; do
871 DEPENDS=""
872 . $i/receipt
873 echo "$i $(echo $DEPENDS)"
874 done | awk -v search=$SEARCH '
875 function show_deps(deps, all_deps, pkg, space)
876 {
877 if (all_deps[pkg] == 1) return
878 all_deps[pkg] = 1
879 if (space != "") printf "%s%s\n",space,pkg
880 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
881 show_deps(deps, all_deps, mydeps[i]," " space)
882 }
883 }
885 {
886 all_deps[$1] = 0
887 for (i = 2; i <= NF; i++)
888 deps[$i] = deps[$i] " " $1
889 }
891 END {
892 show_deps(deps, all_deps, search, "")
893 }
894 '
895 }
897 # convert a .deb package to .tazpkg
898 convert_deb()
899 {
900 mkdir -p $TMP_DIR
901 dpkg-deb -e $1 $TMP_DIR
902 package=$(grep '^ *Package' $TMP_DIR/control)
903 package=$(echo ${package##*:})
904 version=$(grep '^ *Version' $TMP_DIR/control)
905 version=$(echo ${version##*:})
906 descrip=$(grep '^ *Description' $TMP_DIR/control)
907 descrip=$(echo ${descrip##*:})
908 file="$package-$version"
909 mkdir -p $TMP_DIR/$file/fs/
910 dpkg-deb -x $1 $TMP_DIR/$file/fs
911 cd $TMP_DIR
912 cat > $file/receipt <<EOT
913 # SliTaz package receipt.
914 # generated by tazpkg from debian package $1
915 PACKAGE="$package"
916 VERSION="$version"
917 CATEGORY="misc"
918 SHORT_DESC="$descrip"
919 WEB_SITE="http://packages.debian.org/search?keywords=$package"
920 MAINTAINER="nobody@slitaz.org"
921 DEPENDS=""
922 EOT
923 tazpkg pack $file
924 mv $file.tazpkg $TOP_DIR
925 cd $TOP_DIR
926 rm -rf $TMP_DIR
927 }
929 ###################
930 # Tazpkg commands #
931 ###################
933 case "$COMMAND" in
934 list)
935 # List all installed packages or a specific category.
936 #
937 if [ "$2" = "blocked" ]; then
938 echo ""
939 echo -e "\033[1mBlocked packages\033[0m"
940 echo "================================================================================"
941 if [ -s "$BLOCKED" ];then
942 cat $BLOCKED
943 echo ""
944 else
945 echo -e "No blocked packages found.\n"
946 fi
947 exit 0
948 fi
949 # Display the list of categories.
950 if [ "$2" = "cat" -o "$2" = "categories" ]; then
951 echo ""
952 echo -e "\033[1mPackages categories :\033[0m"
953 echo "================================================================================"
954 for i in $CATEGORIES
955 do
956 echo $i
957 categories=$(($categories+1))
958 done
959 echo "================================================================================"
960 echo "$categories categories"
961 echo ""
962 exit 0
963 fi
964 # Check for an asked category.
965 if [ -n "$2" ]; then
966 ASKED_CATEGORY=$2
967 echo ""
968 echo -e "\033[1mInstalled packages of category :\033[0m $ASKED_CATEGORY"
969 echo "================================================================================"
970 for pkg in $INSTALLED/*
971 do
972 [ -f $pkg/receipt ] || continue
973 EXTRAVERSION=""
974 . $pkg/receipt
975 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
976 echo -n "$PACKAGE"
977 echo -e "\033[24G $VERSION$EXTRAVERSION"
978 packages=$(($packages+1))
979 fi
980 done
981 echo "================================================================================"
982 echo -e "$packages packages installed of category $ASKED_CATEGORY."
983 echo ""
984 else
985 # By default list all packages and versions.
986 echo ""
987 echo -e "\033[1mList of all installed packages\033[0m"
988 echo "================================================================================"
989 for pkg in $INSTALLED/*
990 do
991 [ -f $pkg/receipt ] || continue
992 EXTRAVERSION=""
993 . $pkg/receipt
994 echo -n "$PACKAGE"
995 echo -en "\033[24G $VERSION$EXTRAVERSION"
996 echo -e "\033[42G $CATEGORY"
997 packages=$(($packages+1))
998 done
999 echo "================================================================================"
1000 echo "$packages packages installed."
1001 echo ""
1002 fi
1003 ;;
1004 xhtml-list)
1005 # Get info in receipts and build list.
1006 DATE=`date +%Y-%m-%d\ \%H:%M:%S`
1007 if [ -n "$2" ]; then
1008 XHTML_LIST=$2
1009 else
1010 XHTML_LIST=installed-packages.html
1011 fi
1012 echo ""
1013 echo -e "\033[1mCreating xHTML list of installed packages\033[0m"
1014 echo "================================================================================"
1015 echo -n "Generating xHTML header..."
1016 xhtml_header
1017 status
1018 # Packages
1019 echo -n "Creating packages information..."
1020 for pkg in $INSTALLED/*
1021 do
1022 [ -f $pkg/receipt ] || continue
1023 EXTRAVERSION=""
1024 . $pkg/receipt
1025 xhtml_pkg_info
1026 packages=$(($packages+1))
1027 done
1028 status
1029 echo -n "Generating xHTML footer..."
1030 xhtml_footer
1031 status
1032 # sed pkgs nb in header.
1033 sed -i s/'_packages_'/"$packages"/ $XHTML_LIST
1034 echo "================================================================================"
1035 echo "$XHTML_LIST created - $packages packages."
1036 echo ""
1037 ;;
1038 list-mirror)
1039 # List all available packages on the mirror. Option --diff displays
1040 # last mirrored packages diff (see recharge).
1041 check_for_packages_list
1042 case $2 in
1043 --diff)
1044 if [ -f "$LOCALSTATE/packages.diff" ]; then
1045 echo ""
1046 echo -e "\033[1mMirrored packages diff\033[0m"
1047 echo "================================================================================"
1048 cat $LOCALSTATE/packages.diff
1049 echo "================================================================================"
1050 pkgs=`cat $LOCALSTATE/packages.diff | wc -l`
1051 echo "$pkgs new packages listed on the mirror."
1052 echo ""
1053 else
1054 echo -e "\nUnable to list anything, no packages.diff found."
1055 echo -e "Recharge your current list to create a first diff.\n"
1056 fi && exit 0 ;;
1057 --text|--txt)
1058 echo ""
1059 echo -e "\033[1mList of available packages on the mirror\033[0m"
1060 echo "================================================================================"
1061 cat $LOCALSTATE/packages.txt ;;
1062 --raw|*)
1063 echo ""
1064 echo -e "\033[1mList of available packages on the mirror\033[0m"
1065 echo "================================================================================"
1066 cat $LOCALSTATE/packages.list ;;
1067 esac
1068 echo "================================================================================"
1069 pkgs=`cat $LOCALSTATE/packages.list | wc -l`
1070 echo "$pkgs packages in the last recharged list."
1071 echo ""
1072 ;;
1073 list-files)
1074 # List files installed with the package.
1076 check_for_package_on_cmdline
1077 check_for_receipt
1078 echo ""
1079 echo -e "\033[1mInstalled files with :\033[0m $PACKAGE"
1080 echo "================================================================================"
1081 cat $INSTALLED/$PACKAGE/files.list | sort
1082 echo "================================================================================"
1083 files=`cat $INSTALLED/$PACKAGE/files.list | wc -l`
1084 echo "$files files installed with $PACKAGE."
1085 echo ""
1086 ;;
1087 info)
1088 # Information about package.
1090 check_for_package_on_cmdline
1091 check_for_receipt
1092 EXTRAVERSION=""
1093 . $INSTALLED/$PACKAGE/receipt
1094 echo ""
1095 echo -e "\033[1mTazpkg information\033[0m
1096 ================================================================================
1097 Package : $PACKAGE
1098 Version : $VERSION$EXTRAVERSION
1099 Category : $CATEGORY
1100 Short desc : $SHORT_DESC
1101 Maintainer : $MAINTAINER"
1102 if [ ! "$DEPENDS" = "" ]; then
1103 echo -e "Depends : $DEPENDS"
1104 fi
1105 if [ ! "$SUGGESTED" = "" ]; then
1106 echo -e "Suggested : $SUGGESTED"
1107 fi
1108 if [ ! "$BUILD_DEPENDS" = "" ]; then
1109 echo -e "Build deps : $BUILD_DEPENDS"
1110 fi
1111 if [ ! "$WANTED" = "" ]; then
1112 echo -e "Wanted src : $WANTED"
1113 fi
1114 if [ ! "$WEB_SITE" = "" ]; then
1115 echo -e "Web site : $WEB_SITE"
1116 fi
1117 echo "================================================================================"
1118 echo ""
1119 ;;
1120 desc)
1121 # Display package description.txt if available.
1122 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
1123 echo ""
1124 echo -e "\033[1mDescription of :\033[0m $PACKAGE"
1125 echo "================================================================================"
1126 cat $INSTALLED/$PACKAGE/description.txt
1127 echo "================================================================================"
1128 echo ""
1129 else
1130 echo -e "\nSorry, no description available for this package.\n"
1131 fi
1132 ;;
1133 search)
1134 # Search for a package by pattern or name.
1136 PATTERN="$2"
1137 if [ -z "$PATTERN" ]; then
1138 echo -e "\nPlease specify a pattern or package name to search for."
1139 echo -e "Example : 'tazpkg search paint'.\n"
1140 exit 0
1141 fi
1142 echo ""
1143 echo -e "\033[1mSearch result for :\033[0m $PATTERN"
1144 echo ""
1145 # Default is to search in installed pkgs and the raw list.
1146 case $3 in
1147 -i|--installed)
1148 search_in_installed_packages ;;
1149 -l|--list)
1150 search_in_packages_list ;;
1151 -m|--mirror)
1152 search_in_packages_txt ;;
1153 *)
1154 search_in_installed_packages
1155 search_in_packages_list ;;
1156 esac
1157 ;;
1158 search-file)
1159 # Search for a file by pattern or name in all files.list.
1161 if [ -z "$2" ]; then
1162 echo -e "\nPlease specify a pattern or file name to search for."
1163 echo -e "Example : 'tazpkg search-file libnss'. \n"
1164 exit 0
1165 fi
1166 echo ""
1167 echo -e "\033[1mSearch result for file :\033[0m $2"
1168 echo "================================================================================"
1170 if [ "$3" == "--mirror" ]; then
1172 match=0
1173 for i in $LOCALSTATE/files.list.lzma \
1174 $LOCALSTATE/undigest/*/files.list.lzma; do
1175 [ -f $i ] || continue
1176 unlzma -c $i | grep -- ".*:.*$2" | awk '
1177 BEGIN { last="" }
1179 pkg=substr($0,0,index($0,":")-1);
1180 file=substr($0,index($0,":")+2);
1181 if (last != pkg) {
1182 last = pkg;
1183 printf("\n%c[1mPackage %s :%c[0m\n",27,pkg,27);
1185 printf("%s\n",file);
1186 }'
1187 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | wc -l`))
1188 done
1190 else
1192 # Check all pkg files.list in search match with specify the package
1193 # name and the full path to the file(s).
1194 for pkg in $INSTALLED/*
1195 do
1196 if grep -qs "$2" $pkg/files.list; then
1197 . $pkg/receipt
1198 echo ""
1199 echo -e "\033[1mPackage $PACKAGE :\033[0m"
1200 grep "$2" $pkg/files.list
1201 files=`grep $2 $pkg/files.list | wc -l`
1202 match=$(($match+$files))
1203 fi
1204 done
1206 fi
1208 if [ "$match" = "" ]; then
1209 echo "0 file found for : $2"
1210 echo ""
1211 else
1212 echo ""
1213 echo "================================================================================"
1214 echo "$match file(s) found for : $2"
1215 echo ""
1216 fi
1217 ;;
1218 install)
1219 # Install .tazpkg packages.
1221 check_root
1222 check_for_package_on_cmdline
1223 check_for_package_file
1224 # Check if forced install.
1225 DO_CHECK="yes"
1226 ROOT=""
1227 while [ -n "$3" ]; do
1228 case "$3" in
1229 --forced)
1230 DO_CHECK="no"
1231 ;;
1232 --root=*)
1233 ROOT="${3#--root=}"
1234 ;;
1235 --list=*)
1236 INSTALL_LIST="${3#--list=}"
1237 ;;
1238 *) shift 2
1239 echo -e "\nUnknown option $*.\n"
1240 exit 1
1241 ;;
1242 esac
1243 shift
1244 done
1245 if [ "$DO_CHECK" = "yes" ]; then
1246 check_for_installed_package $ROOT
1247 fi
1248 install_package $ROOT
1249 ;;
1250 install-list|get-install-list)
1251 # Install a set of packages from a list.
1253 check_root
1254 if [ -z "$2" ]; then
1255 echo -e "
1256 Please change directory (cd) to the packages repository, and specify the
1257 list of packages to install. Example : tazpkg install-list packages.list\n"
1258 exit 0
1259 fi
1260 # Check if the packages list exist.
1261 if [ ! -f "$2" ]; then
1262 echo "Unable to find : $2"
1263 exit 0
1264 else
1265 LIST=`cat $2`
1266 fi
1268 # Remember processed list
1269 export INSTALL_LIST="$2"
1271 # Set $COMMAND and install all packages.
1272 if [ "$1" = "get-install-list" ]; then
1273 COMMAND=get-install
1274 else
1275 COMMAND=install
1276 fi
1277 touch $2-processed
1278 for pkg in $LIST
1279 do
1280 grep -qs ^$pkg$ $2-processed && continue
1281 tazpkg $COMMAND $pkg --list=$2 "$3" "$4" "$5"
1282 done
1283 rm -f $2-processed
1284 ;;
1285 add-flavor)
1286 # Install a set of packages from a flavor.
1288 install_flavor $2
1289 ;;
1290 install-flavor)
1291 # Install a set of packages from a flavor and purge other ones.
1293 install_flavor $2 --purge
1294 ;;
1295 set-release)
1296 # Change curent release and upgrade packages.
1298 RELEASE=$2
1299 if [ -z "$RELEASE" ]; then
1300 echo -e "\nPlease specify the release you want on the command line."
1301 echo -e "Example: tazpkg set-release cooking\n"
1302 exit 0
1303 fi
1304 rm /var/lib/tazpkg/mirror
1305 echo "$RELEASE" > /etc/slitaz-release
1306 tazpkg recharge && tazpkg upgrade
1308 # Install missing depends
1309 cd $INSTALLED
1310 for i in * ; do
1311 DEPENDS=""
1312 . $i/receipt
1313 for j in $DEPENDS ; do
1314 [ -d $j ] || tazpkg get-install $j
1315 done
1316 done
1317 ;;
1318 remove)
1319 # Remove packages.
1321 check_root
1322 check_for_package_on_cmdline
1323 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
1324 echo -e "\n$PACKAGE is not installed.\n"
1325 exit 0
1326 else
1327 ALTERED=""
1328 THE_PACKAGE=$PACKAGE # altered by receipt
1329 for i in $(cd $INSTALLED ; ls); do
1330 [ -f $INSTALLED/$i/receipt ] || continue
1331 DEPENDS=""
1332 . $INSTALLED/$i/receipt
1333 case " $(echo $DEPENDS) " in
1334 *\ $THE_PACKAGE\ *) ALTERED="$ALTERED $i";;
1335 esac
1336 done
1337 EXTRAVERSION=""
1338 . $INSTALLED/$THE_PACKAGE/receipt
1339 fi
1340 echo ""
1341 if [ -n "$ALTERED" ]; then
1342 echo "The following packages depend on $PACKAGE :"
1343 for i in $ALTERED; do
1344 echo " $i"
1345 done
1346 fi
1347 REFRESH=$(cd $INSTALLED ; grep -sl ^$PACKAGE$ */modifiers)
1348 if [ -n "$REFRESH" ]; then
1349 echo "The following packages have been modified by $PACKAGE :"
1350 for i in $REFRESH; do
1351 echo " ${i%/modifiers}"
1352 done
1353 fi
1354 echo "Remove $PACKAGE ($VERSION$EXTRAVERSION) ?"
1355 echo -n "Please confirm uninstallation (y/N) : "; read anser
1356 if [ "$anser" = "y" ]; then
1357 echo ""
1358 echo -e "\033[1mRemoving :\033[0m $PACKAGE"
1359 echo "================================================================================"
1360 # Pre remove commands.
1361 if grep -q ^pre_remove $INSTALLED/$PACKAGE/receipt; then
1362 pre_remove
1363 fi
1364 echo -n "Removing all files installed..."
1365 if [ -f $INSTALLED/$PACKAGE/modifiers ]; then
1366 for mod in `cat $INSTALLED/$PACKAGE/modifiers`
1367 do
1368 for file in `cat $INSTALLED/$PACKAGE/files.list`
1369 do
1370 [ $(grep ^$file$ $INSTALLED/$mod/files.list | wc -l) -gt 1 ] && continue
1371 rm -f $file 2>/dev/null
1372 dir="$file"
1373 while [ "$dir" != "/" ]; do
1374 dir="$(dirname $dir)"
1375 rmdir $dir 2> /dev/null || break
1376 done
1377 done
1378 done
1379 else
1380 for file in `cat $INSTALLED/$PACKAGE/files.list`
1381 do
1382 rm -f $file 2>/dev/null
1383 dir="$file"
1384 while [ "$dir" != "/" ]; do
1385 dir="$(dirname $dir)"
1386 rmdir $dir 2> /dev/null || break
1387 done
1388 done
1389 fi
1390 status
1391 if grep -q ^post_remove $INSTALLED/$PACKAGE/receipt; then
1392 post_remove
1393 fi
1394 # Remove package receipt.
1395 echo -n "Removing package receipt..."
1396 rm -rf $INSTALLED/$PACKAGE
1397 status
1398 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$/d" \
1399 $LOCALSTATE/installed.md5 2> /dev/null
1400 # Log this activity
1401 log Removed
1402 if [ -n "$ALTERED" ]; then
1403 echo -n "Remove packages depending on $PACKAGE"
1404 echo -n " (y/N) ? "; read anser
1405 if [ "$anser" = "y" ]; then
1406 for i in $ALTERED; do
1407 if [ -d "$INSTALLED/$i" ]; then
1408 tazpkg remove $i
1409 fi
1410 done
1411 fi
1412 fi
1413 if [ -n "$REFRESH" ]; then
1414 echo -n "Reinstall packages modified by $PACKAGE"
1415 echo -n " (y/N) ? "; read anser
1416 if [ "$anser" = "y" ]; then
1417 for i in $REFRESH; do
1418 if [ $(wc -l < $INSTALLED/$i) -gt 1 ]; then
1419 echo "Check $INSTALLED/$i for reinstallation"
1420 continue
1421 fi
1422 rm -r $INSTALLED/$i
1423 tazpkg get-install ${i%/modifiers} --forced
1424 done
1425 fi
1426 fi
1427 else
1428 echo ""
1429 echo "Uninstallation of $PACKAGE cancelled."
1430 fi
1431 echo ""
1432 ;;
1433 extract)
1434 # Extract .tazpkg cpio archive into a directory.
1436 check_for_package_on_cmdline
1437 check_for_package_file
1438 echo ""
1439 echo -e "\033[1mExtracting :\033[0m $PACKAGE"
1440 echo "================================================================================"
1441 # If no directory destination is found on the cmdline
1442 # we create one in the current dir using the package name.
1443 if [ -n "$TARGET_DIR" ]; then
1444 DESTDIR=$TARGET_DIR/$PACKAGE
1445 else
1446 DESTDIR=$PACKAGE
1447 fi
1448 mkdir -p $DESTDIR
1449 echo -n "Copying original package..."
1450 cp $PACKAGE_FILE $DESTDIR
1451 status
1452 cd $DESTDIR
1453 extract_package
1454 echo "================================================================================"
1455 echo "$PACKAGE is extracted to : $DESTDIR"
1456 echo ""
1457 ;;
1458 list-config)
1459 # List configuration files installed.
1461 if [ "$2" = "--box" ]; then
1462 mkdir -p $TMP_DIR && cd $TMP_DIR
1463 FILES="$INSTALLED/*/volatile.cpio.gz"
1464 [ -n "$3" ] && FILES="$INSTALLED/$3/volatile.cpio.gz"
1465 for i in $FILES; do
1466 zcat $i | cpio -idm > /dev/null
1467 find * -type f 2>/dev/null | while read file; do
1468 if [ ! -e /$file ]; then
1469 echo -n "|--|--|--|File lost"
1470 else
1471 echo -n "$(stat -c "%A|%U|%G|%s|" /$file)"
1472 cmp $file /$file > /dev/null 2>&1 || \
1473 echo -n "$(stat -c "%.16y" /$file)"
1474 fi
1475 echo "|/$file"
1476 done
1477 rm -rf *
1478 done
1479 cd $TOP_DIR
1480 rm -rf $TMP_DIR
1481 else
1482 echo ""
1483 echo -e "\033[1mConfiguration files"
1484 echo "================================================================================"
1485 for i in $INSTALLED/*/volatile.cpio.gz; do
1486 [ -n "$2" -a "$i" != "$INSTALLED/$2/volatile.cpio.gz" ] && continue
1487 [ -f "$i" ] || continue
1488 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1489 done | sed 's|^|/|' | sort
1490 echo "================================================================================"
1491 echo ""
1492 fi
1493 ;;
1494 repack-config)
1495 # Create SliTaz package archive from configuration files.
1497 mkdir -p $TMP_DIR && cd $TMP_DIR
1498 CONFIG_VERSION=1.0
1499 mkdir config-$CONFIG_VERSION
1500 cd config-$CONFIG_VERSION
1501 for i in $INSTALLED/*/volatile.cpio.gz; do
1502 zcat $i | cpio -t | grep -v "[0-9]* blocks"
1503 done > files.list
1504 mkdir fs
1505 cd fs
1506 ( cd / ; cpio -o -H newc ) < ../files.list | cpio -idm > /dev/null
1507 mkdir -p etc/tazlito
1508 for i in $INSTALLED/*/receipt; do
1509 EXTRAVERSION=""
1510 . $i
1511 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1512 done > etc/tazlito/config-packages.list
1513 cd ..
1514 echo "etc/tazlito/config-packages.list" >> files.list
1515 cat > receipt <<EOT
1516 # SliTaz package receipt.
1518 PACKAGE="config"
1519 VERSION="$CONFIG_VERSION"
1520 CATEGORY="base-system"
1521 SHORT_DESC="User configuration backup on $(date)"
1522 DEPENDS="$(ls $INSTALLED)"
1523 EOT
1524 cd ..
1525 tazpkg pack config-$CONFIG_VERSION
1526 cp config-$CONFIG_VERSION.tazpkg $TOP_DIR
1527 cd $TOP_DIR
1528 rm -rf $TMP_DIR
1529 ;;
1530 repack)
1531 # Create SliTaz package archive from an installed package.
1533 check_for_package_on_cmdline
1534 check_for_receipt
1535 EXTRAVERSION=""
1536 . $INSTALLED/$PACKAGE/receipt
1537 echo ""
1538 echo -e "\033[1mRepacking :\033[0m $PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
1539 echo "================================================================================"
1540 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
1541 echo "Can't repack $PACKAGE"
1542 exit 1
1543 fi
1544 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
1545 echo "Can't repack, $PACKAGE files have been modified by:"
1546 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
1547 echo " $i"
1548 done
1549 exit 1
1550 fi
1551 MISSING=""
1552 while read i; do
1553 [ -e "$i" ] && continue
1554 [ -L "$i" ] || MISSING="$MISSING\n $i"
1555 done < $INSTALLED/$PACKAGE/files.list
1556 if [ -n "$MISSING" ]; then
1557 echo -n "Can't repack, the following files are lost:"
1558 echo -e "$MISSING"
1559 exit 1
1560 fi
1561 mkdir -p $TMP_DIR && cd $TMP_DIR
1562 FILES="fs.cpio.gz\n"
1563 for i in $(ls $INSTALLED/$PACKAGE) ; do
1564 [ "$i" = "volatile.cpio.gz" ] && continue
1565 [ "$i" = "modifiers" ] && continue
1566 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
1567 done
1568 ln -s / rootfs
1569 mkdir tmp
1570 sed 's/^/rootfs/' < files.list | cpio -o -H newc 2>/dev/null |\
1571 ( cd tmp ; cpio -idm 2>/dev/null )
1572 mv tmp/rootfs fs
1573 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
1574 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
1575 ( cd fs; cpio -idm )
1576 fi
1577 if grep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
1578 . $INSTALLED/$PACKAGE/receipt
1579 repack_cleanup fs
1580 fi
1581 if [ -f $INSTALLED/$PACKAGE/md5sum ]; then
1582 sed 's, , fs,' < $INSTALLED/$PACKAGE/md5sum | \
1583 md5sum -s -c || {
1584 echo "Can't repack, md5sum error."
1585 cd $TOP_DIR
1586 rm -rf $TMP_DIR
1587 exit 1
1589 fi
1590 find fs | cpio -o -H newc 2> /dev/null | gzip -9 > fs.cpio.gz
1591 echo -e "$FILES" | cpio -o -H newc 2> /dev/null > \
1592 $TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg
1593 cd $TOP_DIR
1594 \rm -R $TMP_DIR
1595 echo "Package $PACKAGE repacked successfully."
1596 echo "Size : `du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg`"
1597 echo ""
1598 ;;
1599 pack)
1600 # Create SliTaz package archive using cpio and gzip.
1602 check_for_package_on_cmdline
1603 cd $PACKAGE
1604 if [ ! -f "receipt" ]; then
1605 echo "Receipt is missing. Please read the documentation."
1606 exit 0
1607 else
1608 echo ""
1609 echo -e "\033[1mPacking :\033[0m $PACKAGE"
1610 echo "================================================================================"
1611 # Create files.list with redirecting find outpout.
1612 echo -n "Creating the list of files..." && cd fs
1613 find . -type f -print > ../files.list
1614 find . -type l -print >> ../files.list
1615 cd .. && sed -i s/'^.'/''/ files.list
1616 status
1617 echo -n "Creating md5sum of files..."
1618 while read file; do
1619 [ -L "fs$file" ] && continue
1620 [ -f "fs$file" ] || continue
1621 case "$file" in
1622 /lib/modules/*/modules.*|*.pyc) continue;;
1623 esac
1624 md5sum "fs$file" | sed 's/ fs/ /'
1625 done < files.list > md5sum
1626 status
1627 UNPACKED_SIZE=$(du -chs fs receipt files.list md5sum \
1628 description.txt 2> /dev/null | awk \
1629 '{ sz=$1 } END { print sz }')
1630 # Build cpio archives.
1631 echo -n "Compressing the fs... "
1632 find fs -print | cpio -o -H newc | gzip > fs.cpio.gz
1633 rm -rf fs
1634 status
1635 PACKED_SIZE=$(du -chs fs.cpio.gz receipt files.list \
1636 md5sum description.txt 2> /dev/null | awk \
1637 '{ sz=$1 } END { print sz }')
1638 echo -n "Undating receipt sizes..."
1639 sed -i s/^PACKED_SIZE.*$// receipt
1640 sed -i s/^UNPACKED_SIZE.*$// receipt
1641 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
1642 status
1643 echo -n "Creating full cpio archive... "
1644 find . -print | cpio -o -H newc > ../$PACKAGE.tazpkg
1645 status
1646 echo -n "Restoring original package tree... "
1647 zcat fs.cpio.gz | cpio -idm
1648 status
1649 rm fs.cpio.gz && cd ..
1650 echo "================================================================================"
1651 echo "Package $PACKAGE compressed successfully."
1652 echo "Size : `du -sh $PACKAGE.tazpkg`"
1653 echo ""
1654 fi
1655 ;;
1656 recharge)
1657 # Recharge packages.list from a mirror.
1659 check_root
1660 for path in $LOCALSTATE $LOCALSTATE/undigest/*; do
1661 [ -f $path/mirror ] || continue
1662 echo ""
1663 if [ "$path" != "$LOCALSTATE" ]; then
1664 echo "Recharge undigest $(basename $path):"
1665 fi
1666 cd $path
1667 if [ -f "packages.list" ]; then
1668 echo -n "Creating backup of the last packages list..."
1669 mv -f packages.desc packages.desc.bak 2>/dev/null
1670 mv -f packages.md5 packages.md5.txt 2>/dev/null
1671 mv -f packages.txt packages.txt.bak 2>/dev/null
1672 mv -f packages.list packages.list.bak 2>/dev/null
1673 mv -f packages.equiv packages.equiv.bak 2>/dev/null
1674 mv -f files.list.lzma files.list.lzma.bak 2> /dev/null
1675 mv -f mirrors mirrors.bak 2> /dev/null
1676 status
1677 fi
1678 download_from "$(cat mirror)" packages.desc
1679 download_from "$(cat mirror)" packages.md5
1680 download_from "$(cat mirror)" packages.txt
1681 download_from "$(cat mirror)" packages.list
1682 download_from "$(cat mirror)" packages.equiv
1683 download_from "$(cat mirror)" files.list.lzma
1684 download_from "$(cat mirror)" mirrors
1685 [ -f mirrors ] || mv mirrors.bak mirrors 2> /dev/null
1686 suffix=$(head -1 mirror)
1687 suffix=packages${suffix#*/packages}
1688 for i in $(cat mirrors 2> /dev/null); do
1689 grep -qs $i mirror || echo $i$suffix >> mirror
1690 done
1691 if [ -f "packages.list.bak" ]; then
1692 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
1693 sed -i s/+// packages.diff
1694 echo ""
1695 echo -e "\033[1mMirrored packages diff\033[0m"
1696 echo "================================================================================"
1697 cat packages.diff
1698 if [ ! "`cat packages.diff | wc -l`" = 0 ]; then
1699 echo "================================================================================"
1700 echo "`cat packages.diff | wc -l` new packages on the mirror."
1701 echo ""
1702 else
1703 echo "`cat packages.diff | wc -l` new packages on the mirror."
1704 echo ""
1705 fi
1706 else
1707 echo -e "
1708 ================================================================================
1709 Last packages.list is ready to use. Note that next time you recharge the list,
1710 a list of differencies will be displayed to show new and upgradeable packages.\n"
1711 fi
1712 done
1713 ;;
1714 upgrade)
1715 # Upgrade all installed packages with the new version from the mirror.
1717 check_root
1718 check_for_packages_list
1719 cd $LOCALSTATE
1720 # Touch the blocked pkgs list to avoid errors and remove any old
1721 # upgrade list.
1722 touch blocked-packages.list
1723 rm -f upgradeable-packages.list
1724 echo ""
1725 echo -e "\033[1mAvailable upgrades\033[0m"
1726 echo "================================================================================"
1727 echo ""
1728 # Some packages must be installed first
1729 FIRST_CLASS_PACKAGE=" glibc-base slitaz-base-files slitaz-boot-scripts "
1730 for pkg in $INSTALLED/*
1731 do
1732 [ -f $pkg/receipt ] || continue
1733 EXTRAVERSION=""
1734 . $pkg/receipt
1735 # Display package name to show that Tazpkg is working...
1736 echo -en "\\033[0G "
1737 echo -en "\\033[0G$PACKAGE"
1738 # Skip specified pkgs listed in $LOCALSTATE/blocked-packages.list
1739 if grep -qs "^$PACKAGE" $BLOCKED; then
1740 blocked=$(($blocked+1))
1741 else
1742 # Check if the installed package is in the current list (other
1743 # mirror or local).
1744 NEW_PACKAGE=$(get_package_filename $PACKAGE)
1746 if [ -n "$NEW_PACKAGE" ]; then
1747 # Set new pkg and version for future comparison
1748 NEW_VERSION=`echo $NEW_PACKAGE | sed s/$PACKAGE-/''/`
1749 # Change '-' and 'pre' to points.
1750 NEW_VERSION=`echo $NEW_VERSION | sed s/'-'/'.'/`
1751 VERSION=`echo $VERSION | sed s/'-'/'.'/`$EXTRAVERSION
1752 NEW_VERSION=`echo $NEW_VERSION | sed s/'pre'/'.'/`
1753 VERSION=`echo $VERSION | sed s/'pre'/'.'/`
1754 NEW_VERSION=`echo $NEW_VERSION | sed 's/[A-Z]\.//'`
1755 VERSION=`echo $VERSION | sed 's/[A-Z]\.//'`
1756 # Compare version. Upgrades are only available for official
1757 # packages, so we control the mirror and it should be ok if
1758 # we just check for equality.
1759 RELEASE=""
1760 if [ -f installed.md5 -a -f packages.md5 ]; then
1761 current_md5=$(grep -s " $PACKAGE-$VERSION" installed.md5 | awk '{ print $1 }')
1762 new_md5=$(grep -hs " $PACKAGE-$VERSION" packages.md5 undigest/*/packages.md5 | head -1 | awk '{ print $1 }')
1763 [ -n "$current_md5" ] && [ -n "$new_md5" ] &&
1764 [ "$current_md5" != "$new_md5" ] && RELEASE=build
1765 fi
1766 if [ "$VERSION" != "$NEW_VERSION" -o -n "$RELEASE" ]; then
1767 # Version seems different. Check for major, minor or
1768 # revision
1769 PKG_MAJOR=`echo ${VERSION%_*} | cut -f1 -d"."`
1770 NEW_MAJOR=`echo ${NEW_VERSION%_*} | cut -f1 -d"."`
1771 PKG_MINOR=`echo ${VERSION%_*} | cut -f2 -d"."`
1772 NEW_MINOR=`echo ${NEW_VERSION%_*} | cut -f2 -d"."`
1773 # Minor
1774 if [ "$NEW_MINOR" -gt "$PKG_MINOR" ] 2> /dev/null; then
1775 RELEASE=minor
1776 fi
1777 if [ "$NEW_MINOR" -lt "$PKG_MINOR" ] 2> /dev/null; then
1778 RELEASE=$WARNING
1779 FIXE=yes
1780 fi
1781 # Major
1782 if [ "$NEW_MAJOR" -gt "$PKG_MAJOR" ] 2> /dev/null; then
1783 RELEASE=major
1784 FIXE=""
1785 fi
1786 if [ "$NEW_MAJOR" -lt "$PKG_MAJOR" ] 2> /dev/null; then
1787 RELEASE=$WARNING
1788 FIXE=yes
1789 fi
1790 # Default to revision.
1791 if [ -z $RELEASE ]; then
1792 RELEASE=revision
1793 fi
1794 # Pkg name is already displayed by the check process.
1795 echo -en "\033[24G $VERSION"
1796 echo -en "\033[38G --->"
1797 echo -en "\033[43G $NEW_VERSION"
1798 echo -en "\033[58G $CATEGORY"
1799 echo -e "\033[72G $RELEASE"
1800 up=$(($up+1))
1801 echo "$PACKAGE" >> upgradeable-packages.list
1802 case "$FIRST_CLASS_PACKAGE" in
1803 *\ $PACKAGE\ *) echo "$PACKAGE" >> upgradeable-packages.list$$;;
1804 esac
1805 unset RELEASE
1806 fi
1807 packages=$(($packages+1))
1808 fi
1809 fi
1810 done
1811 if [ -z $blocked ]; then
1812 blocked=0
1813 fi
1814 # Clean last checked package and display summary.
1815 if [ ! "$up" = "" ]; then
1816 echo -e "\\033[0G "
1817 echo "================================================================================"
1818 echo "$packages installed and listed packages to consider, $up to upgrade, $blocked blocked."
1819 echo ""
1820 else
1821 echo -e "\\033[0GSystem is up-to-date. "
1822 echo ""
1823 echo "================================================================================"
1824 echo "$packages installed and listed packages to consider, 0 to upgrade, $blocked blocked."
1825 echo ""
1826 exit 0
1827 fi
1828 # What to do if major or minor version is smaller.
1829 if [ "$FIXE" == "yes" ]; then
1830 echo -e "$WARNING ---> Installed package seems more recent than the mirrored one."
1831 echo "You can block packages using the command : 'tazpkg block package'"
1832 echo "Or upgrade packages at your own risk."
1833 echo ""
1834 fi
1835 # Ask for upgrade, it can be done another time.
1836 echo -n "Upgrade now (y/N) ? "; read anser
1837 if [ ! "$anser" = "y" ]; then
1838 echo -e "\nExiting. No package upgraded.\n"
1839 exit 0
1840 fi
1841 # If anser is yes (y). Install all new versions.
1842 cat upgradeable-packages.list >> upgradeable-packages.list$$
1843 mv -f upgradeable-packages.list$$ upgradeable-packages.list
1844 yes y | tazpkg get-install-list upgradeable-packages.list --forced
1845 rm -f upgradeable-packages.list
1846 ;;
1847 bugs)
1848 # Show known bugs in package(s)
1850 cd $INSTALLED
1851 shift
1852 LIST=$@
1853 [ -n "$LIST" ] || LIST=`ls`
1854 MSG="No known bugs."
1855 for PACKAGE in $LIST; do
1856 BUGS=""
1857 EXTRAVERSION=""
1858 . $PACKAGE/receipt
1859 if [ -n "$BUGS" ]; then
1860 MSG="
1861 Bug list completed"
1862 cat <<EOT
1864 Bugs in package $PACKAGE version $VERSION$EXTRAVERSION:
1865 $BUGS
1866 EOT
1867 fi
1868 done
1869 echo "$MSG"
1870 ;;
1871 check)
1872 # Check installed packages set.
1874 check_root
1875 cd $INSTALLED
1876 for PACKAGE in `ls`; do
1877 if [ ! -f $PACKAGE/receipt ]; then
1878 echo "The package $PACKAGE installation is not completed"
1879 continue
1880 fi
1881 DEPENDS=""
1882 EXTRAVERSION=""
1883 . $PACKAGE/receipt
1884 if [ -s $PACKAGE/modifiers ]; then
1885 echo "The package $PACKAGE $VERSION$EXTRAVERSION has been modified by :"
1886 for i in $(cat $PACKAGE/modifiers); do
1887 echo " $i"
1888 done
1889 fi
1890 MSG="Files lost from $PACKAGE $VERSION$EXTRAVERSION :\n"
1891 while read file; do
1892 [ -e "$file" ] && continue
1893 if [ -L "$file" ]; then
1894 MSG="$MSG target of symlink"
1895 fi
1896 echo -e "$MSG $file"
1897 MSG=""
1898 done < $PACKAGE/files.list
1899 MSG="Missing dependencies for $PACKAGE $VERSION$EXTRAVERSION :\n"
1900 for i in $DEPENDS; do
1901 [ -d $i ] && continue
1902 echo -e "$MSG $i"
1903 MSG=""
1904 done
1905 MSG="Dependencies loop between $PACKAGE and :\n"
1906 ALL_DEPS=""
1907 check_for_deps_loop $PACKAGE $DEPENDS
1908 done
1909 echo -n "Looking for known bugs... "
1910 tazpkg bugs
1911 if [ "$PACKAGE_FILE" = "--full" ]; then
1912 for file in */md5sum; do
1913 CONFIG_FILES=""
1914 . $(dirname "$file")/receipt
1915 [ -s "$file" ] || continue
1916 while read md5 f; do
1917 [ -f $f ] || continue
1918 for i in $CONFIG_FILES; do
1919 case "$f" in
1920 $i|$i/*) continue 2;;
1921 esac
1922 done
1923 echo "$md5 $f"
1924 done < "$file" | md5sum -c - 2> /dev/null | \
1925 grep -v OK$ | sed 's/FAILED$/MD5SUM MISMATCH/'
1926 done
1927 FILES=" "
1928 for file in $(cat */files.list); do
1929 [ -d "$file" ] && continue
1930 case "$FILES" in *\ $file\ *) continue;; esac
1931 [ $(grep "^$file$" */files.list 2> /dev/null | \
1932 wc -l) -gt 1 ] || continue
1933 FILES="$FILES$file "
1934 echo "The following packages provide $file :"
1935 grep -l "^$file$" */files.list | while read f
1936 do
1937 pkg=${f%/files.list}
1938 echo -n " $pkg"
1939 if [ -f $pkg/modifiers ]; then
1940 echo -n " (overridden by $(echo "$(cat $pkg/modifiers)"))"
1941 fi
1942 echo ""
1943 done
1944 done
1945 MSG="No package has installed the following files:\n"
1946 find /etc /bin /sbin /lib /usr /var/www \
1947 -not -type d 2> /dev/null | while read file; do
1948 case "$file" in *\[*) continue;; esac
1949 grep -q "^$file$" */files.list && continue
1950 echo -e "$MSG $file"
1951 MSG=""
1952 done
1953 fi
1954 echo "Check completed."
1955 ;;
1956 block)
1957 # Add a pkg name to the list of blocked packages.
1959 check_root
1960 check_for_package_on_cmdline
1961 echo ""
1962 if grep -qs "^$PACKAGE" $BLOCKED; then
1963 echo "$PACKAGE is already in the blocked packages list."
1964 echo ""
1965 exit 0
1966 else
1967 echo -n "Add $PACKAGE to : $BLOCKED..."
1968 echo $PACKAGE >> $BLOCKED
1969 status
1970 # Log this activity
1971 . $INSTALLED/$PACKAGE/receipt
1972 log Blocked
1973 fi
1974 echo ""
1975 ;;
1976 unblock)
1977 # Remove a pkg name from the list of blocked packages.
1979 check_root
1980 check_for_package_on_cmdline
1981 echo ""
1982 if grep -qs "^$PACKAGE" $BLOCKED; then
1983 echo -n "Removing $PACKAGE from : $BLOCKED..."
1984 sed -i s/$PACKAGE/''/ $BLOCKED
1985 sed -i '/^$/d' $BLOCKED
1986 status
1987 # Log this activity
1988 . $INSTALLED/$PACKAGE/receipt
1989 log Unblocked
1990 else
1991 echo "$PACKAGE is not in the blocked packages list."
1992 echo ""
1993 exit 0
1994 fi
1995 echo ""
1996 ;;
1997 get)
1998 # Downlowd a package with wget.
2000 check_for_package_on_cmdline
2001 check_for_packages_list
2002 check_for_package_in_list
2003 echo ""
2004 download $PACKAGE.tazpkg
2005 echo ""
2006 ;;
2007 get-install)
2008 # Download and install a package.
2010 check_root
2011 check_for_package_on_cmdline
2012 check_for_packages_list
2013 DO_CHECK=""
2014 while [ -n "$3" ]; do
2015 case "$3" in
2016 --forced)
2017 DO_CHECK="no"
2018 ;;
2019 --root=*)
2020 ROOT="${3#--root=}"
2021 ;;
2022 --list=*)
2023 INSTALL_LIST="${3#--list=}"
2024 ;;
2025 *) shift 2
2026 echo -e "\nUnknown option $*.\n"
2027 exit 1
2028 ;;
2029 esac
2030 shift
2031 done
2032 AUTOEXEC="no"
2033 if ! check_for_package_in_list check; then
2034 PACKAGE=get-$PACKAGE
2035 AUTOEXEC=$PACKAGE
2036 check_for_package_in_list
2037 if [ -n "$(get_installed_package_pathname $PACKAGE $ROOT)" ]; then
2038 $AUTOEXEC $ROOT
2039 exit 0
2040 fi
2041 fi
2042 # Check if forced install.
2043 if [ "$DO_CHECK" = "no" ]; then
2044 rm -f $CACHE_DIR/$PACKAGE.tazpkg
2045 else
2046 check_for_installed_package $ROOT
2047 fi
2048 cd $CACHE_DIR
2049 if [ -f "$PACKAGE.tazpkg" ]; then
2050 echo "$PACKAGE already in the cache : $CACHE_DIR"
2051 # Check package download was finished
2052 tail -c 2k $PACKAGE.tazpkg | grep -q 00000000TRAILER || {
2053 echo "Continue $PACKAGE download"
2054 download $PACKAGE.tazpkg
2056 else
2057 echo ""
2058 download $PACKAGE.tazpkg
2059 fi
2060 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
2061 install_package $ROOT
2062 [ "$AUTOEXEC" != "no" ] && $PACKAGE $ROOT
2063 ;;
2064 clean-cache)
2065 # Remove all downloaded packages.
2067 check_root
2068 files=`ls -1 $CACHE_DIR | wc -l`
2069 echo ""
2070 echo -e "\033[1mClean cache :\033[0m $CACHE_DIR"
2071 echo "================================================================================"
2072 echo -n "Cleaning cache directory..."
2073 rm -rf $CACHE_DIR/*
2074 status
2075 echo "================================================================================"
2076 echo "$files file(s) removed from cache."
2077 echo ""
2078 ;;
2079 list-undigest)
2080 # list undigest URLs.
2082 if [ "$2" = "--box" ]; then
2083 for i in $LOCALSTATE/undigest/*/mirror; do
2084 [ -f $i ] || continue
2085 echo "$(basename $(dirname $i))|$(cat $i)"
2086 done
2087 else
2088 echo ""
2089 echo -e "\033[1mCurrent undigest(s)\033[0m"
2090 echo "================================================================================"
2091 for i in $LOCALSTATE/undigest/*/mirror; do
2092 if [ ! -f $i ]; then
2093 echo "No undigest mirror found."
2094 exit 1
2095 fi
2096 echo "$(basename $(dirname $i)) $(cat $i)"
2097 done
2098 echo ""
2099 fi
2100 ;;
2101 remove-undigest)
2102 # remove undigest URL.
2104 check_root
2105 if [ -d $LOCALSTATE/undigest/$2 ]; then
2106 echo -n "Remove $2 undigest (y/N) ? "; read anser
2107 if [ "$anser" = "y" ]; then
2108 echo -n "Removing $2 undigest..."
2109 rm -rf $LOCALSTATE/undigest/$2
2110 status
2111 rmdir $LOCALSTATE/undigest 2> /dev/null
2112 fi
2113 else
2114 echo "Undigest $2 not found"
2115 fi
2116 ;;
2117 add-undigest|setup-undigest)
2118 # Add undigest URL.
2120 check_root
2121 undigest=$2
2122 [ -d $LOCALSTATE/undigest ] || mkdir $LOCALSTATE/undigest
2123 if [ -z "$undigest" ]; then
2124 i=1
2125 while [ -d $LOCALSTATE/undigest/$i ]; do
2126 i=$(($i+1))
2127 done
2128 undigest=$i
2129 fi
2130 if [ ! -d $LOCALSTATE/undigest/$undigest ]; then
2131 echo "Creating new undigest $undigest."
2132 mkdir $LOCALSTATE/undigest/$undigest
2133 fi
2134 setup_mirror $LOCALSTATE/undigest/$undigest $3
2135 ;;
2136 setup-mirror)
2137 # Change mirror URL.
2139 check_root
2140 setup_mirror $LOCALSTATE $2
2141 ;;
2142 reconfigure)
2143 # Replay post_install from receipt
2145 check_for_package_on_cmdline
2146 check_root
2147 ROOT=""
2148 while [ -n "$3" ]; do
2149 case "$3" in
2150 --root=*)
2151 ROOT="${3#--root=}/"
2152 ;;
2153 *) shift 2
2154 echo -e "\nUnknown option $*.\n"
2155 exit 1
2156 ;;
2157 esac
2158 shift
2159 done
2160 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
2161 check_for_receipt $ROOT
2162 # Check for post_install
2163 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
2164 . $ROOT$INSTALLED/$PACKAGE/receipt
2165 post_install $ROOT
2166 # Log this activity
2167 [ -n "$ROOT" ] || log Reconfigured
2168 else
2169 echo -e "\nNothing to do for $PACKAGE."
2170 fi
2171 else
2172 echo -e "\npackage $PACKAGE is not installed."
2173 echo -e "Install package with 'tazpkg install' or 'tazpkg get-install'\n"
2174 fi
2175 ;;
2176 shell)
2177 # Tazpkg SHell
2179 if test $(id -u) = 0 ; then
2180 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
2181 else
2182 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
2183 fi
2184 if [ ! "$2" = "--noheader" ]; then
2185 clear
2186 echo ""
2187 echo -e "\033[1mTazpkg SHell.\033[0m"
2188 echo "================================================================================"
2189 echo "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
2190 echo ""
2191 fi
2192 while true
2193 do
2194 echo -en "$PROMPT"; read cmd
2195 case $cmd in
2196 q|quit)
2197 break ;;
2198 shell)
2199 echo "You are already running a Tazpkg SHell." ;;
2200 su)
2201 su -c 'exec tazpkg shell --noheader' && break ;;
2202 "")
2203 continue ;;
2204 *)
2205 tazpkg $cmd ;;
2206 esac
2207 done
2208 ;;
2209 depends)
2210 # Display dependencies tree
2211 cd $INSTALLED
2212 ALL_DEPS=""
2213 if [ -f $2/receipt ]; then
2214 dep_scan $2 ""
2215 fi
2216 ;;
2217 rdepends)
2218 # Display reverse dependencies tree
2219 cd $INSTALLED
2220 ALL_DEPS=""
2221 if [ -f $2/receipt ]; then
2222 rdep_scan $2
2223 fi
2224 ;;
2225 convert)
2226 # convert misc package format to .tazpkg
2227 case "$2" in
2228 *.deb|*.udeb)
2229 convert_deb $2;;
2230 *)
2231 echo "Unsupported format";;
2232 esac
2233 ;;
2234 usage|*)
2235 # Print a short help or give usage for an unknown or empty command.
2237 usage
2238 ;;
2239 esac
2241 exit 0