| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | 
							- package entity
 
- import (
 
- 	"backup-x/util"
 
- 	"errors"
 
- 	"log"
 
- 	"os"
 
- 	"github.com/aws/aws-sdk-go/aws"
 
- 	"github.com/aws/aws-sdk-go/aws/credentials"
 
- 	"github.com/aws/aws-sdk-go/aws/session"
 
- 	"github.com/aws/aws-sdk-go/service/s3"
 
- 	"github.com/aws/aws-sdk-go/service/s3/s3manager"
 
- )
 
- // S3Config S3Config
 
- type S3Config struct {
 
- 	Endpoint   string
 
- 	AccessKey  string
 
- 	SecretKey  string
 
- 	BucketName string
 
- }
 
- var ErrS3Empty = errors.New("s3 config is empty")
 
- func (s3Config S3Config) CheckNotEmpty() bool {
 
- 	return s3Config.Endpoint != "" && s3Config.AccessKey != "" &&
 
- 		s3Config.SecretKey != "" && s3Config.BucketName != ""
 
- }
 
- func (s3Config S3Config) getSession() (*session.Session, error) {
 
- 	if !s3Config.CheckNotEmpty() {
 
- 		return nil, ErrS3Empty
 
- 	}
 
- 	conf, err := GetConfigCache()
 
- 	if err != nil {
 
- 		return nil, err
 
- 	}
 
- 	secretKey, err := util.DecryptByEncryptKey(conf.EncryptKey, s3Config.SecretKey)
 
- 	if err != nil {
 
- 		return nil, err
 
- 	}
 
- 	creds := credentials.NewStaticCredentials(s3Config.AccessKey, secretKey, "")
 
- 	_, err = creds.Get()
 
- 	if err != nil {
 
- 		log.Println(err)
 
- 	}
 
- 	config := &aws.Config{
 
- 		Region:           aws.String("cn-north-1"),
 
- 		Endpoint:         aws.String(s3Config.Endpoint),
 
- 		DisableSSL:       aws.Bool(false),
 
- 		Credentials:      creds,
 
- 		S3ForcePathStyle: aws.Bool(true),
 
- 	}
 
- 	mySession, err := session.NewSession(config)
 
- 	return mySession, err
 
- }
 
- func (s3Config S3Config) CreateBucketIfNotExist() {
 
- 	mySession, err := s3Config.getSession()
 
- 	if err != nil {
 
- 		if err != ErrS3Empty {
 
- 			log.Printf("创建对象存储会话失败, ERR: %s\n", err)
 
- 		}
 
- 		return
 
- 	}
 
- 	client := s3.New(mySession)
 
- 	head := &s3.HeadBucketInput{
 
- 		Bucket: aws.String(s3Config.BucketName),
 
- 	}
 
- 	_, err = client.HeadBucket(head)
 
- 	if err != nil {
 
- 		create := &s3.CreateBucketInput{
 
- 			Bucket: aws.String(s3Config.BucketName),
 
- 		}
 
- 		_, err = client.CreateBucket(create)
 
- 		if err != nil {
 
- 			log.Printf("创建bucket: %s 失败, ERR: %s\n", s3Config.BucketName, err)
 
- 		} else {
 
- 			log.Printf("创建bucket: %s 成功\n", s3Config.BucketName)
 
- 		}
 
- 	}
 
- }
 
- // UploadFile 上传
 
- func (s3Config S3Config) UploadFile(fileName string) {
 
- 	mySession, err := s3Config.getSession()
 
- 	if err != nil {
 
- 		if err != ErrS3Empty {
 
- 			log.Printf("创建对象存储会话失败, ERR: %s\n", err)
 
- 		}
 
- 		return
 
- 	}
 
- 	file, err := os.Open(fileName)
 
- 	if err != nil {
 
- 		log.Println(err)
 
- 		return
 
- 	}
 
- 	defer file.Close()
 
- 	uploader := s3manager.NewUploader(mySession)
 
- 	_, err = uploader.Upload(&s3manager.UploadInput{
 
- 		Bucket: aws.String(s3Config.BucketName),
 
- 		Key:    aws.String(fileName),
 
- 		Body:   file,
 
- 	})
 
- 	if err != nil {
 
- 		log.Printf("%s 上传到对象存储失败. ERR: %s \n", fileName, err)
 
- 	} else {
 
- 		log.Printf("%s 上传到对象存储成功\n", fileName)
 
- 	}
 
- }
 
- // ListFiles 列出文件
 
- func (s3Config S3Config) ListFiles(projectPath string) (fileNames []string, err error) {
 
- 	mySession, err := s3Config.getSession()
 
- 	if err != nil {
 
- 		if err != ErrS3Empty {
 
- 			log.Printf("创建对象存储会话失败, ERR: %s\n", err)
 
- 		}
 
- 		return nil, err
 
- 	}
 
- 	svc := s3.New(mySession)
 
- 	params := &s3.ListObjectsInput{
 
- 		Bucket: aws.String(s3Config.BucketName),
 
- 		Prefix: aws.String(projectPath),
 
- 	}
 
- 	resp, err := svc.ListObjects(params)
 
- 	if err != nil {
 
- 		return nil, err
 
- 	}
 
- 	for _, item := range resp.Contents {
 
- 		fileNames = append(fileNames, *item.Key)
 
- 	}
 
- 	return fileNames, err
 
- }
 
- // DeleteFile 删除文件
 
- func (s3Config S3Config) DeleteFile(filePath string) error {
 
- 	mySession, err := s3Config.getSession()
 
- 	if err != nil {
 
- 		if err != ErrS3Empty {
 
- 			log.Printf("创建对象存储会话失败, ERR: %s\n", err)
 
- 		}
 
- 		return err
 
- 	}
 
- 	svc := s3.New(mySession)
 
- 	_, err = svc.DeleteObject(&s3.DeleteObjectInput{Bucket: aws.String(s3Config.BucketName), Key: aws.String(filePath)})
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	return svc.WaitUntilObjectNotExists(&s3.HeadObjectInput{
 
- 		Bucket: aws.String(s3Config.BucketName),
 
- 		Key:    aws.String(filePath),
 
- 	})
 
- }
 
 
  |