Files
go-gst/examples/plugins/minio/common.go
2023-08-11 13:50:02 +02:00

168 lines
4.2 KiB
Go

package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"net/http"
"os"
"github.com/go-gst/go-glib/glib"
"github.com/go-gst/go-gst/gst"
minio "github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
const (
accessKeyIDEnvVar = "MINIO_ACCESS_KEY_ID"
secretAccessKeyEnvVar = "MINIO_SECRET_ACCESS_KEY"
)
var (
defaultEndpoint = "play.min.io"
defaultUseTLS = true
defaultRegion = "us-east-1"
defaultInsecureSkipVerify = false
)
type settings struct {
endpoint string
useTLS bool
region string
bucket string
key string
accessKeyID string
secretAccessKey string
insecureSkipVerify bool
caCertFile string
partSize uint64
}
func (s *settings) safestring() string {
return fmt.Sprintf("%+v", &settings{
endpoint: s.endpoint,
useTLS: s.useTLS,
region: s.region,
bucket: s.bucket,
key: s.key,
insecureSkipVerify: s.insecureSkipVerify,
caCertFile: s.caCertFile,
})
}
func defaultSettings() *settings {
return &settings{
endpoint: defaultEndpoint,
useTLS: defaultUseTLS,
region: defaultRegion,
accessKeyID: os.Getenv(accessKeyIDEnvVar),
secretAccessKey: os.Getenv(secretAccessKeyEnvVar),
insecureSkipVerify: defaultInsecureSkipVerify,
partSize: defaultPartSize,
}
}
func getMinIOClient(settings *settings) (*minio.Client, error) {
transport := http.DefaultTransport.(*http.Transport).Clone()
if settings.useTLS {
if transport.TLSClientConfig == nil {
transport.TLSClientConfig = &tls.Config{}
}
if settings.caCertFile != "" {
certPool := x509.NewCertPool()
body, err := ioutil.ReadFile(settings.caCertFile)
if err != nil {
return nil, err
}
certPool.AppendCertsFromPEM(body)
transport.TLSClientConfig.RootCAs = certPool
}
transport.TLSClientConfig.InsecureSkipVerify = settings.insecureSkipVerify
}
return minio.New(settings.endpoint, &minio.Options{
Creds: credentials.NewStaticV4(settings.accessKeyID, settings.secretAccessKey, ""),
Secure: settings.useTLS,
Region: settings.region,
})
}
func setProperty(elem *gst.Element, properties []*glib.ParamSpec, settings *settings, id uint, value *glib.Value) {
prop := properties[id]
val, err := value.GoValue()
if err != nil {
elem.ErrorMessage(gst.DomainLibrary, gst.LibraryErrorSettings,
fmt.Sprintf("Could not coerce %v to go value", value), err.Error())
}
switch prop.Name() {
case "endpoint":
settings.endpoint = val.(string)
case "use-tls":
settings.useTLS = val.(bool)
case "tls-skip-verify":
settings.insecureSkipVerify = val.(bool)
case "ca-cert-file":
settings.caCertFile = val.(string)
case "region":
settings.region = val.(string)
case "bucket":
settings.bucket = val.(string)
case "key":
settings.key = val.(string)
case "access-key-id":
settings.accessKeyID = val.(string)
case "secret-access-key":
settings.secretAccessKey = val.(string)
case "part-size":
settings.partSize = val.(uint64)
}
}
func getProperty(elem *gst.Element, properties []*glib.ParamSpec, settings *settings, id uint) *glib.Value {
prop := properties[id]
var localVal interface{}
switch prop.Name() {
case "endpoint":
localVal = settings.endpoint
case "use-tls":
localVal = settings.useTLS
case "tls-skip-verify":
localVal = settings.insecureSkipVerify
case "ca-cert-file":
localVal = settings.caCertFile
case "region":
localVal = settings.region
case "bucket":
localVal = settings.bucket
case "key":
localVal = settings.key
case "access-key-id":
localVal = settings.accessKeyID
case "secret-access-key":
localVal = "<private>"
case "part-size":
localVal = settings.partSize
default:
elem.ErrorMessage(gst.DomainLibrary, gst.LibraryErrorSettings,
fmt.Sprintf("Cannot get invalid property %s", prop.Name()), "")
return nil
}
val, err := glib.GValue(localVal)
if err != nil {
elem.ErrorMessage(gst.DomainLibrary, gst.LibraryErrorFailed,
fmt.Sprintf("Could not convert %v to GValue", localVal),
err.Error(),
)
return nil
}
return val
}