Reimplement UUID based on systemd UUID

...rather than a randomly generated one

Change-Id: I85493ac29d21f5fa9f347edc21129901f9d0d911
Signed-off-by: Ed Tanous <ed.tanous@intel.com>
diff --git a/redfish-core/lib/service_root.hpp b/redfish-core/lib/service_root.hpp
index 62796ee..d6cf44e 100644
--- a/redfish-core/lib/service_root.hpp
+++ b/redfish-core/lib/service_root.hpp
@@ -15,6 +15,7 @@
 */
 #pragma once
 
+#include <systemd/sd-id128.h>
 #include "node.hpp"
 
 namespace redfish {
@@ -31,16 +32,16 @@
     Node::json["RedfishVersion"] = "1.1.0";
     Node::json["Links"]["Sessions"] = {
         {"@odata.id", "/redfish/v1/SessionService/Sessions"}};
-    Node::json["UUID"] =
-        app.template get_middleware<crow::PersistentData::Middleware>()
-            .system_uuid;
 
-    entityPrivileges = {{boost::beast::http::verb::get, {}},
-                        {boost::beast::http::verb::head, {}},
-                        {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
-                        {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
-                        {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
-                        {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
+    Node::json["UUID"] = get_uuid();
+
+    entityPrivileges = {
+        {boost::beast::http::verb::get, {}},
+        {boost::beast::http::verb::head, {}},
+        {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
+        {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
   }
 
  private:
@@ -49,6 +50,27 @@
     res.json_value = Node::json;
     res.end();
   }
+
+  const std::string get_uuid() {
+  // If we are using a version of systemd that can get the app specific uuid,
+  // use that
+#ifdef sd_id128_get_machine_app_specific
+    std::array<char, SD_ID128_STRING_MAX> string;
+    sd_id128_t id = SD_ID128_NULL;
+
+    // This ID needs to match the one in ipmid
+    int r = sd_id128_get_machine_app_specific(
+        SD_ID128_MAKE(e0, e1, 73, 76, 64, 61, 47, da, a5, 0c, d0, cc, 64, 12,
+                      45, 78),
+        &id);
+    if (r < 0) {
+      return "00000000-0000-0000-0000-000000000000";
+    }
+    return string.data();
+#else
+    return "00000000-0000-0000-0000-000000000000";
+#endif
+  }
 };
 
 }  // namespace redfish