#!/bin/sh
#
# This file is part of the flashrom project. It is derived from
# board_status.sh in coreboot.
#
# SPDX-License-Identifier: GPL-2.0-only
# SPDX-FileCopyrightText: 2016 Google Inc.
# SPDX-FileCopyrightText: 2014 Sage Electronic Engineering, LLC.

USE_CUSTOM_HOOKS=0
if [ -n "$CUSTOM_HOOKS_FILENAME" ]; then
	USE_CUSTOM_HOOKS=1
	. "$CUSTOM_HOOKS_FILENAME"
	if [ $? -ne 0 ]; then
		echo "Failed to source custom hooks file."
		exit $EXIT_FAILURE
	fi

	if ! custom_hook_sanity_check; then
		echo "Failed to run sanity check for custom hooks."
		exit $EXIT_FAILURE
	fi
fi

# test a command
#
# $1: 0 ($LOCAL) to run command locally,
#     1 ($REMOTE) to run remotely if remote host defined
# $2: command to test
# $3: 0 ($FATAL) Exit with an error if the command fails
#     1 ($NONFATAL) Don't exit on command test failure
test_cmd()
{
	local rc
	local cmd__="$(echo $2 | cut -d ' ' -f -1)"
	local args="$(echo $2 | cut -d ' ' -f 2-)"

	if [ -e "$cmd__" ]; then
		return
	fi

	if [ "$1" -eq "$REMOTE" ] && [ -n "$REMOTE_HOST" ]; then
		ssh $REMOTE_PORT_OPTION root@${REMOTE_HOST} command -v "$cmd__" $args > /dev/null 2>&1
		rc=$?
	else
		command -v "$cmd__" $args >/dev/null 2>&1
		rc=$?
	fi

	if [ $rc -eq 0 ]; then
		return 0
	fi

	if [ "$3" = "1" ]; then
		return 1
	fi

	echo "$2 not found"
	exit $EXIT_FAILURE
}

# Same args as cmd() but with the addition of $4 which determines if the
# command should be totally silenced or not.
_cmd()
{
	local silent=$4
	local rc=0

	if [ -n "$3" ]; then
		pipe_location="${3}"
	else
		pipe_location="/dev/null"
	fi

	if [ $1 -eq $REMOTE ] && [ -n "$REMOTE_HOST" ]; then
		if [ $silent -eq 0 ]; then
			ssh $REMOTE_PORT_OPTION "root@${REMOTE_HOST}" "$2" > "$pipe_location" 2>/dev/null
			rc=$?
		else
			ssh $REMOTE_PORT_OPTION "root@${REMOTE_HOST}" "$2" >/dev/null 2>&1
			rc=$?
		fi
	else
		if [ $USE_CUSTOM_HOOKS -eq 1 ]; then
			preflash_hook $1 "$2" "$3" $4
		fi

		if [ $silent -eq 0 ]; then
			$SUDO_CMD $2 > "$pipe_location" 2>/dev/null
			rc=$?
		else
			$SUDO_CMD $2 >/dev/null 2>&1
			rc=$?
		fi

		if [ $USE_CUSTOM_HOOKS -eq 1 ]; then
			postflash_hook $1 "$2" "$3" $4
		fi
	fi

	return $rc
}

# run a command
#
# $1: 0 ($LOCAL) to run command locally,
#     1 ($REMOTE) to run remotely if remote host defined
# $2: command
# $3: filename to direct output of command into
cmd()
{
	_cmd $1 "$2" "$3" 0

	if [ $? -eq 0 ]; then
		return
	fi

	echo "Failed to run \"$2\", aborting"
	rm -f "$3"	# don't leave an empty file
	return $EXIT_FAILURE
}

# run a command silently
#
# $1: 0 ($LOCAL) to run command locally,
#     1 ($REMOTE) to run remotely if remote host defined
# $2: command
scmd()
{
	_cmd $1 "$2" "" 1

	if [ $? -eq 0 ]; then
		return
	fi

	echo "Failed to run \"$2\", aborting"
	return $EXIT_FAILURE
}
