package cmdline /* import ( "fmt" "strings" "github.com/samber/lo" "gitlink.org.cn/cloudream/common/pkgs/distlock" "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/distlock/lockprovider" ) // DistLockLock 尝试获取分布式锁。 // ctx: 命令上下文,包含执行命令所需的服务和配置。 // lockData: 锁数据数组,每个元素包含锁的路径、名称和目标。 // 返回值: 获取锁失败时返回错误。 func DistLockLock(ctx CommandContext, lockData []string) error { req := distlock.LockRequest{} // 解析锁数据,填充请求结构体。 for _, lock := range lockData { l, err := parseOneLock(lock) if err != nil { return fmt.Errorf("parse lock data %s failed, err: %w", lock, err) } req.Locks = append(req.Locks, l) } // 请求分布式锁。 reqID, err := ctx.Cmdline.Svc.DistLock.Acquire(req) if err != nil { return fmt.Errorf("acquire locks failed, err: %w", err) } fmt.Printf("%s\n", reqID) return nil } // parseOneLock 解析单个锁数据。 // lockData: 待解析的锁数据,格式为"路径/名称@目标字符串"。 // 返回值: 解析得到的锁对象和可能的错误。 func parseOneLock(lockData string) (distlock.Lock, error) { var lock distlock.Lock // 解析锁的路径、名称和目标。 fullPathAndTarget := strings.Split(lockData, "@") if len(fullPathAndTarget) != 2 { return lock, fmt.Errorf("lock data must contains lock path, name and target") } pathAndName := strings.Split(fullPathAndTarget[0], "/") if len(pathAndName) < 2 { return lock, fmt.Errorf("lock data must contains lock path, name and target") } lock.Path = pathAndName[0 : len(pathAndName)-1] lock.Name = pathAndName[len(pathAndName)-1] // 解析目标字符串。 target := lockprovider.NewStringLockTarget() comps := strings.Split(fullPathAndTarget[1], "/") for _, comp := range comps { target.Add(lo.Map(strings.Split(comp, "."), func(str string, index int) any { return str })...) } lock.Target = *target return lock, nil } // DistLockUnlock 释放分布式锁。 // ctx: 命令上下文。 // reqID: 请求ID,对应获取锁时返回的ID。 // 返回值: 释放锁失败时返回错误。 func DistLockUnlock(ctx CommandContext, reqID string) error { ctx.Cmdline.Svc.DistLock.Release(reqID) return nil } // 初始化命令行工具,注册分布式锁相关命令。 func init() { commands.MustAdd(DistLockLock, "distlock", "lock") commands.MustAdd(DistLockUnlock, "distlock", "unlock") } */