88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
package credentials
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
|
|
"git.makerforce.io/photos/photos/pkg/bucket"
|
|
"github.com/minio/minio-go/v6"
|
|
)
|
|
|
|
type Client struct {
|
|
*minio.Client
|
|
Bucket string
|
|
}
|
|
|
|
func NewClient(endpoint, accessKey, secretKey, regionName string, endpointSecure bool, bucket string) (*Client, error) {
|
|
m, err := minio.NewWithRegion(endpoint, accessKey, secretKey, endpointSecure, regionName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
client := &Client{
|
|
Client: m,
|
|
Bucket: bucket,
|
|
}
|
|
return client, nil
|
|
}
|
|
|
|
func NewClientFromEnv() (*Client, error) {
|
|
accessKey := os.Getenv("MINIO_ACCESS_KEY")
|
|
secretKey := os.Getenv("MINIO_SECRET_KEY")
|
|
regionName := os.Getenv("MINIO_REGION_NAME")
|
|
endpoint := os.Getenv("MINIO_ENDPOINT")
|
|
endpointSecure := os.Getenv("MINIO_ENDPOINT_SECURE") == "true"
|
|
bucket := os.Getenv("MINIO_CREDENTIALS_BUCKET")
|
|
return NewClient(endpoint, accessKey, secretKey, regionName, endpointSecure, bucket)
|
|
}
|
|
|
|
func (c *Client) Get(bucket bucket.Bucket) (Credential, error) {
|
|
normalizedBucket := normalize(bucket.String())
|
|
log.Printf("Getting credentials for %s using %s %s", normalizedBucket, c.EndpointURL(), c.Bucket)
|
|
|
|
o, err := c.GetObject(c.Bucket, normalizedBucket, minio.GetObjectOptions{})
|
|
if err != nil {
|
|
return Credential{}, err
|
|
}
|
|
defer o.Close()
|
|
buf, err := ioutil.ReadAll(o)
|
|
if err != nil {
|
|
return Credential{}, err
|
|
}
|
|
|
|
cred := Credential{}
|
|
err = json.Unmarshal(buf, &cred)
|
|
if err != nil {
|
|
return Credential{}, err
|
|
}
|
|
return cred, nil
|
|
}
|
|
|
|
func (c *Client) Set(bucket bucket.Bucket, cred Credential) error {
|
|
normalizedBucket := normalize(bucket.String())
|
|
log.Printf("Setting credentials for %s using %s %s", normalizedBucket, c.EndpointURL(), c.Bucket)
|
|
|
|
buf, err := json.MarshalIndent(cred, "", "\t")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = c.PutObject(c.Bucket, normalizedBucket, bytes.NewBuffer(buf), int64(len(buf)), minio.PutObjectOptions{
|
|
ContentType: "application/json",
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func normalize(bucket string) string {
|
|
nodouble := strings.Replace(bucket, "//", "", 1)
|
|
nolastslash := strings.TrimSuffix(nodouble, "/")
|
|
return nolastslash
|
|
}
|