From 26f9e20ae8beefa38fbe849df380a00df09d0640 Mon Sep 17 00:00:00 2001 From: roboogg133 Date: Fri, 24 Oct 2025 11:10:43 -0300 Subject: [PATCH] doing lua functions for build files, to run only in afero.FS --- internal/build/lua.go | 116 +++++++++++++++++++++++++++++ internal/build/main.go | 4 +- internal/build/specs.go | 6 ++ internal/build/utils.go | 79 ++++++++++++++++++++ internal/utils/lua/luafunctions.go | 4 +- 5 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 internal/build/lua.go create mode 100644 internal/build/specs.go create mode 100644 internal/build/utils.go diff --git a/internal/build/lua.go b/internal/build/lua.go new file mode 100644 index 0000000..9579c8a --- /dev/null +++ b/internal/build/lua.go @@ -0,0 +1,116 @@ +package build + +import ( + "os" + "strings" + + lua "github.com/yuin/gopher-lua" +) + +func (container Container) lRemove(L *lua.LState) int { + filename := L.CheckString(1) + + err := container.FS.RemoveAll(filename) + if err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func (container Container) lRename(L *lua.LState) int { + oldname := L.CheckString(1) + newname := L.CheckString(2) + + if err := container.FS.Rename(oldname, newname); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + return 1 +} +func (container Container) lCopy(L *lua.LState) int { + oldname := L.CheckString(1) + newname := L.CheckString(2) + + if err := container.copyContainer(oldname, newname); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 + +} + +func modeFlags(mode string) int { + switch mode { + case "r", "rb": + return os.O_RDONLY + case "w", "wb": + return os.O_CREATE | os.O_WRONLY | os.O_TRUNC + case "a", "ab": + return os.O_CREATE | os.O_WRONLY | os.O_APPEND + case "r+", "r+b", "rb+", "br+": + return os.O_RDWR + case "w+", "w+b", "wb+", "bw+": + return os.O_CREATE | os.O_RDWR | os.O_TRUNC + case "a+", "a+b", "ab+", "ba+": + return os.O_CREATE | os.O_RDWR | os.O_APPEND + default: + return os.O_RDONLY + } +} + +func (container Container) lOpen(L *lua.LState) int { + path := L.CheckString(1) + mode := L.OptString(2, "r") + + file, err := container.FS.OpenFile(path, modeFlags(mode), 0644) + if err != nil { + L.Push(lua.LNil) + L.Push(lua.LString(err.Error())) + return 2 + } + + ud := L.NewUserData() + ud.Value = file + L.SetMetatable(ud, L.GetTypeMetatable("file")) + L.Push(ud) + L.Push(lua.LNil) + return 2 +} + +func (container Container) lMkdir(L *lua.LState) int { + path := L.CheckString(1) + perm := L.CheckInt(2) + + if err := container.FS.MkdirAll(path, os.FileMode(perm)); err != nil { + L.Push(lua.LFalse) + L.Push(lua.LString(err.Error())) + return 2 + } + + L.Push(lua.LTrue) + L.Push(lua.LNil) + return 2 +} + +func (container Container) lexecute(L *lua.LState) { + cmdString := L.CheckString(1) + + cmdSlice := strings.Fields(cmdString) +} + +func (container Container) GetLuaState() error { + + lua.NewState(lua.Options{}) + return nil +} diff --git a/internal/build/main.go b/internal/build/main.go index c646129..11ebaa7 100644 --- a/internal/build/main.go +++ b/internal/build/main.go @@ -33,11 +33,11 @@ func NewContainer(Root string, dataDir string, manifest configs.Manifest) (Conta return Container{}, err } - if err := container.FS.MkdirAll("/usr/bin", 0777); err != nil { + if err := container.FS.MkdirAll(BinDir, 0777); err != nil { return Container{}, err } - if err := afero.Symlinker.SymlinkIfPossible(container.FS.(afero.Symlinker), "/usr/bin", "/bin"); err != nil { + if err := afero.Symlinker.SymlinkIfPossible(container.FS.(afero.Symlinker), BinDir, SymLinkBinDir); err != nil { return Container{}, err } diff --git a/internal/build/specs.go b/internal/build/specs.go new file mode 100644 index 0000000..6bcdf98 --- /dev/null +++ b/internal/build/specs.go @@ -0,0 +1,6 @@ +package build + +const ( + BinDir = "/usr/bin" + SymLinkBinDir = "/bin" +) diff --git a/internal/build/utils.go b/internal/build/utils.go new file mode 100644 index 0000000..1f645ba --- /dev/null +++ b/internal/build/utils.go @@ -0,0 +1,79 @@ +package build + +import ( + "io" + "path/filepath" + + "github.com/spf13/afero" +) + +func (container Container) copyContainer(src string, dest string) error { + stats, err := container.FS.Stat(src) + if err != nil { + return err + } + + if stats.IsDir() { + files, err := afero.ReadDir(container.FS, src) + if err != nil { + return err + } + + if err := container.FS.MkdirAll(dest, 0755); err != nil { + return err + } + + for _, file := range files { + srcPath := filepath.Join(src, file.Name()) + destPath := filepath.Join(dest, file.Name()) + + if file.IsDir() { + if err := container.CopyHostToContainer(srcPath, destPath); err != nil { + return err + } + continue + } + + if err := container.copySingleFileLtoL(srcPath, destPath); err != nil { + return err + } + } + } else { + if err := container.copySingleFileLtoL(src, dest); err != nil { + return err + } + } + + return nil +} + +func (container Container) copySingleFileLtoL(source string, destination string) error { + src, err := container.FS.Open(source) + if err != nil { + return err + } + defer src.Close() + + stats, err := src.Stat() + if err != nil { + return err + } + if err := container.FS.MkdirAll(filepath.Dir(destination), 0755); err != nil { + return err + } + dst, err := container.FS.Create(destination) + if err != nil { + return err + } + defer dst.Close() + + if _, err := io.Copy(dst, src); err != nil { + return err + } + + if err := container.FS.Chmod(destination, stats.Mode()); err != nil { + return err + } + + return nil +} diff --git a/internal/utils/lua/luafunctions.go b/internal/utils/lua/luafunctions.go index cab3c8d..a8378ff 100644 --- a/internal/utils/lua/luafunctions.go +++ b/internal/utils/lua/luafunctions.go @@ -253,8 +253,8 @@ func LError(L *lua.LState) int { parts = append(parts, val.String()) } - Llogger().Panic(parts...) + llogger().Panic(parts...) return 0 } -func Llogger() *log.Logger { return log.New(os.Stderr, " script error: ", 0) } +func llogger() *log.Logger { return log.New(os.Stderr, " script error: ", 0) }