Files
akvorado/console/config.go
Vincent Bernat 1ce435efde console/frontend: add a link to GitHub on the documentation page
This is only when branding is explicitely enabled. Now, that
akvorado.net does not redirect to GitHub anymore...
2025-08-30 17:03:23 +02:00

130 lines
4.6 KiB
Go

// SPDX-FileCopyrightText: 2022 Free Mobile
// SPDX-License-Identifier: AGPL-3.0-only
package console
import (
"net/http"
"time"
"akvorado/common/helpers"
"akvorado/console/query"
"github.com/gin-gonic/gin"
)
// Configuration describes the configuration for the console component.
type Configuration struct {
// ServeLiveFS serve files from the filesystem instead of the embedded versions.
ServeLiveFS bool `yaml:"-"`
// DefaultVisualizeOptions define some defaults for the "visualize" tab.
DefaultVisualizeOptions VisualizeOptionsConfiguration
// HomepageTopWidgets defines the list of widgets to display on the home page.
HomepageTopWidgets []HomepageTopWidget
// HomepageGraphFilter defines the filtering string to use for the homepage graph
HomepageGraphFilter string
// HomepageGraphTimeRange defines the time range to use for the homepage graph
HomepageGraphTimeRange time.Duration `validate:"min=1m"`
// DimensionsLimit put an upper limit to the number of dimensions to return.
DimensionsLimit int `validate:"min=10"`
// Branding enables some branding on the console
Branding bool
// CacheTTL tells how long to keep the most costly requests in cache.
CacheTTL time.Duration `validate:"min=5s"`
}
// HomepageTopWidget represents a top widget on the homepage.
type HomepageTopWidget int
const (
// HomepageTopWidgetSrcAS shows the top source AS
HomepageTopWidgetSrcAS HomepageTopWidget = iota + 1
// HomepageTopWidgetDstAS shows the top destination AS
HomepageTopWidgetDstAS
// HomepageTopWidgetSrcCountry shows the top source countries
HomepageTopWidgetSrcCountry
// HomepageTopWidgetDstCountry shows the top destination countries
HomepageTopWidgetDstCountry
// HomepageTopWidgetSrcPort shows the top source ports
HomepageTopWidgetSrcPort
// HomepageTopWidgetDstPort shows the top destination ports
HomepageTopWidgetDstPort
// HomepageTopWidgetExporter shows the top exporters
HomepageTopWidgetExporter
// HomepageTopWidgetProtocol shows the top IP protocols
HomepageTopWidgetProtocol
// HomepageTopWidgetEtype shows the top ethernet types
HomepageTopWidgetEtype
)
// VisualizeOptionsConfiguration defines options for the "visualize" tab.
type VisualizeOptionsConfiguration struct {
// GraphType tells the type of the graph we request
GraphType string `json:"graphType" validate:"oneof=stacked stacked100 lines grid sankey"`
// Start is the start time (as a string)
Start string `json:"start" validate:"required"`
// End is the end time (as string)
End string `json:"end" validate:"required"`
// Filter is the the filter string
Filter string `json:"filter"`
// Dimensions is the array of dimensions to use
Dimensions []query.Column `json:"dimensions"`
// Limit is the default limit to use
Limit int `json:"limit" validate:"min=5"`
// LimitType is the default limitType to use
LimitType string `json:"limitType" validate:"oneof=avg max last"`
// Bidirectional tells if a graph should be bidirectional (all except sankey)
Bidirectional bool `json:"bidirectional"`
// PreviousPeriod tells if a graph should display the previous period (for stacked)
PreviousPeriod bool `json:"previousPeriod"`
}
// DefaultConfiguration represents the default configuration for the console component.
func DefaultConfiguration() Configuration {
return Configuration{
DefaultVisualizeOptions: VisualizeOptionsConfiguration{
GraphType: "stacked",
Start: "6 hours ago",
End: "now",
Filter: "InIfBoundary = external",
Dimensions: []query.Column{query.NewColumn("SrcAS")},
Limit: 10,
LimitType: "avg",
},
HomepageTopWidgets: []HomepageTopWidget{
HomepageTopWidgetSrcAS,
HomepageTopWidgetSrcPort,
HomepageTopWidgetProtocol,
HomepageTopWidgetSrcCountry,
HomepageTopWidgetEtype,
},
DimensionsLimit: 50,
CacheTTL: 3 * time.Hour,
HomepageGraphFilter: "InIfBoundary = 'external'",
HomepageGraphTimeRange: 24 * time.Hour,
}
}
func (c *Component) configHandlerFunc(gc *gin.Context) {
dimensions := []string{}
truncatable := []string{}
for _, column := range c.d.Schema.Columns() {
if column.ConsoleNotDimension || column.Disabled {
continue
}
dimensions = append(dimensions, column.Name)
if column.ConsoleTruncateIP {
truncatable = append(truncatable, column.Name)
}
}
gc.JSON(http.StatusOK, gin.H{
"version": helpers.AkvoradoVersion,
"defaultVisualizeOptions": c.config.DefaultVisualizeOptions,
"dimensionsLimit": c.config.DimensionsLimit,
"dimensions": dimensions,
"truncatable": truncatable,
"homepageTopWidgets": c.config.HomepageTopWidgets,
"branding": c.config.Branding,
})
}