Add functions to support lazymount 14/86314/5
authorSungbae Yoo <sungbae.yoo@samsung.com>
Mon, 5 Sep 2016 08:10:43 +0000 (17:10 +0900)
committerSungbae Yoo <sungbae.yoo@samsung.com>
Mon, 19 Sep 2016 02:32:34 +0000 (11:32 +0900)
Signed-off-by: Sungbae Yoo <sungbae.yoo@samsung.com>
Change-Id: Ide13f73d52c5340d26b5382d7dabc9ef10050b0a

module/krate-builder.cpp
module/krate-builder.h
module/krate.cpp
packaging/krate.spec

index bbb87977e63174fde8643ed7a7f4950405b46949..9a568b7a8954283cb3e59e3b28f51f67e5046ed5 100644 (file)
@@ -48,7 +48,7 @@ void KrateBuilder::bindFilesystemNode(const std::string& source, const std::stri
        runtime::Mount::mountEntry(source, target, type, options);
 }
 
-void KrateBuilder::containerize(bool create)
+void KrateBuilder::unshareNamespace()
 {
        int nsFlags = CLONE_NEWIPC | CLONE_NEWNS;
 
@@ -59,6 +59,10 @@ void KrateBuilder::containerize(bool create)
        if (::mount(NULL, "/", NULL, MS_SLAVE | MS_REC, NULL) == -1) {
                throw runtime::Exception("Failed to mount root filesystem");
        }
+}
+
+void KrateBuilder::mountOwnFilesystem() {
+       manifest.reset(xml::Parser::parseFile("/opt/etc/krate/owner.xml"));
 
        xml::Node::NodeList entries = manifest->evaluate("/manifest/filesystem/entry");
        for (const xml::Node& entry : entries) {
index 1e03ef86e14ad867a1dd170bb6fb242190807200..5bb05d5c90879de6539b87da64800fab65561a0c 100644 (file)
@@ -29,7 +29,8 @@ public:
        KrateBuilder(const runtime::User& user, const std::string& manifestPath);
        virtual ~KrateBuilder();
 
-       void containerize(bool create = true);
+       void unshareNamespace();
+       void mountOwnFilesystem();
 
 protected:
        void bindFilesystemNode(const std::string& source, const std::string& target,
index 84496cf62ffe9e0b1941edb111e41a8078f4e35a..ff216701b3ea1f314e4839e56d8397bd291a4f82 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <string>
 #include <vector>
+#include <iostream>
 
 #include "session.h"
 #include "krate-guard.h"
@@ -30,6 +31,8 @@
 #include <klay/xml/parser.h>
 #include <klay/xml/document.h>
 
+#define LAZYMOUNT_EXTERN extern
+
 std::string buildKrateManifestPath(const std::string& name)
 {
        return CONF_PATH "/" + name + ".xml";
@@ -46,31 +49,58 @@ std::string getKrateName(pam_handle_t* handle)
        return static_cast<const char*>(retItem);
 }
 
-void openKrateSession(const std::string& name)
-{
-       auto sessionBuilder = [](const runtime::User& user) {
-               KrateBuilder builder(user, buildKrateManifestPath(user.getName()));
-               builder.containerize();
-       };
+extern "C" {
+LAZYMOUNT_EXTERN  __attribute__((visibility("default")))
+int container_preprocess(char* id) {
+       std::cout << "kraterize (UID " << id << ")..." << std::endl << std::flush;
+       try {
+               runtime::User user(std::stoi(std::string(id)));
+               KrateGuard krateGuard(user.getName());
+               krateGuard.wait();
 
-       createSession(runtime::User(name), sessionBuilder);
+               auto sessionBuilder = [](const runtime::User& user) {
+                       KrateBuilder builder(user, buildKrateManifestPath(user.getName()));
+                       builder.unshareNamespace();
+               };
+               createSession(user, sessionBuilder);
+       } catch (runtime::Exception& e) {
+               std::cerr << "krate error : " << e.what() <<std::endl << std::flush;
+               return -1;
+       }
+
+       std::cout << "krate preprocess completed!" << std::endl << std::flush;
+       return 0;
 }
 
-void closeKrateSession(const std::string& name)
-{
-       destroySession(runtime::User(name));
+LAZYMOUNT_EXTERN  __attribute__((visibility("default")))
+int container_postprocess(char* id) {
+       try {
+               runtime::User user(std::stoi(std::string(id)));
+               KrateBuilder builder(user, buildKrateManifestPath(user.getName()));
+               builder.mountOwnFilesystem();
+       } catch (runtime::Exception& e) {
+               std::cerr << "krate error : " << e.what() << std::endl << std::flush;
+               return -1;
+       }
+       std::cout << "krate postprocess completed!" << std::endl << std::flush;
+       std::cout << "kraterized!" << std::endl << std::flush;
+       return 0;
 }
 
-extern "C" {
 PAM_EXTERN  __attribute__((visibility("default")))
 int pam_sm_open_session(pam_handle_t* pamh, int flags, int argc, const char* argv[])
 {
        try {
-               std::string name = getKrateName(pamh);
-               KrateGuard krateGuard(name);
+               runtime::User user(getKrateName(pamh));
+               KrateGuard krateGuard(user.getName());
                krateGuard.wait();
 
-               openKrateSession(name);
+               auto sessionBuilder = [](const runtime::User& user) {
+                       KrateBuilder builder(user, buildKrateManifestPath(user.getName()));
+                       builder.unshareNamespace();
+                       builder.mountOwnFilesystem();
+               };
+               createSession(user, sessionBuilder);
        } catch (runtime::Exception& e) {
                ::pam_syslog(pamh, LOG_ERR, "%s", e.what());
                return PAM_SESSION_ERR;
@@ -83,11 +113,11 @@ PAM_EXTERN  __attribute__((visibility("default")))
 int pam_sm_close_session(pam_handle_t* pamh, int flags, int argc, const char* argv[])
 {
        try {
-               std::string name = getKrateName(pamh);
-               KrateGuard krateGuard(name);
+               runtime::User user(getKrateName(pamh));
+               KrateGuard krateGuard(user.getName());
                krateGuard.wait();
 
-               closeKrateSession(name);
+               destroySession(user);
        } catch (runtime::Exception& e) {
                ::pam_syslog(pamh, LOG_ERR, "%s", e.what());
                return PAM_SESSION_ERR;
index 2ee728956863350c054123ef56fe9fda15b20b79..bf3a23c7dbe36db89f5c5dcb1cfb301cb44deb22 100644 (file)
@@ -44,7 +44,7 @@ krates.
 %attr(644,root,root) %{TZ_SYS_RO_ICONS}/krate/notification_sub_icon.png
 %attr(700,root,root) %dir %{TZ_SYS_ETC}/krate
 %attr(600,root,root) %config %{TZ_SYS_ETC}/krate/owner.xml
-%attr(700,root,root) %{_libdir}/security/pam_*.so
+%attr(755,root,root) %{_libdir}/security/pam_krate.so
 %attr(700,root,root) %{_sbindir}/krate-admin-cli
 %config /etc/pam.d/*