#!/bin/sh # # Copyright (C) 2016-2018 Etersoft # Copyright (C) 2016-2018 Vitaly Lipatov <lav@etersoft.ru> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # alt_base_dist_url="http://ftp.basealt.ru/pub/distributions" __use_url_install() { # force download if wildcard is used echo "$pkg_urls" | grep -q "[?*]" && return 1 # install of remote files has a side affect # (more fresh package from a repo can be installed instead of the file) #case $DISTRNAME in # "ALTLinux") # # do not support https yet # echo "$pkg_urls" | grep -q "https://" && return 1 # pkg_names="$pkg_names $pkg_urls" # return 0 # ;; #esac case $PMTYPE in #apt-rpm) # pkg_names="$pkg_names $pkg_urls" # ;; #deepsolver-rpm) # pkg_names="$pkg_names $pkg_urls" # ;; #urpm-rpm) # pkg_names="$pkg_names $pkg_urls" # ;; pacman) pkg_names="$pkg_names $pkg_urls" ;; yum-rpm|dnf-rpm) pkg_names="$pkg_names $pkg_urls" ;; #zypper-rpm) # pkg_names="$pkg_names $pkg_urls" # ;; *) return 1 ;; esac return 0 } # for download before install / checking __download_pkg_urls() { local url [ -z "$pkg_urls" ] && return for url in $pkg_urls ; do local tmppkg=$(mktemp -d) || fatal "failed mktemp -d" showcmd cd $tmppkg cd $tmppkg || fatal if docmd eget --latest "$url" ; then local i for i in $(basename $url) ; do [ -s "$tmppkg/$i" ] || continue pkg_files="$pkg_files $tmppkg/$i" to_remove_pkg_files="$to_remove_pkg_files $tmppkg/$i" done else warning "Failed to download $url, ignoring" fi cd - >/dev/null done # reconstruct pkg_filenames=$(strip_spaces "$pkg_files $pkg_names") } # NOTE: call __clean_downloaded_pkg_files after __handle_pkg_urls_to_install() { #[ -n "$pkg_urls" ] || return # TODO: do it correctly to_remove_pkg_files= # FIXME: check type of pkg_urls separately? if [ "$(get_package_type "$pkg_urls")" != $PKGFORMAT ] || ! __use_url_install ; then # use workaround with eget: download and put in pkg_files __download_pkg_urls fi pkg_urls= } __handle_pkg_urls_to_checking() { #[ -n "$pkg_urls" ] || return # TODO: do it correctly to_remove_pkg_files= # use workaround with eget: download and put in pkg_files __download_pkg_urls pkg_urls= } #__clean_downloaded_pkg_files() #{ # [ -z "$to_remove_pkg_files" ] && return # rm -fv $to_remove_pkg_files #} __epm_get_altpkg_url() { info "TODO: https://packages.altlinux.org/api/branches" load_helper epm-site local arch=$(paoapi packages/$1 | get_pao_var arch) # FIXME: arch can be list [ "$arch" = "noarch" ] || arch=$(arch) # HACK: filename can be list local filename=$(paoapi packages/$1 | get_pao_var filename | grep $arch) [ -n "$filename" ] || fatal "Can't get filename" # fixme: get from /branches local dv=$DISTRNAME/$DISTRVERSION/branch [ "$DISTRVERSION" = "Sisyphus" ] && dv=$DISTRNAME/$DISTRVERSION echo "$alt_base_dist_url/$dv/$arch/RPMS.classic/$filename" } __epm_print_url_alt() { local url="$1" echo "$url" echo "$url" | sed -e "s|$alt_base_dist_url/$DISTRNAME|http://mirror.yandex.ru/altlinux|g" echo "$url" | sed -e "s|$alt_base_dist_url/$DISTRNAME|http://download.etersoft.ru/pub/ALTLinux|g" } __epm_print_url_alt_check() { local pkg=$1 shift local tm=$(mktemp) assure_exists curl load_helper epm-site quiet=1 local buildtime=$(paoapi packages/$pkg | get_pao_var buildtime) echo echo "Latest release: $(paoapi packages/$pkg | get_pao_var sourcepackage) $buildtime" __epm_print_url_alt "$1" | while read url ; do a='' curl -s --head $url >$tm || { echo "$url: missed" ; continue ; } local http=$(cat $tm | grep "^HTTP" | sed -e "s|\r||g") local lastdate=$(cat $tm | grep "^Last-Modified:" | sed -e "s|\r||g") local size=$(cat $tm | grep "^Content-Length:" | sed -e "s|^Content-Length: ||g" | sed -e "s|\r||g") echo "$url ($http $lastdate) Size: $size" done rm -f $tm } __epm_download_alt() { local pkg if [ "$1" = "--check" ] ; then local checkflag="$1" shift fi for pkg in "$@" ; do local url=$(__epm_get_altpkg_url $pkg) [ -n "$url" ] || warning "Can't get URL for $pkg" if [ -n "$checkflag" ] ; then __epm_print_url_alt_check "$pkg" "$url" else docmd eget $url || return fi done } epm_download() { local CMD case $DISTRNAME-$PMTYPE in ALTLinux-apt-rpm|ALTServer-apt-rpm) __epm_download_alt $* return ;; esac case $PMTYPE in apt-dpkg) docmd apt-get download $* ;; dnf-rpm) sudocmd dnf download $* ;; aptcyg) sudocmd apt-cyg download $* ;; packagekit) docmd pkcon download $* ;; yum-rpm) # TODO: check yum install --downloadonly --downloaddir=/tmp <package-name> assure_exists yumdownloader yum-utils sudocmd yumdownloader $* ;; dnf-rpm) sudocmd dnf download $* ;; urpm-rpm) sudocmd urpmi --no-install $URPMOPTIONS $@ ;; tce) sudocmd tce-load -w $* ;; opkg) docmd opkg $* ;; homebrew) docmd brew fetch $* ;; *) fatal "Have no suitable command for $PMTYPE" ;; esac }