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 }