Compare commits

..

10 Commits

10 changed files with 241 additions and 57 deletions

40
Packet.lua Normal file
View File

@@ -0,0 +1,40 @@
return {
package = {
name = "packets",
id = "packets@1.0.0",
version = "1.0.0",
author = "robogg133",
description = "fast, opensource, easy to use package manager.",
type = "remote",
serial = 0,
arch = {"x86_65"},
os = {"linux"},
dependencies = {},
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
}

View File

@@ -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)

View File

@@ -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
);
`

View File

@@ -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 {

View File

@@ -9,6 +9,9 @@ import (
"path/filepath"
"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"
)
@@ -22,6 +25,8 @@ type PacketLua struct {
Author string
Architetures []string
Os []string
Serial int
Type string
PkgType string
GitUrl string
@@ -50,16 +55,17 @@ func ReadPacket(f []byte) (PacketLua, error) {
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))
if err := L.DoString(string(f)); err != nil {
return PacketLua{}, err
}
L.SetGlobal("os", osObject)
L.SetGlobal("io", ioObject)
tableLua := L.Get(-1)
if tableLua.Type() != lua.LTTable {
@@ -81,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"),
@@ -88,10 +95,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 {
@@ -137,3 +147,36 @@ 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,
ReferenceName: plumbing.ReferenceName("refs/heads/" + branch),
})
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
}
return ReadPacket([]byte(content))
}

View File

@@ -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)

View File

@@ -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"
@@ -431,7 +434,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()

View File

@@ -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,6 +260,8 @@ func GetPackage(id string) (Package, error) {
this.Dependencies[a] = vConstraint
}
if strings.Contains(typePackage, " ") {
filename := path.Base(packageUrl)
this.Filename = filename
@@ -269,6 +310,15 @@ func GetPackage(id string) (Package, error) {
}
}
}
} 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:

View File

@@ -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

View File

@@ -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