func (s *SnapPart) activate(inhibitHooks bool, inter interacter) error { currentActiveSymlink := filepath.Join(s.basedir, "..", "current") currentActiveDir, _ := filepath.EvalSymlinks(currentActiveSymlink) // already active, nothing to do if s.basedir == currentActiveDir { return nil } // there is already an active part if currentActiveDir != "" { // TODO: support switching origins oldYaml := filepath.Join(currentActiveDir, "meta", "package.yaml") oldPart, err := NewInstalledSnapPart(oldYaml, s.origin) if err != nil { return err } if err := oldPart.deactivate(inhibitHooks, inter); err != nil { return err } } if s.Type() == pkg.TypeFramework { if err := policy.Install(s.Name(), s.basedir, dirs.GlobalRootDir); err != nil { return err } } if err := installClickHooks(s.basedir, s.m, s.origin, inhibitHooks); err != nil { // cleanup the failed hooks removeClickHooks(s.m, s.origin, inhibitHooks) return err } // generate the security policy from the package.yaml if err := s.m.addSecurityPolicy(s.basedir); err != nil { return err } // add the "binaries:" from the package.yaml if err := s.m.addPackageBinaries(s.basedir); err != nil { return err } // add the "services:" from the package.yaml if err := s.m.addPackageServices(s.basedir, inhibitHooks, inter); err != nil { return err } if err := os.Remove(currentActiveSymlink); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove %q: %v", currentActiveSymlink, err) } dbase := filepath.Join(dirs.SnapDataDir, QualifiedName(s)) currentDataSymlink := filepath.Join(dbase, "current") if err := os.Remove(currentDataSymlink); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove %q: %v", currentDataSymlink, err) } // symlink is relative to parent dir if err := os.Symlink(filepath.Base(s.basedir), currentActiveSymlink); err != nil { return err } if err := os.MkdirAll(filepath.Join(dbase, s.Version()), 0755); err != nil { return err } return os.Symlink(filepath.Base(s.basedir), currentDataSymlink) }
func (s *SnapPart) activate(inhibitHooks bool, inter interacter) error { currentActiveSymlink := filepath.Join(s.basedir, "..", "current") currentActiveDir, _ := filepath.EvalSymlinks(currentActiveSymlink) // already active, nothing to do if s.basedir == currentActiveDir { return nil } // there is already an active part if currentActiveDir != "" { // TODO: support switching origins oldYaml := filepath.Join(currentActiveDir, "meta", "snap.yaml") oldPart, err := NewInstalledSnapPart(oldYaml, s.origin) if err != nil { return err } if err := oldPart.deactivate(inhibitHooks, inter); err != nil { return err } } if s.Type() == snap.TypeFramework { if err := policy.Install(s.Name(), s.basedir, dirs.GlobalRootDir); err != nil { return err } } // generate the security policy from the snap.yaml // Note that this must happen before binaries/services are // generated because serices may get started appsDir := filepath.Join(dirs.SnapSnapsDir, QualifiedName(s), s.Version()) if err := generatePolicy(s.m, appsDir); err != nil { return err } // add the "binaries:" from the snap.yaml if err := addPackageBinaries(s.m, s.basedir); err != nil { return err } // add the "services:" from the snap.yaml if err := addPackageServices(s.m, s.basedir, inhibitHooks, inter); err != nil { return err } if err := os.Remove(currentActiveSymlink); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove %q: %v", currentActiveSymlink, err) } dbase := filepath.Join(dirs.SnapDataDir, QualifiedName(s)) currentDataSymlink := filepath.Join(dbase, "current") if err := os.Remove(currentDataSymlink); err != nil && !os.IsNotExist(err) { logger.Noticef("Failed to remove %q: %v", currentDataSymlink, err) } // symlink is relative to parent dir if err := os.Symlink(filepath.Base(s.basedir), currentActiveSymlink); err != nil { return err } if err := os.MkdirAll(filepath.Join(dbase, s.Version()), 0755); err != nil { return err } // FIXME: create {Os,Kernel}Snap type instead of adding special // cases here if err := setNextBoot(s); err != nil { return err } return os.Symlink(filepath.Base(s.basedir), currentDataSymlink) }