Log device added and device removed into journal

Diff the last configuration file with the current after
some allotted time. If they are different log the change.
Also add ability to check for power status, as some are
only discovered after power change.

Tested: Corrupted backup file so that a device could be
"removed" then discovered.

Change-Id: I610a18b7c66ff183025f2171edddb3c7716a51fb
Signed-off-by: James Feist <james.feist@linux.intel.com>
diff --git a/include/Utils.hpp b/include/Utils.hpp
index 990eb14..b4603cb 100644
--- a/include/Utils.hpp
+++ b/include/Utils.hpp
@@ -17,15 +17,26 @@
 #pragma once
 #include "filesystem.hpp"
 
+#include <boost/container/flat_map.hpp>
+#include <fstream>
+#include <iostream>
 #include <nlohmann/json.hpp>
+#include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/exception.hpp>
 
+constexpr const char* configurationOutDir = "/var/configuration/";
+constexpr const char* versionHashFile = "/var/configuration/version";
+constexpr const char* versionFile = "/etc/os-release";
+
 bool findFiles(const std::filesystem::path& dirPath,
                const std::string& matchString,
                std::vector<std::filesystem::path>& foundPaths);
 
 bool validateJson(const nlohmann::json& schemaFile,
                   const nlohmann::json& input);
+
+bool isPowerOn(void);
+void setupPowerMatch(const std::shared_ptr<sdbusplus::asio::connection>& conn);
 struct DBusInternalError final : public sdbusplus::exception_t
 {
     const char* name() const noexcept override
@@ -42,3 +53,42 @@
                "internal error";
     };
 };
+
+inline bool fwVersionIsSame(void)
+{
+    std::ifstream version(versionFile);
+    if (!version.good())
+    {
+        std::cerr << "Can't read " << versionFile << "\n";
+        return false;
+    }
+
+    std::string versionData;
+    std::string line;
+    while (std::getline(version, line))
+    {
+        versionData += line;
+    }
+
+    std::string expectedHash =
+        std::to_string(std::hash<std::string>{}(versionData));
+
+    std::filesystem::create_directory(configurationOutDir);
+    std::ifstream hashFile(versionHashFile);
+    if (hashFile.good())
+    {
+
+        std::string hashString;
+        hashFile >> hashString;
+
+        if (expectedHash == hashString)
+        {
+            return true;
+        }
+        hashFile.close();
+    }
+
+    std::ofstream output(versionHashFile);
+    output << expectedHash;
+    return false;
+}
\ No newline at end of file