parent
2dd52d5274
commit
2b93ce0299
@ -1,20 +0,0 @@
|
||||
package checks
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
|
||||
)
|
||||
|
||||
type ServiceChecker interface {
|
||||
Check(ctx context.Context, config *config.GlobalConfig) error
|
||||
}
|
||||
|
||||
func CheckServices(ctx context.Context, cfg *config.GlobalConfig, checkers []ServiceChecker) error {
|
||||
for _, checker := range checkers {
|
||||
if err := checker.Check(ctx, cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
@ -1,107 +1,79 @@
|
||||
package checks
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"context"
|
||||
"net"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/openimsdk/tools/errs"
|
||||
"github.com/openimsdk/tools/utils/jsonutil"
|
||||
|
||||
"github.com/minio/minio-go/v7"
|
||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||
"github.com/openimsdk/tools/errs"
|
||||
"github.com/openimsdk/tools/log"
|
||||
|
||||
s3minio "github.com/openimsdk/open-im-server/v3/pkg/common/db/s3/minio"
|
||||
)
|
||||
|
||||
const (
|
||||
minioHealthCheckDuration = 1
|
||||
mongoConnTimeout = 5 * time.Second
|
||||
MaxRetry = 300
|
||||
minioHealthCheckDuration = 1 * time.Second
|
||||
)
|
||||
|
||||
type MinioConfig struct {
|
||||
type MinioCheck struct {
|
||||
s3minio.Config
|
||||
UseSSL string
|
||||
ApiURL string
|
||||
UseSSL bool `yaml:"useSSL"`
|
||||
ApiURL string `yaml:"apiURL"`
|
||||
}
|
||||
|
||||
// CheckMinio checks the MinIO connection.
|
||||
func CheckMinio(minioStu MinioConfig) error {
|
||||
if minioStu.Endpoint == "" || minioStu.AccessKeyID == "" || minioStu.SecretAccessKey == "" {
|
||||
log.CInfo(nil, "Missing configuration for MinIO", "endpoint", minioStu.Endpoint, "accessKeyID", minioStu.AccessKeyID, "secretAccessKey", minioStu.SecretAccessKey)
|
||||
return errs.New("missing configuration for endpoint, accessKeyID, or secretAccessKey").Wrap()
|
||||
}
|
||||
func CheckMinio(ctx context.Context, config MinioCheck) error {
|
||||
|
||||
minioInfo, err := jsonutil.JsonMarshal(minioStu)
|
||||
if err != nil {
|
||||
log.CInfo(nil, "MinioStu Marshal failed", "error", err)
|
||||
return errs.WrapMsg(err, "minioStu Marshal failed")
|
||||
if config.Endpoint == "" || config.AccessKeyID == "" || config.SecretAccessKey == "" {
|
||||
logMsg := "Missing configuration for MinIO: endpoint, accessKeyID, or secretAccessKey"
|
||||
log.CInfo(ctx, logMsg, "Config", config)
|
||||
return errs.New(logMsg)
|
||||
}
|
||||
logJsonInfo := string(minioInfo)
|
||||
|
||||
u, err := url.Parse(minioStu.Endpoint)
|
||||
endpointURL, err := url.Parse(config.Endpoint)
|
||||
if err != nil {
|
||||
log.CInfo(nil, "URL parse failed", "error", err, "minioInfo", logJsonInfo)
|
||||
return errs.WrapMsg(err, "url parse failed")
|
||||
return errs.WrapMsg(err, "Failed to parse MinIO endpoint URL")
|
||||
}
|
||||
secure := endpointURL.Scheme == "https" || config.UseSSL
|
||||
|
||||
secure := u.Scheme == "https" || minioStu.UseSSL == "true"
|
||||
|
||||
minioClient, err := minio.New(u.Host, &minio.Options{
|
||||
Creds: credentials.NewStaticV4(minioStu.AccessKeyID, minioStu.SecretAccessKey, ""),
|
||||
minioClient, err := minio.New(endpointURL.Host, &minio.Options{
|
||||
Creds: credentials.NewStaticV4(config.AccessKeyID, config.SecretAccessKey, ""),
|
||||
Secure: secure,
|
||||
})
|
||||
if err != nil {
|
||||
log.CInfo(nil, "Initialize MinIO client failed", "error", err, "minioInfo", logJsonInfo)
|
||||
return errs.WrapMsg(err, "initialize minio client failed")
|
||||
return errs.WrapMsg(err, "Failed to initialize MinIO client", "Endpoint", config.Endpoint)
|
||||
}
|
||||
|
||||
cancel, err := minioClient.HealthCheck(time.Duration(minioHealthCheckDuration) * time.Second)
|
||||
cancel, err := minioClient.HealthCheck(minioHealthCheckDuration)
|
||||
if err != nil {
|
||||
log.CInfo(nil, "MinIO client health check failed", "error", err, "minioInfo", logJsonInfo)
|
||||
return errs.WrapMsg(err, "minio client health check failed")
|
||||
return errs.WrapMsg(err, "MinIO client health check failed")
|
||||
}
|
||||
defer cancel()
|
||||
|
||||
if minioClient.IsOffline() {
|
||||
log.CInfo(nil, "MinIO client is offline", "minioInfo", logJsonInfo)
|
||||
return errors.New("minio client is offline")
|
||||
return errs.New("minio client is offline").Wrap()
|
||||
}
|
||||
|
||||
apiURL, err := exactIP(minioStu.ApiURL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
signEndPoint, err := exactIP(minioStu.SignEndpoint)
|
||||
if err != nil {
|
||||
return err
|
||||
apiURLHost, _ := exactIP(config.ApiURL)
|
||||
signEndpointHost, _ := exactIP(config.SignEndpoint)
|
||||
if apiURLHost == "127.0.0.1" || signEndpointHost == "127.0.0.1" {
|
||||
logMsg := "Warning: MinIO ApiURL or SignEndpoint contains localhost"
|
||||
log.CInfo(ctx, logMsg, "ApiURL", config.ApiURL, "SignEndpoint", config.SignEndpoint)
|
||||
}
|
||||
|
||||
if apiURL == "127.0.0.1" {
|
||||
log.CInfo(nil, "Warning, MinIOStu.apiURL contains localhost", "apiURL", minioStu.ApiURL)
|
||||
}
|
||||
if signEndPoint == "127.0.0.1" {
|
||||
log.CInfo(nil, "Warning, MinIOStu.signEndPoint contains localhost", "signEndPoint", minioStu.SignEndpoint)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func exactIP(urlStr string) (string, error) {
|
||||
u, err := url.Parse(urlStr)
|
||||
if err != nil {
|
||||
log.CInfo(nil, "URL parse error", "error", err, "url", urlStr)
|
||||
return "", errs.WrapMsg(err, "url parse error")
|
||||
return "", errs.WrapMsg(err, "URL parse error")
|
||||
}
|
||||
host, _, err := net.SplitHostPort(u.Host)
|
||||
if err != nil {
|
||||
host = u.Host // Assume the entire host part is the host name if split fails
|
||||
}
|
||||
if strings.HasSuffix(host, ":") {
|
||||
host = host[:len(host)-1]
|
||||
host = u.Host
|
||||
}
|
||||
return host, nil
|
||||
}
|
||||
|
@ -0,0 +1,54 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
)
|
||||
|
||||
const (
|
||||
colorRed = 31
|
||||
colorGreen = 32
|
||||
colorYellow = 33
|
||||
)
|
||||
|
||||
// colorErrPrint prints formatted string in red to stderr
|
||||
func ColorErrPrint(msg string) {
|
||||
// ANSI escape code for red text
|
||||
const redColor = "\033[31m"
|
||||
// ANSI escape code to reset color
|
||||
const resetColor = "\033[0m"
|
||||
msg = redColor + msg + resetColor
|
||||
// Print to stderr in red
|
||||
fmt.Fprintf(os.Stderr, "%s\n", msg)
|
||||
}
|
||||
|
||||
func ColorSuccessPrint(format string, a ...interface{}) {
|
||||
// ANSI escape code for green text is \033[32m
|
||||
// \033[0m resets the color
|
||||
fmt.Printf("\033[32m"+format+"\033[0m", a...)
|
||||
}
|
||||
|
||||
func colorPrint(colorCode int, format string, a ...any) {
|
||||
fmt.Printf("\x1b[%dm%s\x1b[0m\n", colorCode, fmt.Sprintf(format, a...))
|
||||
}
|
||||
|
||||
func colorErrPrint(colorCode int, format string, a ...any) {
|
||||
log.Printf("\x1b[%dm%s\x1b[0m\n", colorCode, fmt.Sprintf(format, a...))
|
||||
}
|
||||
|
||||
func ErrorPrint(s string) {
|
||||
colorErrPrint(colorRed, "%v", s)
|
||||
}
|
||||
|
||||
func SuccessPrint(s string) {
|
||||
colorPrint(colorGreen, "%v", s)
|
||||
}
|
||||
|
||||
func WarningPrint(s string) {
|
||||
colorPrint(colorYellow, "Warning: But %v", s)
|
||||
}
|
||||
|
||||
func ErrStr(err error, str string) error {
|
||||
return fmt.Errorf("%v;%s", err, str)
|
||||
}
|
Loading…
Reference in new issue