func ReadFile(path string) ([]byte, *model.AppError) { if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_S3 { endpoint := utils.Cfg.FileSettings.AmazonS3Endpoint accessKey := utils.Cfg.FileSettings.AmazonS3AccessKeyId secretKey := utils.Cfg.FileSettings.AmazonS3SecretAccessKey secure := *utils.Cfg.FileSettings.AmazonS3SSL s3Clnt, err := s3.New(endpoint, accessKey, secretKey, secure) if err != nil { return nil, model.NewLocAppError("ReadFile", "api.file.read_file.s3.app_error", nil, err.Error()) } bucket := utils.Cfg.FileSettings.AmazonS3Bucket reader, err := s3Clnt.GetObject(bucket, path) if err != nil { return nil, model.NewLocAppError("ReadFile", "api.file.read_file.s3.app_error", nil, err.Error()) } if f, err := ioutil.ReadAll(reader); err != nil { return nil, model.NewLocAppError("ReadFile", "api.file.read_file.s3.app_error", nil, err.Error()) } else { return f, nil } } else if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_LOCAL { if f, err := ioutil.ReadFile(utils.Cfg.FileSettings.Directory + path); err != nil { return nil, model.NewLocAppError("ReadFile", "api.file.read_file.reading_local.app_error", nil, err.Error()) } else { return f, nil } } else { return nil, model.NewLocAppError("ReadFile", "api.file.read_file.configured.app_error", nil, "") } }
func WriteFile(f []byte, path string) *model.AppError { if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_S3 { endpoint := utils.Cfg.FileSettings.AmazonS3Endpoint accessKey := utils.Cfg.FileSettings.AmazonS3AccessKeyId secretKey := utils.Cfg.FileSettings.AmazonS3SecretAccessKey secure := *utils.Cfg.FileSettings.AmazonS3SSL s3Clnt, err := s3.New(endpoint, accessKey, secretKey, secure) if err != nil { return model.NewLocAppError("WriteFile", "api.file.write_file.s3.app_error", nil, err.Error()) } bucket := utils.Cfg.FileSettings.AmazonS3Bucket ext := filepath.Ext(path) if model.IsFileExtImage(ext) { _, err = s3Clnt.PutObject(bucket, path, bytes.NewReader(f), model.GetImageMimeType(ext)) } else { _, err = s3Clnt.PutObject(bucket, path, bytes.NewReader(f), "binary/octet-stream") } if err != nil { return model.NewLocAppError("WriteFile", "api.file.write_file.s3.app_error", nil, err.Error()) } } else if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_LOCAL { if err := writeFileLocally(f, utils.Cfg.FileSettings.Directory+path); err != nil { return err } } else { return model.NewLocAppError("WriteFile", "api.file.write_file.configured.app_error", nil, "") } return nil }
func MoveFile(oldPath, newPath string) *model.AppError { if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_S3 { endpoint := utils.Cfg.FileSettings.AmazonS3Endpoint accessKey := utils.Cfg.FileSettings.AmazonS3AccessKeyId secretKey := utils.Cfg.FileSettings.AmazonS3SecretAccessKey secure := *utils.Cfg.FileSettings.AmazonS3SSL s3Clnt, err := s3.New(endpoint, accessKey, secretKey, secure) if err != nil { return model.NewLocAppError("moveFile", "api.file.write_file.s3.app_error", nil, err.Error()) } bucket := utils.Cfg.FileSettings.AmazonS3Bucket var copyConds = s3.NewCopyConditions() if err = s3Clnt.CopyObject(bucket, newPath, "/"+path.Join(bucket, oldPath), copyConds); err != nil { return model.NewLocAppError("moveFile", "api.file.move_file.delete_from_s3.app_error", nil, err.Error()) } if err = s3Clnt.RemoveObject(bucket, oldPath); err != nil { return model.NewLocAppError("moveFile", "api.file.move_file.delete_from_s3.app_error", nil, err.Error()) } } else if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_LOCAL { if err := os.MkdirAll(filepath.Dir(utils.Cfg.FileSettings.Directory+newPath), 0774); err != nil { return model.NewLocAppError("moveFile", "api.file.move_file.rename.app_error", nil, err.Error()) } if err := os.Rename(utils.Cfg.FileSettings.Directory+oldPath, utils.Cfg.FileSettings.Directory+newPath); err != nil { return model.NewLocAppError("moveFile", "api.file.move_file.rename.app_error", nil, err.Error()) } } else { return model.NewLocAppError("moveFile", "api.file.move_file.configured.app_error", nil, "") } return nil }
// NewMinioStorage initializes the MinioStorage with Minio arguments func NewMinioStorage(endPoint, accessKeyID, secretAccessKey, bucket, prefix, region string, secure bool) (*MinioStorage, error) { mc, err := minio.New(endPoint, accessKeyID, secretAccessKey, secure) if err != nil { return nil, err } if region == "" { region = "us-east-1" } exists, err := mc.BucketExists(bucket) if err != nil { return nil, err } if !exists { if err = mc.MakeBucket(bucket, region); err != nil { // Since the bucket couldn't be created, there's nothing furter to do return nil, err } } return &MinioStorage{ minio: mc, region: region, bucket: bucket, prefix: prefix, }, nil }
// New returns an initialized s3Client structure. if debug use a internal trace transport func New(config *Config) (client.Client, error) { u, err := client.Parse(config.HostURL) if err != nil { return nil, iodine.New(err, nil) } var transport http.RoundTripper switch { case config.Debug == true: transport = GetNewTraceTransport(NewTrace(), http.DefaultTransport) default: transport = http.DefaultTransport } s3Conf := s3.Config{ AccessKeyID: config.AccessKeyID, SecretAccessKey: config.SecretAccessKey, Transport: transport, Endpoint: u.Scheme + "://" + u.Host, } s3Conf.AccessKeyID = config.AccessKeyID s3Conf.SecretAccessKey = config.SecretAccessKey s3Conf.Transport = transport s3Conf.SetUserAgent(config.AppName, config.AppVersion, config.AppComments...) s3Conf.Endpoint = u.Scheme + "://" + u.Host api, err := s3.New(s3Conf) if err != nil { return nil, err } return &s3Client{api: api, hostURL: u}, nil }
func newMinioClient(host string, port int, accessKey, accessSecret string, insecure bool) (minio.CloudStorageClient, error) { return minio.New( fmt.Sprintf("%s:%d", host, port), accessKey, accessSecret, insecure, ) }
func cleanupTestFile(info *model.FileInfo) error { if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_S3 { endpoint := utils.Cfg.FileSettings.AmazonS3Endpoint accessKey := utils.Cfg.FileSettings.AmazonS3AccessKeyId secretKey := utils.Cfg.FileSettings.AmazonS3SecretAccessKey secure := *utils.Cfg.FileSettings.AmazonS3SSL s3Clnt, err := s3.New(endpoint, accessKey, secretKey, secure) if err != nil { return err } bucket := utils.Cfg.FileSettings.AmazonS3Bucket if err := s3Clnt.RemoveObject(bucket, info.Path); err != nil { return err } if info.ThumbnailPath != "" { if err := s3Clnt.RemoveObject(bucket, info.ThumbnailPath); err != nil { return err } } if info.PreviewPath != "" { if err := s3Clnt.RemoveObject(bucket, info.PreviewPath); err != nil { return err } } } else if utils.Cfg.FileSettings.DriverName == model.IMAGE_DRIVER_LOCAL { if err := os.Remove(utils.Cfg.FileSettings.Directory + info.Path); err != nil { return err } if info.ThumbnailPath != "" { if err := os.Remove(utils.Cfg.FileSettings.Directory + info.ThumbnailPath); err != nil { return err } } if info.PreviewPath != "" { if err := os.Remove(utils.Cfg.FileSettings.Directory + info.PreviewPath); err != nil { return err } } } return nil }
func main() { gitConf, err := config.GetGit(appName) if err != nil { log.Fatalf("Error getting git config (%s)", err) } srvConf, err := config.GetServer(appName) if err != nil { log.Fatalf("Error getting web config (%s)", err) } s3Conf, err := config.GetS3(appName) if err != nil { log.Fatalf("Error getting S3 config (%s)", err) } log.Printf("Creating caching context for directory %s", srvConf.TemplateBaseDir) tplCtx := createTplCtx(srvConf.TemplateBaseDir, funcs) tmpDir, err := createTempDir() if err != nil { log.Fatalf("Error creating temp dir (%s)", err) } defer os.RemoveAll(tmpDir) s3Client, err := s3.New(s3Conf.Endpoint, s3Conf.Key, s3Conf.Secret, false) if err != nil { log.Fatalf("Error creating new S3 client (%s)", err) } webHandler, err := handlers.NewWeb(s3Client, s3Conf.Bucket, srvConf, gitConf, tplCtx) if err != nil { log.Fatalf("Error creating web handler (%s)", err) } gitHandler := handlers.NewGit(s3Client, s3Conf.Bucket, tmpDir) hostStr := fmt.Sprintf("0.0.0.0:%d", srvConf.BindPort) log.Printf("Server config: %s", *srvConf) log.Printf("Git config: %s", *gitConf) log.Printf("Serving %s and %s on %s", srvConf.Host, gitConf.Host, hostStr) if err := http.ListenAndServe(hostStr, flexwork.MatchHost(map[string]http.Handler{ srvConf.Host: webHandler, gitConf.Host: gitHandler, })); err != nil { log.Fatalf("Error running web server (%s)", err) } }