Documentation
¶
Overview ¶
Package envexec provides utility function to run program in restricted environments through container and cgroup.
Cmd ¶
Cmd defines single program to run, including copyin files before exec, run the program and copy out files after exec
## Single
Single defines single Cmd with Environment and Cgroup Pool
## Group
Group defines multiple Cmd with Environment and Cgroup Pool, together with Pipe mapping between different Cmd
Index ¶
- func FileToReader(f File) (io.ReadCloser, error)
- type Cmd
- type CmdCopyOutFile
- type Environment
- type ExecveParam
- type File
- type FileCollector
- type FileError
- type FileErrorType
- type FileInput
- type FileOpened
- type FileReader
- type FileStreamIn
- type FileStreamOut
- type FileWriter
- type Group
- type Limit
- type NewStoreFile
- type Pipe
- type PipeIndex
- type Process
- type Result
- type RunnerResult
- type Single
- type Size
- type Status
- type TerminalSize
- type Usage
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func FileToReader ¶ added in v1.1.0
func FileToReader(f File) (io.ReadCloser, error)
FileToReader get a Reader from underlying file the reader need to be closed by caller explicitly
Types ¶
type Cmd ¶
type Cmd struct { Environment Environment // file contents to copyin before exec CopyIn map[string]File // symbolic link to be created before exec SymLinks map[string]string // exec argument, environment Args []string Env []string // Files for the executing command Files []File TTY bool // use pty as input / output // resource limits TimeLimit time.Duration MemoryLimit Size StackLimit Size ExtraMemoryLimit Size OutputLimit Size ProcLimit uint64 OpenFileLimit uint64 CPURateLimit uint64 CPUSetLimit string // Waiter is called after cmd starts and it should return // once time limit exceeded. // return true to as TLE and false as normal exits (context finished) Waiter func(context.Context, Process) bool // file names to copyout after exec CopyOut []CmdCopyOutFile CopyOutMax Size // file size limit // CopyOutDir specifies a dir to dump all /w content CopyOutDir string // additional memory option AddressSpaceLimit bool DataSegmentLimit bool }
Cmd defines instruction to run a program in container environment
type CmdCopyOutFile ¶ added in v1.2.0
type CmdCopyOutFile struct { Name string // Name is the file out to copyOut Optional bool // Optional ignores the file if not exists }
CmdCopyOutFile defines the file to be copy out after cmd execution
type Environment ¶
type Environment interface { Execve(context.Context, ExecveParam) (Process, error) WorkDir() *os.File // WorkDir returns opened work directory, should not close after // Open open file at work dir with given relative path and flags Open(path string, flags int, perm os.FileMode) (*os.File, error) // Make dir creates directory inside the container MkdirAll(path string, perm os.FileMode) error // Make symbolic link for a file / directory Symlink(oldName, newName string) error }
Environment defines the interface to access container execution environment
type ExecveParam ¶
type ExecveParam struct { // Args holds command line arguments Args []string // Env specifies the environment of the process Env []string // Files specifies file descriptors for the child process Files []uintptr // ExecFile specifies file descriptor for executable file using fexecve ExecFile uintptr // TTY specifies whether to use TTY TTY bool // Process Limitations Limit Limit }
ExecveParam is parameters to run process inside environment
type File ¶ added in v1.1.0
type File interface {
// contains filtered or unexported methods
}
File defines interface of envexec files
func NewFileCollector ¶ added in v1.3.1
NewFileCollector creates file output which will be collected through pipe
func NewFileInput ¶ added in v1.1.0
NewFileInput creates file input which will be opened in read-only mode
func NewFileOpened ¶ added in v1.1.0
NewFileOpened creates file that contains already opened file and it will be closed
func NewFileReader ¶ added in v1.1.0
NewFileReader creates File input which can be fully read before exec. If pipe is required, use the FileStream to get the write end of pipe instead
type FileCollector ¶ added in v1.3.1
FileCollector represent pipe output which will be collected through pipe
type FileError ¶ added in v1.3.2
type FileError struct { Name string `json:"name"` Type FileErrorType `json:"type"` Message string `json:"message,omitempty"` }
FileError defines the location, file name and the detailed message for a failed file operation
type FileErrorType ¶ added in v1.3.2
type FileErrorType int
FileErrorType defines the location that file operation fails
const ( ErrCopyInOpenFile FileErrorType = iota ErrCopyInCreateDir ErrCopyInCreateFile ErrCopyInCopyContent ErrCopyOutOpen ErrCopyOutNotRegularFile ErrCopyOutSizeExceeded ErrCopyOutCreateFile ErrCopyOutCopyContent ErrCollectSizeExceeded ErrSymlink )
FileError enums
func (FileErrorType) MarshalJSON ¶ added in v1.3.2
func (t FileErrorType) MarshalJSON() ([]byte, error)
MarshalJSON encodes file error into json string
func (FileErrorType) String ¶ added in v1.3.2
func (t FileErrorType) String() string
func (*FileErrorType) UnmarshalJSON ¶ added in v1.3.2
func (t *FileErrorType) UnmarshalJSON(b []byte) error
UnmarshalJSON decodes file error from json string
type FileInput ¶ added in v1.1.0
type FileInput struct {
Path string
}
FileInput represent file input which will be opened in read-only mode
type FileOpened ¶ added in v1.1.0
FileOpened represent file that is already opened
type FileReader ¶ added in v1.1.0
FileReader represent file input which can be fully read before exec or piped into exec
type FileStreamIn ¶ added in v1.9.4
type FileStreamIn interface { File io.WriteCloser SetSize(*TerminalSize) error }
FileStreamIn represent a input streaming pipe and the streamer is able to write to the write end of the pipe after pipe created. It is the callers responsibility to close the WritePipe
func NewFileStreamIn ¶ added in v1.9.4
func NewFileStreamIn() FileStreamIn
type FileStreamOut ¶ added in v1.9.4
type FileStreamOut interface { File io.ReadCloser }
FileStreamOut represent a out streaming pipe and the streamer is able to read to the read end of the pipe after pipe created. It is the callers responsibility to close the ReadPipe
func NewFileStreamOut ¶ added in v1.9.4
func NewFileStreamOut() FileStreamOut
type FileWriter ¶ added in v1.1.0
FileWriter represent pipe output which will be piped out from exec
type Group ¶
type Group struct { // Cmd defines Cmd running in parallel in multiple environments Cmd []*Cmd // Pipes defines the potential mapping between Cmd. // ensure nil is used as placeholder in correspond cmd Pipes []Pipe // NewStoreFile defines interface to create stored file NewStoreFile NewStoreFile }
Group defines the running instruction to run multiple exec in parallel restricted within cgroup
type Limit ¶
type Limit struct { Time time.Duration // Time limit Memory Size // Memory limit Proc uint64 // Process count limit Stack Size // Stack limit Output Size // Output limit Rate uint64 // CPU Rate limit OpenFile uint64 // Number of open files CPUSet string // CPU set limit DataSegment bool // Use stricter memory limit (e.g. rlimit) AddressSpace bool // rlimit address space }
Limit defines the process running resource limits
type NewStoreFile ¶ added in v1.3.0
NewStoreFile creates a new file in storage
type Pipe ¶
type Pipe struct {
// In, Out defines the pipe input source and output destination
In, Out PipeIndex
// Name defines copy out entry name if it is not empty and proxy is enabled
Name string
// Limit defines maximum bytes copy out from proxy and proxy will still
// copy data after limit exceeded
Limit Size
// Proxy creates 2 pipe and connects them by copying data
Proxy bool
}
Pipe defines the pipe between parallel Cmd
type Process ¶
type Process interface { Done() <-chan struct{} // Done returns a channel for wait process to exit Result() RunnerResult // Result wait until done and returns RunnerResult Usage() Usage // Usage retrieves the process usage during the run time }
Process reference to the running process group
type Result ¶
type Result struct { Status Status ExitStatus int Error string // error Time time.Duration RunTime time.Duration Memory Size // byte ProcPeak uint64 // maximum processes ever running // Files stores copy out files Files map[string]*os.File // FileError stores file errors details FileError []FileError }
Result defines the running result for single Cmd
type Single ¶
type Single struct { // Cmd defines Cmd running in parallel in multiple environments Cmd *Cmd // NewStoreFile defines interface to create stored file NewStoreFile NewStoreFile }
Single defines the running instruction to run single exec in restricted within cgroup
type Status ¶
type Status int
Status defines run task Status return status
const ( // not initialized status (as error) StatusInvalid Status = iota // exit normally StatusAccepted StatusWrongAnswer StatusPartiallyCorrect // exit with error StatusMemoryLimitExceeded // MLE StatusTimeLimitExceeded // TLE StatusOutputLimitExceeded // OLE StatusFileError // FE StatusNonzeroExitStatus // NZS StatusSignalled // SIG StatusDangerousSyscall // DJS // SPJ / interactor error StatusJudgementFailed StatusInvalidInteraction // interactor signals error // internal error including: cgroup init failed, container failed, etc StatusInternalError )
Defines run task Status result status
func StringToStatus ¶ added in v1.1.7
StringToStatus convert string to Status
type TerminalSize ¶ added in v1.9.4
type TerminalSize struct { Rows uint16 // ws_row: Number of rows (in cells). Cols uint16 // ws_col: Number of columns (in cells). X uint16 // ws_xpixel: Width in pixels. Y uint16 // ws_ypixel: Height in pixels. }
TerminalSize controls the size of the terminal if TTY is enabled