package main import ( "fmt" "os" _ "google.golang.org/grpc/balancer/grpclb" "gitlink.org.cn/cloudream/client/config" "strconv" ) func main() { err := config.Init() if err != nil { fmt.Printf("init config failed, err: %s", err.Error()) os.Exit(1) } args := os.Args switch args[1] { case "read": objectID, err := strconv.Atoi(args[3]) if err != nil { fmt.Printf("invalid object id %s, err: %s", args[3], err.Error()) os.Exit(1) } if err := Read(args[2], objectID); err != nil { fmt.Printf("read failed, err: %s", err.Error()) os.Exit(1) } case "write": bucketID, err := strconv.Atoi(args[3]) if err != nil { fmt.Printf("invalid bucket id %s, err: %s", args[3], err.Error()) os.Exit(1) } numRep, _ := strconv.Atoi(args[5]) if numRep <= 0 || numRep > config.Cfg().MaxReplicateNumber { fmt.Printf("replicate number should not be more than %d", config.Cfg().MaxReplicateNumber) os.Exit(1) } if err := RepWrite(args[2], bucketID, args[4], numRep); err != nil { fmt.Printf("rep write failed, err: %s", err.Error()) os.Exit(1) } case "ecWrite": bucketID, err := strconv.Atoi(args[3]) if err != nil { fmt.Printf("invalid bucket id %s, err: %s", args[3], err.Error()) os.Exit(1) } if err := EcWrite(args[2], bucketID, args[4], args[5]); err != nil { fmt.Printf("ec write failed, err: %s", err.Error()) os.Exit(1) } case "move": objectID, err := strconv.Atoi(args[2]) if err != nil { fmt.Printf("invalid object id %s, err: %s", args[2], err.Error()) os.Exit(1) } stgID, err := strconv.Atoi(args[3]) if err != nil { fmt.Printf("invalid storage id %s, err: %s", args[3], err.Error()) os.Exit(1) } if err := Move(objectID, stgID); err != nil { fmt.Printf("move failed, err: %s", err.Error()) os.Exit(1) } } /* TO DO future: 1. ls命令,显示用户指定桶下的所有对象,及相关的元数据 2. rm命令,用户指定bucket和object名,执行删除操作 3. update命令,用户发起对象更新命令,查询元数据,判断对象的冗余方式,删除旧对象(unpin所有的副本或编码块),写入新对象 4. ipfsStat命令,查看本地有无ipfsdaemon,ipfs目录的使用率 5. ipfsFlush命令,unpin本地ipfs目录中的所有cid(block) 6. 改为交互式client,输入用户名及秘钥后进入交互界面 7. 支持纯缓存类型的IPFS节点,数据一律存在后端存储服务中 */ }