Fork Vasum on GitHub Official Vasum Wiki on Tizen.org
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
container-impl.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License version 2.1 as published by the Free Software Foundation.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public
14  * License along with this library; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16  */
17 
24 #ifndef LXCPP_CONTAINER_IMPL_HPP
25 #define LXCPP_CONTAINER_IMPL_HPP
26 
27 #include <sys/types.h>
28 #include <memory>
29 
31 #include "lxcpp/container.hpp"
32 #include "lxcpp/namespace.hpp"
33 #include "lxcpp/guard/api.hpp"
34 
35 #include "utils/inotify.hpp"
36 
38 #include "cargo-ipc/client.hpp"
39 #include "cargo-ipc/exception.hpp"
40 
41 namespace lxcpp {
42 
43 class ContainerImpl : public virtual Container {
44 public:
45  ContainerImpl(const std::string &name,
46  const std::string &rootPath,
47  const std::string &workPath);
49 
50  // Configuration
51  const std::string& getName() const;
52  const std::string& getRootPath() const;
53  void setHostName(const std::string& hostname);
54 
55  pid_t getGuardPid() const;
56  pid_t getInitPid() const;
57 
58  const std::vector<std::string>& getInit();
59  void setInit(const std::vector<std::string> &init);
60 
61  void setLogger(const logger::LogType type,
62  const logger::LogLevel level,
63  const std::string &arg);
64 
65  void setTerminalCount(const unsigned int count);
66 
67  void addUIDMap(unsigned min, unsigned max, unsigned num);
68  void addGIDMap(unsigned min, unsigned max, unsigned num);
69 
70  // Execution actions
71  void start();
72  void stop();
73  void freeze();
74  void unfreeze();
75  void reboot();
76 
77  // State
79  void setStartedCallback(const Container::Callback& callback);
80  void setStoppedCallback(const Container::Callback& callback);
81 
82  // Other
83  int attach(const std::vector<std::string>& argv,
84  const uid_t uid,
85  const gid_t gid,
86  const std::string& ttyPath,
87  const std::vector<gid_t>& supplementaryGids,
88  const int capsToKeep,
89  const std::string& workDirInContainer,
90  const std::vector<std::string>& envToKeep,
91  const std::vector<std::pair<std::string, std::string>>& envToSet);
92  void console();
93 
94  // Network interfaces setup/config
99  void addInterfaceConfig(const std::string& hostif,
100  const std::string& zoneif,
101  InterfaceType type,
102  const std::vector<InetAddr>& addrs,
103  MacVLanMode mode);
104  void addInetConfig(const std::string& ifname, const InetAddr& addr);
105 
106  // Network interfaces (runtime)
107  std::vector<std::string> getInterfaces() const;
108  NetworkInterfaceInfo getInterfaceInfo(const std::string& ifname) const;
109  void createInterface(const std::string& hostif,
110  const std::string& zoneif,
111  InterfaceType type,
112  MacVLanMode mode);
113  void moveInterface(const std::string& ifname);
114  void destroyInterface(const std::string& ifname);
115  void setUpInterface(const std::string& ifname);
116  void setDownInterface(const std::string& ifname);
117  void addInetAddr(const std::string& ifname, const InetAddr& addr);
118  void delInetAddr(const std::string& ifname, const InetAddr& addr);
119 
120  // Provisioning
121  void declareFile(const provision::File::Type type,
122  const std::string& path,
123  const int32_t flags,
124  const int32_t mode);
125  const FileVector& getFiles() const;
126  void removeFile(const provision::File& item);
127 
128  void declareMount(const std::string& source,
129  const std::string& target,
130  const std::string& type,
131  const int64_t flags,
132  const std::string& data);
133  const MountVector& getMounts() const;
134  void removeMount(const provision::Mount& item);
135 
136  void declareLink(const std::string& source,
137  const std::string& target);
138  const LinkVector& getLinks() const;
139  void removeLink(const provision::Link& item);
140 
141  // CGroups
142  void addSubsystem(const std::string& name, const std::string& path);
143  void addCGroup(const std::string& subsys,
144  const std::string& grpname,
145  const std::vector<CGroupParam>& comm,
146  const std::vector<CGroupParam>& params);
147 
148  // Environment variables
149  void setEnv(const std::vector<std::pair<std::string, std::string>>& variables);
150 
151  // Linux capabilities
152  void setCaps(const int caps);
153 
154  // System Property (sysctl)
155  void setSystemProperty(const std::string& name, const std::string& value);
156 
157  // Rlimit
158  void setRlimit(const std::string& type, const uint64_t hard, const uint64_t soft);
159 
160  // Namespaces
161  void setNamespaces(const int namespaces);
162 
163  // UID/GIDS
164  void setUser(const int uid, const int gid, const std::vector<int> additionalGids);
165 
166  // Device
167  void addDevice(const std::string& path,
168  const char type,
169  const int64_t major,
170  const int64_t minor,
171  const std::string& permissions,
172  const uint32_t fileMode,
173  const uint32_t uid,
174  const uint32_t gid);
175 
176  // Hooks
177  void addHook(const std::string& type,
178  const std::vector<std::string>& hook,
179  const std::vector<std::pair<std::string, std::string>>& env);
180 
181 
182 private:
183  typedef std::unique_lock<std::mutex> Lock;
184  mutable std::mutex mStateMutex;
185 
186  std::shared_ptr<ContainerConfig> mConfig;
187 
189 
190  std::shared_ptr<cargo::ipc::Client> mClient;
192 
193  // Callbacks
196 
197  void onWorkFileEvent(const std::string& name, const uint32_t mask);
198 
204  bool onGuardReady(const cargo::ipc::PeerID,
205  std::shared_ptr<api::Void>&,
207 
215  std::shared_ptr<api::ExitStatus>& data,
217 };
218 
219 } // namespace lxcpp
220 
221 #endif // LXCPP_CONTAINER_IMPL_HPP
const LinkVector & getLinks() const
Definition: container-impl.cpp:620
const std::string & getRootPath() const
Definition: container-impl.cpp:132
std::shared_ptr< ContainerConfig > mConfig
Definition: container-impl.hpp:186
pid_t getInitPid() const
Definition: container-impl.cpp:180
std::shared_ptr< MethodResult > Pointer
Definition: method-result.hpp:47
std::function< void(void)> Callback
Definition: container.hpp:51
void setHostName(const std::string &hostname)
Definition: container-impl.cpp:140
Will dispatch poll events in a newly created thread.
Definition: thread-dispatcher.hpp:41
std::string PeerID
Definition: types.hpp:45
void setCaps(const int caps)
Linux capabilities.
Definition: container-impl.cpp:661
Provision configuration items.
Definition: provision-config.hpp:43
void addHook(const std::string &type, const std::vector< std::string > &hook, const std::vector< std::pair< std::string, std::string >> &env)
Hooks.
Definition: container-impl.cpp:698
process handling routines
void setInit(const std::vector< std::string > &init)
Definition: container-impl.cpp:152
void delInetAddr(const std::string &ifname, const InetAddr &addr)
Definition: container-impl.cpp:524
Type
Definition: provision-config.hpp:45
void addCGroup(const std::string &subsys, const std::string &grpname, const std::vector< CGroupParam > &comm, const std::vector< CGroupParam > &params)
Definition: container-impl.cpp:646
const FileVector & getFiles() const
Definition: container-impl.cpp:549
void setRlimit(const std::string &type, const uint64_t hard, const uint64_t soft)
Rlimit.
Definition: container-impl.cpp:671
Unified ip address.
Definition: network.hpp:56
cargo::ipc::epoll::ThreadDispatcher mDispatcher
Definition: container-impl.hpp:188
void onWorkFileEvent(const std::string &name, const uint32_t mask)
Definition: container-impl.cpp:110
void setEnv(const std::vector< std::pair< std::string, std::string >> &variables)
Environment variables.
Definition: container-impl.cpp:656
Definition: container.hpp:49
std::vector< std::string > getInterfaces() const
Network interfaces (runtime)
Definition: container-impl.cpp:438
Definition: container-impl.hpp:43
IPC messages declaration.
void declareMount(const std::string &source, const std::string &target, const std::string &type, const int64_t flags, const std::string &data)
Definition: container-impl.cpp:568
std::unique_lock< std::mutex > Lock
Definition: container-impl.hpp:183
NetworkInterfaceInfo getInterfaceInfo(const std::string &ifname) const
Definition: container-impl.cpp:445
void moveInterface(const std::string &ifname)
Definition: container-impl.cpp:492
utils::Inotify mInotify
Definition: container-impl.hpp:191
void unfreeze()
Definition: container-impl.cpp:340
void removeLink(const provision::Link &item)
Definition: container-impl.cpp:627
std::vector< provision::Mount > MountVector
Definition: provision-config.hpp:139
Definition: provision-config.hpp:81
void setNamespaces(const int namespaces)
Namespaces TODO Needed to implement application container.
Definition: container-impl.cpp:676
void freeze()
Definition: container-impl.cpp:332
Definition: container.hpp:40
void setSystemProperty(const std::string &name, const std::string &value)
System Property (sysctl)
Definition: container-impl.cpp:666
Container::Callback mStoppedCallback
Definition: container-impl.hpp:195
const std::string & getName() const
Configuration.
Definition: container-impl.cpp:125
void removeMount(const provision::Mount &item)
Definition: container-impl.cpp:593
void addDevice(const std::string &path, const char type, const int64_t major, const int64_t minor, const std::string &permissions, const uint32_t fileMode, const uint32_t uid, const uint32_t gid)
Device.
Definition: container-impl.cpp:686
char data[368]
Definition: initctl.cpp:41
LogLevel
Available log levels.
Definition: level.hpp:36
void setStartedCallback(const Container::Callback &callback)
Definition: container-impl.cpp:362
~ContainerImpl()
Definition: container-impl.cpp:100
void addInterfaceConfig(const std::string &hostif, const std::string &zoneif, InterfaceType type, const std::vector< InetAddr > &addrs, MacVLanMode mode)
adds interface configration.
Definition: container-impl.cpp:419
std::mutex mStateMutex
Definition: container-impl.hpp:184
std::vector< provision::File > FileVector
Definition: provision-config.hpp:138
void setUpInterface(const std::string &ifname)
Definition: container-impl.cpp:500
const MountVector & getMounts() const
Definition: container-impl.cpp:586
State
Definition: container.hpp:53
bool onInitStopped(const cargo::ipc::PeerID, std::shared_ptr< api::ExitStatus > &data, cargo::ipc::MethodResult::Pointer)
Guards tells that Init exited with some status.
Definition: container-impl.cpp:313
void createInterface(const std::string &hostif, const std::string &zoneif, InterfaceType type, MacVLanMode mode)
Definition: container-impl.cpp:473
void declareLink(const std::string &source, const std::string &target)
Definition: container-impl.cpp:605
void destroyInterface(const std::string &ifname)
Definition: container-impl.cpp:484
void addUIDMap(unsigned min, unsigned max, unsigned num)
Definition: container-impl.cpp:209
void addGIDMap(unsigned min, unsigned max, unsigned num)
Definition: container-impl.cpp:224
pid_t getGuardPid() const
Definition: container-impl.cpp:173
bool onGuardReady(const cargo::ipc::PeerID, std::shared_ptr< api::Void > &, cargo::ipc::MethodResult::Pointer)
Guards tells that it's ready to receive commands.
Definition: container-impl.cpp:256
Container::Callback mStartedCallback
Definition: container-impl.hpp:194
Inotify monitors a directory and when a specified file or folder is created or deleted it calls a cor...
Definition: inotify.hpp:43
void setUser(const int uid, const int gid, const std::vector< int > additionalGids)
UID/GIDS TODO Needed to implement application container.
Definition: container-impl.cpp:681
void setStoppedCallback(const Container::Callback &callback)
Definition: container-impl.cpp:369
void addSubsystem(const std::string &name, const std::string &path)
CGroups.
Definition: container-impl.cpp:639
void setDownInterface(const std::string &ifname)
Definition: container-impl.cpp:508
Container interface.
void console()
Definition: container-impl.cpp:411
void addInetAddr(const std::string &ifname, const InetAddr &addr)
Definition: container-impl.cpp:516
void removeFile(const provision::File &item)
Definition: container-impl.cpp:556
Thread epoll dispatcher.
MacVLanMode
Suported MacVLan modes.
Definition: network.hpp:188
ContainerImpl(const std::string &name, const std::string &rootPath, const std::string &workPath)
Definition: container-impl.cpp:55
void stop()
Definition: container-impl.cpp:296
Inotify wrapper.
LogType
Definition: logger.hpp:82
Container::State getState()
States.
Definition: container-impl.cpp:355
int attach(const std::vector< std::string > &argv, const uid_t uid, const gid_t gid, const std::string &ttyPath, const std::vector< gid_t > &supplementaryGids, const int capsToKeep, const std::string &workDirInContainer, const std::vector< std::string > &envToKeep, const std::vector< std::pair< std::string, std::string >> &envToSet)
Other.
Definition: container-impl.cpp:376
void reboot()
Definition: container-impl.cpp:347
InterfaceType
Created interface type.
Definition: network.hpp:179
Exceptions for the IPC.
void declareFile(const provision::File::Type type, const std::string &path, const int32_t flags, const int32_t mode)
Provisioning.
Definition: container-impl.cpp:532
void setLogger(const logger::LogType type, const logger::LogLevel level, const std::string &arg)
Definition: container-impl.cpp:187
void setTerminalCount(const unsigned int count)
Definition: container-impl.cpp:196
void start()
Execution actions.
Definition: container-impl.cpp:239
A definition of a ContainerConfig struct.
std::shared_ptr< cargo::ipc::Client > mClient
Definition: container-impl.hpp:190
const std::vector< std::string > & getInit()
Definition: container-impl.cpp:145
void addInetConfig(const std::string &ifname, const InetAddr &addr)
Definition: container-impl.cpp:431
std::vector< provision::Link > LinkVector
Definition: provision-config.hpp:140