Compare commits

...

2 commits

Author SHA1 Message Date
edc9c7aecb
typo 2023-08-26 13:19:59 +03:00
2b8de67405
feat: load and run plugins concurrently 2023-08-26 13:19:06 +03:00
2 changed files with 47 additions and 7 deletions

View file

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"log"
"time" "time"
) )
@ -10,17 +11,34 @@ type Resources interface {
AgentInfo() map[string]interface{} AgentInfo() map[string]interface{}
} }
// FILLME creating new plugin interface template
// type NewPluginInterface interface { // type NewPluginInterface interface {
// PluginMethod() returnType // PluginMethod() returnType
// } // }
// Loads Plugins and runs them. // Loads Plugins and runs them concurrently.
// When you create a new plugin create a new interface and call this plugin in this function // When you create a new plugin create a new interface and call this plugin in this function
func PluginManager() { func PluginManager() {
var resources Resources = LoadPlugin("resources").(Resources) chanPlug := make(chan interface{})
// var pluginName NewPluginInterface = LoadPlugin("pluginName").(NewPluginInterface)
go LoadPlugin("resources", chanPlug)
res, ok := <-chanPlug
var resources Resources = res.(Resources)
checkPlugin(res, ok)
// FILLME Loading new plugin template
// go LoadPlugin("pluginName", chanPlug)
// res, ok = <-chanPlug
// var pluginName NewPluginInterface = res.(NewPluginInterface)
// checkPlugin(res, ok)
// Run plugins concurrently and log out
for { for {
logPlugin("AgentInfo", resources.AgentInfo()) go logPlugin("AgentInfo", resources.AgentInfo())
// FILLME Running/Logout a plugin template
// go logPlugin("InfoAboutFunction", pluginName.Function() )
time.Sleep(30 * time.Second) time.Sleep(30 * time.Second)
} }
} }
@ -33,6 +51,23 @@ func logPlugin(title string, mp map[string]interface{}) {
} }
} }
// Checks plugin status
func checkPlugin(plugVal interface{}, status bool) {
if status {
if plugVal == nil {
log.Fatal("Plugin loaded but there is no value!")
} else {
log.Println("Plugin loaded and ready to use")
}
} else {
if plugVal == nil {
log.Fatal("Plugin closed and there is no value! ")
} else {
log.Fatal("Plugin closed or there is an error")
}
}
}
// // TODO response to Lider // // TODO response to Lider
// // func createResponse() { // // func createResponse() {

View file

@ -8,11 +8,11 @@ import (
"git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils" "git.aliberksandikci.com.tr/Liderahenk/ahenk-go/pkg/utils"
) )
// Load Plugin placed in PluginDir, returns empty interface. // Load Plugin placed in PluginDir, returns empty interface with channel
// Do not forget to cast in plugin manager // Do not forget to cast in plugin manager
// //
// Give Plugin Name as argument and be sure you compiled plugins with `-buildmode=plugin` to PluginDir as `pluginname.so` // Give Plugin Name as argument and be sure you compiled plugins with `-buildmode=plugin` to PluginDir as `pluginname.so`
func LoadPlugin(plugName string) interface{} { func LoadPlugin(plugName string, chn chan interface{}) {
// TODO if error caugth try without relative path, this will be good for local testing // TODO if error caugth try without relative path, this will be good for local testing
plug, err := plugin.Open(PluginDir + plugName + ".so") plug, err := plugin.Open(PluginDir + plugName + ".so")
@ -28,5 +28,10 @@ func LoadPlugin(plugName string) interface{} {
fmt.Println("unexpected type from module symbol") fmt.Println("unexpected type from module symbol")
os.Exit(1) os.Exit(1)
} }
return plugOut chn <- plugOut
} }
// NEXT implement unload function
// func UnloadPlugin(plugName string) interface{} {
// }