tazpkg view tazpkg @ rev 840
Add a bunch of modules with new-style support of 'root' (not all commands are modules yet); strip and compress resources.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Fri Aug 28 16:10:34 2015 +0300 (2015-08-28) |
parents | b1da66280a9d |
children | 0560ba4306a1 |
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 priority=$(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 list|-l)
983 # Various lists
984 shift
985 case $1 in
986 b|blocked) @@MODULES@@/list blocked ;;
987 c|cat|categories) @@MODULES@@/list categories;;
988 l|linked) @@MODULES@@/list linked ;;
989 '') @@MODULES@@/list installed ;;
990 *) @@MODULES@@/list installed_of_category "$@";;
991 esac
992 ;;
993 -lb) @@MODULES@@/list blocked ;;
994 -lc) @@MODULES@@/list categories;;
995 -ll) @@MODULES@@/list linked ;;
997 -lm|list-mirror) @@MODULES@@/list mirrored ;;
998 -lf|list-files) check_for_package_on_cmdline
999 @@MODULES@@/list installed_files $PACKAGE;;
1000 -a|activity|log) @@MODULES@@/list activity ;;
1001 list-config) @@MODULES@@/list config_files $2;;
1002 list-suggested) @@MODULES@@/list suggested ;;
1005 info)
1006 # Information about package
1007 check_for_package_on_cmdline
1008 @@MODULES@@/info "$2"
1009 ;;
1012 desc|-d)
1013 # Display package description
1014 @@MODULES@@/description "$2"
1015 ;;
1018 search|-s)
1019 # Search for a package by pattern or name.
1020 if [ -z "$2" ]; then tazpkg -h search; exit 1; fi
1022 # Extend short options to long analogs
1023 case "$3" in
1024 -i) export installed='yes';;
1025 -l) export list='yes';;
1026 -m) export mirror='yes';;
1027 esac
1029 @@MODULES@@/search pkg "$2"
1030 ;;
1033 search-file|-sf)
1034 # Search for a file by pattern or name in all files.list.
1035 if [ -z "$2" ]; then tazpkg -h search-file; exit 1; fi
1037 @@MODULES@@/search file "$2"
1038 ;;
1041 search-pkgname|-sp)
1042 # Search for a package name
1043 if [ -z "$2" ]; then tazpkg -h search-pkgname; exit 1; fi
1045 @@MODULES@@/search file2 "$2"
1046 ;;
1049 install|-i)
1050 # Install .tazpkg packages.
1051 check_root $1
1052 check_for_package_on_cmdline
1053 check_for_package_file
1054 check_for_installed_info
1056 if [ -n "$root" ]; then
1057 ROOT="$root";
1058 check_base_dir "$root"
1059 fi
1061 [ -n "$list" ] && INSTALL_LIST="$list"
1063 # Get repositories priority list.
1064 look_for_priority
1066 # Check if forced install.
1067 if [ -z "$forced" ]; then
1068 check_for_installed_package $ROOT
1069 fi
1070 install_package $ROOT
1071 update_desktop_database $ROOT
1072 update_mime_database $ROOT
1073 update_icon_database $ROOT
1074 compile_glib_schemas $ROOT
1075 ;;
1078 install-list|get-install-list)
1079 # Install a set of packages from a list.
1080 check_root $1
1082 if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
1084 # Check if the packages list exists.
1085 if [ ! -f "$2" ]; then
1086 _ 'Unable to find list "%s"' "$2"
1087 exit 1
1088 fi
1090 LIST=$(cat $2)
1092 # Remember processed list
1093 export INSTALL_LIST="$2"
1095 # Set $COMMAND and install all packages.
1096 COMMAND=${1%-list}
1098 touch $2-processed
1100 # Upgrade tazpkg first. It may handle new features/formats...
1101 # then upgrade essential packages early
1102 for pkg in busybox-pam busybox gcc-lib-base glibc-base \
1103 slitaz-base-files tazpkg ; do
1104 pkg=$(egrep $pkg-[0-9] $INSTALL_LIST)
1105 [ -z "$pkg" ] && continue
1106 _ 'Adding implicit depends "%s"...' $pkg
1107 LIST="$pkg"$'\n'"$LIST"
1108 done
1110 for pkg in $LIST; do
1111 grep -qs ^$pkg$ $2-processed && continue
1112 [ -d "$root/var/lib/tazpkg/installed" ] &&
1113 tazpkg $COMMAND $pkg --list="$2" "$3" "$4" "$5"
1114 done
1115 rm -f $2-processed
1116 ;;
1119 add-flavor)
1120 # Install a set of packages from a flavor.
1121 check_root $1
1122 shift; @@MODULES@@/flavor $@
1123 ;;
1124 install-flavor)
1125 # Install a set of packages from a flavor and purge other ones.
1126 check_root $1
1127 shift; purge='yes' @@MODULES@@/flavor $@
1128 ;;
1131 set-release)
1132 # Change current release and upgrade packages.
1133 check_root $1
1134 if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
1135 RELEASE="$2"
1136 rm "$PKGS_DB/mirror"
1137 echo "$RELEASE" > "$root/etc/slitaz-release"
1138 tazpkg recharge && tazpkg upgrade
1140 # Install missing depends
1141 cd "$INSTALLED"
1142 for i in * ; do
1143 unset DEPENDS; . "$i/receipt"
1144 for j in $DEPENDS; do
1145 [ -d "$j" ] || tazpkg get-install "$j"
1146 done
1147 done
1148 ;;
1151 remove|-r)
1152 # Remove packages.
1153 check_root $1
1154 check_for_package_on_cmdline
1155 shift; @@MODULES@@/remove $@
1156 ;;
1159 extract|-e)
1160 # Extract .tazpkg cpio archive into a directory.
1161 check_for_package_on_cmdline
1162 check_for_package_file
1163 title 'Extracting package "%s"' "$PACKAGE"
1165 # If no directory destination is found on the cmdline
1166 # we create one in the current dir using the package name.
1167 if [ -n "$TARGET_DIR" ]; then
1168 DESTDIR="$TARGET_DIR/$PACKAGE"
1169 else
1170 DESTDIR="$PACKAGE"
1171 fi
1172 mkdir -p $DESTDIR
1174 action 'Copying original package...'
1175 cp "$PACKAGE_FILE" $DESTDIR
1176 status
1178 cd $DESTDIR
1179 extract_package
1180 [ -e "receipt" ] && \
1181 footer "$(_ 'Package "%s" is extracted to "%s"' "$PACKAGE" "$DESTDIR")"
1182 ;;
1185 recompress)
1186 # Recompress .tazpkg cpio archive with lzma.
1187 check_for_package_on_cmdline
1188 check_for_package_file
1189 title 'Recompressing package "%s"' "$PACKAGE"
1190 mkdir -p $TMP_DIR
1192 action "Copying original package..."
1193 cp "$PACKAGE_FILE" $TMP_DIR
1194 status
1196 cd $TMP_DIR
1197 extract_package
1199 action "Recompressing the FS..."
1200 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
1201 rm -rf fs
1202 status
1204 action "Creating new package..."
1205 find . -print | cpio -o -H newc --quiet > \
1206 "$TOP_DIR/$(basename "$PACKAGE_FILE").$$" && mv -f \
1207 "$TOP_DIR/$(basename "$PACKAGE_FILE").$$" \
1208 "$TOP_DIR/$(basename "$PACKAGE_FILE")"
1209 status
1211 cd "$TOP_DIR"
1212 rm -rf $TMP_DIR
1213 separator; newline
1214 ;;
1217 repack-config)
1218 check_root $@
1219 # Create SliTaz package archive from configuration files.
1220 mkdir -p $TMP_DIR; cd $TMP_DIR
1221 CONFIG_VERSION='1.0'
1222 mkdir config-$CONFIG_VERSION
1223 cd config-$CONFIG_VERSION
1224 for i in $INSTALLED/*/volatile.cpio.gz; do
1225 zcat $i | cpio -t --quiet
1226 done > files.list
1227 mkdir fs
1228 cd fs
1229 ( cd / ; cpio -o -H newc --quiet ) < ../files.list | cpio -idm --quiet > /dev/null
1230 mkdir -p etc/tazlito
1231 for i in $INSTALLED/*/receipt; do
1232 EXTRAVERSION=''
1233 . $i
1234 echo "$PACKAGE-$VERSION$EXTRAVERSION"
1235 done > etc/tazlito/config-packages.list
1236 cd ..
1237 echo "etc/tazlito/config-packages.list" >> files.list
1238 pkg_date=$(date +"%x %X")
1239 cat > receipt <<EOT
1240 # SliTaz package receipt.
1242 PACKAGE="config"
1243 VERSION="$CONFIG_VERSION"
1244 CATEGORY="base-system"
1245 SHORT_DESC="$(_n 'User configuration backup on date %s' "$pkg_date")"
1246 DEPENDS="$(ls $INSTALLED)"
1247 EOT
1248 cd ..
1249 tazpkg pack config-$CONFIG_VERSION
1250 cp config-$CONFIG_VERSION.tazpkg "$TOP_DIR"
1251 cd "$TOP_DIR"
1252 rm -rf $TMP_DIR
1253 ;;
1256 repack)
1257 # Create SliTaz package archive from an installed package.
1258 check_for_package_on_cmdline
1259 check_for_receipt
1260 shift; @@MODULES@@/repack $@
1261 ;;
1264 pack)
1265 # Create SliTaz package archive using cpio and lzma.
1266 # TODO: Cook also pack packages, we should share code in libpkg.sh
1267 check_for_package_on_cmdline
1268 shift; @@MODULES@@/pack $@
1269 ;;
1272 recharge)
1273 # Recharge packages databases from a mirror.
1274 #
1275 # WARNING: The 'mirrors' file has all SliTaz mirrors but 'mirror'
1276 # must have only the chosen main mirror.
1277 #
1278 check_root $1
1279 shift; @@MODULES@@/recharge $@
1280 ;;
1283 up|upgrade)
1284 check_root $1
1285 #
1286 # This is the new way to upgrade packages making 'upgrade' and
1287 # upgradeable out-of-date. This new way is much, much more faster!
1288 # Look into installed packages and get data from receipt, it is fast
1289 # and easy to handle vars after using only md5sum to compare packages
1290 #
1291 for opt in $@; do
1292 case "$opt" in
1293 -i) export install='yes';;
1294 -c) export check='yes';;
1295 esac
1296 done
1298 @@MODULES@@/upgrade
1299 ;;
1302 bugs)
1303 # Show known bugs in package(s)
1304 cd $INSTALLED
1305 shift
1306 LIST=$@
1307 [ -z "$LIST" ] && LIST=$(ls)
1308 MSG=$(_n 'No known bugs.')
1310 title 'Known bugs in packages'
1311 for PACKAGE in $LIST; do
1312 BUGS=''
1313 EXTRAVERSION=''
1314 . "$PACKAGE/receipt"
1315 if [ -n "$BUGS" ]; then
1316 MSG=$(_n 'Bug list completed')
1317 newline
1318 _ 'Bugs in package "%s" version %s:' "$PACKAGE" "$VERSION$EXTRAVERSION"
1319 cat <<EOT
1320 $BUGS
1321 EOT
1322 fi
1323 done
1324 footer "$MSG"
1325 ;;
1328 check)
1329 # Check installed packages set.
1330 shift; @@MODULES@@/check $@
1331 ;;
1334 block|-b|unblock|-u|chblock)
1335 # Add/remove a pkg name to the list of blocked packages.
1336 check_root $@
1337 check_for_package_on_cmdline
1338 @@MODULES@@/block $@
1339 ;;
1342 get|-g)
1343 # Download a package with wget.
1344 check_root $@
1345 check_for_package_on_cmdline
1346 check_for_packages_list
1348 [ -n "$root" ] && ROOT="$root" && check_base_dir "$root"
1349 if [ -n "$rootconfig" ]; then
1350 if [ -n "$root" ]; then
1351 CACHE_DIR="$root/$CACHE_DIR"
1352 SAVE_CACHE_DIR="$CACHE_DIR"
1353 PKGS_DB="$root/$PKGS_DB"
1354 else
1355 _ 'rootconfig needs --root= option used.' >&2
1356 exit 1
1357 fi
1358 fi
1360 # Get repositories priority list.
1361 look_for_priority
1363 CURRENT_DIR="$PWD"
1364 cd "$CACHE_DIR"
1365 if check_for_package_in_list check ; then
1366 cd "$CACHE_DIR"
1367 if [ -f "$PACKAGE.tazpkg" ]; then
1368 _ 'Package "%s" already in the cache' "$PACKAGE"
1369 # Check package download was finished
1370 tail -c 2k "$PACKAGE.tazpkg" | fgrep -q '00000000TRAILER' || {
1371 _ 'Continuing package "%s" download' "$PACKAGE"
1372 download "$PACKAGE.tazpkg"
1373 }
1374 if [ "$($CHECKSUM "$PACKAGE.tazpkg")" != \
1375 "$(fgrep " $PACKAGE.tazpkg" "$rep/packages.$SUM")" ]; then
1376 rm -f "$PACKAGE.tazpkg"
1377 download "$PACKAGE.tazpkg"
1378 fi
1379 else
1380 download "$PACKAGE.tazpkg"
1381 fi
1382 PACKAGE_FILE="$CACHE_DIR/$PACKAGE.tazpkg"
1383 elif download_get_script "$PACKAGE" "/tmp/$PACKAGE.$$" ; then
1384 install_package_from_get_script "/tmp/$PACKAGE.$$" "$ROOT" --get
1385 PACKAGE_FILE="$(ls "$PWD/$PACKAGE-*.tazpkg")"
1386 fi
1387 [ "$PWD" != "$CURRENT_DIR" ] &&
1388 cp -a "$PACKAGE_FILE" "$CURRENT_DIR"
1389 ;;
1392 get-install|-gi)
1393 # Download and install a package.
1394 check_root $@
1395 check_for_package_on_cmdline
1396 check_for_packages_list
1398 DO_CHECK=''
1399 [ -n "$forced" ] && DO_CHECK='no'
1400 [ -n "$root" ] && ROOT="$root" && check_base_dir "$root"
1401 [ -n "$list" ] && INSTALL_LIST="$list" # internal option
1403 # Get repositories priority list.
1404 look_for_priority
1406 AUTOEXEC='no'
1407 # Magic :)
1408 # After testing this condition $PACKAGE become $PACKAGE-$VERSION$EXTRAVERSION
1409 if ! check_for_package_in_list check; then
1410 CACHE_DIR="${CACHE_DIR%/*}/get"
1411 [ -d "$CACHE_DIR" ] || mkdir -p $CACHE_DIR
1412 if download_get_script "$PACKAGE" "/tmp/$PACKAGE.$$" ; then
1413 install_package_from_get_script "/tmp/$PACKAGE.$$" $ROOT
1414 exit 0
1415 else
1416 PACKAGE="get-$PACKAGE"
1417 AUTOEXEC="$PACKAGE"
1418 # Here $PACKAGE become $PACKAGE-$VERSION$EXTRAVERSION
1419 check_for_package_in_list
1420 if [ -n "$(get_installed_package_pathname "$PACKAGE" "$ROOT")" ]; then
1421 $AUTOEXEC $ROOT
1422 exit 0
1423 fi
1424 fi
1425 fi
1426 # Check if no forced install.
1427 if [ -z "$forced" ]; then
1428 check_for_installed_package $ROOT
1429 fi
1431 cd $CACHE_DIR
1432 # Here $PACKAGE is $PACKAGE-$VERSION$EXTRAVERSION
1433 if [ -f "$PACKAGE.tazpkg" ]; then
1434 _ 'Package "%s" already in the cache' "$PACKAGE"
1435 # Check package download was finished
1436 tail -c 2k "$PACKAGE.tazpkg" | fgrep -q '00000000TRAILER' || {
1437 _ 'Continuing package "%s" download' "$PACKAGE"
1438 download "$PACKAGE.tazpkg"
1439 }
1440 if [ "$($CHECKSUM "$PACKAGE.tazpkg")" != "$(fgrep " $PACKAGE.tazpkg" $rep/packages.$SUM)" ]; then
1441 rm -f "$PACKAGE.tazpkg"
1442 download "$PACKAGE.tazpkg"
1443 fi
1444 else
1445 newline
1446 download "$PACKAGE.tazpkg"
1447 fi
1448 PACKAGE_FILE="$CACHE_DIR/$PACKAGE.tazpkg"
1449 [ -n "$rootconfig" ] && PKGS_DB="${PKGS_DB#$root}"
1450 install_package "$ROOT"
1451 [ "$AUTOEXEC" != 'no' ] && "$PACKAGE" $ROOT
1452 update_desktop_database $ROOT
1453 update_mime_database $ROOT ;;
1456 clean-cache|-cc)
1457 # Remove all downloaded packages.
1458 check_root $@
1459 files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
1460 size=$(du -hs $CACHE_DIR | cut -f1 | sed 's|\.0||'); [ "$files" -eq 0 ] && size="0K"
1462 title 'Cleaning cache directory...'
1463 action 'Path: %s' "$CACHE_DIR"
1464 rm -rf $CACHE_DIR/*
1465 status
1467 footer "$(_p \
1468 '%s file removed from cache (%s).' \
1469 '%s files removed from cache (%s).' $files \
1470 "$(colorize 32 "$files")" $size)"
1471 ;;
1474 list-undigest)
1475 # List undigest mirrors
1476 @@MODULES@@/mirror list
1477 ;;
1478 remove-undigest)
1479 # Remove undigest mirror
1480 check_root $1
1481 shift; @@MODULES@@/mirror remove $@
1482 ;;
1483 add-undigest|setup-undigest)
1484 # Add undigest mirror
1485 check_root $1
1486 shift; @@MODULES@@/mirror add $@
1487 ;;
1488 setup-mirror|-sm)
1489 # Change main mirror
1490 check_root $@
1491 shift; @@MODULES@@/mirror setup $@
1492 ;;
1495 reconfigure)
1496 # Replay post_install from receipt
1497 check_for_package_on_cmdline
1498 check_root $1
1500 ROOT="$root"
1501 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
1502 check_for_receipt $ROOT
1503 # Check for post_install
1504 if grep -q ^post_install "$ROOT$INSTALLED/$PACKAGE/receipt"; then
1505 . "$ROOT$INSTALLED/$PACKAGE/receipt"
1506 post_install $ROOT
1507 # Log this activity
1508 [ -z "$ROOT" ] && log_pkg Reconfigured
1509 else
1510 newline
1511 _ 'Nothing to do for package "%s".' "$PACKAGE"
1512 fi
1513 else
1514 newline
1515 _ 'Package "%s" is not installed.' "$PACKAGE"
1516 _ 'Install package with "%s" or "%s"' 'tazpkg install' 'tazpkg get-install'
1517 newline
1518 fi
1519 ;;
1522 shell)
1523 # TazPkg SHell
1524 if [ "$(id -u)" -eq 0 ]; then
1525 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
1526 else
1527 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
1528 fi
1529 if [ -z "$noheader" ]; then
1530 clear
1531 title 'TazPkg SHell.'
1532 _ "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
1533 newline
1534 fi
1535 while true; do
1536 echo -en "$PROMPT"; read cmd
1537 case $cmd in
1538 q|quit)
1539 break ;;
1540 shell)
1541 _ 'You are already running a TazPkg SHell.' ;;
1542 su)
1543 su -c 'exec tazpkg shell --noheader' && break ;;
1544 "")
1545 continue ;;
1546 *)
1547 tazpkg $cmd ;;
1548 esac
1549 done ;;
1552 depends)
1553 # Display dependencies tree
1554 shift; @@MODULES@@/depends depends $@
1555 ;;
1556 rdepends)
1557 # Display reverse dependencies tree
1558 shift; @@MODULES@@/depends rdepends $@
1559 ;;
1562 convert|-c)
1563 # convert misc package format to .tazpkg
1564 check_for_package_file
1565 shift; @@MODULES@@/convert $@
1566 ;;
1569 link)
1570 # link a package from another SliTaz installation
1571 PACKAGE="$2"
1572 if [ ! -d "$TARGET_DIR" -o \
1573 ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
1574 _ 'Usage: tazpkg link package_name slitaz_root'
1575 longline "$(
1576 _n 'Example:'
1577 echo -n ' '
1578 _ '"%s" will use less than 100k in your running system RAM.' \
1579 'tazpkg link openoffice /mnt')"
1580 exit 1
1581 fi
1582 if [ -e "$INSTALLED/$PACKAGE" ]; then
1583 _ 'Package "%s" is already installed.' "$PACKAGE"
1584 exit 1
1585 fi
1586 ln -s "$TARGET_DIR$INSTALLED/$PACKAGE" $INSTALLED
1587 DEPENDS="$(. "$INSTALLED/$PACKAGE/receipt"; echo $DEPENDS)"
1588 MISSING=''
1589 for i in $DEPENDS; do
1590 [ -e $INSTALLED/$i ] && continue
1591 MISSING="$MISSING$i "
1592 _ 'Missing: %s' $i
1593 done
1594 if [ -n "$MISSING" ]; then
1595 newline
1596 confirm "$(_ 'Link all missing dependencies? (y/N)')"
1597 answer=$?
1598 newline
1599 if [ "$answer" -eq 0 ]; then
1600 for i in $MISSING; do
1601 tazpkg link $i $TARGET_DIR
1602 done
1603 else
1604 newline
1605 _ 'Leaving dependencies unresolved for package "%s"' "$PACKAGE"
1606 _ 'The package is installed but probably will not work.'
1607 newline
1608 fi
1609 fi
1610 . "$INSTALLED/$PACKAGE/receipt"
1611 if grep -q ^pre_install "$INSTALLED/$PACKAGE/receipt"; then
1612 pre_install
1613 fi
1614 while read path; do
1615 [ -e "$path" ] && continue
1616 while true; do
1617 dir="$(dirname "$path")"
1618 [ -e "$dir" ] && break
1619 path="$dir"
1620 done
1621 ln -s "$TARGET_DIR$path" "$dir"
1622 done < "$INSTALLED/$PACKAGE/files.list"
1623 if grep -q ^post_install "$INSTALLED/$PACKAGE/receipt"; then
1624 post_install
1625 fi ;;
1628 help|-h)
1629 # TazPkg help system
1630 shift; @@MODULES@@/help $@
1631 ;;
1634 mkdb)
1635 # Make TazPkg database
1636 shift; @@MODULES@@/mkdb $@
1637 ;;
1640 '')
1641 # Default to summary
1642 @@MODULES@@/summary
1643 ;;
1646 usage|*)
1647 # Print a short help or give usage for an unknown or empty command.
1648 @@MODULES@@/help ;;
1649 esac
1651 exit 0