#!/bin/bash # # jail-upgrade v0.5: upgrade packages in jails # feedback: rhatto@riseup.net | GPL # # Jail-upgrade is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or any later version. # # Jail-upgrade is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., 59 Temple # Place - Suite 330, Boston, MA 02111-1307, USA # COMMON="/usr/libexec/simplepkg/common.sh" function jail_upgrade { local patches_dir storage_dir echo upgrading jail $1... if [ "$SIMPLARET" == "simplaret" ]; then VERSION="`default_version`" ARCH="`default_arch`" if [ -z "$ARCH" ]; then ARCH="i386" fi patches_dir="$PATCHES_DIR/$ARCH/$VERSION" storage_dir="$STORAGE/$ARCH/$VERSION" elif [ "$SIMPLARET" == "swaret" ]; then patches_dir="$PACTHES_DIR" storage_dir="$STORAGE" fi if [ -d "$patches_dir" ]; then for file in `find $patches_dir -name *tgz`; do pack=`package_name $file` if check_for_upgrade $file $1; then ROOT=$1 upgradepkg $file upgraded $pack fi done else if [ "$SIMPLARET" == "simplaret" ]; then echo error: cant upgrade for arch $ARCH and version $VERSION on $1: no such patch dir $patches_dir elif [ "$SIMPLARET" == "swaret" ]; then echo error: cant upgrade on $1: no such patch dir $patches_dir fi fi # optionally, search all packages in the repositories and apply a patch if: # - the package is installed in the jail # - it hasn't already applied in the jail # - has different version or build from the current installed package if [ "$CONSIDER_ALL_PACKAGES_AS_PATCHES" == "YES" ] || [ "$CONSIDER_ALL_PACKAGES_AS_PATCHES" == "1" ]; then if [ -d "$storage_dir" ]; then for file in `find $storage_dir -name *tgz`; do pack=`package_name $file` if check_for_upgrade $file $1; then # the package is installed if ! echo $UPGRADED | grep -q $pack; then # it hasnt already applied ROOT=$1 upgradepkg $file upgraded $pack fi fi done fi fi # clear the upgraded package list unset UPGRADED } function check_for_upgrade { # check if package $1 is installed in the $2 root environment # and should be upgraded local pack found file found="0" file="$1" pack="`package_name $file`" if [ -d "$2/var/log/packages/" ] && [ ! -z "$file" ]; then for installed in `ls $2/var/log/packages/$pack* 2> /dev/null`; do if [[ "$pack" == "`package_name $installed.tgz`" ]]; then if [[ "`basename $installed`" != "`basename $file .tgz`" ]]; then found="1" fi fi done fi # if the package is installed, return true, otherwise false if [ "$found" == "0" ]; then return 1 elif [ "$found" == "1" ]; then return 0 fi } function upgraded { UPGRADED="$UPGRADED $1 " } if [ -f "$COMMON" ]; then source $COMMON eval_config `basename $0` else echo "error: file $COMMON not found, check your `basename $0` installation" exit 1 fi if [ ! -z "$PATCHES" ]; then if [ -d "$PATCHES" ]; then PATCHES_DIR="$PATCHES" else echo "error: folder $PATCHES does not exist" fi fi if [ "$SIMPLARET" != "simplaret" ] || [ "$SIMPLARET" == "swaret" ]; then echo invalid value $SIMPLARET for SIMPLARET, please check your $CONF exit 1 fi UPGRADED="" if [ -z "$1" ]; then if [ -d "/var/log/packages" ]; then jail_upgrade / fi for vserver in `ls $JAIL_ROOT`; do if [ -d "$JAIL_ROOT/$vserver/var/log/packages" ]; then jail_upgrade $JAIL_ROOT/$vserver fi done elif [ -d "$JAIL_ROOT/$1" ]; then if [ -d "$JAIL_ROOT/$1/var/log/packages" ]; then jail_upgrade $JAIL_ROOT/$1 else echo error: jail $JAIL_ROOT/$1 dont looks like a slackware system fi elif [ -f "$1" ]; then basename="`basename $1 tgz`" if [ "`basename $1 | sed -e "s/^$basename//"`" == "tgz" ]; then arch="`package_arch $1`" # TODO # - atualizar nas jaulas de mesma arquitetura true fi else echo "error: jail $0 does not exist" exit 1 fi