embed and unpack gloomi in a decent way
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,3 @@
|
|||||||
plugs
|
|
||||||
dist
|
dist
|
||||||
**/*.so
|
**/*.so
|
||||||
gloomd
|
gloomd
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ func (p *GLoomI) RegisterRoutes(router fiber.Router) {
|
|||||||
apiRouter.Get("/plugins", func(c fiber.Ctx) error {
|
apiRouter.Get("/plugins", func(c fiber.Ctx) error {
|
||||||
plugins, err := GetPlugins(p.client)
|
plugins, err := GetPlugins(p.client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Printf("plugs: %+v\n", plugins)
|
fmt.Printf("Loaded plugins: %+v\n", plugins)
|
||||||
return c.Status(fiber.StatusInternalServerError).SendString("Failed to list plugins: " + err.Error())
|
return c.Status(fiber.StatusInternalServerError).SendString("Failed to list plugins: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
go.mod
1
go.mod
@@ -3,7 +3,6 @@ module github.com/juls0730/gloom
|
|||||||
go 1.24.2
|
go 1.24.2
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/joho/godotenv v1.5.1
|
|
||||||
github.com/juls0730/sentinel v0.0.0-20250515154110-2e7e6586cacd
|
github.com/juls0730/sentinel v0.0.0-20250515154110-2e7e6586cacd
|
||||||
github.com/mattn/go-sqlite3 v1.14.24
|
github.com/mattn/go-sqlite3 v1.14.24
|
||||||
)
|
)
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -1,7 +1,5 @@
|
|||||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
|
||||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
|
||||||
github.com/juls0730/sentinel v0.0.0-20250515154110-2e7e6586cacd h1:JNazPdlAs307Gtaqmb+wfCjcOzO3MRXxg9nf0bAKAnc=
|
github.com/juls0730/sentinel v0.0.0-20250515154110-2e7e6586cacd h1:JNazPdlAs307Gtaqmb+wfCjcOzO3MRXxg9nf0bAKAnc=
|
||||||
github.com/juls0730/sentinel v0.0.0-20250515154110-2e7e6586cacd/go.mod h1:CnRvcleiS2kvK1N2PeQmeoRP5EXpBDpHPkg72vAUaSg=
|
github.com/juls0730/sentinel v0.0.0-20250515154110-2e7e6586cacd/go.mod h1:CnRvcleiS2kvK1N2PeQmeoRP5EXpBDpHPkg72vAUaSg=
|
||||||
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
||||||
|
|||||||
68
main.go
68
main.go
@@ -20,7 +20,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/BurntSushi/toml"
|
"github.com/BurntSushi/toml"
|
||||||
"github.com/joho/godotenv"
|
|
||||||
"github.com/juls0730/gloom/libs"
|
"github.com/juls0730/gloom/libs"
|
||||||
"github.com/juls0730/sentinel"
|
"github.com/juls0730/sentinel"
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
@@ -41,6 +40,8 @@ type PreloadPlugin struct {
|
|||||||
Domains []string `json:"domains"`
|
Domains []string `json:"domains"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const DEFAULT_PLUGIN_DIR = "plugs"
|
||||||
|
|
||||||
type GLoom struct {
|
type GLoom struct {
|
||||||
// path to the /tmp directory where the pluginHost binary is unpacked, and where the pluginHost sockets are created
|
// path to the /tmp directory where the pluginHost binary is unpacked, and where the pluginHost sockets are created
|
||||||
tmpDir string
|
tmpDir string
|
||||||
@@ -99,26 +100,6 @@ func NewGloom(proxyManager *sentinel.ProxyManager) (*GLoom, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
pluginDir := filepath.Join(gloomDir, "plugs")
|
|
||||||
if err := os.MkdirAll(pluginDir, 0755); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// if gloomi is built into the binary
|
|
||||||
if _, err := embeddedAssets.Open("dist/gloomi.so"); err == nil {
|
|
||||||
// and if the plugin doesn't exist, copy it over
|
|
||||||
if _, err := os.Stat(filepath.Join(pluginDir, "gloomi.so")); os.IsNotExist(err) {
|
|
||||||
gloomiData, err := embeddedAssets.ReadFile("dist/gloomi.so")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := os.WriteFile(filepath.Join(pluginDir, "gloomi.so"), gloomiData, 0755); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tmpDir, err := os.MkdirTemp(os.TempDir(), "gloom")
|
tmpDir, err := os.MkdirTemp(os.TempDir(), "gloom")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -135,7 +116,6 @@ func NewGloom(proxyManager *sentinel.ProxyManager) (*GLoom, error) {
|
|||||||
gloom := &GLoom{
|
gloom := &GLoom{
|
||||||
tmpDir: tmpDir,
|
tmpDir: tmpDir,
|
||||||
gloomDir: gloomDir,
|
gloomDir: gloomDir,
|
||||||
pluginDir: pluginDir,
|
|
||||||
plugins: libs.SyncMap[string, *PluginHost]{},
|
plugins: libs.SyncMap[string, *PluginHost]{},
|
||||||
DB: db,
|
DB: db,
|
||||||
ProxyManager: proxyManager,
|
ProxyManager: proxyManager,
|
||||||
@@ -145,6 +125,26 @@ func NewGloom(proxyManager *sentinel.ProxyManager) (*GLoom, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := os.MkdirAll(gloom.pluginDir, 0755); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// if gloomi is built into the binary
|
||||||
|
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.Stat(filepath.Join(gloom.pluginDir, "gloomi.so")); os.IsNotExist(err) {
|
||||||
|
gloomiData, err := embeddedAssets.ReadFile("dist/gloomi.so")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := os.WriteFile(filepath.Join(gloom.pluginDir, "gloomi.so"), gloomiData, 0755); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return gloom, nil
|
return gloom, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,6 +168,14 @@ func (gloom *GLoom) loadConfig() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
gloom.pluginDir, ok = config.(map[string]any)["pluginDir"].(string)
|
||||||
|
if !ok || gloom.pluginDir == "" {
|
||||||
|
gloom.pluginDir = DEFAULT_PLUGIN_DIR
|
||||||
|
}
|
||||||
|
|
||||||
|
gloom.pluginDir = filepath.Join(gloom.gloomDir, gloom.pluginDir)
|
||||||
|
|
||||||
proloadPlugins, ok := config.(map[string]any)["plugins"].([]map[string]any)
|
proloadPlugins, ok := config.(map[string]any)["plugins"].([]map[string]any)
|
||||||
if ok {
|
if ok {
|
||||||
for _, plugin := range proloadPlugins {
|
for _, plugin := range proloadPlugins {
|
||||||
@@ -596,14 +604,8 @@ func (rpc *GloomRPC) UploadPlugin(plugin PluginUpload, reply *string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plugsDir := "plugs"
|
if _, err := os.Stat(rpc.gloom.pluginDir); os.IsNotExist(err) {
|
||||||
|
if err := os.Mkdir(rpc.gloom.pluginDir, 0755); err != nil {
|
||||||
if os.Getenv("PLUGINS_DIR") != "" {
|
|
||||||
plugsDir = os.Getenv("PLUGINS_DIR")
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err := os.Stat(plugsDir); os.IsNotExist(err) {
|
|
||||||
if err := os.Mkdir(plugsDir, 0755); err != nil {
|
|
||||||
*reply = "Plugin upload failed"
|
*reply = "Plugin upload failed"
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -668,12 +670,6 @@ func (rpc *GloomRPC) DeletePlugin(pluginName string, reply *string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
|
||||||
if err := godotenv.Load(); err != nil {
|
|
||||||
fmt.Println("No .env file found")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
debug, err := strconv.ParseBool(os.Getenv("DEBUG"))
|
debug, err := strconv.ParseBool(os.Getenv("DEBUG"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"build:gloomi": "sh -c \"cd gloomi; zqdgr build\"",
|
"build:gloomi": "sh -c \"cd gloomi; zqdgr build\"",
|
||||||
"build:gloom": "zqdgr build:pluginHost && go build -tags=gloomi -o dist/gloom",
|
"build:gloom": "zqdgr build:pluginHost && go build -tags=gloomi -o dist/gloom",
|
||||||
"build:nogloomi": "zqdgr build:pluginHost && go build -tags=!gloomi -o dist/gloom",
|
"build:nogloomi": "zqdgr build:pluginHost && go build -tags=!gloomi -o dist/gloom",
|
||||||
"clean": "rm -rf plugs && rm -rf dist && rm -rf plugin/plugin.so",
|
"clean": "rm -rf dist && rm -rf plugin/plugin.so",
|
||||||
"dev": "zqdgr build && ./dist/gloom"
|
"dev": "zqdgr build && ./dist/gloom"
|
||||||
},
|
},
|
||||||
"pattern": "**/*.go",
|
"pattern": "**/*.go",
|
||||||
|
|||||||
Reference in New Issue
Block a user