initial commit
This commit is contained in:
90
main.go
Normal file
90
main.go
Normal file
@@ -0,0 +1,90 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user