gopkg.in/dotcloud/docker.v1@v1.13.1/cliconfig/config.go (about)

     1  package cliconfig
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/docker/docker/api/types"
    10  	"github.com/docker/docker/cliconfig/configfile"
    11  	"github.com/docker/docker/pkg/homedir"
    12  )
    13  
    14  const (
    15  	// ConfigFileName is the name of config file
    16  	ConfigFileName = "config.json"
    17  	configFileDir  = ".docker"
    18  	oldConfigfile  = ".dockercfg"
    19  )
    20  
    21  var (
    22  	configDir = os.Getenv("DOCKER_CONFIG")
    23  )
    24  
    25  func init() {
    26  	if configDir == "" {
    27  		configDir = filepath.Join(homedir.Get(), configFileDir)
    28  	}
    29  }
    30  
    31  // ConfigDir returns the directory the configuration file is stored in
    32  func ConfigDir() string {
    33  	return configDir
    34  }
    35  
    36  // SetConfigDir sets the directory the configuration file is stored in
    37  func SetConfigDir(dir string) {
    38  	configDir = dir
    39  }
    40  
    41  // NewConfigFile initializes an empty configuration file for the given filename 'fn'
    42  func NewConfigFile(fn string) *configfile.ConfigFile {
    43  	return &configfile.ConfigFile{
    44  		AuthConfigs: make(map[string]types.AuthConfig),
    45  		HTTPHeaders: make(map[string]string),
    46  		Filename:    fn,
    47  	}
    48  }
    49  
    50  // LegacyLoadFromReader is a convenience function that creates a ConfigFile object from
    51  // a non-nested reader
    52  func LegacyLoadFromReader(configData io.Reader) (*configfile.ConfigFile, error) {
    53  	configFile := configfile.ConfigFile{
    54  		AuthConfigs: make(map[string]types.AuthConfig),
    55  	}
    56  	err := configFile.LegacyLoadFromReader(configData)
    57  	return &configFile, err
    58  }
    59  
    60  // LoadFromReader is a convenience function that creates a ConfigFile object from
    61  // a reader
    62  func LoadFromReader(configData io.Reader) (*configfile.ConfigFile, error) {
    63  	configFile := configfile.ConfigFile{
    64  		AuthConfigs: make(map[string]types.AuthConfig),
    65  	}
    66  	err := configFile.LoadFromReader(configData)
    67  	return &configFile, err
    68  }
    69  
    70  // Load reads the configuration files in the given directory, and sets up
    71  // the auth config information and returns values.
    72  // FIXME: use the internal golang config parser
    73  func Load(configDir string) (*configfile.ConfigFile, error) {
    74  	if configDir == "" {
    75  		configDir = ConfigDir()
    76  	}
    77  
    78  	configFile := configfile.ConfigFile{
    79  		AuthConfigs: make(map[string]types.AuthConfig),
    80  		Filename:    filepath.Join(configDir, ConfigFileName),
    81  	}
    82  
    83  	// Try happy path first - latest config file
    84  	if _, err := os.Stat(configFile.Filename); err == nil {
    85  		file, err := os.Open(configFile.Filename)
    86  		if err != nil {
    87  			return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err)
    88  		}
    89  		defer file.Close()
    90  		err = configFile.LoadFromReader(file)
    91  		if err != nil {
    92  			err = fmt.Errorf("%s - %v", configFile.Filename, err)
    93  		}
    94  		return &configFile, err
    95  	} else if !os.IsNotExist(err) {
    96  		// if file is there but we can't stat it for any reason other
    97  		// than it doesn't exist then stop
    98  		return &configFile, fmt.Errorf("%s - %v", configFile.Filename, err)
    99  	}
   100  
   101  	// Can't find latest config file so check for the old one
   102  	confFile := filepath.Join(homedir.Get(), oldConfigfile)
   103  	if _, err := os.Stat(confFile); err != nil {
   104  		return &configFile, nil //missing file is not an error
   105  	}
   106  	file, err := os.Open(confFile)
   107  	if err != nil {
   108  		return &configFile, fmt.Errorf("%s - %v", confFile, err)
   109  	}
   110  	defer file.Close()
   111  	err = configFile.LegacyLoadFromReader(file)
   112  	if err != nil {
   113  		return &configFile, fmt.Errorf("%s - %v", confFile, err)
   114  	}
   115  
   116  	if configFile.HTTPHeaders == nil {
   117  		configFile.HTTPHeaders = map[string]string{}
   118  	}
   119  	return &configFile, nil
   120  }