func genSocketFile(appInfo *snap.AppInfo) string { serviceTemplate := `[Unit] # Auto-generated, DO NO EDIT Description=Socket for snap application {{.App.Snap.Name}}.{{.App.Name}} PartOf={{.ServiceFileName}} X-Snappy=yes [Socket] ListenStream={{.App.ListenStream}} {{if .App.SocketMode}}SocketMode={{.App.SocketMode}}{{end}} [Install] WantedBy={{.SocketTargetUnit}} ` var templateOut bytes.Buffer t := template.Must(template.New("wrapper").Parse(serviceTemplate)) wrapperData := struct { App *snap.AppInfo ServiceFileName string SocketTargetUnit string }{ App: appInfo, ServiceFileName: filepath.Base(appInfo.ServiceFile()), SocketTargetUnit: systemd.SocketsTarget, } if err := t.Execute(&templateOut, wrapperData); err != nil { // this can never happen, except we forget a variable logger.Panicf("Unable to execute template: %v", err) } return templateOut.String() }