bmc: allow configuring the verification output path
Allow configuring the file checked to determine the status of the
asynchronous image verification process.
Signed-off-by: Patrick Venture <venture@google.com>
Change-Id: Ia37ed81cd08fa4ce0313092134c476cc42eb8119
diff --git a/README.md b/README.md
index 690e5ba..5a00d7c 100644
--- a/README.md
+++ b/README.md
@@ -102,3 +102,4 @@
`STATIC_HANDLER_STAGED_NAME` | `/run/initramfs/bmc-image` | The filename where to write the staged firmware image for static updates.
`TARBALL_STAGED_NAME` | `/tmp/image-update.tar` | The filename where to write the UBI update tarball.
`HASH_FILENAME` | `/tmp/bmc.sig` | The file to use for the hash provided.
+`VERIFY_STATUS_FILENAME` | `/tmp/bmc.verify` | The file checked for the verification status.
diff --git a/configure.ac b/configure.ac
index b555c76..3ec030d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -171,6 +171,10 @@
AS_IF([test "x$HASH_FILENAME" == "x"], [HASH_FILENAME="/tmp/bmc.sig"])
AC_DEFINE_UNQUOTED([HASH_FILENAME], ["$HASH_FILENAME"], [The file to use for the hash provided.])
+AC_ARG_VAR(VERIFY_STATUS_FILENAME, [The file checked for the verification status.])
+AS_IF([test "xVERIFY_STATUS_FILENAME" == "x"], [VERIFY_STATUS_FILENAME="/tmp/bmc.verify"])
+AC_DEFINE_UNQUOTED([VERIFY_STATUS_FILENAME], ["$VERIFY_STATUS_FILENAME"], [The file checked for the verification status.])
+
AC_CHECK_HEADER(linux/ipmi.h, [HAVE_LINUX_IPMI_H=""], [HAVE_LINUX_IPMI_H="-I linux/ipmi.h"])
AS_IF([test "$HAVE_LINUX_IPMI_H" != ""],
AC_MSG_WARN([Could not find linux/ipmi.h: Attempting to download locally for building from openbmc/linux/+/dev-4.18])
diff --git a/firmware_handler.cpp b/firmware_handler.cpp
index 7f86d5f..5873c69 100644
--- a/firmware_handler.cpp
+++ b/firmware_handler.cpp
@@ -37,18 +37,18 @@
static constexpr auto systemdRoot = "/org/freedesktop/systemd1";
static constexpr auto systemdInterface = "org.freedesktop.systemd1.Manager";
static constexpr auto verifyTarget = "verify_image.service";
-static constexpr auto statusPath = "/tmp/bmc.verify";
namespace
{
-FirmwareBlobHandler::VerifyCheckResponses checkVerificationState()
+FirmwareBlobHandler::VerifyCheckResponses
+ checkVerificationState(const std::string& path)
{
FirmwareBlobHandler::VerifyCheckResponses result =
FirmwareBlobHandler::VerifyCheckResponses::other;
std::ifstream ifs;
- ifs.open(statusPath);
+ ifs.open(path);
if (ifs.good())
{
/*
@@ -79,7 +79,8 @@
std::unique_ptr<GenericBlobInterface>
FirmwareBlobHandler::CreateFirmwareBlobHandler(
sdbusplus::bus::bus&& bus, const std::vector<HandlerPack>& firmwares,
- const std::vector<DataHandlerPack>& transports)
+ const std::vector<DataHandlerPack>& transports,
+ const std::string& verificationPath)
{
/* There must be at least one. */
if (!firmwares.size())
@@ -112,7 +113,8 @@
}
return std::make_unique<FirmwareBlobHandler>(std::move(bus), firmwares,
- blobs, transports, bitmask);
+ blobs, transports, bitmask,
+ verificationPath);
}
/* Check if the path is in our supported list (or active list). */
@@ -260,7 +262,7 @@
*/
if (item->second->activePath == verifyBlobId)
{
- auto value = checkVerificationState();
+ auto value = checkVerificationState(verificationPath);
meta->metadata.push_back(static_cast<std::uint8_t>(value));
diff --git a/firmware_handler.hpp b/firmware_handler.hpp
index 3e36897..3467ccd 100644
--- a/firmware_handler.hpp
+++ b/firmware_handler.hpp
@@ -126,10 +126,12 @@
* @param[in] bus - an sdbusplus handler for a bus to use.
* @param[in] firmwares - list of firmware blob_ids to support.
* @param[in] transports - list of transports to support.
+ * @param[in[ verificationPath - path to check for verification output
*/
static std::unique_ptr<GenericBlobInterface> CreateFirmwareBlobHandler(
sdbusplus::bus::bus&& bus, const std::vector<HandlerPack>& firmwares,
- const std::vector<DataHandlerPack>& transports);
+ const std::vector<DataHandlerPack>& transports,
+ const std::string& verificationPath);
/**
* Create a FirmwareBlobHandler.
@@ -144,12 +146,13 @@
const std::vector<HandlerPack>& firmwares,
const std::vector<std::string>& blobs,
const std::vector<DataHandlerPack>& transports,
- std::uint16_t bitmask) :
+ std::uint16_t bitmask,
+ const std::string& verificationPath) :
bus(std::move(bus)),
handlers(firmwares), blobIDs(blobs), transports(transports),
bitmask(bitmask), activeImage(activeImageBlobId),
activeHash(activeHashBlobId), verifyImage(verifyBlobId), lookup(),
- state(UpdateState::notYetStarted)
+ state(UpdateState::notYetStarted), verificationPath(verificationPath)
{
}
~FirmwareBlobHandler() = default;
@@ -213,6 +216,8 @@
/** The firmware update state. */
UpdateState state;
+ const std::string verificationPath;
+
/** Temporary variable to track whether a blob is open. */
bool fileOpen = false;
};
diff --git a/main.cpp b/main.cpp
index 4dc8c27..6458b98 100644
--- a/main.cpp
+++ b/main.cpp
@@ -95,7 +95,7 @@
auto handler = blobs::FirmwareBlobHandler::CreateFirmwareBlobHandler(
sdbusplus::bus::new_default(), blobs::supportedFirmware,
- blobs::supportedTransports);
+ blobs::supportedTransports, VERIFY_STATUS_FILENAME);
if (!handler)
{
diff --git a/test/firmware_canhandle_unittest.cpp b/test/firmware_canhandle_unittest.cpp
index 1ec83bd..f739b9e 100644
--- a/test/firmware_canhandle_unittest.cpp
+++ b/test/firmware_canhandle_unittest.cpp
@@ -36,7 +36,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
for (const auto& item : items)
{
diff --git a/test/firmware_close_unittest.cpp b/test/firmware_close_unittest.cpp
index 5bede33..b0d20fb 100644
--- a/test/firmware_close_unittest.cpp
+++ b/test/firmware_close_unittest.cpp
@@ -36,7 +36,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
EXPECT_CALL(imageMock, open(StrEq(hashBlobId))).WillOnce(Return(true));
@@ -82,7 +82,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock, open(StrEq(hashBlobId))).WillOnce(Return(true));
diff --git a/test/firmware_commit_unittest.cpp b/test/firmware_commit_unittest.cpp
index 2137383..009f158 100644
--- a/test/firmware_commit_unittest.cpp
+++ b/test/firmware_commit_unittest.cpp
@@ -36,7 +36,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
@@ -65,7 +65,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock1, open(StrEq(hashBlobId))).WillOnce(Return(true));
@@ -95,7 +95,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_TRUE(handler->open(0, OpenFlags::write, verifyBlobId));
@@ -121,7 +121,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_TRUE(handler->open(0, OpenFlags::write, verifyBlobId));
diff --git a/test/firmware_createhandler_unittest.cpp b/test/firmware_createhandler_unittest.cpp
index 65aa6ef..3bee96e 100644
--- a/test/firmware_createhandler_unittest.cpp
+++ b/test/firmware_createhandler_unittest.cpp
@@ -43,7 +43,7 @@
// .WillOnce(Return(0));
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
// EXPECT_EQ(handler, nullptr);
EXPECT_FALSE(handler == nullptr);
diff --git a/test/firmware_delete_unittest.cpp b/test/firmware_delete_unittest.cpp
index 49809f8..8d21e29 100644
--- a/test/firmware_delete_unittest.cpp
+++ b/test/firmware_delete_unittest.cpp
@@ -34,7 +34,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock, open(StrEq(hashBlobId))).WillOnce(Return(true));
diff --git a/test/firmware_handler_unittest.cpp b/test/firmware_handler_unittest.cpp
index 020d7ff..65e73bd 100644
--- a/test/firmware_handler_unittest.cpp
+++ b/test/firmware_handler_unittest.cpp
@@ -21,7 +21,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), {}, data);
+ std::move(bus_mock), {}, data, "");
EXPECT_EQ(handler, nullptr);
}
TEST(FirmwareHandlerTest, CreateEmptyDataHandlerListFails)
@@ -37,7 +37,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, {});
+ std::move(bus_mock), blobs, {}, "");
EXPECT_EQ(handler, nullptr);
}
TEST(FirmwareHandlerTest, VerifyHashRequiredForHappiness)
@@ -56,13 +56,13 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_EQ(handler, nullptr);
blobs.push_back({hashBlobId, &imageMock});
handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
auto result = handler->getBlobIds();
EXPECT_EQ(3, result.size());
EXPECT_EQ(3, std::count(result.begin(), result.end(), "asdf") +
diff --git a/test/firmware_open_unittest.cpp b/test/firmware_open_unittest.cpp
index 1820bb1..5b6d690 100644
--- a/test/firmware_open_unittest.cpp
+++ b/test/firmware_open_unittest.cpp
@@ -34,7 +34,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(true));
@@ -65,7 +65,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock, open(StrEq(hashBlobId))).WillOnce(Return(true));
@@ -101,7 +101,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
EXPECT_CALL(imageMock, open(StrEq(hashBlobId))).WillOnce(Return(true));
@@ -136,7 +136,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(dataMock, open()).WillOnce(Return(false));
@@ -168,7 +168,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
@@ -216,7 +216,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(true));
@@ -258,7 +258,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock, open("asdf")).WillOnce(Return(false));
@@ -288,7 +288,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_FALSE(
handler->open(0, FirmwareBlobHandler::UpdateFlags::ipmi, "asdf"));
@@ -312,7 +312,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_FALSE(
handler->open(0, FirmwareBlobHandler::UpdateFlags::lpc, "asdf"));
@@ -336,7 +336,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_FALSE(handler->open(
0, OpenFlags::write | FirmwareBlobHandler::UpdateFlags::ipmi, "bcdf"));
diff --git a/test/firmware_sessionstat_unittest.cpp b/test/firmware_sessionstat_unittest.cpp
index e395358..891ade2 100644
--- a/test/firmware_sessionstat_unittest.cpp
+++ b/test/firmware_sessionstat_unittest.cpp
@@ -32,7 +32,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
@@ -73,7 +73,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
diff --git a/test/firmware_stat_unittest.cpp b/test/firmware_stat_unittest.cpp
index 4c90735..79b8a44 100644
--- a/test/firmware_stat_unittest.cpp
+++ b/test/firmware_stat_unittest.cpp
@@ -32,7 +32,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
struct BlobMeta meta;
EXPECT_TRUE(handler->stat("asdf", &meta));
diff --git a/test/firmware_write_unittest.cpp b/test/firmware_write_unittest.cpp
index 6ba2081..75eab40 100644
--- a/test/firmware_write_unittest.cpp
+++ b/test/firmware_write_unittest.cpp
@@ -33,7 +33,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
@@ -67,7 +67,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
@@ -110,7 +110,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
diff --git a/test/firmware_writemeta_unittest.cpp b/test/firmware_writemeta_unittest.cpp
index ad7f25b..f70495a 100644
--- a/test/firmware_writemeta_unittest.cpp
+++ b/test/firmware_writemeta_unittest.cpp
@@ -31,7 +31,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));
@@ -62,7 +62,7 @@
auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
auto handler = FirmwareBlobHandler::CreateFirmwareBlobHandler(
- std::move(bus_mock), blobs, data);
+ std::move(bus_mock), blobs, data, "");
EXPECT_CALL(dataMock, open()).WillOnce(Return(true));
EXPECT_CALL(imageMock2, open("asdf")).WillOnce(Return(true));