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, arch TEXT NOT NULL,
os TEXT NOT NULL, os TEXT NOT NULL,
size INTEGER NOT NULL DEFAULT 0, size INTEGER NOT NULL DEFAULT 0,
type TEXT NOT NULL DEFAULT 'static',
UNIQUE(query_name, version), UNIQUE(query_name, version),
UNIQUE(query_name, serial) UNIQUE(query_name, serial)
@@ -33,7 +34,6 @@ CREATE TABLE IF NOT EXISTS packages (
query_name TEXT NOT NULL UNIQUE PRIMARY KEY, query_name TEXT NOT NULL UNIQUE PRIMARY KEY,
id TEXT NOT NULL UNIQUE, id TEXT NOT NULL UNIQUE,
version TEXT NOT NULL, version TEXT NOT NULL,
dependencies TEXT NOT NULL DEFAULT '',
description TEXT NOT NULL, description TEXT NOT NULL,
package_d TEXT NOT NULL, package_d TEXT NOT NULL,
filename TEXT NOT NULL, filename TEXT NOT NULL,
@@ -41,6 +41,7 @@ CREATE TABLE IF NOT EXISTS packages (
arch TEXT NOT NULL, arch TEXT NOT NULL,
in_cache INTEGER NOT NULL DEFAULT 1, in_cache INTEGER NOT NULL DEFAULT 1,
serial INTEGER NOT NULL, serial INTEGER NOT NULL,
type TEXT NOT NULL,
UNIQUE(query_name, version), UNIQUE(query_name, version),
UNIQUE(query_name, serial) 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, query_name TEXT NOT NULL UNIQUE PRIMARY KEY,
id TEXT NOT NULL UNIQUE, id TEXT NOT NULL UNIQUE,
version TEXT NOT NULL, version TEXT NOT NULL,
dependencies TEXT NOT NULL DEFAULT '',
description TEXT NOT NULL, description TEXT NOT NULL,
package_d TEXT NOT NULL, package_d TEXT NOT NULL,
filename TEXT NOT NULL, filename TEXT NOT NULL,
@@ -27,6 +26,7 @@ const InstalledDatabaseSchema = `CREATE TABLE IF NOT EXISTS packages (
arch TEXT NOT NULL, arch TEXT NOT NULL,
in_cache INTEGER NOT NULL DEFAULT 1, in_cache INTEGER NOT NULL DEFAULT 1,
serial INTEGER NOT NULL, serial INTEGER NOT NULL,
type TEXT NOT NULL,
UNIQUE(query_name, version), UNIQUE(query_name, version),
UNIQUE(query_name, serial) UNIQUE(query_name, serial)
@@ -41,4 +41,10 @@ CREATE TABLE package_dependencies(
); );
CREATE INDEX index_dependency_name ON package_dependencies(dependency_name); 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 "" 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 { func getStringArrayFromTable(L *lua.LState, table *lua.LTable, key string) []string {
value := table.RawGetString(key) value := table.RawGetString(key)
if value.Type() != lua.LTTable { if value.Type() != lua.LTTable {

View File

@@ -9,6 +9,9 @@ import (
"path/filepath" "path/filepath"
"runtime" "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" "github.com/klauspost/compress/zstd"
lua "github.com/yuin/gopher-lua" lua "github.com/yuin/gopher-lua"
) )
@@ -22,6 +25,8 @@ type PacketLua struct {
Author string Author string
Architetures []string Architetures []string
Os []string Os []string
Serial int
Type string
PkgType string PkgType string
GitUrl string GitUrl string
@@ -50,16 +55,17 @@ func ReadPacket(f []byte) (PacketLua, error) {
L.SetGlobal("os", lua.LNil) L.SetGlobal("os", lua.LNil)
L.SetGlobal("io", 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("BIN_DIR", lua.LString(cfg.Config.Bin_d))
L.SetGlobal("ARCH", lua.LString(runtime.GOARCH)) L.SetGlobal("ARCH", lua.LString(runtime.GOARCH))
L.SetGlobal("OS", lua.LString(runtime.GOOS)) 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) tableLua := L.Get(-1)
if tableLua.Type() != lua.LTTable { if tableLua.Type() != lua.LTTable {
@@ -81,6 +87,7 @@ func ReadPacket(f []byte) (PacketLua, error) {
Author: getStringFromTable(pkgTable, "author"), Author: getStringFromTable(pkgTable, "author"),
Description: getStringFromTable(pkgTable, "description"), Description: getStringFromTable(pkgTable, "description"),
PkgType: getStringFromTable(pkgTable, "type"), PkgType: getStringFromTable(pkgTable, "type"),
Serial: getIntFromTable(pkgTable, "serial"),
Dependencies: getDependenciesFromTable(L, pkgTable, "dependencies"), Dependencies: getDependenciesFromTable(L, pkgTable, "dependencies"),
BuildDependencies: getDependenciesFromTable(L, pkgTable, "build_dependencies"), BuildDependencies: getDependenciesFromTable(L, pkgTable, "build_dependencies"),
@@ -88,10 +95,13 @@ func ReadPacket(f []byte) (PacketLua, error) {
GitUrl: getStringFromTable(pkgTable, "git_url"), GitUrl: getStringFromTable(pkgTable, "git_url"),
GitBranch: getStringFromTable(pkgTable, "git_branch"), GitBranch: getStringFromTable(pkgTable, "git_branch"),
Prepare: getFunctionFromTable(pkgTable, "prepare"), Os: getStringArrayFromTable(L, pkgTable, "os"),
Build: getFunctionFromTable(pkgTable, "build"), Architetures: getStringArrayFromTable(L, pkgTable, "arch"),
Install: getFunctionFromTable(pkgTable, "install"),
Remove: getFunctionFromTable(pkgTable, "remove"), Prepare: getFunctionFromTable(table, "prepare"),
Build: getFunctionFromTable(table, "build"),
Install: getFunctionFromTable(table, "install"),
Remove: getFunctionFromTable(table, "remove"),
} }
if packetLua.Install == nil || packetLua.Remove == nil { if packetLua.Install == nil || packetLua.Remove == nil {
@@ -137,3 +147,36 @@ func ReadPacketFromFile(file io.Reader) (PacketLua, error) {
} }
return PacketLua{}, errors_packets.ErrCantFindPacketDotLua 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 { func LGitPUll(L *lua.LState) int {
dir := L.CheckString(1) dir := L.CheckString(1)
git.PlainClone("/tmp", &git.CloneOptions{})
depth := 1 depth := 1
if L.GetTop() > 1 { if L.GetTop() > 1 {
depth = L.CheckInt(2) depth = L.CheckInt(2)

View File

@@ -264,6 +264,9 @@ func ResolvDependencies(depnList map[string]string) ([]string, error) {
value := strings.TrimLeft(constraint, "<>=") value := strings.TrimLeft(constraint, "<>=")
switch { switch {
case constraint == "any":
filter = ""
order = "ORDER BY serial DESC LIMIT 1"
case strings.HasPrefix(constraint, ">"): case strings.HasPrefix(constraint, ">"):
filter = fmt.Sprintf("AND serial > %s", value) filter = fmt.Sprintf("AND serial > %s", value)
order = "ORDER BY serial DESC LIMIT 1" order = "ORDER BY serial DESC LIMIT 1"
@@ -431,7 +434,7 @@ skipping:
} }
func GetPacketsUID() (int, error) { 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") cmd := exec.Command("id", "-u", "packets")
out, err := cmd.CombinedOutput() out, err := cmd.CombinedOutput()

View File

@@ -49,6 +49,43 @@ type Package struct {
// Install exctract and fully install from a package file ( tar.zst ) // Install exctract and fully install from a package file ( tar.zst )
func InstallPackage(file []byte, destDir string) error { 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)) manifest, err := packet.ReadPacketFromFile(bytes.NewReader(file))
if err != nil { if err != nil {
return err return err
@@ -151,6 +188,10 @@ func InstallPackage(file []byte, destDir string) error {
os.Chdir(destDir) 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 { if err := bootstrapcontainer.ExecutePrepare(manifest, &L); err != nil {
return fmt.Errorf("error executing prepare: %s", err) 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) 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 { if err := utils.ElevatePermission(); err != nil {
return fmt.Errorf("error changing to root: %s", err) 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 return nil
} }
@@ -185,8 +223,8 @@ func GetPackage(id string) (Package, error) {
} }
defer db.Close() defer db.Close()
var packageUrl string 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 FROM packages WHERE id = ?", id). 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( Scan(
&this.QueryName, &this.QueryName,
&this.Version, &this.Version,
@@ -201,6 +239,7 @@ func GetPackage(id string) (Package, error) {
&this.PublicKey, &this.PublicKey,
&this.Serial, &this.Serial,
&this.Size, &this.Size,
&typePackage,
) )
if err != nil { if err != nil {
return Package{}, err return Package{}, err
@@ -221,6 +260,8 @@ func GetPackage(id string) (Package, error) {
this.Dependencies[a] = vConstraint this.Dependencies[a] = vConstraint
} }
if strings.Contains(typePackage, " ") {
filename := path.Base(packageUrl) filename := path.Base(packageUrl)
this.Filename = filename 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: 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