func Run()

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()
}