Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ jobs:
- name: Checkout submodules
uses: actions/[email protected]
with:
submodules: true
submodules: recursive

- name: Install Dependencies
run: sudo apt install libcurl4-openssl-dev

- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@
url = ../../pybind/pybind11
branch = stable

[submodule "extern/DockerClient"]
path = extern/DockerClient
url = [email protected]:piotr-maker/DockerClient.git
11 changes: 8 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@ cmake_minimum_required(VERSION 3.22)
project(container-lib)
set(CMAKE_CXX_STANDARD 17)

include_directories(include)
# add_library(container-lib src/container-lib.cpp src/cgroups.c)
#creates container-lib
add_library(container-lib src/container-lib.cpp src/cgroups.cpp)
add_executable(test_exec main.cpp)
target_link_libraries(test_exec container-lib)

#creates docker-lib
#include_directories(include extern/DockerClient/include/ extern/DockerClient/rapidjson/include/) #этой строки быть не должно, костыль, чтобы собиралось
add_subdirectory(extern/DockerClient)
add_library(docker-lib src/docker-lib.cpp)

#adds pybind
add_subdirectory(extern/pybind11)
pybind11_add_module(container_lib_py src/wrapper.cpp src/container-lib.cpp src/cgroups.cpp)
pybind11_add_module(container_lib_py src/wrapper.cpp src/container-lib.cpp src/cgroups.cpp)
5 changes: 5 additions & 0 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
system that smells *bebra* and gives rating for it
![alt text](https://media.istockphoto.com/id/182203609/ru/%D1%84%D0%BE%D1%82%D0%BE/%D0%BF%D0%B0%D0%BB%D0%B5%D1%86-%D0%B2%D0%B2%D0%B5%D1%80%D1%85.jpg?s=1024x1024&w=is&k=20&c=f1IwGeHj3E52Cmif8WhdDxL2qcnGGaJvQARQ43RiMIo=) testing jew

## Dependences
- [pybind11](https://github.com/pybind/pybind11)
- libcurl4-openssl-dev
- [Docker-Client](https://github.com/piotr-maker/DockerClient/tree/8af68f7b5d2283f766b3c2e8161ae423ec105aa3)

## Features
- our project :)
- blackjack
Expand Down
10 changes: 10 additions & 0 deletions docker_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include "docker-lib/docker-lib.hpp"
#include <iostream>

using namespace std;

int main() {
DockerLib::container cont;
cont.init_container();
return 0;
}
1 change: 1 addition & 0 deletions extern/DockerClient
Submodule DockerClient added at 8af68f
17 changes: 17 additions & 0 deletions include/docker-lib/docker-lib.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include "docker-cpp/docker.h"
#include <iostream>

namespace DockerLib {

class container {
private:
//void init_container();
void delete_container();

public:
void init_container();
void start(std::string path_to_program, std::string args);
std::string get_output();
};

} // namespace DockerLib
3 changes: 2 additions & 1 deletion main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

int main(int argc, char *argv[]) {
ContainerLib::Container cont;
cont.start(argv[1], {0, 0, 10, "test", 50000, "container-lib",0.1}, "", {});
cont.start(argv[1], {0, 0, 10, "test", 50000, "container-lib", 0.1}, "",
{});
cont.sync("container-lib");
std::string str = cont.get_buf();
std::cout << std::endl << "OUTPUT:: " << str << std::endl;
Expand Down
31 changes: 19 additions & 12 deletions src/container-lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
#include "container-lib/cgroups.hpp"
#include <random>

void ContainerLib::Container::ptrace_process(launch_options options, std::set<Syscall> forbidden_syscalls) {
void ContainerLib::Container::ptrace_process(
launch_options options, std::set<Syscall> forbidden_syscalls) {
int status, exit_status;
waitpid(slave_proc, &status, 0);

Expand Down Expand Up @@ -44,13 +45,13 @@ void ContainerLib::Container::ptrace_process(launch_options options, std::set<Sy
write(pipe_for_exit_status[1], &return_status,
sizeof(exit_status));
return;
}
else {
} else {
if (fork() == 0) {
slave_proc = state.rax;
ptrace(PTRACE_ATTACH, slave_proc, 0, 0);
waitpid(slave_proc, &status, 0);
ptrace(PTRACE_SETOPTIONS, slave_proc, 0, PTRACE_O_TRACESYSGOOD);
ptrace(PTRACE_SETOPTIONS, slave_proc, 0,
PTRACE_O_TRACESYSGOOD);
}
}
break;
Expand All @@ -65,13 +66,13 @@ void ContainerLib::Container::ptrace_process(launch_options options, std::set<Sy
write(pipe_for_exit_status[1], &return_status,
sizeof(exit_status));
return;
}
else {
} else {
if (fork() == 0) {
slave_proc = state.rax;
ptrace(PTRACE_ATTACH, slave_proc, 0, 0);
waitpid(slave_proc, &status, 0);
ptrace(PTRACE_SETOPTIONS, slave_proc, 0, PTRACE_O_TRACESYSGOOD);
ptrace(PTRACE_SETOPTIONS, slave_proc, 0,
PTRACE_O_TRACESYSGOOD);
}
}
break;
Expand Down Expand Up @@ -239,24 +240,29 @@ void ContainerLib::Container::ptrace_process(launch_options options, std::set<Sy
exit(exit_status);
}

void ContainerLib::Container::start(std::string path_to_binary, launch_options options, std::string args, std::set<Syscall> forbidden_syscalls) {
void ContainerLib::Container::start(std::string path_to_binary,
launch_options options, std::string args,
std::set<Syscall> forbidden_syscalls) {
std::random_device r;
std::default_random_engine e(r());
std::uniform_int_distribution<int> uniform_dist(0, 16);
int coreCPU = uniform_dist(e);
init_cgroup(options.memory, options.cpu_usage, options.cgroup_id.c_str(), coreCPU);
init_cgroup(options.memory, options.cpu_usage, options.cgroup_id.c_str(),
coreCPU);
pipe_init();
ptrace_proc = fork();
if (ptrace_proc != 0) {
close(pipe_for_exit_status[1]);
return;
} else {
close(pipe_for_exit_status[0]);
create_processes(std::move(path_to_binary), std::move(args), options, forbidden_syscalls);
create_processes(std::move(path_to_binary), std::move(args), options,
forbidden_syscalls);
}
}

ContainerLib::Container::ExitStatus ContainerLib::Container::sync(const char cgroup_id[20]) {
ContainerLib::Container::ExitStatus
ContainerLib::Container::sync(const char cgroup_id[20]) {
int ptrace_status;
waitpid(ptrace_proc, &ptrace_status, 0);
ExitStatus status;
Expand All @@ -270,7 +276,8 @@ ContainerLib::Container::ExitStatus ContainerLib::Container::sync(const char cgr

void ContainerLib::Container::create_processes(
std::string path_to_binary, std::string args,
ContainerLib::Container::launch_options options, std::set<Syscall> forbidden_syscalls) {
ContainerLib::Container::launch_options options,
std::set<Syscall> forbidden_syscalls) {
slave_proc = fork();
if (slave_proc != 0) {
ptrace_process(options, forbidden_syscalls);
Expand Down
14 changes: 14 additions & 0 deletions src/docker-lib.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#include "docker-lib/docker-lib.hpp"

void DockerLib::container::init_container() {
Docker client = Docker();
/*JSON_DOCUMENT doc = client.list_containers(true);
std::cout << jsonToString(doc) << std::endl;*/
std::cout << "HELLO, I`M DOCKER!" << std::endl;
}

void DockerLib::container::delete_container() {}

void DockerLib::container::start(std::string path_to_program, std::string args) {}

std::string DockerLib::container::get_output() {return "";}
5 changes: 2 additions & 3 deletions src/wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ PYBIND11_MODULE(container_lib_py, m) {
"starts containerization process. Launch options struct: int time "
"- start time, int forks_amount - Amount of sub-processes, int "
"forks_threshold - Maximum amount of sub-processes")
.def("get_buf", &Container::get_buf, "get buf");
.def("get_buf", &Container::get_buf, "get buf");

py::enum_<Container::ExitStatus>(container, "ExitStatus")
.value("ok", Container::ExitStatus::ok)
.value("compilation_error", Container::ExitStatus::compilation_error)
Expand Down Expand Up @@ -44,5 +44,4 @@ PYBIND11_MODULE(container_lib_py, m) {
.def_readwrite("memory", &Container::launch_options::memory)
.def_readwrite("cgroup_id", &Container::launch_options::cgroup_id)
.def_readwrite("input", &Container::launch_options::input);

}