1
0
mirror of https://github.com/lxc/incus.git synced 2026-02-05 09:46:19 +01:00
Files
incus/client/oci_util_linux.go
Stéphane Graber 43b02c81f1 client/oci: Set the umoci logger on init
Closes #2481

Signed-off-by: Stéphane Graber <stgraber@stgraber.org>
2025-09-25 14:33:53 -04:00

65 lines
1.6 KiB
Go

//go:build linux
package incus
import (
"fmt"
"github.com/apex/log"
"github.com/opencontainers/umoci"
"github.com/opencontainers/umoci/oci/cas/dir"
"github.com/opencontainers/umoci/oci/casext"
"github.com/opencontainers/umoci/oci/layer"
"github.com/lxc/incus/v6/shared/logger"
)
func init() {
// apex/log is only used by umoci within Incus.
// So configure its logger to forward to our logger with the relevant prefix.
// Set the custom handler.
log.SetHandler(&umociLogHandler{Message: "Unpacking OCI image"})
}
// Custom handler to intercept logs.
type umociLogHandler struct {
Message string
}
// HandleLog implements a proxy between apex/log and our logger.
func (h *umociLogHandler) HandleLog(e *log.Entry) error {
switch e.Level {
case log.DebugLevel:
logger.Debug(h.Message, logger.Ctx{"log": e.Message})
case log.InfoLevel:
logger.Info(h.Message, logger.Ctx{"log": e.Message})
case log.WarnLevel:
logger.Warn(h.Message, logger.Ctx{"log": e.Message})
case log.ErrorLevel:
logger.Error(h.Message, logger.Ctx{"log": e.Message})
case log.FatalLevel:
logger.Panic(h.Message, logger.Ctx{"log": e.Message})
default:
logger.Error("Unknown umoci log level", logger.Ctx{"log": e.Message})
}
return nil
}
func unpackOCIImage(imagePath string, imageTag string, bundlePath string) error {
var unpackOptions layer.UnpackOptions
unpackOptions.KeepDirlinks = true
// Get a reference to the CAS.
engine, err := dir.Open(imagePath)
if err != nil {
return fmt.Errorf("Open CAS: %w", err)
}
engineExt := casext.NewEngine(engine)
defer func() { _ = engine.Close() }()
return umoci.Unpack(engineExt, imageTag, bundlePath, unpackOptions)
}