#!/bin/bash # # common.sh: common functions for simplepkg # feedback: rhatto at riseup.net | gpl # # Uses some functions from pkgtools, which license is: # # Copyright 1999 Patrick Volkerding, Moorhead, Minnesota, USA # Copyright 2001, 2002, 2003 Slackware Linux, Inc., Concord, California, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # BASE_CONF="/etc/simplepkg" CONF="$BASE_CONF/simplepkg.conf" JAIL_LIST="$BASE_CONF/jailist" # pkgtool stuff function package_name { STRING=`basename $1 .tgz` # Check for old style package name with one segment: if [ "`echo $STRING | cut -f 1 -d -`" = "`echo $STRING | cut -f 2 -d -`" ]; then echo $STRING else # has more than one dash delimited segment # Count number of segments: INDEX=1 while [ ! "`echo $STRING | cut -f $INDEX -d -`" = "" ]; do INDEX=`expr $INDEX + 1` done INDEX=`expr $INDEX - 1` # don't include the null value # If we don't have four segments, return the old-style (or out of spec) package name: if [ "$INDEX" = "2" -o "$INDEX" = "3" ]; then echo $STRING else # we have four or more segments, so we'll consider this a new-style name: NAME=`expr $INDEX - 3` NAME="`echo $STRING | cut -f 1-$NAME -d -`" echo $NAME fi fi } function package_version { # get VERSION from a package name local file pack version file="`basename $1`" pack="`package_name $1`" version="`echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 1`" echo $version } function package_arch { # get ARCH from a package name local file pack arch file="`basename $1`" pack="`package_name $1`" arch="`echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 2`" echo $arch } function package_build { # get BUILD from a package name local file pack build file="`basename $1`" pack="`package_name $1`" build="`echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 3`" echo $build } function install_packages { if [[ "$SIMPLARET_CLEAN" == "1" ]]; then ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge elif [[ ! -z "$SIMPLARET_PURGE_WEEKS" ]] && [[ "$SIMPLARET_PURGE_WEEKS" != "0" ]]; then ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge -w $SIMPLARET_PURGE_WEEKS fi for pack in `cat $TEMPLATE | grep -v -e "^#" | cut -d : -f 1`; do package_downloaded="0" if [ "$SIMPLARET" == "simplaret" ]; then extrafolder="$ARCH/$VERSION/" else unset extrafolder fi for file in `find $STORAGE/$extrafolder -name $pack*tgz`; do if [[ "`package_name $file`" == "$pack" ]]; then package_downloaded="1" package_file="$file" break fi done if [[ "$package_downloaded" != "1" ]]; then ARCH=$ARCH VERSION=$VERSION $SIMPLARET --get $pack -a for file in `find $STORAGE/$extrafolder -name $pack*tgz`; do if [[ "`package_name $file`" == "$pack" ]]; then package_file="$file" break fi done fi if [ -z "$package_file" ]; then echo error: could not install package $pack else installed_packs="`ls /$JAIL_ROOT/$server/var/log/packages/$pack* 2> /dev/null`" if [ ! -z "$installed_packs" ]; then for installed in $installed_packs; do if [[ "$pack" == "`package_name $installed.tgz`" ]]; then echo "package $pack already installed in $JAIL_ROOT/$server ($installed)" package_installed="1" break fi if [[ "$package_installed" != "1" ]]; then installpkg -root /$JAIL_ROOT/$server $package_file unset package_installed if [ ! -z "$SIMPLARET_DELETE_DURING" ] && [ "$SIMPLARET_DELETE_DURING" != "0" ]; then SILENT=1 ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge fi break fi done else installpkg -root /$JAIL_ROOT/$server $package_file if [ ! -z "$SIMPLARET_DELETE_DURING" ] && [ "$SIMPLARET_DELETE_DURING" != "0" ]; then SILENT=1 ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge fi fi fi unset package_file done if [[ "$SIMPLARET_DELETE_DOWN" == "1" ]]; then ARCH=$ARCH VERSION=$VERSION $SIMPLARET --purge fi } function remove_packages { for pack in `cat $TEMPLATE | grep -v -e "^#" | cut -d : -f 1`; do ROOT=/$JAIL_ROOT/$server removepkg $pack done } function eval_config { if [ -f "$CONF" ]; then source $CONF else echo $1 error: config file $CONFIG not found exit 1 fi if [ -z "$SIMPLARET" ]; then SIMPLARET="simplaret" fi if [ -z "$STORAGE" ]; then if [ -d "/var/$SIMPLARET" ]; then STORAGE="/var/$SIMPLARET" else echo error: please adjust value for STORAGE at $CONF exit 1 fi fi if [ ! -z "$ROOT" ]; then JAIL_ROOT="$ROOT" elif [ -z "$JAIL_ROOT" ]; then echo error: please adjust value for JAIL_ROOT at $CONF exit 1 fi if [ -z "$ARCH" ]; then ARCH="$DEFAULT_ARCH" fi if [ -z "$VERSION" ]; then VERSION="$DEFAULT_VERSION" fi if which $SIMPLARET &> /dev/null; then if [[ "$SIMPLARET_UPDATE" == "1" ]]; then if [[ "$2" == "-u" ]]; then echo "updating package database..." ARCH=$ARCH VERSION=$VERSION $SIMPLARET --update fi fi else echo "$SIMPLARET not found, please install it before run $0" fi if [ -z "$PATCHES_DIR" ]; then echo error: please adjust a value for PATCHES_DIR at $CONF fi CONSIDER_ALL_PACKAGES_AS_PATCHES="`echo $CONSIDER_ALL_PACKAGES_AS_PATCHES | tr '[:lower:]' '[:upper:]'`" if [ "$CONSIDER_ALL_PACKAGES_AS_PATCHES" != "YES" ] && \ [ "$CONSIDER_ALL_PACKAGES_AS_PATCHES" != "1" ]; then # Enabling this option, jail-upgrade will look at your # standard repositories for new packages; if it find a package # with different version of your current installed package and # also this package isnt in the packages folder, then the new # package is apllied; if in doubt, just say no or leave blank. CONSIDER_ALL_PACKAGES_AS_PATCHES="0" fi }