Add "enabled" file 96/32096/3
authorLukasz Kostyra <l.kostyra@samsung.com>
Mon, 15 Dec 2014 12:25:23 +0000 (13:25 +0100)
committerJan Olszak <j.olszak@samsung.com>
Tue, 16 Dec 2014 10:33:25 +0000 (02:33 -0800)
[Feature]       File indicating that zones are running in the system.
[Cause]         Other external services (eg. security-manager) must know when
                zones are active in the system.
[Solution]      Provide "enabled" file, which will appear when zones are
                launched. The file will appear when first zone will be created,
                and file will disappear when last zone will be destroyed.
[Verification]  Build, install, run tests.

Change-Id: I634e424e28c7d449276bbe1c2c80f3cb0e35bcb7

common/utils/fs.cpp
common/utils/fs.hpp
server/zones-manager.cpp
tests/unit_tests/utils/ut-fs.cpp

index 9254f0a..3330cbf 100644 (file)
@@ -98,6 +98,19 @@ bool saveFileContent(const std::string& path, const std::string& content)
     return true;
 }
 
+bool removeFile(const std::string& path)
+{
+    LOGD(path << ": exists, removing.");
+    if (::remove(path.c_str())) {
+        if (errno != ENOENT) {
+            LOGE(path << ": failed to delete: " << ::strerror(errno));
+            return false;
+        }
+    }
+
+    return true;
+}
+
 bool isCharDevice(const std::string& path)
 {
     struct stat s;
index 91ea62a..35000c6 100644 (file)
@@ -50,6 +50,11 @@ bool readFileContent(const std::string& path, std::string& content);
 bool saveFileContent(const std::string& path, const std::string& content);
 
 /**
+ * Remove file
+ */
+bool removeFile(const std::string& path);
+
+/**
  * Checks if a char device exists
  */
 bool isCharDevice(const std::string& path);
index 981556b..402fc7f 100644 (file)
@@ -65,6 +65,7 @@ bool regexMatchVector(const std::string& str, const std::vector<boost::regex>& v
 
 const std::string HOST_ID = "host";
 const std::string ZONE_TEMPLATE_CONFIG_PATH = "template.conf";
+const std::string ENABLED_FILE_NAME = "enabled";
 
 const boost::regex ZONE_NAME_REGEX("~NAME~");
 const boost::regex ZONE_IP_THIRD_OCTET_REGEX("~IP~");
@@ -193,6 +194,14 @@ void ZonesManager::createZone(const std::string& zoneConfig)
                                         this, id, _1));
 
     mZones.insert(ZoneMap::value_type(id, std::move(c)));
+
+    // after zone is created successfully, put a file informing that zones are enabled
+    if (mZones.size() == 1) {
+        if (!utils::saveFileContent(
+                utils::createFilePath(mConfig.zonesPath, "/", ENABLED_FILE_NAME), "")) {
+            throw ZoneOperationException(ENABLED_FILE_NAME + ": cannot create.");
+        }
+    }
 }
 
 void ZonesManager::destroyZone(const std::string& zoneId)
@@ -207,6 +216,12 @@ void ZonesManager::destroyZone(const std::string& zoneId)
     // TODO give back the focus
     it->second->setDestroyOnExit();
     mZones.erase(it);
+
+    if (mZones.size() == 0) {
+        if (!utils::removeFile(utils::createFilePath(mConfig.zonesPath, "/", ENABLED_FILE_NAME))) {
+            LOGE("Failed to remove enabled file.");
+        }
+    }
 }
 
 void ZonesManager::focus(const std::string& zoneId)
index 5557e46..63b4f63 100644 (file)
@@ -88,6 +88,13 @@ BOOST_AUTO_TEST_CASE(SaveFileContentTest)
     boost::filesystem::remove(FILE_PATH_RANDOM, ec);
 }
 
+BOOST_AUTO_TEST_CASE(RemoveFileTest)
+{
+    BOOST_REQUIRE(saveFileContent(FILE_PATH_RANDOM, FILE_CONTENT));
+    BOOST_REQUIRE(removeFile(FILE_PATH_RANDOM));
+    BOOST_REQUIRE(!boost::filesystem::exists(FILE_PATH_RANDOM));
+}
+
 BOOST_AUTO_TEST_CASE(MountPointTest)
 {
     bool result;