func removePackageServices(m *snapYaml, baseDir string, inter interacter) error { sysd := systemd.New(dirs.GlobalRootDir, inter) for _, app := range m.Apps { if app.Daemon == "" { continue } serviceName := filepath.Base(generateServiceFileName(m, app)) if err := sysd.Disable(serviceName); err != nil { return err } if err := sysd.Stop(serviceName, time.Duration(app.StopTimeout)); err != nil { if !systemd.IsTimeout(err) { return err } inter.Notify(fmt.Sprintf("%s refused to stop, killing.", serviceName)) // ignore errors for kill; nothing we'd do differently at this point sysd.Kill(serviceName, "TERM") time.Sleep(killWait) sysd.Kill(serviceName, "KILL") } if err := os.Remove(generateServiceFileName(m, app)); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove service file for %q: %v", serviceName, err) } if err := os.Remove(generateSocketFileName(m, app)); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove socket file for %q: %v", serviceName, err) } // Also remove DBus system policy file if err := os.Remove(generateBusPolicyFileName(m, app)); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove bus policy file for service %q: %v", serviceName, err) } } // only reload if we actually had services // FIXME: filter for services if len(m.Apps) > 0 { if err := sysd.DaemonReload(); err != nil { return err } } return nil }
func removePackageServices(s *snap.Info, inter interacter) error { sysd := systemd.New(dirs.GlobalRootDir, inter) nservices := 0 for _, app := range s.Apps { if app.Daemon == "" { continue } nservices++ serviceName := filepath.Base(app.ServiceFile()) if err := sysd.Disable(serviceName); err != nil { return err } if err := sysd.Stop(serviceName, serviceStopTimeout(app)); err != nil { if !systemd.IsTimeout(err) { return err } inter.Notify(fmt.Sprintf("%s refused to stop, killing.", serviceName)) // ignore errors for kill; nothing we'd do differently at this point sysd.Kill(serviceName, "TERM") time.Sleep(killWait) sysd.Kill(serviceName, "KILL") } if err := os.Remove(app.ServiceFile()); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove service file for %q: %v", serviceName, err) } if err := os.Remove(app.ServiceSocketFile()); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove socket file for %q: %v", serviceName, err) } } // only reload if we actually had services if nservices > 0 { if err := sysd.DaemonReload(); err != nil { return err } } return nil }