49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
|
package opts
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"runtime"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
// ValidateEnv validates an environment variable and returns it.
|
||
|
// If no value is specified, it returns the current value using os.Getenv.
|
||
|
//
|
||
|
// As on ParseEnvFile and related to #16585, environment variable names
|
||
|
// are not validate what so ever, it's up to application inside docker
|
||
|
// to validate them or not.
|
||
|
//
|
||
|
// The only validation here is to check if name is empty, per #25099
|
||
|
func ValidateEnv(val string) (string, error) {
|
||
|
arr := strings.Split(val, "=")
|
||
|
if arr[0] == "" {
|
||
|
return "", errors.Errorf("invalid environment variable: %s", val)
|
||
|
}
|
||
|
if len(arr) > 1 {
|
||
|
return val, nil
|
||
|
}
|
||
|
if !doesEnvExist(val) {
|
||
|
return val, nil
|
||
|
}
|
||
|
return fmt.Sprintf("%s=%s", val, os.Getenv(val)), nil
|
||
|
}
|
||
|
|
||
|
func doesEnvExist(name string) bool {
|
||
|
for _, entry := range os.Environ() {
|
||
|
parts := strings.SplitN(entry, "=", 2)
|
||
|
if runtime.GOOS == "windows" {
|
||
|
// Environment variable are case-insensitive on Windows. PaTh, path and PATH are equivalent.
|
||
|
if strings.EqualFold(parts[0], name) {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
if parts[0] == name {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|