| @@ -11,7 +11,7 @@ import ( | |||
| var parseAgentEventCmdTrie cmdtrie.StaticCommandTrie[any] = cmdtrie.NewStaticCommandTrie[any]() | |||
| func AgentPostEvent(ctx CommandContext, nodeID int, args []string) error { | |||
| ret, err := parseAgentEventCmdTrie.Execute(args...) | |||
| ret, err := parseAgentEventCmdTrie.Execute(args, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true}) | |||
| if err != nil { | |||
| return fmt.Errorf("execute parsing event command failed, err: %w", err) | |||
| } | |||
| @@ -4,13 +4,12 @@ import ( | |||
| "fmt" | |||
| "github.com/jedib0t/go-pretty/v6/table" | |||
| "gitlink.org.cn/cloudream/client/internal/services" | |||
| ) | |||
| func (c *Commandline) ListUserBuckets() error { | |||
| func BucketListUserBuckets(ctx CommandContext) error { | |||
| userID := 0 | |||
| buckets, err := services.BucketSvc(c.Svc).GetUserBuckets(userID) | |||
| buckets, err := ctx.Cmdline.Svc.BucketSvc().GetUserBuckets(userID) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| @@ -28,10 +27,10 @@ func (c *Commandline) ListUserBuckets() error { | |||
| return nil | |||
| } | |||
| func (c *Commandline) CreateBucket(bucketName string) error { | |||
| func BucketCreateBucket(ctx CommandContext, bucketName string) error { | |||
| userID := 0 | |||
| bucketID, err := services.BucketSvc(c.Svc).CreateBucket(userID, bucketName) | |||
| bucketID, err := ctx.Cmdline.Svc.BucketSvc().CreateBucket(userID, bucketName) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| @@ -40,10 +39,10 @@ func (c *Commandline) CreateBucket(bucketName string) error { | |||
| return nil | |||
| } | |||
| func (c *Commandline) DeleteBucket(bucketID int) error { | |||
| func BucketDeleteBucket(ctx CommandContext, bucketID int) error { | |||
| userID := 0 | |||
| err := services.BucketSvc(c.Svc).DeleteBucket(userID, bucketID) | |||
| err := ctx.Cmdline.Svc.BucketSvc().DeleteBucket(userID, bucketID) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| @@ -51,3 +50,11 @@ func (c *Commandline) DeleteBucket(bucketID int) error { | |||
| fmt.Printf("Delete bucket %d success ", bucketID) | |||
| return nil | |||
| } | |||
| func init() { | |||
| commands.MustAdd(BucketListUserBuckets, "bucket", "ls") | |||
| commands.MustAdd(BucketCreateBucket, "bucket", "new") | |||
| commands.MustAdd(BucketDeleteBucket, "bucket", "delete") | |||
| } | |||
| @@ -3,9 +3,7 @@ package cmdline | |||
| import ( | |||
| "fmt" | |||
| "os" | |||
| "strconv" | |||
| "gitlink.org.cn/cloudream/client/internal/config" | |||
| "gitlink.org.cn/cloudream/client/internal/services" | |||
| "gitlink.org.cn/cloudream/common/pkg/cmdtrie" | |||
| ) | |||
| @@ -27,166 +25,17 @@ func NewCommandline(svc *services.Service) (*Commandline, error) { | |||
| } | |||
| func (c *Commandline) DispatchCommand(allArgs []string) { | |||
| cmd := allArgs[0] | |||
| args := allArgs[1:] | |||
| switch cmd { | |||
| case "read": | |||
| objectID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.Read(args[0], objectID); err != nil { | |||
| fmt.Printf("read failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| case "write": | |||
| bucketID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| repCount, _ := strconv.Atoi(args[3]) | |||
| if repCount <= 0 || repCount > config.Cfg().MaxRepCount { | |||
| fmt.Printf("replicate number should not be more than %d", config.Cfg().MaxRepCount) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.RepWrite(args[0], bucketID, args[2], repCount); err != nil { | |||
| fmt.Printf("rep write failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| case "ecWrite": | |||
| bucketID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.EcWrite(args[0], bucketID, args[2], args[3]); err != nil { | |||
| fmt.Printf("ec write failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| case "storage": | |||
| if len(args) == 0 { | |||
| fmt.Printf("need more arg") | |||
| os.Exit(1) | |||
| } | |||
| cmd := args[0] | |||
| switch cmd { | |||
| case "move": | |||
| objectID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| stgID, err := strconv.Atoi(args[2]) | |||
| if err != nil { | |||
| fmt.Printf("invalid storage id %s, err: %s", args[2], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.MoveObjectToStorage(objectID, stgID); err != nil { | |||
| fmt.Printf("move failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| } | |||
| case "bucket": | |||
| if len(args) == 0 { | |||
| fmt.Printf("need more arg") | |||
| os.Exit(1) | |||
| } | |||
| cmd := args[0] | |||
| switch cmd { | |||
| case "ls": | |||
| if err := c.ListUserBuckets(); err != nil { | |||
| fmt.Printf("get user buckets failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| case "new": | |||
| if err := c.CreateBucket(args[1]); err != nil { | |||
| fmt.Printf("create bucket failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| case "delete": | |||
| bucketID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.DeleteBucket(bucketID); err != nil { | |||
| fmt.Printf("delete bucket failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| } | |||
| case "object": | |||
| if len(args) == 0 { | |||
| fmt.Printf("need more arg") | |||
| os.Exit(1) | |||
| } | |||
| switch args[0] { | |||
| case "ls": | |||
| bucketID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid bucket id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.ListBucketObjects(bucketID); err != nil { | |||
| fmt.Printf("get bucket objects failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| case "update": | |||
| objectID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.UpdateRepObject(objectID, args[2]); err != nil { | |||
| fmt.Printf("delete object failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| case "delete": | |||
| objectID, err := strconv.Atoi(args[1]) | |||
| if err != nil { | |||
| fmt.Printf("invalid object id %s, err: %s", args[1], err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if err := c.DeleteObject(objectID); err != nil { | |||
| fmt.Printf("delete object failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| } | |||
| default: | |||
| // TODO 将上面的命令也用cmdTrie管理 | |||
| cmdCtx := CommandContext{ | |||
| Cmdline: c, | |||
| } | |||
| cmdErr, err := commands.Execute(cmdCtx, allArgs...) | |||
| if err != nil { | |||
| fmt.Printf("execute command failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if cmdErr != nil { | |||
| fmt.Printf("execute command failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| // TODO 需要区分nil数组和空数组 | |||
| cmdCtx := CommandContext{ | |||
| Cmdline: c, | |||
| } | |||
| cmdErr, err := commands.Execute(cmdCtx, allArgs, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true}) | |||
| if err != nil { | |||
| fmt.Printf("execute command failed, err: %s", err.Error()) | |||
| os.Exit(1) | |||
| } | |||
| if cmdErr != nil { | |||
| fmt.Printf("execute command failed, err: %s", cmdErr.Error()) | |||
| os.Exit(1) | |||
| } | |||
| } | |||
| @@ -7,13 +7,12 @@ import ( | |||
| "path/filepath" | |||
| "github.com/jedib0t/go-pretty/v6/table" | |||
| "gitlink.org.cn/cloudream/client/internal/services" | |||
| ) | |||
| func (c *Commandline) ListBucketObjects(bucketID int) error { | |||
| func ObjectListBucketObjects(ctx CommandContext, bucketID int) error { | |||
| userID := 0 | |||
| objects, err := services.BucketSvc(c.Svc).GetBucketObjects(userID, bucketID) | |||
| objects, err := ctx.Cmdline.Svc.BucketSvc().GetBucketObjects(userID, bucketID) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| @@ -31,7 +30,7 @@ func (c *Commandline) ListBucketObjects(bucketID int) error { | |||
| return nil | |||
| } | |||
| func (c *Commandline) Read(localFilePath string, objectID int) error { | |||
| func ObjectDownloadObject(ctx CommandContext, localFilePath string, objectID int) error { | |||
| // 创建本地文件 | |||
| curExecPath, err := os.Executable() | |||
| if err != nil { | |||
| @@ -53,7 +52,7 @@ func (c *Commandline) Read(localFilePath string, objectID int) error { | |||
| defer outputFile.Close() | |||
| // 下载文件 | |||
| reader, err := services.ObjectSvc(c.Svc).DownloadObject(0, objectID) | |||
| reader, err := ctx.Cmdline.Svc.ObjectSvc().DownloadObject(0, objectID) | |||
| if err != nil { | |||
| return fmt.Errorf("download object failed, err: %w", err) | |||
| } | |||
| @@ -68,7 +67,7 @@ func (c *Commandline) Read(localFilePath string, objectID int) error { | |||
| return nil | |||
| } | |||
| func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName string, repCount int) error { | |||
| func ObjectUploadRepObject(ctx CommandContext, localFilePath string, bucketID int, objectName string, repCount int) error { | |||
| file, err := os.Open(localFilePath) | |||
| if err != nil { | |||
| return fmt.Errorf("open file %s failed, err: %w", localFilePath, err) | |||
| @@ -81,7 +80,7 @@ func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName st | |||
| } | |||
| fileSize := fileInfo.Size() | |||
| err = services.ObjectSvc(c.Svc).UploadRepObject(0, bucketID, objectName, file, fileSize, repCount) | |||
| err = ctx.Cmdline.Svc.ObjectSvc().UploadRepObject(0, bucketID, objectName, file, fileSize, repCount) | |||
| if err != nil { | |||
| return fmt.Errorf("upload file data failed, err: %w", err) | |||
| } | |||
| @@ -89,12 +88,12 @@ func (c *Commandline) RepWrite(localFilePath string, bucketID int, objectName st | |||
| return nil | |||
| } | |||
| func (c *Commandline) EcWrite(localFilePath string, bucketID int, objectName string, ecName string) error { | |||
| func ObjectEcWrite(ctx CommandContext, localFilePath string, bucketID int, objectName string, ecName string) error { | |||
| // TODO | |||
| panic("not implement yet") | |||
| } | |||
| func (c *Commandline) UpdateRepObject(objectID int, filePath string) error { | |||
| func ObjectUpdateRepObject(ctx CommandContext, objectID int, filePath string) error { | |||
| userID := 0 | |||
| file, err := os.Open(filePath) | |||
| @@ -109,7 +108,7 @@ func (c *Commandline) UpdateRepObject(objectID int, filePath string) error { | |||
| } | |||
| fileSize := fileInfo.Size() | |||
| err = services.ObjectSvc(c.Svc).UpdateRepObject(userID, objectID, file, fileSize) | |||
| err = ctx.Cmdline.Svc.ObjectSvc().UpdateRepObject(userID, objectID, file, fileSize) | |||
| if err != nil { | |||
| return fmt.Errorf("update object %d failed, err: %w", objectID, err) | |||
| } | |||
| @@ -117,11 +116,23 @@ func (c *Commandline) UpdateRepObject(objectID int, filePath string) error { | |||
| return nil | |||
| } | |||
| func (c *Commandline) DeleteObject(objectID int) error { | |||
| func ObjectDeleteObject(ctx CommandContext, objectID int) error { | |||
| userID := 0 | |||
| err := services.ObjectSvc(c.Svc).DeleteObject(userID, objectID) | |||
| err := ctx.Cmdline.Svc.ObjectSvc().DeleteObject(userID, objectID) | |||
| if err != nil { | |||
| return fmt.Errorf("delete object %d failed, err: %w", objectID, err) | |||
| } | |||
| return nil | |||
| } | |||
| func init() { | |||
| commands.MustAdd(ObjectListBucketObjects, "object", "ls") | |||
| commands.MustAdd(ObjectUploadRepObject, "object", "new", "rep") | |||
| commands.MustAdd(ObjectDownloadObject, "object", "get") | |||
| commands.MustAdd(ObjectUpdateRepObject, "object", "update", "rep") | |||
| commands.MustAdd(ObjectDeleteObject, "object", "delete") | |||
| } | |||
| @@ -11,7 +11,7 @@ import ( | |||
| var parseScannerEventCmdTrie cmdtrie.StaticCommandTrie[any] = cmdtrie.NewStaticCommandTrie[any]() | |||
| func ScannerPostEvent(ctx CommandContext, args []string) error { | |||
| ret, err := parseScannerEventCmdTrie.Execute(args...) | |||
| ret, err := parseScannerEventCmdTrie.Execute(args, cmdtrie.ExecuteOption{ReplaceEmptyArrayWithNil: true}) | |||
| if err != nil { | |||
| return fmt.Errorf("execute parsing event command failed, err: %w", err) | |||
| } | |||
| @@ -1,7 +1,9 @@ | |||
| package cmdline | |||
| import "gitlink.org.cn/cloudream/client/internal/services" | |||
| func StorageMoveObjectToStorage(ctx CommandContext, objectID int, storageID int) error { | |||
| return ctx.Cmdline.Svc.StorageSvc().MoveObjectToStorage(0, objectID, storageID) | |||
| } | |||
| func (c *Commandline) MoveObjectToStorage(objectID int, storageID int) error { | |||
| return services.StorageSvc(c.Svc).MoveObjectToStorage(0, objectID, storageID) | |||
| func init() { | |||
| commands.MustAdd(StorageMoveObjectToStorage, "storage", "move") | |||
| } | |||
| @@ -11,7 +11,7 @@ type BucketService struct { | |||
| *Service | |||
| } | |||
| func BucketSvc(svc *Service) *BucketService { | |||
| func (svc *Service) BucketSvc() *BucketService { | |||
| return &BucketService{Service: svc} | |||
| } | |||
| @@ -28,7 +28,7 @@ type ObjectService struct { | |||
| *Service | |||
| } | |||
| func ObjectSvc(svc *Service) *ObjectService { | |||
| func (svc *Service) ObjectSvc() *ObjectService { | |||
| return &ObjectService{Service: svc} | |||
| } | |||
| @@ -13,7 +13,7 @@ type StorageService struct { | |||
| *Service | |||
| } | |||
| func StorageSvc(svc *Service) *StorageService { | |||
| func (svc *Service) StorageSvc() *StorageService { | |||
| return &StorageService{Service: svc} | |||
| } | |||