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