Compare commits
	
		
			10 Commits
		
	
	
		
			9883fd92dc
			...
			61cf888605
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 61cf888605 | |||
| a62ddf8270 | |||
| aa65b28112 | |||
| 72a5ab7c5d | |||
| 89b3fdbc84 | |||
| 0a531488a3 | |||
| 7fbaef7bd4 | |||
| b411eff6f4 | |||
| befa4e3ea4 | |||
| 807d9fa784 | 
							
								
								
									
										40
									
								
								Packet.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								Packet.lua
									
									
									
									
									
										Normal 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
 | 
			
		||||
}
 | 
			
		||||
@@ -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