#!/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 " 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