func generateWrappers(s *snap.Info) error { // add the CLI apps from the snap.yaml if err := wrappers.AddSnapBinaries(s); err != nil { return err } // add the daemons from the snap.yaml if err := wrappers.AddSnapServices(s, &progress.NullProgress{}); err != nil { return err } // add the desktop files if err := wrappers.AddSnapDesktopFiles(s); err != nil { return err } return nil }
// patch5: // - regenerate generated .service files func patch5(st *state.State) error { log := log{} snapStates, err := snapstate.All(st) if err != nil { return err } for snapName, snapState := range snapStates { if !snapState.Active { continue } info, err := snapState.CurrentInfo() if err != nil { return err } if len(info.Apps) == 0 { logger.Debugf("patch 5: skipping for %q: no apps", snapName) continue } err = wrappers.StopSnapServices(info, log) if err != nil { return err } err = wrappers.AddSnapServices(info, log) if err != nil { return err } err = wrappers.StartSnapServices(info, log) if err != nil { return err } logger.Noticef("patch 5: %q updated", snapName) } return nil }
func (s *servicesTestSuite) TestAddSnapServicesAndRemove(c *C) { var sysdLog [][]string systemd.SystemctlCmd = func(cmd ...string) ([]byte, error) { sysdLog = append(sysdLog, cmd) return []byte("ActiveState=inactive\n"), nil } info := snaptest.MockSnap(c, packageHello, contentsHello, &snap.SideInfo{Revision: snap.R(12)}) err := wrappers.AddSnapServices(info, nil) c.Assert(err, IsNil) svcFile := filepath.Join(s.tempdir, "/etc/systemd/system/snap.hello-snap.svc1.service") content, err := ioutil.ReadFile(svcFile) c.Assert(err, IsNil) verbs := []string{"Start", "Stop", "StopPost"} cmds := []string{"", " --command=stop", " --command=post-stop"} for i := range verbs { expected := fmt.Sprintf("Exec%s=/usr/bin/snap run%s hello-snap.svc1", verbs[i], cmds[i]) c.Check(string(content), Matches, "(?ms).*^"+regexp.QuoteMeta(expected)) // check.v1 adds ^ and $ around the regexp provided } sysdLog = nil err = wrappers.StopSnapServices(info, &progress.NullProgress{}) c.Assert(err, IsNil) c.Assert(sysdLog, HasLen, 2) c.Check(sysdLog, DeepEquals, [][]string{ {"stop", filepath.Base(svcFile)}, {"show", "--property=ActiveState", "snap.hello-snap.svc1.service"}, }) sysdLog = nil err = wrappers.RemoveSnapServices(info, &progress.NullProgress{}) c.Assert(err, IsNil) c.Check(osutil.FileExists(svcFile), Equals, false) c.Assert(sysdLog, HasLen, 2) c.Check(sysdLog[0], DeepEquals, []string{"--root", dirs.GlobalRootDir, "disable", filepath.Base(svcFile)}) c.Check(sysdLog[1], DeepEquals, []string{"daemon-reload"}) }
func (s *servicesTestSuite) TestRemoveSnapPackageFallbackToKill(c *C) { restore := wrappers.MockKillWait(200 * time.Millisecond) defer restore() var sysdLog [][]string systemd.SystemctlCmd = func(cmd ...string) ([]byte, error) { // filter out the "systemctl show" that // StopSnapServicesGenerates if cmd[0] != "show" { sysdLog = append(sysdLog, cmd) } return []byte("ActiveState=active\n"), nil } info := snaptest.MockSnap(c, `name: wat version: 42 apps: wat: command: wat stop-timeout: 250ms daemon: forking `, "", &snap.SideInfo{Revision: snap.R(11)}) err := wrappers.AddSnapServices(info, nil) c.Assert(err, IsNil) sysdLog = nil svcFName := "snap.wat.wat.service" err = wrappers.StopSnapServices(info, &progress.NullProgress{}) c.Assert(err, IsNil) c.Check(sysdLog, DeepEquals, [][]string{ {"stop", svcFName}, // check kill invocations {"kill", svcFName, "-s", "TERM"}, {"kill", svcFName, "-s", "KILL"}, }) }