diff --git a/gloomi/main.go b/gloomi/main.go index 3ac3f4c..1a65e26 100644 --- a/gloomi/main.go +++ b/gloomi/main.go @@ -6,6 +6,7 @@ import ( "mime/multipart" "net/rpc" "strings" + "time" "github.com/gofiber/fiber/v3" ) @@ -132,3 +133,4 @@ func (p *GLoomI) RegisterRoutes(router fiber.Router) { // Exported symbol var Plugin GLoomI +var Version = time.Now() diff --git a/go.mod b/go.mod index 9fc5c68..6c8ec41 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/mattn/go-sqlite3 v1.14.24 ) -require github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect +require github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 require ( github.com/BurntSushi/toml v1.5.0 diff --git a/main.go b/main.go index 2d9655d..5ef66c9 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,6 @@ import ( "net/rpc" "os" "os/exec" - "path" "path/filepath" "strconv" "strings" @@ -192,17 +191,17 @@ func NewGloom(proxyManager *sentinel.ProxyManager) (*GLoom, error) { if _, err := embeddedAssets.Open("dist/gloomi.so"); err == nil { // and if the plugin doesn't exist, copy it over // TODO: instead, check if the plugin doesnt exist OR the binary has a newer timestamp than the current version - if err := os.MkdirAll(path.Join(gloom.config.PluginDir, "GLoomI"), 0755); err != nil { + if err := os.MkdirAll(filepath.Join(gloom.config.PluginDir, "GLoomI"), 0755); err != nil { return nil, err } - if _, err := os.Stat(path.Join(gloom.config.PluginDir, "GLoomI", "gloomi.so")); os.IsNotExist(err) { + if _, err := os.Stat(filepath.Join(gloom.config.PluginDir, "GLoomI", "gloomi.so")); os.IsNotExist(err) { gloomiData, err := embeddedAssets.ReadFile("dist/gloomi.so") if err != nil { return nil, err } - if err := os.WriteFile(path.Join(gloom.config.PluginDir, "GLoomI", "gloomi.so"), gloomiData, 0755); err != nil { + if err := os.WriteFile(filepath.Join(gloom.config.PluginDir, "GLoomI", "gloomi.so"), gloomiData, 0755); err != nil { return nil, err } } @@ -243,15 +242,31 @@ func (gloom *GLoom) Cleanup() error { gloom.StopPlugin(plugin) } - // return nil + return nil } func (gloom *GLoom) LoadInitialPlugins() error { slog.Info("Loading initial plugins") for _, plugin := range gloom.config.PreloadPlugins { - if err := gloom.RegisterPlugin(filepath.Join(gloom.config.PluginDir, plugin.Name, plugin.File), plugin.Name, plugin.Domains); err != nil { - panic(fmt.Errorf("failed to load preload plugin %s: %w (make sure its in %s)", plugin.Name, err, path.Join(gloom.config.PluginDir, plugin.Name))) + // if plugin is in PluginDir, we should move it to its named folder + if _, err := os.Stat(filepath.Join(gloom.config.PluginDir, plugin.File)); err == nil { + slog.Debug("Moving plugin to its named folder", "plugin", plugin.File) + + if err := os.MkdirAll(filepath.Join(gloom.config.PluginDir, plugin.Name), 0755); err != nil { + panic(fmt.Errorf("failed to create plugin folder: %w", err)) + } + + if err := os.Rename(filepath.Join(gloom.config.PluginDir, plugin.File), filepath.Join(gloom.config.PluginDir, plugin.Name, plugin.File)); err != nil { + panic(fmt.Errorf("failed to move plugin to its named folder: %w", err)) + } + } + + slog.Debug("Registering plugin", "plugin", plugin.Name, "pluginPath", plugin.File) + + path := filepath.Join(gloom.config.PluginDir, plugin.Name, plugin.File) + if err := gloom.RegisterPlugin(path, plugin.Name, plugin.Domains); err != nil { + panic(fmt.Errorf("failed to load preload plugin %s: %w (make sure its in %s)", plugin.Name, err, path)) } } @@ -274,6 +289,19 @@ func (gloom *GLoom) LoadInitialPlugins() error { domains := strings.Split(plugin.Domain, ",") + skipPlug := false + for _, domain := range domains { + if _, ok := gloom.ProxyManager.Load(domain); ok { + slog.Error("Preloaded plugin conflicts with existing plugin. Skipping plugin", "plugin", plugin.Name, "pluginPath", plugin.Path, "domain", domain) + skipPlug = true + break + } + } + + if skipPlug { + continue + } + if err := gloom.RegisterPlugin(plugin.Path, plugin.Name, domains); err != nil { slog.Warn("Failed to register plugin", "pluginPath", plugin.Path, "error", err) } @@ -338,30 +366,34 @@ func (gloom *GLoom) RegisterPlugin(pluginPath string, name string, domains []str } } + if _, err := os.Stat(pluginPath); os.IsNotExist(err) { + return fmt.Errorf("plugin does not exist, please ensure it's in %s", pluginPath) + } + slog.Info("Registering plugin", "pluginPath", pluginPath, "domains", domains) pathStr := strconv.FormatUint(uint64(rand.Uint64()), 16) - socketPath := path.Join(gloom.config.PluginDir, name, pathStr+".sock") + socketPath := filepath.Join(gloom.config.PluginDir, name, pathStr+".sock") slog.Debug("Starting pluginHost", "pluginPath", pluginPath) - processPath := path.Join(gloom.gloomDir, "pluginHost") + processPath := filepath.Join(gloom.gloomDir, "pluginHost") args := []string{"--plugin-path", pluginPath, "--socket-path", socketPath} if gloom.config.EnableChroot { - if err := os.MkdirAll(path.Join(gloom.config.PluginDir, name), 0755); err != nil { + if err := os.MkdirAll(filepath.Join(gloom.config.PluginDir, name), 0755); err != nil { return fmt.Errorf("failed to create chroot directory: %w", err) } - args = append(args, "--chroot-dir", path.Join(gloom.config.PluginDir, name)) + args = append(args, "--chroot-dir", filepath.Join(gloom.config.PluginDir, name)) } - files, err := os.ReadDir(path.Join(gloom.config.PluginDir, name)) + files, err := os.ReadDir(filepath.Join(gloom.config.PluginDir, name)) if err != nil { return fmt.Errorf("failed to read pluginDir: %w", err) } - slog.Debug("Removing dead sockets", "pluginDir", path.Join(gloom.config.PluginDir, name)) + slog.Debug("Removing dead sockets", "pluginDir", filepath.Join(gloom.config.PluginDir, name)) for _, file := range files { if file.IsDir() { @@ -370,7 +402,7 @@ func (gloom *GLoom) RegisterPlugin(pluginPath string, name string, domains []str // remove all dead sockets if strings.HasSuffix(file.Name(), ".sock") { - if err := os.Remove(path.Join(gloom.config.PluginDir, name, file.Name())); err != nil { + if err := os.Remove(filepath.Join(gloom.config.PluginDir, name, file.Name())); err != nil { return fmt.Errorf("failed to remove socket: %w", err) } } diff --git a/zqdgr.config.json b/zqdgr.config.json index a6e6b32..1765d2d 100644 --- a/zqdgr.config.json +++ b/zqdgr.config.json @@ -14,5 +14,6 @@ "dev": "zqdgr build && ./dist/gloom" }, "pattern": "**/*.go", + "shutdown_signal": "SIGINT", "excluded_dirs": [] }