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: