mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	These validators are only used by runconfig.Parse() or some other part of the client, so move them into the client-side package. Signed-off-by: Daniel Nephin <dnephin@docker.com>
		
			
				
	
	
		
			67 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package opts
 | 
						|
 | 
						|
import (
 | 
						|
	"bufio"
 | 
						|
	"fmt"
 | 
						|
	"os"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
// ParseEnvFile reads a file with environment variables enumerated by lines
 | 
						|
//
 | 
						|
// ``Environment variable names used by the utilities in the Shell and
 | 
						|
// Utilities volume of IEEE Std 1003.1-2001 consist solely of uppercase
 | 
						|
// letters, digits, and the '_' (underscore) from the characters defined in
 | 
						|
// Portable Character Set and do not begin with a digit. *But*, other
 | 
						|
// characters may be permitted by an implementation; applications shall
 | 
						|
// tolerate the presence of such names.''
 | 
						|
// -- http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html
 | 
						|
//
 | 
						|
// As of #16585, it's up to application inside docker to validate or not
 | 
						|
// environment variables, that's why we just strip leading whitespace and
 | 
						|
// nothing more.
 | 
						|
func ParseEnvFile(filename string) ([]string, error) {
 | 
						|
	fh, err := os.Open(filename)
 | 
						|
	if err != nil {
 | 
						|
		return []string{}, err
 | 
						|
	}
 | 
						|
	defer fh.Close()
 | 
						|
 | 
						|
	lines := []string{}
 | 
						|
	scanner := bufio.NewScanner(fh)
 | 
						|
	for scanner.Scan() {
 | 
						|
		// trim the line from all leading whitespace first
 | 
						|
		line := strings.TrimLeft(scanner.Text(), whiteSpaces)
 | 
						|
		// line is not empty, and not starting with '#'
 | 
						|
		if len(line) > 0 && !strings.HasPrefix(line, "#") {
 | 
						|
			data := strings.SplitN(line, "=", 2)
 | 
						|
 | 
						|
			// trim the front of a variable, but nothing else
 | 
						|
			variable := strings.TrimLeft(data[0], whiteSpaces)
 | 
						|
			if strings.ContainsAny(variable, whiteSpaces) {
 | 
						|
				return []string{}, ErrBadEnvVariable{fmt.Sprintf("variable '%s' has white spaces", variable)}
 | 
						|
			}
 | 
						|
 | 
						|
			if len(data) > 1 {
 | 
						|
 | 
						|
				// pass the value through, no trimming
 | 
						|
				lines = append(lines, fmt.Sprintf("%s=%s", variable, data[1]))
 | 
						|
			} else {
 | 
						|
				// if only a pass-through variable is given, clean it up.
 | 
						|
				lines = append(lines, fmt.Sprintf("%s=%s", strings.TrimSpace(line), os.Getenv(line)))
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return lines, scanner.Err()
 | 
						|
}
 | 
						|
 | 
						|
var whiteSpaces = " \t"
 | 
						|
 | 
						|
// ErrBadEnvVariable typed error for bad environment variable
 | 
						|
type ErrBadEnvVariable struct {
 | 
						|
	msg string
 | 
						|
}
 | 
						|
 | 
						|
func (e ErrBadEnvVariable) Error() string {
 | 
						|
	return fmt.Sprintf("poorly formatted environment: %s", e.msg)
 | 
						|
}
 |