// SPDX-FileCopyrightText: 2025 Romain Maneschi // // SPDX-License-Identifier: EUPL-1.2 package plugin import ( "io/fs" "os" "github.com/samber/oops" "gitroot.dev/server/logger" ) // Sync add/remove wasm package in global forge directory func (m *Manager) Sync(fileContent []byte) error { errorHandler := oops.With("pluginsDataDir", m.conf.PathDataPlugin()).With("file", fileContent) needReloadPlugins := false plugins, err := ParsePlugins(fileContent, false) if err != nil { return oops.Wrapf(err, "can't parse plugins from sync") } entries, err := os.ReadDir(m.conf.PathDataPlugin()) if err != nil { if os.IsNotExist(err) { if err := os.MkdirAll(m.conf.PathDataPlugin(), os.ModePerm); err != nil { return errorHandler.Wrapf(err, "can't create plugin directory") } entries = make([]fs.DirEntry, 0) } else { return errorHandler.Wrapf(err, "can't read directory") } } for _, plugin := range plugins { found := false for _, e := range entries { if e.Name() == plugin.Name { found = true m.logger.Debug("check that plugin is downloaded", logger.NewLoggerPair("name", plugin.Name), logger.NewLoggerPair("path", m.PathWasm(plugin))) if _, err := os.Stat(m.PathWasm(plugin)); err != nil { needReloadPlugins = true if err := m.update(plugin); err != nil { m.logger.Error("can't update", err, logger.NewLoggerPair("name", plugin.Name), logger.NewLoggerPair("url", plugin.Url)) } } break } } if !found { if err := m.add(plugin); err != nil { m.logger.Error("can't add", err, logger.NewLoggerPair("name", plugin.Name), logger.NewLoggerPair("url", plugin.Url)) continue } needReloadPlugins = true } } for _, e := range entries { found := false for _, plugin := range plugins { if e.Name() == plugin.Name { found = true break } } if !found { if err := os.Remove(m.conf.GetDirPathDataPlugin(e.Name())); err != nil { m.logger.Error("can't delete", err, logger.NewLoggerPair("name", e.Name())) continue } needReloadPlugins = true } } if needReloadPlugins { m.logger.Info("need reload plugin") m.reloadPlugins() //todo need to clean module of wazero } return nil } func (m *Manager) add(plugin Plugin) error { if plugin.Name == "" { plugin = plugin.DetermineNameAndVersionFromUrl() } if err := os.MkdirAll(m.conf.GetDirPathDataPlugin(plugin.Name), os.ModePerm); err != nil { return oops.With("plugin", plugin.Name).Wrapf(err, "can't MkdirAll") } if err := m.Install(plugin); err != nil { return oops.With("plugin", plugin.Url).Wrapf(err, "can't copy plugin") } return nil } func (m *Manager) update(plugin Plugin) error { if err := m.Install(plugin); err != nil { return oops.With("plugin", plugin.Url).Wrapf(err, "can't copy plugin for update") } return nil }