support webdav

This commit is contained in:
w-mj 2023-04-02 12:48:37 +08:00
parent 9e3f47b149
commit 66e9a60bf4
No known key found for this signature in database
GPG Key ID: 3A2CB5BE2F835897
7 changed files with 71 additions and 2 deletions

2
API.md
View File

@ -109,7 +109,7 @@ type DataModel struct {
其中`Type`字段为数据集的类型,表示该数据集的访问方式,目前仅支持`Type=="dir"`访问目录格式数据后续可能支持mysql等数据库。
本系统中对本地文件的访问使用Webdav协议。
`AccessInfo`字段为该数据集的访问方式,在`Type=="dir"`时为该目录的路径。
例如某数据集对象中,`AccessInfo=='/some/data/dir/'`,同时本系统后端地址为`https://ms.educg.net/admin/ `那么通过WebDav协议访问`https://ms.educg.net/files/some/data/dir/ `即可访问该目录。
例如某数据集对象中,`AccessInfo=='/some/data/dir/'`,同时文件服务器地址为`https://ms.educg.net/files/ `那么通过WebDav协议访问`https://ms.educg.net/files/some/data/dir/ `即可访问该目录。
CURD:

View File

@ -18,3 +18,10 @@ EOF
kubectl get secret dev-secret -o yaml
```
## 持续查看Log
```bash
while true; do bash -c "kubectl get pods | grep k8s-manager-deployment | awk '{print \$1}' | xargs kubectl logs -f"; sleep 1; done
```

View File

@ -22,7 +22,7 @@ spec:
- containerPort: 8080
env:
- name: GIN_MODE
value: release
value: debug
- name: URL_PREFIX
value: admin
- name: DB_HOST
@ -70,6 +70,7 @@ metadata:
name: manager-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/proxy-body-size: 10g
spec:
ingressClassName: nginx
rules:

View File

@ -73,6 +73,8 @@ func main() {
r.POST("/fork", controller.ForkApp)
// controller.AddWebdavHandler(r)
r.POST("/image", controller.AddImage)
r.PUT("/image", controller.UpdateImage)
r.DELETE("/image", controller.DeleteImage)

View File

@ -0,0 +1,52 @@
package controller
import (
"github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus"
"golang.org/x/net/webdav"
"net/http"
"sync"
)
var fs *webdav.Handler
var fsLock sync.Mutex
func WebDav(c *gin.Context) {
if fs == nil {
fsLock.Lock()
if fs == nil {
fs = &webdav.Handler{
Prefix: "/webdav",
FileSystem: webdav.Dir("/mnt/CGdata/ms"),
LockSystem: webdav.NewMemLS(),
Logger: func(h *http.Request, e error) {
log.Error(e)
},
}
}
fsLock.Unlock()
}
log.Info("Webdav ", c.Request.Method, c.Request.URL.Path)
fs.ServeHTTP(c.Writer, c.Request)
}
func AddWebdavHandler(r *gin.Engine) {
methods := []string{
"OPTIONS",
"GET", "HEAD", "POST",
"DELETE",
"PUT",
"MKCOL",
"COPY", "MOVE",
"LOCK",
"UNLOCK",
"PROPFIND",
"PROPPATCH",
}
for _, m := range methods {
r.Handle(m, "/webdav", WebDav)
r.Handle(m, "/webdav/*path", WebDav)
}
}

View File

@ -48,6 +48,10 @@ func JWTAuthMiddleware(c *gin.Context) {
// 登录过程,不验证身份
return
}
if strings.HasPrefix(c.Request.URL.Path, "/webdav") {
// Webdav暂时不验证身份
return
}
authHeader := c.Request.Header.Get("Authorization")
if authHeader == "" {
var err error

View File

@ -54,6 +54,9 @@ metadata:
name: webdav-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/proxy-body-size: 10g
nginx.ingress.kubernetes.io/proxy-buffering: "on"
nginx.ingress.kubernetes.io/proxy-buffer-size: "1024k"
spec:
ingressClassName: nginx
rules: