#!/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 .tgz`" pack="`package_name $1`" build="`echo $file | sed -e "s/^$pack-//" | cut -d "-" -f 3`" echo $build } function install_packages { # check if is time to clean the local repository 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 # now tries to install each package listed in the template for pack in `cat $TEMPLATE | grep -v -e "^#" | cut -d : -f 1`; do package_downloaded="0" if [ "$SIMPLARET" == "simplaret" ]; then extrafolder="$ARCH/$VERSION/" extraoptions="" else unset extrafolder extraoptions="-a" fi # first search the package in the patches folder for file in `find $PATCHES_DIR/$extrafolder -name $pack*tgz`; do if [[ "`package_name $file`" == "$pack" ]]; then package_downloaded="1" package_file="$file" break fi done # then search the package in the standard packages folder if [[ "$package_downloaded" != "1" ]]; then 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 fi # if the package wasnt found, try to donwload it if [[ "$package_downloaded" != "1" ]]; then ARCH=$ARCH VERSION=$VERSION $SIMPLARET --get $pack $extraoptions # it can be stored at the patches folder for file in `find $PATCHES_DIR/$extrafolder -name $pack*tgz`; do if [[ "`package_name $file`" == "$pack" ]]; then package_file="$file" break fi done # or it can be stored at the standard packages folder if [ -z "$package_file" ]; then for file in `find $STORAGE/$extrafolder -name $pack*tgz`; do if [[ "`package_name $file`" == "$pack" ]]; then package_file="$file" break fi done fi fi # now tries to install the package, if available 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 # purge packages, if needed 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_parameter { # usage: eval $1 parameter from $CONF # return the evaluated parameter if available or $2 $3 ... $n if grep -qe "^$1=" $CONF; then grep -e "^$1=" $CONF | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | awk '{ print $1 }' else shift echo $* fi } function eval_boolean_parameter { # get a boolean parameter from the configuration local value # get the value value="`eval_parameter $1 $2`" # force case insensitiveness value="`echo $value | tr '[:upper:]' '[:lower:]'`" # convert it to wheter 0 or 1 if [ "$value" == "yes" ] || [ "$value" == "1" ]; then echo 1 else echo 0 fi } function eval_config { # simplepkg config file evaluation # usage: eval_config [-u] if [ -f "$CONF" ]; then SIMPLARET="`eval_parameter SIMPLARET simplaret`" STORAGE="`eval_parameter STORAGE /var/simplaret/packages`" JAIL_ROOT="`eval_parameter JAIL_ROOT /vservers`" PATCHES_DIR="`eval_parameter PATCHES_DIR /var/simplaret/patches`" ROOT_PRIORITY="`eval_parameter ROOT_PRIORITY patches slackware extra testing pasture`" SIMPLARET_PURGE_WEEKS="`eval_parameter SIMPLARET_PURGE_WEEKS 0`" SIMPLARET_CLEAN="`eval_boolean_parameter SIMPLARET_CLEAN 1`" SIMPLARET_DELETE_DOWN="`eval_boolean_parameter SIMPLARET_DELETE_DOWN 1`" SIMPLARET_UPDATE="`eval_boolean_parameter SIMPLARET_UPDATE 0`" SIMPLARET_DELETE_DURING="`eval_boolean_parameter SIMPLARET_DELETE_DURING 0`" SIMPLARET_PURGE_PATCHES="`eval_boolean_parameter SIMPLARET_PURGE_PATCHES 0`" CONSIDER_ALL_PACKAGES_AS_PATCHES="`eval_boolean_parameter CONSIDER_ALL_PACKAGES_AS_PATCHES 0`" DOWNLOAD_EVEN_APPLIED_PATCHES="`eval_boolean_parameter DOWNLOAD_EVEN_APPLIED_PATCHES 0`" PASSIVE_FTP="`eval_boolean_parameter PASSIVE_FTP 0`" WARNING="`eval_boolean_parameter WARNING 0`" DEFAULT_ARCH="`eval_parameter DEFAULT_ARCH $(default_arch)`" DEFAULT_VERSION="`eval_parameter DEFAULT_VERSION $(default_version)`" # 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="`eval_boolean_parameter CONSIDER_ALL_PACKAGES_AS_PATCHES 0`" # now we place "patches" on the top of ROOT_PRIORITY ROOT_PRIORITY="patches `echo $ROOT_PRIORITY | sed -e 's/patches//'`" else echo $1 error: config file $CONFIG not found exit 1 fi if [ ! -d "$STORAGE" ]; then mkdir -p $STORAGE fi if [ ! -d "$PATCHES_DIR" ]; then mkdir -p $PATCHES_DIR 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 } function default_version { # get version from /etc/slackware-version cat $1/etc/slackware-version | awk '{ print $2 }' | sed -e 's/.0$//' } function default_arch { # get arch from /etc/slackware-version local arch arch="`cat $1/etc/slackware-version | awk '{ print $3 }' | sed -e 's/(//' -e 's/)//'`" if [ -z "$arch" ]; then echo i386 else echo $arch fi }