Modify set-value function from external

    Move Special mode from bmcweb to dbus-sensors, this will be handled via dbus-sensor when the user set-value f$
    This is unlikely to break any users because the Intel special mode function is no change, only move to dbus-s$

    The set value function is to filter the external set, excluding the internal set.
    In the external set, if in INSECURE_UNRESTRICTED_SENSOR_OVERRIDE, no need to check before set value else add $

    bmcweb needs to be merged at the same time.
    bmcweb changes are pushed to Gerrit:
    https://gerrit.openbmc-project.xyz/c/openbmc/bmcweb/+/42448

    the mailing list discussion links:
    https://lists.ozlabs.org/pipermail/openbmc/2021-March/025597.html

Signed-off-by: Bruce Lee <Bruce_Lee@quantatw.com>
Change-Id: I0919e4d2343e81045010a2b0d4bf01dc272bcb07
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 5217129..cf0ce9a 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -14,6 +14,8 @@
 // limitations under the License.
 */
 
+#include "dbus-sensor_config.h"
+
 #include <Utils.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/container/flat_map.hpp>
@@ -35,6 +37,7 @@
 
 static bool powerStatusOn = false;
 static bool biosHasPost = false;
+static bool manufacturingMode = false;
 
 static std::unique_ptr<sdbusplus::bus::match::match> powerMatch = nullptr;
 static std::unique_ptr<sdbusplus::bus::match::match> postMatch = nullptr;
@@ -504,3 +507,54 @@
     }
     return std::nullopt;
 }
+
+void setupManufacturingModeMatch(sdbusplus::asio::connection& conn)
+{
+    static std::unique_ptr<sdbusplus::bus::match::match>
+        setupManufacturingModeMatch =
+            std::make_unique<sdbusplus::bus::match::match>(
+                conn,
+                "type='signal',interface='org.freedesktop.DBus."
+                "Properties',member='"
+                "PropertiesChanged',arg0namespace='xyz.openbmc_project."
+                "Security.SpecialMode'",
+                [](sdbusplus::message::message& msg) {
+                    std::string interfaceName;
+                    boost::container::flat_map<std::string,
+                                               std::variant<std::string>>
+                        propertiesChanged;
+                    std::string manufacturingModeStatus;
+
+                    msg.read(interfaceName, propertiesChanged);
+                    if (propertiesChanged.begin() == propertiesChanged.end())
+                    {
+                        return;
+                    }
+
+                    manufacturingModeStatus = std::get<std::string>(
+                        propertiesChanged.begin()->second);
+                    manufacturingMode = false;
+                    if (manufacturingModeStatus ==
+                        "xyz.openbmc_project.Control.Security."
+                        "SpecialMode.Modes.Manufacturing")
+                    {
+                        manufacturingMode = true;
+                    }
+                    if (validateUnsecureFeature == true)
+                    {
+                        if (manufacturingModeStatus ==
+                            "xyz.openbmc_project.Control.Security."
+                            "SpecialMode.Modes.ValidationUnsecure")
+                        {
+                            manufacturingMode = true;
+                        }
+                    }
+                });
+
+    return;
+}
+
+bool getManufacturingMode()
+{
+    return manufacturingMode;
+}
\ No newline at end of file