epm-download 9.29 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
    # force download if repack is asked
    [ -n "$repack" ] && return 1

30 31 32 33 34 35 36 37 38 39
    # 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
40

41 42 43 44 45 46 47 48 49 50 51
    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)
52
            true
53 54
            ;;
        yum-rpm|dnf-rpm)
55
            true
56 57 58 59 60 61 62 63
            ;;
        #zypper-rpm)
        #    pkg_names="$pkg_names $pkg_urls"
        #    ;;
        *)
            return 1
            ;;
    esac
64
    [ -n "$pkg_names" ] && pkg_names="$pkg_names $pkg_urls" || pkg_names="$pkg_urls"
65
    return 0
66 67
}

68 69 70 71 72 73 74
# some heuristic to detect if we need download only latest package
__check_if_wildcard_downloading()
{
    mask="$(basename "$1")"
    is_wildcard "$mask" || return 1

    local fn
Vitaly Lipatov's avatar
Vitaly Lipatov committed
75 76 77 78
    fn="$(docmd eget --list "$url" | xargs -n1 basename 2>/dev/null)"
    # just return if there is no answer
    [ -n "$fn" ] || return 0

79 80 81 82 83 84
    local wf="$(epm print shortname from filename $fn | wc -l)"
    local ws="$(epm print shortname from filename $fn | sort -u | wc -l)"
    # not the same package of various versions
    [ "$wf" = "$ws" ]
}

85 86 87
# for download before install / checking
__download_pkg_urls()
{
88 89 90
    local url
    [ -z "$pkg_urls" ] && return
    for url in $pkg_urls ; do
91
        local tmppkg
92
        tmppkg="$(mktemp -d --tmpdir=$BIGTMPDIR)" || fatal
93
        remove_on_exit $tmppkg
94
        chmod $verbose a+rX $tmppkg
95
        cd $tmppkg || fatal
96

97
        local latest='--latest'
98 99
        __check_if_wildcard_downloading "$url" && latest=''

100 101 102
        # download packages
        if docmd eget $latest "$url" ; then
            local i
103
            for i in * ; do
104
                [ "$i" = "*" ] && warning 'Incorrect true status from eget. No saved files from download $url, ignoring' && continue
105 106
                [ -s "$tmppkg/$i" ] || continue
                chmod $verbose a+r "$tmppkg/$i"
107
                local si="$(echo "$i" | sed -e 's| |-|g')"
108 109 110 111 112
                if [ "$si" != "$i" ] ; then
                    info "Space detected in the downloaded file '$i', removing spaces ..."
                    mv -v "$tmppkg/$i" "$tmppkg/$si"
                    i="$si"
                fi
113 114 115 116 117 118
                si="$(echo "$i" | sed -e 's|\?.*||g')"
                if [ "$si" != "$i" ] ; then
                    info "Arg sign ? detected in the downloaded file '$i', removing args from filename ..."
                    mv -v "$tmppkg/$i" "$tmppkg/$si"
                    i="$si"
                fi
119
                [ -n "$pkg_files" ] && pkg_files="$pkg_files $tmppkg/$i" || pkg_files="$tmppkg/$i"
120
                [ -n "$pkg_urls_downloaded" ] && pkg_urls_downloaded="$pkg_urls_downloaded $url" || pkg_urls_downloaded="$url"
121 122 123 124 125 126 127 128
            done
        else
            warning "Failed to download $url, ignoring"
        fi
        cd - >/dev/null
    done
    # reconstruct
    pkg_filenames=$(strip_spaces "$pkg_files $pkg_names")
129 130 131 132 133
}

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

136 137 138 139 140
    # 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
141

142
    pkg_urls=
143 144
}

145 146
__handle_pkg_urls_to_checking()
{
147
    #[ -n "$pkg_urls" ] || return
148

149 150
    # use workaround with eget: download and put in pkg_files
    __download_pkg_urls
151

152
    pkg_urls=
153 154
}

155

156
# obsoleted
157 158
__epm_get_altpkg_url()
{
159 160 161 162 163 164 165 166 167 168 169 170
    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"
171 172
}

173
# obsoleted
174 175
__epm_print_url_alt()
{
176 177 178 179
    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"
180 181 182 183
}

__epm_print_url_alt_check()
{
184 185
    local pkg=$1
    shift
186 187
    local tm
    tm="$(mktemp)" || fatal
188
    remove_on_exit $tm
189 190 191 192 193
    assure_exists curl
    load_helper epm-site
    quiet=1
    local buildtime=$(paoapi packages/$pkg | get_pao_var buildtime)
    echo
194
    message 'Latest release:' $(paoapi packages/$pkg | get_pao_var sourcepackage) $buildtime
195
    __epm_print_url_alt "$1" | while read url ; do
196
        eget --get-response $url >$tm || { echo "$url: missed" ; continue ; }
197 198 199
        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")
200
        echo "$url ($http $lastdate) $(message "Size:") $size"
201 202
    done
    rm -f $tm
203 204 205 206
}

__epm_download_alt()
{
207 208 209 210 211
    local pkg
    if [ "$1" = "--check" ] ; then
        local checkflag="$1"
        shift
    fi
212

213
    load_helper epm-sh-altlinux
214

215 216 217 218 219 220
    # 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
221

222 223 224
        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")"
225
        [ -n "$verbose" ] && info 'Packages from task(s): $installlist'
226

227 228 229 230 231 232 233
        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
234

235 236
        return
    fi
237

238 239 240
    info "Cleaning apt cache for correct result ..."
    epm --quiet clean

241
    # old systems ignore reinstall ?
242 243 244 245 246 247 248 249
    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
250

251 252 253 254 255 256 257 258 259 260
    # 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
261
}
262

263 264
epm_download()
{
265
    local CMD
266

267 268 269 270 271 272
    case "$BASEDISTRNAME" in
        "alt")
            __epm_download_alt $*
            return
            ;;
    esac
273

274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314
    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 $*
        ;;
    *)
315
        fatal 'Have no suitable command for $PMTYPE'
316 317
        ;;
    esac
318
}