// normalize adjusts the conf to more standardized content and // returns a new Conf with that updated content. It also returns the // content of any script file that should accompany the conf. func normalize(name string, conf common.Conf, scriptPath string, renderer confRenderer) (common.Conf, []byte) { var data []byte var cmds []string if conf.Logfile != "" { filename := conf.Logfile cmds = append(cmds, "# Set up logging.") cmds = append(cmds, renderer.Touch(filename, nil)...) // TODO(ericsnow) We should drop the assumption that the logfile // is syslog. user, group := syslogUserGroup() cmds = append(cmds, renderer.Chown(filename, user, group)...) cmds = append(cmds, renderer.Chmod(filename, 0600)...) cmds = append(cmds, renderer.RedirectOutput(filename)...) cmds = append(cmds, renderer.RedirectFD("out", "err")...) cmds = append(cmds, "", "# Run the script.", ) // We leave conf.Logfile alone (it will be ignored during validation). } cmds = append(cmds, conf.ExecStart) if conf.ExtraScript != "" { cmds = append([]string{conf.ExtraScript}, cmds...) conf.ExtraScript = "" } if !isSimpleCommand(strings.Join(cmds, "\n")) { data = renderer.RenderScript(cmds) conf.ExecStart = scriptPath } if len(conf.Env) == 0 { conf.Env = nil } if len(conf.Limit) == 0 { conf.Limit = nil } if conf.Transient { // TODO(ericsnow) Handle Transient via systemd-run command? conf.ExecStopPost = commands{}.disable(name) } return conf, data }