#!/bin/bash # # Copyright (c) .NET Foundation and contributors. All rights reserved. # Licensed under the MIT license. See LICENSE file in the project root for full license information. # # This is a VERY basic script for Create/Delete operations on repos and packages # # Environment Dependencies: # $REPO_SERVER # $REPO_USER # $REPO_PASS cmd=$1 urls=urls.txt defaultPackageFile=new_package.json defaultRepoFile=new_repo.json repositoryId=$REPO_ID server=$REPO_SERVER user=$REPO_USER pass=$REPO_PASS protocol=https port=443 baseurl="$protocol://$user:$pass@$server:$port" echo $baseurl function BailIf { if [ $1 -ne 0 ]; then echo "Failure occurred communicating with $server" exit 1 fi } # List packages, using $1 as a regex to filter results function ListPackages { curl -k "$baseurl/v1/packages" | sed 's/{/\n{/g' | egrep "$1" | sed 's/,/,\n/g' | sed 's/^"/\t"/g' echo "" } # Create a new Repo using the specified JSON file function AddRepo { repoFile=$1 if [ -z $repoFile ]; then echo "Error: Must specify a JSON-formatted file. Reference $defaultRepoFile.template" exit 1 fi if [ ! -f $repoFile ]; then echo "Error: Cannot create repo - $repoFile does not exist" exit 1 fi packageUrl=$(grep "url" $repoFile | head -n 1 | awk '{print $2}' | tr -d ',') echo "Creating new repo on $server [$packageUrl]" curl -i -k "$baseurl/v1/repositories" --data @./$repoFile -H "Content-Type: application/json" BailIf $? echo "" } # Upload a single package using the specified JSON file function AddPackage { packageFile=$1 if [ -z $packageFile ]; then echo "Error: Must specify a JSON-formatted file. Reference $defaultPackageFile.template" exit 1 fi if [ ! -f $packageFile ]; then echo "Error: Cannot add package - $packageFile does not exist" exit 1 fi packageUrl=$(grep "sourceUrl" $packageFile | head -n 1 | awk '{print $2}') echo "Adding package to $server [$packageUrl]" curl -i -k "$baseurl/v1/packages" --data @$packageFile -H "Content-Type: application/json" BailIf $? echo "" } # Upload a single package by dynamically creating a JSON file using a provided URL function AddPackageByUrl { # Parse URL url=$(echo "$1") if [ -z $url ]; then return fi escapedUrl=$(echo "$url" | sed 's/\//\\\//g') set -- "$1" oldIFS=$IFS IFS="/"; declare -a splitUrl=($*) index=${#splitUrl[@]} let "index -= 1" filename=${splitUrl[$index]} set -- "$filename" IFS="_"; declare -a splitFile=($*) IFS=$oldIFS pkgName=${splitFile[0]} pkgVer=${splitFile[1]} if [ -z $pkgName ] || [ -z $pkgVer ]; then echo "ERROR parsing $url" return fi # Create Package .json file cp $defaultPackageFile.template $defaultPackageFile sed -i "s/PACKAGENAME/$pkgName/g" $defaultPackageFile sed -i "s/PACKAGEVERSION/$pkgVer/g" $defaultPackageFile sed -i "s/PACKAGEURL/$escapedUrl/g" $defaultPackageFile sed -i "s/REPOSITORYID/$repositoryId/g" $defaultPackageFile # Test that URL is ok wget -q --spider "$url" if [[ $? -eq 0 ]]; then echo "Ready to upload $pkgName [$pkgVer]" else echo "ERROR testing URL $url" return fi # Perform Upload AddPackage $defaultPackageFile # Cleanup # rm $defaultPackageFile } # Upload multiple packages by reading urls line-by-line from the specified file function AddPackages { urlFile=$1 if [ -z $urlFile ]; then echo "Error: Must specify a flat text file containing one or more URLs" exit 1 fi if [ ! -f $urlFile ]; then echo "Error: Cannot add packages. File $urlFile does not exist" exit 1 fi for url in $(cat $urlFile); do AddPackageByUrl "$url" sleep 5 done } # Delete the specified repo function DeleteRepo { repoId=$1 if [ -z $repoId ]; then echo "Error: Please specify repository ID. Run -listrepos for a list of IDs" exit 1 fi curl -I -k -X DELETE "$baseurl/v1/repositories/$repoId" BailIf $? } # Delete the specified package function DeletePackage { packageId=$1 if [ -z $packageId ]; then echo "Error: Please specify package ID. Run -listpkgs for a list of IDs" exit 1 fi echo Removing pkgId $packageId from repo $repositoryId curl -I -k -X DELETE "$baseurl/v1/packages/$packageId" BailIf $? } if [[ "$1" == "-listrepos" ]]; then echo "Fetching repo list from $server..." curl -k "$baseurl/v1/repositories" | sed 's/,/,\n/g' | sed 's/^"/\t"/g' echo "" elif [[ "$1" == "-listpkgs" ]]; then echo "Fetching package list from $server" ListPackages $2 elif [[ "$1" == "-addrepo" ]]; then AddRepo $2 elif [[ "$1" == "-addpkg" ]]; then AddPackage $2 elif [[ "$1" == "-addpkgs" ]]; then AddPackages $2 elif [[ "$1" == "-delrepo" ]]; then DeleteRepo $2 elif [[ "$1" == "-delpkg" ]]; then DeletePackage $2 else echo "USAGE: ./repotool.sh -OPTION" echo "-listrepos: Gather a list of repos" echo "-listpkgs: Gather a list of packages" echo "-addrepo [FILENAME] : Create a new repo using the specified JSON file" echo "-addpkg [FILENAME] : Add package to repo using the specified JSON file" echo "-addpkgs [FILENAME] : Add packages to repo using urls contained in FILENAME" echo "-delrepo REPOID : Delete the specified repo by ID" echo "-delpkg PKGID : Delete the specified package by ID" fi