blob: 3299c51270068169d1561c649076c4a31c27ac34 [file] [log] [blame]
#!/bin/bash
#############################################################################
# tools/checkrelease.sh
#
# 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.
#
#############################################################################
RETURN_CODE=0
BASE_URL="https://dist.apache.org/repos/dist/dev/incubator/nuttx"
TEMPDIR="/tmp/nuttx-checkrelease"
KEY="$BASE_URL/KEYS"
function validate_url() {
if [[ `wget -S --spider $1 2>&1 | grep 'HTTP/1.1 200 OK'` ]]; then echo "true"; fi
}
function download_release() {
rm -rf "$TEMPDIR"
mkdir "$TEMPDIR"
cd "$TEMPDIR"
if [[ -n "$URL" ]]; then
if [[ $(validate_url "$URL") ]]; then
echo "Downloading release files from $URL"
wget -q -r -nd -np "$URL"
else
echo "The $URL given doesn't return HTTP 200 OK return code— exiting."
exit 1
fi
else
cp -r "$DIRECTORY"/* .
fi
}
function import_key() {
if [[ $(validate_url "$KEY") ]]; then
export GNUPGHOME="$TEMPDIR/.gnupg"
wget -q -O- "$KEY" | gpg --import
echo " OK: $KEY is imported."
else
echo " - Error importing $KEY."
exit 1
fi
}
function check_sha512() {
RELEASE_FILE=$1
echo "Checking $RELEASE_FILE sha512..."
output="$(sha512sum -c $RELEASE_FILE.sha512)" 2>&1
return_value=$?
if [ $return_value -eq 0 ]; then
echo " OK: $RELEASE_FILE sha512 hash matches."
else
RETURN_CODE=1
echo "$output"
echo " - $RELEASE_FILE sha512 hash does not match."
fi
echo
}
function check_gpg() {
RELEASE_FILE=$1
echo "Checking $RELEASE_FILE GPG signature:"
gpg --verify $RELEASE_FILE.asc $RELEASE_FILE
return_value=$?
if [ $return_value -eq 0 ]; then
echo " OK: $RELEASE_FILE gpg signature matches."
else
RETURN_CODE=1
echo " - Error checking $RELEASE_FILE gpg signature."
fi
echo
}
function check_required_files() {
RELEASE_DIR=$1
MISSING_FILE=0
echo "Checking $RELEASE_FILE for required files:"
if [ ! -f "$RELEASE_DIR/LICENSE" ]; then
echo " - LICENSE file not present."
MISSING_FILE=1
fi
if [ ! -f "$RELEASE_DIR/NOTICE" ]; then
echo " - NOTICE file not present."
MISSING_FILE=1
fi
if [ ! -f "$RELEASE_DIR/README.md" ]; then
echo " - README.md file not present."
MISSING_FILE=1
fi
if [ 0 -eq $MISSING_FILE ]; then
echo " OK: all required files exist in $RELEASE_DIR."
else
RETURN_CODE=$MISSING_FILE
fi
echo
}
function check_nuttx() {
RELEASE_FILE="$(ls *.tar.gz|head -1)"
RELEASE_DIR="nuttx"
check_sha512 "$RELEASE_FILE"
check_gpg "$RELEASE_FILE"
tar xf "$RELEASE_FILE"
check_required_files "$RELEASE_DIR"
}
function check_nuttx_apps() {
RELEASE_FILE="$(ls *.tar.gz|head -2| tail -1)"
RELEASE_DIR="apps"
check_sha512 "$RELEASE_FILE"
check_gpg "$RELEASE_FILE"
tar xf "$RELEASE_FILE"
check_required_files "$RELEASE_DIR"
}
function check_sim_asan() {
RELEASE_DIR="nuttx"
cd "$RELEASE_DIR"
echo "Trying to build $RELEASE_DIR sim:asan..."
output=$(make distclean; ./tools/configure.sh sim:asan; make) 2>&1
return_value=$?
if [ $return_value -eq 0 ]; then
echo " OK: we were able to build sim:asan."
else
RETURN_CODE=1
echo "$output"
echo " - Error building sim:asan."
fi
echo
echo "Trying to run $RELEASE_DIR sim:asan..."
output=$(./nuttx) 2>&1
return_value=$?
if [ $return_value -eq 0 ]; then
echo " OK: ostest with ASAN pass."
else
RETURN_CODE=1
echo "$output"
echo " - Error running sim:asan."
fi
echo
}
function usage() {
echo "Usage: $0 [--url <URL-of-release-dir>] [--release <name-of-release] [--dir <path-to-directory>] [--tempdir <path-to-directory>]"
echo " Given release full URL, release name, or a local directory, downloads or copies"
echo " all files in that directory (which for a release should include nuttx and nuttx-apps, sha512, "
echo " asc, and tar.gz files), checks the release SHA512 and GPG signatures, checks the unpacked "
echo " directories for required files, and tries to build NuttX for sim:asan."
echo
echo " If tempdir is specified, it will be removed and recreated; if it is not specified, /tmp/nuttx-checkrelease"
echo " is used."
echo
echo "Examples:"
echo
echo " $0 --release 9.1.0-RC1"
echo " $0 --url https://dist.apache.org/repos/dist/dev/incubator/nuttx/9.1.0-RC1"
echo " $0 --dir ./some-dir-that-has-nuttx-and-apps"
echo
}
URL=""
DIRECTORY=""
while [[ $# -gt 0 ]]
do
case $1 in
-U|--url)
shift
URL="$1/"
KEY="$1/../KEYS"
;;
-R|--release)
shift
RELEASE="$1"
URL="$BASE_URL/$RELEASE/"
;;
-D|--dir)
shift
DIRECTORY="$(readlink -f $1)"
;;
-T|--tempdir)
shift
TEMPDIR="$(readlink -f $1)"
;;
-h|--help)
usage
exit 0
;;
*) # unknown option
usage
exit 1
;;
esac
shift
done
if [[ (-z "$URL") && (-z "$DIRECTORY") ]]; then
usage
exit 1
fi
download_release
import_key
check_nuttx
check_nuttx_apps
check_sim_asan
exit $RETURN_CODE