diff options
Diffstat (limited to 'trunk/src/simplaret')
-rwxr-xr-x | trunk/src/simplaret | 997 |
1 files changed, 997 insertions, 0 deletions
diff --git a/trunk/src/simplaret b/trunk/src/simplaret new file mode 100755 index 0000000..8735074 --- /dev/null +++ b/trunk/src/simplaret @@ -0,0 +1,997 @@ +#!/bin/bash +# +# simplaret v0.2: simplepkg's retrieval tool +# feedback: rhatto at riseup.net | gpl +# +# Simplaret 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. +# +# Simplaret 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 +# + +BASENAME="`basename $0`" +REPOS_CONF="/etc/simplepkg/repos.conf" +COMMON="/usr/libexec/simplepkg/common.sh" + +if [ -f "$COMMON" ]; then + source $COMMON +else + echo "error: file $COMMON found, check your $BASENAME installation" + exit 1 +fi + +function simplaret_usage { + + echo "usage: [ARCH=otherarch] [VERSION=otherversion] $BASENAME <OPTION> package-name" + echo -e "\t OPTIONS: --update, --upgrade, --search, --get, --get-patches, --purge, --remove" + exit 1 + +} + +function simplaret_get_index { + + for file in `simplaret_metafiles`; do + simplaret_download $1 $file $2 --no-verbose + done + +} + +function simplaret_backup_index { + + for file in `simplaret_metafiles`; do + if [ -f "$1/$file" ]; then + mv $1/$file $1/$file.old + fi + done + +} + +function simplaret_check_index { + + for file in `simplaret_metafiles`; do + if [ ! -f "$1/$file" ] && [ -f "$1/$file" ]; then + echo restoring old $file to $1... + mv $1/$file.old $1/$file + else + rm -f $1/$file.old + fi + done + +} + +function simplaret_download { + + # download a file from a repo to a folder + # usage: simplaret <repository_url> <package> <destination-folder> [--no-verbose] + + local protocol file + local wget_timeout wget_passive_ftp wget_verbose + local curl_timeout curl_passive_ftp curl_verbose + local ncftpget_timeout ncftpget_passive_ftp + + protocol="`echo $1 | cut -d : -f 1`" + file="`basename $2`" + + if [ ! -d "$3" ]; then + mkdir -p $3 + fi + + if [ ! -z "$CONNECT_TIMEOUT" ] || [ "$CONNECT_TIMEOUT" != "0" ]; then + wget_timeout="--timeout $CONNECT_TIMEOUT" + ncftpget_timeout="-t $CONNECT_TIMEOUT" + curl_timeout="--connect-timeout $CONNECT_TIMEOUT" + fi + + if [ "$4" == "--no-verbose" ]; then + wget_verbose="--no-verbose" + curl_verbose="-#" + echo "" + fi + + if [ "$protocol" == "http" ]; then + + echo Getting $1/$file: + if [ "$HTTP_TOOL" == "wget" ]; then + wget $wget_timeout $wget_verbose $1/$2 -O $3/$file + elif [ "$HTTP_TOOL" == "curl" ]; then + curl $curl_timeout $curl_verbose $1/$2 > $3/$file + else + echo $BASENAME: error: invalid value for config variable HTTP_TOOL: $HTTP_TOOL + echo $BASENAME: please check your config file $CONF + exit 1 + fi + + elif [ "$protocol" == "ftp" ]; then + echo Getting $1/$file: + + if [ "$PASSIVE_FTP" == "1" ]; then + wget_passive_ftp="--passive-ftp" + ncftpget_passive_ftp="-F" + curl_passive_ftp="--ftp-pasv" + fi + + if [ "$FTP_TOOL" == "ncftpget" ]; then + ncftpget -c $ncftpget_timeout $ncftpget_passive_ftp $1/$2 > $3/$file + elif [ "$FTP_TOOL" == "wget" ]; then + wget $wget_timeout $wget_passive_ftp $wget_verbose $1/$2 -O $3/$file + elif [ "$FTP_TOOL" == "curl" ]; then + curl $curl_timeout $curl_passive_ftp $curl_verbose $1/$2 > $3/$file + else + echo $BASENAME: error: invalid value for config variable FTP_TOOL: $FTP_TOOL + echo $BASENAME: please check your config file $CONF + exit 1 + fi + + elif [ "$protocol" == "file" ]; then + + url="`echo $1 | sed -e 's/file:\/\///'`" + if [ -f "$3/$file" ]; then + rm -f $3/$file + fi + echo -n "Copying $url/$2..." + if [ -f "$url/$2" ]; then + cp $url/$2 $3/$file 2> /dev/null + fi + if [ -f "$3/$file" ]; then + echo " done." + else + echo " failed." + fi + + else + + echo $BASENAME error: invalid protocol $protocol + + fi + +} + +function simplaret_repository { + + # return a repository definition from $REPOS_CONF file + # usage: simplaret_repository [root|repos|noarch|patches] + + local definition + + if [ -z "$1" ]; then + definition="ROOT" + else + definition="`echo $1 | tr '[:lower:]' '[:upper:]'`" + fi + + if [ "$definition" == "REPOS" ] || [ "$definition" == "PATCHES" ]; then + definition="$definition-$ARCH-$VERSION" + elif [ "$definition" == "ROOT" ]; then + definition="$definition-$ARCH" + fi + + grep -e "^$definition=" $REPOS_CONF | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | cut -d "#" -f 1 + +} + +function simplaret_repository_name { + + # return a repository name according the value of $repository + + if [ -z "$repository" ]; then + false + elif echo $repository | grep -qe %; then + repository_name="`echo $repository | cut -d % -f 1`" + if [ -z "$repository_name" ]; then + echo $BASENAME: you should set a name for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + else + echo $BASENAME: you should set a name for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + +} + +function simplaret_repository_url { + + # return a repository url according the value of $repository + + if echo $repository | grep -qe %; then + repository_url="`echo $repository | cut -d % -f 2`" + if [ -z "$repository_url" ]; then + echo $BASENAME: you should set a url for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + else + echo $BASENAME: you should set a url for the repository $repository + echo $BASENAME: please correct your $REPOS_CONF + exit 1 + fi + + if [ "$repos_type" == "root" ]; then + simplaret_distro_folder + repository_url="$repository_url/$DISTRO_FOLDER/$EXTRA_FOLDER" + fi + +} + +function simplaret_set_storage_folder { + + storage="$STORAGE/$ARCH/$VERSION/$repos_type" + if [ "$repos_type" == "noarch" ]; then + storage="$STORAGE/noarch" + elif [ "$repos_type" == "patches" ]; then + storage="$PATCHES_DIR/$ARCH/$VERSION" + fi + +} + +function simplaret_update { + + local storage + + echo Updating package information for arch $ARCH and version $VERSION... + + for repos_type in patches root repos noarch; do + + simplaret_set_storage_folder + + for repository in `simplaret_repository $repos_type`; do + + simplaret_repository_name + simplaret_repository_url + + if [ ! -d "$storage/$repository_name" ]; then + mkdir -p $storage/$repository_name + else + simplaret_backup_index $storage/$repository_name + fi + + simplaret_get_index $repository_url $storage/$repository_name + simplaret_check_index $storage/$repository_name + + unset repository_name repository_url repository_protocol + + done + done + +} + +function simplaret_find_package { + + # grep packages in a repository's file list + # usage: simplaret_find_package <package-name|-all> <repository-folder> + + if [ "$1" == "-all" ]; then + grep -e ".tgz$" $2/`simplaret_filelist` | awk '{ print $8 }' + else + grep $1 $2/`simplaret_filelist` | awk '{ print $8 }' | grep -e ".tgz$" + fi + +} + +function simplaret_show_package { + + # print a package result + # usage: simplaret_show_package <package-file-name> [--basename-only|--filename-only|--formatted] + + if [ "$2" == "--basename-only" ]; then + echo `basename $1` + elif [ "$2" == "--filename-only" ]; then + echo $1 + elif [ "$2" == "--formatted" ]; then + echo $1,$repos_type,$repository + else + if echo $1 | grep -q "/patches/"; then + patch="(patch)" + fi + if [ "$repos_type" == "noarch" ]; then + echo $name repository $repository_name: `basename $1` $patch + else + echo $name repository $repository_name, arch: $ARCH, version: $VERSION: `basename $1` $patch + fi + fi + unset patch + +} + +function simplaret_filelist { + + if [ "$repos_type" == "patches" ]; then + echo FILE_LIST + else + echo FILELIST.TXT + fi + +} + +function simplaret_metafiles { + + echo `simplaret_filelist` CHECKSUMS.md5 + +} + +function simplaret_search { + + # search packages + # usage: simplaret_search [package-name] [-display_mode] + # display_mode can be any accepted by simplaret_show_package + + local priority message pattern mode + + if [ ! -z "$1" ] && ! echo $1 | grep -q -e "^-"; then + pattern="$1" + mode="$2" + else + pattern="-all" + mode="$1" + fi + + for repos_type in patches root repos noarch; do + + name="`echo $repos_type | tr '[:lower:]' '[:upper:]'`" + simplaret_set_storage_folder + + for repository in `simplaret_repository $repos_type`; do + + simplaret_repository_name + + if [ ! -f "$storage/$repository_name/`simplaret_filelist`" ]; then + if [ "$WARNING" != "0" ] || [ ! -z "$SILENT" ]; then + if [ "$repos_type" == "noarch" ]; then + message="" + else + message="on arch $ARCH version $VERSION" + fi + echo warning: no file list for $repository_name repository $repository_name $message + echo please do a simplaret --update + fi + else + + if [ "$repos_type" == "root" ]; then + # root repositories has ROOT_PRIORITY + for priority in $ROOT_PRIORITY; do + for file in `simplaret_find_package $pattern $storage/$repository_name | grep "/$priority/"`; do + simplaret_show_package $file $mode + done + done + else + for file in `simplaret_find_package $pattern $storage/$repository_name`; do + simplaret_show_package $file $mode + done + fi + + fi + + done + done + +} + +function simplaret_purge { + + # purge simplaret package cache + # usage: simplaret_purge [-w N] + + local mtime mtime_message which and_patches + + if [ "$2" == "-w" ] && [ ! -z "$3" ]; then + mtime="-mtime +`echo "$3*7" | bc -l`" + mtime_message="older than $3 weeks" + elif [ "$SIMPLARET_PURGE_WEEKS" != "0" ]; then + mtime="-mtime +`echo "$SIMPLARET_PURGE_WEEKS*7" | bc -l`" + mtime_message="older than $SIMPLARET_PURGE_WEEKS weeks" + else + mtime="" + mtime_mesage="" + fi + + which="root repos noarch" + and_patches="" + + if [ "$SIMPLARET_PURGE_PATCHES" == "1" ]; then + which="patches $which" + and_patches="including patches" + fi + + if [ -z "$SILENT" ]; then + echo "$BASENAME: purging all packages $mtime_message for:" + echo -e "\t- arch $ARCH and version $VERSION $and_patches" + echo -e "\t- noarch folder" + fi + + for repos_type in $which; do + + simplaret_set_storage_folder + + for file in `find $storage/ $mtime 2> /dev/null`; do + for extension in tgz asc meta txt slack-required; do + if echo $file | grep -qe ".$extension$"; then + rm $file + fi + done + done + + done + + if [ -z "$SILENT" ]; then + echo $BASENAME: done purging simplaret cache + echo $BASENAME: please run $BASENAME --update to retrieve new package listings on this arch and version + fi + +} + +function simplaret_search_and_delete { + + local file candidate place basename + + for file in `find $2/ -name $1*tgz 2> /dev/null`; do + candidate="`basename $file`" + if [ "`package_name $candidate`" == "$1" ]; then + # check if has the same version and build number, otherwise erase the old one + for result in `simplaret_search $(package_name $candidate) --basename-only`; do + if [ "`package_name $candidate`" == "`package_name $result`" ]; then + if [ "`package_version $candidate`" == "`package_version $result`" ] && \ + [ "`package_build $candidate`" == "`package_build $result`" ]; then + LAST_DOWNLOADED_PACKAGE="$file" + if [ "$3" != "--silent" ]; then + echo Package $candidate already downloaded + # echo Package $candidate stored at `dirname $file` + else + true + # echo $file + fi + return 1 + else + place="`dirname $file`" + basename="`basename $file tgz`" + rm -f $file + rm -f $place/$candidate.slack-required + rm -f $file.asc $place/$basename.meta $place/$basename.txt + break + fi + fi + done + fi + done + +} + +function simplaret_get { + + # get a package + # usage: simplaret_get <package-name> [--silent] + + local silent + + # prevent user to stay in $storage + cd + + # first search for an already downloaded package + for repos_type in patches root repos noarch; do + + simplaret_set_storage_folder + simplaret_search_and_delete $1 $storage $2 + + if [ "$?" == "1" ]; then + return 0 + fi + + done + + # then search for the package in the repositories + for result in `simplaret_search $1 --formatted`; do + + file="`echo $result | cut -d , -f 1`" + repos_type="`echo $result | cut -d , -f 2`" + repository="`echo $result | cut -d , -f 3`" + + simplaret_set_storage_folder + simplaret_repository_name + + candidate="`basename $file`" + if [ "`package_name $candidate`" == "$1" ]; then + simplaret_repository_url + + # if repos_type == root, the package is a patch and + # STORE_ROOT_PATCHES_ON_PATCHES_DIR config parameter is enabled + # save it on $PATCHES_DIR/root-$repository_name, so all patches + # are placed in the same tree + if [ "$repos_type" == "root" ] && \ + [ "$STORE_ROOT_PATCHES_ON_PATCHES_DIR" == "1" ] && echo $file | grep -q "patches"; then + folder="$PATCHES_DIR/$ARCH/$VERSION/root-$repository_name" + else + folder="$storage/$repository_name" + fi + + # download the package + simplaret_download $repository_url $file $folder + + if [ -f "$folder/$candidate.asc" ]; then + rm $folder/$candidate.asc + fi + + if [ -f "$folder/$1.slack-required" ]; then + rm $folder/$1.slack-required + fi + + # download the signature, if exist + if simplaret_check_url $repository_url/$file.asc; then + simplaret_download $repository_url $file.asc $folder + fi + + # download slack-required, if exist + if simplaret_check_url $repository_url/`dirname $file`/$1.slack-required; then + simplaret_download $repository_url `dirname $file`/$1.slack-required $folder + fi + + if [ ! -f "$folder/$candidate" ]; then + LAST_DOWNLOADED_PACKAGE="0" + if [ "$2" != "--silent" ]; then + echo Error downloading $candidate from $repos_type repository $repository_url, please check your settings + fi + return 1 + else + LAST_DOWNLOADED_PACKAGE="$folder/$candidate" + if [ "$2" != "--silent" ]; then + silent="" + echo Package $candidate stored at $folder + else + # echo $folder/$candidate + silent="--silent" + fi + if [ -f "$folder/$candidate.asc" ] || [ "$SIGNATURE_CHECKING" == "1" ]; then + gpg --verify $folder/$candidate.asc $folder/$candidate + fi + simplaret_checksum $storage/$repository_name/CHECKSUMS.md5 $folder/$candidate $silent + return $? + fi + + fi + + done + +} + +function simplaret_search_and_process_patch { + + local package_version package_build installed_version + local installed_build repos_type get is_patch package_match + + # get the repository type + repos_type="`echo $sugested | cut -d , -f 2`" + + # get just the file name + sugested="`echo $sugested | cut -d , -f 1`" + + if echo $sugested | grep -q "patches"; then + is_patch="yes" + else + is_patch="no" + fi + + # now split the file name into pieces + package_version="`package_version $sugested`" + package_build="`package_build $sugested`" + sugested="`package_name $sugested`" + + # check if the patch was already downloaded + if echo "$DOWNLOADED_PATCHES" | grep -q " $ARCH:$VERSION:$sugested "; then + if [ "$IS_UPGRADE" != "1" ]; then + echo Package $sugested already downloaded + # echo "Jail $root needs package $sugested (already downloaded, skipping)" + return + fi + fi + + # search if its installed in the jail + installed_packs="`ls /$root/var/log/packages/$sugested* 2> /dev/null`" + if [ ! -z "$installed_packs" ]; then + + for installed in $installed_packs; do + if [[ "$sugested" == "`package_name $installed.tgz`" ]]; then + package_installed="1" + installed_version="`package_version $installed.tgz`" + installed_build="`package_build $installed.tgz`" + break + fi + done + + get="no" + + # if the package is installed, download the patch + if [ "$package_installed" == "1" ]; then + if [ "$repos_type" == "patches" ]; then + + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + elif [ "$DOWNLOAD_EVEN_APPLIED_PATCHES" == "1" ]; then + get="yes" + fi + + elif [ "$repos_type" == "root" ] && [ "$is_patch" == "yes" ]; then + + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + elif [ "$DOWNLOAD_EVEN_APPLIED_PATCHES" == "1" ]; then + get="yes" + fi + + else + # here, we're dealing with repositories other than ROOT and REPOS, + # so we need to check if either version or build number are different, + # otherwise all installed packages would be downloaded + if [ "$package_version" != "$installed_version" ] || [ "$package_build" != "$installed_build" ]; then + get="yes" + package_match="no" + fi + fi + fi + + # finally, get the package + if [ "$get" == "yes" ]; then + if [ "$IS_UPGRADE" == "1" ]; then + if [ "$package_match" == "no" ]; then + simplaret_install $sugested + else + simplaret_get $sugested + fi + else + simplaret_get $sugested + fi + if [ "$?" == "0" ]; then + DOWNLOADED_PATCHES="$DOWNLOADED_PATCHES $ARCH:$VERSION:$sugested " # the ending space is important + fi + fi + + fi + + unset package_installed get + +} + +function simplaret_get_jail_patches { + + # get patches from a jail + # usage: simplaret_get_jail_patches <jail-folder> + + local oldarch oldversion + + if [ ! -z "$1" ]; then + root="$1" + else + root="/" + fi + + # save current arch and version + oldarch="$ARCH" + oldversion="$VERSION" + + ARCH="`default_arch $root`" + VERSION="`default_version $root`" + + # in case there's something wrong with the jail, abort + if [ -z "$VERSION" ] || [ -z "$ARCH" ]; then + return + fi + + # we need to do that for each arch/version pairs, but just once for each pair + if ! echo "$DISTRO_UPDATED" | grep -q " $ARCH:$VERSION "; then + simplaret_update + DISTRO_UPDATED="$DISTRO_UPDATED $ARCH:$VERSION " # the ending space is important + echo "" + fi + + echo Fetching patches for arch $ARCH and version $VERSION for jail $root + + # list all available patches from PATCHES and ROOT repositories + for sugested in `simplaret_search --formatted | grep patches | grep -v ",repos," | grep -v ",noarch,"`; do + simplaret_search_and_process_patch + done + + # grab patches from every other places + if [ "$CONSIDER_ALL_PACKAGES_AS_PATCHES" == "1" ]; then + + for sugested in `simplaret_search --formatted | grep patches | grep ",repos," | grep ",noarch,"`; do + simplaret_search_and_process_patch + done + + for sugested in `simplaret_search --formatted | grep -v patches`; do + simplaret_search_and_process_patch + done + + fi + + # restore arch and version + ARCH="$oldarch" + VERSION="$oldversion" + +} + +function simplaret_get_patches { + + local jailpath oldroot + + if [ "$1" == "--upgrade" ]; then + IS_UPGRADE="1" + fi + + oldroot="$ROOT" + + # first get patches from the root system + simplaret_get_jail_patches + + # then get the needed patches for each installed jail + if [ -s "$JAIL_LIST" ]; then + for jailpath in `cat $JAIL_LIST`; do + if [ -d "$jailpath/var/log/packages" ]; then + ROOT="$jailpath" + simplaret_get_jail_patches $jailpath + fi + done + fi + + ROOT="$oldroot" + +} + +function simplaret_checksum { + + # simplaret_checksum <md5file> <file-name> [--silent] + + if [ ! -f "$1" ] || [ ! -f "$2" ]; then + if [ "$3" != "--silent" ]; then + echo Checksum error: file not found + fi + return 1 + fi + + pack="`basename $2`" + checksum="`grep -e "$pack\$" $1 | awk '{ print $1 }'`" + + if [ -z "$checksum" ]; then + echo file $2 not in checksum $1 + return 1 + elif [ "$checksum" != "`md5sum $2 | awk '{ print $1 }'`" ]; then + if [ "$3" != "--silent" ]; then + echo Checksum mismatch for file `basename $file` + fi + return 1 + else + if [ "$3" != "--silent" ]; then + echo Checksum ok for file `basename $file` + fi + return 0 + fi + +} + +function simplaret_install { + + # download and install a package + # usage: simplaret_install <package-name> [--skip-checks] + + local package root jail_arch jail_version slack_required dep dependency tmp + + root="/$ROOT" + mkdir -p $root/var/log/setup/tmp + + if [ "`echo $1 | sed -e 's/\(..\).*/\1/g'`" == "--" ]; then + echo $BASENAME: install: syntax error: expected package name + return 1 + fi + + # now we check if ARCH and VERSION from the + # repository are the same of the jail + if [ "$2" != "--skip-checks" ]; then + jail_arch="`default_arch $root`" + jail_version="`default_version $root`" + if [ "$ARCH" != "$jail_arch" ]; then + echo "$BASENAME: requested repository arch ($ARCH) doesn't match jail arch ($jail_arch)" + echo "$BASENAME: please use \"$BASENAME --get $1 --skip-checks\" to ignore this warning and install anyway" + return + elif [ "$VERSION" != "$jail_version" ]; then + echo "$BASENAME: requested repository version ($VERSION) doesn't match jail version ($jail_version)" + echo "$BASENAME: please use \"$BASENAME --get $1 --skip-checks\" to ignore this warning and install anyway" + return 1 + fi + fi + + # package="`simplaret_get $1 --silent`" + simplaret_get $1 --silent + package="$LAST_DOWNLOADED_PACKAGE" + + if [ "$package" != "0" ] && [ ! -z "$package" ]; then + slack_required="`dirname $package`/$1.slack-required" + if [ -f "$package" ]; then + + if [ -f "$slack_required" ] && [ "$DEPENDENCY_CHECKING" == "1" ]; then + # this routine checks for dependencies in package's slack-required + # procedure adapted from createpkg script + ( cat $slack_required | while read dep; do + if [ ! -z "$dep" ]; then + dependency="`echo $dep | awk '{ print $1 }'`" + simplaret_solve_dep $1 $dependency $root + fi + true + done ) + fi + + ROOT=$root upgradepkg --install-new $package + LAST_DOWNLOADED_PACKAGE="0" + + else + echo "error: could not install package $1: file not found" + LAST_DOWNLOADED_PACKAGE="0" + return 1 + fi + else + echo "error: could not install package $1" + LAST_DOWNLOADED_PACKAGE="0" + return 1 + fi + +} + +function simplaret_distro_folder { + + # first we point to the correct arch + simplaret_set_arch + + # then we set the distro folder + if [ "$ARCH" == "i386" ]; then + DISTRO="slackware" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "x86_64" ]; then + # EXTRA_FOLDER="tree" + DISTRO="slamd64" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "s390" ]; then + DISTRO="slack390" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "x86_uclibc" ]; then + DISTRO="ucslack" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "arm" ]; then + DISTRO="armedslack" + DISTRO_FOLDER="$DISTRO-$VERSION" + elif [ "$ARCH" == "powerpc" ]; then + DISTRO="slackintosh" + DISTRO_FOLDER="$VERSION" + elif [ "$ARCH" == "sparc" ]; then + DISTRO="splack" + DISTRO_FOLDER="tree-$VERSION" + else + DISTRO="$ARCH" + DISTRO_FOLDER="$DISTRO-$VERSION" + fi + +} + +function simplaret_set_arch { + + # set correct value for ARCH + + local repos_type new_arch + + # any arch defined in ARCH_i386 that hasn't an entry + # on $REPOS_CONF will be mapped to i386 + + ARCH_i386=" nocona prescott pentium4m pentium4 pentium-m pentium3m pentium3 " + ARCH_i386="$ARCH_i386 pentium2 i686 pentium-pro i586 pentium-mmx pentium i486 " + ARCH_i386="$ARCH_i386 athlon-mp athlon-xp athlon4 athlon-tbird athlon k6 k6-2 " + ARCH_i386="$ARCH_i386 k6-3 winchip-c6 winchip2 c3 c3-2 i386 " + + # any arch defined in ARCH_x86_64 that hasn't an entry + # on $REPOS_CONF will be mapped to x86_64 + + ARCH_x86_64=" k8 opteron athlon64 athlon-fx x86_64 " + + for repos_type in patches root repos noarch; do + if [ -z "`simplaret_repository $repos_type`" ]; then + # there's no repository definition for that arch + if echo "$ARCH_i386" | grep -q " $ARCH "; then + new_arch="i386" + elif echo "$ARCH_x86_64" | grep -q " $ARCH "; then + new_arch="x86_64" + else + echo "$BASENAME: error: no repository definition for arch $ARCH" + echo "$BASENAME: please check your $CONF and $REPOS_CONF config files" + exit 1 + fi + else + return + fi + done + + echo "$BASENAME: changing arch from $ARCH to $new_arch" + + ARCH="$new_arch" + +} + +function simplaret_check_url { + + # check if a given url exist, use just with small files + # usage: simplaret_check_url <url> + + if [ -z "$1" ]; then + return 1 + fi + + if [ ! -z "$CONNECT_TIMEOUT" ] || [ "$CONNECT_TIMEOUT" != "0" ]; then + curl_timeout="--connect-timeout $CONNECT_TIMEOUT" + fi + + if [ "`curl $curl_timeout -I $1 2> /dev/null | head -n 1 | awk '{ print $2 }'`" == "200" ]; then + # server gave a 200 response, so the url exist + return 0 + else + # the url is missing + return 1 + fi + +} + +function simplaret_solve_dep { + + # solve dependency for a package + # this function was adapted from createpkg script + # usage: simplaret_solve_dep <package-name> <package-depencency-name> [root-folder] + + local installed check exit_code + + local package="$1" + local pack="$2" + local root="/$3" + + installed=`eval "ls $root/var/log/packages/ | egrep '^$pack-[^-]+-[^-]+-[^-]+$'"` + check=$? + + if [ -z "$installed" ]; then + if [ $check -ne 0 ]; then + echo "$BASENAME: processing $1 dependency $pack" + # simplaret_install $pack + SIMPLARET_CHILD=$SIMPLARET_CHILD ROOT=$root ARCH=$ARCH VERSION=$VERSION \ + simplaret --install $pack + fi + fi + +} + +if [ -z "$1" ]; then + simplaret_usage + exit 1 +else + eval_config $BASENAME +fi + +# This is used to show how many children process we have +if [ -z "$SIMPLARET_CHILD" ]; then + SIMPLARET_CHILD="1" +else + let SIMPLARET_CHILD++ +fi + +BASENAME="`basename $0`[$SIMPLARET_CHILD]" + +case $1 in + "--update" | "update") simplaret_update ;; + "--search" | "search") shift ; simplaret_search $* ;; + "--get" | "get") shift ; simplaret_get $* ;; + "--get-patches" | "get-patches") simplaret_get_patches ;; + "--purge" | "purge") shift ; simplaret_purge $* ;; + "--install" | "install") shift ; simplaret_install $* ;; + "--upgrade" | "upgrade") simplaret_get_patches --upgrade ;; + "--remove" | "remove") removepkg $2 ;; + *) simplaret_usage ;; +esac + |