github.com/minio/console@v1.4.1/pkg/logger/config.go (about)

     1  // This file is part of MinIO Console Server
     2  // Copyright (c) 2022 MinIO, Inc.
     3  //
     4  // This program is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Affero General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // This program is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  // GNU Affero General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Affero General Public License
    15  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package logger
    18  
    19  import (
    20  	"errors"
    21  	"strconv"
    22  	"strings"
    23  
    24  	"github.com/google/uuid"
    25  
    26  	"github.com/minio/console/pkg/logger/config"
    27  	"github.com/minio/console/pkg/logger/target/http"
    28  	"github.com/minio/pkg/v3/env"
    29  )
    30  
    31  // NewConfig - initialize new logger config.
    32  func NewConfig() Config {
    33  	cfg := Config{
    34  		HTTP:         make(map[string]http.Config),
    35  		AuditWebhook: make(map[string]http.Config),
    36  	}
    37  
    38  	return cfg
    39  }
    40  
    41  func lookupLoggerWebhookConfig() (Config, error) {
    42  	cfg := NewConfig()
    43  	envs := env.List(EnvLoggerWebhookEndpoint)
    44  	var loggerTargets []string
    45  	for _, k := range envs {
    46  		target := strings.TrimPrefix(k, EnvLoggerWebhookEndpoint+config.Default)
    47  		if target == EnvLoggerWebhookEndpoint {
    48  			target = config.Default
    49  		}
    50  		loggerTargets = append(loggerTargets, target)
    51  	}
    52  
    53  	// Load HTTP logger from the environment if found
    54  	for _, target := range loggerTargets {
    55  		if v, ok := cfg.HTTP[target]; ok && v.Enabled {
    56  			// This target is already enabled using the
    57  			// legacy environment variables, ignore.
    58  			continue
    59  		}
    60  		enableEnv := EnvLoggerWebhookEnable
    61  		if target != config.Default {
    62  			enableEnv = EnvLoggerWebhookEnable + config.Default + target
    63  		}
    64  		enable, err := config.ParseBool(env.Get(enableEnv, ""))
    65  		if err != nil || !enable {
    66  			continue
    67  		}
    68  		endpointEnv := EnvLoggerWebhookEndpoint
    69  		if target != config.Default {
    70  			endpointEnv = EnvLoggerWebhookEndpoint + config.Default + target
    71  		}
    72  		authTokenEnv := EnvLoggerWebhookAuthToken
    73  		if target != config.Default {
    74  			authTokenEnv = EnvLoggerWebhookAuthToken + config.Default + target
    75  		}
    76  		clientCertEnv := EnvLoggerWebhookClientCert
    77  		if target != config.Default {
    78  			clientCertEnv = EnvLoggerWebhookClientCert + config.Default + target
    79  		}
    80  		clientKeyEnv := EnvLoggerWebhookClientKey
    81  		if target != config.Default {
    82  			clientKeyEnv = EnvLoggerWebhookClientKey + config.Default + target
    83  		}
    84  		err = config.EnsureCertAndKey(env.Get(clientCertEnv, ""), env.Get(clientKeyEnv, ""))
    85  		if err != nil {
    86  			return cfg, err
    87  		}
    88  		queueSizeEnv := EnvLoggerWebhookQueueSize
    89  		if target != config.Default {
    90  			queueSizeEnv = EnvLoggerWebhookQueueSize + config.Default + target
    91  		}
    92  		queueSize, err := strconv.Atoi(env.Get(queueSizeEnv, "100000"))
    93  		if err != nil {
    94  			return cfg, err
    95  		}
    96  		if queueSize <= 0 {
    97  			return cfg, errors.New("invalid queue_size value")
    98  		}
    99  		cfg.HTTP[target] = http.Config{
   100  			Enabled:    true,
   101  			Endpoint:   env.Get(endpointEnv, ""),
   102  			AuthToken:  env.Get(authTokenEnv, ""),
   103  			ClientCert: env.Get(clientCertEnv, ""),
   104  			ClientKey:  env.Get(clientKeyEnv, ""),
   105  			QueueSize:  queueSize,
   106  		}
   107  	}
   108  
   109  	return cfg, nil
   110  }
   111  
   112  func lookupAuditWebhookConfig() (Config, error) {
   113  	cfg := NewConfig()
   114  	var loggerAuditTargets []string
   115  	envs := env.List(EnvAuditWebhookEndpoint)
   116  	for _, k := range envs {
   117  		target := strings.TrimPrefix(k, EnvAuditWebhookEndpoint+config.Default)
   118  		if target == EnvAuditWebhookEndpoint {
   119  			target = config.Default
   120  		}
   121  		loggerAuditTargets = append(loggerAuditTargets, target)
   122  	}
   123  
   124  	for _, target := range loggerAuditTargets {
   125  		if v, ok := cfg.AuditWebhook[target]; ok && v.Enabled {
   126  			// This target is already enabled using the
   127  			// legacy environment variables, ignore.
   128  			continue
   129  		}
   130  		enableEnv := EnvAuditWebhookEnable
   131  		if target != config.Default {
   132  			enableEnv = EnvAuditWebhookEnable + config.Default + target
   133  		}
   134  		enable, err := config.ParseBool(env.Get(enableEnv, ""))
   135  		if err != nil || !enable {
   136  			continue
   137  		}
   138  		endpointEnv := EnvAuditWebhookEndpoint
   139  		if target != config.Default {
   140  			endpointEnv = EnvAuditWebhookEndpoint + config.Default + target
   141  		}
   142  		authTokenEnv := EnvAuditWebhookAuthToken
   143  		if target != config.Default {
   144  			authTokenEnv = EnvAuditWebhookAuthToken + config.Default + target
   145  		}
   146  		clientCertEnv := EnvAuditWebhookClientCert
   147  		if target != config.Default {
   148  			clientCertEnv = EnvAuditWebhookClientCert + config.Default + target
   149  		}
   150  		clientKeyEnv := EnvAuditWebhookClientKey
   151  		if target != config.Default {
   152  			clientKeyEnv = EnvAuditWebhookClientKey + config.Default + target
   153  		}
   154  		err = config.EnsureCertAndKey(env.Get(clientCertEnv, ""), env.Get(clientKeyEnv, ""))
   155  		if err != nil {
   156  			return cfg, err
   157  		}
   158  		queueSizeEnv := EnvAuditWebhookQueueSize
   159  		if target != config.Default {
   160  			queueSizeEnv = EnvAuditWebhookQueueSize + config.Default + target
   161  		}
   162  		queueSize, err := strconv.Atoi(env.Get(queueSizeEnv, "100000"))
   163  		if err != nil {
   164  			return cfg, err
   165  		}
   166  		if queueSize <= 0 {
   167  			return cfg, errors.New("invalid queue_size value")
   168  		}
   169  		cfg.AuditWebhook[target] = http.Config{
   170  			Enabled:    true,
   171  			Endpoint:   env.Get(endpointEnv, ""),
   172  			AuthToken:  env.Get(authTokenEnv, ""),
   173  			ClientCert: env.Get(clientCertEnv, ""),
   174  			ClientKey:  env.Get(clientKeyEnv, ""),
   175  			QueueSize:  queueSize,
   176  		}
   177  	}
   178  
   179  	return cfg, nil
   180  }
   181  
   182  // LookupConfigForSubSys - lookup logger config, override with ENVs if set, for the given sub-system
   183  func LookupConfigForSubSys(subSys string) (cfg Config, err error) {
   184  	switch subSys {
   185  	case config.LoggerWebhookSubSys:
   186  		if cfg, err = lookupLoggerWebhookConfig(); err != nil {
   187  			return cfg, err
   188  		}
   189  	case config.AuditWebhookSubSys:
   190  		if cfg, err = lookupAuditWebhookConfig(); err != nil {
   191  			return cfg, err
   192  		}
   193  	}
   194  	return cfg, nil
   195  }
   196  
   197  // GetGlobalDeploymentID :
   198  func GetGlobalDeploymentID() string {
   199  	if globalDeploymentID != "" {
   200  		return globalDeploymentID
   201  	}
   202  	globalDeploymentID = env.Get(EnvGlobalDeploymentID, mustGetUUID())
   203  	return globalDeploymentID
   204  }
   205  
   206  // mustGetUUID - get a random UUID.
   207  func mustGetUUID() string {
   208  	u, err := uuid.NewRandom()
   209  	if err != nil {
   210  		CriticalIf(GlobalContext, err)
   211  	}
   212  	return u.String()
   213  }