| #!/bin/bash | |
| # | |
| # Copyright 2022 Google LLC | |
| # | |
| # Licensed 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 | |
| # | |
| # https://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. | |
| # Build a rust toolchain tarball for download use later. | |
| PUBLIC_ARTIFACTS_PATH="gs://shodan-public-artifacts" | |
| function die { | |
| echo "$@" >/dev/stderr | |
| exit 1 | |
| } | |
| function try { | |
| echo "$@" | |
| "$@" || die "Failed to execute '$@': exited with return code $?" | |
| } | |
| function show-usage { | |
| cat >/dev/stderr <<EOF | |
| Usage: manage-rust-toolchain.sh [-c|-u|-p <date>] | |
| Creates, uploads, and promotes Rust toolchain tarballs from toolchain installs | |
| on local disk in cache/. | |
| Options: | |
| -l | --list List available rust tarballs. | |
| -c | --create Create a new toolchain tarball and sha256sum from files in | |
| cache/. | |
| -u | --upload Upload the existing toolchain tarball to Google storage. | |
| Note: requires the Google Cloud SDK to be installed and | |
| logged in to function. | |
| -p <date> | --promote <date> | |
| Promote the given date stamp tarball to latest. | |
| EOF | |
| exit 1 | |
| } | |
| function generate-tarball-name { | |
| local datestamp=$(date -I) | |
| echo "rust_toolchain_${datestamp}.tar.xz" | |
| } | |
| function create-tarball { | |
| if [[ ! -d "${RUSTDIR}" ]]; then | |
| die "No rust toolchain installed at ${RUSTDIR}. Please install it first, and try again." | |
| fi | |
| local tarball="$(generate-tarball-name)" | |
| if [[ -f "${OUT}/${tarball}" ]]; then | |
| die "Tarball ${tarball} already exists -- cowardly refusing to overwrite it." | |
| fi | |
| mkdir -p "${OUT}" | |
| echo "Creating tarball in ${OUT}/${tarball}..." | |
| tar -C "${ROOTDIR}/cache" -c -f - rust_toolchain \ | |
| |xz -T0 -9 \ | |
| > "${OUT}/${tarball}" | |
| if [[ "$?" != 0 ]]; then | |
| die "Couldn't create tarball." | |
| fi | |
| echo "Generating sha256sums..." | |
| (cd "${OUT}" && sha256sum "${tarball}") > "${OUT}/${tarball}.sha256sum" | |
| if [[ "$?" != 0 ]]; then | |
| die "Couldn't create sha256sum checksum file." | |
| fi | |
| echo "Verifying sha256sum is valid..." | |
| (cd "${OUT}" && sha256sum -c "${tarball}.sha256sum") | |
| if [[ "$?" != 0 ]]; then | |
| die "Couldn't verify sha256sum!" | |
| fi | |
| } | |
| function list-tarballs { | |
| echo "Available tarballs:" | |
| echo | |
| gsutil ls "${PUBLIC_ARTIFACTS_PATH}/rust_toolchain*.tar.xz" | |
| } | |
| function upload-tarball { | |
| local tarball="$(generate-tarball-name)" | |
| echo "Uploading tarball..." | |
| try gsutil cp "${OUT}/${tarball}" "${PUBLIC_ARTIFACTS_PATH}/${tarball}" | |
| try gsutil cp "${OUT}/${tarball}.sha256sum" "${PUBLIC_ARTIFACTS_PATH}/${tarball}.sha256sum" | |
| } | |
| function promote-tarball { | |
| local promote_date="$1"; shift | |
| echo "Removing old latest toolchain..." | |
| try gsutil rm \ | |
| "${PUBLIC_ARTIFACTS_PATH}/rust_toolchain_latest.tar.xz" | |
| try gsutil rm \ | |
| "${PUBLIC_ARTIFACTS_PATH}/rust_toolchain_latest.tar.xz.sha256sum" | |
| echo "Promoting tarball rust_toolchain_${promote_date}.tar.xz to rust_toolchain_latest.tar.xz" | |
| try gsutil cp \ | |
| "${PUBLIC_ARTIFACTS_PATH}/rust_toolchain_${promote_date}.tar.xz" \ | |
| "${PUBLIC_ARTIFACTS_PATH}/rust_toolchain_latest.tar.xz" | |
| try gsutil cp \ | |
| "${PUBLIC_ARTIFACTS_PATH}/rust_toolchain_${promote_date}.tar.xz.sha256sum" \ | |
| "${PUBLIC_ARTIFACTS_PATH}/rust_toolchain_latest.tar.xz.sha256sum" | |
| } | |
| function main { | |
| local usage="Usage: manage-rust-toolchain.sh [-l|-c|-u|-p <date>]" | |
| local args=$(getopt -o h,l,c,u,p: --long help,list,create,upload,promote: \ | |
| -n manage-rust-toolchain.sh -- "$@") | |
| eval set -- "$args" | |
| local mode="" | |
| local promote_date="" | |
| while true; do | |
| case "$1" in | |
| -l|--list) | |
| mode="list" | |
| shift | |
| ;; | |
| -c|--create) | |
| mode="create-tarball" | |
| shift | |
| ;; | |
| -u|--upload) | |
| mode="upload" | |
| shift | |
| ;; | |
| -p|--promote) | |
| mode="promote" | |
| promote_date="$2" | |
| shift | |
| shift | |
| ;; | |
| -h|--help) | |
| show-usage | |
| ;; | |
| --) | |
| shift | |
| break | |
| ;; | |
| *) | |
| die "Unknown option '$1'; maybe try --help?" | |
| ;; | |
| esac | |
| done | |
| case "${mode}" in | |
| list) | |
| list-tarballs | |
| ;; | |
| create-tarball) | |
| create-tarball | |
| ;; | |
| upload) | |
| upload-tarball | |
| ;; | |
| promote) | |
| promote-tarball "${promote_date}" | |
| ;; | |
| *) | |
| show-usage | |
| ;; | |
| esac | |
| } | |
| if [[ "$EUID" == 0 ]]; then | |
| die "This script must NOT be run as root." | |
| fi | |
| if [[ -z "${ROOTDIR}" || -z "${RUSTDIR}" ]]; then | |
| die "Source build/setup.sh first" | |
| fi | |
| if ! hash gsutil 2>/dev/null; then | |
| die "This script requires the Google SDK to be installed." | |
| fi | |
| main "$@" |