MM-17087 - Disable plugin on removal (#11779)
* MM-17087 - Disable plugin on removal * Updated documentation * Got reid of notifyPluginEvents * Updated documentation * Added plugin installation/activatoin flow as a toplevel go doc in plugin_install.go * Generating webapp bundle on plugin installation * Fixed shadowing issue * Updated doc to include unguarded race condition * Renamed GenerateWebappBundle * Added a debug log when peers are not ready to notify * Updated docs * Removed extra line
Этот коммит содержится в:
@@ -217,38 +217,11 @@ func (env *Environment) Activate(id string) (manifest *model.Manifest, activated
|
||||
componentActivated := false
|
||||
|
||||
if pluginInfo.Manifest.HasWebapp() {
|
||||
bundlePath := filepath.Clean(pluginInfo.Manifest.Webapp.BundlePath)
|
||||
if bundlePath == "" || bundlePath[0] == '.' {
|
||||
return nil, false, fmt.Errorf("invalid webapp bundle path")
|
||||
}
|
||||
bundlePath = filepath.Join(env.pluginDir, id, bundlePath)
|
||||
destinationPath := filepath.Join(env.webappPluginDir, id)
|
||||
|
||||
if err := os.RemoveAll(destinationPath); err != nil {
|
||||
return nil, false, errors.Wrapf(err, "unable to remove old webapp bundle directory: %v", destinationPath)
|
||||
}
|
||||
|
||||
if err := utils.CopyDir(filepath.Dir(bundlePath), destinationPath); err != nil {
|
||||
return nil, false, errors.Wrapf(err, "unable to copy webapp bundle directory: %v", id)
|
||||
}
|
||||
|
||||
sourceBundleFilepath := filepath.Join(destinationPath, filepath.Base(bundlePath))
|
||||
|
||||
sourceBundleFileContents, err := ioutil.ReadFile(sourceBundleFilepath)
|
||||
updatedManifest, err := env.UnpackWebappBundle(id)
|
||||
if err != nil {
|
||||
return nil, false, errors.Wrapf(err, "unable to read webapp bundle: %v", id)
|
||||
}
|
||||
|
||||
hash := fnv.New64a()
|
||||
hash.Write(sourceBundleFileContents)
|
||||
pluginInfo.Manifest.Webapp.BundleHash = hash.Sum([]byte{})
|
||||
|
||||
if err := os.Rename(
|
||||
sourceBundleFilepath,
|
||||
filepath.Join(destinationPath, fmt.Sprintf("%s_%x_bundle.js", id, pluginInfo.Manifest.Webapp.BundleHash)),
|
||||
); err != nil {
|
||||
return nil, false, errors.Wrapf(err, "unable to rename webapp bundle: %v", id)
|
||||
return nil, false, errors.Wrapf(err, "unable to generate webapp bundle: %v", id)
|
||||
}
|
||||
pluginInfo.Manifest.Webapp.BundleHash = updatedManifest.Webapp.BundleHash
|
||||
|
||||
componentActivated = true
|
||||
}
|
||||
@@ -327,6 +300,63 @@ func (env *Environment) Shutdown() {
|
||||
})
|
||||
}
|
||||
|
||||
// UnpackWebappBundle unpacks webapp bundle for a given plugin id on disk.
|
||||
func (env *Environment) UnpackWebappBundle(id string) (*model.Manifest, error) {
|
||||
plugins, err := env.Available()
|
||||
if err != nil {
|
||||
return nil, errors.New("Unable to get available plugins")
|
||||
}
|
||||
var manifest *model.Manifest
|
||||
for _, p := range plugins {
|
||||
if p.Manifest != nil && p.Manifest.Id == id {
|
||||
if manifest != nil {
|
||||
return nil, fmt.Errorf("multiple plugins found: %v", id)
|
||||
}
|
||||
manifest = p.Manifest
|
||||
}
|
||||
}
|
||||
if manifest == nil {
|
||||
return nil, fmt.Errorf("plugin not found: %v", id)
|
||||
}
|
||||
|
||||
bundlePath := filepath.Clean(manifest.Webapp.BundlePath)
|
||||
if bundlePath == "" || bundlePath[0] == '.' {
|
||||
return nil, fmt.Errorf("invalid webapp bundle path")
|
||||
}
|
||||
bundlePath = filepath.Join(env.pluginDir, id, bundlePath)
|
||||
destinationPath := filepath.Join(env.webappPluginDir, id)
|
||||
|
||||
if err = os.RemoveAll(destinationPath); err != nil {
|
||||
return nil, errors.Wrapf(err, "unable to remove old webapp bundle directory: %v", destinationPath)
|
||||
}
|
||||
|
||||
if err = utils.CopyDir(filepath.Dir(bundlePath), destinationPath); err != nil {
|
||||
return nil, errors.Wrapf(err, "unable to copy webapp bundle directory: %v", id)
|
||||
}
|
||||
|
||||
sourceBundleFilepath := filepath.Join(destinationPath, filepath.Base(bundlePath))
|
||||
|
||||
sourceBundleFileContents, err := ioutil.ReadFile(sourceBundleFilepath)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "unable to read webapp bundle: %v", id)
|
||||
}
|
||||
|
||||
hash := fnv.New64a()
|
||||
if _, err = hash.Write(sourceBundleFileContents); err != nil {
|
||||
return nil, errors.Wrapf(err, "unable to generate hash for webapp bundle: %v", id)
|
||||
}
|
||||
manifest.Webapp.BundleHash = hash.Sum([]byte{})
|
||||
|
||||
if err = os.Rename(
|
||||
sourceBundleFilepath,
|
||||
filepath.Join(destinationPath, fmt.Sprintf("%s_%x_bundle.js", id, manifest.Webapp.BundleHash)),
|
||||
); err != nil {
|
||||
return nil, errors.Wrapf(err, "unable to rename webapp bundle: %v", id)
|
||||
}
|
||||
|
||||
return manifest, nil
|
||||
}
|
||||
|
||||
// HooksForPlugin returns the hooks API for the plugin with the given id.
|
||||
//
|
||||
// Consider using RunMultiPluginHook instead.
|
||||
|
||||
Ссылка в новой задаче
Block a user