oss/lib/lrb.go (170 lines of code) (raw):
package lib
import (
"bufio"
"fmt"
"io"
"os"
"strings"
oss "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
var specChineseListRegionBucket = SpecText{
synopsisText: "列举某个region下的Buckets",
paramText: "[conf_file] [options]",
syntaxText: `
ossutil lrb [conf_file] [-e endpoint]
`,
detailHelpText: `
该命令列举单个region或者多个region下的bucket列表, 多个region的endpoint信息在配置文件里面配置
`,
sampleText: `
1) ossutil lrb conf_file
2) ossutil lrb -e oss-cn-shenzhen.aliyuncs.com
3) ossutil lrb
`,
}
var specEnglishListRegionBucket = SpecText{
synopsisText: "List region buckets",
paramText: "[conf_file] [options]",
syntaxText: `
ossutil lrb [conf_file] [-e endpoint]
`,
detailHelpText: `
This command lists buckets under a single region or multiple regions
The multiple regions's endpoints are configured in the configuration file
`,
sampleText: `
1) ossutil lrb conf_file
2) ossutil lrb -e oss-cn-shenzhen.aliyuncs.com
3) ossutil lrb
`,
}
// LrbCommand is the command list region buckets or objects
type LrbCommand struct {
command Command
listResult []oss.ListBucketsResult
errorEndpoints []string
err error
}
var lrbCommand = LrbCommand{
command: Command{
name: "lrb",
nameAlias: []string{"lrb"},
minArgc: 0,
maxArgc: 1,
specChinese: specChineseListRegionBucket,
specEnglish: specEnglishListRegionBucket,
group: GroupTypeNormalCommand,
validOptionNames: []string{
OptionConfigFile,
OptionEndpoint,
OptionAccessKeyID,
OptionAccessKeySecret,
OptionSTSToken,
OptionProxyHost,
OptionProxyUser,
OptionProxyPwd,
OptionLogLevel,
OptionPassword,
OptionMode,
OptionECSRoleName,
OptionTokenTimeout,
OptionRamRoleArn,
OptionExternalId,
OptionRoleSessionName,
OptionReadTimeout,
OptionConnectTimeout,
OptionSTSRegion,
OptionSkipVerifyCert,
OptionUserAgent,
OptionSignVersion,
OptionRegion,
OptionCloudBoxID,
OptionForcePathStyle,
},
},
}
// function for FormatHelper interface
func (lc *LrbCommand) formatHelpForWhole() string {
return lc.command.formatHelpForWhole()
}
func (lc *LrbCommand) formatIndependHelp() string {
return lc.command.formatIndependHelp()
}
// Init simulate inheritance, and polymorphism
func (lc *LrbCommand) Init(args []string, options OptionMapType) error {
return lc.command.Init(args, options, lc)
}
// RunCommand simulate inheritance, and polymorphism
func (lc *LrbCommand) RunCommand() error {
var err error
if len(lc.command.args) == 0 {
lc.err = lc.listBuckets("")
return lc.display()
}
// read all endpoints from conf file
fileName := lc.command.args[0]
rf, err := os.OpenFile(fileName, os.O_RDONLY, 0600)
if err != nil {
return err
}
defer rf.Close()
rd := bufio.NewReader(rf)
for {
endpoint, err := rd.ReadString('\n')
if endpoint == "" && io.EOF == err {
break
}
endpoint = strings.TrimSpace(endpoint)
endpoint = strings.Trim(endpoint, "\r")
if strings.HasPrefix(endpoint, "#") {
continue
}
err = lc.listBuckets(endpoint)
if err != nil {
lc.errorEndpoints = append(lc.errorEndpoints, endpoint)
lc.err = err
}
}
return lc.display()
}
func (lc *LrbCommand) listBuckets(endpoint string) error {
if endpoint != "" {
lc.command.options[OptionEndpoint] = &endpoint
}
var err error
client, err := lc.command.ossClient("")
if err != nil {
return err
}
// list region bucket
pre := oss.Prefix("")
marker := oss.Marker("")
for {
lbr, err := client.ListBuckets(pre, marker, oss.AddParam("regionList", ""))
if err != nil {
return err
}
lc.listResult = append(lc.listResult, lbr)
pre = oss.Prefix(lbr.Prefix)
marker = oss.Marker(lbr.NextMarker)
if !lbr.IsTruncated {
break
}
}
return nil
}
func (lc *LrbCommand) display() error {
count := 0
for _, result := range lc.listResult {
for _, bucket := range result.Buckets {
if count == 0 {
fmt.Printf("%-30s %20s%s%12s%s%s\n", "CreationTime", "Region", FormatTAB, "StorageClass", FormatTAB, "BucketName")
}
fmt.Printf("%-30s %20s%s%12s%s%s\n", utcToLocalTime(bucket.CreationDate), bucket.Location, FormatTAB, bucket.StorageClass, FormatTAB, CloudURLToString(bucket.Name, ""))
count = count + 1
}
}
fmt.Printf("\nBucket Number is: %d\n\n", count)
if len(lc.errorEndpoints) > 0 {
fmt.Printf("list bucket failure from these endpoint:\n")
for _, endpoint := range lc.errorEndpoints {
fmt.Printf("%s\n", endpoint)
}
fmt.Printf("\n")
}
return lc.err
}