oss/lib/bucket_cors.go (266 lines of code) (raw):
package lib
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
var specChineseCors = SpecText{
synopsisText: "设置、查询或者删除bucket的cors配置",
paramText: "bucket_url [local_xml_file] [options]",
syntaxText: `
ossutil cors --method put oss://bucket local_xml_file
ossutil cors --method get oss://bucket [local_xml_file]
ossutil cors --method delete oss://bucket
`,
detailHelpText: `
cors命令通过设置method选项值为put、get、delete,可以设置、查询或者删除bucket的cors配置
用法:
该命令有三种用法:
1) ossutil cors --method put oss://bucket local_xml_file
这个命令从配置文件local_xml_file中读取cors配置,然后设置bucket的cors规则
配置文件是一个xml格式的文件,举例如下
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>www.aliyun.com</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>10000</MaxAgeSeconds>
</CORSRule>
</CORSConfiguration>
2) ossutil cors --method get oss://bucket [local_xml_file]
这个命令查询bucket的cors配置
如果输入参数local_xml_file,cors配置将输出到该文件,否则输出到屏幕上
3) ossutil cors --method delete oss://bucket
这个命令删除bucket的cors配置
`,
sampleText: `
1) 设置bucket的cors配置
ossutil cors --method put oss://bucket local_xml_file
2) 查询bucket的cors配置,结果输出到标准输出
ossutil cors --method get oss://bucket
3) 查询bucket的cors配置,结果输出到本地文件
ossutil cors --method get oss://bucket local_xml_file
4) 删除bucket的cors配置
ossutil cors --method delete oss://bucket
`,
}
var specEnglishCors = SpecText{
synopsisText: "Set, get or delete the cors configuration of the oss bucket",
paramText: "bucket_url [local_xml_file] [options]",
syntaxText: `
ossutil cors --method put oss://bucket local_xml_file
ossutil cors --method get oss://bucket [local_xml_file]
ossutil cors --method delete oss://bucket
`,
detailHelpText: `
cors command can set、get and delete the cors configuration of the oss bucket by
set method option value to put, get,delete
Usage:
There are three usages for this command:
1) ossutil cors --method put oss://bucket local_xml_file
The command sets the cors configuration of bucket from local file local_xml_file
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"?>
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>www.aliyun.com</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>10000</MaxAgeSeconds>
</CORSRule>
</CORSConfiguration>
2) ossutil cors --method get oss://bucket [local_xml_file]
The command gets the cors configuration of bucket
if you input parameter local_xml_file,the configuration will be output to local_xml_file
if you don't input parameter local_xml_file,the configuration will be output to stdout
3) ossutil cors --method delete oss://bucket
The command deletes the cors configuration of bucket
`,
sampleText: `
1) put cors configuration
ossutil cors --method put oss://bucket local_xml_file
2) get cors configuration to stdout
ossutil cors --method get oss://bucket
3) get cors configuration to local file
ossutil cors --method get oss://bucket local_xml_file
4) delete cors configuration
ossutil cors --method delete oss://bucket
`,
}
type corsOptionType struct {
bucketName string
}
type CorsCommand struct {
command Command
csOption corsOptionType
}
var corsCommand = CorsCommand{
command: Command{
name: "cors",
nameAlias: []string{"cors"},
minArgc: 1,
maxArgc: 2,
specChinese: specChineseCors,
specEnglish: specEnglishCors,
group: GroupTypeNormalCommand,
validOptionNames: []string{
OptionConfigFile,
OptionEndpoint,
OptionAccessKeyID,
OptionAccessKeySecret,
OptionSTSToken,
OptionProxyHost,
OptionProxyUser,
OptionProxyPwd,
OptionMethod,
OptionLogLevel,
OptionPassword,
OptionMode,
OptionECSRoleName,
OptionTokenTimeout,
OptionRamRoleArn,
OptionRoleSessionName,
OptionExternalId,
OptionReadTimeout,
OptionConnectTimeout,
OptionSTSRegion,
OptionSkipVerifyCert,
OptionUserAgent,
OptionSignVersion,
OptionRegion,
OptionCloudBoxID,
OptionForcePathStyle,
},
},
}
// function for FormatHelper interface
func (corsc *CorsCommand) formatHelpForWhole() string {
return corsc.command.formatHelpForWhole()
}
func (corsc *CorsCommand) formatIndependHelp() string {
return corsc.command.formatIndependHelp()
}
// Init simulate inheritance, and polymorphism
func (corsc *CorsCommand) Init(args []string, options OptionMapType) error {
return corsc.command.Init(args, options, corsc)
}
// RunCommand simulate inheritance, and polymorphism
func (corsc *CorsCommand) RunCommand() error {
strMethod, _ := GetString(OptionMethod, corsc.command.options)
if strMethod == "" {
return fmt.Errorf("--method value is empty")
}
strMethod = strings.ToLower(strMethod)
if strMethod != "put" && strMethod != "get" && strMethod != "delete" {
return fmt.Errorf("--method value is not in the optional value:put|get|delete")
}
bucketUrL, err := StorageURLFromString(corsc.command.args[0], "")
if err != nil {
return err
}
if !bucketUrL.IsCloudURL() {
return fmt.Errorf("parameter is not a cloud url,url is %s", bucketUrL.ToString())
}
cloudUrl := bucketUrL.(CloudURL)
if cloudUrl.bucket == "" {
return fmt.Errorf("bucket name is empty,url is %s", bucketUrL.ToString())
}
corsc.csOption.bucketName = cloudUrl.bucket
if strMethod == "put" {
err = corsc.PutBucketCors()
} else if strMethod == "get" {
err = corsc.GetBucketCors()
} else if strMethod == "delete" {
err = corsc.DeleteBucketCors()
}
if err != nil {
fmt.Printf("error:%s\n", err.Error())
}
return err
}
func (corsc *CorsCommand) PutBucketCors() error {
if len(corsc.command.args) < 2 {
return fmt.Errorf("missing parameters,the local cors config file is empty")
}
corsFile := corsc.command.args[1]
fileInfo, err := os.Stat(corsFile)
if err != nil {
return err
}
if fileInfo.IsDir() {
return fmt.Errorf("%s is dir,not the expected file", corsFile)
}
if fileInfo.Size() == 0 {
return fmt.Errorf("%s is empty file", corsFile)
}
// parsing the xml file
file, err := os.Open(corsFile)
if err != nil {
return err
}
defer file.Close()
text, err := ioutil.ReadAll(file)
if err != nil {
return err
}
rulesConfig := oss.CORSXML{}
err = xml.Unmarshal(text, &rulesConfig)
if err != nil {
return err
}
// put bucket cors
client, err := corsc.command.ossClient(corsc.csOption.bucketName)
if err != nil {
return err
}
return client.SetBucketCORS(corsc.csOption.bucketName, rulesConfig.CORSRules)
}
func (corsc *CorsCommand) confirm(str string) bool {
var val string
fmt.Printf(getClearStr(fmt.Sprintf("cors: 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 (corsc *CorsCommand) GetBucketCors() error {
client, err := corsc.command.ossClient(corsc.csOption.bucketName)
if err != nil {
return err
}
corsRes, err := client.GetBucketCORS(corsc.csOption.bucketName)
if err != nil {
return err
}
output, err := xml.MarshalIndent(corsRes, " ", " ")
if err != nil {
return err
}
var outFile *os.File
if len(corsc.command.args) >= 2 {
fileName := corsc.command.args[1]
_, err = os.Stat(fileName)
if err == nil {
bConitnue := corsc.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(xml.Header))
outFile.Write(output)
fmt.Printf("\n\n")
return nil
}
func (corsc *CorsCommand) DeleteBucketCors() error {
client, err := corsc.command.ossClient(corsc.csOption.bucketName)
if err != nil {
return err
}
return client.DeleteBucketCORS(corsc.csOption.bucketName)
}