diff --git a/cmd/kernel.go b/cmd/kernel.go index 89dbca1..b913465 100644 --- a/cmd/kernel.go +++ b/cmd/kernel.go @@ -11,18 +11,15 @@ import ( "strings" "time" - "github.com/cavaliergopher/grab/v3" "github.com/naoina/toml" "github.com/remeh/sizedwaitgroup" "github.com/rs/zerolog/log" "code.dumpstack.io/tools/out-of-tree/artifact" - "code.dumpstack.io/tools/out-of-tree/cache" "code.dumpstack.io/tools/out-of-tree/config" "code.dumpstack.io/tools/out-of-tree/config/dotfiles" "code.dumpstack.io/tools/out-of-tree/container" "code.dumpstack.io/tools/out-of-tree/distro" - "code.dumpstack.io/tools/out-of-tree/fs" "code.dumpstack.io/tools/out-of-tree/kernel" ) @@ -168,33 +165,6 @@ func (cmd *KernelCmd) GenKernel(km artifact.Target, pkg string) { } } -func (cmd *KernelCmd) fetchPrebuiltContainer(c container.Container) { - if !cmd.PrebuiltContainers { - return - } - if c.Exist() && container.UseCache { - return - } - - tmp, err := fs.TempDir() - if err != nil { - return - } - defer os.RemoveAll(tmp) - - resp, err := grab.Get(tmp, cache.ContainerURL(c.Name())) - if err != nil { - return - } - - defer os.Remove(resp.Filename) - - err = container.Load(resp.Filename, c.Name()) - if err == nil { - log.Info().Msgf("use prebuilt container %s", c.Name()) - } -} - func (cmd *KernelCmd) Generate(g *Globals, km artifact.Target) (err error) { defer func() { if err != nil { @@ -211,6 +181,8 @@ func (cmd *KernelCmd) Generate(g *Globals, km artifact.Target) (err error) { container.Prune = false } + container.UsePrebuilt = cmd.PrebuiltContainers + cmd.kcfg, err = config.ReadKernelConfig(g.Config.Kernels) if err != nil { log.Debug().Err(err).Msg("read kernels config") @@ -230,13 +202,6 @@ func (cmd *KernelCmd) Generate(g *Globals, km artifact.Target) (err error) { return } - c, err := container.New(km.Distro) - if err != nil || cmd.shutdown { - return - } - - cmd.fetchPrebuiltContainer(c) - pkgs, err := kernel.MatchPackages(km) if err != nil || cmd.shutdown { return @@ -312,6 +277,8 @@ func (cmd *KernelListRemoteCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error container.Prune = false } + container.UsePrebuilt = kernelCmd.PrebuiltContainers + distroType, err := distro.NewID(cmd.Distro) if err != nil { return @@ -330,13 +297,6 @@ func (cmd *KernelListRemoteCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error container.Registry = g.Config.Docker.Registry container.Commands = g.Config.Docker.Commands - c, err := container.New(km.Distro) - if err != nil { - return - } - - kernelCmd.fetchPrebuiltContainer(c) - pkgs, err := kernel.MatchPackages(km) // error check skipped on purpose diff --git a/container/container.go b/container/container.go index e1affc8..1a7381b 100644 --- a/container/container.go +++ b/container/container.go @@ -16,11 +16,14 @@ import ( "strings" "time" + "github.com/cavaliergopher/grab/v3" "github.com/rs/zerolog" "github.com/rs/zerolog/log" + "code.dumpstack.io/tools/out-of-tree/cache" "code.dumpstack.io/tools/out-of-tree/config/dotfiles" "code.dumpstack.io/tools/out-of-tree/distro" + "code.dumpstack.io/tools/out-of-tree/fs" ) var Runtime = "docker" @@ -33,6 +36,8 @@ var Commands []distro.Command var UseCache = true +var UsePrebuilt = true + var Prune = true type Image struct { @@ -240,6 +245,33 @@ func (c Container) Exist() (yes bool) { return } +func (c Container) loadPrebuilt() (err error) { + if c.Exist() && UseCache { + return + } + + tmp, err := fs.TempDir() + if err != nil { + return + } + defer os.RemoveAll(tmp) + + log.Info().Msgf("download prebuilt container %s", c.Name()) + resp, err := grab.Get(tmp, cache.ContainerURL(c.Name())) + if err != nil { + return + } + + defer os.Remove(resp.Filename) + + err = Load(resp.Filename, c.Name()) + if err == nil { + log.Info().Msgf("use prebuilt container %s", c.Name()) + } + + return +} + func (c Container) Build(image string, envs, runs []string) (err error) { if c.Exist() && UseCache { return @@ -290,10 +322,17 @@ func (c Container) Build(image string, envs, runs []string) (err error) { c.Log.Info().Msg("build") } - output, err := c.build(cdir) - if err != nil { - c.Log.Error().Err(err).Msg(output) - return + if UsePrebuilt { + err = c.loadPrebuilt() + } + + if err != nil || !UsePrebuilt { + var output string + output, err = c.build(cdir) + if err != nil { + c.Log.Error().Err(err).Msg(output) + return + } } c.Log.Info().Msg("success")