// makeSnapHookEnv returns an environment suitable for passing to // os/exec.Cmd.Env // // The returned environment contains additional SNAP_* variables that // are required when calling a meta/hook/ script and that will override // any already existing SNAP_* variables in os.Environment() func makeSnapHookEnv(part *SnapPart) (env []string) { desc := struct { AppName string AppArch string AppPath string Version string UdevAppName string Origin string }{ part.Name(), helpers.UbuntuArchitecture(), part.basedir, part.Version(), QualifiedName(part), part.Origin(), } snapEnv := helpers.MakeMapFromEnvList(helpers.GetBasicSnapEnvVars(desc)) // merge regular env and new snapEnv envMap := helpers.MakeMapFromEnvList(os.Environ()) for k, v := range snapEnv { envMap[k] = v } // flatten for k, v := range envMap { env = append(env, fmt.Sprintf("%s=%s", k, v)) } return env }
[Service] ExecStart=/usr/bin/ubuntu-core-launcher app%[2]s aa-profile /apps/app%[2]s/1.0/bin/start Restart=on-failure WorkingDirectory=/apps/app%[2]s/1.0/ Environment="SNAP_APP=app_service_1.0" "TMPDIR=/tmp/snaps/app%[2]s/1.0/tmp" "TEMPDIR=/tmp/snaps/app%[2]s/1.0/tmp" "SNAP_APP_PATH=/apps/app%[2]s/1.0/" "SNAP_APP_DATA_PATH=/var/lib/apps/app%[2]s/1.0/" "SNAP_APP_TMPDIR=/tmp/snaps/app%[2]s/1.0/tmp" "SNAP_NAME=app" "SNAP_VERSION=1.0" "SNAP_ORIGIN=%[3]s" "SNAP_FULLNAME=app%[2]s" "SNAP_ARCH=%[5]s" "SNAP_APP_USER_DATA_PATH=%%h/apps/app%[2]s/1.0/" "SNAPP_APP_PATH=/apps/app%[2]s/1.0/" "SNAPP_APP_DATA_PATH=/var/lib/apps/app%[2]s/1.0/" "SNAPP_APP_TMPDIR=/tmp/snaps/app%[2]s/1.0/tmp" "SNAPPY_APP_ARCH=%[5]s" "SNAPP_APP_USER_DATA_PATH=%%h/apps/app%[2]s/1.0/" ExecStop=/usr/bin/ubuntu-core-launcher app%[2]s aa-profile /apps/app%[2]s/1.0/bin/stop ExecStopPost=/usr/bin/ubuntu-core-launcher app%[2]s aa-profile /apps/app%[2]s/1.0/bin/stop --post TimeoutStopSec=10 %[4]s [Install] WantedBy=multi-user.target ` var ( expectedAppService = fmt.Sprintf(expectedServiceFmt, "After=ubuntu-snappy.frameworks.target\nRequires=ubuntu-snappy.frameworks.target", ".mvo", "mvo", "\n", helpers.UbuntuArchitecture()) expectedFmkService = fmt.Sprintf(expectedServiceFmt, "Before=ubuntu-snappy.frameworks.target\nAfter=ubuntu-snappy.frameworks-pre.target\nRequires=ubuntu-snappy.frameworks-pre.target", "", "", "\n", helpers.UbuntuArchitecture()) expectedDbusService = fmt.Sprintf(expectedServiceFmt, "After=ubuntu-snappy.frameworks.target\nRequires=ubuntu-snappy.frameworks.target", ".mvo", "mvo", "BusName=foo.bar.baz\nType=dbus", helpers.UbuntuArchitecture()) // things that need network expectedNetAppService = fmt.Sprintf(expectedServiceFmt, "After=ubuntu-snappy.frameworks.target\nRequires=ubuntu-snappy.frameworks.target\nAfter=snappy-wait4network.service\nRequires=snappy-wait4network.service", ".mvo", "mvo", "\n", helpers.UbuntuArchitecture()) expectedNetFmkService = fmt.Sprintf(expectedServiceFmt, "Before=ubuntu-snappy.frameworks.target\nAfter=ubuntu-snappy.frameworks-pre.target\nRequires=ubuntu-snappy.frameworks-pre.target\nAfter=snappy-wait4network.service\nRequires=snappy-wait4network.service", "", "", "\n", helpers.UbuntuArchitecture()) ) func (s *SystemdTestSuite) TestGenAppServiceFile(c *C) { desc := &ServiceDescription{ AppName: "app", ServiceName: "service", Version: "1.0", Description: "descr",
func (s *systemd) GenServiceFile(desc *ServiceDescription) string { serviceTemplate := `[Unit] Description={{.Description}} {{if .IsFramework}}Before=ubuntu-snappy.frameworks.target After=ubuntu-snappy.frameworks-pre.target{{ if .Socket }} {{.SocketFileName}}{{end}} Requires=ubuntu-snappy.frameworks-pre.target{{ if .Socket }} {{.SocketFileName}}{{end}}{{else}}After=ubuntu-snappy.frameworks.target{{ if .Socket }} {{.SocketFileName}}{{end}} Requires=ubuntu-snappy.frameworks.target{{ if .Socket }} {{.SocketFileName}}{{end}}{{end}}{{if .IsNetworked}} After=snappy-wait4network.service Requires=snappy-wait4network.service{{end}} X-Snappy=yes [Service] ExecStart=/usr/bin/ubuntu-core-launcher {{.UdevAppName}} {{.AaProfile}} {{.FullPathStart}} Restart=on-failure WorkingDirectory={{.AppPath}} Environment="SNAP_APP={{.AppTriple}}" {{.EnvVars}} {{if .Stop}}ExecStop=/usr/bin/ubuntu-core-launcher {{.UdevAppName}} {{.AaProfile}} {{.FullPathStop}}{{end}} {{if .PostStop}}ExecStopPost=/usr/bin/ubuntu-core-launcher {{.UdevAppName}} {{.AaProfile}} {{.FullPathPostStop}}{{end}} {{if .StopTimeout}}TimeoutStopSec={{.StopTimeout.Seconds}}{{end}} {{if .BusName}}BusName={{.BusName}} Type=dbus{{else}}{{if .Forking}}Type=forking{{end}} {{end}} [Install] WantedBy={{.ServiceSystemdTarget}} ` var templateOut bytes.Buffer t := template.Must(template.New("wrapper").Parse(serviceTemplate)) origin := "" if len(desc.UdevAppName) > len(desc.AppName) { origin = desc.UdevAppName[len(desc.AppName)+1:] } wrapperData := struct { // the service description ServiceDescription // and some composed values FullPathStart string FullPathStop string FullPathPostStop string AppTriple string ServiceSystemdTarget string Origin string AppArch string Home string EnvVars string SocketFileName string }{ *desc, filepath.Join(desc.AppPath, desc.Start), filepath.Join(desc.AppPath, desc.Stop), filepath.Join(desc.AppPath, desc.PostStop), fmt.Sprintf("%s_%s_%s", desc.AppName, desc.ServiceName, desc.Version), servicesSystemdTarget, origin, helpers.UbuntuArchitecture(), "%h", "", desc.SocketFileName, } allVars := helpers.GetBasicSnapEnvVars(wrapperData) allVars = append(allVars, helpers.GetUserSnapEnvVars(wrapperData)...) allVars = append(allVars, helpers.GetDeprecatedBasicSnapEnvVars(wrapperData)...) allVars = append(allVars, helpers.GetDeprecatedUserSnapEnvVars(wrapperData)...) wrapperData.EnvVars = "\"" + strings.Join(allVars, "\" \"") + "\"" // allVars won't be empty 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() }
package snappy import ( "github.com/ubuntu-core/snappy/helpers" ) // ArchitectureType is the type for a supported snappy architecture type ArchitectureType string const ( // Archi386 is the i386 architecture Archi386 ArchitectureType = "i386" // ArchAmd64 is the amd64 architecture ArchAmd64 = "amd64" // ArchArmhf is the armhf architecture ArchArmhf = "armhf" ) var arch = ArchitectureType(helpers.UbuntuArchitecture()) // Architecture returns the native architecture that snappy runs on func Architecture() ArchitectureType { return arch } // SetArchitecture allows overriding the auto detected Architecture func SetArchitecture(newArch ArchitectureType) { arch = newArch }