Compare commits
12 Commits
9883fd92dc
...
v2
| Author | SHA1 | Date | |
|---|---|---|---|
| b31630a6c0 | |||
|
|
25eabc92ed | ||
| a111b060f1 | |||
| a62ddf8270 | |||
| aa65b28112 | |||
| 72a5ab7c5d | |||
| 89b3fdbc84 | |||
| 0a531488a3 | |||
| 7fbaef7bd4 | |||
| b411eff6f4 | |||
| befa4e3ea4 | |||
| 807d9fa784 |
36
Packet.lua
Normal file
36
Packet.lua
Normal file
@@ -0,0 +1,36 @@
|
||||
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,
|
||||
|
||||
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
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
);
|
||||
`
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
68
pkg/main.go
68
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,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:
|
||||
|
||||
|
||||
14
systemd/packets-http.service
Normal file
14
systemd/packets-http.service
Normal 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
|
||||
14
systemd/packets-udp.service
Normal file
14
systemd/packets-udp.service
Normal 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
|
||||
Reference in New Issue
Block a user