package info import ( "net/http" "sort" goSync "sync" "github.com/iotaledger/goshimmer/plugins/autopeering/local" "github.com/iotaledger/goshimmer/plugins/banner" "github.com/iotaledger/goshimmer/plugins/metrics" "github.com/iotaledger/goshimmer/plugins/sync" "github.com/iotaledger/goshimmer/plugins/webapi" "github.com/iotaledger/hive.go/node" "github.com/labstack/echo" ) // PluginName is the name of the web API info endpoint plugin. const PluginName = "WebAPI info Endpoint" var ( // plugin is the plugin instance of the web API info endpoint plugin. plugin *node.Plugin once goSync.Once ) // Plugin gets the plugin instance. func Plugin() *node.Plugin { once.Do(func() { plugin = node.NewPlugin(PluginName, node.Enabled, configure) }) return plugin } func configure(_ *node.Plugin) { webapi.Server().GET("info", getInfo) } // getInfo returns the info of the node // e.g., // { // "version":"v0.2.0", // "synchronized": true, // "identityID":"5bf4aa1d6c47e4ce", // "publickey":"CjUsn86jpFHWnSCx3NhWfU4Lk16mDdy1Hr7ERSTv3xn9", // "enabledplugins":[ // "Config", // "Autopeering", // "Analysis", // "WebAPI data Endpoint", // "WebAPI dRNG Endpoint", // "MessageLayer", // "CLI", // "Database", // "DRNG", // "WebAPI autopeering Endpoint", // "Metrics", // "PortCheck", // "Dashboard", // "WebAPI", // "WebAPI info Endpoint", // "WebAPI message Endpoint", // "Banner", // "Gossip", // "Graceful Shutdown", // "Logger" // ], // "disabledplugins":[ // "RemoteLog", // "Spammer", // "WebAPI Auth" // ] // } func getInfo(c echo.Context) error { var enabledPlugins []string var disabledPlugins []string for pluginName, plugin := range node.GetPlugins() { if node.IsSkipped(plugin) { disabledPlugins = append(disabledPlugins, pluginName) } else { enabledPlugins = append(enabledPlugins, pluginName) } } sort.Strings(enabledPlugins) sort.Strings(disabledPlugins) return c.JSON(http.StatusOK, Response{ Version: banner.AppVersion, Synced: sync.Synced(), IdentityID: local.GetInstance().Identity.ID().String(), PublicKey: local.GetInstance().PublicKey().String(), RequestQueueSize: int(metrics.MessageRequestQueueSize()), SolidMessageCount: int(metrics.MessageSolidCountDB()), TotalMessageCount: int(metrics.MessageTotalCountDB()), EnabledPlugins: enabledPlugins, DisabledPlugins: disabledPlugins, }) } // Response holds the response of the GET request. type Response struct { // version of GoShimmer Version string `json:"version,omitempty"` // whether the node is synchronized Synced bool `json:"synced"` // identity ID of the node encoded in base58 and truncated to its first 8 bytes IdentityID string `json:"identityID,omitempty"` // public key of the node encoded in base58 PublicKey string `json:"publicKey,omitempty"` // RequestQueueSize is the number of messages a node is trying to request from neighbors. RequestQueueSize int `json:"requestQueueSize,omitempty"` // SolidMessageCount is the number of solid messages in the node's database. SolidMessageCount int `json:"solidMessageCount,omitempty"` // TotalMessageCount is the number of messages in the node's database. TotalMessageCount int `json:"totalMessageCount,omitempty"` // list of enabled plugins EnabledPlugins []string `json:"enabledPlugins,omitempty"` // list if disabled plugins DisabledPlugins []string `json:"disabledPlugins,omitempty"` // error of the response Error string `json:"error,omitempty"` }