mirror of
https://github.com/mudler/luet.git
synced 2025-05-05 06:47:49 +00:00
It holds necessary state plus additional information relative to the context which we are being run to (e.g. if we are in a terminal or not). Besides in the future we can use it also as a contextual logger to provide more smart logging capabilities. This also replace the general global configuration instance that previously was share between the core components.
88 lines
2.3 KiB
Go
88 lines
2.3 KiB
Go
package installer
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/hashicorp/go-multierror"
|
|
"github.com/mudler/luet/pkg/api/core/types"
|
|
"github.com/mudler/luet/pkg/helpers"
|
|
fileHelper "github.com/mudler/luet/pkg/helpers/file"
|
|
pkg "github.com/mudler/luet/pkg/package"
|
|
"github.com/mudler/luet/pkg/tree"
|
|
)
|
|
|
|
type System struct {
|
|
Database pkg.PackageDatabase
|
|
Target string
|
|
fileIndex map[string]pkg.Package
|
|
sync.Mutex
|
|
}
|
|
|
|
func (s *System) World() (pkg.Packages, error) {
|
|
return s.Database.World(), nil
|
|
}
|
|
|
|
func (s *System) ExecuteFinalizers(ctx *types.Context, packs []pkg.Package) error {
|
|
var errs error
|
|
executedFinalizer := map[string]bool{}
|
|
for _, p := range packs {
|
|
if fileHelper.Exists(p.Rel(tree.FinalizerFile)) {
|
|
out, err := helpers.RenderFiles(helpers.ChartFile(p.Rel(tree.FinalizerFile)), p.Rel(pkg.PackageDefinitionFile))
|
|
if err != nil {
|
|
ctx.Warning("Failed rendering finalizer for ", p.HumanReadableString(), err.Error())
|
|
errs = multierror.Append(errs, err)
|
|
continue
|
|
}
|
|
|
|
if _, exists := executedFinalizer[p.GetFingerPrint()]; !exists {
|
|
executedFinalizer[p.GetFingerPrint()] = true
|
|
ctx.Info("Executing finalizer for " + p.HumanReadableString())
|
|
finalizer, err := NewLuetFinalizerFromYaml([]byte(out))
|
|
if err != nil {
|
|
ctx.Warning("Failed reading finalizer for ", p.HumanReadableString(), err.Error())
|
|
errs = multierror.Append(errs, err)
|
|
continue
|
|
}
|
|
err = finalizer.RunInstall(ctx, s)
|
|
if err != nil {
|
|
ctx.Warning("Failed running finalizer for ", p.HumanReadableString(), err.Error())
|
|
errs = multierror.Append(errs, err)
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return errs
|
|
}
|
|
|
|
func (s *System) buildFileIndex() {
|
|
s.Lock()
|
|
defer s.Unlock()
|
|
// Check if cache is empty or if it got modified
|
|
if s.fileIndex == nil { //|| len(s.Database.GetPackages()) != len(s.fileIndex) {
|
|
s.fileIndex = make(map[string]pkg.Package)
|
|
for _, p := range s.Database.World() {
|
|
files, _ := s.Database.GetPackageFiles(p)
|
|
for _, f := range files {
|
|
s.fileIndex[f] = p
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *System) Clean() {
|
|
s.Lock()
|
|
defer s.Unlock()
|
|
s.fileIndex = nil
|
|
}
|
|
|
|
func (s *System) ExistsPackageFile(file string) (bool, pkg.Package, error) {
|
|
s.buildFileIndex()
|
|
s.Lock()
|
|
defer s.Unlock()
|
|
if p, exists := s.fileIndex[file]; exists {
|
|
return exists, p, nil
|
|
}
|
|
return false, nil, nil
|
|
}
|