| // Copyright 2017 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef LOGIN_MANAGER_ANDROID_OCI_WRAPPER_H_ | |
| #define LOGIN_MANAGER_ANDROID_OCI_WRAPPER_H_ | |
| #include <string> | |
| #include <vector> | |
| #include <base/functional/callback.h> | |
| #include "login_manager/container_manager_interface.h" | |
| namespace login_manager { | |
| class SystemUtils; | |
| // The wrapper class around run_oci binary to launch Android container. | |
| // See platform2/run_oci for more details about run_oci binary, which | |
| // provides an Open Container Initiative-compatible container runtime | |
| // (https://github.com/opencontainers/runtime-spec). | |
| class AndroidOciWrapper : public ContainerManagerInterface { | |
| public: | |
| // Ownership of |system_utils| remains with the caller. | |
| AndroidOciWrapper(SystemUtils* system_utils, | |
| const base::FilePath& containers_directory); | |
| AndroidOciWrapper(const AndroidOciWrapper&) = delete; | |
| AndroidOciWrapper& operator=(const AndroidOciWrapper&) = delete; | |
| ~AndroidOciWrapper() override; | |
| // ChildExitHandler: | |
| bool HandleExit(const siginfo_t& status) override; | |
| // ContainerManagerInterface: | |
| bool StartContainer(const std::vector<std::string>& env, | |
| ExitCallback exit_callback) override; | |
| void RequestJobExit(ArcContainerStopReason reason) override; | |
| void EnsureJobExit(base::TimeDelta timeout) override; | |
| bool GetContainerPID(pid_t* pid_out) const override; | |
| StatefulMode GetStatefulMode() const override; | |
| void SetStatefulMode(StatefulMode mode) override; | |
| // Relative path to container from |containers_directory_|. | |
| constexpr static char kContainerPath[] = "android"; | |
| // The container ID that is used as a directory name in | |
| // /run/containers and a log file name prefix in /var/log. | |
| constexpr static char kContainerId[] = "android-run_oci"; | |
| // Name of file containing container PID in container root under | |
| // |ContainerManagerInterface::kContainerRunPath|. run_oci writes init | |
| // process PID to this file. | |
| constexpr static char kContainerPidName[] = "container.pid"; | |
| // run_oci path and arguments. | |
| constexpr static char kRunOciPath[] = "/usr/bin/run_oci"; | |
| // Argument to setup run_oci's logging. | |
| constexpr static char kRunOciLogging[] = "--log_tag=arc-container"; | |
| // Command sent to run_oci to start the container. | |
| constexpr static char kRunOciStartCommand[] = "start"; | |
| // Command sent to run_oci to shut down container. | |
| constexpr static char kRunOciKillCommand[] = "kill"; | |
| // Argument sent to run_oci kill command to forcefully shut down a container. | |
| constexpr static char kRunOciKillSignal[] = "--signal=KILL"; | |
| // Command sent to run_oci to clean up container. | |
| constexpr static char kRunOciDestroyCommand[] = "destroy"; | |
| // Argument to specify the location of the container's config. | |
| constexpr static char kRunOciConfigPath[] = | |
| "--container_path=/opt/google/containers/android"; | |
| // Path to folder that contains all FDs this process opens. | |
| constexpr static char kProcFdPath[] = "/proc/self/fd"; | |
| private: | |
| // Sets up execution environment to launch container and run run_oci with | |
| // |env| as its environment. This is only called in child process. This | |
| // function never returns. | |
| void ExecuteRunOciToStartContainer(const std::vector<std::string>& env); | |
| // Requests Android to shut down itself. | |
| bool RequestTermination(); | |
| // Cleans up |container_pid_|, and calls |exit_callback_|. | |
| void CleanUpContainer(); | |
| // Closes all opened files inherited from session manager. Note: It leaves | |
| // stdin, stdout and stderr open. | |
| bool CloseOpenedFiles(); | |
| // Kills the specified process group with SIGKILL. | |
| void KillProcessGroup(pid_t pgid); | |
| // The PID of container's init process. | |
| pid_t container_pid_ = 0; | |
| // This is owned by the caller. | |
| SystemUtils* const system_utils_; | |
| // Directory that holds the container config files. | |
| const base::FilePath containers_directory_; | |
| // Callback that will get invoked when the process exits. | |
| ExitCallback exit_callback_; | |
| // Keeps the reason why this container is (being) stopped. | |
| login_manager::ArcContainerStopReason exit_reason_ = | |
| ArcContainerStopReason::CRASH; | |
| // Whether container is stateful or stateless. | |
| StatefulMode stateful_mode_ = StatefulMode::STATELESS; | |
| }; | |
| } // namespace login_manager | |
| #endif // LOGIN_MANAGER_ANDROID_OCI_WRAPPER_H_ |