mirror of
https://github.com/criyle/go-judge.git
synced 2025-11-04 14:50:02 +08:00
Some checks are pending
Build / Goreleaser (push) Waiting to run
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, darwin) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, linux) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (amd64_v3, windows) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, darwin) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, linux) (push) Blocked by required conditions
Build / Upload artifacts-${{ matrix.os }}-${{ matrix.arch }} (arm64_v8.0, windows) (push) Blocked by required conditions
criyle/go-sandbox#13
70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package linuxcontainer
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
|
|
"github.com/criyle/go-judge/env/pool"
|
|
"github.com/criyle/go-sandbox/container"
|
|
)
|
|
|
|
// Config specifies configuration to build environment builder
|
|
type Config struct {
|
|
Builder EnvironmentBuilder
|
|
CgroupPool CgroupPool
|
|
WorkDir string
|
|
Seccomp []syscall.SockFilter
|
|
Cpuset string
|
|
CPURate bool
|
|
CgroupFd bool // whether to enable cgroup fd with clone3, kernel >= 5.7
|
|
}
|
|
|
|
type environmentBuilder struct {
|
|
builder EnvironmentBuilder
|
|
cgPool CgroupPool
|
|
workDir string
|
|
seccomp []syscall.SockFilter
|
|
cpuset string
|
|
cpuRate bool
|
|
cgFd bool
|
|
}
|
|
|
|
// NewEnvBuilder creates builder for linux container pools
|
|
func NewEnvBuilder(c Config) pool.EnvBuilder {
|
|
return &environmentBuilder{
|
|
builder: c.Builder,
|
|
cgPool: c.CgroupPool,
|
|
workDir: c.WorkDir,
|
|
seccomp: c.Seccomp,
|
|
cpuset: c.Cpuset,
|
|
cpuRate: c.CPURate,
|
|
cgFd: c.CgroupFd,
|
|
}
|
|
}
|
|
|
|
// Build creates linux container
|
|
func (b *environmentBuilder) Build() (pool.Environment, error) {
|
|
m, err := b.builder.Build()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
wd, err := m.Open([]container.OpenCmd{{
|
|
Path: b.workDir,
|
|
Flag: syscall.O_CLOEXEC | syscall.O_DIRECTORY,
|
|
Perm: 0777,
|
|
}})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("container: failed to prepare work directory")
|
|
}
|
|
return &environ{
|
|
Environment: m,
|
|
cgPool: b.cgPool,
|
|
wd: wd[0],
|
|
workDir: b.workDir,
|
|
cpuset: b.cpuset,
|
|
cpuRate: b.cpuRate,
|
|
seccomp: b.seccomp,
|
|
cgFd: b.cgFd,
|
|
}, nil
|
|
}
|