diff --git a/container.go b/cmd/container.go similarity index 99% rename from container.go rename to cmd/container.go index 2058710..370c020 100644 --- a/container.go +++ b/cmd/container.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "fmt" diff --git a/db.go b/cmd/db.go similarity index 99% rename from db.go rename to cmd/db.go index ec14793..e4faab5 100644 --- a/db.go +++ b/cmd/db.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "database/sql" diff --git a/debug.go b/cmd/debug.go similarity index 99% rename from debug.go rename to cmd/debug.go index 821e5c4..9a49267 100644 --- a/debug.go +++ b/cmd/debug.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "errors" diff --git a/distro.go b/cmd/distro.go similarity index 99% rename from distro.go rename to cmd/distro.go index d55d157..afb94b5 100644 --- a/distro.go +++ b/cmd/distro.go @@ -1,4 +1,4 @@ -package main +package cmd import ( "context" diff --git a/gen.go b/cmd/gen.go similarity index 99% rename from gen.go rename to cmd/gen.go index 1ba7f8b..8568f55 100644 --- a/gen.go +++ b/cmd/gen.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "fmt" diff --git a/cmd/globals.go b/cmd/globals.go new file mode 100644 index 0000000..36403f1 --- /dev/null +++ b/cmd/globals.go @@ -0,0 +1,15 @@ +package cmd + +import ( + "net/url" + + "code.dumpstack.io/tools/out-of-tree/config" +) + +type Globals struct { + Config config.OutOfTree `help:"path to out-of-tree configuration" default:"~/.out-of-tree/out-of-tree.toml"` + + WorkDir string `help:"path to work directory" default:"./" type:"path"` + + CacheURL url.URL +} diff --git a/images.go b/cmd/images.go similarity index 99% rename from images.go rename to cmd/images.go index 06fee97..cfa0f1e 100644 --- a/images.go +++ b/cmd/images.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "errors" diff --git a/kernel.go b/cmd/kernel.go similarity index 99% rename from kernel.go rename to cmd/kernel.go index 2c17fca..5d5e049 100644 --- a/kernel.go +++ b/cmd/kernel.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "errors" diff --git a/log.go b/cmd/log.go similarity index 99% rename from log.go rename to cmd/log.go index a10883d..6fea96c 100644 --- a/log.go +++ b/cmd/log.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "database/sql" diff --git a/pack.go b/cmd/pack.go similarity index 99% rename from pack.go rename to cmd/pack.go index 69e7989..66264de 100644 --- a/pack.go +++ b/cmd/pack.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "fmt" diff --git a/pew.go b/cmd/pew.go similarity index 98% rename from pew.go rename to cmd/pew.go index 785ca25..9e1558a 100644 --- a/pew.go +++ b/cmd/pew.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "bufio" @@ -30,6 +30,22 @@ import ( "code.dumpstack.io/tools/out-of-tree/qemu" ) +type LevelWriter struct { + io.Writer + Level zerolog.Level +} + +func (lw *LevelWriter) WriteLevel(l zerolog.Level, p []byte) (n int, err error) { + if l >= lw.Level { + return lw.Writer.Write(p) + } + return len(p), nil +} + +var ConsoleWriter, FileWriter LevelWriter + +var LogLevel zerolog.Level + type PewCmd struct { Max int64 `help:"test no more than X kernels" default:"100500"` Runs int64 `help:"runs per each kernel" default:"1"` @@ -649,8 +665,8 @@ func (cmd PewCmd) testArtifact(swg *sizedwaitgroup.SizedWaitGroup, defer f.Close() slog := zerolog.New(zerolog.MultiLevelWriter( - &consoleWriter, - &fileWriter, + &ConsoleWriter, + &FileWriter, &zerolog.ConsoleWriter{ Out: f, FieldsExclude: []string{ @@ -662,7 +678,7 @@ func (cmd PewCmd) testArtifact(swg *sizedwaitgroup.SizedWaitGroup, }, )) - switch loglevel { + switch LogLevel { case zerolog.TraceLevel, zerolog.DebugLevel: slog = slog.With().Caller().Logger() } diff --git a/preload.go b/cmd/preload.go similarity index 99% rename from preload.go rename to cmd/preload.go index 36f016e..df52031 100644 --- a/preload.go +++ b/cmd/preload.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a AGPLv3 license // (or later) that can be found in the LICENSE file. -package main +package cmd import ( "crypto/sha1" diff --git a/main.go b/main.go index 4009a24..31fdaed 100644 --- a/main.go +++ b/main.go @@ -6,9 +6,7 @@ package main import ( "fmt" - "io" "math/rand" - "net/url" "os" "os/exec" "runtime/debug" @@ -28,31 +26,24 @@ import ( _ "code.dumpstack.io/tools/out-of-tree/distro/ubuntu" "code.dumpstack.io/tools/out-of-tree/cache" + "code.dumpstack.io/tools/out-of-tree/cmd" "code.dumpstack.io/tools/out-of-tree/config" "code.dumpstack.io/tools/out-of-tree/container" "code.dumpstack.io/tools/out-of-tree/fs" ) -type Globals struct { - Config config.OutOfTree `help:"path to out-of-tree configuration" default:"~/.out-of-tree/out-of-tree.toml"` - - WorkDir string `help:"path to work directory" default:"./" type:"path"` - - CacheURL url.URL -} - type CLI struct { - Globals + cmd.Globals - Pew PewCmd `cmd:"" help:"build, run, and test module/exploit"` - Kernel KernelCmd `cmd:"" help:"manipulate kernels"` - Debug DebugCmd `cmd:"" help:"debug environment"` - Log LogCmd `cmd:"" help:"query logs"` - Pack PackCmd `cmd:"" help:"exploit pack test"` - Gen GenCmd `cmd:"" help:"generate .out-of-tree.toml skeleton"` - Image ImageCmd `cmd:"" help:"manage images"` - Container ContainerCmd `cmd:"" help:"manage containers"` - Distro DistroCmd `cmd:"" help:"distro-related helpers"` + Pew cmd.PewCmd `cmd:"" help:"build, run, and test module/exploit"` + Kernel cmd.KernelCmd `cmd:"" help:"manipulate kernels"` + Debug cmd.DebugCmd `cmd:"" help:"debug environment"` + Log cmd.LogCmd `cmd:"" help:"query logs"` + Pack cmd.PackCmd `cmd:"" help:"exploit pack test"` + Gen cmd.GenCmd `cmd:"" help:"generate .out-of-tree.toml skeleton"` + Image cmd.ImageCmd `cmd:"" help:"manage images"` + Container cmd.ContainerCmd `cmd:"" help:"manage containers"` + Distro cmd.DistroCmd `cmd:"" help:"distro-related helpers"` Version VersionFlag `name:"version" help:"print version information and quit"` @@ -92,22 +83,6 @@ func (v VersionFlag) BeforeApply(app *kong.Kong, vars kong.Vars) error { return nil } -type LevelWriter struct { - io.Writer - Level zerolog.Level -} - -func (lw *LevelWriter) WriteLevel(l zerolog.Level, p []byte) (n int, err error) { - if l >= lw.Level { - return lw.Writer.Write(p) - } - return len(p), nil -} - -var consoleWriter, fileWriter LevelWriter - -var loglevel zerolog.Level - func main() { rand.Seed(time.Now().UnixNano()) @@ -126,34 +101,34 @@ func main() { switch cli.LogLevel { case "trace": - loglevel = zerolog.TraceLevel + cmd.LogLevel = zerolog.TraceLevel case "debug": - loglevel = zerolog.DebugLevel + cmd.LogLevel = zerolog.DebugLevel case "info": - loglevel = zerolog.InfoLevel + cmd.LogLevel = zerolog.InfoLevel case "warn": - loglevel = zerolog.WarnLevel + cmd.LogLevel = zerolog.WarnLevel case "error": - loglevel = zerolog.ErrorLevel + cmd.LogLevel = zerolog.ErrorLevel } - consoleWriter = LevelWriter{Writer: zerolog.NewConsoleWriter( + cmd.ConsoleWriter = cmd.LevelWriter{Writer: zerolog.NewConsoleWriter( func(w *zerolog.ConsoleWriter) { w.Out = os.Stderr }, ), - Level: loglevel, + Level: cmd.LogLevel, } - fileWriter = LevelWriter{Writer: &lumberjack.Logger{ + cmd.FileWriter = cmd.LevelWriter{Writer: &lumberjack.Logger{ Filename: config.File("logs/out-of-tree.log"), }, Level: zerolog.TraceLevel, } log.Logger = log.Output(zerolog.MultiLevelWriter( - &consoleWriter, - &fileWriter, + &cmd.ConsoleWriter, + &cmd.FileWriter, )) log.Trace().Msg("start out-of-tree")