tazpkg annotate tazpkg @ rev 265

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