From 96ff550d611788d8895bd05612eb1265dd9c7845 Mon Sep 17 00:00:00 2001 From: link Date: Thu, 16 Feb 2023 16:55:51 +0800 Subject: [PATCH] Fix permission change cannot be unmount (#902) --- .../usr/lib/systemd/system/rclone.service | 4 +- main.go | 1 + model/search.go | 10 +- pkg/utils/httper/drive.go | 2 +- route/v1.go | 6 + route/v1/other.go | 26 +++++ route/v1/samba.go | 8 +- service/other.go | 104 ++++++++++++++++++ service/other_test.go | 12 ++ service/service.go | 7 ++ 10 files changed, 170 insertions(+), 10 deletions(-) create mode 100644 route/v1/other.go create mode 100644 service/other.go create mode 100644 service/other_test.go diff --git a/build/sysroot/usr/lib/systemd/system/rclone.service b/build/sysroot/usr/lib/systemd/system/rclone.service index 124aa4f81..caa6bf403 100644 --- a/build/sysroot/usr/lib/systemd/system/rclone.service +++ b/build/sysroot/usr/lib/systemd/system/rclone.service @@ -2,8 +2,8 @@ Description=rclone [Service] -ExecStartPre=/usr/bin/rm -f /tmp/rclone.sock -ExecStart=/usr/bin/rclone rcd --rc-addr unix:///tmp/rclone.sock --rc-no-auth --rc-allow-origin "*" +ExecStartPre=/usr/bin/rm -f /var/run/rclone/rclone.sock +ExecStart=/usr/bin/rclone rcd --rc-addr unix:///var/run/rclone/rclone.sock --rc-no-auth --rc-allow-origin "*" Restart=always RestartSec=10 diff --git a/main.go b/main.go index 9612685b9..8e961720a 100644 --- a/main.go +++ b/main.go @@ -144,6 +144,7 @@ func main() { "/v1/driver", "/v1/cloud", "/v1/recover", + "/v1/other", route.V2APIPath, route.V2DocPath, route.V3FilePath, diff --git a/model/search.go b/model/search.go index 5160a9996..170307c13 100644 --- a/model/search.go +++ b/model/search.go @@ -1,7 +1,9 @@ package model -type SearchFileInfo struct { - Path string `json:"path"` - Name string `json:"name"` - Type int `json:"type"` +type SearchEngine struct { + Name string `json:"name"` + Icon string `json:"icon"` + SearchUrl string `json:"search_url"` + RecoUrl string `json:"reco_url"` + Data []string `json:"data"` } diff --git a/pkg/utils/httper/drive.go b/pkg/utils/httper/drive.go index 0f2568101..3d0ee30a5 100644 --- a/pkg/utils/httper/drive.go +++ b/pkg/utils/httper/drive.go @@ -45,7 +45,7 @@ var DefaultTimeout = time.Second * 30 func NewRestyClient() *resty.Client { - unixSocket := "/tmp/rclone.sock" + unixSocket := "/var/run/rclone/rclone.sock" transport := http.Transport{ Dial: func(_, _ string) (net.Conn, error) { diff --git a/route/v1.go b/route/v1.go index 27246b961..03245f21c 100644 --- a/route/v1.go +++ b/route/v1.go @@ -156,6 +156,12 @@ func InitV1Router() *gin.Engine { // merge to system v1NotifyGroup.POST("/system_status", v1.PostSystemStatusNotify) } + v1OtherGroup := v1Group.Group("/other") + v1OtherGroup.Use() + { + v1OtherGroup.GET("/search", v1.GetSearchResult) + + } } return r diff --git a/route/v1/other.go b/route/v1/other.go new file mode 100644 index 000000000..9d2826921 --- /dev/null +++ b/route/v1/other.go @@ -0,0 +1,26 @@ +package v1 + +import ( + "fmt" + + "github.com/IceWhaleTech/CasaOS/model" + "github.com/IceWhaleTech/CasaOS/pkg/utils/common_err" + "github.com/IceWhaleTech/CasaOS/service" + "github.com/gin-gonic/gin" +) + +func GetSearchResult(c *gin.Context) { + key := c.Query("key") + if key == "" { + c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.INVALID_PARAMS, Message: common_err.GetMsg(common_err.INVALID_PARAMS), Data: "key is empty"}) + return + } + data, err := service.MyService.Other().Search(key) + if err != nil { + fmt.Println(err) + c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) + return + } + + c.JSON(common_err.SUCCESS, model.Result{Success: common_err.SUCCESS, Message: common_err.GetMsg(common_err.SUCCESS), Data: data}) +} diff --git a/route/v1/samba.go b/route/v1/samba.go index 750b67806..0792bb99c 100644 --- a/route/v1/samba.go +++ b/route/v1/samba.go @@ -199,15 +199,17 @@ func DeleteSambaConnections(c *gin.Context) { c.JSON(common_err.CLIENT_ERROR, model.Result{Success: common_err.Record_NOT_EXIST, Message: common_err.GetMsg(common_err.Record_NOT_EXIST)}) return } - mountPointList, err := service.MyService.System().GetDirPath(connection.MountPoint) + mountPointList, err := samba.GetSambaSharesList(connection.Host, connection.Port, connection.Username, connection.Password) + //mountPointList, err := service.MyService.System().GetDirPath(connection.MountPoint) if err != nil { c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) return } + baseHostPath := "/mnt/" + connection.Host for _, v := range mountPointList { - err := service.MyService.Connections().UnmountSmaba(v.Path) + err := service.MyService.Connections().UnmountSmaba(baseHostPath + "/" + v) if err != nil { - logger.Error("unmount smaba error", zap.Error(err), zap.Any("path", v.Path)) + logger.Error("unmount smaba error", zap.Error(err), zap.Any("path", baseHostPath+"/"+v)) c.JSON(common_err.SERVICE_ERROR, model.Result{Success: common_err.SERVICE_ERROR, Message: common_err.GetMsg(common_err.SERVICE_ERROR), Data: err.Error()}) return } diff --git a/service/other.go b/service/other.go new file mode 100644 index 000000000..ae9256697 --- /dev/null +++ b/service/other.go @@ -0,0 +1,104 @@ +package service + +import ( + "net/url" + "strings" + "sync" + "time" + + "github.com/IceWhaleTech/CasaOS-Common/utils/logger" + "github.com/IceWhaleTech/CasaOS/model" + "github.com/go-resty/resty/v2" + "github.com/tidwall/gjson" + "go.uber.org/zap" +) + +type OtherService interface { + Search(key string) ([]model.SearchEngine, error) +} + +type otherService struct{} + +func (s *otherService) Search(key string) ([]model.SearchEngine, error) { + + engines := []model.SearchEngine{} + engines = append(engines, model.SearchEngine{ + Name: "bing", + Icon: "https://files.codelife.cc/itab/search/bing.svg", + SearchUrl: "https://www.bing.com/search?q=", + RecoUrl: "https://www.bing.com/osjson.aspx?query=", // + keyword + }, model.SearchEngine{ + Name: "google", + Icon: "https://files.codelife.cc/itab/search/google.svg", + SearchUrl: "https://www.google.com/search?q=", + RecoUrl: "https://www.google.com/complete/search?client=gws-wiz&xssi=t&hl=en-US&authuser=0&dpr=1&q=", // + keyword + }, model.SearchEngine{ + Name: "baidu", + Icon: "https://files.codelife.cc/itab/search/baidu.svg", + SearchUrl: "https://www.baidu.com/s?wd=", + RecoUrl: "https://www.baidu.com/sugrec?json=1&prod=pc&wd=", // + keyword + }, model.SearchEngine{ + Name: "duckduckgo", + Icon: "https://files.codelife.cc/itab/search/duckduckgo.svg", + SearchUrl: "https://duckduckgo.com/?q=", + RecoUrl: "https://duckduckgo.com/ac/?type=list&q=", // + keyword + }, model.SearchEngine{ + Name: "startpage", + Icon: "https://www.startpage.com/sp/cdn/favicons/apple-touch-icon-60x60--default.png", + SearchUrl: "https://www.startpage.com/do/search?q=", + RecoUrl: "https://www.startpage.com/suggestions?segment=startpage.udog&lui=english&q=", // + keyword + }) + + client := resty.New() + client.SetTimeout(3 * time.Second) // 设置全局超时时间 + var wg sync.WaitGroup + for i := 0; i < len(engines); i++ { + wg.Add(1) + go func(i int, k string) { + name := engines[i].Name + url := engines[i].RecoUrl + url.QueryEscape(k) + defer wg.Done() + resp, err := client.R().Get(url) + if err != nil { + logger.Error("Then get search result error: %v", zap.Error(err), zap.String("name", name), zap.String("url", url)) + return + } + res := []string{} + if name == "bing" { + r := gjson.Get(resp.String(), "1") + for _, v := range r.Array() { + res = append(res, v.String()) + } + } else if name == "google" { + r := gjson.Get(strings.Replace(resp.String(), ")]}'", "", 1), "0.#.0") + for _, v := range r.Array() { + res = append(res, strings.ReplaceAll(strings.ReplaceAll(v.String(), "", " "), "", "")) + } + } else if name == "baidu" { + r := gjson.Get(resp.String(), "g.#.q") + for _, v := range r.Array() { + res = append(res, v.String()) + } + } else if name == "duckduckgo" { + r := gjson.Get(resp.String(), "1") + for _, v := range r.Array() { + res = append(res, v.String()) + } + } else if name == "startpage" { + r := gjson.Get(resp.String(), "suggestions.#.text") + for _, v := range r.Array() { + res = append(res, v.String()) + } + } + engines[i].Data = res + }(i, key) + } + wg.Wait() + + return engines, nil + +} + +func NewOtherService() OtherService { + return &otherService{} +} diff --git a/service/other_test.go b/service/other_test.go new file mode 100644 index 000000000..a7d1e688c --- /dev/null +++ b/service/other_test.go @@ -0,0 +1,12 @@ +package service + +import ( + "testing" +) + +func TestSearch(t *testing.T) { + if d, e := NewOtherService().Search("test"); e != nil || d == nil { + + t.Error("then test search error", e) + } +} diff --git a/service/service.go b/service/service.go index db9f51c5f..4c2f96bb0 100644 --- a/service/service.go +++ b/service/service.go @@ -46,6 +46,7 @@ type Repository interface { FsLinkService() FsLinkService FsService() FsService MessageBus() *message_bus.ClientWithResponses + Other() OtherService } func NewService(db *gorm.DB, RuntimePath string) Repository { @@ -69,6 +70,7 @@ func NewService(db *gorm.DB, RuntimePath string) Repository { fs_list: NewFsListService(), fs_link: NewFsLinkService(), fs: NewFsService(), + other: NewOtherService(), } } @@ -88,6 +90,11 @@ type store struct { fs_link FsLinkService fs FsService health HealthService + other OtherService +} + +func (c *store) Other() OtherService { + return c.other } func (c *store) FsLinkService() FsLinkService {