268 lines
11 KiB
Go
268 lines
11 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// Action represents the core functionality of OliveTin - commands that show up
|
|
// as buttons in the UI.
|
|
type Action struct {
|
|
ID string
|
|
Title string
|
|
Icon string
|
|
Shell string
|
|
Exec []string
|
|
ShellAfterCompleted string
|
|
Timeout int
|
|
Acls []string
|
|
Entity string
|
|
Hidden bool
|
|
ExecOnStartup bool
|
|
ExecOnCron []string
|
|
ExecOnFileCreatedInDir []string
|
|
ExecOnFileChangedInDir []string
|
|
ExecOnCalendarFile string
|
|
Triggers []string
|
|
MaxConcurrent int
|
|
MaxRate []RateSpec
|
|
Arguments []ActionArgument
|
|
PopupOnStart string
|
|
SaveLogs SaveLogsConfig
|
|
}
|
|
|
|
// ActionArgument objects appear on Actions.
|
|
type ActionArgument struct {
|
|
Name string
|
|
Title string
|
|
Description string
|
|
Type string
|
|
Default string
|
|
Choices []ActionArgumentChoice
|
|
Entity string
|
|
RejectNull bool
|
|
Suggestions map[string]string
|
|
}
|
|
|
|
// ActionArgumentChoice represents a predefined choice for an argument.
|
|
type ActionArgumentChoice struct {
|
|
Value string
|
|
Title string
|
|
}
|
|
|
|
// RateSpec allows you to set a max frequency for an action.
|
|
type RateSpec struct {
|
|
Limit int
|
|
Duration string
|
|
}
|
|
|
|
// Entity represents a "thing" that can have multiple actions associated with it.
|
|
// for example, a media player with a start and stop action.
|
|
type EntityFile struct {
|
|
File string
|
|
Name string
|
|
Icon string
|
|
}
|
|
|
|
// PermissionsList defines what users can do with an action.
|
|
type PermissionsList struct {
|
|
View bool `mapstructure:"view"`
|
|
Exec bool `mapstructure:"exec"`
|
|
Logs bool `mapstructure:"logs"`
|
|
Kill bool `mapstructure:"kill"`
|
|
}
|
|
|
|
// AccessControlList defines what permissions apply to a user or user group.
|
|
type AccessControlList struct {
|
|
Name string
|
|
AddToEveryAction bool
|
|
MatchUsergroups []string
|
|
MatchUsernames []string
|
|
Permissions PermissionsList
|
|
Policy ConfigurationPolicy
|
|
}
|
|
|
|
// ConfigurationPolicy defines global settings which are overridden with an ACL.
|
|
type ConfigurationPolicy struct {
|
|
ShowDiagnostics bool `mapstructure:"showDiagnostics"`
|
|
ShowLogList bool `mapstructure:"showLogList"`
|
|
}
|
|
|
|
type PrometheusConfig struct {
|
|
Enabled bool `mapstructure:"enabled"`
|
|
DefaultGoMetrics bool `mapstructure:"defaultGoMetrics"`
|
|
}
|
|
|
|
// Config is the global config used through the whole app.
|
|
type Config struct {
|
|
UseSingleHTTPFrontend bool `mapstructure:"useSingleHTTPFrontend"`
|
|
ThemeName string `mapstructure:"themeName"`
|
|
ThemeCacheDisabled bool `mapstructure:"themeCacheDisabled"`
|
|
ListenAddressSingleHTTPFrontend string `mapstructure:"listenAddressSingleHTTPFrontend"`
|
|
ListenAddressWebUI string `mapstructure:"listenAddressWebUI"`
|
|
ListenAddressRestActions string `mapstructure:"listenAddressRestActions"`
|
|
ListenAddressPrometheus string `mapstructure:"listenAddressPrometheus"`
|
|
ExternalRestAddress string `mapstructure:"externalRestAddress"`
|
|
LogLevel string `mapstructure:"logLevel"`
|
|
LogDebugOptions LogDebugOptions `mapstructure:"logDebugOptions"`
|
|
LogHistoryPageSize int64 `mapstructure:"logHistoryPageSize"`
|
|
Actions []*Action `mapstructure:"actions"`
|
|
Entities []*EntityFile `mapstructure:"entities"`
|
|
Dashboards []*DashboardComponent `mapstructure:"dashboards"`
|
|
CheckForUpdates bool `mapstructure:"checkForUpdates"`
|
|
PageTitle string `mapstructure:"pageTitle"`
|
|
ShowFooter bool `mapstructure:"showFooter"`
|
|
ShowNavigation bool `mapstructure:"showNavigation"`
|
|
ShowNewVersions bool `mapstructure:"showNewVersions"`
|
|
EnableCustomJs bool `mapstructure:"enableCustomJs"`
|
|
AuthJwtCookieName string `mapstructure:"authJwtCookieName"`
|
|
AuthJwtHeader string `mapstructure:"authJwtHeader"`
|
|
AuthJwtAud string `mapstructure:"authJwtAud"`
|
|
AuthJwtDomain string `mapstructure:"authJwtDomain"`
|
|
AuthJwtCertsURL string `mapstructure:"authJwtCertsUrl"`
|
|
AuthJwtHmacSecret string `mapstructure:"authJwtHmacSecret"` // mutually exclusive with pub key config fields
|
|
AuthJwtClaimUsername string `mapstructure:"authJwtClaimUsername"`
|
|
AuthJwtClaimUserGroup string `mapstructure:"authJwtClaimUserGroup"`
|
|
AuthJwtPubKeyPath string `mapstructure:"authJwtPubKeyPath"` // will read pub key from file on disk
|
|
AuthHttpHeaderUsername string `mapstructure:"authHttpHeaderUsername"`
|
|
AuthHttpHeaderUserGroup string `mapstructure:"authHttpHeaderUserGroup"`
|
|
AuthHttpHeaderUserGroupSep string `mapstructure:"authHttpHeaderUserGroupSep"`
|
|
AuthLocalUsers AuthLocalUsersConfig `mapstructure:"authLocalUsers"`
|
|
AuthLoginUrl string `mapstructure:"authLoginUrl"`
|
|
AuthRequireGuestsToLogin bool `mapstructure:"authRequireGuestsToLogin"`
|
|
AuthOAuth2RedirectURL string `mapstructure:"authOAuth2RedirectUrl"`
|
|
AuthOAuth2Providers map[string]*OAuth2Provider `mapstructure:"authOAuth2Providers"`
|
|
DefaultPermissions PermissionsList `mapstructure:"defaultPermissions"`
|
|
DefaultPolicy ConfigurationPolicy `mapstructure:"defaultPolicy"`
|
|
AccessControlLists []*AccessControlList `mapstructure:"accessControlLists"`
|
|
WebUIDir string `mapstructure:"webUIDir"`
|
|
CronSupportForSeconds bool `mapstructure:"cronSupportForSeconds"`
|
|
SectionNavigationStyle string `mapstructure:"sectionNavigationStyle"`
|
|
DefaultPopupOnStart string `mapstructure:"defaultPopupOnStart"`
|
|
InsecureAllowDumpOAuth2UserData bool `mapstructure:"insecureAllowDumpOAuth2UserData"`
|
|
InsecureAllowDumpVars bool `mapstructure:"insecureAllowDumpVars"`
|
|
InsecureAllowDumpSos bool `mapstructure:"insecureAllowDumpSos"`
|
|
InsecureAllowDumpActionMap bool `mapstructure:"insecureAllowDumpActionMap"`
|
|
InsecureAllowDumpJwtClaims bool `mapstructure:"insecureAllowDumpJwtClaims"`
|
|
Prometheus PrometheusConfig `mapstructure:"prometheus"`
|
|
SaveLogs SaveLogsConfig `mapstructure:"saveLogs"`
|
|
DefaultIconForActions string `mapstructure:"defaultIconForActions"`
|
|
DefaultIconForDirectories string `mapstructure:"defaultIconForDirectories"`
|
|
DefaultIconForBack string `mapstructure:"defaultIconForBack"`
|
|
AdditionalNavigationLinks []*NavigationLink `mapstructure:"additionalNavigationLinks"`
|
|
ServiceHostMode string `mapstructure:"serviceHostMode"`
|
|
StyleMods []string `mapstructure:"styleMods"`
|
|
BannerMessage string `mapstructure:"bannerMessage"`
|
|
BannerCSS string `mapstructure:"bannerCss"`
|
|
Include string `mapstructure:"include"`
|
|
|
|
sourceFiles []string
|
|
}
|
|
|
|
type AuthLocalUsersConfig struct {
|
|
Enabled bool `mapstructure:"enabled"`
|
|
Users []*LocalUser `mapstructure:"users"`
|
|
}
|
|
|
|
type LocalUser struct {
|
|
Username string `mapstructure:"username"`
|
|
Usergroup string `mapstructure:"usergroup"`
|
|
Password string `mapstructure:"password"`
|
|
}
|
|
|
|
type OAuth2Provider struct {
|
|
Name string
|
|
Title string
|
|
ClientID string
|
|
ClientSecret string
|
|
Icon string
|
|
Scopes []string
|
|
AuthUrl string
|
|
TokenUrl string
|
|
WhoamiUrl string
|
|
UsernameField string
|
|
UserGroupField string
|
|
InsecureSkipVerify bool
|
|
CallbackTimeout int
|
|
CertBundlePath string
|
|
}
|
|
|
|
type NavigationLink struct {
|
|
Title string `mapstructure:"title"`
|
|
Url string `mapstructure:"url"`
|
|
Target string `mapstructure:"target"`
|
|
}
|
|
|
|
type SaveLogsConfig struct {
|
|
ResultsDirectory string `mapstructure:"resultsDirectory"`
|
|
OutputDirectory string `mapstructure:"outputDirectory"`
|
|
}
|
|
|
|
type LogDebugOptions struct {
|
|
SingleFrontendRequests bool
|
|
SingleFrontendRequestHeaders bool
|
|
AclCheckStarted bool
|
|
AclMatched bool
|
|
AclNotMatched bool
|
|
AclNoneMatched bool
|
|
}
|
|
|
|
type DashboardComponent struct {
|
|
Title string
|
|
Type string
|
|
Entity string
|
|
Icon string
|
|
CssClass string
|
|
Contents []*DashboardComponent
|
|
}
|
|
|
|
func DefaultConfig() *Config {
|
|
return DefaultConfigWithBasePort(1337)
|
|
}
|
|
|
|
// DefaultConfig gets a new Config structure with sensible default values.
|
|
func DefaultConfigWithBasePort(basePort int) *Config {
|
|
config := Config{}
|
|
config.UseSingleHTTPFrontend = true
|
|
config.PageTitle = "OliveTin"
|
|
config.ShowFooter = true
|
|
config.ShowNavigation = true
|
|
config.ShowNewVersions = true
|
|
config.EnableCustomJs = false
|
|
config.ExternalRestAddress = "."
|
|
config.LogLevel = "INFO"
|
|
config.LogHistoryPageSize = 10
|
|
config.CheckForUpdates = false
|
|
config.DefaultPermissions.Exec = true
|
|
config.DefaultPermissions.View = true
|
|
config.DefaultPermissions.Logs = true
|
|
config.DefaultPermissions.Kill = true
|
|
config.AuthJwtClaimUsername = "name"
|
|
config.AuthJwtClaimUserGroup = "group"
|
|
config.AuthRequireGuestsToLogin = false
|
|
config.WebUIDir = "./webui"
|
|
config.CronSupportForSeconds = false
|
|
config.SectionNavigationStyle = "sidebar"
|
|
config.DefaultPopupOnStart = "nothing"
|
|
config.InsecureAllowDumpVars = false
|
|
config.InsecureAllowDumpSos = false
|
|
config.InsecureAllowDumpActionMap = false
|
|
config.InsecureAllowDumpJwtClaims = false
|
|
config.Prometheus.Enabled = false
|
|
config.Prometheus.DefaultGoMetrics = false
|
|
config.DefaultIconForActions = "😀"
|
|
config.DefaultIconForDirectories = "📁"
|
|
config.DefaultIconForBack = "«"
|
|
config.ThemeCacheDisabled = false
|
|
config.ServiceHostMode = ""
|
|
|
|
config.ListenAddressSingleHTTPFrontend = fmt.Sprintf("0.0.0.0:%d", basePort)
|
|
config.ListenAddressRestActions = fmt.Sprintf("localhost:%d", basePort+1)
|
|
config.ListenAddressWebUI = fmt.Sprintf("localhost:%d", basePort+3)
|
|
config.ListenAddressPrometheus = fmt.Sprintf("localhost:%d", basePort+4)
|
|
|
|
config.DefaultPolicy.ShowDiagnostics = true
|
|
config.DefaultPolicy.ShowLogList = true
|
|
|
|
return &config
|
|
}
|