Files
gloom/main.go
2025-01-07 12:15:27 +00:00

91 lines
1.5 KiB
Go

package main
import (
"fmt"
"os"
"plugin"
"sync"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/logger"
)
type Plugin interface {
Name() string
Init() error
Domains() []string
RegisterRoutes(app fiber.Router)
}
var domainMap sync.Map // Maps domains to plugins
func main() {
app := fiber.New()
app.Use(logger.New())
plugins := loadPlugins()
for _, p := range plugins {
for _, domain := range p.Domains() {
fmt.Printf("Registering domain: %s for plugin: %s\n", domain, p.Name())
domainMap.Store(domain, p)
}
}
app.Use(func(c fiber.Ctx) error {
host := c.Host()
if value, ok := domainMap.Load(host); ok {
plugin := value.(Plugin)
pluginRouter := fiber.New()
plugin.RegisterRoutes(pluginRouter)
pluginRouter.Handler()(c.RequestCtx())
return nil
}
return c.Status(404).SendString("Domain not found")
})
fmt.Println("Server running at http://localhost:3000")
app.Listen(":3000")
}
func loadPlugins() []Plugin {
if err := os.MkdirAll("plugs", 0755); err != nil {
if os.IsNotExist(err) {
panic(err)
}
}
pluginPaths := []string{"plugs/example.so"}
var plugins []Plugin
for _, path := range pluginPaths {
p, err := plugin.Open(path)
if err != nil {
panic(err)
}
symbol, err := p.Lookup("Plugin")
if err != nil {
panic(err)
}
pluginInstance, ok := symbol.(Plugin)
if !ok {
panic("Invalid plugin type")
}
err = pluginInstance.Init()
if err != nil {
panic(err)
}
plugins = append(plugins, pluginInstance)
}
return plugins
}