You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
package redis3
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"crypto/x509"
|
|
"net"
|
|
"os"
|
|
|
|
"github.com/go-redsync/redsync/v4"
|
|
"github.com/go-redsync/redsync/v4/redis/goredis/v9"
|
|
"github.com/redis/go-redis/v9"
|
|
"github.com/seaweedfs/seaweedfs/weed/filer"
|
|
"github.com/seaweedfs/seaweedfs/weed/glog"
|
|
"github.com/seaweedfs/seaweedfs/weed/util"
|
|
)
|
|
|
|
func init() {
|
|
filer.Stores = append(filer.Stores, &Redis3Store{})
|
|
}
|
|
|
|
type Redis3Store struct {
|
|
UniversalRedis3Store
|
|
}
|
|
|
|
func (store *Redis3Store) GetName() string {
|
|
return "redis3"
|
|
}
|
|
|
|
func (store *Redis3Store) Initialize(configuration util.Configuration, prefix string) (err error) {
|
|
return store.initialize(
|
|
configuration.GetString(prefix+"address"),
|
|
configuration.GetString(prefix+"password"),
|
|
configuration.GetInt(prefix+"database"),
|
|
configuration.GetBool(prefix+"enable_mtls"),
|
|
configuration.GetString(prefix+"ca_cert_path"),
|
|
configuration.GetString(prefix+"client_cert_path"),
|
|
configuration.GetString(prefix+"client_key_path"),
|
|
)
|
|
}
|
|
|
|
func (store *Redis3Store) initialize(hostPort string, password string, database int, enableMtls bool, caCertPath string, clientCertPath string, clientKeyPath string) (err error) {
|
|
if enableMtls {
|
|
clientCert, err := tls.LoadX509KeyPair(clientCertPath, clientKeyPath)
|
|
if err != nil {
|
|
glog.Fatalf("Error loading client certificate and key pair: %v", err)
|
|
}
|
|
|
|
caCertBytes, err := os.ReadFile(caCertPath)
|
|
if err != nil {
|
|
glog.Fatalf("Error reading CA certificate file: %v", err)
|
|
}
|
|
|
|
caCertPool := x509.NewCertPool()
|
|
if ok := caCertPool.AppendCertsFromPEM(caCertBytes); !ok {
|
|
glog.Fatalf("Error appending CA certificate to pool")
|
|
}
|
|
|
|
redisHost, _, err := net.SplitHostPort(hostPort)
|
|
if err != nil {
|
|
glog.Fatalf("Error parsing redis host and port from %s: %v", hostPort, err)
|
|
}
|
|
|
|
tlsConfig := &tls.Config{
|
|
Certificates: []tls.Certificate{clientCert},
|
|
RootCAs: caCertPool,
|
|
ServerName: redisHost,
|
|
MinVersion: tls.VersionTLS12,
|
|
}
|
|
store.Client = redis.NewClient(&redis.Options{
|
|
Addr: hostPort,
|
|
Password: password,
|
|
DB: database,
|
|
TLSConfig: tlsConfig,
|
|
})
|
|
} else {
|
|
store.Client = redis.NewClient(&redis.Options{
|
|
Addr: hostPort,
|
|
Password: password,
|
|
DB: database,
|
|
})
|
|
}
|
|
store.redsync = redsync.New(goredis.NewPool(store.Client))
|
|
return
|
|
}
|