From 02d32df8c31fb7345e9bed6c3f468825b8f14265 Mon Sep 17 00:00:00 2001 From: Wolfgang Welz <welzwo@gmail.com> Date: Wed, 31 Jul 2019 00:48:43 +0200 Subject: [PATCH] Feat: print plugin identifiers under usage --- packages/node/node.go | 61 ++++++++++++++------------------- packages/node/plugin.go | 11 +++++- packages/parameter/events.go | 6 ++++ packages/parameter/parameter.go | 20 +++++++++-- plugins/cli/cli.go | 34 ++++++++++++++---- plugins/cli/plugin.go | 30 +++++++++------- 6 files changed, 105 insertions(+), 57 deletions(-) diff --git a/packages/node/node.go b/packages/node/node.go index 443da232..9ecb5776 100644 --- a/packages/node/node.go +++ b/packages/node/node.go @@ -1,7 +1,6 @@ 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 ...") diff --git a/packages/node/plugin.go b/packages/node/plugin.go index 4e915d3a..bb7efa84 100644 --- a/packages/node/plugin.go +++ b/packages/node/plugin.go @@ -1,9 +1,11 @@ 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) } diff --git a/packages/parameter/events.go b/packages/parameter/events.go index ad91b734..b755a038 100644 --- a/packages/parameter/events.go +++ b/packages/parameter/events.go @@ -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)) +} diff --git a/packages/parameter/parameter.go b/packages/parameter/parameter.go index 2d180914..24e9117d 100644 --- a/packages/parameter/parameter.go +++ b/packages/parameter/parameter.go @@ -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 +} diff --git a/plugins/cli/cli.go b/plugins/cli/cli.go index dc898c98..73aa4f19 100644 --- a/plugins/cli/cli.go +++ b/plugins/cli/cli.go @@ -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)) } diff --git a/plugins/cli/plugin.go b/plugins/cli/plugin.go index 0c0158f0..ae97189d 100644 --- a/plugins/cli/plugin.go +++ b/plugins/cli/plugin.go @@ -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) -- GitLab