JCS-pub/client/internal/cmdline/package.go

218 lines
5.1 KiB
Go

package cmdline
import (
"fmt"
"io"
"os"
"path/filepath"
"time"
"github.com/jedib0t/go-pretty/v6/table"
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage/common/pkgs/iterator"
)
// PackageListBucketPackages 列出指定存储桶中的所有包裹。
//
// 参数:
//
// ctx - 命令上下文。
// bucketID - 存储桶ID。
//
// 返回值:
//
// error - 操作过程中发生的任何错误。
func PackageListBucketPackages(ctx CommandContext, bucketID cdssdk.BucketID) error {
userID := cdssdk.UserID(1)
packages, err := ctx.Cmdline.Svc.BucketSvc().GetBucketPackages(userID, bucketID)
if err != nil {
return err
}
fmt.Printf("Find %d packages in bucket %d for user %d:\n", len(packages), bucketID, userID)
tb := table.NewWriter()
tb.AppendHeader(table.Row{"ID", "Name", "BucketID", "State"})
for _, obj := range packages {
tb.AppendRow(table.Row{obj.PackageID, obj.Name, obj.BucketID, obj.State})
}
fmt.Println(tb.Render())
return nil
}
// PackageDownloadPackage 下载指定包裹的所有文件到本地目录。
//
// 参数:
//
// ctx - 命令上下文。
// packageID - 包裹ID。
// outputDir - 输出目录路径。
//
// 返回值:
//
// error - 操作过程中发生的任何错误。
func PackageDownloadPackage(ctx CommandContext, packageID cdssdk.PackageID, outputDir string) error {
startTime := time.Now()
defer func() {
fmt.Printf("%v\n", time.Since(startTime).Seconds())
}()
userID := cdssdk.UserID(1)
err := os.MkdirAll(outputDir, os.ModePerm)
if err != nil {
return fmt.Errorf("create output directory %s failed, err: %w", outputDir, err)
}
// 初始化文件下载迭代器
objIter, err := ctx.Cmdline.Svc.PackageSvc().DownloadPackage(userID, packageID)
if err != nil {
return fmt.Errorf("download object failed, err: %w", err)
}
defer objIter.Close()
madeDirs := make(map[string]bool)
for {
objInfo, err := objIter.MoveNext()
if err == iterator.ErrNoMoreItem {
break
}
if err != nil {
return err
}
err = func() error {
defer objInfo.File.Close()
fullPath := filepath.Join(outputDir, objInfo.Object.Path)
dirPath := filepath.Dir(fullPath)
if !madeDirs[dirPath] {
if err := os.MkdirAll(dirPath, 0755); err != nil {
return fmt.Errorf("creating object dir: %w", err)
}
madeDirs[dirPath] = true
}
outputFile, err := os.Create(fullPath)
if err != nil {
return fmt.Errorf("creating object file: %w", err)
}
defer outputFile.Close()
_, err = io.Copy(outputFile, objInfo.File)
if err != nil {
return fmt.Errorf("copy object data to local file failed, err: %w", err)
}
return nil
}()
if err != nil {
return err
}
}
return nil
}
// PackageCreatePackage 在指定存储桶中创建新包裹。
//
// 参数:
//
// ctx - 命令上下文。
// bucketID - 存储桶ID。
// name - 包裹名称。
//
// 返回值:
//
// error - 操作过程中发生的任何错误。
func PackageCreatePackage(ctx CommandContext, bucketID cdssdk.BucketID, name string) error {
userID := cdssdk.UserID(1)
pkgID, err := ctx.Cmdline.Svc.PackageSvc().Create(userID, bucketID, name)
if err != nil {
return err
}
fmt.Printf("%v\n", pkgID)
return nil
}
// PackageDeletePackage 删除指定的包裹。
//
// 参数:
//
// ctx - 命令上下文。
// packageID - 包裹ID。
//
// 返回值:
//
// error - 操作过程中发生的任何错误。
func PackageDeletePackage(ctx CommandContext, packageID cdssdk.PackageID) error {
userID := cdssdk.UserID(1)
err := ctx.Cmdline.Svc.PackageSvc().DeletePackage(userID, packageID)
if err != nil {
return fmt.Errorf("delete package %d failed, err: %w", packageID, err)
}
return nil
}
// PackageGetCachedNodes 获取指定包裹的缓存节点信息。
//
// 参数:
//
// ctx - 命令上下文。
// packageID - 包裹ID。
//
// 返回值:
//
// error - 操作过程中发生的任何错误。
func PackageGetCachedNodes(ctx CommandContext, packageID cdssdk.PackageID) error {
userID := cdssdk.UserID(1)
resp, err := ctx.Cmdline.Svc.PackageSvc().GetCachedNodes(userID, packageID)
fmt.Printf("resp: %v\n", resp)
if err != nil {
return fmt.Errorf("get package %d cached nodes failed, err: %w", packageID, err)
}
return nil
}
// PackageGetLoadedNodes 获取指定包裹的已加载节点信息。
//
// 参数:
//
// ctx - 命令上下文。
// packageID - 包裹ID。
//
// 返回值:
//
// error - 操作过程中发生的任何错误。
func PackageGetLoadedNodes(ctx CommandContext, packageID cdssdk.PackageID) error {
userID := cdssdk.UserID(1)
nodeIDs, err := ctx.Cmdline.Svc.PackageSvc().GetLoadedNodes(userID, packageID)
fmt.Printf("nodeIDs: %v\n", nodeIDs)
if err != nil {
return fmt.Errorf("get package %d loaded nodes failed, err: %w", packageID, err)
}
return nil
}
// 初始化命令行工具的包相关命令。
func init() {
commands.MustAdd(PackageListBucketPackages, "pkg", "ls")
commands.MustAdd(PackageDownloadPackage, "pkg", "get")
commands.MustAdd(PackageCreatePackage, "pkg", "new")
commands.MustAdd(PackageDeletePackage, "pkg", "delete")
commands.MustAdd(PackageGetCachedNodes, "pkg", "cached")
commands.MustAdd(PackageGetLoadedNodes, "pkg", "loaded")
}