oss/lib/bucket_cname.go (425 lines of code) (raw):
package lib
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
"strings"
oss "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
var specChineseBucketCname = SpecText{
synopsisText: "管理bucket cname以及cname token配置",
paramText: "bucket_url [options]",
syntaxText: `
ossutil bucket-cname --method put --item token oss://bucket test-domain.com [local_xml_file] [options]
ossutil bucket-cname --method get --item token oss://bucket test-domain.com [local_xml_file] [options]
ossutil bucket-cname --method put oss://bucket test-domain.com [options]
ossutil bucket-cname --method put --item certificate oss://bucket local_xml_file [options]
ossutil bucket-cname --method delete oss://bucket test-domain.com [options]
ossutil bucket-cname --method get oss://bucket [local_xml_file] [options]
`,
detailHelpText: `
cname命令通过设置method选项值可以创建、删除、查询bucket的cname配置
用法:
该命令有六种用法:
1) ossutil bucket-cname --method put --item token oss://bucket test-domain.com [local_xml_file] [options]
该命令会创建一个内部用的token, 设置bucket cname必须先创建这个token
如果输入参数local_xml_file,token结果将输出到该文件,否则输出到屏幕上
2) ossutil bucket-cname --method get --item token oss://bucket test-domain.com [local_xml_file] [options]
该命令查询token信息
如果输入参数local_xml_file,token结果将输出到该文件,否则输出到屏幕上
3) ossutil bucket-cname --method put oss://bucket test-domain.com
这个命令设置bucket的cname配置
4) ossutil bucket-cname --method put --item certificate oss://bucket local_xml_file [options]
这个命令设置bucket的cname配置,并绑定https证书。或者解绑cname的https证书
local_xml_file是xml格式,以下是local_xml_file内容的示例
<?xml version="1.0" encoding="utf-8"?>
<BucketCnameConfiguration>
<Cname>
<Domain>example.com</Domain>
<CertificateConfiguration>
<CertId>493****-cn-hangzhou</CertId>
<Certificate>-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----</Certificate>
<PrivateKey>-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----</PrivateKey>
<PreviousCertId>493****-cn-hangzhou</PreviousCertId>
<Force>true</Force>
</CertificateConfiguration>
</Cname>
</BucketCnameConfiguration>
或
<?xml version="1.0" encoding="utf-8"?>
<BucketCnameConfiguration>
<Cname>
<Domain>example.com</Domain>
<CertificateConfiguration>
<DeleteCertificate>True</DeleteCertificate>
</CertificateConfiguration>
</Cname>
</BucketCnameConfiguration>
5) ossutil bucket-cname --method get oss://bucket [local_xml_file] [options]
这个命令查询bucket的cname配置
如果输入参数local_xml_file,结果将输出到该文件,否则输出到屏幕上
6) ossutil bucket-cname --method delete oss://bucket test-domain.com [options]
这个命令删除bucket的cname配置
`,
sampleText: `
1) 创建bucket的cname token,执行结果输出到标准输出
ossutil bucket-cname --method put --item token oss://bucket test-domain.com
2) 创建bucket的cname token,执行结果输出到本地文件
ossutil bucket-cname --method put --item token oss://bucket test-domain.com local_xml_file
3) 获取bucket的cname token,结果输出到标准输出
ossutil bucket-cname --method get --item token oss://bucket test-domain.com
3) 获取bucket的cname token,结果输出到本地文件
ossutil bucket-cname --method get --item token oss://bucket test-domain.com local_xml_file
4) 设置bucket的cname配置
ossutil bucket-cname --method put oss://bucket test-domain.com
5) 设置bucket的cname配置,并绑定ssl证书 或者解绑ssl证书
ossutil bucket-cname --method put --item certificate oss://bucket local_xml_file
6) 查询bucket的cname配置,结果输出到标准输出
ossutil bucket-cname --method get oss://bucket
7) 查询bucket的cname配置,结果输出到本地文件
ossutil bucket-cname --method get oss://bucket local_xml_file
8) 删除bucket的cname配置
ossutil bucket-cname --method delete oss://bucket test-domain.com
`,
}
var specEnglishBucketCname = SpecText{
synopsisText: "manage bucket cname and cname token configuration",
paramText: "bucket_url [options]",
syntaxText: `
ossutil bucket-cname --method put --item token oss://bucket test-domain.com [local_xml_file] [options]
ossutil bucket-cname --method get --item token oss://bucket test-domain.com [local_xml_file] [options]
ossutil bucket-cname --method put oss://bucket test-domain.com [options]
ossutil bucket-cname --method put --item certificate oss://bucket local_xml_file [options]
ossutil bucket-cname --method delete oss://bucket test-domain.com [options]
ossutil bucket-cname --method get oss://bucket [local_xml_file] [options]
`,
detailHelpText: `
The command can create, delete and query the cname configuration of a bucket by setting the method option value
Usage:
There are six usages for this command:
1) ossutil bucket-cname --method put --item token oss://bucket test-domain.com [local_xml_file] [options]
This command will create an internal token, which must be created before setting bucket cname
If you input parameter local_xml_file,the result will be output to local_xml_file
If you don't input parameter local_xml_file,the result will be output to stdout
2) ossutil bucket-cname --method get --item token oss://bucket test-domain.com [local_xml_file] [options]
This command queries the token information
If you input parameter local_xml_file,the token configuration will be output to local_xml_file
If you don't input parameter local_xml_file,the token configuration will be output to stdout
3) ossutil bucket-cname --method put oss://bucket test-domain.com [options]
This command sets the cname configuration of the bucket
4) ossutil bucket-cname --method put --item certificate oss://bucket local_xml_file [options]
This command sets the cname configuration of the bucket and binds the https certificate. Or unbind cname’s https certificate
the local_xml_file is xml format,The following is an example of the contents of local_xml_file
<?xml version="1.0" encoding="utf-8"?>
<BucketCnameConfiguration>
<Cname>
<Domain>example.com</Domain>
<CertificateConfiguration>
<CertId>493****-cn-hangzhou</CertId>
<Certificate>-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----</Certificate>
<PrivateKey>-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----</PrivateKey>
<PreviousCertId>493****-cn-hangzhou</PreviousCertId>
<Force>true</Force>
</CertificateConfiguration>
</Cname>
</BucketCnameConfiguration>
or
<?xml version="1.0" encoding="utf-8"?>
<BucketCnameConfiguration>
<Cname>
<Domain>example.com</Domain>
<CertificateConfiguration>
<DeleteCertificate>True</DeleteCertificate>
</CertificateConfiguration>
</Cname>
</BucketCnameConfiguration>
5) ossutil bucket-cname --method get oss://bucket [local_xml_file] [options]
This command queries the cname configuration of the bucket
If you input parameter local_xml_file,the cname configuration will be output to local_xml_file
If you don't input parameter local_xml_file,the cname configuration will be output to stdout
6) ossutil bucket-cname --method delete oss://bucket test-domain.com [options]
This command delete the cname configuration of the bucket
`,
sampleText: `
1) put bucket cname token, get result to stdout
ossutil bucket-cname --method put --item token oss://bucket test-domain.com
2) put bucket cname token, get result to local file
ossutil bucket-cname --method put --item token oss://bucket test-domain.com local_xml_file
3) get bucket cname token to stdout
ossutil bucket-cname --method get --item token oss://bucket test-domain.com
3) get bucket cname token to local file
ossutil bucket-cname --method get --item token oss://bucket test-domain.com local_xml_file
4) set bucket cname configuration
ossutil bucket-cname --method put oss://bucket test-domain.com
5) set bucket cname configuration,bind certificate or unbind certificate
ossutil bucket-cname --method put --item certificate oss://bucket local_xml_file
6) get cname configuration to stdout
ossutil bucket-cname --method get oss://bucket
7) get cname configuration to local file
ossutil bucket-cname --method get oss://bucket local_xml_file
8) delete cname configuration
ossutil bucket-cname --method delete oss://bucket test-domain.com
`,
}
type bucketCnameOptionType struct {
bucketName string
client *oss.Client
}
type BucketCnameCommand struct {
command Command
bwOption bucketCnameOptionType
}
var bucketCnameCommand = BucketCnameCommand{
command: Command{
name: "bucket-cname",
nameAlias: []string{"bucket-cname"},
minArgc: 1,
maxArgc: 3,
specChinese: specChineseBucketCname,
specEnglish: specEnglishBucketCname,
group: GroupTypeNormalCommand,
validOptionNames: []string{
OptionConfigFile,
OptionEndpoint,
OptionAccessKeyID,
OptionAccessKeySecret,
OptionSTSToken,
OptionProxyHost,
OptionProxyUser,
OptionProxyPwd,
OptionLogLevel,
OptionMethod,
OptionPassword,
OptionMode,
OptionECSRoleName,
OptionTokenTimeout,
OptionRamRoleArn,
OptionRoleSessionName,
OptionExternalId,
OptionReadTimeout,
OptionConnectTimeout,
OptionSTSRegion,
OptionSkipVerifyCert,
OptionUserAgent,
OptionItem,
OptionSignVersion,
OptionRegion,
OptionCloudBoxID,
OptionForcePathStyle,
},
},
}
// function for FormatHelper interface
func (bwc *BucketCnameCommand) formatHelpForWhole() string {
return bwc.command.formatHelpForWhole()
}
func (bwc *BucketCnameCommand) formatIndependHelp() string {
return bwc.command.formatIndependHelp()
}
// Init simulate inheritance, and polymorphism
func (bwc *BucketCnameCommand) Init(args []string, options OptionMapType) error {
return bwc.command.Init(args, options, bwc)
}
// RunCommand simulate inheritance, and polymorphism
func (bwc *BucketCnameCommand) RunCommand() error {
strMethod, _ := GetString(OptionMethod, bwc.command.options)
if strMethod == "" {
return fmt.Errorf("--method value is empty")
}
strItem, _ := GetString(OptionItem, bwc.command.options)
strMethod = strings.ToLower(strMethod)
srcBucketUrL, err := GetCloudUrl(bwc.command.args[0], "")
if err != nil {
return err
}
bwc.bwOption.bucketName = srcBucketUrL.bucket
bwc.bwOption.client, err = bwc.command.ossClient(bwc.bwOption.bucketName)
if err != nil {
return err
}
err = nil
switch strItem {
case "":
switch strMethod {
case "get":
err = bwc.GetBucketCname()
case "put":
err = bwc.PutBucketCname()
case "delete":
err = bwc.DeleteBucketCname()
default:
err = fmt.Errorf("--method only support get,put,delete")
}
case "token":
switch strMethod {
case "get":
err = bwc.GetBucketCnameToken()
case "put":
err = bwc.PutBucketCnameToken()
default:
err = fmt.Errorf("only support get bucket token or put bucket token")
}
case "certificate":
switch strMethod {
case "put":
err = bwc.PutBucketCnameWithCertificate()
default:
err = fmt.Errorf("only support put bucket with certificate")
}
default:
err = fmt.Errorf("--item only support token or certificate")
}
return err
}
func (bwc *BucketCnameCommand) confirm(str string) bool {
var val string
fmt.Printf(getClearStr(fmt.Sprintf("bucket cname: overwrite \"%s\"(y or N)? ", str)))
if _, err := fmt.Scanln(&val); err != nil || (strings.ToLower(val) != "yes" && strings.ToLower(val) != "y") {
return false
}
return true
}
func (bwc *BucketCnameCommand) GetBucketCname() error {
client := bwc.bwOption.client
output, err := client.GetBucketCname(bwc.bwOption.bucketName)
if err != nil {
return err
}
var outFile *os.File
if len(bwc.command.args) >= 2 {
fileName := bwc.command.args[1]
_, err = os.Stat(fileName)
if err == nil {
bConitnue := bwc.confirm(fileName)
if !bConitnue {
return nil
}
}
outFile, err = os.OpenFile(fileName, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0660)
if err != nil {
return err
}
defer outFile.Close()
} else {
outFile = os.Stdout
}
outFile.Write([]byte(output))
fmt.Printf("\n\n")
return nil
}
func (bwc *BucketCnameCommand) PutBucketCname() error {
client := bwc.bwOption.client
if len(bwc.command.args) < 2 {
return fmt.Errorf("cname is emtpy")
}
cname := bwc.command.args[1]
return client.PutBucketCname(bwc.bwOption.bucketName, cname)
}
func (bwc *BucketCnameCommand) PutBucketCnameWithCertificate() error {
if len(bwc.command.args) < 2 {
return fmt.Errorf("missing parameters,the local cname config file is empty")
}
cnameFile := bwc.command.args[1]
fileInfo, err := os.Stat(cnameFile)
if err != nil {
return err
}
if fileInfo.IsDir() {
return fmt.Errorf("%s is dir,not the expected file", cnameFile)
}
if fileInfo.Size() == 0 {
return fmt.Errorf("%s is empty file", cnameFile)
}
// parsing the xml file
file, err := os.Open(cnameFile)
if err != nil {
return err
}
defer file.Close()
xmlBody, err := ioutil.ReadAll(file)
if err != nil {
return err
}
client := bwc.bwOption.client
return client.PutBucketCnameXml(bwc.bwOption.bucketName, string(xmlBody))
}
func (bwc *BucketCnameCommand) DeleteBucketCname() error {
client := bwc.bwOption.client
if len(bwc.command.args) < 2 {
return fmt.Errorf("cname is emtpy")
}
cname := bwc.command.args[1]
err := client.DeleteBucketCname(bwc.bwOption.bucketName, cname)
return err
}
func (bwc *BucketCnameCommand) GetBucketCnameToken() error {
client := bwc.bwOption.client
if len(bwc.command.args) < 2 {
return fmt.Errorf("cname is emtpy")
}
cname := bwc.command.args[1]
out, err := client.GetBucketCnameToken(bwc.bwOption.bucketName, cname)
if err != nil {
return err
}
var outFile *os.File
if len(bwc.command.args) >= 3 {
fileName := bwc.command.args[2]
_, err = os.Stat(fileName)
if err == nil {
bConitnue := bwc.confirm(fileName)
if !bConitnue {
return nil
}
}
outFile, err = os.OpenFile(fileName, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0660)
if err != nil {
return err
}
defer outFile.Close()
} else {
outFile = os.Stdout
}
var strXml []byte
var xmlError error
if strXml, xmlError = xml.MarshalIndent(out, "", " "); xmlError != nil {
return xmlError
}
outFile.Write(strXml)
fmt.Printf("\n\n")
return err
}
func (bwc *BucketCnameCommand) PutBucketCnameToken() error {
client := bwc.bwOption.client
if len(bwc.command.args) < 2 {
return fmt.Errorf("cname is emtpy")
}
cname := bwc.command.args[1]
output, err := client.CreateBucketCnameToken(bwc.bwOption.bucketName, cname)
if err != nil {
return err
}
var outFile *os.File
if len(bwc.command.args) >= 3 {
fileName := bwc.command.args[2]
_, err = os.Stat(fileName)
if err == nil {
bConitnue := bwc.confirm(fileName)
if !bConitnue {
return nil
}
}
outFile, err = os.OpenFile(fileName, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0660)
if err != nil {
return err
}
defer outFile.Close()
} else {
outFile = os.Stdout
}
var strXml []byte
var xmlError error
if strXml, xmlError = xml.MarshalIndent(output, "", " "); xmlError != nil {
return xmlError
}
outFile.Write(strXml)
fmt.Printf("\n\n")
return err
}