fix build error, replace path with filepath, and small fixes
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
|||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"net/rpc"
|
"net/rpc"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v3"
|
"github.com/gofiber/fiber/v3"
|
||||||
)
|
)
|
||||||
@@ -132,3 +133,4 @@ func (p *GLoomI) RegisterRoutes(router fiber.Router) {
|
|||||||
|
|
||||||
// Exported symbol
|
// Exported symbol
|
||||||
var Plugin GLoomI
|
var Plugin GLoomI
|
||||||
|
var Version = time.Now()
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -7,7 +7,7 @@ require (
|
|||||||
github.com/mattn/go-sqlite3 v1.14.24
|
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 (
|
require (
|
||||||
github.com/BurntSushi/toml v1.5.0
|
github.com/BurntSushi/toml v1.5.0
|
||||||
|
|||||||
60
main.go
60
main.go
@@ -13,7 +13,6 @@ import (
|
|||||||
"net/rpc"
|
"net/rpc"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -192,17 +191,17 @@ func NewGloom(proxyManager *sentinel.ProxyManager) (*GLoom, error) {
|
|||||||
if _, err := embeddedAssets.Open("dist/gloomi.so"); err == nil {
|
if _, err := embeddedAssets.Open("dist/gloomi.so"); err == nil {
|
||||||
// and if the plugin doesn't exist, copy it over
|
// 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
|
// 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
|
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")
|
gloomiData, err := embeddedAssets.ReadFile("dist/gloomi.so")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -243,15 +242,31 @@ func (gloom *GLoom) Cleanup() error {
|
|||||||
gloom.StopPlugin(plugin)
|
gloom.StopPlugin(plugin)
|
||||||
}
|
}
|
||||||
|
|
||||||
// return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gloom *GLoom) LoadInitialPlugins() error {
|
func (gloom *GLoom) LoadInitialPlugins() error {
|
||||||
slog.Info("Loading initial plugins")
|
slog.Info("Loading initial plugins")
|
||||||
|
|
||||||
for _, plugin := range gloom.config.PreloadPlugins {
|
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 {
|
// if plugin is in PluginDir, we should move it to its named folder
|
||||||
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 _, 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, ",")
|
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 {
|
if err := gloom.RegisterPlugin(plugin.Path, plugin.Name, domains); err != nil {
|
||||||
slog.Warn("Failed to register plugin", "pluginPath", plugin.Path, "error", err)
|
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)
|
slog.Info("Registering plugin", "pluginPath", pluginPath, "domains", domains)
|
||||||
|
|
||||||
pathStr := strconv.FormatUint(uint64(rand.Uint64()), 16)
|
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)
|
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}
|
args := []string{"--plugin-path", pluginPath, "--socket-path", socketPath}
|
||||||
|
|
||||||
if gloom.config.EnableChroot {
|
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)
|
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 {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to read pluginDir: %w", err)
|
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 {
|
for _, file := range files {
|
||||||
if file.IsDir() {
|
if file.IsDir() {
|
||||||
@@ -370,7 +402,7 @@ func (gloom *GLoom) RegisterPlugin(pluginPath string, name string, domains []str
|
|||||||
|
|
||||||
// remove all dead sockets
|
// remove all dead sockets
|
||||||
if strings.HasSuffix(file.Name(), ".sock") {
|
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)
|
return fmt.Errorf("failed to remove socket: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,5 +14,6 @@
|
|||||||
"dev": "zqdgr build && ./dist/gloom"
|
"dev": "zqdgr build && ./dist/gloom"
|
||||||
},
|
},
|
||||||
"pattern": "**/*.go",
|
"pattern": "**/*.go",
|
||||||
|
"shutdown_signal": "SIGINT",
|
||||||
"excluded_dirs": []
|
"excluded_dirs": []
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user