blob: 160688000bb710e4533af154bfe49265889f9f01 [file] [log] [blame]
#!/bin/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.
ACCESS_TOKEN=''
USER_NAME=''
PROJECT=''
TOOLS=''
HOST='sourceforge.net'
OUTPUT=.
VERBOSE=false
MAX_MINUTES=10
HEADERS=/tmp/project_export_response_headers
BODY=/tmp/project_export_response
function error() {
echo "$1"
exit 1
}
while getopts "ht:u:o:H:c:v" opt; do
case $opt in
h)
echo "Usage: $0 [OPTION]... PROJECT TOOL,TOOL,TOOL,..."
echo "Schedule an export of PROJECT and retrieve the file when ready"
echo
echo " -c CONFIG_FILE Load config (optionally including PROJECT and TOOLs) from file"
echo " -H HOST Host to use (default sourceforge.net)"
echo " -o OUTPUT Directory and/or filename for downloaded export file"
echo " -t ACCESS_TOKEN Access (bearer) token for the API"
echo " -u USER_NAME Username associated with access token (to download file)"
echo " -v Verbose mode"
echo " -h Show this help message"
echo
echo "The TOOLS should be one or more tool mount-point names, separated by commas"
exit
;;
t)
C_ACCESS_TOKEN="$OPTARG"
;;
u)
C_USER_NAME="$OPTARG"
;;
H)
C_HOST="$OPTARG"
;;
o)
C_OUTPUT="$OPTARG"
;;
v)
C_VERBOSE=true
;;
c)
source "$OPTARG"
;;
*)
error "Invalid option: -$opt"
esac
done
# command-line overrides config
[ -n "$C_ACCESS_TOKEN" ] && ACCESS_TOKEN="$C_ACCESS_TOKEN"
[ -n "$C_USER_NAME" ] && USER_NAME="$C_USER_NAME"
[ -n "$C_HOST" ] && HOST="$C_HOST"
[ -n "$C_OUTPUT" ] && OUTPUT="$C_OUTPUT"
[ -n "$C_VERBOSE" ] && VERBOSE="$C_VERBOSE"
shift $(($OPTIND - 1))
if [[ $# -ge 1 ]]; then
PROJECT="$1"
shift
fi
[ $# -ge 1 ] && TOOLS="$@"
# fall back to prompt
[ -z "$ACCESS_TOKEN" ] && read -p "Access (bearer) token: " ACCESS_TOKEN
[ -z "$USER_NAME" ] && read -p "Username: " USER_NAME
[ -z "$PROJECT" ] && read -p "Project: " PROJECT
[ -z "$TOOLS" ] && read -p "Tools: " TOOLS
curl_s='-s'
$VERBOSE && curl_s=''
URL="https://$HOST/rest/p/$PROJECT/admin/export"
function json() {
python -c "import sys, json; print json.load(sys.stdin)['$1']"
}
$VERBOSE && echo "Posting to $URL"
curl $curl_s -D $HEADERS -o $BODY --data "access_token=$ACCESS_TOKEN&tools=$TOOLS" "$URL" || error "Running curl failed"
head -n1 $HEADERS | grep 400 && error "Invalid or missing tool"
head -n1 $HEADERS | grep 503 && error "Export already in progress"
head -n1 $HEADERS | grep -v 200 && error "Error: $(head -n1 $HEADERS)"
filename=`cat $BODY | json filename`
minutes=0
while true; do
$VERBOSE && echo "Checking $URL_status"
curl $curl_s -D $HEADERS -o $BODY "${URL}_status?access_token=$ACCESS_TOKEN" || error "Running curl failed"
head -n1 $HEADERS | grep -v 200 && error "Error: $(head -n1 $HEADERS)"
status=`cat $BODY | json status`
$VERBOSE && echo "Status: $status"
[ "$status" == "ready" ] && break
sleep 60
let minutes+=1
[ "$minutes" -ge "$MAX_MINUTES" ] && error "Timeout waiting for export"
done
CMD="scp $USER_NAME@web.$HOST:/home/project-exports/$PROJECT/$filename $OUTPUT"
$VERBOSE && echo "Running $CMD"
$CMD