tazpkg view tazpkg @ rev 842
tazpkg: internal command 'call ...' to call tazpkg functions from modules (to share functions between tazpkg and its modules)
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Wed Sep 02 03:31:47 2015 +0300 (2015-09-02) |
parents | a02e36d44d06 |
children | d6cbd0c5f273 |
line source
1 #!/bin/sh
2 #
3 # TazPkg - Tiny autonomous zone packages manager.
4 #
5 # This is a lightweight packages manager for *.tazpkg files written in SHell
6 # script. It works well with Busybox ash shell and bash. TazPkg lets you
7 # list, install, remove, download or get information about a package. You
8 # can use 'tazpkg usage' to get a list of commands with short descriptions.
9 # TazPkg also resolves dependencies and can upgrade packages from a mirror.
10 #
11 # (C) 2007-2015 SliTaz - GNU General Public License v3.
12 #
13 # Authors: See the AUTHORS files
14 #
17 ####################
18 # Script variables #
19 ####################
21 . /etc/slitaz/slitaz.conf
22 . /etc/slitaz/tazpkg.conf
24 . /lib/libtaz.sh
25 . /usr/lib/slitaz/libpkg.sh
26 . @@MODULES@@/find-depends
28 # Internationalization.
29 export TEXTDOMAIN='tazpkg'
30 _() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; }
31 _n() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; }
32 _p() {
33 local S="$1" P="$2" N="$3"; shift 3;
34 printf "$(ngettext "$S" "$P" "$N")" "$@"; }
37 # Translate category names (must be last in line)
39 translate_category() {
40 sed "s|base-system$|$(_ base-system)|; s|x-window$|$(_ x-window)|;
41 s|utilities$|$(_ utilities)|; s|network$|$(_ network)|;
42 s|graphics$|$(_ graphics)|; s|multimedia$|$(_ multimedia)|;
43 s|office$|$(_ office)|; s|development$|$(_ development)|;
44 s|system-tools$|$(_ system-tools)|; s|security$|$(_ security)|;
45 s|games$|$(_ games)|; s|misc$|$(_ misc)|; s|meta$|$(_ meta)|;
46 s|non-free$|$(_ non-free)|; s|all$|$(_ all)|; s|extra$|$(_ extra)|"
47 }
50 # Remove all --parameters from cmdline
51 #-------------------------------------
52 # (thanks to libtaz.sh all --parameters are already set to variables)
54 IFS=$'\n'
55 set -- $(echo "$*" | sed '/^--/d')
56 unset IFS
59 # Initialize some variables to use words rather than numbers for functions
60 # and actions.
62 COMMAND="$1"
63 PACKAGE="${2%/}"
64 PACKAGE_DIR="$(cd $(dirname "$PACKAGE" 2>/dev/null) 2>/dev/null; pwd)"
65 [ -n "$PACKAGE" ] && PACKAGE_FILE="$PACKAGE_DIR/${PACKAGE##*/}"
66 if [ -f "$PACKAGE" ]; then
67 # Set pkg basename for install, extract
68 PACKAGE="$(basename "$PACKAGE" .tazpkg 2>/dev/null)"
69 else
70 # Pkg name for remove, search and all other cmds
71 PACKAGE="${PACKAGE%.tazpkg}"
72 fi
73 TARGET_DIR="$3"
74 export TOP_DIR="$(pwd)"
75 TMP_DIR="/tmp/$RANDOM"
76 INSTALL_LIST=''
77 SAVE_CACHE_DIR="$CACHE_DIR"
79 # Path to tazpkg used dir and configuration files
80 MIRROR="$PKGS_DB/mirror"
81 BLOCKED="$PKGS_DB/blocked-packages.list"
82 UP_LIST="$PKGS_DB/packages.up"
83 DEFAULT_MIRROR="$ONLINE_PKGS"
85 # TazPkg version
86 export VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' $PKGS_DB/installed.info)
87 # User Agent
88 export UA="TazPkg-$VERSION"
90 #title 'DEBUG'; emsg "<b>COMMAND</b>=\"$COMMAND\"\n<b>PACKAGE</b>=\"$PACKAGE\"\n<b>PACKAGE_FILE</b>=\"$PACKAGE_FILE\"\n<b>TARGET_DIR</b>=\"$TARGET_DIR\"\n<b>TOP_DIR</b>=\"$TOP_DIR\"\n<b>TMP_DIR</b>=\"$TMP_DIR\"\n<b>INSTALL_LIST</b>=\"$INSTALL_LIST\"\n<b>SAVE_CACHE_DIR</b>=\"$SAVE_CACHE_DIR\"\n<b>MIRROR</b>=\"$MIRROR\"\n<b>BLOCKED</b>=\"$BLOCKED\"\n<b>UP_LIST</b>=\"$UP_LIST\"\n<b>DEFAULT_MIRROR</b>=\"$DEFAULT_MIRROR\"\n<b>VERSION</b>=\"$VERSION\""; footer
93 ####################
94 # Script functions #
95 ####################
98 # Interactive mode
100 im() { tty -s; }
103 # Check if dir exists
105 check_dir() {
106 if [ ! -d "$1" ]; then
107 action 'Creating folder "%s"...' "$1"
108 mkdir -p "$1"
109 status
110 return 1
111 fi
112 }
115 # Check if the directories and files used by TazPkg exist.
116 # If not and user is root we create them.
118 check_base_dir() {
119 if [ "$(id -u)" == '0' ]; then
120 check_dir $1$CACHE_DIR
121 check_dir $1$INSTALLED
122 check_dir $1$SLITAZ_LOGS
123 if [ ! -f "$1$PKGS_DB/mirror" ]; then
124 echo "${DEFAULT_MIRROR%/}/" > $1$PKGS_DB/mirror
125 [ -n "$1" ] && cp $PKGS_DB/packages.* $1$PKGS_DB/
126 fi
127 fi
128 }
129 check_base_dir
132 # Check for a package name on cmdline.
134 check_for_package_on_cmdline() {
135 if [ -z "$PACKAGE" ]; then
136 newline
137 _ 'Please specify a package name on the command line.'
138 newline
139 exit 1
140 fi
141 }
144 # Check if the package (*.tazpkg) exists before installing or extracting.
146 check_for_package_file() {
147 if [ ! -f "$PACKAGE_FILE" ]; then
148 newline
149 _ 'Unable to find file "%s"' "$PACKAGE_FILE"
150 newline
151 exit 1
152 fi
153 }
156 # Check for the receipt of an installed package.
158 check_for_receipt() {
159 if [ ! -f "$1$INSTALLED/$PACKAGE/receipt" ]; then
160 newline
161 _ 'Unable to find the receipt "%s"' "$1$INSTALLED/$PACKAGE/receipt"
162 newline
163 exit 1
164 fi
165 }
168 # Get repositories priority using $PKGS_DB/priority.
169 # In this file undigest repos are called by their names and main mirror
170 # by 'main'. Sort order: priority
172 look_for_priority() {
173 [ -s "$PKGS_DB/priority" ] && priority=$(cat $PKGS_DB/priority)
175 for rep in main $(ls $PKGS_DB/undigest 2>/dev/null); do
176 if [ ! -s "$PKGS_DB/priority" ] || ! grep -q ^$rep$ "$PKGS_DB/priority"; then
177 priority=$(echo -e "$priority\n$rep")
178 fi
179 done
180 echo "$priority" | sed '/^$/d' | \
181 while read line; do
182 case $line in
183 main) echo "$PKGS_DB";;
184 *) echo "$PKGS_DB/undigest/$line";;
185 esac
186 done
187 }
190 # Get package name in a directory
192 package_fullname_in_dir() {
193 [ ! -f "$1/receipt" ] && return
194 EXTRAVERSION=''
195 . $1/receipt
196 echo "$PACKAGE-$VERSION$EXTRAVERSION"
197 }
200 # Get package name that is already installed.
202 get_installed_package_pathname() {
203 for i in $2$INSTALLED/${1%%-*}*; do
204 [ ! -d $i ] && continue
205 if [ "$1" == "$(package_fullname_in_dir $i)" ]; then
206 echo "$i"
207 return
208 fi
209 done
210 }
213 # Check if a package is already installed.
215 check_for_installed_package() {
216 if [ -n "$(get_installed_package_pathname "$PACKAGE" "$1")" ]; then
217 newline
218 _ '"%s" package is already installed.' "$(colorize 34 "$PACKAGE")"
219 longline "$(_ 'You can use the --forced option to force installation.')"
220 newline
221 exit 0
222 fi
223 }
226 # Check for packages.list to download and install packages.
228 check_for_packages_list() {
229 list_path="$PKGS_DB/packages.list"
230 if [ ! -f "$list_path" ]; then
231 if [ $(id -u) -eq 0 ]; then
232 tazpkg recharge
233 else
234 newline
235 _ 'Unable to find the list "%s"' "$list_path"
236 longline "$(_ "You must probably run '%s' as root to get the \
237 latest list of packages available on the mirror." 'tazpkg recharge')"
238 newline
239 exit 0
240 fi
241 fi
242 }
245 # Check for installed.info - local file with format of packages.info
246 # "installed.info" is absent on not clean installs; check it and re-generate if needed.
248 check_for_installed_info() {
249 info_path="$ROOT$PKGS_DB/installed.info"
250 if [ ! -f "$info_path" ]; then
251 if [ $(id -u) -eq 0 ]; then
252 _ 'File "%s" generated. Please wait...' 'installed.info'
253 for pkg in $ROOT$PKGS_DB/installed/*/receipt; do
254 unset_receipt
255 . $pkg
256 SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
257 DEPENDS=$(echo $DEPENDS) # remove newlines from some receipts
258 MD5="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" \
259 $ROOT$PKGS_DB/installed.md5 | awk '{print $1}')"
260 cat >> $info_path << EOT
261 $PACKAGE $VERSION$EXTRAVERSION $CATEGORY $SHORT_DESC $WEB_SITE $TAGS $SIZES $DEPENDS $MD5
262 EOT
263 done
264 else
265 _ 'Unable to find file "%s"' installed.info
266 _ 'Please run tazpkg as root.'
267 exit 1
268 fi
269 fi
271 # Check for md5 field (#9) in the installed.info
272 if [ -n "$(awk -F$'\t' 'BEGIN{ n = "" } { if(NF != 9){ n = "o"; } } END{ print n }' $info_path)" ]; then
273 _n 'File "%s" generated. Please wait...' 'installed.info.new'
274 awk -F$'\t' -vm="$ROOT$PKGS_DB/installed.md5" 'BEGIN{OFS="\t"}
275 {
276 if (NF != 9) {
277 pkg = $1 "-" $2 ".tazpkg";
278 "fgrep " pkg " " m " | cut -c-32" | getline $9;
279 $9 = ($9 == "") ? "00000000000000000000000000000000" : $9;
280 }
281 print;
282 }' $info_path > $info_path.new
283 mv -f $info_path.new $info_path
284 status
285 fi
286 }
289 get_cache_dir() {
290 echo $rep > $tmp/rep
291 if [ "$rep" == "$PKGS_DB" ]; then
292 CACHE_DIR="$SAVE_CACHE_DIR/$SLITAZ_RELEASE/packages"
293 elif [ "${rep%-incoming}" == "$rep" ]; then
294 CACHE_DIR="$SAVE_CACHE_DIR/${rep##*/}/packages"
295 else
296 rep="${rep%-incoming}"
297 CACHE_DIR="$SAVE_CACHE_DIR/${rep##*/}/packages-incoming"
298 fi
299 [ ! -d "$CACHE_DIR" ] && mkdir -p $CACHE_DIR
300 echo $CACHE_DIR > $tmp/cachedir
301 }
304 # get an already installed package from packages.equiv
306 equivalent_pkg() {
307 for i in $(grep -hs "^$1=" $PKGS_DB/packages.equiv \
308 $PKGS_DB/undigest/*/packages.equiv | sed "s/^$1=//"); do
309 if echo $i | fgrep -q : ; then
310 # format 'alternative:newname'
311 # if alternative is installed then substitute newname
312 if [ -f "$2$INSTALLED/${i%:*}/receipt" ]; then
313 # substitute package dependency
314 echo "${i#*:}"
315 return
316 fi
317 else
318 # if alternative is installed then nothing to install
319 if [ -f "$2$INSTALLED/$i/receipt" ]; then
320 # substitute installed package
321 echo "$i"
322 return
323 fi
324 fi
325 done
326 # if not found in packages.equiv then no substitution
327 echo "$1"
328 }
331 # get a virtual package from packages.equiv
333 virtual_pkg() {
334 for i in $(for rep in $priority; do
335 grep -hs "^$1=" $rep/packages.equiv
336 done | sed "s/^$1=//"); do
337 if echo $i | fgrep -q : ; then
338 # format 'alternative:newname'
339 # if alternative is installed then substitute newname
340 if [ -f "$2$INSTALLED/${i%:*}/receipt" ]; then
341 # substitute package dependency
342 echo "${i#*:}"
343 return
344 fi
345 else
346 # unconditional substitution
347 echo "$i"
348 return
349 fi
350 done
351 }
354 # Get package filename available on the mirror
356 get_package_filename() {
357 # input: "<package_name>" or "<package_name>-<version>" (ex. "nano" or "nano-2.4.0")
358 local pkg equiv
359 for rep in $priority; do
360 pkg=$(awk -F$'\t' -vp="$1" 'p==$1||p==$1"-"$2{print $1"-"$2}' "$rep/packages.info")
362 if [ -n "$pkg" ]; then
363 get_cache_dir; break
364 fi
365 done
366 if [ -z "$pkg" ]; then
367 # Check for virtual package
368 equiv=$(virtual_pkg $1)
369 if [ "$equiv" != "$1" ]; then
370 PACKAGE="$equiv"
371 get_package_filename "$PACKAGE"
372 return
373 fi
374 fi
375 echo "$pkg"
376 }
379 # Check for a package in packages DB. Used by get and get-install to grep
380 # package basename.
382 check_for_package_in_list() {
383 local filename check_only
384 check_only="$1"
385 filename="$(get_package_filename "$PACKAGE")"
386 if [ -n "$filename" ]; then
387 PACKAGE="$filename"
388 CACHE_DIR="$(cat $tmp/cachedir)"
389 rep="$(cat $tmp/rep)"
390 rm -f $tmp/rep $tmp/cachedir
391 else
392 newline
393 _ 'Unable to find package "%s" in the mirrored packages list.' "$PACKAGE"
394 newline
395 [ -n "$check_only" ] && return 1
396 exit 0
397 fi
398 }
401 # Log this activity
402 # (there's log_pkg because we have log() in libtaz.sh)
404 log_pkg() {
405 local extra
407 [ "$1" == 'Installed' ] && \
408 extra=" - $(fgrep " $PACKAGE-$VERSION" $PKGS_DB/installed.$SUM | awk '{ print $1 }')"
410 [ -e "$LOG" ] || touch $LOG
412 [ -w "$LOG" ] &&
413 echo "$(date +'%F %T') - $1 - $PACKAGE ($VERSION$EXTRAVERSION)$extra" >> $LOG
414 }
417 # Download a get-package script from this mirror
419 download_get_script() {
420 local p i
421 for p in $priority ; do
422 for i in $(cat $p/mirror) ; do
423 case "$i" in
424 http://*|https://*|ftp://*)
425 busybox wget -q -T 30 -U $UA -O $2 \
426 ${i%packages/*}packages/get/$1 && return 0 ;;
427 esac
428 done
429 done
430 return 1
431 }
434 # Download a file from this mirror
436 download_from() {
437 # input: "<mirror_url>+" "<package_name>-<version>.tazpkg"
438 local i
439 for i in $1; do
440 case "$i" in
441 # Mirror URL can have a trailing slash or not.
442 http://* | https://* | ftp://*)
443 busybox wget -c -q -T 30 -U $UA ${i%/}/$2 2>/dev/null && break ;;
444 *)
445 ln -sf ${i%/}/$2 . && break ;;
446 esac
447 done
448 }
451 # Download a file trying all mirrors
453 download() {
454 # input: <package_name>-<version>.tazpkg
455 local i
456 case "$1" in
457 *.tazpkg)
458 for i in $priority; do
459 if [ -n "$(awk -F$'\t' -vp="$1" 'p==$1"-"$2".tazpkg"{print $1}' \
460 $i/packages.info)" ]; then
461 download_from "$(cat $i/mirror)" "$@" && return
462 fi
463 done
464 ;;
465 esac
467 for i in $(cat $(for rep in $priority; do echo $rep/mirror; done) 2>/dev/null); do
468 download_from "$i" "$@" && break
469 done
470 }
473 # Extract a package with cpio and gzip/lzma.
475 extract_package() {
476 action 'Extracting package...'
477 cpio -idm --quiet < "${PACKAGE_FILE##*/}" && rm -f "${PACKAGE_FILE##*/}"
478 if [ -f fs.cpio.lzma ]; then
479 unlzma < fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma
480 elif [ -f fs.cpio.gz ]; then
481 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz
482 fi
483 status
484 }
487 remove_with_path() {
488 # Avoid dirname errors by checking for argument.
489 [ -n "$1" ] || return
491 local dir
492 rm -f $1 2>/dev/null
493 dir="$1"
494 while [ "$dir" != "/" ]; do
495 dir="$(dirname "$dir")"
496 rmdir "$dir" 2>/dev/null || break
497 done
498 }
501 grepesc() {
502 sed 's/\[/\\[/g'
503 }
506 # Print short package description
507 print_short_description() {
508 local short_desc=''
509 for LC in $LANG ${LANG%_*}; do
510 if [ -e "$PKGS_DB/packages-desc.$LC" ]; then
511 short_desc=$(grep -e "^$1 " $PKGS_DB/packages-desc.$LC | cut -d' ' -f2)
512 fi
513 done
514 [ -z "$short_desc" -a -s $PKGS_DB/packages.info ] &&
515 short_desc="$(awk -F$'\t' -vp="$PACKAGE" '{if($1==p){print $4;exit}}' $PKGS_DB/packages.info)"
516 longline "$short_desc"
517 }
520 # This function installs a package in the rootfs.
522 install_package() {
523 ROOT=$1
524 if [ -n "$ROOT" ]; then
525 # Get absolute path
526 ROOT=$(realpath $ROOT)
527 fi
528 {
529 # Create package path early to avoid dependencies loop
530 mkdir -p $TMP_DIR
531 { cd $TMP_DIR ; cpio --quiet -i receipt >/dev/null 2>&1; } < "$PACKAGE_FILE"
532 . $TMP_DIR/receipt
533 # FIXME: legacy?
534 if grep -q ^pre_depends $TMP_DIR/receipt; then
535 pre_depends $ROOT
536 fi
538 # Keep modifiers and file list on upgrade
539 cp "$ROOT$INSTALLED/$PACKAGE/modifiers" \
540 "$ROOT$INSTALLED/$PACKAGE/files.list" $TMP_DIR 2>/dev/null
541 rm -rf "$ROOT$INSTALLED/$PACKAGE" 2>/dev/null
543 # Make the installed package data dir to store
544 # the receipt and the files list.
545 mkdir -p "$ROOT$INSTALLED/$PACKAGE"
546 cp $TMP_DIR/modifiers "$ROOT$INSTALLED/$PACKAGE" 2>/dev/null
547 cp $TMP_DIR/files.list "$ROOT$INSTALLED/$PACKAGE" 2>/dev/null
548 rm -rf $TMP_DIR 2> /dev/null
549 sed -i "/ $(basename "$PACKAGE_FILE")$/d" $ROOT$PKGS_DB/installed.$SUM 2>/dev/null
550 cd "$(dirname "$PACKAGE_FILE")"
551 $CHECKSUM "$(basename "$PACKAGE_FILE")" >> $ROOT$PKGS_DB/installed.$SUM
552 }
554 # Resolve package deps.
555 check_for_deps $ROOT
556 if [ -n "$MISSING_PACKAGE" ]; then
557 install_deps $ROOT
558 fi
559 mkdir -p $TMP_DIR
560 [ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> $ROOT$PKGS_DB/$INSTALL_LIST-processed
562 title 'Installation of package "%s"' "$PACKAGE"
564 short_desc="$(print_short_description "$PACKAGE")"
565 [ -n "$short_desc" ] && echo "$short_desc" && separator '-'
567 action 'Copying package...'
568 cp "$PACKAGE_FILE" "$TMP_DIR"
569 status
571 cd "$TMP_DIR"
572 extract_package
573 SELF_INSTALL='0'
574 EXTRAVERSION=''
575 CONFIG_FILES=''
577 # Include temporary receipt to get the right variables.
578 . $PWD/receipt
579 cd $ROOT$INSTALLED
581 # FIXME: legacy?
582 if [ $SELF_INSTALL -ne 0 -a -n "$ROOT" ]; then
583 action "Checking post install dependencies..."
584 [ -f "$INSTALLED/$PACKAGE/receipt" ]
585 if ! status; then
586 _ 'Please run "%s" in / and retry.' "tazpkg install $PACKAGE_FILE"
587 rm -rf $TMP_DIR
588 exit 1
589 fi
590 fi
592 # Get files to remove if upgrading
593 if [ -f "$PACKAGE/files.list" ]; then
594 while read file; do
595 grep -q "^$(echo $file | grepesc)$" $TMP_DIR/files.list && continue
596 for i in $(cat "$PACKAGE/modifiers" 2>/dev/null ;
597 fgrep -sl "$PACKAGE" */modifiers | cut -d/ -f1 ); do
598 grep -qs "^$(echo $file | grepesc)$" $i/files.list && continue 2
599 done
600 echo $file
601 done < "$PACKAGE/files.list" > $TMP_DIR/files2remove.list
602 fi
604 # Remember modified packages
605 {
606 check=false
607 for i in $(fgrep -v [ $TMP_DIR/files.list); do
608 [ -e "$ROOT$i" ] || continue
609 [ -d "$ROOT$i" ] && continue
610 echo "- $i"
611 check=true
612 done ;
613 $check && \
614 for i in *; do
615 [ "$i" == "$PACKAGE" ] && continue
616 [ -s $i/files.list ] || continue
617 awk "{ printf \"$i %s\\n\",\$1 }" < $i/files.list
618 done;
619 } | awk '
620 {
621 if ($1 == "-" || file[$2] != "") {
622 file[$2] = file[$2] " " $1
623 if ($1 != "-") {
624 if (pkg[$1] == "") all = all " " $1
625 pkg[$1] = pkg[$1] " " $2
626 }
627 }
628 }
629 END {
630 for (i = split(all, p, " "); i > 0; i--)
631 for (j = split(pkg[p[i]], f, " "); j > 0; j--)
632 printf "%s %s\n",p[i],f[j];
633 }
634 ' | while read dir file; do
635 if grep -qs ^$dir$ "$PACKAGE/modifiers"; then
636 # Do not overload an overloaded file !
637 rm $TMP_DIR$file 2>/dev/null
638 continue
639 fi
640 grep -qs "^$PACKAGE$" $dir/modifiers && continue
641 if [ -s "$dir/volatile.cpio.gz" ]; then
642 # We can modify backed up files without notice
643 zcat $dir/volatile.cpio.gz | cpio -t --quiet | \
644 grep -q "^${file#/}$" && continue
645 fi
646 echo "$PACKAGE" >> $dir/modifiers
647 done
649 cd $TMP_DIR
650 cp receipt files.list "$ROOT$INSTALLED/$PACKAGE"
652 # Copy the description if found.
653 if [ -f "description.txt" ]; then
654 cp description.txt "$ROOT$INSTALLED/$PACKAGE"
655 fi
657 # Copy the md5sum if found.
658 if [ -f "$CHECKSUM" ]; then
659 cp $CHECKSUM "$ROOT$INSTALLED/$PACKAGE"
660 fi
662 # Pre install commands.
663 if grep -q ^pre_install "$ROOT$INSTALLED/$PACKAGE/receipt"; then
664 pre_install $ROOT
665 fi
667 if [ -n "$CONFIG_FILES" ]; then
668 # save 'official' configuration files
669 action 'Saving configuration files...'
670 for i in $CONFIG_FILES; do
671 { cd fs ; find ${i#/} -type f 2> /dev/null; cd ..; }
672 done | { cd fs ; cpio -o -H newc --quiet | gzip -9; cd ..; } > \
673 "$ROOT$INSTALLED/$PACKAGE/volatile.cpio.gz"
675 if [ -z "$newconf" ]; then
676 # keep user configuration files
677 for i in $CONFIG_FILES; do
678 { cd fs ; find ${i#/} -type f 2> /dev/null; cd ..; }
679 done | while read i; do
680 [ -e $ROOT/$i ] || continue
681 cp -a $ROOT/$i fs/$i
682 done
683 fi
684 status
685 fi
687 action 'Installing package...'
688 [ "$(busybox ls fs/* 2>/dev/null)" ] && cp -af fs/* $ROOT/
689 status
691 if [ -s files2remove.list ]; then
692 action 'Removing old package...'
693 while read file; do
694 remove_with_path $ROOT$file
695 done < files2remove.list
696 true
697 status
698 fi
700 # Remove the temporary random directory.
701 action "Removing all tmp files..."
702 cd ..; rm -rf $TMP_DIR
703 status
705 # Post install commands.
706 if grep -q ^post_install "$ROOT$INSTALLED/$PACKAGE/receipt"; then
707 action "Execute post-install commands..."
708 post_install $ROOT
709 status
710 fi
712 # Update-desktop-database if needed.
713 if [ "$(fgrep .desktop "$ROOT$INSTALLED/$PACKAGE/files.list" | fgrep /usr/share/applications/)" ]; then
714 updatedesktopdb=yes
715 fi
717 # Update-mime-database if needed.
718 if [ "$(fgrep /usr/share/mime "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
719 updatemimedb=yes
720 fi
722 # Update-icon-database
723 if [ "$(fgrep /usr/share/icon/hicolor "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
724 updateicondb=yes
725 fi
727 # Compile glib schemas if needed.
728 if [ "$(fgrep /usr/share/glib-2.0/schemas "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
729 compile_schemas=yes
730 fi
732 # Update depmod list
733 if [ "$(fgrep /lib/modules "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
734 updatedepmod=yes
735 fi
737 # Update installed.info
738 check_for_installed_info
739 SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
740 DEPENDS=$(echo $DEPENDS) # remove newlines from some receipts
741 PKG_SUM="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$ROOT$PKGS_DB/installed.$SUM" | cut -d' ' -f1)"
742 II=$ROOT$PKGS_DB/installed.info
743 sed -i "/^$PACKAGE /d" $II # remove old entry
744 cat >> $II <<EOT
745 $PACKAGE $VERSION$EXTRAVERSION $CATEGORY $SHORT_DESC $WEB_SITE $TAGS $SIZES $DEPENDS $PKG_SUM
746 EOT
747 #awk -F$'\t' -vp="$PACKAGE" '$1==p' $ROOT$PKGS_DB/packages.info > $II
748 TEMP_FILE=$(mktemp)
749 sort $II > $TEMP_FILE; mv -f $TEMP_FILE $II; chmod a+r $II; unset II
751 cd "$TOP_DIR"
752 footer "$(_ 'Package "%s" (%s) is installed.' "$PACKAGE" "$VERSION$EXTRAVERSION")"
754 # Log this activity
755 [ -n "$ROOT" ] || log_pkg Installed
757 # Remove package from upgrade list
758 [ -s $UP_LIST ] && sed -i "/^$PACKAGE\$/d" $UP_LIST
759 }
762 # This function may be called by a get script.
764 abort_package() {
765 cd $CUR_DIR
766 rm -rf $TMP_DIR
767 echo "${1:-Abort $PACKAGE.}"
768 exit 1
769 }
772 # This function installs a package from a get script in the rootfs.
774 install_package_from_get_script() {
775 SCRIPT="$1"
776 ROOT="$2"
777 [ -d "$ROOT$INSTALLED/$PACKAGE" ] && exit 1
779 grep -q no-check-certificate $SCRIPT &&
780 [ ! -d "$INSTALLED/wget" ] && tazpkg get-install wget
782 mkdir -p $TMP_DIR && cd $TMP_DIR
783 saved="$PACKAGE"
784 unset_receipt
785 PACKAGE="$saved"
787 set -e
788 . $SCRIPT
789 set +e
790 [ -d "$PACKAGE-$VERSION" ] || cd $TMP_DIR
791 [ -d "$PACKAGE-$VERSION" ] || abort_package \
792 "$(_ 'Could not download "%s" from "%s". Exiting.' "${TARBALL:-$PACKAGE}" "${WGET_URL:-$WEB_SITE}")"
794 if [ ! -s "$PACKAGE-$VERSION/receipt" ]; then
795 cat > "$PACKAGE-$VERSION/receipt" <<EOT
796 # SliTaz package receipt.
798 PACKAGE="$PACKAGE"
799 VERSION="${VERSION:-unknown}"
800 CATEGORY="${CATEGORY:-non-free}"
801 WEB_SITE="$WEB_SITE"
802 SHORT_DESC="${SHORT_DESC:-$PACKAGE}"
803 MAINTAINER="${MAINTAINER:-nobody@slitaz.org}"
804 EOT
805 for i in LICENSE TARBALL WGET_URL CONFIG_FILES SUGGESTED \
806 PROVIDE DEPENDS HOST_ARCH TAGS EXTRA_SOURCE_FILES ; do
807 eval "[ -n \"\$$i\" ] && echo \"$i=\\\"\$$i\\\"\""
808 done >> "$PACKAGE-$VERSION/receipt"
809 fi
811 DEPENDS="$(unset DEPENDS; . "$PACKAGE-$VERSION/receipt"; echo $DEPENDS)"
812 for i in $(find_depends "$PACKAGE-$VERSION/fs"); do
813 case " $DEPENDS " in
814 *\ $i\ *) continue;;
815 esac
816 grep -q '^DEPENDS="' "$PACKAGE-$VERSION/receipt" ||
817 echo 'DEPENDS=""' >> "$PACKAGE-$VERSION/receipt"
818 sed -i "s/^DEPENDS=\"/&$i /" "$PACKAGE-$VERSION/receipt"
819 done
821 TAZPKG_PACK=gzip
822 tazpkg pack "$PACKAGE-$VERSION"
824 # Clean to save RAM memory before installation
825 rm -rf "$PACKAGE-$VERSION"
827 if [ -n "$get" ]; then
828 mv "$PACKAGE-$VERSION.tazpkg" "$TOP_DIR"
829 else
830 # Install pseudo package
831 tazpkg install "$PACKAGE-$VERSION.tazpkg" --root=$ROOT
832 mv "$PACKAGE-$VERSION.tazpkg" $CACHE_DIR
833 fi
835 # Clean
836 cd "$TOP_DIR"
837 rm -rf $TMP_DIR
838 }
841 # Check for missing deps listed in a receipt packages.
843 check_for_deps() {
844 local saved;
845 saved="$PACKAGE"
846 mkdir -p $TMP_DIR
847 { cd $TMP_DIR ; cpio --quiet -i receipt >/dev/null 2>&1; } < "$PACKAGE_FILE"
848 . $TMP_DIR/receipt
849 PACKAGE="$saved"
850 rm -rf $TMP_DIR
852 num=0
853 for pkgorg in $DEPENDS; do
854 i=$(equivalent_pkg $pkgorg $1)
855 if [ ! -d "$1$INSTALLED/$i" ]; then
856 MISSING_PACKAGE=$i
857 num=$(($num+1))
858 elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
859 _ 'WARNING! Dependency loop between "%s" and "%s".' "$PACKAGE" "$i"
860 fi
861 done
863 if [ -n "$MISSING_PACKAGE" ]; then
864 title "$(_ 'Tracking dependencies for package "%s"' "$PACKAGE")"
865 for pkgorg in $DEPENDS; do
866 i=$(equivalent_pkg $pkgorg $1)
867 if [ ! -d "$1$INSTALLED/$i" ]; then
868 MISSING_PACKAGE="$i"
869 _ 'Missing package "%s"' $MISSING_PACKAGE
870 fi
871 done
872 footer "$(_p \
873 '%s missing package to install.' \
874 '%s missing packages to install.' $num \
875 $num)"
876 fi
877 }
880 # Install all missing deps. Auto install or ask user then install all missing
881 # deps from local dir, CD-ROM, media or from the mirror. In case we want to
882 # install packages from local, we need a packages.list to find the version.
884 install_deps() {
885 local root=''
886 [ -n "$1" ] && root="--root=$1"
888 if [ "$AUTO_INSTALL_DEPS" == 'yes' ]; then
889 answer=0
890 else
891 newline
892 confirm "$(_ 'Install all missing dependencies? (y/N)')"
893 answer=$?
894 newline
895 fi
897 if [ "$answer" -eq 0 ] && [ -z "$nodeps" ]; then
898 for pkgorg in $DEPENDS; do
899 pkg=$(equivalent_pkg $pkgorg $1)
900 if [ ! -d "$1$INSTALLED/$pkg" ]; then
901 local list="$INSTALL_LIST"
902 [ -n "$list" ] || list="$TOP_DIR/packages.list"
903 # We can install packages from a local dir by greping
904 # the TAZPKG_BASENAME in the local packages.list.
905 found='0'
906 if [ -f "$list" ]; then
907 _ 'Checking if package "%s" exists in local list...' $pkg
908 mkdir $TMP_DIR
909 for i in $pkg-*.tazpkg; do
910 [ -f $i ] || continue
911 { cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1; } < $i
912 [ "$(. $TMP_DIR/receipt; echo "$PACKAGE")" == "$pkg" ] || continue
913 if grep -q ^$(package_fullname_in_dir $TMP_DIR).tazpkg$ $list
914 then
915 found='1'
916 tazpkg install $i $root --list=$list
917 break
918 fi
919 done
920 rm -rf $TMP_DIR
921 fi
922 # Install deps from the mirror.
923 if [ $found -eq 0 ]; then
924 if [ ! -f "$PKGS_DB/packages.list" ]; then
925 tazpkg recharge
926 fi
927 tazpkg get-install $pkg $root
928 fi
929 fi
930 done
931 else
932 newline
933 _ 'Leaving dependencies for package "%s" unresolved.' "$PACKAGE"
934 _ 'The package is installed but will probably not work.'
935 newline
936 fi
937 }
940 update_desktop_database() {
941 if [ -f "$1/usr/bin/update-desktop-database" ] && [ -n "$updatedesktopdb" ]; then
942 chroot "$1/" /usr/bin/update-desktop-database /usr/share/applications 2>/dev/null
943 fi
944 }
947 update_mime_database() {
948 if [ -f "$1/usr/bin/update-mime-database" ] && [ -n "$updatemimedb" ]; then
949 chroot "$1/" /usr/bin/update-mime-database /usr/share/mime
950 fi
951 }
954 update_icon_database() {
955 if [ -f "$1/usr/bin/gtk-update-icon-cache" ] && [ -n "$updateicondb" ]; then
956 chroot "$1/" /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
957 fi
958 }
961 compile_glib_schemas() {
962 if [ -f "$1/usr/bin/glib-compile-schemas" ] && [ -n "$compile_schemas" ]; then
963 chroot "$1/" /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas
964 fi
965 }
968 update_kernel_modules() {
969 if [ -f "$1/sbin/depmod" ] && [ -n "$updatedepmod" ]; then
970 chroot "$1/" /sbin/depmod -a
971 fi
972 }
977 ###################
978 # TazPkg commands #
979 ###################
981 case "$COMMAND" in
982 call)
983 # Call internal tazpkg function from external tazpkg module or other script.
984 # Useful for functions sharing.
985 shift
986 # Check to call only tazpkg functions
987 fgrep -q "$1()" "$0" && $@
988 ;;
991 list|-l)
992 # Various lists
993 shift
994 case $1 in
995 b|blocked) @@MODULES@@/list blocked ;;
996 c|cat|categories) @@MODULES@@/list categories;;
997 l|linked) @@MODULES@@/list linked ;;
998 '') @@MODULES@@/list installed ;;
999 *) @@MODULES@@/list installed_of_category "$@";;
1000 esac
1001 ;;
1002 -lb) @@MODULES@@/list blocked ;;
1003 -lc) @@MODULES@@/list categories;;
1004 -ll) @@MODULES@@/list linked ;;
1006 -lm|list-mirror) @@MODULES@@/list mirrored ;;
1007 -lf|list-files) check_for_package_on_cmdline
1008 @@MODULES@@/list installed_files $PACKAGE;;
1009 -a|activity|log) @@MODULES@@/list activity ;;
1010 list-config) @@MODULES@@/list config_files $2;;
1011 list-suggested) @@MODULES@@/list suggested ;;
1014 info)
1015 # Information about package
1016 check_for_package_on_cmdline
1017 @@MODULES@@/info "$2"
1018 ;;
1021 desc|-d)
1022 # Display package description
1023 @@MODULES@@/description "$2"
1024 ;;
1027 search|-s)
1028 # Search for a package by pattern or name.
1029 if [ -z "$2" ]; then tazpkg -h search; exit 1; fi
1031 # Extend short options to long analogs
1032 case "$3" in
1033 -i) export installed='yes';;
1034 -l) export list='yes';;
1035 -m) export mirror='yes';;
1036 esac
1038 @@MODULES@@/search pkg "$2"
1039 ;;
1042 search-file|-sf)
1043 # Search for a file by pattern or name in all files.list.
1044 if [ -z "$2" ]; then tazpkg -h search-file; exit 1; fi
1046 @@MODULES@@/search file "$2"
1047 ;;
1050 search-pkgname|-sp)
1051 # Search for a package name
1052 if [ -z "$2" ]; then tazpkg -h search-pkgname; exit 1; fi
1054 @@MODULES@@/search file2 "$2"
1055 ;;
1058 install|-i)
1059 # Install .tazpkg packages.
1060 check_root $1
1061 check_for_package_on_cmdline
1062 check_for_package_file
1063 check_for_installed_info
1065 if [ -n "$root" ]; then
1066 ROOT="$root";
1067 check_base_dir "$root"
1068 fi
1070 [ -n "$list" ] && INSTALL_LIST="$list"
1072 # Get repositories priority list.
1073 priority=$(look_for_priority)
1075 # Check if forced install.
1076 if [ -z "$forced" ]; then
1077 check_for_installed_package $ROOT
1078 fi
1079 install_package $ROOT
1080 update_desktop_database $ROOT
1081 update_mime_database $ROOT
1082 update_icon_database $ROOT
1083 compile_glib_schemas $ROOT
1084 ;;
1087 install-list|get-install-list)
1088 # Install a set of packages from a list.
1089 check_root $1
1091 if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
1093 # Check if the packages list exists.
1094 if [ ! -f "$2" ]; then
1095 _ 'Unable to find list "%s"' "$2"
1096 exit 1
1097 fi
1099 LIST=$(cat $2)
1101 # Remember processed list
1102 export INSTALL_LIST="$2"
1104 # Set $COMMAND and install all packages.
1105 COMMAND=${1%-list}
1107 touch $2-processed
1109 # Upgrade tazpkg first. It may handle new features/formats...
1110 # then upgrade essential packages early
1111 for pkg in busybox-pam busybox gcc-lib-base glibc-base \
1112 slitaz-base-files tazpkg ; do
1113 pkg=$(egrep $pkg-[0-9] $INSTALL_LIST)
1114 [ -z "$pkg" ] && continue
1115 _ 'Adding implicit depends "%s"...' $pkg
1116 LIST="$pkg"$'\n'"$LIST"
1117 done
1119 for pkg in $LIST; do
1120 grep -qs ^$pkg$ $2-processed && continue
1121 [ -d "$root/var/lib/tazpkg/installed" ] &&
1122 tazpkg $COMMAND $pkg --list="$2" "$3" "$4" "$5"
1123 done
1124 rm -f $2-processed
1125 ;;
1128 add-flavor)
1129 # Install a set of packages from a flavor.
1130 check_root $1
1131 shift; @@MODULES@@/flavor $@
1132 ;;
1133 install-flavor)
1134 # Install a set of packages from a flavor and purge other ones.
1135 check_root $1
1136 shift; purge='yes' @@MODULES@@/flavor $@
1137 ;;
1140 set-release)
1141 # Change current release and upgrade packages.
1142 check_root $1
1143 if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
1144 RELEASE="$2"
1145 rm "$PKGS_DB/mirror"
1146 echo "$RELEASE" > "$root/etc/slitaz-release"
1147 tazpkg recharge && tazpkg upgrade
1149 # Install missing depends
1150 cd "$INSTALLED"
1151 for i in * ; do
1152 unset DEPENDS; . "$i/receipt"
1153 for j in $DEPENDS; do
1154 [ -d "$j" ] || tazpkg get-install "$j"
1155 done
1156 done
1157 ;;
1160 remove|-r)
1161 # Remove packages.
1162 check_root $1
1163 check_for_package_on_cmdline
1164 shift; @@MODULES@@/remove $@
1165 ;;
1168 extract|-e)
1169 # Extract .tazpkg cpio archive into a directory.
1170 check_for_package_on_cmdline
1171 check_for_package_file
1172 title 'Extracting package "%s"' "$PACKAGE"
1174 # If no directory destination is found on the cmdline
1175 # we create one in the current dir using the package name.
1176 if [ -n "$TARGET_DIR" ]; then
1177 DESTDIR="$TARGET_DIR/$PACKAGE"
1178 else
1179 DESTDIR="$PACKAGE"
1180 fi
1181 mkdir -p $DESTDIR
1183 action 'Copying original package...'
1184 cp "$PACKAGE_FILE" $DESTDIR
1185 status
1187 cd $DESTDIR
1188 extract_package
1189 [ -e "receipt" ] && \
1190 footer "$(_ 'Package "%s" is extracted to "%s"' "$PACKAGE" "$DESTDIR")"
1191 ;;
1194 recompress)
1195 # Recompress .tazpkg cpio archive with lzma.
1196 check_for_package_on_cmdline
1197 check_for_package_file
1198 title 'Recompressing package "%s"' "$PACKAGE"
1199 mkdir -p $TMP_DIR
1201 action "Copying original package..."
1202 cp "$PACKAGE_FILE" $TMP_DIR
1203 status
1205 cd $TMP_DIR
1206 extract_package
1208 action "Recompressing the FS..."
1209 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
1210 rm -rf fs
1211 status
1213 action "Creating new package..."
1214 find . -print | cpio -o -H newc --quiet > \
1215 "$TOP_DIR/$(basename "$PACKAGE_FILE").$$" && mv -f \
1216 "$TOP_DIR/$(basename "$PACKAGE_FILE").$$" \
1217 "$TOP_DIR/$(basename "$PACKAGE_FILE")"
1218 status
1220 cd "$TOP_DIR"
1221 rm -rf $TMP_DIR
1222 separator; newline
1223 ;;
1226 repack-config)
1227 check_root $@
1228 # Create SliTaz package archive from configuration files.
1229 mkdir -p $TMP_DIR; cd $TMP_DIR
1230 CONFIG_VERSION='1.0'
1231 mkdir config-$CONFIG_VERSION
1232 cd config-$CONFIG_VERSION
1233 for i in $INSTALLED/*/volatile.cpio.gz; do
1234 zcat $i | cpio -t --quiet
1235 done > files.list
1236 mkdir fs
1237 cd fs
1238 ( cd / ; cpio -o -H newc --quiet ) < ../files.list | cpio -idm --quiet > /dev/null
1239 mkdir -p etc/tazlito
1240 for i in $INSTALLED/*/receipt; do
1241 EXTRAVERSION=''
1242 . $i
1243 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1244 done > etc/tazlito/config-packages.list
1245 cd ..
1246 echo "etc/tazlito/config-packages.list" >> files.list
1247 pkg_date=$(date +"%x %X")
1248 cat > receipt <<EOT
1249 # SliTaz package receipt.
1251 PACKAGE="config"
1252 VERSION="$CONFIG_VERSION"
1253 CATEGORY="base-system"
1254 SHORT_DESC="$(_n 'User configuration backup on date %s' "$pkg_date")"
1255 DEPENDS="$(ls $INSTALLED)"
1256 EOT
1257 cd ..
1258 tazpkg pack config-$CONFIG_VERSION
1259 cp config-$CONFIG_VERSION.tazpkg "$TOP_DIR"
1260 cd "$TOP_DIR"
1261 rm -rf $TMP_DIR
1262 ;;
1265 repack)
1266 # Create SliTaz package archive from an installed package.
1267 check_for_package_on_cmdline
1268 check_for_receipt
1269 shift; @@MODULES@@/repack $@
1270 ;;
1273 pack)
1274 # Create SliTaz package archive using cpio and lzma.
1275 # TODO: Cook also pack packages, we should share code in libpkg.sh
1276 check_for_package_on_cmdline
1277 shift; @@MODULES@@/pack $@
1278 ;;
1281 recharge)
1282 # Recharge packages databases from a mirror.
1283 #
1284 # WARNING: The 'mirrors' file has all SliTaz mirrors but 'mirror'
1285 # must have only the chosen main mirror.
1286 #
1287 check_root $1
1288 shift; @@MODULES@@/recharge $@
1289 ;;
1292 up|upgrade)
1293 check_root $1
1294 #
1295 # This is the new way to upgrade packages making 'upgrade' and
1296 # upgradeable out-of-date. This new way is much, much more faster!
1297 # Look into installed packages and get data from receipt, it is fast
1298 # and easy to handle vars after using only md5sum to compare packages
1299 #
1300 for opt in $@; do
1301 case "$opt" in
1302 -i) export install='yes';;
1303 -c) export check='yes';;
1304 esac
1305 done
1307 @@MODULES@@/upgrade
1308 ;;
1311 bugs)
1312 # Show known bugs in package(s)
1313 cd $INSTALLED
1314 shift
1315 LIST=$@
1316 [ -z "$LIST" ] && LIST=$(ls)
1317 MSG=$(_n 'No known bugs.')
1319 title 'Known bugs in packages'
1320 for PACKAGE in $LIST; do
1321 BUGS=''
1322 EXTRAVERSION=''
1323 . "$PACKAGE/receipt"
1324 if [ -n "$BUGS" ]; then
1325 MSG=$(_n 'Bug list completed')
1326 newline
1327 _ 'Bugs in package "%s" version %s:' "$PACKAGE" "$VERSION$EXTRAVERSION"
1328 cat <<EOT
1329 $BUGS
1330 EOT
1331 fi
1332 done
1333 footer "$MSG"
1334 ;;
1337 check)
1338 # Check installed packages set.
1339 shift; @@MODULES@@/check $@
1340 ;;
1343 block|-b|unblock|-u|chblock)
1344 # Add/remove a pkg name to the list of blocked packages.
1345 check_root $@
1346 check_for_package_on_cmdline
1347 @@MODULES@@/block $@
1348 ;;
1351 get|-g)
1352 # Download a package with wget.
1353 check_root $@
1354 check_for_package_on_cmdline
1355 check_for_packages_list
1357 [ -n "$root" ] && ROOT="$root" && check_base_dir "$root"
1358 if [ -n "$rootconfig" ]; then
1359 if [ -n "$root" ]; then
1360 CACHE_DIR="$root/$CACHE_DIR"
1361 SAVE_CACHE_DIR="$CACHE_DIR"
1362 PKGS_DB="$root/$PKGS_DB"
1363 else
1364 _ 'rootconfig needs --root= option used.' >&2
1365 exit 1
1366 fi
1367 fi
1369 # Get repositories priority list.
1370 priority=$(look_for_priority)
1372 CURRENT_DIR="$PWD"
1373 cd "$CACHE_DIR"
1374 if check_for_package_in_list check ; then
1375 cd "$CACHE_DIR"
1376 if [ -f "$PACKAGE.tazpkg" ]; then
1377 _ 'Package "%s" already in the cache' "$PACKAGE"
1378 # Check package download was finished
1379 tail -c 2k "$PACKAGE.tazpkg" | fgrep -q '00000000TRAILER' || {
1380 _ 'Continuing package "%s" download' "$PACKAGE"
1381 download "$PACKAGE.tazpkg"
1382 }
1383 if [ "$($CHECKSUM "$PACKAGE.tazpkg")" != \
1384 "$(fgrep " $PACKAGE.tazpkg" "$rep/packages.$SUM")" ]; then
1385 rm -f "$PACKAGE.tazpkg"
1386 download "$PACKAGE.tazpkg"
1387 fi
1388 else
1389 download "$PACKAGE.tazpkg"
1390 fi
1391 PACKAGE_FILE="$CACHE_DIR/$PACKAGE.tazpkg"
1392 elif download_get_script "$PACKAGE" "/tmp/$PACKAGE.$$" ; then
1393 install_package_from_get_script "/tmp/$PACKAGE.$$" "$ROOT" --get
1394 PACKAGE_FILE="$(ls "$PWD/$PACKAGE-*.tazpkg")"
1395 fi
1396 [ "$PWD" != "$CURRENT_DIR" ] &&
1397 cp -a "$PACKAGE_FILE" "$CURRENT_DIR"
1398 ;;
1401 get-install|-gi)
1402 # Download and install a package.
1403 check_root $@
1404 check_for_package_on_cmdline
1405 check_for_packages_list
1407 DO_CHECK=''
1408 [ -n "$forced" ] && DO_CHECK='no'
1409 [ -n "$root" ] && ROOT="$root" && check_base_dir "$root"
1410 [ -n "$list" ] && INSTALL_LIST="$list" # internal option
1412 # Get repositories priority list.
1413 priority=$(look_for_priority)
1415 AUTOEXEC='no'
1416 # Magic :)
1417 # After testing this condition $PACKAGE become $PACKAGE-$VERSION$EXTRAVERSION
1418 if ! check_for_package_in_list check; then
1419 CACHE_DIR="${CACHE_DIR%/*}/get"
1420 [ -d "$CACHE_DIR" ] || mkdir -p $CACHE_DIR
1421 if download_get_script "$PACKAGE" "/tmp/$PACKAGE.$$" ; then
1422 install_package_from_get_script "/tmp/$PACKAGE.$$" $ROOT
1423 exit 0
1424 else
1425 PACKAGE="get-$PACKAGE"
1426 AUTOEXEC="$PACKAGE"
1427 # Here $PACKAGE become $PACKAGE-$VERSION$EXTRAVERSION
1428 check_for_package_in_list
1429 if [ -n "$(get_installed_package_pathname "$PACKAGE" "$ROOT")" ]; then
1430 $AUTOEXEC $ROOT
1431 exit 0
1432 fi
1433 fi
1434 fi
1435 # Check if no forced install.
1436 if [ -z "$forced" ]; then
1437 check_for_installed_package $ROOT
1438 fi
1440 cd $CACHE_DIR
1441 # Here $PACKAGE is $PACKAGE-$VERSION$EXTRAVERSION
1442 if [ -f "$PACKAGE.tazpkg" ]; then
1443 _ 'Package "%s" already in the cache' "$PACKAGE"
1444 # Check package download was finished
1445 tail -c 2k "$PACKAGE.tazpkg" | fgrep -q '00000000TRAILER' || {
1446 _ 'Continuing package "%s" download' "$PACKAGE"
1447 download "$PACKAGE.tazpkg"
1448 }
1449 if [ "$($CHECKSUM "$PACKAGE.tazpkg")" != "$(fgrep " $PACKAGE.tazpkg" $rep/packages.$SUM)" ]; then
1450 rm -f "$PACKAGE.tazpkg"
1451 download "$PACKAGE.tazpkg"
1452 fi
1453 else
1454 newline
1455 download "$PACKAGE.tazpkg"
1456 fi
1457 PACKAGE_FILE="$CACHE_DIR/$PACKAGE.tazpkg"
1458 [ -n "$rootconfig" ] && PKGS_DB="${PKGS_DB#$root}"
1459 install_package "$ROOT"
1460 [ "$AUTOEXEC" != 'no' ] && "$PACKAGE" $ROOT
1461 update_desktop_database $ROOT
1462 update_mime_database $ROOT ;;
1465 clean-cache|-cc)
1466 # Remove all downloaded packages.
1467 check_root $@
1468 files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
1469 size=$(du -hs $CACHE_DIR | cut -f1 | sed 's|\.0||'); [ "$files" -eq 0 ] && size="0K"
1471 title 'Cleaning cache directory...'
1472 action 'Path: %s' "$CACHE_DIR"
1473 rm -rf $CACHE_DIR/*
1474 status
1476 footer "$(_p \
1477 '%s file removed from cache (%s).' \
1478 '%s files removed from cache (%s).' $files \
1479 "$(colorize 32 "$files")" $size)"
1480 ;;
1483 list-undigest)
1484 # List undigest mirrors
1485 @@MODULES@@/mirror list
1486 ;;
1487 remove-undigest)
1488 # Remove undigest mirror
1489 check_root $1
1490 shift; @@MODULES@@/mirror remove $@
1491 ;;
1492 add-undigest|setup-undigest)
1493 # Add undigest mirror
1494 check_root $1
1495 shift; @@MODULES@@/mirror add $@
1496 ;;
1497 setup-mirror|-sm)
1498 # Change main mirror
1499 check_root $@
1500 shift; @@MODULES@@/mirror setup $@
1501 ;;
1504 reconfigure)
1505 # Replay post_install from receipt
1506 check_for_package_on_cmdline
1507 check_root $1
1509 ROOT="$root"
1510 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
1511 check_for_receipt $ROOT
1512 # Check for post_install
1513 if grep -q ^post_install "$ROOT$INSTALLED/$PACKAGE/receipt"; then
1514 . "$ROOT$INSTALLED/$PACKAGE/receipt"
1515 post_install $ROOT
1516 # Log this activity
1517 [ -z "$ROOT" ] && log_pkg Reconfigured
1518 else
1519 newline
1520 _ 'Nothing to do for package "%s".' "$PACKAGE"
1521 fi
1522 else
1523 newline
1524 _ 'Package "%s" is not installed.' "$PACKAGE"
1525 _ 'Install package with "%s" or "%s"' 'tazpkg install' 'tazpkg get-install'
1526 newline
1527 fi
1528 ;;
1531 shell)
1532 # TazPkg SHell
1533 if [ "$(id -u)" -eq 0 ]; then
1534 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
1535 else
1536 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
1537 fi
1538 if [ -z "$noheader" ]; then
1539 clear
1540 title 'TazPkg SHell.'
1541 _ "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
1542 newline
1543 fi
1544 while true; do
1545 echo -en "$PROMPT"; read cmd
1546 case $cmd in
1547 q|quit)
1548 break ;;
1549 shell)
1550 _ 'You are already running a TazPkg SHell.' ;;
1551 su)
1552 su -c 'exec tazpkg shell --noheader' && break ;;
1553 "")
1554 continue ;;
1555 *)
1556 tazpkg $cmd ;;
1557 esac
1558 done ;;
1561 depends)
1562 # Display dependencies tree
1563 shift; @@MODULES@@/depends depends $@
1564 ;;
1565 rdepends)
1566 # Display reverse dependencies tree
1567 shift; @@MODULES@@/depends rdepends $@
1568 ;;
1571 convert|-c)
1572 # convert misc package format to .tazpkg
1573 check_for_package_file
1574 shift; @@MODULES@@/convert $@
1575 ;;
1578 link)
1579 # link a package from another SliTaz installation
1580 PACKAGE="$2"
1581 if [ ! -d "$TARGET_DIR" -o \
1582 ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
1583 _ 'Usage: tazpkg link package_name slitaz_root'
1584 longline "$(
1585 _n 'Example:'
1586 echo -n ' '
1587 _ '"%s" will use less than 100k in your running system RAM.' \
1588 'tazpkg link openoffice /mnt')"
1589 exit 1
1590 fi
1591 if [ -e "$INSTALLED/$PACKAGE" ]; then
1592 _ 'Package "%s" is already installed.' "$PACKAGE"
1593 exit 1
1594 fi
1595 ln -s "$TARGET_DIR$INSTALLED/$PACKAGE" $INSTALLED
1596 DEPENDS="$(. "$INSTALLED/$PACKAGE/receipt"; echo $DEPENDS)"
1597 MISSING=''
1598 for i in $DEPENDS; do
1599 [ -e $INSTALLED/$i ] && continue
1600 MISSING="$MISSING$i "
1601 _ 'Missing: %s' $i
1602 done
1603 if [ -n "$MISSING" ]; then
1604 newline
1605 confirm "$(_ 'Link all missing dependencies? (y/N)')"
1606 answer=$?
1607 newline
1608 if [ "$answer" -eq 0 ]; then
1609 for i in $MISSING; do
1610 tazpkg link $i $TARGET_DIR
1611 done
1612 else
1613 newline
1614 _ 'Leaving dependencies unresolved for package "%s"' "$PACKAGE"
1615 _ 'The package is installed but probably will not work.'
1616 newline
1617 fi
1618 fi
1619 . "$INSTALLED/$PACKAGE/receipt"
1620 if grep -q ^pre_install "$INSTALLED/$PACKAGE/receipt"; then
1621 pre_install
1622 fi
1623 while read path; do
1624 [ -e "$path" ] && continue
1625 while true; do
1626 dir="$(dirname "$path")"
1627 [ -e "$dir" ] && break
1628 path="$dir"
1629 done
1630 ln -s "$TARGET_DIR$path" "$dir"
1631 done < "$INSTALLED/$PACKAGE/files.list"
1632 if grep -q ^post_install "$INSTALLED/$PACKAGE/receipt"; then
1633 post_install
1634 fi ;;
1637 help|-h)
1638 # TazPkg help system
1639 shift; @@MODULES@@/help $@
1640 ;;
1643 mkdb)
1644 # Make TazPkg database
1645 shift; @@MODULES@@/mkdb $@
1646 ;;
1649 '')
1650 # Default to summary
1651 @@MODULES@@/summary
1652 ;;
1655 usage|*)
1656 # Print a short help or give usage for an unknown or empty command.
1657 @@MODULES@@/help ;;
1658 esac
1660 exit 0