tazpkg annotate tazpkg @ rev 10

Add block|unblock cmds and modified the way upgrade works
author Christophe Lincoln <pankso@slitaz.org>
date Wed Nov 28 13:41:59 2007 +0100 (2007-11-28)
parents edcb3320b2cf
children cc4ca7afee94
rev   line source
pankso@6 1 #!/bin/sh
pankso@6 2 # Tazpkg - Tiny autonomus zone packages manager.
pankso@6 3 #
pankso@6 4 # This is a lightwight packages manager for *.tazpkg files, all written in
pankso@6 5 # SHell script. It works well with Busybox ash shell and bash. Tazpkg let you
pankso@6 6 # list, install, remove, download or get information about a package, you can
pankso@6 7 # use 'tazpkg usage' to get a list of commands with a short description. Tazpkg
pankso@6 8 # also relolv dependencies and can upgrade packages from a mirror.
pankso@6 9 #
pankso@6 10 # (C) 2007 SliTaz - GNU General Public License v3.
pankso@10 11 # Initial author : <pankso@slitaz.org>
pankso@6 12 #
pankso@9 13 VERSION=1.4pre
pankso@6 14
pankso@6 15 ####################
pankso@6 16 # Script variables #
pankso@6 17 ####################
pankso@6 18
pankso@6 19 # Packages categories.
pankso@10 20 CATEGORIES="base-system base-apps x-window extra devel"
pankso@6 21
pankso@6 22 # Initialize some variables to use words
pankso@6 23 # rater than numbers for functions and actions.
pankso@6 24 COMMAND=$1
pankso@10 25 if [ -f $2 ]; then
pankso@10 26 # Set pkg basename for install, extract
pankso@10 27 PACKAGE=$(basename ${2%.tazpkg} 2>/dev/null)
pankso@10 28 else
pankso@10 29 # Pkg name for remove, search and all other cmds
pankso@10 30 PACKAGE=${2%.tazpkg}
pankso@10 31 fi
pankso@9 32 PACKAGE_FILE=$2
pankso@6 33 TARGET_DIR=$3
pankso@6 34 TOP_DIR=`pwd`
pankso@6 35 TMP_DIR=/tmp/tazpkg-$$-$RANDOM
pankso@6 36
pankso@6 37 # Path to tazpkg used dir and configuration files
pankso@6 38 LOCALSTATE=/var/lib/tazpkg
pankso@6 39 INSTALLED=$LOCALSTATE/installed
pankso@6 40 CACHE_DIR=/var/cache/tazpkg
pankso@6 41 MIRROR=$LOCALSTATE/mirror
pankso@6 42 PACKAGES_LIST=$LOCALSTATE/packages.list
pankso@10 43 BLOCKED=$LOCALSTATE/blocked-packages.list
pankso@6 44
pankso@10 45 # Bold red warnig for upgrade.
pankso@10 46 WARNING="\\033[1;31mWARNING\\033[0;39m"
pankso@6 47
pankso@6 48 # Check if the directories and files used by Tazpkg
pankso@6 49 # exists. If not and user is root we creat them.
pankso@6 50 if test $(id -u) = 0 ; then
pankso@6 51 if [ ! -d "$CACHE_DIR" ]; then
pankso@6 52 mkdir -p $CACHE_DIR
pankso@6 53 fi
pankso@6 54 if [ ! -d "$INSTALLED" ]; then
pankso@6 55 mkdir -p $INSTALLED
pankso@6 56 fi
pankso@6 57 if [ ! -f "$LOCALSTATE/mirror" ]; then
pankso@6 58 echo "$DEFAULT_MIRROR" > $LOCALSTATE/mirror
pankso@6 59 fi
pankso@6 60 fi
pankso@6 61
pankso@6 62 ####################
pankso@6 63 # Script functions #
pankso@6 64 ####################
pankso@6 65
pankso@6 66 # Print the usage.
pankso@6 67 usage ()
pankso@6 68 {
pankso@6 69 echo -e "SliTaz packages manager - Version: $VERSION\n
pankso@6 70 \033[1mUsage: \033[0m tazpkg [command] [package|dir|pattern|list|cat|--opt] [dir|--opt]
pankso@6 71 \033[1mCommands: \033[0m
pankso@6 72 usage Print this short usage.
pankso@6 73 list List installed packages on the system by category or all.
pankso@6 74 list-mirror List all available packages on the mirror (--diff for new).
pankso@6 75 info Print informations about the package.
pankso@6 76 desc Print description of a package (if it exist).
pankso@6 77 list-files List of files installed with the package.
pankso@6 78 search Search for a package by pattern or name.
pankso@6 79 install Install a local (*.tazpkg) package (--forced to force).
pankso@6 80 install-list Install all packages from a list of packages.
pankso@6 81 remove Remove the specified package and all installed files.
pankso@6 82 extract Extract a (*.tazpkg) package into a directory.
pankso@6 83 pack Pack an unpacked or prepared package tree.
pankso@6 84 recharge Recharge your packages.list from the mirror.
pankso@6 85 upgrade Upgrade all installed and listed packages on the mirror.
pankso@10 86 block|unblock Block an installed package version or unblock it for upgrade.
pankso@6 87 get Download a package into the current directory.
pankso@6 88 get-install Download and install a package from the mirror.
pankso@6 89 clean-cache Clean all packages downloaded in cache directory.
pankso@10 90 setup-mirror Change the mirror url configuration."
pankso@6 91 }
pankso@6 92
pankso@6 93 # Status function with color (supported by Ash).
pankso@6 94 status()
pankso@6 95 {
pankso@6 96 local CHECK=$?
pankso@6 97 echo -en "\\033[70G[ "
pankso@6 98 if [ $CHECK = 0 ]; then
pankso@6 99 echo -en "\\033[1;33mOK"
pankso@6 100 else
pankso@6 101 echo -en "\\033[1;31mFailed"
pankso@6 102 fi
pankso@6 103 echo -e "\\033[0;39m ]"
pankso@6 104 }
pankso@6 105
pankso@6 106 # Check if user is root to install, or remove packages.
pankso@6 107 check_root()
pankso@6 108 {
pankso@6 109 if test $(id -u) != 0 ; then
pankso@6 110 echo -e "\nYou must be root to run `basename $0` with this option."
pankso@6 111 echo -e "Please type 'su' and root password to become super-user.\n"
pankso@6 112 exit 0
pankso@6 113 fi
pankso@6 114 }
pankso@6 115
pankso@6 116 # Check for a package name on cmdline.
pankso@6 117 check_for_package_on_cmdline()
pankso@6 118 {
pankso@6 119 if [ -z "$PACKAGE" ]; then
pankso@6 120 echo -e "\nPlease specify a package name on the command line.\n"
pankso@6 121 exit 0
pankso@6 122 fi
pankso@6 123 }
pankso@6 124
pankso@9 125 # Check if the package (*.tazpkg) exist before installing or extracting.
pankso@6 126 check_for_package_file()
pankso@6 127 {
pankso@9 128 if [ ! -f "$PACKAGE_FILE" ]; then
pankso@6 129 echo -e "
pankso@9 130 Unable to find : $PACKAGE_FILE\n"
pankso@6 131 exit 0
pankso@6 132 fi
pankso@6 133 }
pankso@6 134
pankso@6 135 # Check for the receipt of an installed package.
pankso@6 136 check_for_receipt()
pankso@6 137 {
pankso@6 138 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then
pankso@6 139 echo -e "\nUnable to find the receipt : $INSTALLED/$PACKAGE/receipt\n"
pankso@6 140 exit 0
pankso@6 141 fi
pankso@6 142 }
pankso@6 143
pankso@6 144 # Check if a package is already installed.
pankso@6 145 check_for_installed_package()
pankso@6 146 {
pankso@6 147 if [ -d "$INSTALLED/${PACKAGE%-[0-9]*}" ]; then
pankso@6 148 echo -e "
pankso@6 149 $PACKAGE is already installed. You can use the --forced option to force
pankso@6 150 installation or remove it and reinstall.\n"
pankso@6 151 exit 0
pankso@6 152 fi
pankso@6 153 }
pankso@6 154
pankso@6 155 # Check for packages.list to download and install packages.
pankso@6 156 check_for_packages_list()
pankso@6 157 {
pankso@6 158 if [ ! -f "$LOCALSTATE/packages.list" ]; then
pankso@6 159 echo -e "
pankso@6 160 Unable to find the list : $LOCALSTATE/packages.list\n
pankso@6 161 You must probably run 'tazpkg recharge' as root to get the last list of
pankso@6 162 packages avalaible on the mirror.\n"
pankso@6 163 exit 0
pankso@6 164 fi
pankso@6 165 }
pankso@6 166
pankso@6 167 # Check for a package in packages.list. Used by get and get-install to grep
pankso@6 168 # package basename.
pankso@6 169 check_for_package_in_list()
pankso@6 170 {
pankso@6 171 if grep -q "^$PACKAGE-[0-9]" $LOCALSTATE/packages.list; then
pankso@6 172 PACKAGE=`grep ^$PACKAGE-[0-9] $LOCALSTATE/packages.list`
pankso@6 173 else
pankso@6 174 echo -e "\nUnable to find : $PACKAGE in the mirrored packages list.\n"
pankso@6 175 exit 0
pankso@6 176 fi
pankso@6 177 }
pankso@6 178
pankso@6 179 # Extract a package with cpio and gzip.
pankso@6 180 extract_package()
pankso@6 181 {
pankso@6 182 echo -n "Extracting $PACKAGE..."
pankso@6 183 cpio -id < $PACKAGE.tazpkg && rm -f $PACKAGE.tazpkg
pankso@6 184 gzip -d fs.cpio.gz
pankso@6 185 echo -n "Extracting the pseudo fs... "
pankso@6 186 cpio -id < fs.cpio && rm fs.cpio
pankso@6 187 }
pankso@6 188
pankso@6 189 # This function install a package in the rootfs.
pankso@6 190 install_package()
pankso@6 191 {
pankso@6 192 mkdir -p $TMP_DIR
pankso@6 193 echo ""
pankso@6 194 echo -e "\033[1mInstallation of :\033[0m $PACKAGE"
pankso@6 195 echo "================================================================================"
pankso@6 196 echo -n "Copying $PACKAGE... "
pankso@9 197 cp $PACKAGE_FILE $TMP_DIR
pankso@6 198 status
pankso@6 199 cd $TMP_DIR
pankso@6 200 extract_package
pankso@6 201 # Include temporary receipt to get the right variables.
pankso@6 202 . $PWD/receipt
pankso@6 203 # Make the installed package data dir to store
pankso@6 204 # the receipt and the files list.
pankso@6 205 mkdir -p $INSTALLED/$PACKAGE
pankso@6 206 cp receipt $INSTALLED/$PACKAGE
pankso@6 207 # Include installed receipt.
pankso@6 208 . $INSTALLED/$PACKAGE/receipt
pankso@6 209 # Copy the list of files and the description if found.
pankso@6 210 cp files.list $INSTALLED/$PACKAGE
pankso@6 211 if [ -f "description.txt" ]; then
pankso@6 212 cp description.txt $INSTALLED/$PACKAGE
pankso@6 213 fi
pankso@6 214 if [ `cat $INSTALLED/$PACKAGE/receipt | grep pre_install` ]; then
pankso@6 215 # Execute post install commands.
pankso@6 216 pre_install
pankso@6 217 fi
pankso@6 218 echo -n "Installing $PACKAGE... "
pankso@6 219 cp -a fs/* /
pankso@6 220 status
pankso@6 221 # Remove the temporary random directory.
pankso@6 222 echo -n "Removing all tmp files... "
pankso@6 223 cd .. && rm -rf $TMP_DIR
pankso@6 224 status
pankso@6 225 if [ `cat $INSTALLED/$PACKAGE/receipt | grep post_install` ]; then
pankso@6 226 # Execute post install commands.
pankso@6 227 post_install
pankso@6 228 fi
pankso@6 229 cd $TOP_DIR
pankso@6 230 echo "================================================================================"
pankso@6 231 echo "$PACKAGE ($VERSION) is installed."
pankso@6 232 echo ""
pankso@6 233 }
pankso@6 234
pankso@6 235 # Check for missing deps listed in a receipt packages.
pankso@6 236 check_for_deps()
pankso@6 237 {
pankso@6 238 for i in $DEPENDS
pankso@6 239 do
pankso@6 240 if [ ! -d "$INSTALLED/$i" ]; then
pankso@6 241 MISSING_PACKAGE=$i
pankso@6 242 deps=$(($deps+1))
pankso@6 243 fi
pankso@6 244 done
pankso@6 245 if [ ! "$MISSING_PACKAGE" = "" ]; then
pankso@6 246 echo -e "\033[1mTracking dependencies for :\033[0m $PACKAGE"
pankso@6 247 echo "================================================================================"
pankso@6 248 for i in $DEPENDS
pankso@6 249 do
pankso@6 250 if [ ! -d "$INSTALLED/$i" ]; then
pankso@6 251 MISSING_PACKAGE=$i
pankso@6 252 echo "Missing : $MISSING_PACKAGE"
pankso@6 253 fi
pankso@6 254 done
pankso@6 255 echo "================================================================================"
pankso@6 256 echo "$deps missing package(s) to install."
pankso@6 257 fi
pankso@6 258 }
pankso@6 259
pankso@6 260 # Install all missing deps. First ask user then install all missing deps
pankso@6 261 # from local dir, cdrom, media or from the mirror. In case we want to
pankso@6 262 # install packages from local, we need a packages.list to find the version.
pankso@6 263 install_deps()
pankso@6 264 {
pankso@6 265 echo ""
pankso@10 266 echo -n "Install all missing dependencies (y/N) ? "; read anser
pankso@6 267 if [ "$anser" = "y" ]; then
pankso@6 268 for pkg in $DEPENDS
pankso@6 269 do
pankso@6 270 if [ ! -d "$INSTALLED/$pkg" ]; then
pankso@6 271 # We can install packages from a local dir by greping
pankso@6 272 # the TAZPKG_BASENAME in the local packages.list.
pankso@6 273 if [ -f "$TOP_DIR/packages.list" ]; then
pankso@6 274 echo "Checking if $pkg exist in local list... "
pankso@6 275 TAZPKG_BASENAME=`grep -e ^$pkg-[0-9] $TOP_DIR/packages.list`
pankso@6 276 if [ -f "$TAZPKG_BASENAME.tazpkg" ]; then
pankso@6 277 tazpkg install $TAZPKG_BASENAME.tazpkg
pankso@6 278 fi
pankso@6 279 # Install deps from the mirror.
pankso@6 280 else
pankso@6 281 if [ ! -f "$LOCALSTATE/packages.list" ]; then
pankso@6 282 tazpkg recharge
pankso@6 283 fi
pankso@6 284 tazpkg get-install $pkg
pankso@6 285 fi
pankso@6 286 fi
pankso@6 287 done
pankso@6 288 else
pankso@6 289 echo -e "\nLeaving dependencies for $PACKAGE unsolved."
pankso@6 290 echo -e "The package is installed but will probably not work.\n"
pankso@6 291 fi
pankso@6 292 }
pankso@6 293
pankso@6 294 ###################
pankso@6 295 # Tazpkg commands #
pankso@6 296 ###################
pankso@6 297
pankso@6 298 case "$COMMAND" in
pankso@6 299 list)
pankso@6 300 # List all installed packages or a specific category.
pankso@6 301 #
pankso@6 302 if [ "$2" = "category" ]; then
pankso@6 303 echo -e "\033[1m\nPackages categories :\033[0m $CATEGORIES\n"
pankso@6 304 exit 0
pankso@6 305 fi
pankso@6 306 # Check for an asked category.
pankso@6 307 if [ -n "$2" ]; then
pankso@6 308 ASKED_CATEGORY=$2
pankso@6 309 echo ""
pankso@6 310 echo -e "\033[1mInstalled packages of category :\033[0m $ASKED_CATEGORY"
pankso@6 311 echo "================================================================================"
pankso@6 312 for pkg in $INSTALLED/*
pankso@6 313 do
pankso@6 314 . $pkg/receipt
pankso@6 315 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
pankso@6 316 echo -n "$PACKAGE"
pankso@6 317 echo -e "\033[24G $VERSION"
pankso@6 318 packages=$(($packages+1))
pankso@6 319 fi
pankso@6 320 done
pankso@6 321 echo "================================================================================"
pankso@6 322 echo -e "$packages packages installed of category $ASKED_CATEGORY."
pankso@6 323 echo ""
pankso@6 324 else
pankso@6 325 # By default list all packages and version.
pankso@6 326 echo ""
pankso@6 327 echo -e "\033[1mList of all installed packages\033[0m"
pankso@6 328 echo "================================================================================"
pankso@6 329 for pkg in $INSTALLED/*
pankso@6 330 do
pankso@6 331 . $pkg/receipt
pankso@6 332 echo -n "$PACKAGE"
pankso@6 333 echo -en "\033[24G $VERSION"
pankso@6 334 echo -e "\033[42G $CATEGORY"
pankso@6 335 packages=$(($packages+1))
pankso@6 336 done
pankso@6 337 echo "================================================================================"
pankso@6 338 echo "$packages packages installed."
pankso@6 339 echo ""
pankso@6 340 fi
pankso@6 341 ;;
pankso@6 342 list-mirror)
pankso@6 343 # List all available packages on the mirror. Option --diff display
pankso@6 344 # last mirrored packages diff (see recharge).
pankso@6 345 check_for_packages_list
pankso@6 346 if [ "$2" = "--diff" ]; then
pankso@6 347 if [ -f "$LOCALSTATE/packages.diff" ]; then
pankso@6 348 echo ""
pankso@6 349 echo -e "\033[1mMirrored packages diff\033[0m"
pankso@6 350 echo "================================================================================"
pankso@6 351 cat $LOCALSTATE/packages.diff
pankso@6 352 echo "================================================================================"
pankso@6 353 pkgs=`cat $LOCALSTATE/packages.diff | wc -l`
pankso@6 354 echo "$pkgs new packages listed on the mirror."
pankso@6 355 echo ""
pankso@6 356 else
pankso@6 357 echo -e "\nUnable to list anything, no packages.diff found."
pankso@6 358 echo -e "Recharge your current list to creat a first diff.\n"
pankso@6 359 fi
pankso@6 360 else
pankso@6 361 echo ""
pankso@6 362 echo -e "\033[1mList of available packages on the mirror\033[0m"
pankso@6 363 echo "================================================================================"
pankso@6 364 cat $LOCALSTATE/packages.list
pankso@6 365 echo "================================================================================"
pankso@6 366 pkgs=`cat $LOCALSTATE/packages.list | wc -l`
pankso@6 367 echo "$pkgs packages in the last recharged list."
pankso@6 368 echo ""
pankso@6 369 fi
pankso@6 370 ;;
pankso@6 371 list-files)
pankso@6 372 # List files installed with the package.
pankso@6 373 #
pankso@6 374 check_for_package_on_cmdline
pankso@6 375 check_for_receipt
pankso@6 376 echo ""
pankso@6 377 echo -e "\033[1mInstalled files with :\033[0m $PACKAGE"
pankso@6 378 echo "================================================================================"
pankso@6 379 cat $INSTALLED/$PACKAGE/files.list | sort
pankso@6 380 echo "================================================================================"
pankso@6 381 files=`cat $INSTALLED/$PACKAGE/files.list | wc -l`
pankso@6 382 echo "$files files installed with $PACKAGE."
pankso@6 383 echo ""
pankso@6 384 ;;
pankso@6 385 info)
pankso@6 386 # Informations about package.
pankso@6 387 #
pankso@6 388 check_for_package_on_cmdline
pankso@6 389 check_for_receipt
pankso@6 390 . $INSTALLED/$PACKAGE/receipt
pankso@6 391 echo ""
pankso@6 392 echo -e "\033[1mTazpkg informations\033[0m
pankso@6 393 ================================================================================
pankso@6 394 Package : $PACKAGE
pankso@6 395 Version : $VERSION
pankso@6 396 Category : $CATEGORY
pankso@6 397 Short desc : $SHORT_DESC
pankso@6 398 Maintainer : $MAINTAINER"
pankso@6 399 if [ ! "$DEPENDS" = "" ]; then
pankso@6 400 echo -e "Depends : $DEPENDS"
pankso@6 401 fi
pankso@6 402 if [ ! "$WANTED" = "" ]; then
pankso@6 403 echo -e "Wanted src : $WANTED"
pankso@6 404 fi
pankso@6 405 if [ ! "$WEB_SITE" = "" ]; then
pankso@6 406 echo -e "Web site : $WEB_SITE"
pankso@6 407 fi
pankso@6 408 echo "================================================================================"
pankso@6 409 echo ""
pankso@6 410 ;;
pankso@6 411 desc)
pankso@6 412 # Display package description.txt if available.
pankso@6 413 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
pankso@6 414 echo ""
pankso@6 415 echo -e "\033[1mDescription of :\033[0m $PACKAGE"
pankso@6 416 echo "================================================================================"
pankso@6 417 cat $INSTALLED/$PACKAGE/description.txt
pankso@6 418 echo "================================================================================"
pankso@6 419 echo ""
pankso@6 420 else
pankso@6 421 echo -e "\nSorry, no description available for this package.\n"
pankso@6 422 fi
pankso@6 423 ;;
pankso@6 424 search)
pankso@6 425 # Search for a package by pattern or name.
pankso@6 426 #
pankso@6 427 if [ -z "$2" ]; then
pankso@6 428 echo -e "\nPlease specify a pattern or a package name to search."
pankso@6 429 echo -e "Example : 'tazpkg search paint'. \n"
pankso@6 430 exit 0
pankso@6 431 fi
pankso@6 432 echo ""
pankso@6 433 echo -e "\033[1mSearch result for :\033[0m $2"
pankso@6 434 echo ""
pankso@6 435 echo "Installed packages"
pankso@6 436 echo "================================================================================"
pankso@6 437 list=`ls -1 $INSTALLED | grep $2`
pankso@6 438 for pkg in $list
pankso@6 439 do
pankso@6 440 . $INSTALLED/$pkg/receipt
pankso@6 441 echo -n "$PACKAGE "
pankso@6 442 echo -en "\033[24G $VERSION"
pankso@6 443 echo -e "\033[42G $CATEGORY"
pankso@6 444 packages=$(($packages+1))
pankso@6 445 done
pankso@6 446 if [ "$packages" = "" ]; then
pankso@6 447 echo "0 installed packages found for : $2"
pankso@6 448 echo ""
pankso@6 449 else
pankso@6 450 echo "================================================================================"
pankso@6 451 echo "$packages installed packages found for : $2"
pankso@6 452 echo ""
pankso@6 453 fi
pankso@6 454 echo "Available packages"
pankso@6 455 echo "================================================================================"
pankso@6 456 if [ -f "$LOCALSTATE/packages.list" ]; then
pankso@6 457 cat $LOCALSTATE/packages.list | grep $2
pankso@6 458 else
pankso@6 459 echo -e "
pankso@6 460 No 'packages.list' found to check for mirrored packages. For more results,
pankso@6 461 please run once 'tazpkg recharge' as root before searching.\n"
pankso@6 462 fi
pankso@6 463 echo "================================================================================"
pankso@6 464 packages=`cat $LOCALSTATE/packages.list | grep $2 | wc -l`
pankso@6 465 echo "$packages avalaible on the mirror."
pankso@6 466 echo ""
pankso@6 467 ;;
pankso@6 468 install)
pankso@6 469 # Install .tazpkg packages.
pankso@6 470 #
pankso@6 471 check_root
pankso@6 472 check_for_package_on_cmdline
pankso@6 473 check_for_package_file
pankso@6 474 # Check if forced install.
pankso@6 475 if [ "$3" = "--forced" ]; then
pankso@6 476 continue
pankso@6 477 else
pankso@6 478 check_for_installed_package
pankso@6 479 fi
pankso@6 480 install_package
pankso@6 481 # Resolv package deps.
pankso@6 482 check_for_deps
pankso@6 483 if [ ! "$MISSING_PACKAGE" = "" ]; then
pankso@6 484 install_deps
pankso@6 485 fi
pankso@6 486 ;;
pankso@6 487 install-list)
pankso@6 488 # Install a set of packages from a list.
pankso@6 489 #
pankso@6 490 check_root
pankso@6 491 if [ -z "$2" ]; then
pankso@6 492 echo -e "
pankso@6 493 Please change directory (cd) to the packages repository, and specify the
pankso@6 494 list of packages to install. Example : tazpkg install-list packages.list\n"
pankso@6 495 exit 0
pankso@6 496 fi
pankso@6 497 # Check if the packages list exist.
pankso@6 498 if [ ! -f "$2" ]; then
pankso@6 499 echo "Unable to find : $2"
pankso@6 500 exit 0
pankso@6 501 else
pankso@6 502 LIST=`cat $2`
pankso@6 503 fi
pankso@6 504 # Install all packages.
pankso@6 505 for pkg in $LIST
pankso@6 506 do
pankso@6 507 if [ "$3" = "--forced" ]; then
pankso@6 508 tazpkg install $pkg --forced
pankso@6 509 else
pankso@6 510 tazpkg install $pkg
pankso@6 511 fi
pankso@6 512 done
pankso@6 513 ;;
pankso@6 514 remove)
pankso@6 515 # Remove packages.
pankso@6 516 #
pankso@6 517 check_root
pankso@6 518 check_for_package_on_cmdline
pankso@6 519 if [ ! -d "$INSTALLED/$PACKAGE" ]; then
pankso@6 520 echo -e "\n$PACKAGE is not installed.\n"
pankso@6 521 exit 0
pankso@6 522 else
pankso@6 523 . $INSTALLED/$PACKAGE/receipt
pankso@6 524 fi
pankso@6 525 echo ""
pankso@6 526 echo "Remove $PACKAGE ($VERSION) ?"
pankso@6 527 echo -n "Please confirm uninstallation (y/N) : "; read anser
pankso@6 528 if [ "$anser" = "y" ]; then
pankso@6 529 echo ""
pankso@6 530 echo -e "\033[1mRemoving :\033[0m $PACKAGE"
pankso@6 531 echo "================================================================================"
pankso@6 532 echo -n "Removing all files installed..."
pankso@6 533 for file in `cat $INSTALLED/$PACKAGE/files.list`
pankso@6 534 do
pankso@6 535 rm -f $file
pankso@6 536 done
pankso@6 537 status
pankso@6 538 # Remove package receipt.
pankso@6 539 echo -n "Removing package receipt..."
pankso@6 540 rm -rf $INSTALLED/$PACKAGE
pankso@6 541 status
pankso@6 542 else
pankso@6 543 echo ""
pankso@6 544 echo "Uninstallation of $PACKAGE cancelled."
pankso@6 545 fi
pankso@6 546 echo ""
pankso@6 547 ;;
pankso@6 548 extract)
pankso@6 549 # Extract .tazpkg cpio archive into a directory.
pankso@6 550 #
pankso@6 551 check_for_package_on_cmdline
pankso@6 552 check_for_package_file
pankso@6 553 echo ""
pankso@6 554 echo -e "\033[1mExtracting :\033[0m $PACKAGE"
pankso@6 555 echo "================================================================================"
pankso@6 556 # If any directory destination is found on the cmdline
pankso@6 557 # we creat one in the current dir using the package name.
pankso@6 558 if [ -n "$TARGET_DIR" ]; then
pankso@6 559 DESTDIR=$TARGET_DIR/$PACKAGE
pankso@6 560 else
pankso@6 561 DESTDIR=$PACKAGE
pankso@6 562 fi
pankso@6 563 mkdir -p $DESTDIR
pankso@6 564 echo -n "Copying original package..."
pankso@9 565 cp $PACKAGE_FILE $DESTDIR
pankso@6 566 status
pankso@6 567 cd $DESTDIR
pankso@6 568 extract_package
pankso@6 569 echo "================================================================================"
pankso@6 570 echo "$PACKAGE is extracted to : $DESTDIR"
pankso@6 571 echo ""
pankso@6 572 ;;
pankso@6 573 pack)
pankso@6 574 # Creat SliTaz package archive using cpio and gzip.
pankso@6 575 #
pankso@6 576 check_for_package_on_cmdline
pankso@6 577 cd $PACKAGE
pankso@6 578 if [ ! -f "receipt" ]; then
pankso@6 579 echo "Receipt is missing. Please read the documentation."
pankso@6 580 exit 0
pankso@6 581 else
pankso@6 582 echo ""
pankso@6 583 echo -e "\033[1mPacking :\033[0m $PACKAGE"
pankso@6 584 echo "================================================================================"
pankso@6 585 # Creat files.list with redirecting find outpout.
pankso@6 586 echo -n "Creating the list of files..." && cd fs
pankso@6 587 find . -type f -print > ../files.list
pankso@6 588 find . -type l -print >> ../files.list
pankso@6 589 cd .. && sed -i s/'^.'/''/ files.list
pankso@6 590 status
pankso@6 591 # Build cpio archives.
pankso@6 592 echo -n "Compressing the fs... "
pankso@6 593 find fs -print | cpio -o -H newc > fs.cpio
pankso@6 594 gzip fs.cpio && rm -rf fs
pankso@6 595 echo -n "Creating full cpio archive... "
pankso@6 596 find . -print | cpio -o -H newc > ../$PACKAGE.tazpkg
pankso@6 597 echo -n "Restoring original package tree... "
pankso@6 598 gzip -d fs.cpio.gz && cpio -id < fs.cpio
pankso@6 599 rm fs.cpio && cd ..
pankso@6 600 echo "================================================================================"
pankso@6 601 echo "Package $PACKAGE compressed succefully."
pankso@6 602 echo "Size : `du -sh $PACKAGE.tazpkg`"
pankso@6 603 echo ""
pankso@6 604 fi
pankso@6 605 ;;
pankso@6 606 recharge)
pankso@6 607 # Recharge packages.list from a mirror.
pankso@6 608 #
pankso@6 609 check_root
pankso@6 610 cd $LOCALSTATE
pankso@6 611 echo ""
pankso@6 612 if [ -f "$LOCALSTATE/packages.list" ]; then
pankso@6 613 echo -n "Creating backup of the last packages list..."
pankso@6 614 mv -f packages.list packages.list.bak
pankso@6 615 status
pankso@6 616 fi
pankso@6 617 wget `cat $MIRROR`/packages.list
pankso@6 618 if [ -f "$LOCALSTATE/packages.list.bak" ]; then
pankso@6 619 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
pankso@6 620 sed -i s/+// packages.diff
pankso@6 621 echo ""
pankso@6 622 echo -e "\033[1mMirrored packages diff\033[0m"
pankso@6 623 echo "================================================================================"
pankso@6 624 cat packages.diff
pankso@6 625 if [ ! "`cat packages.diff | wc -l`" = 0 ]; then
pankso@6 626 echo "================================================================================"
pankso@6 627 echo "`cat packages.diff | wc -l` new packages on the mirror."
pankso@6 628 echo ""
pankso@6 629 else
pankso@6 630 echo "`cat packages.diff | wc -l` new packages on the mirror."
pankso@6 631 echo ""
pankso@6 632 fi
pankso@6 633 else
pankso@6 634 echo -e "
pankso@6 635 ================================================================================
pankso@6 636 Last packages.list is ready to use. Note that next time you recharge the list,
pankso@6 637 a list of differencies will be displayed to show new and upgradable packages.\n"
pankso@6 638 fi
pankso@6 639 ;;
pankso@6 640 upgrade)
pankso@6 641 # Upgrade all installed packages with the new version from the mirror.
pankso@6 642 #
pankso@6 643 check_root
pankso@6 644 check_for_packages_list
pankso@6 645 cd $LOCALSTATE
pankso@10 646 # Touch the blocked pkgs list to avoid errors and remove any old
pankso@10 647 # upgrade list.
pankso@10 648 touch blocked-packages.list
pankso@6 649 rm -f upradable-packages.list
pankso@6 650 echo ""
pankso@6 651 echo -e "\033[1mAvalaible upgrade\033[0m"
pankso@6 652 echo "================================================================================"
pankso@6 653 for pkg in $INSTALLED/*
pankso@6 654 do
pankso@6 655 . $pkg/receipt
pankso@10 656 # Skip specified pkgs listed in $LOCALSTATE/blocked-packages.list
pankso@10 657 if grep -q "^$PACKAGE" $BLOCKED; then
pankso@10 658 blocked=$(($blocked+1))
pankso@10 659 else
pankso@10 660 # Check if the installed package is in the current list (other
pankso@10 661 # mirror or local).
pankso@10 662 if grep -q "^$PACKAGE-[0-9]" packages.list; then
pankso@10 663 # Set new kg and version for futur comparaison
pankso@10 664 NEW_PACKAGE=`grep ^$PACKAGE-[0-9] packages.list`
pankso@10 665 NEW_VERSION=`echo $NEW_PACKAGE | sed s/$PACKAGE-/''/`
pankso@10 666 # Compare version. Upgrade are only avalaible for official
pankso@10 667 # packages, so we control de mirror and it should be ok if
pankso@10 668 # we just check for egality.
pankso@10 669 if [ "$VERSION" != "$NEW_VERSION" ]; then
pankso@10 670 # Version seems different. Check for major, minor or
pankso@10 671 # revision
pankso@10 672 PKG_MAJOR=`echo $VERSION | cut -f1 -d"."`
pankso@10 673 NEW_MAJOR=`echo $NEW_VERSION | cut -f1 -d"."`
pankso@10 674 PKG_MINOR=`echo $VERSION | cut -f2 -d"."`
pankso@10 675 NEW_MINOR=`echo $NEW_VERSION | cut -f2 -d"."`
pankso@10 676 # Major
pankso@10 677 if [ "$NEW_MAJOR" -gt "$PKG_MAJOR" ]; then
pankso@10 678 RELEASE=major
pankso@10 679 fi
pankso@10 680 if [ "$NEW_MAJOR" -lt "$PKG_MAJOR" ]; then
pankso@10 681 RELEASE=$WARNING
pankso@10 682 FIXE=yes
pankso@10 683 fi
pankso@10 684 # Minor
pankso@10 685 if [ "$NEW_MINOR" -gt "$PKG_MINOR" ]; then
pankso@10 686 RELEASE=minor
pankso@10 687 fi
pankso@10 688 if [ "$NEW_MINOR" -lt "$PKG_MINOR" ]; then
pankso@10 689 RELEASE=$WARNING
pankso@10 690 FIXE=yes
pankso@10 691 fi
pankso@10 692 # Default to revision.
pankso@10 693 if [ -z $RELEASE ]; then
pankso@10 694 RELEASE=revision
pankso@10 695 fi
pankso@10 696 echo -n "$PACKAGE"
pankso@10 697 echo -en "\033[24G $VERSION"
pankso@10 698 echo -en "\033[38G --->"
pankso@10 699 echo -en "\033[48G $NEW_VERSION"
pankso@10 700 echo -en "\033[60G $CATEGORY"
pankso@10 701 echo -e "\033[72G $RELEASE"
pankso@10 702 up=$(($up+1))
pankso@10 703 echo "$PACKAGE" >> upradable-packages.list
pankso@10 704 fi
pankso@10 705 packages=$(($packages+1))
pankso@6 706 fi
pankso@10 707 fi
pankso@6 708 done
pankso@6 709 rm -f $tmpfile
pankso@6 710 if [ ! "$up" = "" ]; then
pankso@6 711 echo "================================================================================"
pankso@10 712 echo "$packages installed and listed packages to consider, $up to upgrade, $blocked blocked."
pankso@6 713 echo ""
pankso@6 714 else
pankso@10 715 echo "$packages installed and listed packages to consider, 0 to upgrade, $blocked blocked."
pankso@6 716 echo ""
pankso@6 717 exit 0
pankso@6 718 fi
pankso@10 719 # What to do if major or minor version is smaller.
pankso@10 720 if [ "$FIXE" == "yes" ]; then
pankso@10 721 echo -e "$WARNING ---> Installed package seems more recent than the mirrored one."
pankso@10 722 echo "You can block packages using the command : 'tazpkg block package'"
pankso@10 723 echo "Or upgrade package at you own risks."
pankso@10 724 echo ""
pankso@10 725 fi
pankso@6 726 # Ask for upgrade, it can be done an other time.
pankso@6 727 echo -n "Upgrade now (y/N) ? "; read anser
pankso@6 728 if [ ! "$anser" = "y" ]; then
pankso@6 729 echo -e "\nExiting. No package upgraded.\n"
pankso@6 730 exit 0
pankso@6 731 fi
pankso@6 732 # If anser is yes (y). Install all new version.
pankso@6 733 for pkg in `cat upradable-packages.list`
pankso@6 734 do
pankso@6 735 tazpkg get-install $pkg --forced
pankso@6 736 done
pankso@6 737 ;;
pankso@10 738 block)
pankso@10 739 # Add a pkg name to the list of blocked packages.
pankso@10 740 #
pankso@10 741 check_root
pankso@10 742 check_for_package_on_cmdline
pankso@10 743 echo ""
pankso@10 744 if grep -q "^$PACKAGE" $BLOCKED; then
pankso@10 745 echo "$PACKAGE is already in the blocked packages list."
pankso@10 746 echo ""
pankso@10 747 exit 0
pankso@10 748 else
pankso@10 749 echo -n "Add $PACKAGE to : $BLOCKED..."
pankso@10 750 echo $PACKAGE >> $BLOCKED
pankso@10 751 status
pankso@10 752 fi
pankso@10 753 echo ""
pankso@10 754 ;;
pankso@10 755 unblock)
pankso@10 756 # Remove a pkg name to the list of blocked packages.
pankso@10 757 #
pankso@10 758 check_root
pankso@10 759 check_for_package_on_cmdline
pankso@10 760 echo ""
pankso@10 761 if grep -q "^$PACKAGE" $BLOCKED; then
pankso@10 762 echo -n "Removing $PACKAGE from : $BLOCKED..."
pankso@10 763 sed -i s/$PACKAGE/''/ $BLOCKED
pankso@10 764 sed -i '/^$/d' $BLOCKED
pankso@10 765 status
pankso@10 766 else
pankso@10 767 echo "$PACKAGE is not in the blocked packages list."
pankso@10 768 echo ""
pankso@10 769 exit 0
pankso@10 770 fi
pankso@10 771 echo ""
pankso@10 772 ;;
pankso@6 773 get)
pankso@6 774 # Downlowd a package with wget.
pankso@6 775 #
pankso@6 776 check_for_package_on_cmdline
pankso@6 777 check_for_packages_list
pankso@6 778 check_for_package_in_list
pankso@6 779 echo ""
pankso@6 780 wget `cat $MIRROR`/$PACKAGE.tazpkg
pankso@6 781 echo ""
pankso@6 782 ;;
pankso@6 783 get-install)
pankso@6 784 # Download and install a package.
pankso@6 785 #
pankso@6 786 check_root
pankso@6 787 check_for_package_on_cmdline
pankso@6 788 check_for_packages_list
pankso@6 789 check_for_package_in_list
pankso@6 790 # Check if forced install.
pankso@6 791 if [ "$3" = "--forced" ]; then
pankso@6 792 rm -f $CACHE_DIR/$PACKAGE.tazpkg
pankso@6 793 else
pankso@6 794 check_for_installed_package
pankso@6 795 fi
pankso@6 796 cd $CACHE_DIR
pankso@6 797 if [ -f "$PACKAGE.tazpkg" ]; then
pankso@6 798 echo "$PACKAGE already in the cache : $CACHE_DIR"
pankso@6 799 else
pankso@6 800 echo ""
pankso@6 801 wget `cat $MIRROR`/$PACKAGE.tazpkg
pankso@6 802 fi
pankso@6 803 install_package
pankso@6 804 check_for_deps
pankso@6 805 if [ ! "$MISSING_PACKAGE" = "" ]; then
pankso@6 806 install_deps
pankso@6 807 fi
pankso@6 808 ;;
pankso@6 809 clean-cache)
pankso@6 810 # Remove all downloaded packages.
pankso@6 811 #
pankso@6 812 check_root
pankso@6 813 files=`ls -1 $CACHE_DIR | wc -l`
pankso@6 814 echo ""
pankso@6 815 echo -e "\033[1mCleaning cache directory :\033[0m $CACHE_DIR"
pankso@6 816 echo "================================================================================"
pankso@6 817 rm -rf $CACHE_DIR/*
pankso@6 818 echo "$files file(s) removed from cache."
pankso@6 819 echo ""
pankso@6 820 ;;
pankso@6 821 setup-mirror)
pankso@6 822 # Change mirror URL.
pankso@6 823 #
pankso@6 824 check_root
pankso@6 825 # Backup old list.
pankso@6 826 if [ -f "$LOCALSTATE/mirror" ]; then
pankso@6 827 mv -f $LOCALSTATE/mirror $LOCALSTATE/mirror.bak
pankso@6 828 fi
pankso@6 829 echo ""
pankso@6 830 echo -e "\033[1mCurrent mirror\033[0m"
pankso@6 831 echo "================================================================================"
pankso@6 832 echo " `cat $MIRROR`"
pankso@6 833 echo "
pankso@6 834 Please enter URL of the new mirror (http or ftp). You must specify the complet
pankso@6 835 address to the directory of the packages and packages.list file."
pankso@6 836 echo ""
pankso@6 837 echo -n "New mirror URL : "
pankso@6 838 read NEW_MIRROR_URL
pankso@6 839 if [ "$NEW_MIRROR_URL" = "" ]; then
pankso@6 840 echo "Nothing as been change."
pankso@6 841 else
pankso@6 842 echo "Setting mirror to : $NEW_MIRROR_URL"
pankso@6 843 echo "$NEW_MIRROR_URL" > $LOCALSTATE/mirror
pankso@6 844 fi
pankso@6 845 echo ""
pankso@6 846 ;;
pankso@6 847 usage|*)
pankso@6 848 # Print a short help or give usage for an unknow or empty command.
pankso@6 849 #
pankso@6 850 usage
pankso@6 851 ;;
pankso@6 852 esac
pankso@6 853
pankso@6 854 exit 0