in nginx/nginx.go [157:231]
func Run(config Config, params map[string]interface{}, opts ...Option) error {
if err := config.applyDefaults(); err != nil {
return fmt.Errorf("invalid config: %s", err)
}
if config.Name == "" && config.TemplatePath == "" {
return errors.New("invalid config: name or template_path required")
}
if config.CacheDir == "" {
return errors.New("invalid config: cache_dir required")
}
for _, opt := range opts {
opt(&config)
}
// Create root directory for generated files for nginx.
if err := os.MkdirAll(_genDir, 0775); err != nil {
return err
}
if config.tls.Server.Disabled {
log.Warn("Server TLS is disabled")
} else {
for _, s := range append(
config.tls.CAs,
config.tls.Server.Cert,
config.tls.Server.Key,
config.tls.Server.Passphrase) {
if _, err := os.Stat(s.Path); err != nil {
return fmt.Errorf("invalid TLS config: %s", err)
}
}
// Concat all ca files into bundle.
cabundle, err := os.Create(_clientCABundle)
if err != nil {
return fmt.Errorf("create cabundle: %s", err)
}
if err := config.tls.WriteCABundle(cabundle); err != nil {
return fmt.Errorf("write cabundle: %s", err)
}
cabundle.Close()
}
if err := os.MkdirAll(config.CacheDir, 0775); err != nil {
return err
}
if err := config.inject(params); err != nil {
return err
}
src, err := config.Build(params)
if err != nil {
return fmt.Errorf("build nginx config: %s", err)
}
conf := filepath.Join(_genDir, config.Name)
if err := ioutil.WriteFile(conf, src, 0755); err != nil {
return fmt.Errorf("write src: %s", err)
}
stdout, err := os.OpenFile(config.StdoutLogPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return fmt.Errorf("open stdout log: %s", err)
}
args := []string{config.Binary, "-g", "daemon off;", "-c", conf}
if config.Root {
args = append([]string{"sudo"}, args...)
}
cmd := exec.Command(args[0], args[1:]...)
cmd.Stdout = stdout
cmd.Stderr = stdout
return cmd.Run()
}