Skip to content
Snippets Groups Projects
node.go 2.83 KiB
Newer Older
package node

import (
capossele's avatar
capossele committed
	"strings"
	"sync"

	"github.com/iotaledger/goshimmer/packages/daemon"
)

type Node struct {
capossele's avatar
capossele committed
	wg            *sync.WaitGroup
	loggers       []*Logger
	loadedPlugins []*Plugin
	logLevel      int
var disabledPlugins = make(map[string]bool)

func Load(plugins ...*Plugin) *Node {
capossele's avatar
capossele committed
	for _, disabledPlugin := range strings.Fields(*DISABLE_PLUGINS.Value) {
		disabledPlugins[strings.ToLower(disabledPlugin)] = true
	}

	node := &Node{
		logLevel:      *LOG_LEVEL.Value,
		loggers:       make([]*Logger, 0),
		wg:            &sync.WaitGroup{},
		loadedPlugins: make([]*Plugin, 0),
	}

	node.AddLogger(DEFAULT_LOGGER)
	node.Load(plugins...)

	return node
}

func Run(plugins ...*Plugin) *Node {
capossele's avatar
capossele committed
	node := Load(plugins...)
	node.Run()
capossele's avatar
capossele committed
	return node
}

func (node *Node) AddLogger(logger *Logger) {
capossele's avatar
capossele committed
	node.loggers = append(node.loggers, logger)
}

func (node *Node) LogSuccess(pluginName string, message string) {
capossele's avatar
capossele committed
	if node.logLevel >= LOG_LEVEL_SUCCESS {
		for _, logger := range node.loggers {
			if logger.Enabled {
				logger.LogSuccess(pluginName, message)
			}
		}
	}
}

func (node *Node) LogInfo(pluginName string, message string) {
capossele's avatar
capossele committed
	if node.logLevel >= LOG_LEVEL_INFO {
		for _, logger := range node.loggers {
			if logger.Enabled {
				logger.LogInfo(pluginName, message)
			}
		}
	}
func (node *Node) LogDebug(pluginName string, message string) {
capossele's avatar
capossele committed
	if node.logLevel >= LOG_LEVEL_DEBUG {
		for _, logger := range node.loggers {
			if logger.Enabled {
				logger.LogDebug(pluginName, message)
			}
		}
	}
func (node *Node) LogWarning(pluginName string, message string) {
capossele's avatar
capossele committed
	if node.logLevel >= LOG_LEVEL_WARNING {
		for _, logger := range node.loggers {
			if logger.Enabled {
				logger.LogWarning(pluginName, message)
			}
		}
	}
}

func (node *Node) LogFailure(pluginName string, message string) {
capossele's avatar
capossele committed
	if node.logLevel >= LOG_LEVEL_FAILURE {
		for _, logger := range node.loggers {
			if logger.Enabled {
				logger.LogFailure(pluginName, message)
			}
		}
	}
}

func (node *Node) Load(plugins ...*Plugin) {
capossele's avatar
capossele committed
	if len(plugins) >= 1 {
		for _, plugin := range plugins {
			if _, exists := disabledPlugins[strings.ToLower(strings.Replace(plugin.Name, " ", "", -1))]; !exists {
				plugin.wg = node.wg
				plugin.Node = node
capossele's avatar
capossele committed
				plugin.Events.Configure.Trigger(plugin)
capossele's avatar
capossele committed
				node.LogInfo("Node", "Loading Plugin: "+plugin.Name+" ... done")
capossele's avatar
capossele committed
				node.loadedPlugins = append(node.loadedPlugins, plugin)
			}
		}
	}
capossele's avatar
capossele committed
	//node.loadedPlugins = append(node.loadedPlugins, plugins...)
}

func (node *Node) Run() {
capossele's avatar
capossele committed
	node.LogInfo("Node", "Executing plugins ...")
capossele's avatar
capossele committed
	if len(node.loadedPlugins) >= 1 {
		for _, plugin := range node.loadedPlugins {
			plugin.Events.Run.Trigger(plugin)
capossele's avatar
capossele committed
			node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
		}
	}
capossele's avatar
capossele committed
	node.LogSuccess("Node", "Starting background workers ...")
capossele's avatar
capossele committed
	daemon.Run()
capossele's avatar
capossele committed
	node.LogSuccess("Node", "Shutdown complete!")