rsyslogd: don't start without actions

Rsyslog is currently used only for remote logging. The daemon would run
though (started by systemd) even when remote logging has not been
configured. In other words, it would run without any actions.

With Yocto 2.6, rsyslogd won't run without any actions. Hence, rsyslogd
is now started only on the condition that the remote logging config
file is present.

Change-Id: Iae11d6912e60765ecb774b663d44b4e3c6f381a3
Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
diff --git a/phosphor-rsyslog-config/Makefile.am b/phosphor-rsyslog-config/Makefile.am
index 806e30b..438a745 100644
--- a/phosphor-rsyslog-config/Makefile.am
+++ b/phosphor-rsyslog-config/Makefile.am
@@ -15,7 +15,8 @@
 
 phosphor_rsyslog_conf_LDFLAGS = \
 	$(SDBUSPLUS_LIBS) \
-	$(PHOSPHOR_DBUS_INTERFACES_LIBS)
+	$(PHOSPHOR_DBUS_INTERFACES_LIBS) \
+	-lstdc++fs
 
 phosphor_rsyslog_conf_CXXFLAGS = \
 	$(SDBUSPLUS_CFLAGS) \
diff --git a/phosphor-rsyslog-config/server-conf.cpp b/phosphor-rsyslog-config/server-conf.cpp
index 836e83b..e8da82e 100644
--- a/phosphor-rsyslog-config/server-conf.cpp
+++ b/phosphor-rsyslog-config/server-conf.cpp
@@ -15,6 +15,19 @@
 
 #include <string>
 
+#if __has_include(<filesystem>)
+#include <filesystem>
+#elif __has_include(<experimental/filesystem>)
+#include <experimental/filesystem>
+namespace std
+{
+// splice experimental::filesystem into std
+namespace filesystem = std::experimental::filesystem;
+} // namespace std
+#else
+#error filesystem not available
+#endif
+
 namespace phosphor
 {
 namespace rsyslog_config
@@ -23,6 +36,7 @@
 namespace utils = phosphor::rsyslog_utils;
 using namespace phosphor::logging;
 using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+namespace fs = std::filesystem;
 
 std::string Server::address(std::string value)
 {
@@ -103,8 +117,7 @@
     }
     else // this is a disable request
     {
-        // write '#*.* @@remote-host:port'
-        stream << "#*.* @@remote-host:port";
+        fs::remove(filePath);
     }
 
     restart();
@@ -130,6 +143,11 @@
 
 void Server::restore(const char* filePath)
 {
+    if (!fs::exists(filePath))
+    {
+        return;
+    }
+
     std::fstream stream(filePath, std::fstream::in);
     std::string line;
 
diff --git a/test/remote_logging_test_config.cpp b/test/remote_logging_test_config.cpp
index a4c6207..b34a43f 100644
--- a/test/remote_logging_test_config.cpp
+++ b/test/remote_logging_test_config.cpp
@@ -3,6 +3,19 @@
 #include <fstream>
 #include <string>
 
+#if __has_include(<filesystem>)
+#include <filesystem>
+#elif __has_include(<experimental/filesystem>)
+#include <experimental/filesystem>
+namespace std
+{
+// splice experimental::filesystem into std
+namespace filesystem = std::experimental::filesystem;
+} // namespace std
+#else
+#error filesystem not available
+#endif
+
 namespace phosphor
 {
 namespace logging
@@ -21,13 +34,13 @@
 TEST_F(TestRemoteLogging, testOnlyAddress)
 {
     config->address("1.1.1.1");
-    EXPECT_EQ(getConfig(configFilePath.c_str()), "#*.* @@remote-host:port");
+    EXPECT_EQ(fs::exists(configFilePath.c_str()), false);
 }
 
 TEST_F(TestRemoteLogging, testOnlyPort)
 {
     config->port(100);
-    EXPECT_EQ(getConfig(configFilePath.c_str()), "#*.* @@remote-host:port");
+    EXPECT_EQ(fs::exists(configFilePath.c_str()), false);
 }
 
 TEST_F(TestRemoteLogging, testGoodConfig)
@@ -43,7 +56,7 @@
     config->port(100);
     EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* @@1.1.1.1:100");
     config->address("");
-    EXPECT_EQ(getConfig(configFilePath.c_str()), "#*.* @@remote-host:port");
+    EXPECT_EQ(fs::exists(configFilePath.c_str()), false);
 }
 
 TEST_F(TestRemoteLogging, testClearPort)
@@ -52,7 +65,7 @@
     config->port(100);
     EXPECT_EQ(getConfig(configFilePath.c_str()), "*.* @@1.1.1.1:100");
     config->port(0);
-    EXPECT_EQ(getConfig(configFilePath.c_str()), "#*.* @@remote-host:port");
+    EXPECT_EQ(fs::exists(configFilePath.c_str()), false);
 }
 
 } // namespace test