diff --git a/build/tfs/linux/new_package.json.template b/build/tfs/linux/new_package.json.template new file mode 100644 index 00000000000..77e2ada928e --- /dev/null +++ b/build/tfs/linux/new_package.json.template @@ -0,0 +1,6 @@ +{ + "name": "PACKAGENAME", + "version": "PACKAGEVERSION", + "repositoryId": "REPOSITORYID", + "sourceUrl": "PACKAGEURL" +} \ No newline at end of file diff --git a/build/tfs/linux/repoapi_client.sh b/build/tfs/linux/repoapi_client.sh index 3d98dd22d55..b700aceff03 100755 --- a/build/tfs/linux/repoapi_client.sh +++ b/build/tfs/linux/repoapi_client.sh @@ -2,9 +2,9 @@ # This is a VERY basic script for Create/Delete operations on repos and packages # cmd=$1 -urls=urls.txt -defaultPackageFile=new_package.json -defaultRepoFile=new_repo.json +docDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # chrmarti: Changed to script's directory. +packageJsonTemplate=$docDir/new_package.json.template +repoJsonTemplate=$docDir/new_repo.json.template function Bail { @@ -24,14 +24,21 @@ function Usage { echo "$0 -config FILENAME -listrepos | -listpkgs | -addrepo FILENAME | -addpkg FILENAME |" echo "-addpkgs FILENAME | -check ID | -delrepo REPOID | -delpkg PKGID" echo -e "\t-config FILENAME : JSON file containing API server name and creds" - echo -e "\t-listrepos : List repositories" + echo -e "Package Operations:" echo -e "\t-listpkgs [REGEX] : List packages, optionally filter by REGEX" - echo -e "\t-addrepo FILENAME : Create a new repo using the specified JSON file" echo -e "\t-addpkg FILENAME : Add package to repo using the specified JSON file" echo -e "\t-addpkgs FILENAME : Add packages to repo using urls contained in FILENAME" echo -e "\t-check ID : Check upload operation by ID" - echo -e "\t-delrepo REPOID : Delete the specified repo by ID" echo -e "\t-delpkg PKGID : Delete the specified package by ID" + echo -e "File Operations:" + echo -e "\t-uploadfile FILENAME: Upload FILENAME (does not publish) " + echo -e "\t-addfile FILENAME : Upload FILENAME AND publish to the repo" + echo -e "\t-listfiles : List uploaded files" + echo -e "\t-delfile FILEID : Delete uploaded file by ID" + echo -e "Repository Operations:" + echo -e "\t-listrepos : List repositories" + echo -e "\t-addrepo FILENAME : Create a new repo using the specified JSON file" + echo -e "\t-delrepo REPOID : Delete the specified repo by ID" exit 1 } @@ -84,33 +91,136 @@ function AddRepo { repoFile=$1 if [ -z $repoFile ]; then - Bail "Error: Must specify a JSON-formatted file. Reference $defaultRepoFile.template" + Bail "Error: Must specify a JSON-formatted file. Reference $repoJsonTemplate" fi if [ ! -f $repoFile ]; then Bail "Error: Cannot create repo - $repoFile does not exist" 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" + curl -i -k "$baseurl/v1/repositories" --data @$repoFile -H "Content-Type: application/json" echo "" } +# Upload AND publish the file +function AddFile +{ + packageFile=$1 + # Validity checks are performed by UploadFile + echo "Uploading package to $server [$packageFile]" + response=$(UploadFile $packageFile "true") + id=$(echo $response | jq -r ".id") + + # Parse package metadata first to confirm it's a valid deb/rpm + # Needs to be performed in this function so we can use it to publish the package + jsonFile=$(WritePackageInfoToFile $packageFile) + + sed -i "s/REPOSITORYID/$repositoryId/g" $jsonFile + # Replace the url field with fileId + sed -i "s/PACKAGEURL/$id/g" $jsonFile + sed -i "s/sourceUrl/fileId/g" $jsonFile + + AddPackage $jsonFile + rm -f $jsonFile + echo "" +} + +# Upload a file +function UploadFile +{ + packageFile=$1 + quick=$2 + if [ -z $packageFile ]; then + Bail "Error: Must specify the path to a file to upload " + fi + if [ ! -f $packageFile ]; then + Bail "Error: Cannot upload - $packageFile does not exist" + fi + + # Additional validation and output if quick mode isn't enabled + # Basically, if this is part of a publish operation, these steps are handled elsewhere + if [ "$quick" != "true" ]; then + # Parse package metadata first to confirm it's a valid deb/rpm + jsonFile=$(WritePackageInfoToFile $packageFile) + rm -f $jsonFile + + echo "Uploading package to $server [$packageFile]" + fi + curl -s -k -X POST -F file=@$packageFile "$baseurl/v1/files" + echo "" +} + +function ListFiles +{ + curl -s -k "$baseurl/v1/files" | jq +} + +function DeleteFile +{ + fileId=$1 + if [ -z "$fileId" ]; then + Bail "Error: Must specify an ID to delete" + fi + curl -s -X DELETE "$baseurl/v1/files/$fileId" +} + # Upload a single package using the specified JSON file function AddPackage { packageFile=$1 if [ -z $packageFile ]; then - Bail "Error: Must specify a JSON-formatted file. Reference $defaultPackageFile.template" + Bail "Error: Must specify a JSON-formatted file. Reference $packageJsonTemplate" fi if [ ! -f $packageFile ]; then Bail "Error: Cannot add package - $packageFile does not exist" 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" + curl -i -k "$baseurl/v1/packages" --data @$packageFile -H "Content-Type: application/json" echo "" } +# Gets the package name and version and writes it to a file +function WritePackageInfoToFile +{ + packageFile=$1 + tmpOut=$(mktemp) + if [ -z "$packageFile" ]; then + Bail "Error: Must specify path to a deb/rpm package" + elif [ ! -f "$packageFile" ]; then + Bail "Error: Specified file $packageFile does not exist" + fi + if dpkg -I $packageFile > $tmpOut 2> /dev/null; then + >&2 echo "File is deb format" + pkgName=$(grep "^\s*Package:" $tmpOut | awk '{print $2}') + pkgVer=$(grep "^\s*Version:" $tmpOut | awk '{print $2}') + elif rpm -qpi $packageFile > $tmpOut 2> /dev/null; then + >&2 echo "File is rpm format" + pkgName=$(egrep "^Name" $tmpOut | tr -d ':' | awk '{print $2}') + pkgVer=$(egrep "^Version" $tmpOut | tr -d ':' | awk '{print $2}') + else + rm -f $tmpOut + Bail "File is not a valid deb/rpm package $url" + fi + + rm -f $tmpOut + if [ -z "$pkgName" ]; then + Bail "Unable to parse package name for $url" + elif [ -z "$pkgVer" ]; then + Bail "Unable to parse package version number for $url" + fi + + # Create Package .json file + outJson=$(mktemp) + escapedUrl=$(echo "$url" | sed 's/\//\\\//g' | sed 's/\&/\\\&/g') + cp $packageJsonTemplate $outJson + sed -i "s/PACKAGENAME/$pkgName/g" $outJson + sed -i "s/PACKAGEVERSION/$pkgVer/g" $outJson + + # Return path to json file + echo $outJson +} + # Upload a single package by dynamically creating a JSON file using a provided URL function AddPackageByUrl { @@ -119,41 +229,20 @@ function AddPackageByUrl Bail "Unable to publish package because no URL was specified" fi tmpFile=$(mktemp) - tmpOut=$(mktemp) if ! wget -q "$url" -O $tmpFile; then - rm -f $tmpFile $tmpFile + rm -f $tmpFile Bail "Unable to download URL $url" - elif dpkg -I $tmpFile > $tmpOut 2> /dev/null; then - echo "File is deb format" - pkgName=$(grep "^\s*Package:" $tmpOut | awk '{print $2}') - pkgVer=$(grep "^\s*Version:" $tmpOut | awk '{print $2}') - elif rpm -qpi $tmpFile > $tmpOut 2> /dev/null; then - echo "File is rpm format" - pkgName=$(egrep "^Name" $tmpOut | tr -d ':' | awk '{print $2}') - pkgVer=$(egrep "^Version" $tmpOut | tr -d ':' | awk '{print $2}') - else - rm -f $tmpFile $tmpOut - Bail "File is not a valid deb/rpm package $url" - fi - - rm -f $tmpFile $tmpOut - if [ -z "$pkgName" ]; then - Bail "Unable to parse package name for $url" - elif [ -z "$pkgVer" ]; then - Bail "Unable to parse package version number for $url" fi + jsonFile=$(WritePackageInfoToFile $tmpFile) # Create Package .json file escapedUrl=$(echo "$url" | sed 's/\//\\\//g' | sed 's/\&/\\\&/g') - 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 + sed -i "s/PACKAGEURL/$escapedUrl/g" $jsonFile + sed -i "s/REPOSITORYID/$repositoryId/g" $jsonFile # Perform Upload - AddPackage $defaultPackageFile + AddPackage $jsonFile # Cleanup - rm -f $defaultPackageFile + rm -f $jsonFile } # Upload multiple packages by reading urls line-by-line from the specified file @@ -180,7 +269,7 @@ function CheckUpload { if [ -z "$id" ]; then Bail "Must specify an ID" fi - curl -k $baseurl/v1/packages/queue/$id + curl -s -k $baseurl/v1/packages/queue/$id | jq echo "" } @@ -232,6 +321,20 @@ while (( "$#" )); do operation=AddPackages shift operand="$1" + elif [[ "$1" == "-addfile" ]]; then + operation=AddFile + shift + operand="$1" + elif [[ "$1" == "-uploadfile" ]]; then + operation=UploadFile + shift + operand="$1" + elif [[ "$1" == "-listfiles" ]]; then + operation=ListFiles + elif [[ "$1" == "-delfile" ]]; then + operation=DeleteFile + shift + operand="$1" elif [[ "$1" == "-check" ]]; then operation=CheckUpload shift