From 6377de720803eed6d69d8658aa76500370f2ca43 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Thu, 23 Oct 2025 23:04:35 -0300 Subject: [PATCH 01/26] creating new build system --- cmd/packets/main.go | 2 +- configs/structs.go | 8 ++- internal/build/main.go | 129 ++++++++++++++++++++++++++++++++++++++ internal/utils/lua/lua.go | 1 - internal/utils/utils.go | 6 +- pkg/main.go | 4 ++ 6 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 internal/build/main.go diff --git a/cmd/packets/main.go b/cmd/packets/main.go index af72a91..51c4ff4 100644 --- a/cmd/packets/main.go +++ b/cmd/packets/main.go @@ -649,7 +649,7 @@ func UpgradeToThis(id string, installPath string, installedDB *sql.DB, storePkgF serial = ?, package_d = ?, filename = ?, os = ?, arch = ?, in_cache = ? `, p.QueryName, - p.Manifest.Info.Id, + p.Manifest.Package.Id, p.Version, p.Description, p.Serial, diff --git a/configs/structs.go b/configs/structs.go index 21813b1..09923d5 100644 --- a/configs/structs.go +++ b/configs/structs.go @@ -1,17 +1,21 @@ package configs type Manifest struct { - Info struct { + Package struct { Name string `toml:"name"` Id string `toml:"id"` Version string `toml:"version"` Description string `toml:"description"` Dependencies map[string]string `toml:"dependencies"` Author string `toml:"author"` - } `toml:"Info"` + } `toml:"Package"` + Build struct { + BuildDependencies map[string]string `toml:"dependencies"` + } Hooks struct { Install string `toml:"install"` Remove string `toml:"remove"` + Build string `toml:"build"` } `toml:"Hooks"` } diff --git a/internal/build/main.go b/internal/build/main.go new file mode 100644 index 0000000..c646129 --- /dev/null +++ b/internal/build/main.go @@ -0,0 +1,129 @@ +package build + +import ( + "io" + "os" + "packets/configs" + utils_lua "packets/internal/utils/lua" + "path/filepath" + + "github.com/spf13/afero" + lua "github.com/yuin/gopher-lua" +) + +type Container struct { + Root string + FS afero.Fs + DataDir string + Manifest configs.Manifest +} + +func NewContainer(Root string, dataDir string, manifest configs.Manifest) (Container, error) { + + var container Container + baseFs := afero.NewOsFs() + fileSystem := afero.NewBasePathFs(baseFs, Root) + + container.Root = Root + container.Manifest = manifest + container.DataDir = dataDir + container.FS = fileSystem + + if err := container.CopyHostToContainer(dataDir, "/data"); err != nil { + return Container{}, err + } + + if err := container.FS.MkdirAll("/usr/bin", 0777); err != nil { + return Container{}, err + } + + if err := afero.Symlinker.SymlinkIfPossible(container.FS.(afero.Symlinker), "/usr/bin", "/bin"); err != nil { + return Container{}, err + } + + return container, nil +} + +func (container Container) CopyHostToContainer(src string, dest string) error { + stats, err := os.Stat(src) + if err != nil { + return err + } + + if stats.IsDir() { + files, err := os.ReadDir(src) + if err != nil { + return err + } + + if err := container.FS.MkdirAll(dest, 0755); err != nil { + return err + } + + for _, file := range files { + srcPath := filepath.Join(src, file.Name()) + destPath := filepath.Join(dest, file.Name()) + + if file.IsDir() { + if err := container.CopyHostToContainer(srcPath, destPath); err != nil { + return err + } + continue + } + + if err := container.copySingleFile(srcPath, destPath); err != nil { + return err + } + } + } else { + if err := container.copySingleFile(src, dest); err != nil { + return err + } + } + + return nil +} + +func (container Container) copySingleFile(source string, destination string) error { + src, err := os.Open(source) + if err != nil { + return err + } + defer src.Close() + + stats, err := src.Stat() + if err != nil { + return err + } + if err := container.FS.MkdirAll(filepath.Dir(destination), 0755); err != nil { + return err + } + dst, err := container.FS.Create(destination) + if err != nil { + return err + } + defer dst.Close() + + if _, err := io.Copy(dst, src); err != nil { + return err + } + + if err := container.FS.Chmod(destination, stats.Mode()); err != nil { + return err + } + + return nil +} + +func (container Container) RunBuild() error { + + L, err := utils_lua.GetSandBox() + if err != nil { + return err + } + + L.SetGlobal("data_dir", lua.LString(container.DataDir)) + L.SetGlobal("script", lua.LString(container.Manifest.Hooks.Build)) + + return nil +} diff --git a/internal/utils/lua/lua.go b/internal/utils/lua/lua.go index 425582a..f4a5607 100644 --- a/internal/utils/lua/lua.go +++ b/internal/utils/lua/lua.go @@ -14,7 +14,6 @@ func GetSandBox() (lua.LState, error) { } L := lua.NewState() osObject := L.GetGlobal("os").(*lua.LTable) - L.SetGlobal("SAFE_MODE", lua.LTrue) L.SetGlobal("PACKETS_DATADIR", lua.LString(cfg.Config.Data_d)) diff --git a/internal/utils/utils.go b/internal/utils/utils.go index 691293b..6512262 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -210,7 +210,7 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error { defer func() { if !success { - _, err := db.Exec("DELETE FROM packages WHERE id = ?", p.Manifest.Info.Id) + _, err := db.Exec("DELETE FROM packages WHERE id = ?", p.Manifest.Package.Id) if err != nil { log.Println("failed to rollback package addition:", err) } @@ -223,7 +223,7 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error { serial, package_d, filename, os, arch, in_cache ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, p.QueryName, - p.Manifest.Info.Id, + p.Manifest.Package.Id, p.Version, p.Description, p.Serial, @@ -238,7 +238,7 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error { } for depnName, versionConstraint := range p.Dependencies { - _, err = db.Exec("INSERT INTO package_dependencies (package_id, dependency_name, version_constraint) VALUES (?, ?, ?)", p.Manifest.Info.Id, depnName, versionConstraint) + _, err = db.Exec("INSERT INTO package_dependencies (package_id, dependency_name, version_constraint) VALUES (?, ?, ?)", p.Manifest.Package.Id, depnName, versionConstraint) } success = true diff --git a/pkg/main.go b/pkg/main.go index b016e50..ce1909f 100644 --- a/pkg/main.go +++ b/pkg/main.go @@ -113,6 +113,10 @@ func InstallPackage(file []byte, destDir string) error { if err != nil { return err } + + L.SetGlobal("data_dir", lua.LString(filepath.Join(destDir, "data"))) + L.SetGlobal("script", lua.LString(manifest.Hooks.Build)) + L.SetGlobal("data_dir", lua.LString(filepath.Join(destDir, "data"))) L.SetGlobal("script", lua.LString(manifest.Hooks.Install)) From 26f9e20ae8beefa38fbe849df380a00df09d0640 Mon Sep 17 00:00:00 2001 From: roboogg133 Date: Fri, 24 Oct 2025 11:10:43 -0300 Subject: [PATCH 02/26] doing lua functions for build files, to run only in afero.FS --- internal/build/lua.go | 116 +++++++++++++++++++++++++++++ internal/build/main.go | 4 +- internal/build/specs.go | 6 ++ internal/build/utils.go | 79 ++++++++++++++++++++ internal/utils/lua/luafunctions.go | 4 +- 5 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 internal/build/lua.go create mode 100644 internal/build/specs.go create mode 100644 internal/build/utils.go diff --git a/internal/build/lua.go b/internal/build/lua.go new file mode 100644 index 0000000..9579c8a --- /dev/null +++ b/internal/build/lua.go @@ -0,0 +1,116 @@ +package build + +import ( + "os" + "strings" + + lua "github.com/yuin/gopher-lua" +) + +func (container Container) lRemove(L *lua.LState) int { + filename := L.CheckString(1) + + err := container.FS.RemoveAll(filename) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func (container Container) lRename(L *lua.LState) int { + oldname := L.CheckString(1) + newname := L.CheckString(2) + + if err := container.FS.Rename(oldname, newname); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + return 1 +} +func (container Container) lCopy(L *lua.LState) int { + oldname := L.CheckString(1) + newname := L.CheckString(2) + + if err := container.copyContainer(oldname, newname); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 + +} + +func modeFlags(mode string) int { + switch mode { + case "r", "rb": + return os.O_RDONLY + case "w", "wb": + return os.O_CREATE | os.O_WRONLY | os.O_TRUNC + case "a", "ab": + return os.O_CREATE | os.O_WRONLY | os.O_APPEND + case "r+", "r+b", "rb+", "br+": + return os.O_RDWR + case "w+", "w+b", "wb+", "bw+": + return os.O_CREATE | os.O_RDWR | os.O_TRUNC + case "a+", "a+b", "ab+", "ba+": + return os.O_CREATE | os.O_RDWR | os.O_APPEND + default: + return os.O_RDONLY + } +} + +func (container Container) lOpen(L *lua.LState) int { + path := L.CheckString(1) + mode := L.OptString(2, "r") + + file, err := container.FS.OpenFile(path, modeFlags(mode), 0644) + if err != nil { + L.Push(lua.LNil) + L.Push(lua.LString(err.Error())) + return 2 + } + + ud := L.NewUserData() + ud.Value = file + L.SetMetatable(ud, L.GetTypeMetatable("file")) + L.Push(ud) + L.Push(lua.LNil) + return 2 +} + +func (container Container) lMkdir(L *lua.LState) int { + path := L.CheckString(1) + perm := L.CheckInt(2) + + if err := container.FS.MkdirAll(path, os.FileMode(perm)); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func (container Container) lexecute(L *lua.LState) { + cmdString := L.CheckString(1) + + cmdSlice := strings.Fields(cmdString) +} + +func (container Container) GetLuaState() error { + + lua.NewState(lua.Options{}) + return nil +} diff --git a/internal/build/main.go b/internal/build/main.go index c646129..11ebaa7 100644 --- a/internal/build/main.go +++ b/internal/build/main.go @@ -33,11 +33,11 @@ func NewContainer(Root string, dataDir string, manifest configs.Manifest) (Conta return Container{}, err } - if err := container.FS.MkdirAll("/usr/bin", 0777); err != nil { + if err := container.FS.MkdirAll(BinDir, 0777); err != nil { return Container{}, err } - if err := afero.Symlinker.SymlinkIfPossible(container.FS.(afero.Symlinker), "/usr/bin", "/bin"); err != nil { + if err := afero.Symlinker.SymlinkIfPossible(container.FS.(afero.Symlinker), BinDir, SymLinkBinDir); err != nil { return Container{}, err } diff --git a/internal/build/specs.go b/internal/build/specs.go new file mode 100644 index 0000000..6bcdf98 --- /dev/null +++ b/internal/build/specs.go @@ -0,0 +1,6 @@ +package build + +const ( + BinDir = "/usr/bin" + SymLinkBinDir = "/bin" +) diff --git a/internal/build/utils.go b/internal/build/utils.go new file mode 100644 index 0000000..1f645ba --- /dev/null +++ b/internal/build/utils.go @@ -0,0 +1,79 @@ +package build + +import ( + "io" + "path/filepath" + + "github.com/spf13/afero" +) + +func (container Container) copyContainer(src string, dest string) error { + stats, err := container.FS.Stat(src) + if err != nil { + return err + } + + if stats.IsDir() { + files, err := afero.ReadDir(container.FS, src) + if err != nil { + return err + } + + if err := container.FS.MkdirAll(dest, 0755); err != nil { + return err + } + + for _, file := range files { + srcPath := filepath.Join(src, file.Name()) + destPath := filepath.Join(dest, file.Name()) + + if file.IsDir() { + if err := container.CopyHostToContainer(srcPath, destPath); err != nil { + return err + } + continue + } + + if err := container.copySingleFileLtoL(srcPath, destPath); err != nil { + return err + } + } + } else { + if err := container.copySingleFileLtoL(src, dest); err != nil { + return err + } + } + + return nil +} + +func (container Container) copySingleFileLtoL(source string, destination string) error { + src, err := container.FS.Open(source) + if err != nil { + return err + } + defer src.Close() + + stats, err := src.Stat() + if err != nil { + return err + } + if err := container.FS.MkdirAll(filepath.Dir(destination), 0755); err != nil { + return err + } + dst, err := container.FS.Create(destination) + if err != nil { + return err + } + defer dst.Close() + + if _, err := io.Copy(dst, src); err != nil { + return err + } + + if err := container.FS.Chmod(destination, stats.Mode()); err != nil { + return err + } + + return nil +} diff --git a/internal/utils/lua/luafunctions.go b/internal/utils/lua/luafunctions.go index cab3c8d..a8378ff 100644 --- a/internal/utils/lua/luafunctions.go +++ b/internal/utils/lua/luafunctions.go @@ -253,8 +253,8 @@ func LError(L *lua.LState) int { parts = append(parts, val.String()) } - Llogger().Panic(parts...) + llogger().Panic(parts...) return 0 } -func Llogger() *log.Logger { return log.New(os.Stderr, " script error: ", 0) } +func llogger() *log.Logger { return log.New(os.Stderr, " script error: ", 0) } From 52f675ab60aff55338cfc88d3e51f1fe936f3aea Mon Sep 17 00:00:00 2001 From: roboogg133 Date: Fri, 24 Oct 2025 11:56:47 -0300 Subject: [PATCH 03/26] doing io.popen --- go.mod | 28 +-------------- go.sum | 71 ++------------------------------------ internal/build/lua.go | 80 ++++++++++++++++++++++++++++++++++++++++++- main.go | 15 ++++++++ 4 files changed, 97 insertions(+), 97 deletions(-) create mode 100644 main.go diff --git a/go.mod b/go.mod index d4c9d89..4f88d82 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module packets go 1.25.1 require ( - github.com/gin-gonic/gin v1.11.0 github.com/klauspost/compress v1.18.0 github.com/pelletier/go-toml/v2 v2.2.4 + github.com/spf13/afero v1.15.0 github.com/spf13/cobra v1.10.1 github.com/yuin/gopher-lua v1.1.1 golang.org/x/net v0.44.0 @@ -13,42 +13,16 @@ require ( ) require ( - github.com/bytedance/sonic v1.14.0 // indirect - github.com/bytedance/sonic/loader v0.3.0 // indirect - github.com/cloudwego/base64x v0.1.6 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/gabriel-vasile/mimetype v1.4.8 // indirect - github.com/gin-contrib/sse v1.1.0 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.27.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/goccy/go-yaml v1.18.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.3.0 // indirect - github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect - github.com/quic-go/qpack v0.5.1 // indirect - github.com/quic-go/quic-go v0.54.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.3.0 // indirect - go.uber.org/mock v0.5.0 // indirect - golang.org/x/arch v0.20.0 // indirect - golang.org/x/crypto v0.42.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/sync v0.17.0 // indirect golang.org/x/sys v0.36.0 // indirect golang.org/x/text v0.29.0 // indirect - golang.org/x/tools v0.36.0 // indirect - google.golang.org/protobuf v1.36.9 // indirect modernc.org/libc v1.66.3 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect diff --git a/go.sum b/go.sum index 941aff8..103047d 100644 --- a/go.sum +++ b/go.sum @@ -1,95 +1,32 @@ -github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= -github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= -github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= -github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= -github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= -github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= -github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= -github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= -github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= -github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= -github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= -github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= -github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= -github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= -github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= -github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= -github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= -go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= -go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= -golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= -golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= -golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= -golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= @@ -105,11 +42,7 @@ golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM= modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= diff --git a/internal/build/lua.go b/internal/build/lua.go index 9579c8a..9fa80bf 100644 --- a/internal/build/lua.go +++ b/internal/build/lua.go @@ -1,9 +1,12 @@ package build import ( + "fmt" "os" + "os/exec" "strings" + "github.com/spf13/afero" lua "github.com/yuin/gopher-lua" ) @@ -103,10 +106,85 @@ func (container Container) lMkdir(L *lua.LState) int { return 2 } -func (container Container) lexecute(L *lua.LState) { +func (container Container) lexecute(L *lua.LState) int { cmdString := L.CheckString(1) cmdSlice := strings.Fields(cmdString) + + files, err := afero.ReadDir(container.FS, BinDir) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString("exit")) + L.Push(lua.LNumber(127)) + return 3 + } + + for _, file := range files { + if !file.IsDir() && file.Name() == cmdSlice[0] { + err := exec.Command(cmdSlice[0], cmdSlice[1:]...).Run() + if err != nil { + if errr := err.(*exec.ExitError); errr != nil { + L.Push(lua.LFalse) + + if err.(*exec.ExitError).Exited() { + L.Push(lua.LString("exit")) + } else { + L.Push(lua.LString("signal")) + } + + L.Push(lua.LNumber(err.(*exec.ExitError).ExitCode())) + return 3 + } + } + L.Push(lua.LTrue) + L.Push(lua.LString("exit")) + L.Push(lua.LNumber(0)) + } + } + + L.Push(lua.LFalse) + L.Push(lua.LString("exit")) + L.Push(lua.LNumber(127)) + return 3 +} + +func (container Container) lpopen(L *lua.LState) int { + cmdString := L.CheckString(1) + mode := L.CheckString(2) + + cmdSlice := strings.Fields(cmdString) + + files, err := afero.ReadDir(container.FS, BinDir) + if err != nil { + L.Push(lua.LNil) + L.Push(lua.LString("can't find executable")) + return 2 + } + + for _, file := range files { + if !file.IsDir() && file.Name() == cmdSlice[0] { + cmd := exec.Command(cmdSlice[0], cmdSlice[1:]...) + output, _ := cmd.CombinedOutput() + + switch mode { + case "r": + ud := L.NewUserData() + ud.Value = string(output) + L.SetMetatable(ud, L.GetTypeMetatable("file")) + L.Push(ud) + L.Push(lua.LNil) + case "w": + default: + L.Push(lua.LNil) + L.Push(lua.LString(fmt.Sprintf("%s: Invalid argument", cmdString))) + } + + } + } + + L.Push(lua.LNil) + L.Push(lua.LString("can't find any executable")) + return 2 } func (container Container) GetLuaState() error { diff --git a/main.go b/main.go new file mode 100644 index 0000000..7368d0d --- /dev/null +++ b/main.go @@ -0,0 +1,15 @@ +package main + +import ( + "fmt" + + lua "github.com/yuin/gopher-lua" +) + +func main() { + L := lua.NewState() + + if err := L.DoFile("lua.lua"); err != nil { + fmt.Println(err) + } +} From dbd63d371b6c926a7a2f980cb1e67eb3404c45ce Mon Sep 17 00:00:00 2001 From: robogg133 Date: Fri, 24 Oct 2025 17:00:46 -0300 Subject: [PATCH 04/26] new values in manifest.toml --- configs/structs.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configs/structs.go b/configs/structs.go index 09923d5..28734da 100644 --- a/configs/structs.go +++ b/configs/structs.go @@ -8,6 +8,9 @@ type Manifest struct { Description string `toml:"description"` Dependencies map[string]string `toml:"dependencies"` Author string `toml:"author"` + Architeture string `toml:"architeture"` + Os string `toml:"os"` + PacakgeType string `toml:"type"` } `toml:"Package"` Build struct { BuildDependencies map[string]string `toml:"dependencies"` From 31af4d5389298f90e92452d999a657e1b9b978af Mon Sep 17 00:00:00 2001 From: robogg133 Date: Fri, 24 Oct 2025 17:01:21 -0300 Subject: [PATCH 05/26] new go.mod and go.sum --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 4f88d82..2338ffc 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/spf13/afero v1.15.0 // indirect github.com/spf13/pflag v1.0.10 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/sys v0.36.0 // indirect From cc9587821d18a8127f3ec6f39d5bdceedeae0946 Mon Sep 17 00:00:00 2001 From: roboogg133 Date: Fri, 24 Oct 2025 17:03:41 -0300 Subject: [PATCH 06/26] modifications to build/lua.go --- internal/build/lua.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/internal/build/lua.go b/internal/build/lua.go index 9fa80bf..55e9d81 100644 --- a/internal/build/lua.go +++ b/internal/build/lua.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/afero" lua "github.com/yuin/gopher-lua" + "packets/configs" ) func (container Container) lRemove(L *lua.LState) int { @@ -37,6 +38,7 @@ func (container Container) lRename(L *lua.LState) int { L.Push(lua.LTrue) return 1 } + func (container Container) lCopy(L *lua.LState) int { oldname := L.CheckString(1) newname := L.CheckString(2) @@ -50,7 +52,6 @@ func (container Container) lCopy(L *lua.LState) int { L.Push(lua.LTrue) L.Push(lua.LNil) return 2 - } func modeFlags(mode string) int { @@ -76,7 +77,7 @@ func (container Container) lOpen(L *lua.LState) int { path := L.CheckString(1) mode := L.OptString(2, "r") - file, err := container.FS.OpenFile(path, modeFlags(mode), 0644) + file, err := container.FS.OpenFile(path, modeFlags(mode), 0o644) if err != nil { L.Push(lua.LNil) L.Push(lua.LString(err.Error())) @@ -174,6 +175,12 @@ func (container Container) lpopen(L *lua.LState) int { L.Push(ud) L.Push(lua.LNil) case "w": + ud := L.NewUserData() + ud.Value = string(output) + os.Stdout.Write(output) + L.SetMetatable(ud, L.GetTypeMetatable("file")) + L.Push(ud) + L.Push(lua.LNil) default: L.Push(lua.LNil) L.Push(lua.LString(fmt.Sprintf("%s: Invalid argument", cmdString))) @@ -188,7 +195,25 @@ func (container Container) lpopen(L *lua.LState) int { } func (container Container) GetLuaState() error { + cfg, err := configs.GetConfigTOML() + if err != nil { + return err + } + L := lua.NewState() + osObject := L.GetGlobal("os").(*lua.LTable) + L.SetGlobal("SAFE_MODE", lua.LTrue) - lua.NewState(lua.Options{}) + L.SetGlobal("PACKETS_DATADIR", lua.LString(cfg.Config.Data_d)) + L.SetGlobal("PACKETS_BINDIR", lua.LString(cfg.Config.Bin_d)) + + L.SetGlobal("path_join", L.NewFunction()) + + // Packets build functions + + osObject.RawSetString("remove", L.NewFunction(LSafeRemove)) + osObject.RawSetString("rename", L.NewFunction(LSafeRename)) + osObject.RawSetString("copy", L.NewFunction(LSafeCopy)) + osObject.RawSetString("symlink", L.NewFunction(LSymlink)) + osObject.RawSetString("mkdir", L.NewFunction(LMkdir)) return nil } From df32178372081940118a4f702803d4dffbe14ef3 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Fri, 24 Oct 2025 17:14:44 -0300 Subject: [PATCH 07/26] with afero functions need, to see more functions to use afero --- internal/build/lua.go | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/internal/build/lua.go b/internal/build/lua.go index 55e9d81..f598127 100644 --- a/internal/build/lua.go +++ b/internal/build/lua.go @@ -6,9 +6,10 @@ import ( "os/exec" "strings" + utils_lua "packets/internal/utils/lua" + "github.com/spf13/afero" lua "github.com/yuin/gopher-lua" - "packets/configs" ) func (container Container) lRemove(L *lua.LState) int { @@ -195,25 +196,17 @@ func (container Container) lpopen(L *lua.LState) int { } func (container Container) GetLuaState() error { - cfg, err := configs.GetConfigTOML() - if err != nil { - return err - } L := lua.NewState() osObject := L.GetGlobal("os").(*lua.LTable) - L.SetGlobal("SAFE_MODE", lua.LTrue) - L.SetGlobal("PACKETS_DATADIR", lua.LString(cfg.Config.Data_d)) - L.SetGlobal("PACKETS_BINDIR", lua.LString(cfg.Config.Bin_d)) - - L.SetGlobal("path_join", L.NewFunction()) + L.SetGlobal("path_join", L.NewFunction(utils_lua.Ljoin)) // Packets build functions - osObject.RawSetString("remove", L.NewFunction(LSafeRemove)) - osObject.RawSetString("rename", L.NewFunction(LSafeRename)) - osObject.RawSetString("copy", L.NewFunction(LSafeCopy)) - osObject.RawSetString("symlink", L.NewFunction(LSymlink)) - osObject.RawSetString("mkdir", L.NewFunction(LMkdir)) + osObject.RawSetString("remove", L.NewFunction(container.lRemove)) + osObject.RawSetString("rename", L.NewFunction(container.lRename)) + osObject.RawSetString("copy", L.NewFunction(container.lCopy)) + + osObject.RawSetString("mkdir", L.NewFunction(container.lMkdir)) return nil } From e3772d0944707eae0541fd8009836814298037e0 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 10:16:33 -0300 Subject: [PATCH 08/26] some bug fixes, manifest.toml don't exist anyomre and all data for installation will be in one file name Packet.lua --- cmd/packets/main.go | 2 - configs/structs.go | 6 ++ internal/build/install.go | 165 ++++++++++++++++++++++++++++++++++++++ internal/build/lua.go | 62 +++++++++++++- internal/build/main.go | 86 +++++++++++++++++--- internal/build/manager.go | 44 ++++++++++ internal/build/specs.go | 2 + internal/consts/consts.go | 1 + internal/packet/main.go | 18 +++++ internal/utils/lua/git.go | 28 +++++++ pkg/main.go | 13 ++- 11 files changed, 405 insertions(+), 22 deletions(-) create mode 100644 internal/build/install.go create mode 100644 internal/build/manager.go create mode 100644 internal/packet/main.go create mode 100644 internal/utils/lua/git.go diff --git a/cmd/packets/main.go b/cmd/packets/main.go index 51c4ff4..bda76ba 100644 --- a/cmd/packets/main.go +++ b/cmd/packets/main.go @@ -2,7 +2,6 @@ package main import ( "database/sql" - _ "embed" "fmt" "log" "os" @@ -258,7 +257,6 @@ var installCmd = &cobra.Command{ var wg sync.WaitGroup wg.Add(1) go AsyncFullyUpgrade(inputName, cfg.Config.StorePackages, filepath.Join(cfg.Config.Data_d, id), &wg, db) - wg.Done() continue } diff --git a/configs/structs.go b/configs/structs.go index 28734da..5650059 100644 --- a/configs/structs.go +++ b/configs/structs.go @@ -1,5 +1,6 @@ package configs +/* type Manifest struct { Package struct { Name string `toml:"name"` @@ -11,16 +12,21 @@ type Manifest struct { Architeture string `toml:"architeture"` Os string `toml:"os"` PacakgeType string `toml:"type"` + + GitUrl string `toml:"giturl,omitempty"` + Branch string `toml:"gitbranch,omitempty"` } `toml:"Package"` Build struct { BuildDependencies map[string]string `toml:"dependencies"` } Hooks struct { + Fetch string `toml:"fetch,omitempty"` Install string `toml:"install"` Remove string `toml:"remove"` Build string `toml:"build"` } `toml:"Hooks"` } +*/ type ConfigTOML struct { Config struct { diff --git a/internal/build/install.go b/internal/build/install.go new file mode 100644 index 0000000..7dcb95e --- /dev/null +++ b/internal/build/install.go @@ -0,0 +1,165 @@ +package build + +import ( + "archive/tar" + "bytes" + "fmt" + "io" + "log" + "os" + "packets/internal/utils" + utils_lua "packets/internal/utils/lua" + "path/filepath" + "strings" + "sync" + + "github.com/klauspost/compress/zstd" + lua "github.com/yuin/gopher-lua" +) + +func (container Container) installPackage(file []byte, destDir string) error { + manifest, err := utils.ReadManifest(bytes.NewReader(file)) + if err != nil { + return err + } + + zstdReader, err := zstd.NewReader(bytes.NewReader(file)) + if err != nil { + return err + } + defer zstdReader.Close() + + tarReader := tar.NewReader(zstdReader) + + uid, err := utils.GetPacketsUID() + if err != nil { + return err + } + + for { + hdr, err := tarReader.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + rel := filepath.Clean(hdr.Name) + + if rel == ".." || strings.HasPrefix(rel, ".."+string(os.PathSeparator)) { + continue + } + + if err := os.MkdirAll(filepath.Join(container.Root, destDir), 0775); err != nil { + return err + } + + if err := os.Chown(filepath.Join(container.Root, destDir), uid, 0); err != nil { + return err + } + + absPath := filepath.Join(filepath.Join(container.Root, destDir), rel) + + switch hdr.Typeflag { + + case tar.TypeDir: + err = os.MkdirAll(absPath, os.FileMode(hdr.Mode)) + if err != nil { + return err + } + if err := os.Chown(absPath, uid, 0); err != nil { + return err + } + + case tar.TypeReg: + + err = os.MkdirAll(filepath.Dir(absPath), 0775) + if err != nil { + return err + } + + out, err := os.Create(absPath) + if err != nil { + return err + } + + _, err = io.Copy(out, tarReader) + out.Close() + if err != nil { + return err + } + + err = os.Chmod(absPath, os.FileMode(0775)) + if err != nil { + return err + } + + if filepath.Base(hdr.Name) == "manifest.toml" || filepath.Base(hdr.Name) == manifest.Hooks.Install || filepath.Base(hdr.Name) == manifest.Hooks.Remove { + err = os.Chmod(absPath, os.FileMode(0755)) + if err != nil { + return err + } + } else { + if err := os.Chown(absPath, uid, 0); err != nil { + return err + } + } + } + } + + L, err := utils_lua.GetSandBox() + if err != nil { + return err + } + + L.SetGlobal("DATA_DIR", lua.LString(filepath.Join(destDir, "data"))) + L.SetGlobal("script", lua.LString(manifest.Hooks.Build)) + + bootstrapcontainer, err := NewContainer(filepath.Join(container.Root, destDir, "data"), manifest) + if err != nil { + return err + } + + bootstrapcontainer.LuaState.DoFile(manifest.Hooks.Build) + + L.SetGlobal("DATA_DIR", lua.LString(filepath.Join(destDir, "data"))) + L.SetGlobal("script", lua.LString(manifest.Hooks.Install)) + + if err := utils.ChangeToNoPermission(); err != nil { + return err + } + if err := L.DoFile(filepath.Join(destDir, manifest.Hooks.Install)); err != nil { + return err + } + + if err := utils.ElevatePermission(); err != nil { + return err + } + + return nil +} + +func (container Container) asyncFullInstallDependencie(dep string, storePackages bool, installPath string, wg *sync.WaitGroup, mu *sync.Mutex) { + defer wg.Done() + + fmt.Printf(" downloading %s \n", dep) + p, err := utils.GetPackage(dep) + if err != nil { + log.Fatal(err) + } + + fmt.Printf(" installing %s \n", dep) + + if err := container.installPackage(p.PackageF, installPath); err != nil { + log.Fatal(err) + } + + if storePackages { + _, err := p.Write() + if err != nil { + log.Fatal(err) + return + } + } +} diff --git a/internal/build/lua.go b/internal/build/lua.go index f598127..f454fad 100644 --- a/internal/build/lua.go +++ b/internal/build/lua.go @@ -2,6 +2,7 @@ package build import ( "fmt" + "io" "os" "os/exec" "strings" @@ -195,18 +196,71 @@ func (container Container) lpopen(L *lua.LState) int { return 2 } -func (container Container) GetLuaState() error { +func (container Container) lGet(L *lua.LState) int { + src := L.CheckString(1) + dest := L.CheckString(2) + + file, err := container.FS.Open(src) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + defer file.Close() + + info, err := file.Stat() + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + fileBlob, err := io.ReadAll(file) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + if err := os.WriteFile(dest, fileBlob, info.Mode()); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func (container Container) lCopyToContainer(L *lua.LState) int { + + if err := container.CopyHostToContainer(L.CheckString(1), L.CheckString(2)); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func (container Container) GetLuaState() { + L := lua.NewState() osObject := L.GetGlobal("os").(*lua.LTable) + ioObject := L.GetGlobal("io").(*lua.LTable) L.SetGlobal("path_join", L.NewFunction(utils_lua.Ljoin)) - // Packets build functions - osObject.RawSetString("remove", L.NewFunction(container.lRemove)) osObject.RawSetString("rename", L.NewFunction(container.lRename)) osObject.RawSetString("copy", L.NewFunction(container.lCopy)) osObject.RawSetString("mkdir", L.NewFunction(container.lMkdir)) - return nil + + ioObject.RawSetString("popen", L.NewFunction(container.lpopen)) + ioObject.RawSetString("open", L.NewFunction(container.lOpen)) + + container.LuaState = *L } diff --git a/internal/build/main.go b/internal/build/main.go index 11ebaa7..87c8523 100644 --- a/internal/build/main.go +++ b/internal/build/main.go @@ -1,30 +1,70 @@ package build import ( + "database/sql" + "encoding/base64" + "encoding/json" "io" "os" "packets/configs" - utils_lua "packets/internal/utils/lua" + "packets/internal/consts" "path/filepath" + _ "modernc.org/sqlite" + "github.com/spf13/afero" lua "github.com/yuin/gopher-lua" ) type Container struct { - Root string - FS afero.Fs - DataDir string - Manifest configs.Manifest + BuildID BuildID + Root string + FS afero.Fs + DataDir string + LuaState lua.LState + Manifest configs.Manifest + uses int + DeleteAfter bool } -func NewContainer(Root string, dataDir string, manifest configs.Manifest) (Container, error) { +func NewContainer(dataDir string, manifest configs.Manifest) (Container, error) { var container Container + var err error + container.BuildID, err = getBuildId(manifest.Build.BuildDependencies) + if err != nil { + return Container{}, err + } baseFs := afero.NewOsFs() - fileSystem := afero.NewBasePathFs(baseFs, Root) - container.Root = Root + db, err := sql.Open("sqlite", consts.InstalledDB) + if err != nil { + return Container{}, err + } + if err := db.QueryRow("SELECT uses, dir FROM build_dependencies WHERE id = ? ", container.BuildID).Scan(&container.uses, container.Root); err != nil { + db.Close() + return Container{}, err + } + db.Close() + + if container.Root != "/dev/null" { + if _, err := os.Stat(container.Root); err != nil { + if os.IsNotExist(err) { + if err := container.createNew(); err != nil { + return Container{}, err + } + } + } + } else { + container.DeleteAfter = true + if err := container.createNew(); err != nil { + return Container{}, err + } + } + + container.GetLuaState() + fileSystem := afero.NewBasePathFs(baseFs, container.Root) + container.Manifest = manifest container.DataDir = dataDir container.FS = fileSystem @@ -37,6 +77,10 @@ func NewContainer(Root string, dataDir string, manifest configs.Manifest) (Conta return Container{}, err } + if err := container.FS.MkdirAll("/etc/packets", 0777); err != nil { + return Container{}, err + } + if err := afero.Symlinker.SymlinkIfPossible(container.FS.(afero.Symlinker), BinDir, SymLinkBinDir); err != nil { return Container{}, err } @@ -115,15 +159,31 @@ func (container Container) copySingleFile(source string, destination string) err return nil } -func (container Container) RunBuild() error { +func getBuildId(buildDependencies map[string]string) (BuildID, error) { + blobs, err := json.Marshal(buildDependencies) + if err != nil { + return "", err + } + return BuildID(base64.StdEncoding.EncodeToString(blobs)), nil +} - L, err := utils_lua.GetSandBox() +func (container Container) saveBuild() error { + db, err := sql.Open("sqlite", consts.InstalledDB) if err != nil { return err } + defer db.Close() - L.SetGlobal("data_dir", lua.LString(container.DataDir)) - L.SetGlobal("script", lua.LString(container.Manifest.Hooks.Build)) + buildID := container.BuildID + var exists bool + if err := db.QueryRow("SELECT EXISTS(SELECT 1 FROM build_dependencies WHERE id = ?)", buildID).Scan(exists); err != nil { + return err + } + if exists { + _, err := db.Exec("UPDATE FROM build_dependencies WHERE id = ? SET uses = uses + 1", buildID) + return err + } - return nil + _, err = db.Exec("INSERT INTO build_dependencies (id) VALUES (?)", buildID) + return err } diff --git a/internal/build/manager.go b/internal/build/manager.go new file mode 100644 index 0000000..b76ed2d --- /dev/null +++ b/internal/build/manager.go @@ -0,0 +1,44 @@ +package build + +import ( + "os" + "packets/configs" + "packets/internal/consts" + "packets/internal/utils" + "path/filepath" + "sync" + + _ "modernc.org/sqlite" +) + +func (container Container) createNew() error { + if err := os.MkdirAll(filepath.Join(consts.BuildImagesDir, string(container.BuildID)), 0775); err != nil { + return err + } + packetsuid, err := utils.GetPacketsUID() + if err != nil { + return err + } + if err := os.Chown(filepath.Join(consts.BuildImagesDir, string(container.BuildID)), packetsuid, 0); err != nil { + return err + } + dependencies, err := utils.ResolvDependencies(container.Manifest.Build.BuildDependencies) + if err != nil { + return err + } + + cfg, err := configs.GetConfigTOML() + if err != nil { + return err + } + var wg sync.WaitGroup + var mu sync.Mutex + for _, depn := range dependencies { + wg.Add(1) + go container.asyncFullInstallDependencie(depn, cfg.Config.StorePackages, depn, &wg, &mu) + } + wg.Wait() + + container.saveBuild() + return nil +} diff --git a/internal/build/specs.go b/internal/build/specs.go index 6bcdf98..be62122 100644 --- a/internal/build/specs.go +++ b/internal/build/specs.go @@ -4,3 +4,5 @@ const ( BinDir = "/usr/bin" SymLinkBinDir = "/bin" ) + +type BuildID string // Json dependencies encoded to base64 stdEncoding diff --git a/internal/consts/consts.go b/internal/consts/consts.go index 182078a..054f8ae 100644 --- a/internal/consts/consts.go +++ b/internal/consts/consts.go @@ -11,6 +11,7 @@ const ( LANDeadline = 2 * time.Second IndexDB = "/etc/packets/index.db" InstalledDB = "/etc/packets/installed.db" + BuildImagesDir = "/etc/packets/temp" DefaultSyncUrl = "https://servidordomal.fun/index.db" ) diff --git a/internal/packet/main.go b/internal/packet/main.go new file mode 100644 index 0000000..15fbea2 --- /dev/null +++ b/internal/packet/main.go @@ -0,0 +1,18 @@ +package packet + +type PacketLua struct { + Name string + Id string + Version string + Description string + Dependencies map[string]string + Author string + Architetures []string + Os []string + + PkgType string + GitUrl string + GitBranch string + + BuildDependencies string +} diff --git a/internal/utils/lua/git.go b/internal/utils/lua/git.go new file mode 100644 index 0000000..30782ef --- /dev/null +++ b/internal/utils/lua/git.go @@ -0,0 +1,28 @@ +package utils_lua + +import ( + "os" + + "github.com/go-git/go-git" + lua "github.com/yuin/gopher-lua" +) + +func LGitClone(L *lua.LState) int { + uri := L.CheckString(1) + output := L.CheckString(2) + + _, err := git.PlainClone(output, false, &git.CloneOptions{ + URL: uri, + Progress: os.Stdout, + }) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func LGitCheckout(L) diff --git a/pkg/main.go b/pkg/main.go index ce1909f..a0d76e8 100644 --- a/pkg/main.go +++ b/pkg/main.go @@ -5,6 +5,7 @@ import ( "bytes" "io" "os" + "packets/internal/build" "packets/internal/utils" "runtime" @@ -114,9 +115,16 @@ func InstallPackage(file []byte, destDir string) error { return err } - L.SetGlobal("data_dir", lua.LString(filepath.Join(destDir, "data"))) + L.SetGlobal("DATA_DIR", lua.LString(filepath.Join(destDir, "data"))) L.SetGlobal("script", lua.LString(manifest.Hooks.Build)) + container, err := build.NewContainer(filepath.Join(destDir, "data"), manifest) + if err != nil { + return err + } + + container.GetLuaState() + L.SetGlobal("data_dir", lua.LString(filepath.Join(destDir, "data"))) L.SetGlobal("script", lua.LString(manifest.Hooks.Install)) @@ -145,9 +153,8 @@ func ExecuteRemoveScript(path string) error { return err } - L.SetGlobal("data_dir", lua.LFalse) + L.SetGlobal("DATA_DIR", lua.LFalse) L.SetGlobal("script", lua.LString(path)) - L.SetGlobal("build", lua.LNil) runtime.LockOSThread() defer runtime.UnlockOSThread() From 5ba30c617aa5dd8c99ec3dcab027ec31ce96fdde Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 11:16:20 -0300 Subject: [PATCH 09/26] useless file --- main.go | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 main.go diff --git a/main.go b/main.go deleted file mode 100644 index 7368d0d..0000000 --- a/main.go +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import ( - "fmt" - - lua "github.com/yuin/gopher-lua" -) - -func main() { - L := lua.NewState() - - if err := L.DoFile("lua.lua"); err != nil { - fmt.Println(err) - } -} From ecce74d2e932400f38f2cfc2bb88079bfe2bcadd Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 12:44:40 -0300 Subject: [PATCH 10/26] changed old manifest.toml to Packet.lua and some improvements for future 100% Packet.lua implementation --- cmd/packets/main.go | 18 +++- internal/build/lua.go | 52 +---------- internal/build/main.go | 14 +-- internal/build/manager.go | 4 +- internal/errors/errors.go | 2 +- internal/packet/auxiliar_functions.go | 55 +++++++++++ internal/packet/main.go | 126 +++++++++++++++++++++++++- internal/packet/utils.go | 1 + internal/utils/lua/git.go | 105 ++++++++++++++++++++- internal/utils/utils.go | 93 ++++++------------- pkg/lan.go | 80 ++++++++++++++++ 11 files changed, 420 insertions(+), 130 deletions(-) create mode 100644 internal/packet/auxiliar_functions.go create mode 100644 internal/packet/utils.go create mode 100644 pkg/lan.go diff --git a/cmd/packets/main.go b/cmd/packets/main.go index bda76ba..f12f99f 100644 --- a/cmd/packets/main.go +++ b/cmd/packets/main.go @@ -3,6 +3,7 @@ package main import ( "database/sql" "fmt" + "io" "log" "os" "path/filepath" @@ -13,11 +14,13 @@ import ( "packets/configs" "packets/internal/consts" errors_packets "packets/internal/errors" + "packets/internal/packet" "packets/internal/utils" packets "packets/pkg" "github.com/pelletier/go-toml/v2" "github.com/spf13/cobra" + lua "github.com/yuin/gopher-lua" _ "modernc.org/sqlite" ) @@ -360,18 +363,25 @@ var removeCmd = &cobra.Command{ log.Fatal(err) } - f, err := os.Open(filepath.Join(packageDir, "manifest.toml")) + f, err := os.Open(filepath.Join(packageDir, "Packet.lua")) if err != nil { log.Fatal(err) } - manifest, err := utils.ManifestFileRead(f) + fBLob, err := io.ReadAll(f) + if err != nil { + log.Fatal(err) + } + + manifest, err := packet.ReadPacket(fBLob) if err != nil { log.Fatal(err) } fmt.Println(":: Removing", pkgName) - packets.ExecuteRemoveScript(filepath.Join(packageDir, manifest.Hooks.Remove)) + if err := manifest.ExecuteRemove(lua.NewState()); err != nil { + log.Panic(err) + } if err := os.RemoveAll(packageDir); err != nil { log.Fatal(err) @@ -647,7 +657,7 @@ func UpgradeToThis(id string, installPath string, installedDB *sql.DB, storePkgF serial = ?, package_d = ?, filename = ?, os = ?, arch = ?, in_cache = ? `, p.QueryName, - p.Manifest.Package.Id, + p.Manifest.Id, p.Version, p.Description, p.Serial, diff --git a/internal/build/lua.go b/internal/build/lua.go index f454fad..9f0f648 100644 --- a/internal/build/lua.go +++ b/internal/build/lua.go @@ -2,9 +2,9 @@ package build import ( "fmt" - "io" "os" "os/exec" + "path/filepath" "strings" utils_lua "packets/internal/utils/lua" @@ -196,53 +196,11 @@ func (container Container) lpopen(L *lua.LState) int { return 2 } -func (container Container) lGet(L *lua.LState) int { - src := L.CheckString(1) - dest := L.CheckString(2) +func (container Container) lDir(L *lua.LState) int { + dir := L.CheckString(1) - file, err := container.FS.Open(src) - if err != nil { - L.Push(lua.LFalse) - L.Push(lua.LString(err.Error())) - return 2 - } - defer file.Close() - - info, err := file.Stat() - if err != nil { - L.Push(lua.LFalse) - L.Push(lua.LString(err.Error())) - return 2 - } - - fileBlob, err := io.ReadAll(file) - if err != nil { - L.Push(lua.LFalse) - L.Push(lua.LString(err.Error())) - return 2 - } - - if err := os.WriteFile(dest, fileBlob, info.Mode()); err != nil { - L.Push(lua.LFalse) - L.Push(lua.LString(err.Error())) - return 2 - } - - L.Push(lua.LTrue) - L.Push(lua.LNil) - return 2 -} - -func (container Container) lCopyToContainer(L *lua.LState) int { - - if err := container.CopyHostToContainer(L.CheckString(1), L.CheckString(2)); err != nil { - L.Push(lua.LFalse) - L.Push(lua.LString(err.Error())) - return 2 - } - L.Push(lua.LTrue) - L.Push(lua.LNil) - return 2 + L.Push(lua.LString(filepath.Join(container.Root, filepath.Clean(dir)))) + return 1 } func (container Container) GetLuaState() { diff --git a/internal/build/main.go b/internal/build/main.go index 87c8523..ae3d65f 100644 --- a/internal/build/main.go +++ b/internal/build/main.go @@ -6,8 +6,8 @@ import ( "encoding/json" "io" "os" - "packets/configs" "packets/internal/consts" + "packets/internal/packet" "path/filepath" _ "modernc.org/sqlite" @@ -20,18 +20,17 @@ type Container struct { BuildID BuildID Root string FS afero.Fs - DataDir string LuaState lua.LState - Manifest configs.Manifest + Manifest packet.PacketLua uses int DeleteAfter bool } -func NewContainer(dataDir string, manifest configs.Manifest) (Container, error) { +func NewContainer(manifest packet.PacketLua) (Container, error) { var container Container var err error - container.BuildID, err = getBuildId(manifest.Build.BuildDependencies) + container.BuildID, err = getBuildId(manifest.BuildDependencies) if err != nil { return Container{}, err } @@ -66,13 +65,8 @@ func NewContainer(dataDir string, manifest configs.Manifest) (Container, error) fileSystem := afero.NewBasePathFs(baseFs, container.Root) container.Manifest = manifest - container.DataDir = dataDir container.FS = fileSystem - if err := container.CopyHostToContainer(dataDir, "/data"); err != nil { - return Container{}, err - } - if err := container.FS.MkdirAll(BinDir, 0777); err != nil { return Container{}, err } diff --git a/internal/build/manager.go b/internal/build/manager.go index b76ed2d..f8b1fda 100644 --- a/internal/build/manager.go +++ b/internal/build/manager.go @@ -22,7 +22,7 @@ func (container Container) createNew() error { if err := os.Chown(filepath.Join(consts.BuildImagesDir, string(container.BuildID)), packetsuid, 0); err != nil { return err } - dependencies, err := utils.ResolvDependencies(container.Manifest.Build.BuildDependencies) + dependencies, err := utils.ResolvDependencies(container.Manifest.BuildDependencies) if err != nil { return err } @@ -39,6 +39,8 @@ func (container Container) createNew() error { } wg.Wait() + container.Root = filepath.Join(consts.BuildImagesDir, string(container.BuildID)) + container.saveBuild() return nil } diff --git a/internal/errors/errors.go b/internal/errors/errors.go index e97c965..657ea4e 100644 --- a/internal/errors/errors.go +++ b/internal/errors/errors.go @@ -4,7 +4,7 @@ import "errors" var ( ErrResponseNot200OK = errors.New("the request is not 200, download failed") - ErrCantFindManifestTOML = errors.New("can't find manifest.toml when trying to read the packagefile") + ErrCantFindPacketDotLua = errors.New("can't find manifest.toml when trying to read the packagefile") ErrInvalidSignature = errors.New("the signature is invalid") ErrNotInstalled = errors.New("the package isn't installed") ErrAlredyUpToDate = errors.New("alredy up to date") diff --git a/internal/packet/auxiliar_functions.go b/internal/packet/auxiliar_functions.go new file mode 100644 index 0000000..b604afc --- /dev/null +++ b/internal/packet/auxiliar_functions.go @@ -0,0 +1,55 @@ +package packet + +import lua "github.com/yuin/gopher-lua" + +func getStringFromTable(table *lua.LTable, key string) string { + value := table.RawGetString(key) + if value.Type() == lua.LTString { + return value.String() + } + return "" +} + +func getStringArrayFromTable(L *lua.LState, table *lua.LTable, key string) []string { + value := table.RawGetString(key) + if value.Type() != lua.LTTable { + return []string{} + } + + arrayTable := value.(*lua.LTable) + var result []string + + arrayTable.ForEach(func(_, value lua.LValue) { + if value.Type() == lua.LTString { + result = append(result, value.String()) + } + }) + + return result +} + +func getFunctionFromTable(table *lua.LTable, key string) *lua.LFunction { + value := table.RawGetString(key) + if value.Type() == lua.LTFunction { + return value.(*lua.LFunction) + } + return nil +} + +func getDependenciesFromTable(L *lua.LState, table *lua.LTable, key string) map[string]string { + value := table.RawGetString(key) + if value.Type() != lua.LTTable { + return map[string]string{} + } + + depsTable := value.(*lua.LTable) + dependencies := make(map[string]string) + + depsTable.ForEach(func(key, value lua.LValue) { + if key.Type() == lua.LTString && value.Type() == lua.LTString { + dependencies[key.String()] = value.String() + } + }) + + return dependencies +} diff --git a/internal/packet/main.go b/internal/packet/main.go index 15fbea2..86083c2 100644 --- a/internal/packet/main.go +++ b/internal/packet/main.go @@ -1,5 +1,19 @@ package packet +import ( + "archive/tar" + "fmt" + "io" + "packets/configs" + errors_packets "packets/internal/errors" + "path/filepath" + "runtime" + + "github.com/klauspost/compress/zstd" + "github.com/pelletier/go-toml/v2" + lua "github.com/yuin/gopher-lua" +) + type PacketLua struct { Name string Id string @@ -14,5 +28,115 @@ type PacketLua struct { GitUrl string GitBranch string - BuildDependencies string + BuildDependencies map[string]string + + Prepare *lua.LFunction + Build *lua.LFunction + Install *lua.LFunction + Remove *lua.LFunction +} + +// ReadPacket read a Packet.lua and alredy set global vars +func ReadPacket(f []byte) (PacketLua, error) { + cfg, err := configs.GetConfigTOML() + if err != nil { + return PacketLua{}, err + } + L := lua.NewState() + defer L.Close() + + osObject := L.GetGlobal("os").(*lua.LTable) + ioObject := L.GetGlobal("io").(*lua.LTable) + + L.SetGlobal("os", lua.LNil) + L.SetGlobal("io", lua.LNil) + + if err := L.DoString(string(f)); err != nil { + return PacketLua{}, err + } + L.SetGlobal("os", osObject) + L.SetGlobal("io", ioObject) + + L.SetGlobal("BIN_DIR", lua.LString(cfg.Config.Bin_d)) + L.SetGlobal("ARCH", lua.LString(runtime.GOARCH)) + L.SetGlobal("OS", lua.LString(runtime.GOOS)) + + tableLua := L.Get(-1) + + if tableLua.Type() != lua.LTTable { + return PacketLua{}, fmt.Errorf("invalid Packet.lua format: the file do not return a table") + } + + table := tableLua.(*lua.LTable) + + pkgTableLua := table.RawGetString("package") + if pkgTableLua.Type() != lua.LTTable { + return PacketLua{}, fmt.Errorf("invalid Packet.lua format: can't find package table") + } + pkgTable := pkgTableLua.(*lua.LTable) + + packetLua := &PacketLua{ + Name: getStringFromTable(pkgTable, "name"), + Id: getStringFromTable(pkgTable, "id"), + Version: getStringFromTable(pkgTable, "version"), + Author: getStringFromTable(pkgTable, "author"), + Description: getStringFromTable(pkgTable, "description"), + PkgType: getStringFromTable(pkgTable, "type"), + + Dependencies: getDependenciesFromTable(L, pkgTable, "dependencies"), + BuildDependencies: getDependenciesFromTable(L, pkgTable, "build_dependencies"), + + GitUrl: getStringFromTable(pkgTable, "git_url"), + GitBranch: getStringFromTable(pkgTable, "git_branch"), + + Prepare: getFunctionFromTable(pkgTable, "prepare"), + Build: getFunctionFromTable(pkgTable, "build"), + Install: getFunctionFromTable(pkgTable, "install"), + Remove: getFunctionFromTable(pkgTable, "remove"), + } + + if packetLua.Install == nil || packetLua.Remove == nil { + return PacketLua{}, fmt.Errorf("install or remove function is not valid") + } + + return *packetLua, nil +} + +func (packetLua PacketLua) ExecuteRemove(L *lua.LState) error { + L.Push(packetLua.Remove) + return L.PCall(0, 0, nil) +} + +func ReadPacketFromFile(file io.Reader) (PacketLua, error) { + + zstdReader, err := zstd.NewReader(file) + if err != nil { + return PacketLua{}, err + } + defer zstdReader.Close() + + tarReader := tar.NewReader(zstdReader) + for { + header, err := tarReader.Next() + if err == io.EOF { + break + } + if err != nil { + return PacketLua{}, err + } + + if filepath.Base(header.Name) == "Packet.lua" { + decoder := toml.NewDecoder(tarReader) + + var packetLua PacketLua + + if err := decoder.Decode(&packetLua); err != nil { + return PacketLua{}, err + } + + return packetLua, nil + } + + } + return PacketLua{}, errors_packets.ErrCantFindPacketDotLua } diff --git a/internal/packet/utils.go b/internal/packet/utils.go new file mode 100644 index 0000000..9c40969 --- /dev/null +++ b/internal/packet/utils.go @@ -0,0 +1 @@ +package packet diff --git a/internal/utils/lua/git.go b/internal/utils/lua/git.go index 30782ef..28fc9c4 100644 --- a/internal/utils/lua/git.go +++ b/internal/utils/lua/git.go @@ -1,9 +1,11 @@ package utils_lua import ( + "fmt" "os" - "github.com/go-git/go-git" + "github.com/go-git/go-git/v6" + "github.com/go-git/go-git/v6/plumbing" lua "github.com/yuin/gopher-lua" ) @@ -11,9 +13,15 @@ func LGitClone(L *lua.LState) int { uri := L.CheckString(1) output := L.CheckString(2) - _, err := git.PlainClone(output, false, &git.CloneOptions{ + depth := 1 + if L.GetTop() > 2 { + depth = L.CheckInt(3) + } + + _, err := git.PlainClone(output, &git.CloneOptions{ URL: uri, Progress: os.Stdout, + Depth: depth, }) if err != nil { L.Push(lua.LFalse) @@ -25,4 +33,95 @@ func LGitClone(L *lua.LState) int { return 2 } -func LGitCheckout(L) +func LGitCheckout(L *lua.LState) int { + dir := L.CheckString(1) + branchorid := L.CheckString(2) + + repo, err := git.PlainOpen(dir) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + worktree, err := repo.Worktree() + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + if err := tryCheckout(*worktree, branchorid); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} +func LGitPUll(L *lua.LState) int { + dir := L.CheckString(1) + + depth := 1 + if L.GetTop() > 1 { + depth = L.CheckInt(2) + } + + repo, err := git.PlainOpen(dir) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + worktree, err := repo.Worktree() + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + if err := worktree.Pull(&git.PullOptions{Depth: depth}); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func tryCheckout(worktree git.Worktree, reference string) error { + err := worktree.Checkout(&git.CheckoutOptions{ + Branch: plumbing.ReferenceName(reference), + }) + if err == nil { + return nil + } + + err = worktree.Checkout(&git.CheckoutOptions{ + Branch: plumbing.ReferenceName("refs/heads/" + reference), + }) + if err == nil { + return nil + } + + err = worktree.Checkout(&git.CheckoutOptions{ + Branch: plumbing.ReferenceName("refs/tags/" + reference), + }) + if err == nil { + return nil + } + + hash := plumbing.NewHash(reference) + err = worktree.Checkout(&git.CheckoutOptions{ + Hash: hash, + }) + if err == nil { + return nil + } + + return fmt.Errorf("cannot checkout '%s' as branch, tag, or commit", reference) +} diff --git a/internal/utils/utils.go b/internal/utils/utils.go index 6512262..c89c764 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -1,8 +1,6 @@ package utils import ( - "archive/tar" - "bytes" "crypto/ed25519" "database/sql" "fmt" @@ -17,12 +15,9 @@ import ( "strings" "syscall" - "packets/configs" "packets/internal/consts" errors_packets "packets/internal/errors" - - "github.com/klauspost/compress/zstd" - "github.com/pelletier/go-toml/v2" + "packets/internal/packet" ) type Package struct { @@ -39,11 +34,11 @@ type Package struct { Size int64 Dependencies map[string]string + Manifest packet.PacketLua + Signature []byte PublicKey ed25519.PublicKey - Manifest configs.Manifest - Serial int } @@ -65,40 +60,6 @@ func GetFileHTTP(url string) ([]byte, error) { return fileBytes, nil } -// ReadManifest is crucial to get package metadata it reads manifest.toml from a package file (tar.zst) -func ReadManifest(file io.Reader) (configs.Manifest, error) { - zstdReader, err := zstd.NewReader(file) - if err != nil { - return configs.Manifest{}, err - } - defer zstdReader.Close() - - tarReader := tar.NewReader(zstdReader) - for { - header, err := tarReader.Next() - if err == io.EOF { - break - } - if err != nil { - return configs.Manifest{}, err - } - - if filepath.Base(header.Name) == "manifest.toml" { - decoder := toml.NewDecoder(tarReader) - - var manifest configs.Manifest - - if err := decoder.Decode(&manifest); err != nil { - return configs.Manifest{}, nil - } - - return manifest, nil - } - - } - return configs.Manifest{}, errors_packets.ErrCantFindManifestTOML -} - // CopyDir copies a directory from source to destination func CopyDir(src string, dest string) error { if stats, err := os.Stat(src); err != nil { @@ -190,6 +151,7 @@ func CopyFile(source string, destination string) error { } // Write writes the package file to the cache directory and returns the path to it + func (p *Package) Write() (string, error) { if err := os.WriteFile(filepath.Join(consts.DefaultCache_d, p.Filename), p.PackageF, 0o644); err != nil { _ = os.Remove(filepath.Join(consts.DefaultCache_d, p.Filename)) @@ -210,7 +172,7 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error { defer func() { if !success { - _, err := db.Exec("DELETE FROM packages WHERE id = ?", p.Manifest.Package.Id) + _, err := db.Exec("DELETE FROM packages WHERE id = ?", p.Manifest.Id) if err != nil { log.Println("failed to rollback package addition:", err) } @@ -218,12 +180,12 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error { }() _, err = db.Exec(` - INSERT INTO packages ( - query_name, id, version, description, - serial, package_d, filename, os, arch, in_cache - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + INSERT INTO packages ( + query_name, id, version, description, + serial, package_d, filename, os, arch, in_cache + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, p.QueryName, - p.Manifest.Package.Id, + p.Manifest.Id, p.Version, p.Description, p.Serial, @@ -238,7 +200,7 @@ func (p *Package) AddToInstalledDB(inCache int, packagePath string) error { } for depnName, versionConstraint := range p.Dependencies { - _, err = db.Exec("INSERT INTO package_dependencies (package_id, dependency_name, version_constraint) VALUES (?, ?, ?)", p.Manifest.Package.Id, depnName, versionConstraint) + _, err = db.Exec("INSERT INTO package_dependencies (package_id, dependency_name, version_constraint) VALUES (?, ?, ?)", p.Manifest.Id, depnName, versionConstraint) } success = true @@ -343,18 +305,6 @@ func ResolvDependencies(depnList map[string]string) ([]string, error) { return resolved, nil } -func ManifestFileRead(file io.Reader) (configs.Manifest, error) { - decoder := toml.NewDecoder(file) - - var manifest configs.Manifest - - if err := decoder.Decode(&manifest); err != nil { - return configs.Manifest{}, nil - } - - return manifest, nil -} - func RemoveFromInstalledDB(id string) error { db, err := sql.Open("sqlite", consts.InstalledDB) if err != nil { @@ -468,8 +418,7 @@ func GetPackage(id string) (Package, error) { skipping: - reader := bytes.NewReader(this.PackageF) - this.Manifest, err = ReadManifest(reader) + this.Manifest, err = packet.ReadPacket(this.PackageF) if err != nil { return Package{}, err } @@ -510,3 +459,21 @@ func ChangeToNoPermission() error { } func ElevatePermission() error { return syscall.Setresuid(0, 0, 0) } + +func getFileHTTP(url string) ([]byte, error) { + resp, err := http.Get(url) + if err != nil { + log.Fatal(err) + } + + if resp.StatusCode != http.StatusOK { + return nil, errors_packets.ErrResponseNot200OK + } + + fileBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return fileBytes, nil +} diff --git a/pkg/lan.go b/pkg/lan.go new file mode 100644 index 0000000..37cdf9d --- /dev/null +++ b/pkg/lan.go @@ -0,0 +1,80 @@ +package packets + +import ( + "fmt" + "net" + "packets/internal/consts" + "strconv" + "strings" + "time" + + "golang.org/x/net/ipv4" +) + +type Peer struct { + IP net.IP + Port int +} + +func BroadcastAddr(ip net.IP, mask net.IPMask) net.IP { + b := make(net.IP, len(ip)) + for i := range ip { + b[i] = ip[i] | ^mask[i] + } + return b +} + +func AskLAN(filename string) ([]Peer, error) { + var peers []Peer + query := []byte("Q:" + filename) + + pc, err := net.ListenPacket("udp", ":0") + if err != nil { + return []Peer{}, err + } + defer pc.Close() + + if pconn := ipv4.NewPacketConn(pc); pconn != nil { + _ = pconn.SetTTL(1) + } + + ifaces, _ := net.Interfaces() + for _, ifc := range ifaces { + if ifc.Flags&net.FlagUp == 0 || ifc.Flags&net.FlagLoopback != 0 { + continue + } + + addrs, _ := ifc.Addrs() + for _, a := range addrs { + ipnet, ok := a.(*net.IPNet) + if !ok || ipnet.IP.To4() == nil { + continue + } + + bcast := BroadcastAddr(ipnet.IP.To4(), ipnet.Mask) + dst := &net.UDPAddr{IP: bcast, Port: 1333} + + _, err = pc.WriteTo(query, dst) + if err != nil { + fmt.Printf(":: (%s) can't send to %s: %s\n", ifc.Name, bcast, err.Error()) + } + } + } + _ = pc.SetDeadline(time.Now().Add(consts.LANDeadline)) + buf := make([]byte, 1500) + + for { + n, addr, err := pc.ReadFrom(buf) + if err != nil { + break + } + msg := string(buf[:n]) + + if strings.HasPrefix(msg, "H:"+filename) { + parts := strings.Split(msg, ":") + port, _ := strconv.Atoi(parts[2]) + peers = append(peers, Peer{IP: addr.(*net.UDPAddr).IP, Port: port}) + } + } + return peers, nil +} From 820ffc299f9d674b0c99c7dfc261eb4d663582a1 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 20:17:20 -0300 Subject: [PATCH 11/26] code maybe confusing, but now using Packet.lua format --- go.mod | 46 ++++++++- go.sum | 132 +++++++++++++++++++++++-- internal/build/complete.go | 72 ++++++++++++++ internal/build/install.go | 30 +++--- internal/build/manager.go | 3 +- internal/utils/lua/lua.go | 5 +- pkg/main.go | 193 ++++++++++++++++++++++++++++++------- 7 files changed, 413 insertions(+), 68 deletions(-) create mode 100644 internal/build/complete.go diff --git a/go.mod b/go.mod index 2338ffc..4c688b2 100644 --- a/go.mod +++ b/go.mod @@ -3,27 +3,65 @@ module packets go 1.25.1 require ( + github.com/gin-gonic/gin v1.11.0 + github.com/go-git/go-git/v6 v6.0.0-20251021092831-91c33c9361ce github.com/klauspost/compress v1.18.0 github.com/pelletier/go-toml/v2 v2.2.4 github.com/spf13/afero v1.15.0 github.com/spf13/cobra v1.10.1 github.com/yuin/gopher-lua v1.1.1 - golang.org/x/net v0.44.0 + golang.org/x/net v0.46.0 modernc.org/sqlite v1.38.2 ) require ( + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.3.0 // indirect + github.com/bytedance/sonic v1.14.0 // indirect + github.com/bytedance/sonic/loader v0.3.0 // indirect + github.com/cloudflare/circl v1.6.1 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/cyphar/filepath-securejoin v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/go-git/gcfg/v2 v2.0.2 // indirect + github.com/go-git/go-billy/v6 v6.0.0-20251016063423-4289a4e54aa4 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.27.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/google/uuid v1.6.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kevinburke/ssh_config v1.4.0 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/pjbgf/sha1cd v0.5.0 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.54.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/spf13/afero v1.15.0 // indirect + github.com/sergi/go-diff v1.4.0 // indirect github.com/spf13/pflag v1.0.10 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.0 // indirect + go.uber.org/mock v0.5.0 // indirect + golang.org/x/arch v0.20.0 // indirect + golang.org/x/crypto v0.43.0 // indirect golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/text v0.29.0 // indirect + golang.org/x/mod v0.28.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/tools v0.37.0 // indirect + google.golang.org/protobuf v1.36.9 // indirect modernc.org/libc v1.66.3 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect diff --git a/go.sum b/go.sum index 103047d..046ff98 100644 --- a/go.sum +++ b/go.sum @@ -1,23 +1,106 @@ +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= +github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= +github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= +github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cyphar/filepath-securejoin v0.5.0 h1:hIAhkRBMQ8nIeuVwcAoymp7MY4oherZdAxD+m0u9zaw= +github.com/cyphar/filepath-securejoin v0.5.0/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= +github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg/v2 v2.0.2 h1:MY5SIIfTGGEMhdA7d7JePuVVxtKL7Hp+ApGDJAJ7dpo= +github.com/go-git/gcfg/v2 v2.0.2/go.mod h1:/lv2NsxvhepuMrldsFilrgct6pxzpGdSRC13ydTLSLs= +github.com/go-git/go-billy/v6 v6.0.0-20251016063423-4289a4e54aa4 h1:xQLkKmWcw9n5CUkl//bKQB7SPWQbaoKSVnHXH9V8sg8= +github.com/go-git/go-billy/v6 v6.0.0-20251016063423-4289a4e54aa4/go.mod h1:TpCYxdQ0tWZkrnAkd7yqK+z1C8RKcyjcaYAJNAcnUnM= +github.com/go-git/go-git-fixtures/v5 v5.1.1 h1:OH8i1ojV9bWfr0ZfasfpgtUXQHQyVS8HXik/V1C099w= +github.com/go-git/go-git-fixtures/v5 v5.1.1/go.mod h1:Altk43lx3b1ks+dVoAG2300o5WWUnktvfY3VI6bcaXU= +github.com/go-git/go-git/v6 v6.0.0-20251021092831-91c33c9361ce h1:DFvDcCiFZk2yDXVreC9+B+SAZYHH2RssMmtR2zBwANE= +github.com/go-git/go-git/v6 v6.0.0-20251021092831-91c33c9361ce/go.mod h1:xtOWa43AoQlsqYogmpf0MnjBJHKPL2/3teh4fmZ/k+Y= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= +github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ= +github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= +github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= +github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= @@ -25,24 +108,53 @@ github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4 github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= +github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= +golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= -golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= -golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM= modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= diff --git a/internal/build/complete.go b/internal/build/complete.go new file mode 100644 index 0000000..bf6ceb3 --- /dev/null +++ b/internal/build/complete.go @@ -0,0 +1,72 @@ +package build + +import ( + "packets/internal/packet" + utils_lua "packets/internal/utils/lua" + + lua "github.com/yuin/gopher-lua" +) + +func (container Container) ExecutePrepare(packetLua packet.PacketLua, L *lua.LState) error { + + gitTable := L.NewTable() + + gitTable.RawSetString("clone", L.NewFunction(utils_lua.LGitClone)) + gitTable.RawSetString("checkout", L.NewFunction(utils_lua.LGitCheckout)) + gitTable.RawSetString("pull", L.NewFunction(utils_lua.LGitPUll)) + + containerTable := L.NewTable() + + containerTable.RawSetString("dir", L.NewFunction(container.lDir)) + + L.SetGlobal("git", gitTable) + L.Push(packetLua.Prepare) + L.Push(containerTable) + + return L.PCall(1, 0, nil) + +} + +func (container Container) ExecuteBuild(packetLua packet.PacketLua, L *lua.LState) error { + + osObject := L.GetGlobal("os").(*lua.LTable) + ioObject := L.GetGlobal("io").(*lua.LTable) + + OnlyContainerOS := L.NewTable() + + OnlyContainerOS.RawSetString("copy", L.NewFunction(container.lCopy)) + OnlyContainerOS.RawSetString("mkdir", L.NewFunction(container.lMkdir)) + OnlyContainerOS.RawSetString("rename", L.NewFunction(container.lRename)) + OnlyContainerOS.RawSetString("remove", L.NewFunction(container.lRemove)) + OnlyContainerOS.RawSetString("execute", L.NewFunction(container.lexecute)) + OnlyContainerOS.RawSetString("open", L.NewFunction(container.lOpen)) + + OnlyContainerIO := L.NewTable() + + OnlyContainerIO.RawSetString("popen", L.NewFunction(container.lpopen)) + + L.SetGlobal("io", OnlyContainerIO) + L.SetGlobal("os", OnlyContainerOS) + + L.Push(packetLua.Build) + err := L.PCall(0, 0, nil) + if err != nil { + return err + } + + L.SetGlobal("os", osObject) + L.SetGlobal("io", ioObject) + return nil +} + +func (container Container) ExecuteInstall(packetLua packet.PacketLua, L *lua.LState) error { + + containerTable := L.NewTable() + + containerTable.RawSetString("dir", L.NewFunction(container.lDir)) + + L.Push(packetLua.Install) + L.Push(containerTable) + + return L.PCall(1, 0, nil) +} diff --git a/internal/build/install.go b/internal/build/install.go index 7dcb95e..f87b621 100644 --- a/internal/build/install.go +++ b/internal/build/install.go @@ -7,6 +7,7 @@ import ( "io" "log" "os" + "packets/internal/packet" "packets/internal/utils" utils_lua "packets/internal/utils/lua" "path/filepath" @@ -14,11 +15,10 @@ import ( "sync" "github.com/klauspost/compress/zstd" - lua "github.com/yuin/gopher-lua" ) func (container Container) installPackage(file []byte, destDir string) error { - manifest, err := utils.ReadManifest(bytes.NewReader(file)) + manifest, err := packet.ReadPacketFromFile(bytes.NewReader(file)) if err != nil { return err } @@ -95,7 +95,7 @@ func (container Container) installPackage(file []byte, destDir string) error { return err } - if filepath.Base(hdr.Name) == "manifest.toml" || filepath.Base(hdr.Name) == manifest.Hooks.Install || filepath.Base(hdr.Name) == manifest.Hooks.Remove { + if filepath.Base(hdr.Name) == "Packet.lua" { err = os.Chmod(absPath, os.FileMode(0755)) if err != nil { return err @@ -113,34 +113,34 @@ func (container Container) installPackage(file []byte, destDir string) error { return err } - L.SetGlobal("DATA_DIR", lua.LString(filepath.Join(destDir, "data"))) - L.SetGlobal("script", lua.LString(manifest.Hooks.Build)) - - bootstrapcontainer, err := NewContainer(filepath.Join(container.Root, destDir, "data"), manifest) + bootstrapcontainer, err := NewContainer(manifest) if err != nil { return err } - bootstrapcontainer.LuaState.DoFile(manifest.Hooks.Build) + if err := bootstrapcontainer.ExecutePrepare(manifest, &L); err != nil { + return fmt.Errorf("error executing prepare: %s", err) + } - L.SetGlobal("DATA_DIR", lua.LString(filepath.Join(destDir, "data"))) - L.SetGlobal("script", lua.LString(manifest.Hooks.Install)) + if err := bootstrapcontainer.ExecuteBuild(manifest, &L); err != nil { + return fmt.Errorf("error executing build: %s", err) + } if err := utils.ChangeToNoPermission(); err != nil { - return err + return fmt.Errorf("error changing to packet user: %s", err) } - if err := L.DoFile(filepath.Join(destDir, manifest.Hooks.Install)); err != nil { - return err + if err := bootstrapcontainer.ExecuteInstall(manifest, &L); err != nil { + return fmt.Errorf("error executing build: %s", err) } if err := utils.ElevatePermission(); err != nil { - return err + return fmt.Errorf("error changing to root: %s", err) } return nil } -func (container Container) asyncFullInstallDependencie(dep string, storePackages bool, installPath string, wg *sync.WaitGroup, mu *sync.Mutex) { +func (container Container) asyncFullInstallDependencie(dep string, storePackages bool, installPath string, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf(" downloading %s \n", dep) diff --git a/internal/build/manager.go b/internal/build/manager.go index f8b1fda..3880efe 100644 --- a/internal/build/manager.go +++ b/internal/build/manager.go @@ -32,10 +32,9 @@ func (container Container) createNew() error { return err } var wg sync.WaitGroup - var mu sync.Mutex for _, depn := range dependencies { wg.Add(1) - go container.asyncFullInstallDependencie(depn, cfg.Config.StorePackages, depn, &wg, &mu) + go container.asyncFullInstallDependencie(depn, cfg.Config.StorePackages, depn, &wg) } wg.Wait() diff --git a/internal/utils/lua/lua.go b/internal/utils/lua/lua.go index f4a5607..6e5b663 100644 --- a/internal/utils/lua/lua.go +++ b/internal/utils/lua/lua.go @@ -16,13 +16,10 @@ func GetSandBox() (lua.LState, error) { osObject := L.GetGlobal("os").(*lua.LTable) L.SetGlobal("SAFE_MODE", lua.LTrue) - L.SetGlobal("PACKETS_DATADIR", lua.LString(cfg.Config.Data_d)) - L.SetGlobal("packets_bin_dir", lua.LString(cfg.Config.Bin_d)) + L.SetGlobal("BIN_DIR", lua.LString(cfg.Config.Bin_d)) L.SetGlobal("path_join", L.NewFunction(Ljoin)) - // Packets build functions - osObject.RawSetString("remove", L.NewFunction(LSafeRemove)) osObject.RawSetString("rename", L.NewFunction(LSafeRename)) osObject.RawSetString("copy", L.NewFunction(LSafeCopy)) diff --git a/pkg/main.go b/pkg/main.go index a0d76e8..26a1b82 100644 --- a/pkg/main.go +++ b/pkg/main.go @@ -3,24 +3,53 @@ package packets import ( "archive/tar" "bytes" + "crypto/ed25519" + "database/sql" + "fmt" "io" + "log" + "net/http" "os" "packets/internal/build" + "packets/internal/consts" + errors_packets "packets/internal/errors" + "packets/internal/packet" "packets/internal/utils" - "runtime" + "path" utils_lua "packets/internal/utils/lua" "path/filepath" "strings" "github.com/klauspost/compress/zstd" - lua "github.com/yuin/gopher-lua" _ "modernc.org/sqlite" ) +type Package struct { + PackageF []byte + Version string + ImageUrl string + QueryName string + Description string + Author string + AuthorVerified bool + OS string + Arch string + Filename string + Size int64 + Dependencies map[string]string + + Signature []byte + PublicKey ed25519.PublicKey + + Serial int + + Manifest packet.PacketLua +} + // Install exctract and fully install from a package file ( tar.zst ) func InstallPackage(file []byte, destDir string) error { - manifest, err := utils.ReadManifest(bytes.NewReader(file)) + manifest, err := packet.ReadPacketFromFile(bytes.NewReader(file)) if err != nil { return err } @@ -97,7 +126,7 @@ func InstallPackage(file []byte, destDir string) error { return err } - if filepath.Base(hdr.Name) == "manifest.toml" || filepath.Base(hdr.Name) == manifest.Hooks.Install || filepath.Base(hdr.Name) == manifest.Hooks.Remove { + if filepath.Base(hdr.Name) == "Packet.lua" { err = os.Chmod(absPath, os.FileMode(0755)) if err != nil { return err @@ -115,61 +144,159 @@ func InstallPackage(file []byte, destDir string) error { return err } - L.SetGlobal("DATA_DIR", lua.LString(filepath.Join(destDir, "data"))) - L.SetGlobal("script", lua.LString(manifest.Hooks.Build)) - - container, err := build.NewContainer(filepath.Join(destDir, "data"), manifest) + bootstrapcontainer, err := build.NewContainer(manifest) if err != nil { return err } - container.GetLuaState() + if err := bootstrapcontainer.ExecutePrepare(manifest, &L); err != nil { + return fmt.Errorf("error executing prepare: %s", err) + } - L.SetGlobal("data_dir", lua.LString(filepath.Join(destDir, "data"))) - L.SetGlobal("script", lua.LString(manifest.Hooks.Install)) - - runtime.LockOSThread() - defer runtime.UnlockOSThread() + if err := bootstrapcontainer.ExecuteBuild(manifest, &L); err != nil { + return fmt.Errorf("error executing build: %s", err) + } if err := utils.ChangeToNoPermission(); err != nil { - return err + return fmt.Errorf("error changing to packet user: %s", err) } - if err := L.DoFile(filepath.Join(destDir, manifest.Hooks.Install)); err != nil { - return err + if err := bootstrapcontainer.ExecuteInstall(manifest, &L); err != nil { + return fmt.Errorf("error executing build: %s", err) } if err := utils.ElevatePermission(); err != nil { - return err + return fmt.Errorf("error changing to root: %s", err) } return nil } -// ExecuteRemoveScript executes the remove script from the package -func ExecuteRemoveScript(path string) error { +func GetPackage(id string) (Package, error) { - L, err := utils_lua.GetSandBox() + var this Package + this.Dependencies = make(map[string]string) + var peers []Peer + + db, err := sql.Open("sqlite", consts.IndexDB) if err != nil { - return err + return this, err + } + defer db.Close() + + var packageUrl string + err = db.QueryRow("SELECT query_name, version, package_url, image_url, description, author, author_verified, os, arch, signature, public_key, serial, size FROM packages WHERE id = ?", id). + Scan( + &this.QueryName, + &this.Version, + &packageUrl, + &this.ImageUrl, + &this.Description, + &this.Author, + &this.AuthorVerified, + &this.OS, + &this.Arch, + &this.Signature, + &this.PublicKey, + &this.Serial, + &this.Size, + ) + if err != nil { + return Package{}, err } - L.SetGlobal("DATA_DIR", lua.LFalse) - L.SetGlobal("script", lua.LString(path)) + rows, err := db.Query("SELECT dependency_name, version_constraint FROM package_dependencies WHERE package_id = ?", id) + if err != nil { + return Package{}, err + } + defer rows.Close() - runtime.LockOSThread() - defer runtime.UnlockOSThread() + for rows.Next() { + var a, vConstraint string + if err := rows.Scan(&a, &vConstraint); err != nil { + return Package{}, err + } - if err := utils.ChangeToNoPermission(); err != nil { - return err + this.Dependencies[a] = vConstraint } - if err := L.DoFile(path); err != nil { - return err + filename := path.Base(packageUrl) + this.Filename = filename + + dirEntry, err := os.ReadDir(consts.DefaultCache_d) + if err != nil { + return Package{}, err } - if err := utils.ElevatePermission(); err != nil { - return err + for _, v := range dirEntry { + if v.Name() == filename { + this.PackageF, err = os.ReadFile(filepath.Join(consts.DefaultCache_d, filename)) + if err != nil { + break + } + goto skipping + + } } - return nil + peers, err = AskLAN(filename) + if err != nil { + return Package{}, err + } + + if len(peers) == 0 { + fmt.Printf(":: Pulling from %s\n", packageUrl) + this.PackageF, err = getFileHTTP(packageUrl) + if err != nil { + return Package{}, err + } + } else { + var totalerrors int = 0 + for _, peer := range peers { + fmt.Printf(":: Pulling from local network (%s)\n", peer.IP) + this.PackageF, err = getFileHTTP(fmt.Sprintf("http://%s:%d/%s", peer.IP, peer.Port, filename)) + if err == nil { + break + } else { + totalerrors++ + } + } + if totalerrors == len(peers) { + this.PackageF, err = getFileHTTP(packageUrl) + if err != nil { + return Package{}, err + } + } + } + +skipping: + + reader := bytes.NewReader(this.PackageF) + this.Manifest, err = packet.ReadPacketFromFile(reader) + if err != nil { + return Package{}, err + } + + if !ed25519.Verify(this.PublicKey, this.PackageF, this.Signature) { + return Package{}, errors_packets.ErrInvalidSignature + } + + return this, nil +} + +func getFileHTTP(url string) ([]byte, error) { + resp, err := http.Get(url) + if err != nil { + log.Fatal(err) + } + + if resp.StatusCode != http.StatusOK { + return nil, errors_packets.ErrResponseNot200OK + } + + fileBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return fileBytes, nil } From 8feaf5d19b03399af25cc315d8962f8cf03deb5f Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 22:41:28 -0300 Subject: [PATCH 12/26] change dir for package dir to install it --- internal/build/install.go | 2 ++ pkg/main.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/internal/build/install.go b/internal/build/install.go index f87b621..cb58bc3 100644 --- a/internal/build/install.go +++ b/internal/build/install.go @@ -118,6 +118,8 @@ func (container Container) installPackage(file []byte, destDir string) error { return err } + os.Chdir(destDir) + if err := bootstrapcontainer.ExecutePrepare(manifest, &L); err != nil { return fmt.Errorf("error executing prepare: %s", err) } diff --git a/pkg/main.go b/pkg/main.go index 26a1b82..46fbddd 100644 --- a/pkg/main.go +++ b/pkg/main.go @@ -149,6 +149,8 @@ func InstallPackage(file []byte, destDir string) error { return err } + os.Chdir(destDir) + if err := bootstrapcontainer.ExecutePrepare(manifest, &L); err != nil { return fmt.Errorf("error executing prepare: %s", err) } From b6d7ec8a5fcb18c296f66929b82e9a27409da275 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 22:41:59 -0300 Subject: [PATCH 13/26] change dir for package dir while removing it --- cmd/packets/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/packets/main.go b/cmd/packets/main.go index f12f99f..ed8463c 100644 --- a/cmd/packets/main.go +++ b/cmd/packets/main.go @@ -379,6 +379,8 @@ var removeCmd = &cobra.Command{ } fmt.Println(":: Removing", pkgName) + os.Chdir(packageDir) + if err := manifest.ExecuteRemove(lua.NewState()); err != nil { log.Panic(err) } From 4178387e2a7cd2c5150c362ff681ad0cb0693268 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 22:42:16 -0300 Subject: [PATCH 14/26] checking if build or prepare is == nil --- internal/build/complete.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/build/complete.go b/internal/build/complete.go index bf6ceb3..e25a401 100644 --- a/internal/build/complete.go +++ b/internal/build/complete.go @@ -9,6 +9,10 @@ import ( func (container Container) ExecutePrepare(packetLua packet.PacketLua, L *lua.LState) error { + if packetLua.Prepare == nil { + return nil + } + gitTable := L.NewTable() gitTable.RawSetString("clone", L.NewFunction(utils_lua.LGitClone)) @@ -29,6 +33,10 @@ func (container Container) ExecutePrepare(packetLua packet.PacketLua, L *lua.LSt func (container Container) ExecuteBuild(packetLua packet.PacketLua, L *lua.LState) error { + if packetLua.Build == nil { + return nil + } + osObject := L.GetGlobal("os").(*lua.LTable) ioObject := L.GetGlobal("io").(*lua.LTable) From a69de7e9184bbc04322db0728c94e3baaee0f010 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sat, 25 Oct 2025 22:43:02 -0300 Subject: [PATCH 15/26] store buildDirs --- doc/indexdbSchema.txt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/indexdbSchema.txt b/doc/indexdbSchema.txt index 25b712e..4bdc79c 100644 --- a/doc/indexdbSchema.txt +++ b/doc/indexdbSchema.txt @@ -44,4 +44,12 @@ CREATE TABLE IF NOT EXISTS packages ( UNIQUE(query_name, version), UNIQUE(query_name, serial) +); + + + +CREATE TABLE IF NOT EXISTS build_dependencies ( + id TEXT PRIMARY KEY, + dir TEXT NOT NULL DEFAULT "/dev/null" + uses INTEGER NOT NULL DEFAULT 0 ); \ No newline at end of file From 51c51b96bf1e5386a27482e28c9ac6897801ece6 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 16:39:54 -0300 Subject: [PATCH 16/26] bugfix, trying to read toml in a lua file, now returning Package.lua --- internal/packet/main.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/internal/packet/main.go b/internal/packet/main.go index 86083c2..6744fef 100644 --- a/internal/packet/main.go +++ b/internal/packet/main.go @@ -10,7 +10,6 @@ import ( "runtime" "github.com/klauspost/compress/zstd" - "github.com/pelletier/go-toml/v2" lua "github.com/yuin/gopher-lua" ) @@ -126,15 +125,13 @@ func ReadPacketFromFile(file io.Reader) (PacketLua, error) { } if filepath.Base(header.Name) == "Packet.lua" { - decoder := toml.NewDecoder(tarReader) - var packetLua PacketLua - - if err := decoder.Decode(&packetLua); err != nil { + packageLuaBlob, err := io.ReadAll(tarReader) + if err != nil { return PacketLua{}, err } - return packetLua, nil + return ReadPacket(packageLuaBlob) } } From 9883fd92dce87f459516916f8e72c60f25c2e4b3 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:02:43 -0300 Subject: [PATCH 17/26] log messages for sockets --- cmd/httpsocket/main.go | 4 ++-- cmd/udpsocket/main.go | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cmd/httpsocket/main.go b/cmd/httpsocket/main.go index b4db14e..7def4b5 100644 --- a/cmd/httpsocket/main.go +++ b/cmd/httpsocket/main.go @@ -18,7 +18,7 @@ type ConfigTOML struct { } func main() { - + log.Println("Program started") cfg, err := configs.GetConfigTOML() if err != nil { log.Fatal(err) @@ -31,6 +31,6 @@ func main() { fs := http.FileServer(http.Dir(cfg.Config.Cache_d)) http.Handle("/", fs) - log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", cfg.Config.HttpPort), nil)) + log.Printf("Listening and serving on port %d\n", cfg.Config.HttpPort) } diff --git a/cmd/udpsocket/main.go b/cmd/udpsocket/main.go index 328bd68..5e1bd0e 100644 --- a/cmd/udpsocket/main.go +++ b/cmd/udpsocket/main.go @@ -23,6 +23,7 @@ func CheckDownloaded(filename string) bool { } func main() { + log.Println("Program started") pid := os.Getpid() if err := os.WriteFile(filepath.Join(consts.DefaultLinux_d, "udp.pid"), []byte(fmt.Sprint(pid)), 0664); err != nil { fmt.Println("error saving subprocess pid", err) @@ -37,6 +38,7 @@ func main() { if err != nil { log.Fatal(err) } + log.Println("Started connection listener") defer conn.Close() buf := make([]byte, 1500) @@ -46,12 +48,15 @@ func main() { log.Println("error creating udp socket", err) } msg := string(buf[:n]) + log.Printf("Received message : %s\n", msg) if !strings.HasPrefix(msg, "Q:") { + log.Println("error: invalid message, this message don't follow the protocol") continue } filename := strings.TrimPrefix(msg, "Q:") if CheckDownloaded(filename) { reply := fmt.Sprintf("H:%s:%d", filename, cfg.Config.HttpPort) + log.Printf("Package founded in cache dir, answering with: '%s'\n", reply) conn.WriteToUDP([]byte(reply), remote) } } From 807d9fa7849c4d89fc149db9ef5a72a685c7172b Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:03:19 -0300 Subject: [PATCH 18/26] removing dependencies from table packages in database --- doc/indexdbSchema.txt | 3 ++- internal/consts/consts.go | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/indexdbSchema.txt b/doc/indexdbSchema.txt index 4bdc79c..3432159 100644 --- a/doc/indexdbSchema.txt +++ b/doc/indexdbSchema.txt @@ -13,6 +13,7 @@ CREATE TABLE packages ( arch TEXT NOT NULL, os TEXT NOT NULL, size INTEGER NOT NULL DEFAULT 0, + type TEXT NOT NULL DEFAULT 'static', UNIQUE(query_name, version), UNIQUE(query_name, serial) @@ -33,7 +34,6 @@ CREATE TABLE IF NOT EXISTS packages ( query_name TEXT NOT NULL UNIQUE PRIMARY KEY, id TEXT NOT NULL UNIQUE, version TEXT NOT NULL, - dependencies TEXT NOT NULL DEFAULT '', description TEXT NOT NULL, package_d TEXT NOT NULL, filename TEXT NOT NULL, @@ -41,6 +41,7 @@ CREATE TABLE IF NOT EXISTS packages ( arch TEXT NOT NULL, in_cache INTEGER NOT NULL DEFAULT 1, serial INTEGER NOT NULL, + type TEXT NOT NULL, UNIQUE(query_name, version), UNIQUE(query_name, serial) diff --git a/internal/consts/consts.go b/internal/consts/consts.go index 054f8ae..0fdd938 100644 --- a/internal/consts/consts.go +++ b/internal/consts/consts.go @@ -19,7 +19,6 @@ const InstalledDatabaseSchema = `CREATE TABLE IF NOT EXISTS packages ( query_name TEXT NOT NULL UNIQUE PRIMARY KEY, id TEXT NOT NULL UNIQUE, version TEXT NOT NULL, - dependencies TEXT NOT NULL DEFAULT '', description TEXT NOT NULL, package_d TEXT NOT NULL, filename TEXT NOT NULL, @@ -27,6 +26,7 @@ const InstalledDatabaseSchema = `CREATE TABLE IF NOT EXISTS packages ( arch TEXT NOT NULL, in_cache INTEGER NOT NULL DEFAULT 1, serial INTEGER NOT NULL, + type TEXT NOT NULL, UNIQUE(query_name, version), UNIQUE(query_name, serial) @@ -41,4 +41,10 @@ CREATE TABLE package_dependencies( ); CREATE INDEX index_dependency_name ON package_dependencies(dependency_name); + +CREATE TABLE IF NOT EXISTS build_dependencies ( + id TEXT PRIMARY KEY, + dir TEXT NOT NULL DEFAULT "/dev/null" + uses INTEGER NOT NULL DEFAULT 0 +); ` From befa4e3ea462746044dca145480e30eda2ed43a3 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:04:07 -0300 Subject: [PATCH 19/26] changing home dir for packets user to /etc/packets (configuration folder) --- internal/utils/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/utils/utils.go b/internal/utils/utils.go index c89c764..5d9471c 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -431,7 +431,7 @@ skipping: } func GetPacketsUID() (int, error) { - _ = exec.Command("useradd", "-M", "-N", "-r", "-s", "/bin/false", "-d", "/var/lib/packets", "packets").Run() + _ = exec.Command("useradd", "-M", "-N", "-r", "-s", "/bin/false", "-d", "/etc/packets", "packets").Run() cmd := exec.Command("id", "-u", "packets") out, err := cmd.CombinedOutput() From b411eff6f4505dee1bbfb9c01485a81351210582 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:05:34 -0300 Subject: [PATCH 20/26] systemd managment for daemons --- systemd/packets-http.service | 14 ++++++++++++++ systemd/packets-udp.service | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 systemd/packets-http.service create mode 100644 systemd/packets-udp.service diff --git a/systemd/packets-http.service b/systemd/packets-http.service new file mode 100644 index 0000000..e7f7eb1 --- /dev/null +++ b/systemd/packets-http.service @@ -0,0 +1,14 @@ +[Unit] + Description=Serving packages for everyone in the same network. + After=network.target packets-udp.service + Requires=packets-udp.service + +[Service] + Type=simple + User=packets + WorkingDirectory=/var/cache/packets + ExecStart=/etc/packets/httpsocket + Restart=always + +[Install] + WantedBy=multi-user.target \ No newline at end of file diff --git a/systemd/packets-udp.service b/systemd/packets-udp.service new file mode 100644 index 0000000..0d0382c --- /dev/null +++ b/systemd/packets-udp.service @@ -0,0 +1,14 @@ +[Unit] + Description=Respond to every request for packages in local network. + After=network.target + +[Service] + Type=simple + User=packets + WorkingDirectory=/etc/packets + ExecStart=/etc/packets/udpsocket + Restart=always + + +[Install] + WantedBy=multi-user.target \ No newline at end of file From 7fbaef7bd447e7ce6a02ab708ce4d3ebe0b13a21 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:05:57 -0300 Subject: [PATCH 21/26] try to clone Packet.lua --- internal/packet/main.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/internal/packet/main.go b/internal/packet/main.go index 6744fef..8f6a363 100644 --- a/internal/packet/main.go +++ b/internal/packet/main.go @@ -9,6 +9,8 @@ import ( "path/filepath" "runtime" + "github.com/go-git/go-git/v6" + "github.com/go-git/go-git/v6/storage/memory" "github.com/klauspost/compress/zstd" lua "github.com/yuin/gopher-lua" ) @@ -137,3 +139,38 @@ func ReadPacketFromFile(file io.Reader) (PacketLua, error) { } return PacketLua{}, errors_packets.ErrCantFindPacketDotLua } + +func GetPackageDotLuaFromRemote(url string, branch string) (PacketLua, error) { + + repo, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ + Depth: 1, + URL: url, + SingleBranch: true, + RemoteName: "main", + }) + if err != nil { + return PacketLua{}, err + } + ref, err := repo.Head() + if err != nil { + return PacketLua{}, err + } + commit, err := repo.CommitObject(ref.Hash()) + if err != nil { + return PacketLua{}, err + } + + f, err := commit.File("Packet.lua") + if err != nil { + return PacketLua{}, err + } + + content, err := f.Contents() + if err != nil { + return PacketLua{}, err + } + + fmt.Println(content) + + return ReadPacket([]byte(content)) +} From 0a531488a31c93e54d65e7424a69d5510aa1eb09 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:06:08 -0300 Subject: [PATCH 22/26] Packet.lua example test --- Packet.lua | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Packet.lua diff --git a/Packet.lua b/Packet.lua new file mode 100644 index 0000000..e4684dd --- /dev/null +++ b/Packet.lua @@ -0,0 +1,35 @@ +return { + package = { + name = "packets", + id = "packets@git", + version = "git", + author = "robogg133", + description = "fast, opensource, easy to use package manager.", + type = "remote", + + build_dependencies = {["go"] = "1.25.1"}, + + git_url = "https://github.com/roboogg133/packets.git", + git_branch = "main" + + }, + + + prepare = function(container) + git.clone("https://github.com/roboogg133/packets.git", container.dir("/data")) + os.remove(container.dir("/data/.git")) + + end, + + build = function() + os.execute("go build ./data/cmd/packets") + end, + + install = function(container) + os.copy(container.dir("./packets"), BIN_DIR) + end, + + remove = function () + os.remove(path_join(BIN_DIR, "packets")) + end +} \ No newline at end of file From 89b3fdbc84ebb8665e8029e96120ccb04a712762 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:23:16 -0300 Subject: [PATCH 23/26] getting functions from right table now and reading os and arch in package table --- internal/packet/main.go | 43 ++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/internal/packet/main.go b/internal/packet/main.go index 8f6a363..2069d76 100644 --- a/internal/packet/main.go +++ b/internal/packet/main.go @@ -10,6 +10,7 @@ import ( "runtime" "github.com/go-git/go-git/v6" + "github.com/go-git/go-git/v6/plumbing" "github.com/go-git/go-git/v6/storage/memory" "github.com/klauspost/compress/zstd" lua "github.com/yuin/gopher-lua" @@ -46,22 +47,23 @@ func ReadPacket(f []byte) (PacketLua, error) { L := lua.NewState() defer L.Close() - osObject := L.GetGlobal("os").(*lua.LTable) - ioObject := L.GetGlobal("io").(*lua.LTable) + //osObject := L.GetGlobal("os").(*lua.LTable) + //ioObject := L.GetGlobal("io").(*lua.LTable) - L.SetGlobal("os", lua.LNil) - L.SetGlobal("io", lua.LNil) - - if err := L.DoString(string(f)); err != nil { - return PacketLua{}, err - } - L.SetGlobal("os", osObject) - L.SetGlobal("io", ioObject) + // L.SetGlobal("os", lua.LNil) + // L.SetGlobal("io", lua.LNil) L.SetGlobal("BIN_DIR", lua.LString(cfg.Config.Bin_d)) L.SetGlobal("ARCH", lua.LString(runtime.GOARCH)) L.SetGlobal("OS", lua.LString(runtime.GOOS)) + if err := L.DoString(string(f)); err != nil { + return PacketLua{}, err + } + fmt.Println(string(f)) + //L.SetGlobal("os", osObject) + //L.SetGlobal("io", ioObject) + tableLua := L.Get(-1) if tableLua.Type() != lua.LTTable { @@ -90,10 +92,13 @@ func ReadPacket(f []byte) (PacketLua, error) { GitUrl: getStringFromTable(pkgTable, "git_url"), GitBranch: getStringFromTable(pkgTable, "git_branch"), - Prepare: getFunctionFromTable(pkgTable, "prepare"), - Build: getFunctionFromTable(pkgTable, "build"), - Install: getFunctionFromTable(pkgTable, "install"), - Remove: getFunctionFromTable(pkgTable, "remove"), + Os: getStringArrayFromTable(L, pkgTable, "os"), + Architetures: getStringArrayFromTable(L, pkgTable, "arch"), + + Prepare: getFunctionFromTable(table, "prepare"), + Build: getFunctionFromTable(table, "build"), + Install: getFunctionFromTable(table, "install"), + Remove: getFunctionFromTable(table, "remove"), } if packetLua.Install == nil || packetLua.Remove == nil { @@ -143,10 +148,10 @@ func ReadPacketFromFile(file io.Reader) (PacketLua, error) { func GetPackageDotLuaFromRemote(url string, branch string) (PacketLua, error) { repo, err := git.Clone(memory.NewStorage(), nil, &git.CloneOptions{ - Depth: 1, - URL: url, - SingleBranch: true, - RemoteName: "main", + Depth: 1, + URL: url, + SingleBranch: true, + ReferenceName: plumbing.ReferenceName("refs/heads/" + branch), }) if err != nil { return PacketLua{}, err @@ -170,7 +175,5 @@ func GetPackageDotLuaFromRemote(url string, branch string) (PacketLua, error) { return PacketLua{}, err } - fmt.Println(content) - return ReadPacket([]byte(content)) } From 72a5ab7c5df8a618f2fae8239b4582fbbae68255 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 18:24:10 -0300 Subject: [PATCH 24/26] removing debug changes --- internal/packet/main.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/packet/main.go b/internal/packet/main.go index 2069d76..b33c3e6 100644 --- a/internal/packet/main.go +++ b/internal/packet/main.go @@ -47,11 +47,11 @@ func ReadPacket(f []byte) (PacketLua, error) { L := lua.NewState() defer L.Close() - //osObject := L.GetGlobal("os").(*lua.LTable) - //ioObject := L.GetGlobal("io").(*lua.LTable) + osObject := L.GetGlobal("os").(*lua.LTable) + ioObject := L.GetGlobal("io").(*lua.LTable) - // L.SetGlobal("os", lua.LNil) - // L.SetGlobal("io", lua.LNil) + L.SetGlobal("os", lua.LNil) + L.SetGlobal("io", lua.LNil) L.SetGlobal("BIN_DIR", lua.LString(cfg.Config.Bin_d)) L.SetGlobal("ARCH", lua.LString(runtime.GOARCH)) @@ -60,9 +60,9 @@ func ReadPacket(f []byte) (PacketLua, error) { if err := L.DoString(string(f)); err != nil { return PacketLua{}, err } - fmt.Println(string(f)) - //L.SetGlobal("os", osObject) - //L.SetGlobal("io", ioObject) + + L.SetGlobal("os", osObject) + L.SetGlobal("io", ioObject) tableLua := L.Get(-1) From aa65b28112c1c3bc3e52203b7a40952d67bceaab Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 21:46:46 -0300 Subject: [PATCH 25/26] Packet.lua with right version, serial and better version constraint --- Packet.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Packet.lua b/Packet.lua index e4684dd..d143814 100644 --- a/Packet.lua +++ b/Packet.lua @@ -1,13 +1,14 @@ return { package = { name = "packets", - id = "packets@git", - version = "git", + id = "packets@1.0.0", + version = "1.0.0", author = "robogg133", description = "fast, opensource, easy to use package manager.", type = "remote", + serial = 0, - build_dependencies = {["go"] = "1.25.1"}, + build_dependencies = {["go"] = ">=1.25.1"}, git_url = "https://github.com/roboogg133/packets.git", git_branch = "main" From a62ddf8270cf6785ec8917b8b557a2ccfba7dec8 Mon Sep 17 00:00:00 2001 From: robogg133 Date: Sun, 26 Oct 2025 21:47:06 -0300 Subject: [PATCH 26/26] simple checking for remote packets --- internal/packet/auxiliar_functions.go | 10 ++ internal/packet/main.go | 3 + internal/utils/lua/git.go | 3 + internal/utils/utils.go | 3 + pkg/main.go | 138 ++++++++++++++++++-------- 5 files changed, 113 insertions(+), 44 deletions(-) diff --git a/internal/packet/auxiliar_functions.go b/internal/packet/auxiliar_functions.go index b604afc..6039ec9 100644 --- a/internal/packet/auxiliar_functions.go +++ b/internal/packet/auxiliar_functions.go @@ -10,6 +10,16 @@ func getStringFromTable(table *lua.LTable, key string) string { return "" } +func getIntFromTable(table *lua.LTable, key string) int { + value := table.RawGetString(key) + if value.Type() == lua.LTNumber { + if num, ok := value.(lua.LNumber); ok { + return int(num) + } + } + return -133 +} + func getStringArrayFromTable(L *lua.LState, table *lua.LTable, key string) []string { value := table.RawGetString(key) if value.Type() != lua.LTTable { diff --git a/internal/packet/main.go b/internal/packet/main.go index b33c3e6..015c23a 100644 --- a/internal/packet/main.go +++ b/internal/packet/main.go @@ -25,6 +25,8 @@ type PacketLua struct { Author string Architetures []string Os []string + Serial int + Type string PkgType string GitUrl string @@ -85,6 +87,7 @@ func ReadPacket(f []byte) (PacketLua, error) { Author: getStringFromTable(pkgTable, "author"), Description: getStringFromTable(pkgTable, "description"), PkgType: getStringFromTable(pkgTable, "type"), + Serial: getIntFromTable(pkgTable, "serial"), Dependencies: getDependenciesFromTable(L, pkgTable, "dependencies"), BuildDependencies: getDependenciesFromTable(L, pkgTable, "build_dependencies"), diff --git a/internal/utils/lua/git.go b/internal/utils/lua/git.go index 28fc9c4..3c81474 100644 --- a/internal/utils/lua/git.go +++ b/internal/utils/lua/git.go @@ -64,6 +64,9 @@ func LGitCheckout(L *lua.LState) int { func LGitPUll(L *lua.LState) int { dir := L.CheckString(1) + + git.PlainClone("/tmp", &git.CloneOptions{}) + depth := 1 if L.GetTop() > 1 { depth = L.CheckInt(2) diff --git a/internal/utils/utils.go b/internal/utils/utils.go index 5d9471c..97280fe 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -264,6 +264,9 @@ func ResolvDependencies(depnList map[string]string) ([]string, error) { value := strings.TrimLeft(constraint, "<>=") switch { + case constraint == "any": + filter = "" + order = "ORDER BY serial DESC LIMIT 1" case strings.HasPrefix(constraint, ">"): filter = fmt.Sprintf("AND serial > %s", value) order = "ORDER BY serial DESC LIMIT 1" diff --git a/pkg/main.go b/pkg/main.go index 46fbddd..7d3e379 100644 --- a/pkg/main.go +++ b/pkg/main.go @@ -49,6 +49,43 @@ type Package struct { // Install exctract and fully install from a package file ( tar.zst ) func InstallPackage(file []byte, destDir string) error { + + packetLua, err := packet.ReadPacket(file) + if err == nil { + L, err := utils_lua.GetSandBox() + if err != nil { + return err + } + + bootstrapcontainer, err := build.NewContainer(packetLua) + if err != nil { + return err + } + + os.Chdir(destDir) + + if err := utils.ChangeToNoPermission(); err != nil { + return fmt.Errorf("error changing to packet user: %s", err) + } + + if err := bootstrapcontainer.ExecutePrepare(packetLua, &L); err != nil { + return fmt.Errorf("error executing prepare: %s", err) + } + + if err := bootstrapcontainer.ExecuteBuild(packetLua, &L); err != nil { + return fmt.Errorf("error executing build: %s", err) + } + + if err := utils.ElevatePermission(); err != nil { + return fmt.Errorf("error changing to root: %s", err) + } + + if err := bootstrapcontainer.ExecuteInstall(packetLua, &L); err != nil { + return fmt.Errorf("error executing build: %s", err) + } + return nil + } + manifest, err := packet.ReadPacketFromFile(bytes.NewReader(file)) if err != nil { return err @@ -151,6 +188,10 @@ func InstallPackage(file []byte, destDir string) error { os.Chdir(destDir) + if err := utils.ChangeToNoPermission(); err != nil { + return fmt.Errorf("error changing to packet user: %s", err) + } + if err := bootstrapcontainer.ExecutePrepare(manifest, &L); err != nil { return fmt.Errorf("error executing prepare: %s", err) } @@ -159,17 +200,14 @@ func InstallPackage(file []byte, destDir string) error { return fmt.Errorf("error executing build: %s", err) } - if err := utils.ChangeToNoPermission(); err != nil { - return fmt.Errorf("error changing to packet user: %s", err) - } - if err := bootstrapcontainer.ExecuteInstall(manifest, &L); err != nil { - return fmt.Errorf("error executing build: %s", err) - } - if err := utils.ElevatePermission(); err != nil { return fmt.Errorf("error changing to root: %s", err) } + if err := bootstrapcontainer.ExecuteInstall(manifest, &L); err != nil { + return fmt.Errorf("error executing build: %s", err) + } + return nil } @@ -185,8 +223,8 @@ func GetPackage(id string) (Package, error) { } defer db.Close() - var packageUrl string - err = db.QueryRow("SELECT query_name, version, package_url, image_url, description, author, author_verified, os, arch, signature, public_key, serial, size FROM packages WHERE id = ?", id). + var packageUrl, typePackage string + err = db.QueryRow("SELECT query_name, version, package_url, image_url, description, author, author_verified, os, arch, signature, public_key, serial, size, type FROM packages WHERE id = ?", id). Scan( &this.QueryName, &this.Version, @@ -201,6 +239,7 @@ func GetPackage(id string) (Package, error) { &this.PublicKey, &this.Serial, &this.Size, + &typePackage, ) if err != nil { return Package{}, err @@ -221,53 +260,64 @@ func GetPackage(id string) (Package, error) { this.Dependencies[a] = vConstraint } - filename := path.Base(packageUrl) - this.Filename = filename + if strings.Contains(typePackage, " ") { - dirEntry, err := os.ReadDir(consts.DefaultCache_d) - if err != nil { - return Package{}, err - } + filename := path.Base(packageUrl) + this.Filename = filename - for _, v := range dirEntry { - if v.Name() == filename { - this.PackageF, err = os.ReadFile(filepath.Join(consts.DefaultCache_d, filename)) - if err != nil { - break - } - goto skipping - - } - } - - peers, err = AskLAN(filename) - if err != nil { - return Package{}, err - } - - if len(peers) == 0 { - fmt.Printf(":: Pulling from %s\n", packageUrl) - this.PackageF, err = getFileHTTP(packageUrl) + dirEntry, err := os.ReadDir(consts.DefaultCache_d) if err != nil { return Package{}, err } - } else { - var totalerrors int = 0 - for _, peer := range peers { - fmt.Printf(":: Pulling from local network (%s)\n", peer.IP) - this.PackageF, err = getFileHTTP(fmt.Sprintf("http://%s:%d/%s", peer.IP, peer.Port, filename)) - if err == nil { - break - } else { - totalerrors++ + + for _, v := range dirEntry { + if v.Name() == filename { + this.PackageF, err = os.ReadFile(filepath.Join(consts.DefaultCache_d, filename)) + if err != nil { + break + } + goto skipping + } } - if totalerrors == len(peers) { + + peers, err = AskLAN(filename) + if err != nil { + return Package{}, err + } + + if len(peers) == 0 { + fmt.Printf(":: Pulling from %s\n", packageUrl) this.PackageF, err = getFileHTTP(packageUrl) if err != nil { return Package{}, err } + } else { + var totalerrors int = 0 + for _, peer := range peers { + fmt.Printf(":: Pulling from local network (%s)\n", peer.IP) + this.PackageF, err = getFileHTTP(fmt.Sprintf("http://%s:%d/%s", peer.IP, peer.Port, filename)) + if err == nil { + break + } else { + totalerrors++ + } + } + if totalerrors == len(peers) { + this.PackageF, err = getFileHTTP(packageUrl) + if err != nil { + return Package{}, err + } + } } + } else { + filds := strings.Fields(typePackage) + pkt, err := packet.GetPackageDotLuaFromRemote(filds[0], filds[1]) + if err != nil { + return Package{}, err + } + this.Manifest = pkt + return this, nil } skipping: