mirror of
https://github.com/mudler/luet.git
synced 2025-09-07 02:00:39 +00:00
Track installed files
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
package installer
|
package installer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@@ -255,13 +257,43 @@ func (l *LuetInstaller) installPackage(a ArtifactMatch, s *System) error {
|
|||||||
// FIXME: Implement
|
// FIXME: Implement
|
||||||
artifact, err := a.Repository.Client().DownloadArtifact(a.Artifact)
|
artifact, err := a.Repository.Client().DownloadArtifact(a.Artifact)
|
||||||
defer os.Remove(artifact.GetPath())
|
defer os.Remove(artifact.GetPath())
|
||||||
|
|
||||||
|
tarFile, err := os.Open(artifact.GetPath())
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Could not open package archive")
|
||||||
|
}
|
||||||
|
defer tarFile.Close()
|
||||||
|
tr := tar.NewReader(tarFile)
|
||||||
|
|
||||||
|
var files []string
|
||||||
|
// untar each segment
|
||||||
|
for {
|
||||||
|
hdr, err := tr.Next()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// determine proper file path info
|
||||||
|
finfo := hdr.FileInfo()
|
||||||
|
fileName := hdr.Name
|
||||||
|
if finfo.Mode().IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
files = append(files, fileName)
|
||||||
|
|
||||||
|
// if a dir, create it, then go to next segment
|
||||||
|
}
|
||||||
|
|
||||||
err = helpers.Untar(artifact.GetPath(), s.Target, true)
|
err = helpers.Untar(artifact.GetPath(), s.Target, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "Error met while unpacking rootfs")
|
return errors.Wrap(err, "Error met while unpacking rootfs")
|
||||||
}
|
}
|
||||||
|
|
||||||
// First create client and download
|
// First create client and download
|
||||||
// Then unpack to system
|
// Then unpack to system
|
||||||
return nil
|
return s.Database.SetPackageFiles(pkg.PackageFile{PackageFingerprint: a.Package.GetFingerPrint(), Files: files})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *LuetInstaller) installerWorker(i int, wg *sync.WaitGroup, c <-chan ArtifactMatch, s *System) error {
|
func (l *LuetInstaller) installerWorker(i int, wg *sync.WaitGroup, c <-chan ArtifactMatch, s *System) error {
|
||||||
|
@@ -120,6 +120,10 @@ uri: "`+tmpdir+`"
|
|||||||
Expect(helpers.Exists(filepath.Join(fakeroot, "test6"))).To(BeTrue())
|
Expect(helpers.Exists(filepath.Join(fakeroot, "test6"))).To(BeTrue())
|
||||||
_, err = systemDB.FindPackage(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"})
|
_, err = systemDB.FindPackage(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"})
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
files, err := systemDB.GetPackageFiles(&pkg.DefaultPackage{Name: "b", Category: "test", Version: "1.0"})
|
||||||
|
Expect(files).To(Equal([]string{"artifact42", "test5", "test6"}))
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@@ -26,3 +26,22 @@ type PackageDatabase interface {
|
|||||||
Create([]byte) (string, error)
|
Create([]byte) (string, error)
|
||||||
Retrieve(ID string) ([]byte, error)
|
Retrieve(ID string) ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PackageSet interface {
|
||||||
|
GetPackages() []string //Ids
|
||||||
|
CreatePackage(pkg Package) (string, error)
|
||||||
|
GetPackage(ID string) (Package, error)
|
||||||
|
Clean() error
|
||||||
|
FindPackage(Package) (Package, error)
|
||||||
|
UpdatePackage(p Package) error
|
||||||
|
GetAllPackages(packages chan Package) error
|
||||||
|
|
||||||
|
GetPackageFiles(Package) ([]string, error)
|
||||||
|
SetPackageFiles(PackageFile) error
|
||||||
|
RemovePackageFiles(Package) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type PackageFile struct {
|
||||||
|
PackageFingerprint string
|
||||||
|
Files []string
|
||||||
|
}
|
||||||
|
@@ -183,3 +183,44 @@ func (db *BoltDatabase) Clean() error {
|
|||||||
defer db.Unlock()
|
defer db.Unlock()
|
||||||
return os.RemoveAll(db.Path)
|
return os.RemoveAll(db.Path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *BoltDatabase) GetPackageFiles(p Package) ([]string, error) {
|
||||||
|
bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second}))
|
||||||
|
if err != nil {
|
||||||
|
return []string{}, errors.Wrap(err, "Error opening boltdb "+db.Path)
|
||||||
|
}
|
||||||
|
defer bolt.Close()
|
||||||
|
|
||||||
|
files := bolt.From("files")
|
||||||
|
var pf PackageFile
|
||||||
|
err = files.One("PackageFingerprint", p.GetFingerPrint(), &pf)
|
||||||
|
if err != nil {
|
||||||
|
return []string{}, errors.Wrap(err, "While finding files")
|
||||||
|
}
|
||||||
|
return pf.Files, nil
|
||||||
|
}
|
||||||
|
func (db *BoltDatabase) SetPackageFiles(p PackageFile) error {
|
||||||
|
bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second}))
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Error opening boltdb "+db.Path)
|
||||||
|
}
|
||||||
|
defer bolt.Close()
|
||||||
|
|
||||||
|
files := bolt.From("files")
|
||||||
|
return files.Save(p)
|
||||||
|
}
|
||||||
|
func (db *BoltDatabase) RemovePackageFiles(p Package) error {
|
||||||
|
bolt, err := storm.Open(db.Path, storm.BoltOptions(0600, &bbolt.Options{Timeout: 30 * time.Second}))
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "Error opening boltdb "+db.Path)
|
||||||
|
}
|
||||||
|
defer bolt.Close()
|
||||||
|
|
||||||
|
files := bolt.From("files")
|
||||||
|
var pf PackageFile
|
||||||
|
err = files.One("PackageFingerprint", p.GetFingerPrint(), &pf)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "While finding files")
|
||||||
|
}
|
||||||
|
return files.DeleteStruct(&pf)
|
||||||
|
}
|
||||||
|
@@ -25,22 +25,23 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var DBInMemoryInstance = &InMemoryDatabase{
|
var DBInMemoryInstance = &InMemoryDatabase{
|
||||||
Mutex: &sync.Mutex{},
|
Mutex: &sync.Mutex{},
|
||||||
|
FileDatabase: map[string][]string{},
|
||||||
Database: map[string]string{}}
|
Database: map[string]string{}}
|
||||||
|
|
||||||
type InMemoryDatabase struct {
|
type InMemoryDatabase struct {
|
||||||
*sync.Mutex
|
*sync.Mutex
|
||||||
Database map[string]string
|
Database map[string]string
|
||||||
|
FileDatabase map[string][]string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewInMemoryDatabase(singleton bool) PackageDatabase {
|
func NewInMemoryDatabase(singleton bool) PackageDatabase {
|
||||||
// In memoryDB is a singleton
|
// In memoryDB is a singleton
|
||||||
if !singleton {
|
if !singleton {
|
||||||
return &InMemoryDatabase{
|
return &InMemoryDatabase{
|
||||||
Mutex: &sync.Mutex{},
|
Mutex: &sync.Mutex{},
|
||||||
|
FileDatabase: map[string][]string{},
|
||||||
Database: map[string]string{}}
|
Database: map[string]string{}}
|
||||||
}
|
}
|
||||||
return DBInMemoryInstance
|
return DBInMemoryInstance
|
||||||
}
|
}
|
||||||
@@ -204,3 +205,28 @@ func (db *InMemoryDatabase) Clean() error {
|
|||||||
db.Database = map[string]string{}
|
db.Database = map[string]string{}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *InMemoryDatabase) GetPackageFiles(p Package) ([]string, error) {
|
||||||
|
|
||||||
|
db.Lock()
|
||||||
|
defer db.Unlock()
|
||||||
|
|
||||||
|
pa, ok := db.FileDatabase[p.GetFingerPrint()]
|
||||||
|
if !ok {
|
||||||
|
return pa, errors.New("No key found with that id")
|
||||||
|
}
|
||||||
|
|
||||||
|
return pa, nil
|
||||||
|
}
|
||||||
|
func (db *InMemoryDatabase) SetPackageFiles(p PackageFile) error {
|
||||||
|
db.Lock()
|
||||||
|
defer db.Unlock()
|
||||||
|
db.FileDatabase[p.PackageFingerprint] = p.Files
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (db *InMemoryDatabase) RemovePackageFiles(p Package) error {
|
||||||
|
db.Lock()
|
||||||
|
defer db.Unlock()
|
||||||
|
delete(db.FileDatabase, p.GetFingerPrint())
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@@ -64,16 +64,6 @@ type Package interface {
|
|||||||
Rel(string) string
|
Rel(string) string
|
||||||
}
|
}
|
||||||
|
|
||||||
type PackageSet interface {
|
|
||||||
GetPackages() []string //Ids
|
|
||||||
CreatePackage(pkg Package) (string, error)
|
|
||||||
GetPackage(ID string) (Package, error)
|
|
||||||
Clean() error
|
|
||||||
FindPackage(Package) (Package, error)
|
|
||||||
UpdatePackage(p Package) error
|
|
||||||
GetAllPackages(packages chan Package) error
|
|
||||||
}
|
|
||||||
|
|
||||||
type Tree interface {
|
type Tree interface {
|
||||||
GetPackageSet() PackageDatabase
|
GetPackageSet() PackageDatabase
|
||||||
Prelude() string // A tree might have a prelude to be able to consume a tree
|
Prelude() string // A tree might have a prelude to be able to consume a tree
|
||||||
|
Reference in New Issue
Block a user