epm-download 5.53 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 26
	# force download if wildcard is used
	echo "$pkg_urls" | grep -q "[?*]" && return 1

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

	case $PMTYPE in
39 40 41
		#apt-rpm)
		#	pkg_names="$pkg_names $pkg_urls"
		#	;;
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
		#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
70
		local tmppkg=$(mktemp -d) || fatal "failed mktemp -d"
71
		docmd chmod $verbose a+rX $tmppkg
72
		showcmd cd $tmppkg
73
		cd $tmppkg || fatal
74
		if docmd eget --latest "$url" ; then
75
			local i
76 77 78
			# use downloaded file
			i=$(echo *.*)
			[ -s "$tmppkg/$i" ] || continue
79
			docmd chmod $verbose a+r "$tmppkg/$i"
80 81
			pkg_files="$pkg_files $tmppkg/$i"
			to_remove_pkg_files="$to_remove_pkg_files $tmppkg/$i"
82 83 84
		else
			warning "Failed to download $url, ignoring"
		fi
85
		cd - >/dev/null
86
	done
87
	# reconstruct
88
	pkg_filenames=$(strip_spaces "$pkg_files $pkg_names")
89 90 91 92 93 94 95 96 97
}

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

	# TODO: do it correctly
	to_remove_pkg_files=
Vitaly Lipatov's avatar
Vitaly Lipatov committed
98 99
	# FIXME: check type of pkg_urls separately?
	if [ "$(get_package_type "$pkg_urls")" != $PKGFORMAT ] || ! __use_url_install ; then
100 101 102 103 104 105 106
		# use workaround with eget: download and put in pkg_files
		__download_pkg_urls
	fi

	pkg_urls=
}

107 108 109 110 111 112 113 114 115 116 117 118 119
__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=
}

120 121 122 123 124 125
#__clean_downloaded_pkg_files()
#{
#	[ -z "$to_remove_pkg_files" ] && return
#	rm -fv $to_remove_pkg_files
#}

126 127 128 129 130 131 132 133 134
__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)
135
	[ -n "$filename" ] || fatal "Can't get filename"
136 137 138
	# fixme: get from /branches
	local dv=$DISTRNAME/$DISTRVERSION/branch
	[ "$DISTRVERSION" = "Sisyphus" ] && dv=$DISTRNAME/$DISTRVERSION
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
	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)
155
	assure_exists curl
156 157 158 159 160 161
	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
Vitaly Lipatov's avatar
Vitaly Lipatov committed
162
		a='' curl -s --head $url >$tm || { echo "$url: missed" ; continue ; }
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
		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
187
}
188

189 190 191 192
epm_download()
{
	local CMD

193
	case $DISTRNAME-$PMTYPE in
194
		ALTLinux-apt-rpm|ALTServer-apt-rpm)
195
			__epm_download_alt $*
196 197 198 199
			return
			;;
	esac

200
	case $PMTYPE in
201 202 203
	apt-dpkg)
		docmd apt-get download $*
		;;
204
	dnf-rpm)
205
		sudocmd dnf download $*
206 207
		;;
	aptcyg)
208
		sudocmd apt-cyg download $*
209
		;;
210
	packagekit)
211
		docmd pkcon download $*
212
		;;
213 214 215
	yum-rpm)
		# TODO: check yum install --downloadonly --downloaddir=/tmp <package-name>
		assure_exists yumdownloader yum-utils
216
		sudocmd yumdownloader $*
217 218
		;;
	dnf-rpm)
219
		sudocmd dnf download $*
220
		;;
221 222 223
	urpm-rpm)
		sudocmd urpmi --no-install $URPMOPTIONS $@
		;;
224
	tce)
225
		sudocmd tce-load -w $*
226
		;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
227
	opkg)
228
		docmd opkg $*
Vitaly Lipatov's avatar
Vitaly Lipatov committed
229
		;;
230
	homebrew)
231
		docmd brew fetch $*
232
		;;
233 234 235 236 237
	*)
		fatal "Have no suitable command for $PMTYPE"
		;;
	esac
}