diff options
author | David Hendricks <dhendrix@chromium.org> | 2013-11-11 18:43:39 -0800 |
---|---|---|
committer | David Hendricks <dhendrix@chromium.org> | 2013-11-12 20:14:23 +0100 |
commit | c5e947ef17d98722d27a67d65a84a28fd5861dbd (patch) | |
tree | 84c8908cdcd4e4501907a7d71f171367c2a00f64 /util/board_status | |
parent | 7b4a99c66569c74243f44ec7c09f0fd6e5f6802e (diff) | |
download | coreboot-c5e947ef17d98722d27a67d65a84a28fd5861dbd.tar.xz |
rename status-related stuff to board_status
This just moves stuff to be more clear about the purpose of
the script. Other suggestions are welcome.
Change-Id: Ic6095fd4eb347daa5a03eff21b5952d2d42a6bfd
Signed-off-by: David Hendricks <dhendrix@chromium.org>
Reviewed-on: http://review.coreboot.org/4038
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Diffstat (limited to 'util/board_status')
-rw-r--r-- | util/board_status/board_status.sh | 137 | ||||
-rwxr-xr-x | util/board_status/getrevision.sh | 228 |
2 files changed, 365 insertions, 0 deletions
diff --git a/util/board_status/board_status.sh b/util/board_status/board_status.sh new file mode 100644 index 0000000000..d2955e0d63 --- /dev/null +++ b/util/board_status/board_status.sh @@ -0,0 +1,137 @@ +#!/bin/sh +# +# This file is part of the coreboot project. +# +# Copyright (C) 2013 Google Inc. +# + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +OUTDIR="status" + +# Stuff from command-line switches +REMOTE_HOST="" +CLOBBER_OUTPUT=0 +UPLOAD_RESULTS=0 + +show_help() { + echo "Usage: + ${0} <option> + +Options + -h + Show this message. + -c + Clobber output when finished. + -r <host> + Obtain machine information from remote host (using ssh). + -u + Upload results to coreboot.org. +" +} + +# test a command +# +# $1: test command on remote host (0=no, 1=yes) +# $2: command to test +test_cmd() +{ + local rc + + if [ -e "$2" ]; then + return + fi + + if [[ $1 -eq 1 && "$REMOTE_HOST" ]]; then + ssh root@${REMOTE_HOST} which "$2" >/dev/null + rc=$? + else + which "$2" >/dev/null + rc=$? + fi + + if [ $rc -eq 0 ]; then + return + fi + + echo "$2 not found" + exit $EXIT_FAILURE +} + +# run a command +# +# $1: 0 to run command locally, 1 to run remotely if remote host defined +# $2: command +cmd() +{ + if [ -e "$2" ]; then + return + fi + + if [[ $1 -eq 1 && -n "$REMOTE_HOST" ]]; then + ssh root@${REMOTE_HOST} "$2" + else + $2 + fi + + if [ $? -eq 0 ]; then + return + fi + + echo "Failed to run command: $2" + exit $EXIT_FAILURE +} + +while getopts "chr:u" opt; do + case "$opt" in + h) + show_help + exit $EXIT_SUCCESS + ;; + c) + CLOBBER_OUTPUT=1 + ;; + r) + REMOTE_HOST="$OPTARG" + ;; + u) + UPLOAD_RESULTS=1 + ;; + esac +done + +if [ -e "$OUTDIR" ]; then + echo "Output directory exists, aborting." + exit $EXIT_FAILURE +fi + +mkdir "$OUTDIR" + +getrevision="util/board_status/getrevision.sh" +test_cmd 0 $getrevision +touch ${OUTDIR}/revision.txt +printf "Local revision: %s\n" $($getrevision -l) >> ${OUTDIR}/revision.txt +printf "Upstream revision: %s\n" $($getrevision -u) >> ${OUTDIR}/revision.txt +printf "Upstream URL: %s\n" $($getrevision -U)>> ${OUTDIR}/revision.txt +printf "Timestamp: %s\n" $($getrevision -t) >> ${OUTDIR}/revision.txt + +cbfstool_cmd="util/cbfstool/cbfstool" +test_cmd 0 "$cbfstool_cmd" +$cbfstool_cmd build/coreboot.rom extract -n config -f ${OUTDIR}/config.txt + +test_cmd 1 "cbmem" +cmd 1 "cbmem -c" > ${OUTDIR}/coreboot_console.txt +cmd 1 "cbmem -t" > ${OUTDIR}/coreboot_timestamps.txt +cmd 1 "cbmem -C" > ${OUTDIR}/coreboot_coverage.txt + +cmd 1 dmesg > ${OUTDIR}/kernel_log.txt + +#if [ $UPLOAD_RESULTS -eq 1 ]; then +# FIXME: implement this part +#fi + +if [ $CLOBBER_OUTPUT -eq 1 ]; then + rm -rf ${OUTDIR} +fi + +exit $EXIT_SUCCESS diff --git a/util/board_status/getrevision.sh b/util/board_status/getrevision.sh new file mode 100755 index 0000000000..c8c126a5ee --- /dev/null +++ b/util/board_status/getrevision.sh @@ -0,0 +1,228 @@ +#!/bin/sh +# +# This file is part of the coreboot project. It originated in the +# flashrom project but has been heavily modified since then. +# +# Copyright (C) 2013 Stefan Tauner +# Copyright (C) 2013 Google Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +# Make sure we don't get translated output +export LC_ALL=C +# nor local times or dates +export TZ=UTC0 + +# Helper functions +git_has_local_changes() { + git update-index -q --refresh >/dev/null + ! git diff-index --quiet HEAD -- "$1" +} + +git_last_commit() { + git log --pretty=format:"%h" -1 -- "$1" +} + +git_is_file_tracked() { + git ls-files --error-unmatch -- "$1" >/dev/null 2>&1 +} + +is_file_tracked() { + git_is_file_tracked "$1" +} + +# Tries to find a remote source for the changes committed locally. +# This includes the URL of the remote repository including the last commit and a suitable branch name. +# Takes one optional argument: the path to inspect +git_url() { + # Note: This may not work as expected if multiple remotes are fetched from. + echo $(git remote -v | \ + awk '/fetch/ {split($2, pieces, "@"); print pieces[2]; exit 0}') +} + +# Returns a string indicating where others can get the current source code (excluding uncommitted changes) +# Takes one optional argument: the path to inspect +scm_url() { + local url + + url="$(git_url "$1")" + + echo "${url}" +} + +# Retrieve timestamp since last modification. If the sources are pristine, +# then the timestamp will match that of the SCM's most recent modification +# date. +timestamp() { + local t + + # date syntaxes are manifold: + # gnu date [-d input]... [+FORMAT] + # netbsd date [-ajnu] [-d date] [-r seconds] [+format] [[[[[[CC]yy]mm]dd]HH]MM[.SS]] + # freebsd date [-jnu] [-d dst] [-r seconds] [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] [...] + # dragonflybsd date [-jnu] [-d dst] [-r seconds] [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format] [...] + # openbsd date [-aju] [-d dst] [-r seconds] [+format] [[[[[[cc]yy]mm]dd]HH]MM[.SS]] [...] + if git_is_file_tracked "$2" ; then + # are there local changes? + if git_has_local_changes "$2" ; then + t=$(date -u "${1}") + else + # No local changes, get date of the last commit + case $(uname) in + # Most BSD dates do not support parsing date values from user input with -d but all of + # them support parsing epoch seconds with -r. Thanks to git we can easily use that: + NetBSD|OpenBSD|DragonFly|FreeBSD) + t=$(date -u -r "$(git log --pretty=format:%ct -1 -- $2)" "$1" 2>/dev/null);; + *) + t=$(date -d "$(git log --pretty=format:%cD -1 -- $2)" -u "$1" 2>/dev/null);; + esac + fi + else + t=$(date -u "$1") + fi + + if [ -z "$t" ]; then + echo "Warning: Could not determine timestamp." 2>/dev/null + fi + echo "${t}" +} + +# Retrieve local SCM revision info. This is useful if we're working in a different SCM than upstream and/or +# have local changes. +local_revision() { + local r + + if git_is_file_tracked "$1" ; then + r=$(git_last_commit "$1") + + if git_has_local_changes "$1" ; then + r="$r-dirty" + fi + else + return ${EXIT_FAILURE} + fi + + echo "${r}" +} + +upstream_revision() { + local r= + + r=$(git log remotes/origin/master -1 --format=format:%h) + + if [ -z "$r" ]; then + r="unknown" # default to unknown + fi + echo "${r}" +} + +show_help() { + echo "Usage: + ${0} <command> [path] + +Commands + -h or --help + this message + -l or --local + local revision information including an indicator for uncommitted changes + -u or --upstream + upstream revision + -U or --url + URL associated with the latest commit + -d or --date + date of most recent modification + -t or --timestamp + timestamp of most recent modification +" + return +} + +check_action() { + if [ -n "$action" ]; then + echo "Error: Multiple actions given.">&2 + exit ${EXIT_FAILURE} + fi +} + +main() { + local query_path= + local action= + + # The is the main loop + while [ $# -gt 0 ]; + do + case ${1} in + -h|--help) + action=show_help; + shift;; + -l|--local) + check_action $1 + action=local_revision + shift;; + -u|--upstream) + check_action $1 + action=upstream_revision + shift;; + -U|--url) + check_action $1 + action=scm_url + shift;; + -d|--date) + check_action $1 + action="timestamp +%Y-%m-%d" # refrain from suffixing 'Z' to indicate it's UTC + shift;; + -t|--timestamp) + check_action $1 + action="timestamp +%Y-%m-%dT%H:%M:%SZ" # There is only one valid time format! ISO 8601 + shift;; + -*) + show_help; + echo "Error: Invalid option: ${1}" + exit ${EXIT_FAILURE};; + *) + if [ -z "$query_path" ] ; then + if [ ! -e "$1" ] ; then + echo "Error: Path \"${1}\" does not exist.">&2 + exit ${EXIT_FAILURE} + fi + query_path=$1 + else + echo "Warning: Ignoring over-abundant paramter: \"${1}\"">&2 + fi + shift;; + esac; + done + + # default to current directory (usually equals the whole repository) + if [ -z "$query_path" ] ; then + query_path=. + fi + if ! is_file_tracked "$query_path" ; then + echo "Warning: Path \"${query_path}\" is not under version control.">&2 + fi + if [ -z "$action" ] ; then + show_help + echo "Error: No actions specified" + exit ${EXIT_FAILURE} + fi + + $action "$query_path" +} + +main $@ |