Skip to content
Snippets Groups Projects
Commit 02d32df8 authored by Wolfgang Welz's avatar Wolfgang Welz
Browse files

Feat: print plugin identifiers under usage

parent 59b964d8
No related branches found
No related tags found
No related merge requests found
package node
import (
"strings"
"sync"
"github.com/iotaledger/goshimmer/packages/daemon"
......@@ -16,7 +15,7 @@ type Node struct {
var DisabledPlugins = make(map[string]bool)
var EnabledPlugins = make(map[string]bool)
func Load(plugins ...*Plugin) *Node {
func New(plugins ...*Plugin) *Node {
node := &Node{
loggers: make([]*Logger, 0),
wg: &sync.WaitGroup{},
......@@ -24,20 +23,22 @@ func Load(plugins ...*Plugin) *Node {
}
node.AddLogger(DEFAULT_LOGGER)
node.Load(plugins...)
// configure the enabled plugins
node.configure(plugins...)
return node
}
func Start(plugins ...*Plugin) *Node {
node := Load(plugins...)
node := New(plugins...)
node.Start()
return node
}
func Run(plugins ...*Plugin) *Node {
node := Load(plugins...)
node := New(plugins...)
node.Run()
return node
......@@ -101,39 +102,33 @@ func (node *Node) LogFailure(pluginName string, message string) {
}
}
func getPluginKey(plugin *Plugin) string {
return strings.ToLower(strings.Replace(plugin.Name, " ", "", -1))
}
func isDisabled(plugin *Plugin) bool {
_, exists := DisabledPlugins[getPluginKey(plugin)]
_, exists := DisabledPlugins[GetPluginIdentifier(plugin.Name)]
return exists
}
func isEnabled(plugin *Plugin) bool {
_, exists := EnabledPlugins[getPluginKey(plugin)]
_, exists := EnabledPlugins[GetPluginIdentifier(plugin.Name)]
return exists
}
func (node *Node) Load(plugins ...*Plugin) {
if len(plugins) >= 1 {
for _, plugin := range plugins {
status := plugin.Status
if (status == Enabled && !isDisabled(plugin)) ||
(status == Disabled && isEnabled(plugin)) {
func (node *Node) configure(plugins ...*Plugin) {
for _, plugin := range plugins {
status := plugin.Status
if (status == Enabled && !isDisabled(plugin)) ||
(status == Disabled && isEnabled(plugin)) {
plugin.wg = node.wg
plugin.Node = node
plugin.wg = node.wg
plugin.Node = node
plugin.Events.Configure.Trigger(plugin)
node.loadedPlugins = append(node.loadedPlugins, plugin)
plugin.Events.Configure.Trigger(plugin)
node.loadedPlugins = append(node.loadedPlugins, plugin)
node.LogInfo("Node", "Loading Plugin: "+plugin.Name+" ... done")
} else {
node.LogInfo("Node", "Skipping Plugin: "+plugin.Name)
}
node.LogInfo("Node", "Loading Plugin: "+plugin.Name+" ... done")
} else {
node.LogInfo("Node", "Skipping Plugin: "+plugin.Name)
}
}
}
......@@ -141,12 +136,10 @@ func (node *Node) Load(plugins ...*Plugin) {
func (node *Node) Start() {
node.LogInfo("Node", "Executing plugins ...")
if len(node.loadedPlugins) >= 1 {
for _, plugin := range node.loadedPlugins {
plugin.Events.Run.Trigger(plugin)
for _, plugin := range node.loadedPlugins {
plugin.Events.Run.Trigger(plugin)
node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
}
node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
}
node.LogSuccess("Node", "Starting background workers ...")
......@@ -157,12 +150,10 @@ func (node *Node) Start() {
func (node *Node) Run() {
node.LogInfo("Node", "Executing plugins ...")
if len(node.loadedPlugins) >= 1 {
for _, plugin := range node.loadedPlugins {
plugin.Events.Run.Trigger(plugin)
for _, plugin := range node.loadedPlugins {
plugin.Events.Run.Trigger(plugin)
node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
}
node.LogSuccess("Node", "Starting Plugin: "+plugin.Name+" ... done")
}
node.LogSuccess("Node", "Starting background workers ...")
......
package node
import (
"strings"
"sync"
"github.com/iotaledger/goshimmer/packages/events"
"github.com/iotaledger/goshimmer/packages/parameter"
)
const (
......@@ -20,7 +22,7 @@ type Plugin struct {
}
// Creates a new plugin with the given name, default status and callbacks.
// The last specified callback is the run callback, while all other callbacks are configure callbacks.
// The last specified callback is the mandatory run callback, while all other callbacks are configure callbacks.
func NewPlugin(name string, status int, callback Callback, callbacks ...Callback) *Plugin {
plugin := &Plugin{
Name: name,
......@@ -31,6 +33,9 @@ func NewPlugin(name string, status int, callback Callback, callbacks ...Callback
},
}
// make the plugin known to the parameters
parameter.AddPlugin(name, status)
if len(callbacks) >= 1 {
plugin.Events.Configure.Attach(events.NewClosure(callback))
for _, callback = range callbacks[:len(callbacks)-1] {
......@@ -45,6 +50,10 @@ func NewPlugin(name string, status int, callback Callback, callbacks ...Callback
return plugin
}
func GetPluginIdentifier(name string) string {
return strings.ToLower(strings.Replace(name, " ", "", -1))
}
func (plugin *Plugin) LogSuccess(message string) {
plugin.Node.LogSuccess(plugin.Name, message)
}
......
......@@ -8,10 +8,12 @@ var Events = struct {
AddBool *events.Event
AddInt *events.Event
AddString *events.Event
AddPlugin *events.Event
}{
AddBool: events.NewEvent(boolParameterCaller),
AddInt: events.NewEvent(intParameterCaller),
AddString: events.NewEvent(stringParameterCaller),
AddPlugin: events.NewEvent(pluginParameterCaller),
}
func boolParameterCaller(handler interface{}, params ...interface{}) {
......@@ -25,3 +27,7 @@ func intParameterCaller(handler interface{}, params ...interface{}) {
func stringParameterCaller(handler interface{}, params ...interface{}) {
handler.(func(*StringParameter))(params[0].(*StringParameter))
}
func pluginParameterCaller(handler interface{}, params ...interface{}) {
handler.(func(string, int))(params[0].(string), params[1].(int))
}
......@@ -32,7 +32,7 @@ func GetBools() map[string]*BoolParameter {
var intParameters = make(map[string]*IntParameter)
func AddInt(name string, defaultValue int, description string) *IntParameter {
if intParameters[name] != nil {
if _, exists := intParameters[name]; exists {
panic("duplicate parameter - \"" + name + "\" was defined already")
}
......@@ -61,7 +61,7 @@ func GetInts() map[string]*IntParameter {
var stringParameters = make(map[string]*StringParameter)
func AddString(name string, defaultValue string, description string) *StringParameter {
if stringParameters[name] != nil {
if _, exists := stringParameters[name]; exists {
panic("duplicate parameter - \"" + name + "\" was defined already")
}
......@@ -86,3 +86,19 @@ func GetString(name string) *StringParameter {
func GetStrings() map[string]*StringParameter {
return stringParameters
}
var plugins = make(map[string]int)
func AddPlugin(name string, status int) {
if _, exists := plugins[name]; exists {
panic("duplicate plugin - \"" + name + "\" was defined already")
}
plugins[name] = status
Events.AddPlugin.Trigger(name, status)
}
func GetPlugins() map[string]int {
return plugins
}
......@@ -5,6 +5,10 @@ import (
"fmt"
"os"
"path/filepath"
"sort"
"strings"
"github.com/iotaledger/goshimmer/packages/node"
)
func AddBoolParameter(p *bool, name string, usage string) {
......@@ -19,20 +23,36 @@ func AddStringParameter(p *string, name string, usage string) {
flag.StringVar(p, name, *p, usage)
}
var enabledPlugins []string
var disabledPlugins []string
func AddPluginStatus(name string, status int) {
switch status {
case node.Enabled:
enabledPlugins = append(enabledPlugins, name)
case node.Disabled:
disabledPlugins = append(disabledPlugins, name)
}
}
func getList(a []string) string {
sort.Strings(a)
return strings.Join(a, " ")
}
func printUsage() {
_, err := fmt.Fprintf(
fmt.Fprintf(
os.Stderr,
"\n"+
"SHIMMER 1.0\n\n"+
"SHIMMER\n\n"+
" A lightweight modular IOTA node.\n\n"+
"Usage:\n\n"+
" %s [OPTIONS]\n\n"+
"Options:\n\n",
"Options:\n",
filepath.Base(os.Args[0]),
)
if err != nil {
panic(err)
}
flag.PrintDefaults()
fmt.Fprintf(os.Stderr, "\nThe following plugins are enabled by default and can be disabled with -%s:\n %s\n", getFlagName(node.DISABLE_PLUGINS.Name), getList(enabledPlugins))
fmt.Fprintf(os.Stderr, "The following plugins are disabled by default and can be enabled with -%s:\n %s\n\n", getFlagName(node.ENABLE_PLUGINS.Name), getList(disabledPlugins))
}
......@@ -10,40 +10,44 @@ import (
"github.com/iotaledger/goshimmer/packages/parameter"
)
func onAddBoolParameter(param *parameter.BoolParameter) {
flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
func getFlagName(paramName string) string {
return strings.Replace(strings.Replace(strings.ToLower(paramName), "/", "-", 1), "_", "-", -1)
}
AddBoolParameter(param.Value, flagName, param.Description)
func onAddBoolParameter(param *parameter.BoolParameter) {
AddBoolParameter(param.Value, getFlagName(param.Name), param.Description)
}
func onAddIntParameter(param *parameter.IntParameter) {
flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
AddIntParameter(param.Value, flagName, param.Description)
AddIntParameter(param.Value, getFlagName(param.Name), param.Description)
}
func onAddStringParameter(param *parameter.StringParameter) {
flagName := strings.Replace(strings.Replace(strings.ToLower(param.Name), "/", "-", 1), "_", "-", -1)
AddStringParameter(param.Value, getFlagName(param.Name), param.Description)
}
AddStringParameter(param.Value, flagName, param.Description)
func onAddPlugin(name string, status int) {
AddPluginStatus(node.GetPluginIdentifier(name), status)
}
func init() {
for _, param := range parameter.GetBools() {
onAddBoolParameter(param)
}
for _, param := range parameter.GetInts() {
onAddIntParameter(param)
}
for _, param := range parameter.GetStrings() {
onAddStringParameter(param)
}
for name, status := range parameter.GetPlugins() {
onAddPlugin(name, status)
}
parameter.Events.AddBool.Attach(events.NewClosure(onAddBoolParameter))
parameter.Events.AddInt.Attach(events.NewClosure(onAddIntParameter))
parameter.Events.AddString.Attach(events.NewClosure(onAddStringParameter))
parameter.Events.AddPlugin.Attach(events.NewClosure(onAddPlugin))
flag.Usage = printUsage
}
......@@ -73,6 +77,8 @@ func configure(ctx *node.Plugin) {
ctx.Node.LogInfo("Node", "Loading plugins ...")
}
var PLUGIN = node.NewPlugin("CLI", node.Enabled, configure, func(plugin *node.Plugin) {
func run(ctx *node.Plugin) {
// do nothing; everything is handled in the configure step
}
})
var PLUGIN = node.NewPlugin("CLI", node.Enabled, configure, run)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment