// loadConfigs loads configuration from a file or stdin (piped). // The configurations are grouped by bind address. // Configuration is obtained from one of four sources, tried // in this order: 1. -conf flag, 2. stdin, 3. command line argument 4. Caddyfile. // If none of those are available, a default configuration is loaded. func loadConfigs() (config.Group, error) { // -conf flag if conf != "" { file, err := os.Open(conf) if err != nil { return nil, err } defer file.Close() return config.Load(path.Base(conf), file) } // stdin fi, err := os.Stdin.Stat() if err == nil && fi.Mode()&os.ModeCharDevice == 0 { // Note that a non-nil error is not a problem. Windows // will not create a stdin if there is no pipe, which // produces an error when calling Stat(). But Unix will // make one either way, which is why we also check that // bitmask. confBody, err := ioutil.ReadAll(os.Stdin) if err != nil { log.Fatal(err) } if len(confBody) > 0 { return config.Load("stdin", bytes.NewReader(confBody)) } } // Command line Arg if flag.NArg() > 0 { confBody := ":" + config.DefaultPort + "\n" + strings.Join(flag.Args(), "\n") return config.Load("args", bytes.NewBufferString(confBody)) } // Caddyfile file, err := os.Open(config.DefaultConfigFile) if err != nil { if os.IsNotExist(err) { return config.Default() } return nil, err } defer file.Close() return config.Load(config.DefaultConfigFile, file) }
// loadConfigs loads configuration from a file or stdin (piped). // Configuration is obtained from one of three sources, tried // in this order: 1. -conf flag, 2. stdin, 3. Caddyfile. // If none of those are available, a default configuration is // loaded. func loadConfigs() ([]server.Config, error) { // -conf flag if conf != "" { file, err := os.Open(conf) if err != nil { return []server.Config{}, err } defer file.Close() return config.Load(path.Base(conf), file) } // stdin fi, err := os.Stdin.Stat() if err == nil && fi.Mode()&os.ModeCharDevice == 0 { // Note that a non-nil error is not a problem. Windows // will not create a stdin if there is no pipe, which // produces an error when calling Stat(). But Unix will // make one either way, which is why we also check that // bitmask. confBody, err := ioutil.ReadAll(os.Stdin) if err != nil { log.Fatal(err) } if len(confBody) > 0 { return config.Load("stdin", bytes.NewReader(confBody)) } } // Caddyfile file, err := os.Open(config.DefaultConfigFile) if err != nil { if os.IsNotExist(err) { return []server.Config{config.Default()}, nil } return []server.Config{}, err } defer file.Close() return config.Load(config.DefaultConfigFile, file) }