blob: 0f4aee84dd5dd0257551b76c57ffe17b7f3c7e35 [file] [log] [blame]
#!/usr/bin/env bash
#**************************************************************
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
#**************************************************************
file_list_name=$1
if [ -z "$TARFILE_LOCATION" ]; then
echo "ERROR: no destination defined! please set TARFILE_LOCATION!"
exit
fi
if [ ! -d "$TARFILE_LOCATION" ]; then
mkdir $TARFILE_LOCATION
fi
if [ ! -d "$TARFILE_LOCATION" ]; then
echo "ERROR: can't create"
exit
fi
if [ -z "$1" ]; then
echo "ERROR: parameter missing!"
echo "usage: $0 <fetch list>"
echo "first line must define the base url."
exit
fi
# Downloader method selection
fetch_bin=
fetch_args=
#Look for FreeBSD's fetch(1) first
if [ -x /usr/bin/fetch ]; then
fetch_bin=/usr/bin/fetch
fetch_args="-Fpr"
echo found FreeBSD fetch: $fetch_bin
else
for wg in wget /usr/bin/wget /usr/local/bin/wget /usr/sfw/bin/wget /opt/sfw/bin/wget /opt/local/bin/wget; do
eval "$wg --version" > /dev/null 2>&1
ret=$?
if [ $ret -eq 0 ]; then
fetch_bin=$wg
fetch_args="-nv -N"
echo found wget at `which $fetch_bin`
break 2
fi
done
if [ -z "$fetch_bin" ]; then
for c in curl /usr/bin/curl /usr/local/bin/curl /usr/sfw/bin/curl /opt/sfw/bin/curl /opt/local/bin/curl; do
# mac curl returns "2" on --version
# eval "$i --version" > /dev/null 2>&1
# ret=$?
# if [ $ret -eq 0 ]; then
if [ -x $c ]; then
fetch_bin=$c
fetch_args="$file_date_check -O"
echo found curl at `which $fetch_bin`
break 2
fi
done
fi
if [ -z "$fetch_bin" ]; then
echo "ERROR: neither wget nor curl found!"
exit
fi
fi
#Checksummer selection
md5sum=
for i in md5 md5sum /usr/local/bin/md5sum gmd5sum /usr/sfw/bin/md5sum /opt/sfw/bin/gmd5sum /opt/local/bin/md5sum; do
if [ "$i" = "md5" ]; then
eval "$i -x" > /dev/null 2>&1
else
eval "$i --version" > /dev/null 2>&1
fi
ret=$?
if [ $ret -eq 0 ]; then
md5sum=$i
echo found md5sum at `which $md5sum`
break 2
fi
done
if [ "$md5sum" = "md5" ]; then
md5special=-r
fi
if [ -z "$md5sum" ]; then
echo "Warning: no md5sum: found!"
fi
start_dir=`pwd`
logfile=$TARFILE_LOCATION/fetch.log
date >> $logfile
# Create and go to a temporary directory under the tar file destination.
mkdir -p $TARFILE_LOCATION/tmp
cd $TARFILE_LOCATION/tmp
basename ()
{
echo $1 | sed "s/^\(.*\/\)//"
}
#
# Download a file from a URL and add its md5 checksum to its name.
#
download ()
{
local URL=$1
if [ -n "$URL" ]; then
local basename=$(basename $URL)
local candidate=$(find "$TARFILE_LOCATION" -type f -name "*-$basename")
if [ -n "$candidate" ]; then
echo "$basename is already present ($candidate)"
else
echo fetching $basename
$fetch_bin $fetch_args $URL 2>&1 | tee -a $logfile
if [ $? -ne 0 ]; then
echo "download failed"
mv $basename ${basename}_broken
failed="$failed $i"
elif [ -f "$basename" -a -n "$md5sum" ]; then
local sum=`$md5sum $md5special $basename | sed "s/ .*//"`
mv $basename "$TARFILE_LOCATION/$sum-$basename"
echo "added md5 sum $sum"
fi
fi
fi
}
#
# Download a file from a URL and check its md5 sum to the one that is part of its name.
#
download_and_check ()
{
local URL=$1
if [ -n "$URL" ]; then
local basename=$(basename $URL)
if [ -f "$TARFILE_LOCATION/$basename" ]; then
echo "$basename is already present"
else
echo "fetching $basename"
$fetch_bin $fetch_args $URL 2>&1 | tee -a $logfile
if [ $? -ne 0 ]; then
echo "download failed"
mv $basename ${basename}_broken
failed="$failed $i"
elif [ -f "$basename" -a -n "$md5sum" ]; then
local sum=`$md5sum $md5special $basename | sed "s/ .*//"`
local sum_in_name=`echo $basename | sed "s/-.*//"`
if [ "$sum" != "$sum_in_name" ]; then
echo checksum failure for $basename 2>&1 | tee -a $logfile
failed="$failed $basename"
mv $basename ${basename}_broken
fi
mv $basename "$TARFILE_LOCATION/$basename"
fi
fi
fi
}
echo "downloading tar balls to $TARFILE_LOCATION"
while read line ; do
# Remove leading and trailing space and comments
line=`echo $line | sed 's/^\s*//;s/\s*$//;s/\s*#.*$//'`
case $line in
# Ignore empty lines.
'')
;;
# When a URL ends in a / then it is taken as a partial URL
# to which the following lines will be appended.
ftp:\/\/*\/ | http:\/\/*\/)
UrlHead=$line
echo $UrlHead
;;
# A full URL represents a single file which is downloaded.
ftp:\/\/* | http:\/\/*)
download $line
;;
# If the line starts with the name of an environment variable than the file is
# downloaded only when the variable evaluates to YES.
[A-Z0-9_]*:*)
prefix=`echo $line | sed 's/:.*$//'`
if [ -n "$prefix" ]; then
eval value=\$$prefix
if [ "x$value" = "xYES" ]; then
line=`echo $line | sed 's/^.*://'`
download_and_check $UrlHead$line
fi
fi
;;
# Any other line is interpreted as the second part of a partial URL.
# It is appended to UrlHead and then downloaded.
*)
download_and_check $UrlHead$line
;;
esac
done < "$file_list_name"
# Special handling of dmake
if [ -n "$DMAKE_URL" -a ! -x "$SOLARENV/$OUTPATH/bin/dmake$EXEEXT" ]; then
download $DMAKE_URL
fi
# Special handling of epm-3.7
# Basically just a download of the epm archive.
# When its name contains "-source" than that part is removed.
epm_archive_tail=`echo $(basename $EPM_URL) | sed 's/-source//'`
epm_archive_name=$(find "$TARFILE_LOCATION" -type f -name "*-$epm_archive_tail")
if [ -n "$EPM_URL" -a ! -x "$SOLARENV/$OUTPATH/bin/epm$EXEEXT" -a -z "$epm_archive_name" ]; then
download $EPM_URL
archive_name=$(find "$TARFILE_LOCATION" -type f -name "*-epm-3.7-source*")
if [ -n "$archive_name" ]; then
epm_archive_name=`echo $archive_name | sed 's/-source//'`
mv "$archive_name" "$epm_archive_name"
fi
fi
if [ ! -z "$failed" ]; then
echo
echo ERROR: failed on:
for i in $failed ; do
echo $i
done
exit 1
fi