func main() { cmd.ExecInCoreSnap() // magic \o/ snapApp := filepath.Base(os.Args[0]) if osutil.IsSymlink(filepath.Join(dirs.SnapBinariesDir, snapApp)) { cmd := &cmdRun{} args := []string{snapApp} args = append(args, os.Args[1:]...) // this will call syscall.Exec() so it does not return // *unless* there is an error, i.e. we setup a wrong // symlink (or syscall.Exec() fails for strange reasons) err := cmd.Execute(args) fmt.Fprintf(Stderr, i18n.G("internal error, please report: running %q failed: %v\n"), snapApp, err) os.Exit(46) } defer func() { if v := recover(); v != nil { if e, ok := v.(*exitStatus); ok { os.Exit(e.code) } panic(v) } }() // no magic /o\ if err := run(); err != nil { fmt.Fprintf(Stderr, i18n.G("error: %v\n"), err) os.Exit(1) } }
func (ms *mgrsSuite) TestHappyLocalInstall(c *C) { snapYamlContent := `name: foo apps: bar: command: bin/bar ` snapPath := makeTestSnap(c, snapYamlContent+"version: 1.0") st := ms.o.State() st.Lock() defer st.Unlock() ts, err := snapstate.InstallPath(st, &snap.SideInfo{RealName: "foo"}, snapPath, "", snapstate.Flags{DevMode: true}) c.Assert(err, IsNil) chg := st.NewChange("install-snap", "...") chg.AddAll(ts) st.Unlock() err = ms.o.Settle() st.Lock() c.Assert(err, IsNil) c.Assert(chg.Status(), Equals, state.DoneStatus, Commentf("install-snap change failed with: %v", chg.Err())) snap, err := snapstate.CurrentInfo(st, "foo") c.Assert(err, IsNil) // ensure that the binary wrapper file got generated with the right // name binaryWrapper := filepath.Join(dirs.SnapBinariesDir, "foo.bar") c.Assert(osutil.IsSymlink(binaryWrapper), Equals, true) // data dirs c.Assert(osutil.IsDirectory(snap.DataDir()), Equals, true) c.Assert(osutil.IsDirectory(snap.CommonDataDir()), Equals, true) // snap file and its mounting // after install the snap file is in the right dir c.Assert(osutil.FileExists(filepath.Join(dirs.SnapBlobDir, "foo_x1.snap")), Equals, true) // ensure the right unit is created mup := systemd.MountUnitPath("/snap/foo/x1") content, err := ioutil.ReadFile(mup) c.Assert(err, IsNil) c.Assert(string(content), Matches, "(?ms).*^Where=/snap/foo/x1") c.Assert(string(content), Matches, "(?ms).*^What=/var/lib/snapd/snaps/foo_x1.snap") }
func (ms *mgrsSuite) TestHappyAlias(c *C) { st := ms.o.State() st.Lock() defer st.Unlock() fooYaml := `name: foo version: 1.0 apps: foo: command: bin/foo aliases: [foo_] bar: command: bin/bar aliases: [bar,bar1] ` ms.installLocalTestSnap(c, fooYaml) ts, err := snapstate.Alias(st, "foo", []string{"foo_", "bar", "bar1"}) c.Assert(err, IsNil) chg := st.NewChange("alias", "...") chg.AddAll(ts) st.Unlock() err = ms.o.Settle() st.Lock() c.Assert(err, IsNil) c.Assert(chg.Err(), IsNil) c.Assert(chg.Status(), Equals, state.DoneStatus, Commentf("alias change failed with: %v", chg.Err())) foo_Alias := filepath.Join(dirs.SnapBinariesDir, "foo_") dest, err := os.Readlink(foo_Alias) c.Assert(err, IsNil) c.Check(dest, Equals, "foo") barAlias := filepath.Join(dirs.SnapBinariesDir, "bar") dest, err = os.Readlink(barAlias) c.Assert(err, IsNil) c.Check(dest, Equals, "foo.bar") bar1Alias := filepath.Join(dirs.SnapBinariesDir, "bar1") dest, err = os.Readlink(bar1Alias) c.Assert(err, IsNil) c.Check(dest, Equals, "foo.bar") var allAliases map[string]map[string]string err = st.Get("aliases", &allAliases) c.Assert(err, IsNil) c.Check(allAliases, DeepEquals, map[string]map[string]string{ "foo": { "foo_": "enabled", "bar": "enabled", "bar1": "enabled", }, }) ms.removeSnap(c, "foo") c.Check(osutil.IsSymlink(foo_Alias), Equals, false) c.Check(osutil.IsSymlink(barAlias), Equals, false) c.Check(osutil.IsSymlink(bar1Alias), Equals, false) allAliases = nil err = st.Get("aliases", &allAliases) c.Assert(err, IsNil) c.Check(allAliases, HasLen, 0) }
func (ms *mgrsSuite) TestHappyLocalInstallWithStoreMetadata(c *C) { snapDecl := ms.prereqSnapAssertions(c) snapYamlContent := `name: foo apps: bar: command: bin/bar ` snapPath := makeTestSnap(c, snapYamlContent+"version: 1.5") si := &snap.SideInfo{ RealName: "foo", SnapID: fooSnapID, Revision: snap.R(55), DeveloperID: "devdevdevID", Developer: "devdevdev", } st := ms.o.State() st.Lock() defer st.Unlock() // have the snap-declaration in the system db err := assertstate.Add(st, ms.storeSigning.StoreAccountKey("")) c.Assert(err, IsNil) err = assertstate.Add(st, ms.devAcct) c.Assert(err, IsNil) err = assertstate.Add(st, snapDecl) c.Assert(err, IsNil) ts, err := snapstate.InstallPath(st, si, snapPath, "", snapstate.Flags{DevMode: true}) c.Assert(err, IsNil) chg := st.NewChange("install-snap", "...") chg.AddAll(ts) st.Unlock() err = ms.o.Settle() st.Lock() c.Assert(err, IsNil) c.Assert(chg.Status(), Equals, state.DoneStatus, Commentf("install-snap change failed with: %v", chg.Err())) info, err := snapstate.CurrentInfo(st, "foo") c.Assert(err, IsNil) c.Check(info.Revision, Equals, snap.R(55)) c.Check(info.SnapID, Equals, fooSnapID) c.Check(info.DeveloperID, Equals, "devdevdevID") c.Check(info.Developer, Equals, "devdevdev") c.Check(info.Version, Equals, "1.5") // ensure that the binary wrapper file got generated with the right // name binaryWrapper := filepath.Join(dirs.SnapBinariesDir, "foo.bar") c.Assert(osutil.IsSymlink(binaryWrapper), Equals, true) // data dirs c.Assert(osutil.IsDirectory(info.DataDir()), Equals, true) c.Assert(osutil.IsDirectory(info.CommonDataDir()), Equals, true) // snap file and its mounting // after install the snap file is in the right dir c.Assert(osutil.FileExists(filepath.Join(dirs.SnapBlobDir, "foo_55.snap")), Equals, true) // ensure the right unit is created mup := systemd.MountUnitPath("/snap/foo/55") content, err := ioutil.ReadFile(mup) c.Assert(err, IsNil) c.Assert(string(content), Matches, "(?ms).*^Where=/snap/foo/55") c.Assert(string(content), Matches, "(?ms).*^What=/var/lib/snapd/snaps/foo_55.snap") }
func (ms *mgrsSuite) TestHappyRemoteInstallAndUpdateAutoAliases(c *C) { ms.prereqSnapAssertions(c, map[string]interface{}{ "snap-name": "foo", "auto-aliases": []interface{}{"app1"}, }) fooYaml := `name: foo version: @VERSION@ apps: app1: command: bin/app1 aliases: [app1] app2: command: bin/app2 aliases: [app2] ` fooPath, _ := ms.makeStoreTestSnap(c, strings.Replace(fooYaml, "@VERSION@", "1.0", -1), "10") ms.serveSnap(fooPath, "10") mockServer := ms.mockStore(c) defer mockServer.Close() st := ms.o.State() st.Lock() defer st.Unlock() ts, err := snapstate.Install(st, "foo", "stable", snap.R(0), 0, snapstate.Flags{}) c.Assert(err, IsNil) chg := st.NewChange("install-snap", "...") chg.AddAll(ts) st.Unlock() err = ms.o.Settle() st.Lock() c.Assert(err, IsNil) c.Assert(chg.Status(), Equals, state.DoneStatus, Commentf("install-snap change failed with: %v", chg.Err())) info, err := snapstate.CurrentInfo(st, "foo") c.Assert(err, IsNil) c.Check(info.Revision, Equals, snap.R(10)) c.Check(info.Version, Equals, "1.0") var allAliases map[string]map[string]string err = st.Get("aliases", &allAliases) c.Check(err, IsNil) c.Check(allAliases, DeepEquals, map[string]map[string]string{ "foo": { "app1": "auto", }, }) app1Alias := filepath.Join(dirs.SnapBinariesDir, "app1") dest, err := os.Readlink(app1Alias) c.Assert(err, IsNil) c.Check(dest, Equals, "foo.app1") ms.prereqSnapAssertions(c, map[string]interface{}{ "snap-name": "foo", "auto-aliases": []interface{}{"app2"}, "revision": "1", }) // new foo version/revision fooPath, _ = ms.makeStoreTestSnap(c, strings.Replace(fooYaml, "@VERSION@", "1.5", -1), "15") ms.serveSnap(fooPath, "15") // refresh all updated, tss, err := snapstate.UpdateMany(st, nil, 0) c.Assert(err, IsNil) c.Assert(updated, DeepEquals, []string{"foo"}) c.Assert(tss, HasLen, 1) chg = st.NewChange("upgrade-snaps", "...") chg.AddAll(tss[0]) st.Unlock() err = ms.o.Settle() st.Lock() c.Assert(err, IsNil) c.Assert(chg.Status(), Equals, state.DoneStatus, Commentf("upgrade-snap change failed with: %v", chg.Err())) info, err = snapstate.CurrentInfo(st, "foo") c.Assert(err, IsNil) c.Check(info.Revision, Equals, snap.R(15)) c.Check(info.Version, Equals, "1.5") allAliases = nil err = st.Get("aliases", &allAliases) c.Check(err, IsNil) c.Check(allAliases, DeepEquals, map[string]map[string]string{ "foo": { "app2": "auto", }, }) c.Check(osutil.IsSymlink(app1Alias), Equals, false) app2Alias := filepath.Join(dirs.SnapBinariesDir, "app2") dest, err = os.Readlink(app2Alias) c.Assert(err, IsNil) c.Check(dest, Equals, "foo.app2") }