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 ShellAfterCompleted string Timeout int Acls []string Entity string Hidden bool ExecOnStartup bool ExecOnCron []string ExecOnFileCreatedInDir []string ExecOnFileChangedInDir []string ExecOnCalendarFile string Trigger 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 Exec bool Logs bool } // AccessControlList defines what permissions apply to a user or user group. type AccessControlList struct { Name string AddToEveryAction bool MatchUsergroups []string MatchUsernames []string Permissions PermissionsList } type PrometheusConfig struct { Enabled bool DefaultGoMetrics bool } // Config is the global config used through the whole app. type Config struct { UseSingleHTTPFrontend bool ThemeName string ThemeCacheDisabled bool ListenAddressSingleHTTPFrontend string ListenAddressWebUI string ListenAddressRestActions string ListenAddressGrpcActions string ListenAddressPrometheus string ExternalRestAddress string LogLevel string LogDebugOptions LogDebugOptions Actions []*Action `mapstructure:"actions"` Entities []*EntityFile `mapstructure:"entities"` Dashboards []*DashboardComponent `mapstructure:"dashboards"` CheckForUpdates bool PageTitle string ShowFooter bool ShowNavigation bool ShowNewVersions bool EnableCustomJs bool AuthJwtCookieName string AuthJwtAud string AuthJwtDomain string AuthJwtCertsURL string AuthJwtHmacSecret string // mutually exclusive with pub key config fields AuthJwtClaimUsername string AuthJwtClaimUserGroup string AuthJwtPubKeyPath string // will read pub key from file on disk AuthHttpHeaderUsername string AuthHttpHeaderUserGroup string DefaultPermissions PermissionsList AccessControlLists []*AccessControlList WebUIDir string CronSupportForSeconds bool SectionNavigationStyle string DefaultPopupOnStart string InsecureAllowDumpVars bool InsecureAllowDumpSos bool InsecureAllowDumpActionMap bool InsecureAllowDumpJwtClaims bool Prometheus PrometheusConfig SaveLogs SaveLogsConfig DefaultIconForActions string DefaultIconForDirectories string DefaultIconForBack string AuthLoginUrl string AuthAllowGuest bool usedConfigDir string } type SaveLogsConfig struct { ResultsDirectory string OutputDirectory string } type LogDebugOptions struct { SingleFrontendRequests bool SingleFrontendRequestHeaders 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.CheckForUpdates = false config.DefaultPermissions.Exec = true config.DefaultPermissions.View = true config.DefaultPermissions.Logs = true config.AuthJwtClaimUsername = "name" config.AuthJwtClaimUserGroup = "group" config.AuthAllowGuest = true 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.ListenAddressSingleHTTPFrontend = fmt.Sprintf("0.0.0.0:%d", basePort) config.ListenAddressRestActions = fmt.Sprintf("localhost:%d", basePort+1) config.ListenAddressGrpcActions = fmt.Sprintf("localhost:%d", basePort+2) config.ListenAddressWebUI = fmt.Sprintf("localhost:%d", basePort+3) config.ListenAddressPrometheus = fmt.Sprintf("localhost:%d", basePort+4) return &config }