1
0

Compare commits

..

4 Commits

Author SHA1 Message Date
a7ecc354a9
feat!: prepend/append commands to dockerfile
BREAKING CHANGE: Command definition in the configuration has been changed

from

[[docker.commands]]
distro = { id = "Ubuntu" }
command = "echo runs before the base layer"

to

[[docker.commands.prepend]]
distro = { id = "Ubuntu" }
command = "echo runs before the base layer"
2024-10-06 16:11:29 +00:00
cba1abc7f4
feat: command for the update of containers 2024-10-06 15:49:19 +00:00
3f0c28014c
feat: add command aliases 2024-10-06 15:34:14 +00:00
c3c97c3828
fix: untag duplicate image in case of docker 2024-10-06 15:33:35 +00:00
4 changed files with 85 additions and 16 deletions

View File

@ -19,6 +19,7 @@ type ContainerCmd struct {
Filter string `help:"filter by name"` Filter string `help:"filter by name"`
List ContainerListCmd `cmd:"" help:"list containers"` List ContainerListCmd `cmd:"" help:"list containers"`
Update ContainerUpdateCmd `cmd:"" help:"update containers"`
Save ContainerSaveCmd `cmd:"" help:"save containers"` Save ContainerSaveCmd `cmd:"" help:"save containers"`
Cleanup ContainerCleanupCmd `cmd:"" help:"cleanup containers"` Cleanup ContainerCleanupCmd `cmd:"" help:"cleanup containers"`
} }
@ -47,6 +48,39 @@ func (cmd ContainerListCmd) Run(containerCmd *ContainerCmd) (err error) {
return return
} }
type ContainerUpdateCmd struct{}
func (cmd ContainerUpdateCmd) Run(g *Globals, containerCmd *ContainerCmd) (err error) {
images, err := container.Images()
if err != nil {
return
}
container.UseCache = false
container.UsePrebuilt = false
// TODO move from all commands to main command line handler
container.Commands = g.Config.Docker.Commands
container.Registry = g.Config.Docker.Registry
container.Timeout = g.Config.Docker.Timeout.Duration
for _, img := range images {
if containerCmd.Filter != "" {
if !strings.Contains(img.Name, containerCmd.Filter) {
log.Debug().Msgf("skip %s", img.Name)
continue
}
}
_, err = img.Distro.Packages()
if err != nil {
return
}
}
return
}
type ContainerSaveCmd struct { type ContainerSaveCmd struct {
OutDir string `help:"directory to save containers" default:"./" type:"existingdir"` OutDir string `help:"directory to save containers" default:"./" type:"existingdir"`
} }

View File

@ -35,9 +35,12 @@ type OutOfTree struct {
Timeout artifact.Duration Timeout artifact.Duration
Registry string Registry string
// Commands that will be executed before // Commands that are executed before (prepend) and after (append) the
// the base layer of Dockerfile // base layer of the Dockerfile.
Commands []distro.Command Commands struct {
Prepend []distro.Command
Append []distro.Command
}
} }
} }

View File

@ -32,7 +32,12 @@ var Registry = ""
var Timeout time.Duration var Timeout time.Duration
var Commands []distro.Command // Commands that are executed before (prepend) and after (append) the
// base layer of the Dockerfile.
var Commands struct {
Prepend []distro.Command
Append []distro.Command
}
var UseCache = true var UseCache = true
@ -97,13 +102,23 @@ func Load(localpath string, name string) (err error) {
return return
} }
cmd = exec.Command(Runtime, "tag", "localhost/"+name, name) if strings.Contains(Runtime, "docker") {
log.Debug().Msgf("%v", cmd) var err2 error
cmd = exec.Command(Runtime, "tag", "localhost/"+name, name)
log.Debug().Msgf("%v", cmd)
raw, err = cmd.CombinedOutput() raw, err2 = cmd.CombinedOutput()
if err != nil { if err2 != nil {
log.Debug().Err(err).Msg(string(raw)) log.Debug().Err(err2).Msg(string(raw))
return }
cmd = exec.Command(Runtime, "rmi", "localhost/"+name)
log.Debug().Msgf("%v", cmd)
raw, err2 = cmd.CombinedOutput()
if err2 != nil {
log.Debug().Err(err2).Msg(string(raw))
}
} }
return return
@ -286,9 +301,15 @@ func (c Container) Build(image string, envs, runs []string) (err error) {
} }
cf += image + "\n" cf += image + "\n"
for _, c := range Commands { for _, cmd := range Commands.Prepend {
// TODO check for distro type if cmd.Distro.ID != distro.None && cmd.Distro.ID != c.dist.ID {
cf += "RUN " + c.Command + "\n" continue
}
if cmd.Distro.Release != "" && cmd.Distro.Release != c.dist.Release {
continue
}
cf += "RUN " + cmd.Command + "\n"
} }
for _, e := range envs { for _, e := range envs {
@ -299,6 +320,17 @@ func (c Container) Build(image string, envs, runs []string) (err error) {
cf += "RUN " + c + "\n" cf += "RUN " + c + "\n"
} }
for _, cmd := range Commands.Append {
if cmd.Distro.ID != distro.None && cmd.Distro.ID != c.dist.ID {
continue
}
if cmd.Distro.Release != "" && cmd.Distro.Release != c.dist.Release {
continue
}
cf += "RUN " + cmd.Command + "\n"
}
buf, err := os.ReadFile(cfile) buf, err := os.ReadFile(cfile)
if err != nil { if err != nil {
err = os.WriteFile(cfile, []byte(cf), os.ModePerm) err = os.WriteFile(cfile, []byte(cf), os.ModePerm)

View File

@ -35,13 +35,13 @@ type CLI struct {
cmd.Globals cmd.Globals
Pew cmd.PewCmd `cmd:"" help:"build, run, and test module/exploit"` Pew cmd.PewCmd `cmd:"" help:"build, run, and test module/exploit"`
Kernel cmd.KernelCmd `cmd:"" help:"manipulate kernels"` Kernel cmd.KernelCmd `cmd:"" aliases:"kernels" help:"manipulate kernels"`
Debug cmd.DebugCmd `cmd:"" help:"debug environment"` Debug cmd.DebugCmd `cmd:"" help:"debug environment"`
Log cmd.LogCmd `cmd:"" help:"query logs"` Log cmd.LogCmd `cmd:"" help:"query logs"`
Pack cmd.PackCmd `cmd:"" help:"exploit pack test"` Pack cmd.PackCmd `cmd:"" help:"exploit pack test"`
Gen cmd.GenCmd `cmd:"" help:"generate .out-of-tree.toml skeleton"` Gen cmd.GenCmd `cmd:"" help:"generate .out-of-tree.toml skeleton"`
Image cmd.ImageCmd `cmd:"" help:"manage images"` Image cmd.ImageCmd `cmd:"" aliases:"images" help:"manage images"`
Container cmd.ContainerCmd `cmd:"" help:"manage containers"` Container cmd.ContainerCmd `cmd:"" aliases:"containers" help:"manage containers"`
Distro cmd.DistroCmd `cmd:"" help:"distro-related helpers"` Distro cmd.DistroCmd `cmd:"" help:"distro-related helpers"`
Daemon cmd.DaemonCmd `cmd:"" help:"run daemon"` Daemon cmd.DaemonCmd `cmd:"" help:"run daemon"`