2023-01-31 07:13:33 +00:00
|
|
|
// Copyright 2023 Mikhail Klementev. All rights reserved.
|
2018-10-08 20:51:32 +00:00
|
|
|
// Use of this source code is governed by a AGPLv3 license
|
2018-10-06 19:25:03 +00:00
|
|
|
// (or later) that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2018-12-10 02:51:15 +00:00
|
|
|
"fmt"
|
2019-08-12 22:58:34 +00:00
|
|
|
"math/rand"
|
2023-03-18 21:30:07 +00:00
|
|
|
"os"
|
2023-04-06 12:50:44 +00:00
|
|
|
"runtime/debug"
|
2023-03-19 13:14:14 +00:00
|
|
|
"strconv"
|
2019-08-12 22:58:34 +00:00
|
|
|
"time"
|
2018-10-06 19:25:03 +00:00
|
|
|
|
2023-03-18 21:30:07 +00:00
|
|
|
"github.com/rs/zerolog"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
"github.com/alecthomas/kong"
|
2018-11-17 20:18:50 +00:00
|
|
|
|
2019-02-02 21:24:29 +00:00
|
|
|
"code.dumpstack.io/tools/out-of-tree/config"
|
2018-10-06 19:25:03 +00:00
|
|
|
)
|
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
type Globals struct {
|
|
|
|
Config config.OutOfTree `help:"path to out-of-tree configuration" default:"~/.out-of-tree/out-of-tree.toml"`
|
2018-12-01 20:18:43 +00:00
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
WorkDir string `help:"path to work directory" default:"./" type:"path"`
|
|
|
|
}
|
2018-12-01 20:18:43 +00:00
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
type CLI struct {
|
|
|
|
Globals
|
2018-12-01 20:18:43 +00:00
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
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"`
|
2023-02-15 10:17:57 +00:00
|
|
|
Image ImageCmd `cmd:"" help:"manage images"`
|
2018-12-01 20:18:43 +00:00
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
Version VersionFlag `name:"version" help:"print version information and quit"`
|
2023-03-18 21:53:53 +00:00
|
|
|
|
2023-03-19 13:20:39 +00:00
|
|
|
LogLevel LogLevelFlag `enum:"debug,info,warn,error" default:"info"`
|
2023-03-18 21:53:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type LogLevelFlag string
|
|
|
|
|
|
|
|
func (loglevel LogLevelFlag) AfterApply() error {
|
|
|
|
switch loglevel {
|
|
|
|
case "debug":
|
|
|
|
zerolog.SetGlobalLevel(zerolog.DebugLevel)
|
2023-03-22 17:36:04 +00:00
|
|
|
|
|
|
|
zerolog.CallerMarshalFunc = func(pc uintptr, file string, line int) string {
|
|
|
|
short := file
|
|
|
|
for i := len(file) - 1; i > 0; i-- {
|
|
|
|
if file[i] == '/' {
|
|
|
|
short = file[i+1:]
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
file = short
|
|
|
|
return file + ":" + strconv.Itoa(line)
|
|
|
|
}
|
|
|
|
log.Logger = log.With().Caller().Logger()
|
2023-03-18 21:53:53 +00:00
|
|
|
case "info":
|
|
|
|
zerolog.SetGlobalLevel(zerolog.InfoLevel)
|
|
|
|
case "warn":
|
|
|
|
zerolog.SetGlobalLevel(zerolog.WarnLevel)
|
|
|
|
case "error":
|
|
|
|
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
|
|
|
|
}
|
|
|
|
return nil
|
2018-12-01 20:18:43 +00:00
|
|
|
}
|
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
type VersionFlag string
|
2018-12-10 02:51:15 +00:00
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
func (v VersionFlag) Decode(ctx *kong.DecodeContext) error { return nil }
|
|
|
|
func (v VersionFlag) IsBool() bool { return true }
|
|
|
|
func (v VersionFlag) BeforeApply(app *kong.Kong, vars kong.Vars) error {
|
|
|
|
fmt.Println(vars["version"])
|
|
|
|
app.Exit(0)
|
|
|
|
return nil
|
2019-07-10 22:08:04 +00:00
|
|
|
}
|
|
|
|
|
2018-10-26 18:26:43 +00:00
|
|
|
func main() {
|
2023-03-18 21:30:07 +00:00
|
|
|
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
|
2019-08-16 00:04:57 +00:00
|
|
|
|
2019-08-12 22:58:34 +00:00
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
cli := CLI{}
|
|
|
|
ctx := kong.Parse(&cli,
|
|
|
|
kong.Name("out-of-tree"),
|
|
|
|
kong.Description("kernel {module, exploit} development tool"),
|
|
|
|
kong.UsageOnError(),
|
|
|
|
kong.ConfigureHelp(kong.HelpOptions{
|
|
|
|
Compact: true,
|
|
|
|
}),
|
|
|
|
kong.Vars{
|
|
|
|
"version": "1.4.0",
|
|
|
|
},
|
2018-10-27 08:14:10 +00:00
|
|
|
)
|
|
|
|
|
2023-04-06 12:50:44 +00:00
|
|
|
if buildInfo, ok := debug.ReadBuildInfo(); ok {
|
|
|
|
log.Debug().Msgf("%v", buildInfo.GoVersion)
|
|
|
|
log.Debug().Msgf("%v", buildInfo.Settings)
|
|
|
|
}
|
|
|
|
|
2023-01-31 07:13:33 +00:00
|
|
|
err := ctx.Run(&cli.Globals)
|
|
|
|
ctx.FatalIfErrorf(err)
|
2018-10-06 19:25:03 +00:00
|
|
|
}
|