Browse Source

Add logs function (#1108)

link 2 years ago
parent
commit
b420a2d930
4 changed files with 110 additions and 19 deletions
  1. 16 0
      api/casaos/openapi.yaml
  2. 34 18
      codegen/casaos_api.go
  3. 2 1
      route/v2.go
  4. 58 0
      route/v2/health.go

+ 16 - 0
api/casaos/openapi.yaml

@@ -59,6 +59,22 @@ paths:
           $ref: "#/components/responses/GetHealthPortsOK"
         "500":
           $ref: "#/components/responses/ResponseInternalServerError"
+  /health/logs:
+    get:
+      tags:
+        - Health methods
+      summary: Get log
+      operationId: getHealthlogs
+      responses:
+        "200":
+          description: OK
+          content:
+            application/octet-stream:
+              schema:
+                type: string
+                format: binary
+        "500":
+          $ref: "#/components/responses/ResponseInternalServerError"
 
   /file/test:
     get:

+ 34 - 18
codegen/casaos_api.go

@@ -65,6 +65,9 @@ type ServerInterface interface {
 	// Test file methods
 	// (GET /file/test)
 	GetFileTest(ctx echo.Context) error
+	// Get log
+	// (GET /health/logs)
+	GetHealthlogs(ctx echo.Context) error
 	// Get port in use
 	// (GET /health/ports)
 	GetHealthPorts(ctx echo.Context) error
@@ -89,6 +92,17 @@ func (w *ServerInterfaceWrapper) GetFileTest(ctx echo.Context) error {
 	return err
 }
 
+// GetHealthlogs converts echo context to params.
+func (w *ServerInterfaceWrapper) GetHealthlogs(ctx echo.Context) error {
+	var err error
+
+	ctx.Set(Access_tokenScopes, []string{""})
+
+	// Invoke the callback with all the unmarshalled arguments
+	err = w.Handler.GetHealthlogs(ctx)
+	return err
+}
+
 // GetHealthPorts converts echo context to params.
 func (w *ServerInterfaceWrapper) GetHealthPorts(ctx echo.Context) error {
 	var err error
@@ -140,6 +154,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
 	}
 
 	router.GET(baseURL+"/file/test", wrapper.GetFileTest)
+	router.GET(baseURL+"/health/logs", wrapper.GetHealthlogs)
 	router.GET(baseURL+"/health/ports", wrapper.GetHealthPorts)
 	router.GET(baseURL+"/health/services", wrapper.GetHealthServices)
 
@@ -148,24 +163,25 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
 // Base64 encoded, gzipped, json marshaled Swagger object
 var swaggerSpec = []string{
 
-	"H4sIAAAAAAAC/8xW4W/bthP9Vwj+fh+aQbaMBAUKAf2QNksaBIODJcMGxIZLU2eJjURyd6QTL9D/PpCS",
-	"Y8V2g6Rdh31yRB7fvfdyx+MDl6a2RoN2xLMHjkDWaIL4cQbuE4jKlZcGHY0vwpo02oF24U9hbaWkcMro",
-	"9AsZHdZIllCLuFtV4wXPbh74/xEWPOP/Szep0jaO0g+C4NcuJ2+SB27RWECnWga5cBHsOYgeRd40zbRp",
-	"moTnQBKVDdx4xscXvEk2cq4Al0rCf1zRmuXzotapzrUD1KIKpwB/RjT4KnEvl7TLZJ2btclZm71H7pVG",
-	"fw+X4EqTdGDR8Scnsu3/Rw1EoogbT4G6DYbgPGrI2XzFqNVHKgemFsyVgMAUMaFXPOFwL2pbAc84TziC",
-	"yMe6WvHMoYeEu5UNO+RQ6aIl3i/cHV5O2vCjHNTx+xH83egRTGkHBUSnuxWBKAKV+0FhBlrUYe3642WI",
-	"8PlXAN8evRLwt5PLvoDHOt3RoI2bodc6KN6bmktBwtCQWgi+Y9MWjybhL8EbFMLBnVi9HDfKIZAelVtd",
-	"hdppFQgpgWjmzC3EGlWhMkoQOSBPeOfHsXelQfVXLOdNLmHVBaxap5RemN0Sm/jR6EhaJZ1HiB8w0Ywx",
-	"1m6Q8SiB1ZAr8X7C31iEBSANpKkMDmKFQ8ZygbcHE84IJYF7P+Glc5ayNEVxNyyUK/3cE2DXfENp6vRc",
-	"wu+lqOAaZJlWpjBpLZROW/O6n9lcaA04C/AzrYrSzd6NRvZ+aHUx4d9KtgpAP5Ctu1MxxWxeeXiesKoL",
-	"JqpA4aMgMb5qSf37jFo26VYVTHTLih1fnjOLZqlyIFYrklBVQoPxxGpwpcmJLQyyXC0WgKAdIwlaoDI0",
-	"DCinBpki8hAuqZzliqQnUkZTwmwFgoAtFSkX7jJ2c6bcJz9nCNaQcgZX0zdrN1onduW3NA+YQfbFKM1u",
-	"jEd2okgazDen83ZhWBTprf7zeD7/MIc/DoaT2C7Kxd7dCOYJXwJS2yTLw9CuxoIWVvGMHw1HwyOecCtc",
-	"GXs0XagKUgcUJ0sBbrfRroEcC2Frz4Y8QmJs2fOcZ+FxcKqCJnLx9u49gw5Ho69Npce4tDfqmoS/fc2R",
-	"faM73ke+rgWu9vEPtomCeHbDT/vL03AuLeO9nNr1ZOk82RHcH0DfonnnffjPKz8Dx4IOpjTzBD3dbeb9",
-	"yqk3kvYWRIDtJgkjJ5wnZhYMhCzZ526G/PSZdTB7i2Vr9n2Xfb336I9xsBPSSX3WxN4cjE/dpxPwZtpM",
-	"Q0BIRnHfY8Uzni4Pu3uPh4AOftv1N9fjk/HBZnBuZQ+P5ecPPKn1kOh+4ERxhsbbNl8X98tOl+wInTZ/",
-	"BwAA///xoj5w+wwAAA==",
+	"H4sIAAAAAAAC/8xX3W7bRhN9lcV+30VcUKIQI0BAIBf5aRwjKGQ0LlrAMpTVckRuQu5uZ4aKVYPvXuyS",
+	"smhJEeykKXola3/OnHM8szO6ldrV3lmwTDK7lQjknSWIX86A34GquLxwyDR9H9a0swyWw5/K+8poxcbZ",
+	"9BM5G9ZIl1CruFtV06XMrm7l/xGWMpP/S7eh0u4cpa8Uwa99TNkmt9Kj84BsOga54gh2DGJAUbZte922",
+	"bSJzII3GB24yk9P3sk22cj4AroyG/7iiDcvjojahzi0DWlWFW4A/Izp8lLiHS9pnsoktuuCiiz4g90ij",
+	"v4dLcKVNerDo+L0b2e7/owYiVcSN+0D9hkDgBi3kYrEW1Okjk4MwS8ElIAhDQtm1TCTcqNpXIDMpE4mg",
+	"8qmt1jJjbCCRvPZhhxiNLTriw8Td48Xahw/DUMfvd+DPJ3dgxjIUEJ3uVxSiClRuRoUbWVWHtcvXF+FE",
+	"k38F8NnpIwF/e3MxFHCXp3sarOM5NtYGxQdDS61IORpTByH3bNrh0SbyIXijQjF8UeuH40Y5BLpBw+sP",
+	"IXc6BUprIJqz+wwxR03IjBJUDigT2fvxsuHSofkrpvM2lvLmPaw7p4xduv0UmzWTyan2RnODEL/AzAoh",
+	"RLdBrkENoobcqBcz+cQjLAFppF3lcBQzHDKRK/x8MpOCUBPwi5ksmT1laYrqy7gwXDaLhgD74htrV6fn",
+	"Gn4vVQWXoMu0coVLa2Vs2pnXf8wXylrAeYCfW1OUPH8+mfibsbfFTH4r2SoA/UC2/MXEEPNF1cBxwqYu",
+	"hKoChdeK1PRDR+rfZ9SxSXeyYGY7VuLlxbnw6FYmBxK1IQ1VpSy4hkQNXLqcxNKhyM1yCQiWBWmwCo2j",
+	"cUB561AYogbCI5WL3JBuiIyzlAhfgSIQK0OGw1smrs4Mv2sWAsE7Muxwff1k40bnxL78juaJcCg+OWPF",
+	"lWtQvDGkHebb23m3MC6K9LP98+Vi8WoBf5yMZ7FcDMfa3QqWiVwBUlckq6ehXJ0Hq7yRmTwdT8anMpFe",
+	"cRlrNF2aClIGip2lAN4vtEsgFuHYxrOxjJAYS/Y8l1kYDt6aoIk4vt6DMejpZPK1rnR3Lh20ujaRzx5z",
+	"5VDrju9RU9cK14f4B9tUQTK7km+Hy9fhXlrGdzlkJg0s2dPbPd/x1GHFX2nYTjPwiBhB1fcb99JhrVhm",
+	"cmFsYH6w7R2aYv5hv86AReWKgUud1sM++U0HPm5U16i/JTf25ugfozjoEMaKhuCBymnQug8WToDtO64g",
+	"VtyQcEsBSpfiY99rf/ooepiDRbUzI3yXfYO5/cc42AvppR41cTAvxJ8E9yeFq+v2OhwIwSjuN1jJTKar",
+	"p31/kOFAD7/r+pPL6ZvpyXbA2IkeflQcv3DvTQiBbkasijN0je/i9ed+2XtN9oRet38HAAD///s5WXsj",
+	"DgAA",
 }
 
 // GetSwagger returns the content of the embedded swagger specification file

+ 2 - 1
route/v2.go

@@ -73,7 +73,8 @@ func InitV2Router() http.Handler {
 	e.Use(echo_middleware.JWTWithConfig(echo_middleware.JWTConfig{
 		Skipper: func(c echo.Context) bool {
 			return c.RealIP() == "::1" || c.RealIP() == "127.0.0.1"
-			// return true
+			//return true
+
 		},
 		ParseTokenFunc: func(token string, c echo.Context) (interface{}, error) {
 			valid, claims, err := jwt.Validate(token, func() (*ecdsa.PublicKey, error) { return external.GetPublicKey(config.CommonInfo.RuntimePath) })

+ 58 - 0
route/v2/health.go

@@ -2,10 +2,15 @@ package v2
 
 import (
 	"net/http"
+	"net/url"
+	"os"
+	"path/filepath"
 
 	"github.com/IceWhaleTech/CasaOS/codegen"
+	"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
 	"github.com/IceWhaleTech/CasaOS/service"
 	"github.com/labstack/echo/v4"
+	"github.com/mholt/archiver/v3"
 )
 
 func (s *CasaOS) GetHealthServices(ctx echo.Context) error {
@@ -41,3 +46,56 @@ func (s *CasaOS) GetHealthPorts(ctx echo.Context) error {
 		},
 	})
 }
+
+func (c *CasaOS) GetHealthlogs(ctx echo.Context) error {
+	var name, currentPath, commonDir, extension string
+	var err error
+	var ar archiver.Writer
+	fileList, err := os.ReadDir("/var/log/casaos")
+	if err != nil {
+		message := err.Error()
+		return ctx.JSON(http.StatusInternalServerError, codegen.ResponseInternalServerError{
+			Message: &message,
+		})
+	}
+	extension, ar, err = file.GetCompressionAlgorithm("zip")
+	if err != nil {
+		ctx.Response().Header().Set("Content-Type", "application/json")
+		message := err.Error()
+		return ctx.JSON(http.StatusNotFound, codegen.ResponseInternalServerError{
+			Message: &message,
+		})
+	}
+	err = ar.Create(ctx.Response().Writer)
+	if err != nil {
+		ctx.Response().Header().Set("Content-Type", "application/json")
+		message := err.Error()
+		return ctx.JSON(http.StatusNotFound, codegen.ResponseInternalServerError{
+			Message: &message,
+		})
+	}
+	defer ar.Close()
+
+	commonDir = "/var/log/casaos"
+
+	currentPath = filepath.Base(commonDir)
+
+	name = currentPath
+	name += extension
+	ctx.Response().Header().Add("Content-Type", "application/octet-stream")
+	ctx.Response().Header().Add("Content-Transfer-Encoding", "binary")
+	ctx.Response().Header().Add("Cache-Control", "no-cache")
+	ctx.Response().Header().Add("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(name))
+
+	for _, fname := range fileList {
+		err := file.AddFile(ar, filepath.Join("/var/log/casaos", fname.Name()), commonDir)
+		if err != nil {
+			message := err.Error()
+			return ctx.JSON(http.StatusInternalServerError, codegen.ResponseInternalServerError{
+				Message: &message,
+			})
+		}
+
+	}
+	return nil
+}