func (p *pluginControl) returnPluginDetails(rp *core.RequestedPlugin) (*pluginDetails, serror.SnapError) { details := &pluginDetails{} var serr serror.SnapError //Check plugin signing details.Signed, serr = p.verifySignature(rp) if serr != nil { return nil, serr } details.Path = rp.Path() details.CheckSum = rp.CheckSum() details.Signature = rp.Signature() details.IsAutoLoaded = rp.AutoLoaded() if filepath.Ext(rp.Path()) == ".aci" { f, err := os.Open(rp.Path()) if err != nil { return nil, serror.New(err) } defer f.Close() if err := aci.Validate(f); err != nil { return nil, serror.New(err) } tempPath, err := aci.Extract(f) if err != nil { return nil, serror.New(err) } details.ExecPath = path.Join(tempPath, "rootfs") if details.Manifest, err = aci.Manifest(f); err != nil { return nil, serror.New(err) } details.Exec = details.Manifest.App.Exec[0] details.IsPackage = true } else { details.IsPackage = false details.Exec = filepath.Base(rp.Path()) details.ExecPath = filepath.Dir(rp.Path()) } return details, nil }
func (r *runner) runPlugin(details *pluginDetails) error { if details.IsPackage { f, err := os.Open(details.Path) if err != nil { return err } defer f.Close() tempPath, err := aci.Extract(f) if err != nil { return err } details.ExecPath = path.Join(tempPath, "rootfs") } ePlugin, err := plugin.NewExecutablePlugin(r.pluginManager.GenerateArgs(int(log.GetLevel())), path.Join(details.ExecPath, details.Exec)) if err != nil { runnerLog.WithFields(log.Fields{ "_block": "run-plugin", "path": path.Join(details.ExecPath, details.Exec), "error": err, }).Error("error creating executable plugin") return err } ap, err := r.startPlugin(ePlugin) if err != nil { runnerLog.WithFields(log.Fields{ "_block": "run-plugin", "path": path.Join(details.ExecPath, details.Exec), "error": err, }).Error("error starting new plugin") return err } ap.exec = details.Exec ap.execPath = details.ExecPath if details.IsPackage { ap.fromPackage = true } return nil }