From 833526396c04434b956843a36ad305850b671121 Mon Sep 17 00:00:00 2001 From: Django Cass Date: Tue, 17 Oct 2023 08:35:48 +0000 Subject: [PATCH] reworked alpine package recording --- cmd/build.go | 9 +------ cmd/lock.go | 3 ++- pkg/packages/alpine/alpine.go | 42 ++++++++++++++++++++---------- pkg/packages/alpine/alpine_test.go | 9 ++++++- pkg/packages/debian/debian.go | 4 --- pkg/packages/types.go | 1 - 6 files changed, 39 insertions(+), 29 deletions(-) diff --git a/cmd/build.go b/cmd/build.go index 4e738af..d4977af 100644 --- a/cmd/build.go +++ b/cmd/build.go @@ -118,7 +118,7 @@ func build(cmd *cobra.Command, _ []string) error { return err } - alpineKeeper, err := alpine.NewPackageKeeper(cmd.Context(), repoURLs(cfg.Spec.Repositories[strings.ToLower(string(aybv1.PackageAlpine))])) + alpineKeeper, err := alpine.NewPackageKeeper(cmd.Context(), repoURLs(cfg.Spec.Repositories[strings.ToLower(string(aybv1.PackageAlpine))]), rootfs) if err != nil { return err } @@ -165,13 +165,6 @@ func build(cmd *cobra.Command, _ []string) error { if err := keeper.Unpack(cmd.Context(), pkgPath, rootfs); err != nil { return err } - - // record installation of the package - if p.Direct { - if err := keeper.Record(cmd.Context(), name, rootfs); err != nil { - return err - } - } } // create the non-root user diff --git a/cmd/lock.go b/cmd/lock.go index 391df18..0618f7f 100644 --- a/cmd/lock.go +++ b/cmd/lock.go @@ -8,6 +8,7 @@ import ( "path/filepath" "strings" + "github.com/chainguard-dev/go-apk/pkg/fs" "github.com/djcass44/all-your-base/pkg/airutil" aybv1 "github.com/djcass44/all-your-base/pkg/api/v1" "github.com/djcass44/all-your-base/pkg/containerutil" @@ -106,7 +107,7 @@ func lock(cmd *cobra.Command, _ []string) error { } } - alpineKeeper, err := alpine.NewPackageKeeper(cmd.Context(), repoURLs(cfg.Spec.Repositories[strings.ToLower(string(aybv1.PackageAlpine))])) + alpineKeeper, err := alpine.NewPackageKeeper(cmd.Context(), repoURLs(cfg.Spec.Repositories[strings.ToLower(string(aybv1.PackageAlpine))]), fs.NewMemFS()) if err != nil { return err } diff --git a/pkg/packages/alpine/alpine.go b/pkg/packages/alpine/alpine.go index 466c80a..25f97eb 100644 --- a/pkg/packages/alpine/alpine.go +++ b/pkg/packages/alpine/alpine.go @@ -7,6 +7,7 @@ import ( "errors" "os" "path/filepath" + "strings" "github.com/chainguard-dev/go-apk/pkg/apk" "github.com/chainguard-dev/go-apk/pkg/fs" @@ -14,15 +15,17 @@ import ( "github.com/djcass44/all-your-base/pkg/archiveutil" "github.com/djcass44/all-your-base/pkg/lockfile" "github.com/go-logr/logr" + "gitlab.alpinelinux.org/alpine/go/repository" ) -var worldFile = filepath.Join("etc", "apk", "world") +var installedFile = filepath.Join("/lib", "apk", "db", "installed") type PackageKeeper struct { + rootfs fs.FullFS indices []apk.NamedIndex } -func NewPackageKeeper(ctx context.Context, repositories []string) (*PackageKeeper, error) { +func NewPackageKeeper(ctx context.Context, repositories []string, rootfs fs.FullFS) (*PackageKeeper, error) { log := logr.FromContextOrDiscard(ctx) indices, err := apk.GetRepositoryIndexes(ctx, repositories, map[string][]byte{}, "x86_64", apk.WithIgnoreSignatures(true)) if err != nil { @@ -36,6 +39,7 @@ func NewPackageKeeper(ctx context.Context, repositories []string) (*PackageKeepe return &PackageKeeper{ indices: indices, + rootfs: rootfs, }, nil } @@ -56,12 +60,13 @@ func (*PackageKeeper) Unpack(ctx context.Context, pkg string, rootfs fs.FullFS) return nil } -func (p *PackageKeeper) Record(ctx context.Context, pkg string, rootfs fs.FullFS) error { - log := logr.FromContextOrDiscard(ctx).WithValues("pkg", pkg) +func (p *PackageKeeper) Record(ctx context.Context, pkg *repository.RepositoryPackage, rootfs fs.FullFS) error { + log := logr.FromContextOrDiscard(ctx).WithValues("pkg", pkg.Name) + log.V(2).Info("recording package") - world, err := rootfs.ReadFile(worldFile) + world, err := rootfs.ReadFile(installedFile) if err != nil && !errors.Is(err, os.ErrNotExist) { - log.Error(err, "failed to open world file") + log.Error(err, "failed to open installed file") return err } @@ -69,8 +74,8 @@ func (p *PackageKeeper) Record(ctx context.Context, pkg string, rootfs fs.FullFS scanner := bufio.NewScanner(bytes.NewReader(world)) for scanner.Scan() { line := scanner.Text() - if line == pkg { - log.V(2).Info("located package in world file") + if line == "P:" + pkg.Name { + log.V(2).Info("located package in installed file") return nil } @@ -81,21 +86,23 @@ func (p *PackageKeeper) Record(ctx context.Context, pkg string, rootfs fs.FullFS } // otherwise, append and write - if err := rootfs.MkdirAll(filepath.Dir(worldFile), 0755); err != nil { + if err := rootfs.MkdirAll(filepath.Dir(installedFile), 0755); err != nil { log.Error(err, "failed to create world directory") return err } - log.V(1).Info("appending to the world file") - f, err := rootfs.OpenFile(worldFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + log.V(1).Info("appending to the installed file") + f, err := rootfs.OpenFile(installedFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { - log.Error(err, "failed to open world file for writing") + log.Error(err, "failed to open installed file for writing") return err } defer f.Close() - if _, err = f.Write([]byte(pkg + "\n")); err != nil { - log.Error(err, "failed to write to world file") + out := apk.PackageToIndex(pkg.Package) + + if _, err = f.Write([]byte(strings.Join(out, "\n") + "\n")); err != nil { + log.Error(err, "failed to write to installed file") return err } @@ -111,6 +118,10 @@ func (p *PackageKeeper) Resolve(ctx context.Context, pkg string) ([]lockfile.Pac return nil, err } + if err := p.Record(ctx, repoPkg, p.rootfs); err != nil { + return nil, err + } + // collect the urls for each package names := make([]lockfile.Package, len(repoPkgDeps)+1) names[0] = lockfile.Package{ @@ -122,6 +133,9 @@ func (p *PackageKeeper) Resolve(ctx context.Context, pkg string) ([]lockfile.Pac Direct: true, } for i := range repoPkgDeps { + if err := p.Record(ctx, repoPkgDeps[i], p.rootfs); err != nil { + return nil, err + } names[i+1] = lockfile.Package{ Name: repoPkgDeps[i].Name, Resolved: repoPkgDeps[i].Url(), diff --git a/pkg/packages/alpine/alpine_test.go b/pkg/packages/alpine/alpine_test.go index a8c65ae..25679c3 100644 --- a/pkg/packages/alpine/alpine_test.go +++ b/pkg/packages/alpine/alpine_test.go @@ -30,11 +30,18 @@ func TestPackageKeeper_Unpack(t *testing.T) { } func TestPackageKeeper_Resolve(t *testing.T) { + testfs := fs.NewMemFS() + ctx := logr.NewContext(context.TODO(), testr.NewWithOptions(t, testr.Options{Verbosity: 10})) - pkg, err := NewPackageKeeper(ctx, []string{"https://mirror.aarnet.edu.au/pub/alpine/v3.18/main"}) + pkg, err := NewPackageKeeper(ctx, []string{"https://mirror.aarnet.edu.au/pub/alpine/v3.18/main"}, testfs) require.NoError(t, err) packageNames, err := pkg.Resolve(ctx, "git") assert.NoError(t, err) t.Logf("%+v", packageNames) + + out, err := testfs.ReadFile(installedFile) + require.NoError(t, err) + + t.Logf("%+v", string(out)) } diff --git a/pkg/packages/debian/debian.go b/pkg/packages/debian/debian.go index 26bc49a..c8b2fc6 100644 --- a/pkg/packages/debian/debian.go +++ b/pkg/packages/debian/debian.go @@ -99,10 +99,6 @@ func (*PackageKeeper) unpackXZ(ctx context.Context, src fs.FullFS, dst fs.FullFS return archiveutil.XZuntar(ctx, f, dst) } -func (p *PackageKeeper) Record(ctx context.Context, pkg string, rootfs fs.FullFS) error { - return nil -} - func (p *PackageKeeper) Resolve(ctx context.Context, pkg string) ([]lockfile.Package, error) { for _, idx := range p.indices { out, err := idx.GetPackageWithDependencies(ctx, map[string]debian.Package{}, &debian.PackageVersion{ diff --git a/pkg/packages/types.go b/pkg/packages/types.go index 6098fc0..9e6518e 100644 --- a/pkg/packages/types.go +++ b/pkg/packages/types.go @@ -10,5 +10,4 @@ import ( type PackageManager interface { Unpack(ctx context.Context, pkg string, rootfs fs.FullFS) error Resolve(ctx context.Context, pkg string) ([]lockfile.Package, error) - Record(ctx context.Context, pkg string, rootfs fs.FullFS) error }