checkrelease.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #!/bin/bash
  2. #############################################################################
  3. # tools/checkrelease.sh
  4. #
  5. # Licensed to the Apache Software Foundation (ASF) under one or more
  6. # contributor license agreements. See the NOTICE file distributed with
  7. # this work for additional information regarding copyright ownership. The
  8. # ASF licenses this file to you under the Apache License, Version 2.0 (the
  9. # "License"); you may not use this file except in compliance with the
  10. # License. You may obtain a copy of the License at
  11. #
  12. # http://www.apache.org/licenses/LICENSE-2.0
  13. #
  14. # Unless required by applicable law or agreed to in writing, software
  15. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  16. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  17. # License for the specific language governing permissions and limitations
  18. # under the License.
  19. #
  20. #############################################################################
  21. RETURN_CODE=0
  22. BASE_URL="https://dist.apache.org/repos/dist/dev/incubator/nuttx"
  23. TEMPDIR="/tmp/nuttx-checkrelease"
  24. KEY="$BASE_URL/KEYS"
  25. function validate_url() {
  26. if [[ `wget -S --spider $1 2>&1 | grep 'HTTP/1.1 200 OK'` ]]; then echo "true"; fi
  27. }
  28. function download_release() {
  29. rm -rf "$TEMPDIR"
  30. mkdir "$TEMPDIR"
  31. cd "$TEMPDIR"
  32. if [[ -n "$URL" ]]; then
  33. if [[ $(validate_url "$URL") ]]; then
  34. echo "Downloading release files from $URL"
  35. wget -q -r -nd -np "$URL"
  36. else
  37. echo "The $URL given doesn't return HTTP 200 OK return code— exiting."
  38. exit 1
  39. fi
  40. else
  41. cp -r "$DIRECTORY"/* .
  42. fi
  43. }
  44. function import_key() {
  45. if [[ $(validate_url "$KEY") ]]; then
  46. export GNUPGHOME="$TEMPDIR/.gnupg"
  47. wget -q -O- "$KEY" | gpg --import
  48. echo " OK: $KEY is imported."
  49. else
  50. echo " - Error importing $KEY."
  51. exit 1
  52. fi
  53. }
  54. function check_sha512() {
  55. RELEASE_FILE=$1
  56. echo "Checking $RELEASE_FILE sha512..."
  57. output="$(sha512sum -c $RELEASE_FILE.sha512)" 2>&1
  58. return_value=$?
  59. if [ $return_value -eq 0 ]; then
  60. echo " OK: $RELEASE_FILE sha512 hash matches."
  61. else
  62. RETURN_CODE=1
  63. echo "$output"
  64. echo " - $RELEASE_FILE sha512 hash does not match."
  65. fi
  66. echo
  67. }
  68. function check_gpg() {
  69. RELEASE_FILE=$1
  70. echo "Checking $RELEASE_FILE GPG signature:"
  71. gpg --verify $RELEASE_FILE.asc $RELEASE_FILE
  72. return_value=$?
  73. if [ $return_value -eq 0 ]; then
  74. echo " OK: $RELEASE_FILE gpg signature matches."
  75. else
  76. RETURN_CODE=1
  77. echo " - Error checking $RELEASE_FILE gpg signature."
  78. fi
  79. echo
  80. }
  81. function check_required_files() {
  82. RELEASE_DIR=$1
  83. MISSING_FILE=0
  84. echo "Checking $RELEASE_FILE for required files:"
  85. if [ ! -f "$RELEASE_DIR/LICENSE" ]; then
  86. echo " - LICENSE file not present."
  87. MISSING_FILE=1
  88. fi
  89. if [ ! -f "$RELEASE_DIR/NOTICE" ]; then
  90. echo " - NOTICE file not present."
  91. MISSING_FILE=1
  92. fi
  93. if [ ! -f "$RELEASE_DIR/README.md" ]; then
  94. echo " - README.md file not present."
  95. MISSING_FILE=1
  96. fi
  97. if [ ! -f "$RELEASE_DIR/DISCLAIMER-WIP" ]; then
  98. echo " - DISCLAIMER-WIP file not present."
  99. MISSING_FILE=1
  100. fi
  101. if [ 0 -eq $MISSING_FILE ]; then
  102. echo " OK: all required files exist in $RELEASE_DIR."
  103. else
  104. RETURN_CODE=$MISSING_FILE
  105. fi
  106. echo
  107. }
  108. function check_nuttx() {
  109. RELEASE_FILE="$(ls *.tar.gz|head -1)"
  110. RELEASE_DIR="nuttx"
  111. check_sha512 "$RELEASE_FILE"
  112. check_gpg "$RELEASE_FILE"
  113. tar xf "$RELEASE_FILE"
  114. check_required_files "$RELEASE_DIR"
  115. }
  116. function check_nuttx_apps() {
  117. RELEASE_FILE="$(ls *.tar.gz|head -2| tail -1)"
  118. RELEASE_DIR="apps"
  119. check_sha512 "$RELEASE_FILE"
  120. check_gpg "$RELEASE_FILE"
  121. tar xf "$RELEASE_FILE"
  122. check_required_files "$RELEASE_DIR"
  123. }
  124. function check_sim_nsh_build() {
  125. RELEASE_DIR="nuttx"
  126. echo "Trying to build $RELEASE_DIR sim:nsh..."
  127. cd "$RELEASE_DIR"
  128. output=$(make distclean; ./tools/configure.sh sim:nsh; make) 2>&1
  129. return_value=$?
  130. if [ $return_value -eq 0 ]; then
  131. echo " OK: we were able to build sim:nsh."
  132. else
  133. RETURN_CODE=1
  134. echo "$output"
  135. echo " - Error building sim:nsh."
  136. fi
  137. echo
  138. }
  139. function usage() {
  140. echo "Usage: $0 [--url <URL-of-release-dir>] [--release <name-of-release] [--dir <path-to-directory>] [--tempdir <path-to-directory>]"
  141. echo " Given release full URL, release name, or a local directory, downloads or copies"
  142. echo " all files in that directory (which for a release should include nuttx and nuttx-apps, sha512, "
  143. echo " asc, and tar.gz files), checks the release SHA512 and GPG signatures, checks the unpacked "
  144. echo " directories for required files, and tries to build NuttX for sim:nsh."
  145. echo
  146. echo " If tempdir is specified, it will be removed and recreated; if it is not specified, /tmp/nuttx-checkrelease"
  147. echo " is used."
  148. echo
  149. echo "Examples:"
  150. echo
  151. echo " $0 --release 9.1.0-RC1"
  152. echo " $0 --url https://dist.apache.org/repos/dist/dev/incubator/nuttx/9.1.0-RC1"
  153. echo " $0 --dir ./some-dir-that-has-nuttx-and-apps"
  154. echo
  155. }
  156. URL=""
  157. DIRECTORY=""
  158. while [[ $# -gt 0 ]]
  159. do
  160. case $1 in
  161. -U|--url)
  162. shift
  163. URL="$1/"
  164. KEY="$1/../KEYS"
  165. ;;
  166. -R|--release)
  167. shift
  168. RELEASE="$1"
  169. URL="$BASE_URL/$RELEASE/"
  170. ;;
  171. -D|--dir)
  172. shift
  173. DIRECTORY="$(readlink -f $1)"
  174. ;;
  175. -T|--tempdir)
  176. shift
  177. TEMPDIR="$(readlink -f $1)"
  178. ;;
  179. -h|--help)
  180. usage
  181. exit 0
  182. ;;
  183. *) # unknown option
  184. usage
  185. exit 1
  186. ;;
  187. esac
  188. shift
  189. done
  190. if [[ (-z "$URL") && (-z "$DIRECTORY") ]]; then
  191. usage
  192. exit 1
  193. fi
  194. download_release
  195. import_key
  196. check_nuttx
  197. check_nuttx_apps
  198. check_sim_nsh_build
  199. exit $RETURN_CODE