From df290b499af0948e18abf138b0aa365a05cfd72e Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 4 Apr 2007 22:30:05 -0400 Subject: Enable support for other download protocols in makepkg This patch fixes FS #4404 as well as adding support for future protocols by generalizing the concept of a download agent and allowing a downloader to be specified for each protocol. Original work done by Andrew Fyfe . Signed-off-by: Dan McGee --- etc/makepkg.conf.in | 16 ++++++--- scripts/makepkg.in | 98 ++++++++++++++++++++++++++++++++--------------------- 2 files changed, 71 insertions(+), 43 deletions(-) diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in index 6f9e9776..6d5a372f 100644 --- a/etc/makepkg.conf.in +++ b/etc/makepkg.conf.in @@ -6,10 +6,18 @@ # SOURCE ACQUISITION ######################################################################### # -#-- The FTP/HTTP download utility that makepkg should use to acquire sources -FTPAGENT="/usr/bin/wget --continue --passive-ftp --tries=3 --waitretry=3 --no-check-certificate" -#FTPAGENT="/usr/bin/snarf" -#FTPAGENT="/usr/bin/lftpget -c" +#-- The download utilities that makepkg should use to acquire sources +# Format: 'protocol::agent' +DLAGENTS=('ftp::/usr/bin/wget -c --passive-ftp -t 3 --waitretry=3' + 'http::/usr/bin/wget -c -t 3 --waitretry=3' + 'https::/usr/bin/wget -c -t 3 --waitretry=3 --no-check-certificate' + 'rsync::/usr/bin/rsync -z' + 'scp::/usr/bin/scp -C') + +# Other common tools: +# /usr/bin/snarf +# /usr/bin/lftpget -c +# /usr/bin/curl ######################################################################### # ARCHITECTURE, COMPILE FLAGS diff --git a/scripts/makepkg.in b/scripts/makepkg.in index e2627eb1..715cc097 100755 --- a/scripts/makepkg.in +++ b/scripts/makepkg.in @@ -189,6 +189,39 @@ in_array() { return 1 } +getdownloadclient() { + # $1 = url with valid protocol prefix + local url=$1 + local proto=$(echo $netfile | sed 's|://.*||') + + # loop through DOWNLOAD_AGENTS variable looking for protocol + for i in "${DLAGENTS[@]}"; do + local handler=$(echo $i | sed 's|::.*||') + if [ "$proto" == "$handler" ]; then + agent=$(echo $i | sed 's|^.*::||') + break + fi + done + + # if we didn't find an agent, return an error + if [ -z "$agent" ]; then + error "$(eval_gettext "There is no agent set up to handle \$proto URLs. Check /etc/makepkg.conf.")" + error "$(gettext "Aborting...")" + exit 1 # $E_CONFIG_ERROR # TODO: error code + fi + + # ensure specified program is installed + local program="$(echo $agent | awk '{print $1 }')" + if [ ! -x "$program" ]; then + local baseprog=$(basename $program) + error "$(eval_gettext "The download program \$baseprog is not installed.")" + error "$(gettext "Aborting...")" + exit 1 # $E_MISSING_PROGRAM # TODO: error code + fi + + echo "$agent" +} + checkdeps() { [ $# -gt 0 ] || return @@ -674,59 +707,46 @@ fi cd "$startdir" -# retrieve sources -msg "$(gettext "Retrieving Sources...")" mkdir -p src cd "$startdir/src" + +msg "$(gettext "Retrieving Sources...")" for netfile in ${source[@]}; do file=$(strip_url "$netfile") if [ -f "../$file" ]; then msg2 "$(eval_gettext "Found \$file in build dir")" cp "../$file" . + continue elif [ -f "$SRCDEST/$file" ]; then msg2 "$(eval_gettext "Using cached copy of \$file")" cp "$SRCDEST/$file" . - else - # check for a download utility - if [ -z "$FTPAGENT" ]; then - error "$(gettext "FTPAGENT is not configured. Check the /etc/makepkg.conf file.")" - msg "$(gettext "Aborting...")" - exit 1 - fi - ftpclient=$(echo $FTPAGENT | awk {'print $1'}) - if [ ! -x "$ftpclient" ]; then - local clientname=$(basename $ftpclient) - error "$(eval_gettext "ftpclient \$clientname is not installed.")" - msg "$(gettext "Aborting...")" - exit 1 - fi - proto=$(echo "$netfile" | sed 's|://.*||') - if [ "$proto" != "ftp" -a "$proto" != "http" -a "$proto" != "https" ]; then - error "$(eval_gettext "\$netfile was not found in the build directory and is not a proper URL.")" - msg "$(gettext "Aborting...")" - exit 1 - fi - msg2 "$(eval_gettext "Downloading \$file")" - $FTPAGENT "$netfile" - # fix flyspray bug #3289 - ftpret=$? - if [ $ftpret -gt 0 ]; then - error "$(eval_gettext "Failure while downloading \$file")" - msg "$(gettext "Aborting...")" - #rm "$file" - exit 1 - fi - if [ -n "$SRCDEST" ]; then - mkdir -p $SRCDEST && cp "$file" $SRCDEST - if [ $? -ne 0 ]; then - warning "$(eval_gettext "You do not have correct permissions to cache source in \$SRCDEST")" - cp "$file" .. - fi - else + continue + fi + + # find the client we should use for this URL + dlclient=$(getdownloadclient $netfile) || exit $? + + msg2 "$(eval_gettext "Downloading \$file")" + # fix flyspray bug #3289 + ret=0 + $dlclient "$netfile" || ret=$? + if [ $ret -gt 0 ]; then + error "$(gettext "Failure while downloading $file")" + msg "$(gettext "Aborting...")" + exit 1 + fi + + if [ -n "$SRCDEST" ]; then + mkdir -p "$SRCDEST" && cp "$file" "$SRCDEST" || ret=$? + if [ $ret -gt 0 ]; then + warning "$(eval_gettext "You do not have correct permissions to cache source in \$SRCDEST")" cp "$file" .. fi + else + cp "$file" .. fi done +unset netfile file dlclient ret if [ "$NOEXTRACT" = "1" -o "$REPKG" = "1" ]; then warning "$(gettext "Skipping source integrity checks -- using existing src/ tree")" -- cgit v1.2.3-70-g09d2