epm-download 7.98 KB
Newer Older
1 2
#!/bin/sh
#
Vitaly Lipatov's avatar
Vitaly Lipatov committed
3 4
# Copyright (C) 2016-2018  Etersoft
# Copyright (C) 2016-2018  Vitaly Lipatov <lav@etersoft.ru>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#
# 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/>.
#

20 21
alt_base_dist_url="http://ftp.basealt.ru/pub/distributions"

22 23
__use_url_install()
{
24 25
    # force download if wildcard is used
    echo "$pkg_urls" | grep -q "[?*]" && return 1
26

27 28 29 30 31 32 33 34 35 36
    # 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
Vitaly Lipatov's avatar
Vitaly Lipatov committed
37

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
    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
62 63 64 65 66
}

# for download before install / checking
__download_pkg_urls()
{
67 68 69
    local url
    [ -z "$pkg_urls" ] && return
    for url in $pkg_urls ; do
70
        local tmppkg="$(mktemp -d)" || fatal "failed mktemp -d"
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
        docmd chmod $verbose a+rX $tmppkg
        showcmd cd $tmppkg
        cd $tmppkg || fatal
        local latest='--latest'
        # hack: download all if mask is *.something
        basename "$url" | grep -q "^\*\." && latest=''
        # download packages
        if docmd eget $latest "$url" ; then
            local i
            for i in *.* ; do
                [ -s "$tmppkg/$i" ] || continue
                chmod $verbose a+r "$tmppkg/$i"
                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")
93 94 95 96 97
}

# NOTE: call __clean_downloaded_pkg_files after
__handle_pkg_urls_to_install()
{
98
    #[ -n "$pkg_urls" ] || return
99

100 101 102 103 104 105 106
    # 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
107

108
    pkg_urls=
109 110
}

111 112
__handle_pkg_urls_to_checking()
{
113
    #[ -n "$pkg_urls" ] || return
114

115 116 117 118 119
    # TODO: do it correctly
    to_remove_pkg_files=
    
    # use workaround with eget: download and put in pkg_files
    __download_pkg_urls
120

121
    pkg_urls=
122 123
}

124 125
#__clean_downloaded_pkg_files()
#{
126 127
#    [ -z "$to_remove_pkg_files" ] && return
#    rm -fv $to_remove_pkg_files
128 129
#}

130
# obsoleted
131 132
__epm_get_altpkg_url()
{
133 134 135 136 137 138 139 140 141 142 143 144
    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"
145 146
}

147
# obsoleted
148 149
__epm_print_url_alt()
{
150 151 152 153
    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"
154 155 156 157
}

__epm_print_url_alt_check()
{
158 159
    local pkg=$1
    shift
160
    local tm="$(mktemp)"
161 162 163 164 165 166 167
    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
168
        eget --get-response $url >$tm || { echo "$url: missed" ; continue ; }
169 170 171 172 173 174
        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
175 176 177 178
}

__epm_download_alt()
{
179 180 181 182 183
    local pkg
    if [ "$1" = "--check" ] ; then
        local checkflag="$1"
        shift
    fi
184

185
    load_helper epm-sh-altlinux
186

187 188 189 190 191 192
    # TODO: enable if install --download-only will works
    if tasknumber "$@" >/dev/null ; then
        load_helper epm-addrepo
        load_helper epm-reposave
        load_helper epm-removerepo
        load_helper epm-Install
193

194 195 196 197
        local installlist="$(get_task_packages $*)"
        # hack: drop -devel packages to avoid package provided by multiple packages
        installlist="$(estrlist reg_exclude ".*-devel .*-devel-static .*-checkinstall .*-debuginfo" "$installlist")"
        [ -n "$verbose" ] && info "Packages from task(s): $installlist"
198

199 200 201 202 203 204 205
        try_change_alt_repo
        epm_addrepo "$@"
        epm update
        [ -n "$verbose" ] && epm repo list
        docmd epm download $print_url $installlist
        epm_removerepo "$@"
        end_change_alt_repo
206

207 208
        return
    fi
209 210

    # old systems ignore reinstall ?
211 212 213 214 215 216 217 218
    for pkg in "$@" ; do
        for i in $(sudocmd apt-get install -y --print-uris --reinstall "$pkg" | cut -f1 -d " " | grep ".rpm'$" | sed -e "s|^'||" -e "s|'$||") ; do
            echo "$(basename "$i")" | grep -q "^$pkg" || continue
            [ -n "$print_url" ] && echo "$i" && continue
            eget "$i"
        done
    done
    return
219

220 221 222 223 224 225 226 227 228 229
    # old code:
    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
230
}
231

232 233
epm_download()
{
234
    local CMD
235

236 237 238 239 240 241
    case "$BASEDISTRNAME" in
        "alt")
            __epm_download_alt $*
            return
            ;;
    esac
242

243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
    case $PMTYPE in
    apt-dpkg)
        if [ -n "$print_url" ] ; then
            docmd apt-get download --print-uris $* | cut -f1 -d " " | grep ".deb'$" | sed -e "s|^'||" -e "s|'$||"
            return
        fi
        docmd apt-get download $*
        ;;
    dnf-rpm)
        sudocmd dnf download $print_url $*
        ;;
    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 $*
        ;;
    eopkg)
        docmd eopkg fetch $*
        ;;
    homebrew)
        docmd brew fetch $*
        ;;
    *)
        fatal "Have no suitable command for $PMTYPE"
        ;;
    esac
287
}