From a7d886f66dda046bb17dc9ae753976adb3fa6f22 Mon Sep 17 00:00:00 2001 From: Matheus Fidelis Date: Fri, 10 Jan 2025 08:48:07 -0300 Subject: [PATCH] Feature: fs operation --- README.md | 26 ++++++++++++++++++ controllers/filesystem/cat.go | 29 ++++++++++++++++++++ controllers/filesystem/delete.go | 25 +++++++++++++++++ controllers/filesystem/ls.go | 47 ++++++++++++++++++++++++++++++++ controllers/filesystem/write.go | 37 +++++++++++++++++++++++++ main.go | 7 +++++ 6 files changed, 171 insertions(+) create mode 100644 controllers/filesystem/cat.go create mode 100644 controllers/filesystem/delete.go create mode 100644 controllers/filesystem/ls.go create mode 100644 controllers/filesystem/write.go diff --git a/README.md b/README.md index 8ca6d92..394b2cc 100644 --- a/README.md +++ b/README.md @@ -396,6 +396,32 @@ Content-Length: 61 {"status":200,"message":"2000 logging events sent to stdout"} ``` +## Filesystem + +List some directory contents + +```bash +curl -X POST "0.0.0.0:8080/filesystem/ls" -i -d '{"path": "./"}' +``` + +Write file + +```bash +curl -X POST "0.0.0.0:8080/filesystem/write" -d '{"path": "./test", "content": "V3JpdGUgVGVzdAo="}'; +``` + +Read files on filesystem + +```bash +curl -X POST "0.0.0.0:8080/filesystem/cat" -d '{"path": "./test"}'; +``` + +Delete files on filesystem + +```bash +curl -X DELETE "0.0.0.0:8080/filesystem/delete" -d '{"path": "./test"}'; +``` + ## Whoami? ```sh diff --git a/controllers/filesystem/cat.go b/controllers/filesystem/cat.go new file mode 100644 index 0000000..e443682 --- /dev/null +++ b/controllers/filesystem/cat.go @@ -0,0 +1,29 @@ +package filesystem + +import ( + "net/http" + "os" + + "github.com/gin-gonic/gin" +) + +type RequestCat struct { + Path string `json:"path"` +} + +func Cat(c *gin.Context) { + var request RequestCat + + if err := c.ShouldBindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + content, err := os.ReadFile(request.Path) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.String(http.StatusOK, string(content)) +} diff --git a/controllers/filesystem/delete.go b/controllers/filesystem/delete.go new file mode 100644 index 0000000..a6b3017 --- /dev/null +++ b/controllers/filesystem/delete.go @@ -0,0 +1,25 @@ +package filesystem + +import ( + "net/http" + "os" + + "github.com/gin-gonic/gin" +) + +type RequestDelete struct { + Path string `json:"path"` +} + +func DeleteFile(c *gin.Context) { + var request RequestDelete + if err := c.ShouldBindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + if err := os.Remove(request.Path); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "file deleted"}) +} diff --git a/controllers/filesystem/ls.go b/controllers/filesystem/ls.go new file mode 100644 index 0000000..f8d2af6 --- /dev/null +++ b/controllers/filesystem/ls.go @@ -0,0 +1,47 @@ +package filesystem + +import ( + "fmt" + "net/http" + "os" + + "github.com/gin-gonic/gin" +) + +type RequestLs struct { + Path string `json:"path"` +} + +type ResponseLs struct { + Path string `json:"path"` + Files []string `json:"files"` +} + +func Ls(c *gin.Context) { + + var request RequestLs + var response ResponseLs + + if err := c.ShouldBindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + files, err := os.ReadDir(request.Path) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + var fileNames []string + for _, file := range files { + fileNames = append(fileNames, file.Name()) + } + + fmt.Println(files) + + response.Path = request.Path + response.Files = fileNames + + c.JSON(200, response) +} diff --git a/controllers/filesystem/write.go b/controllers/filesystem/write.go new file mode 100644 index 0000000..11a550c --- /dev/null +++ b/controllers/filesystem/write.go @@ -0,0 +1,37 @@ +package filesystem + +import ( + "encoding/base64" + "net/http" + "os" + + "github.com/gin-gonic/gin" +) + +type RequestWrite struct { + Path string `json:"path"` + Content string `json:"content"` +} + +func WriteFile(c *gin.Context) { + var request RequestWrite + + if err := c.ShouldBindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + decodedContent, err := base64.StdEncoding.DecodeString(request.Content) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "invalid base64 content"}) + return + } + + err = os.WriteFile(request.Path, decodedContent, 0644) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusAccepted, gin.H{"message": "file written", "path": request.Path}) +} diff --git a/main.go b/main.go index a8bde85..22c24ff 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "chip/controllers/burn" + "chip/controllers/filesystem" "chip/controllers/healthcheck" "chip/controllers/liveness" "chip/controllers/logging" @@ -164,6 +165,12 @@ func main() { // Proxy router.POST("/proxy", proxy.Post) + // Filesystem + router.POST("/filesystem/ls", filesystem.Ls) + router.POST("/filesystem/cat", filesystem.Cat) + router.POST("/filesystem/write", filesystem.WriteFile) + router.DELETE("/filesystem/delete", filesystem.DeleteFile) + // Graceful Shutdown Config srv := &http.Server{ Addr: ":8080",