1
0
Fork 0

Implements global timeout

timestamps
dump_stack() 2019-08-30 00:34:14 +00:00
parent 365c9d0e95
commit 104e70f861
Signed by: dump_stack
GPG Key ID: BE44DA8C062D87DC
4 changed files with 26 additions and 7 deletions

View File

@ -18,6 +18,11 @@
- Support for (distro-specific) custom docker commands that will be - Support for (distro-specific) custom docker commands that will be
executed before the base template. executed before the base template.
- Parameter for setting up a reliability threshold for exit code.
- Parameter for setting up global timeout, after which no new tasks
will be started.
### Fixed ### Fixed
- Spelling in output. - Spelling in output.

12
main.go
View File

@ -111,6 +111,9 @@ func main() {
userKcfgPathEnv := userKcfgPathFlag.Envar("OUT_OF_TREE_KCFG") userKcfgPathEnv := userKcfgPathFlag.Envar("OUT_OF_TREE_KCFG")
userKcfgPath := userKcfgPathEnv.Default(conf.UserKernels).String() userKcfgPath := userKcfgPathEnv.Default(conf.UserKernels).String()
timeoutFlag := app.Flag("timeout", "Timeout after tool will not spawn new tests")
timeout := timeoutFlag.Duration()
qemuTimeoutFlag := app.Flag("qemu-timeout", "Timeout for qemu") qemuTimeoutFlag := app.Flag("qemu-timeout", "Timeout for qemu")
qemuTimeout := qemuTimeoutFlag.Default(conf.Qemu.Timeout).Duration() qemuTimeout := qemuTimeoutFlag.Default(conf.Qemu.Timeout).Duration()
@ -287,10 +290,15 @@ func main() {
} }
defer db.Close() defer db.Close()
stop := time.Time{} // never stop
if *timeout != 0 {
stop = time.Now().Add(*timeout)
}
switch kingpin.MustParse(app.Parse(os.Args[1:])) { switch kingpin.MustParse(app.Parse(os.Args[1:])) {
case pewCommand.FullCommand(): case pewCommand.FullCommand():
err = pewHandler(kcfg, *path, *pewKernel, *pewBinary, err = pewHandler(kcfg, *path, *pewKernel, *pewBinary,
*pewTest, *pewGuess, *qemuTimeout, *dockerTimeout, *pewTest, *pewGuess, stop, *qemuTimeout, *dockerTimeout,
*pewMax, *pewRuns, *pewDist, *pewTag, *pewThreads, db) *pewMax, *pewRuns, *pewDist, *pewTag, *pewThreads, db)
case kernelListCommand.FullCommand(): case kernelListCommand.FullCommand():
err = kernelListHandler(kcfg) err = kernelListHandler(kcfg)
@ -326,7 +334,7 @@ func main() {
case logMarkdownCommand.FullCommand(): case logMarkdownCommand.FullCommand():
err = logMarkdownHandler(db, *path, *logMarkdownTag) err = logMarkdownHandler(db, *path, *logMarkdownTag)
case packCommand.FullCommand(): case packCommand.FullCommand():
err = packHandler(db, *path, *dockerRegistry, err = packHandler(db, *path, *dockerRegistry, stop,
conf.Docker.Commands, kcfg, *packAutogen, conf.Docker.Commands, kcfg, *packAutogen,
!*packNoDownload, *packExploitRuns, *packKernelRuns) !*packNoDownload, *packExploitRuns, *packKernelRuns)
} }

View File

@ -15,7 +15,7 @@ import (
"code.dumpstack.io/tools/out-of-tree/config" "code.dumpstack.io/tools/out-of-tree/config"
) )
func packHandler(db *sql.DB, path, registry string, func packHandler(db *sql.DB, path, registry string, stop time.Time,
commands []config.DockerCommand, kcfg config.KernelConfig, commands []config.DockerCommand, kcfg config.KernelConfig,
autogen, download bool, exploitRuns, kernelRuns int64) (err error) { autogen, download bool, exploitRuns, kernelRuns int64) (err error) {
@ -50,7 +50,7 @@ func packHandler(db *sql.DB, path, registry string,
log.Println(f.Name()) log.Println(f.Name())
pewHandler(kcfg, workPath, "", "", "", false, pewHandler(kcfg, workPath, "", "", "", false,
dockerTimeout, qemuTimeout, stop, dockerTimeout, qemuTimeout,
kernelRuns, exploitRuns, pathDevNull, tag, threads, db) kernelRuns, exploitRuns, pathDevNull, tag, threads, db)
} }

12
pew.go
View File

@ -391,7 +391,8 @@ func shuffleKernels(a []config.KernelInfo) []config.KernelInfo {
} }
func performCI(ka config.Artifact, kcfg config.KernelConfig, binaryPath, func performCI(ka config.Artifact, kcfg config.KernelConfig, binaryPath,
testPath string, qemuTimeout, dockerTimeout time.Duration, testPath string, stop time.Time,
qemuTimeout, dockerTimeout time.Duration,
max, runs int64, dist, tag string, threads int, max, runs int64, dist, tag string, threads int,
db *sql.DB) (err error) { db *sql.DB) (err error) {
@ -413,6 +414,9 @@ func performCI(ka config.Artifact, kcfg config.KernelConfig, binaryPath,
found = true found = true
max-- max--
for i := int64(0); i < runs; i++ { for i := int64(0); i < runs; i++ {
if !stop.IsZero() && time.Now().After(stop) {
break
}
swg.Add() swg.Add()
go whatever(&swg, ka, kernel, binaryPath, go whatever(&swg, ka, kernel, binaryPath,
testPath, qemuTimeout, dockerTimeout, testPath, qemuTimeout, dockerTimeout,
@ -468,9 +472,10 @@ func genAllKernels() (sk []config.KernelMask, err error) {
return return
} }
// TODO: Now too many parameters, move all of them to some structure
func pewHandler(kcfg config.KernelConfig, func pewHandler(kcfg config.KernelConfig,
workPath, ovrrdKrnl, binary, test string, guess bool, workPath, ovrrdKrnl, binary, test string, guess bool,
qemuTimeout, dockerTimeout time.Duration, stop time.Time, qemuTimeout, dockerTimeout time.Duration,
max, runs int64, dist, tag string, threads int, max, runs int64, dist, tag string, threads int,
db *sql.DB) (err error) { db *sql.DB) (err error) {
@ -500,7 +505,8 @@ func pewHandler(kcfg config.KernelConfig,
} }
} }
err = performCI(ka, kcfg, binary, test, qemuTimeout, dockerTimeout, err = performCI(ka, kcfg, binary, test,
stop, qemuTimeout, dockerTimeout,
max, runs, dist, tag, threads, db) max, runs, dist, tag, threads, db)
if err != nil { if err != nil {
return return